Date: 2026-04-16
URL: https://github.com/openai/openai-agents-python
Version: v0.14.1
Domain: agent | Language: Python 99.7% | LOC: ~87K (src) / ~245K (total)
Stars: 21K | Forks: 3.4K | License: MIT
一句话总结: 一个轻量但功能强大的多 Agent 工作流编排框架,让开发者用声明式方式定义 AI Agent 的指令、工具、护栏和协作关系,然后自动执行。
类比: 如果把 LLM 比作一个聪明但被动的大脑,Agents SDK 就是给这个大脑装上了"手脚"(Tools)、"同事"(Handoffs)、"安全绳"(Guardrails)、和"手术室"(Sandbox)。你只需要描述每个 Agent 该干什么,框架负责编排执行循环、错误重试、中断恢复和追踪记录。
目标用户: 需要构建 multi-agent 系统的 ML 工程师和平台开发者。
生态关系:
┌─────────────────────────────────────────────────────────────────┐
│ User Code │
│ agent = Agent(instructions=..., tools=[...], handoffs=[...]) │
│ result = Runner.run(agent, input="...") │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────▼────────┐
│ Runner │ run.py — 核心入口
│ (run / stream) │ orchestrate turn loop
└────────┬────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌─────▼─────┐ ┌────────▼────────┐ ┌──────▼──────┐
│ Guardrails│ │ Run Loop │ │ Session │
│ (input/ │ │ run_internal/ │ │ (memory) │
│ output) │ │ run_loop.py │ │ persist │
└────────────┘ └────────┬────────┘ └─────────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌──────▼──────┐
│ Model │ │ Tools │ │ Handoffs │
│ Provider │ │ execution │ │ (delegate) │
│ (OpenAI/ │ │ function/ │ │ to other │
│ LiteLLM) │ │ MCP/hosted│ │ agents │
└─────┬──────┘ └───────────┘ └─────────────┘
│
┌─────────┼─────────┐
│ │ │
┌───▼──┐ ┌───▼──┐ ┌────▼────┐
│OpenAI│ │Chat │ │LiteLLM/ │
│Resp. │ │Compl.│ │any-llm │
│ API │ │ API │ │ │
└──────┘ └──────┘ └─────────┘
┌──────────────────┐
│ Tracing │ 全链路追踪
│ (spans, traces) │ OpenAI Dashboard
└──────────────────┘
┌──────────────────┐
│ Sandbox │ v0.14 新增
│ (Docker/Local/ │ Agent 在容器中执行
│ E2B/Modal/...) │ 长任务工作空间
└──────────────────┘
┌──────────────────┐
│ Realtime / Voice │ 实时语音 Agent
│ (WebSocket) │ gpt-realtime-1.5
└──────────────────┘
openai-agents-python/
├── src/agents/ # 核心库 (~87K LOC)
│ ├── __init__.py # 公共 API 导出 (538 行, ~180 个导出符号)
│ ├── agent.py # Agent 类定义 (941 行)
│ ├── run.py # Runner 主入口 (1859 行)
│ ├── run_state.py # 运行状态序列化/恢复 (3304 行)
│ ├── tool.py # Tool 抽象层 (1938 行)
│ ├── guardrail.py # 输入/输出护栏 (344 行)
│ ├── result.py # RunResult (896 行)
│ ├── items.py # 消息/工具调用项
│ ├── lifecycle.py # RunHooks / AgentHooks 回调
│ ├── run_internal/ # Runner 内部实现
│ │ ├── run_loop.py # 单轮执行循环 (1894 行)
│ │ ├── turn_resolution.py # 模型输出解析 (1911 行)
│ │ ├── tool_execution.py # 工具并发执行 (2329 行)
│ │ ├── tool_planning.py # 工具规划
│ │ ├── streaming.py # 流式输出处理
│ │ └── session_persistence.py # 会话持久化
│ ├── models/ # 模型后端
│ │ ├── interface.py # Model / ModelProvider 抽象
│ │ ├── openai_responses.py # OpenAI Responses API (2043 行)
│ │ ├── openai_chatcompletions.py # Chat Completions 适配
│ │ └── multi_provider.py # 多 Provider 路由
│ ├── handoffs/ # Agent 间委托
│ ├── mcp/ # Model Context Protocol 集成
│ │ ├── server.py # MCP 服务端 (1620 行)
│ │ └── manager.py # 生命周期管理
│ ├── memory/ # 会话记忆
│ │ ├── session.py # Session 抽象
│ │ ├── sqlite_session.py # SQLite 持久化
│ │ └── openai_conversations_session.py
│ ├── sandbox/ # 沙箱执行环境
│ │ ├── sandbox_agent.py # SandboxAgent
│ │ ├── runtime.py # Sandbox 运行时
│ │ ├── sandboxes/ # Docker / Unix Local
│ │ ├── capabilities/ # Shell / Filesystem / Patch
│ │ ├── session/ # 沙箱会话管理
│ │ ├── entries/ # Git/File/S3 mount
│ │ └── memory/ # 沙箱记忆
│ ├── realtime/ # 实时语音 Agent
│ │ ├── openai_realtime.py # OpenAI Realtime API (1724 行)
│ │ └── session.py # 实时会话 (1112 行)
│ ├── tracing/ # 追踪系统
│ │ ├── spans.py / traces.py # Span / Trace 数据结构
│ │ └── processors.py # 追踪数据处理
│ ├── voice/ # 语音管道
│ │ ├── pipeline.py # STT → Agent → TTS
│ │ └── models/ # OpenAI STT/TTS
│ └── extensions/ # 扩展
│ ├── models/ # LiteLLM / any-llm
│ ├── memory/ # Redis / SQLAlchemy / Dapr
│ └── sandbox/ # E2B / Modal / Blaxel / Daytona / Cloudflare
├── tests/ # 测试套件 (~158K LOC)
├── examples/ # 使用示例
├── docs/ # MkDocs 文档 (含 ja/ko/zh 翻译)
└── pyproject.toml # 构建配置 (hatchling)
@dataclass
class Agent(AgentBase, Generic[TContext]):
name: str # Agent 名称
instructions: str | Callable # 系统提示词 (静态 / 动态)
model: str | Model | None # LLM 模型 (默认 gpt-4.1)
tools: list[Tool] # 可用工具
handoffs: list[Agent | Handoff] # 可委托的子 Agent
input_guardrails: list[InputGuardrail] # 输入护栏
output_guardrails: list[OutputGuardrail] # 输出护栏
output_type: type | None # 结构化输出类型
hooks: AgentHooks | None # 生命周期回调
tool_use_behavior: ... # 工具调用后行为
关键设计: Agent 是一个 @dataclass,不是 Pydantic Model。这意味着:
clone() 复制as_tool() 将自己变为另一个 Agent 的工具
Runner.run(agent, input)
│
├─ 1. 创建 Trace Context
├─ 2. 运行 Input Guardrails (并行 / 前置)
│ └─ 如果 tripwire 触发 → 抛异常停止
├─ 3. Turn Loop (最多 max_turns 轮):
│ ├─ 准备输入 (system prompt + history + tools)
│ ├─ 调用 Model.get_response() / stream_response()
│ ├─ 解析模型输出 → NextStep:
│ │ ├─ NextStepFinalOutput → 输出护栏 → 返回结果
│ │ ├─ NextStepHandoff → 切换到新 Agent, 继续循环
│ │ ├─ NextStepRunAgain → 执行工具, 结果送回模型
│ │ └─ NextStepInterruption → 暂停等待人工审批
│ └─ 持久化会话到 Session
└─ 4. 返回 RunResult
关键设计:
Runner 是无状态静态类,所有状态在 RunState 中run() (异步), run_sync() (同步包装), run_streamed() (流式)RunState 可序列化 → 支持中断恢复 (Human-in-the-loop)
Tool (Union type)
├─ FunctionTool → 用户自定义 Python 函数 (@function_tool)
├─ WebSearchTool → OpenAI 托管 Web 搜索
├─ FileSearchTool → OpenAI 托管文件搜索
├─ CodeInterpreterTool → OpenAI 托管代码执行
├─ ComputerTool → 计算机操作 (CUA)
├─ HostedMCPTool → OpenAI 托管 MCP
├─ CustomTool → 自定义 Tool JSON
├─ ShellTool → Shell 命令执行
├─ ApplyPatchTool → 文件补丁应用
├─ LocalShellTool → 本地 Shell
├─ ImageGenerationTool → 图片生成
└─ ToolSearchTool → 工具搜索
FunctionTool 核心流程:
@function_tool 装饰器自动提取参数类型 → JSON Schemaneeds_approval 审批、is_enabled 动态启用timeout_ms)、错误处理 (failure_error_function)
triage_agent = Agent(
name="Triage",
handoffs=[billing_agent, tech_agent], # 可直接传 Agent
)
Handoff vs Agent-as-Tool 的区别:
| Handoff | Agent as Tool | |
|---|---|---|
| 对话历史 | 新 Agent 继承完整对话历史 | 新 Agent 收到生成的输入 |
| 控制权 | 新 Agent 接管对话 | 原 Agent 保持控制权 |
| 使用场景 | 路由分发 (triage) | 子任务调用 |
两种护栏并行于模型执行:
如果 tripwire_triggered = True → 抛出异常,立即停止执行。
Session (ABC)
├─ SQLiteSession → 本地 SQLite
├─ OpenAIConversationsSession → OpenAI 服务端存储
├─ OpenAIResponsesCompactionSession → 自动压缩上下文
└─ Extensions:
├─ RedisSession
├─ SQLAlchemySession
├─ DaprSession
└─ EncryptedSession
SandboxAgent(
name="Workspace Assistant",
default_manifest=Manifest(entries={
"repo": GitRepo(repo="openai/openai-agents-python", ref="main"),
}),
)
支持的沙箱后端:
UnixLocalSandboxClient — 本地文件系统DockerSandboxClient — Docker 容器核心能力 (Capabilities):
Trace
└─ Agent Span
├─ Generation Span (LLM 调用)
├─ Function Span (工具执行)
├─ Guardrail Span
├─ Handoff Span
└─ Custom Span
追踪数据通过 TracingProcessor 上报到 OpenAI Dashboard,支持自定义处理器。
Voice Pipeline:
Microphone → STT → Agent → TTS → Speaker
Realtime Agent:
WebSocket ↔ gpt-realtime-1.5 (全双工)
chatcmpl_converter.py 转换 Chat Completions 格式@dataclass 而非 Pydantic BaseModeldataclasses.replace() 浅拷贝__post_init__)RunState 可序列化为 JSON → 实现 human-in-the-loopRunState 传入 Runner.run() 继续执行async/awaitasyncio.gather() 并行执行多个工具调用run_sync() 通过 asyncio.run() 桥接同步调用| Structure | File | LOC | Purpose | Lifetime |
|---|---|---|---|---|
Agent | agent.py | 941 | Agent 定义 (指令/工具/护栏) | 用户定义, 长生命周期 |
RunState | run_state.py | 3304 | 可序列化的运行状态 | 单次 run, 可持久化 |
RunResult | result.py | 896 | 执行结果 (输出/items/usage) | 单次 run |
FunctionTool | tool.py | ~300 | 函数工具定义 | 用户定义 |
Handoff | handoffs/ | ~350 | Agent 委托关系 | 用户定义 |
ModelResponse | items.py | - | 模型响应包装 | 单轮 |
ProcessedResponse | run_steps.py | - | 解析后的模型输出 | 单轮 |
Session | memory/ | - | 会话状态持久化 | 跨 run |
Span / Trace | tracing/ | - | 追踪数据 | 单次 run |
Runner.run() (run.py:194)
→ create_trace_for_run() (tracing/context.py)
→ prepare_input_with_session() (session_persistence.py)
→ run_input_guardrails() (run_loop.py) ~异步并行
→ TURN LOOP:
→ get_all_tools() (run_loop.py) fetch MCP tools
→ run_single_turn() (run_loop.py)
→ Model.get_response() (models/openai_responses.py) ~1-30s
→ resolve_processed_response() (agent_runner_helpers.py)
→ NextStep 分支:
→ tool_execution() (tool_execution.py) 并行执行
→ handoff resolution (turn_resolution.py)
→ save_turn_items_if_needed() (session_persistence.py)
→ run_output_guardrails() (run_loop.py)
→ RunResult
瓶颈: LLM 调用 (Model.get_response()) 是主要延迟源。工具执行通过 asyncio.gather() 并行化。
@allow_call_model_methods)| Feature | OpenAI Agents SDK | LangChain | CrewAI | AutoGen |
|---|---|---|---|---|
| 轻量级 | ✅ 单包, 87K LOC | ❌ 生态庞大 | ✅ | ❌ |
| 多 Agent 编排 | ✅ Handoffs | ✅ Chains | ✅ Crews | ✅ Conversations |
| OpenAI 深度集成 | ✅ 原生 | ❌ 适配层 | ❌ | ❌ |
| MCP 支持 | ✅ 一等公民 | ⚠️ 社区 | ❌ | ❌ |
| 沙箱执行 | ✅ (v0.14) | ❌ | ❌ | ✅ Docker |
| 实时语音 | ✅ | ❌ | ❌ | ❌ |
| Human-in-loop | ✅ RunState 中断恢复 | ⚠️ 手动 | ❌ | ✅ |
| Tracing | ✅ 内置 → OpenAI Dashboard | ⚠️ LangSmith | ❌ | ❌ |
| 多 LLM 支持 | ✅ LiteLLM/any-llm | ✅ | ✅ | ✅ |
| 类型安全 | ✅ Generic[TContext] | ❌ | ❌ | ⚠️ |
run_state.py 3304 行 — 状态序列化逻辑过于集中,包含复杂的 schema version 迁移tool.py 1938 行 — Tool 的 Union 类型定义和 FunctionTool 实现混在一起应该使用的场景:
不适合的场景:
值得学习的设计:
RunState 可序列化 + 中断恢复 — 生产级 human-in-the-loop 方案