从 Swarm 到 Agents SDK 的演进
2024 年 10 月,OpenAI 发布了实验性框架 Swarm,用极简 API 展示了多 Agent 协作的可能性。Swarm 的核心思想是:Agent 之间通过"移交控制权(Handoff)"协作,每个 Agent 只做自己擅长的事情。
Swarm 虽然受到开发者热捧,但它是"教育目的"的原型——没有生产可靠性保障、没有追踪系统、没有护栏机制。2025 年 3 月,OpenAI 将这些思想提炼并升级,正式发布了 openai-agents SDK,作为构建生产级 Agent 系统的官方框架。
Swarm (2024.10) ──→ openai-agents SDK (2025.03)
─────────────────────────────────────────────────────────
教育性原型 生产就绪框架
无追踪系统 → 内置 Tracing,对接 OpenAI 平台
无护栏机制 → Input/Output Guardrails
同步执行 → 原生 async/await,流式支持
无类型安全 → Pydantic v2 全面集成
实验性 API → 稳定 API,语义化版本管理
无上下文注入 → RunContextWrapper 依赖注入
─────────────────────────────────────────────────────────
核心思想保留:Agent + Tool + Handoff 三角模型
核心设计理念
理解 Agents SDK 的三个设计原则,才能用好这个框架:
轻量可组合(Lightweight & Composable)
SDK 只做"Agent 编排"这一件事,不捆绑向量数据库、不强制使用特定存储。核心抽象只有 Agent、Tool、Handoff 三个概念。这使得它可以和任何 Python 库组合使用——你可以用 SQLAlchemy 做持久化、用 httpx 调外部 API、用 pdfplumber 解析文档,SDK 不关心这些。
Python 优先(Python-first)
工具定义就是普通的 Python 函数,文档字符串自动变成工具描述,Pydantic 模型自动生成 JSON Schema,无需手写复杂的 schema 配置。这大幅降低了上手成本——写工具和写普通函数没有本质区别。
生产就绪(Production-ready)
内置追踪系统(每次 Run 自动记录 LLM 调用、工具调用、Handoff 事件);内置护栏机制(在 Agent 处理前后验证输入输出);原生 asyncio 支持(并发运行多个 Agent);结构化输出(强制 Agent 返回 Pydantic 模型)。这些是生产系统的必备能力,不再需要自己实现。
与其他框架的对比
在使用 OpenAI Agents SDK 之前,了解它与主流框架的区别,有助于做出正确的技术选型:
| 维度 | OpenAI Agents SDK | LangChain/LangGraph | AutoGen 0.4 |
|---|---|---|---|
| 定位 | OpenAI 官方,专注 Agent 编排 | 通用 LLM 应用框架,功能最全 | 微软研究院,会话式多 Agent |
| 学习曲线 | 低,核心 API 极简 | 高,抽象层次多 | 中,概念需适应 |
| 多 Agent 协作 | 原生 Handoff,直观 | 需手工设计图结构 | 会话驱动,自然语言协调 |
| 可观测性 | 内置,对接 OpenAI 平台 | 需配置 LangSmith | 需额外集成 |
| 模型支持 | 主要 OpenAI,可扩展 | 100+ 模型提供商 | 支持多种模型 |
| 护栏机制 | 原生内置 | 需自行实现 | 需自行实现 |
| 适用场景 | 生产 Agent,多 Agent 系统 | 复杂 RAG、图结构 Agent | 代码生成、研究型任务 |
选型建议
如果你已经重度使用 OpenAI API,且目标是构建生产级 Agent 系统,Agents SDK 是最自然的选择。如果需要跨模型提供商(Anthropic + OpenAI + 本地模型)或复杂的图结构控制流,LangGraph 更合适。两者并不互斥——可以在 LangGraph 节点内部使用 Agents SDK。
核心概念速览
Agents SDK 的所有功能都建立在五个核心概念之上:
Agent(智能体)
Agent 是框架的核心单元,由三要素定义:name(身份标识)、instructions(系统提示词,定义角色与行为)、model(使用的 LLM)。Agent 还可以配备工具列表(tools)、可移交的下级 Agent(handoffs)和护栏(guardrails)。一个 Agent 就是一个"有专长的 AI 角色"。
Tool(工具)
Tool 是 Agent 与外部世界交互的接口。最常见的是函数工具(Function Tool)——将普通 Python 函数包装成 Agent 可以调用的工具。SDK 还内置了 WebSearch、FileSearch(向量存储检索)等平台工具。工具调用的完整流程:LLM 决定调用哪个工具 → SDK 执行函数 → 将结果返回给 LLM 继续推理。
Handoff(移交)
Handoff 是多 Agent 协作的核心机制。当一个 Agent 认为某个任务更适合另一个 Agent 处理时,它可以将控制权"移交"给那个 Agent。被移交的 Agent 接收完整的对话上下文,继续完成任务。这种模式自然地实现了"专家分工"——分诊 Agent 负责识别问题类型,专家 Agent 负责解决具体问题。
Runner(运行器)
Runner 负责驱动 Agent 的执行循环:接收用户输入 → 调用 LLM → 处理工具调用或 Handoff → 循环直到 Agent 返回最终答案。Runner 提供三种模式:run()(异步)、run_sync()(同步阻塞)、run_streamed()(流式输出)。Runner 还管理 max_turns(最大轮次)等安全参数。
Guardrails(护栏)
Guardrails 是 Agent 的安全检查机制,分为输入护栏(Input Guardrail,在 Agent 处理前运行)和输出护栏(Output Guardrail,在返回结果前运行)。护栏可以拒绝恶意输入、检查敏感内容输出。当护栏触发"绊线(tripwire)"时,整个 Run 立即停止,不消耗多余 Token。
Run Loop(运行循环)
Runner 驱动的完整执行过程。每一"轮(turn)"包括:向 LLM 发送消息 → 获取响应 → 如果有工具调用则执行工具并将结果添加到消息中 → 如果有 Handoff 则切换 Agent → 继续下一轮。当 LLM 输出纯文本(无工具调用/Handoff)时,Run 结束。
安装与环境配置
# 安装 openai-agents SDK(需要 Python 3.11+)
pip install openai-agents
# 如果需要语音功能(可选)
pip install "openai-agents[voice]"
# 验证安装
python -c "import agents; print(agents.__version__)"
# 配置 API Key(推荐使用环境变量)
import os
from agents import set_default_openai_key
# 方式 1:环境变量(推荐,生产环境必用)
# 在 .env 文件或系统中设置:OPENAI_API_KEY=sk-...
# SDK 自动读取,无需手动设置
# 方式 2:代码中显式设置(仅用于开发测试)
set_default_openai_key("sk-...")
# 方式 3:自定义 OpenAI Client(用于代理、Ollama 等场景)
from openai import AsyncOpenAI
from agents import set_default_openai_client
custom_client = AsyncOpenAI(
api_key="sk-...",
base_url="https://your-proxy.com/v1" # 自定义端点
)
set_default_openai_client(custom_client)
API Key 安全
永远不要将 API Key 硬编码在代码中,也不要提交到 Git 仓库。使用 python-dotenv 库加载 .env 文件,并将 .env 加入 .gitignore。生产环境使用 Kubernetes Secret 或云厂商的 Secret Manager 注入密钥。
第一个 Agent:你好,世界
以下是一个完整的最小可运行示例,包含了 Agents SDK 的核心工作流:
# hello_agent.py — 第一个 OpenAI Agent
import asyncio
from agents import Agent, Runner
# ── 定义 Agent ────────────────────────────────────────────
# name: Agent 的身份标识(出现在追踪日志中)
# instructions: 系统提示词,定义 Agent 的角色和行为规范
# model: 使用的 OpenAI 模型
agent = Agent(
name="助手",
instructions="你是一个友善、专业的 AI 助手。用中文回答问题,回答简洁有力。",
model="gpt-4o-mini" # 轻量模型,成本低
)
# ── 运行 Agent ────────────────────────────────────────────
async def main():
# Runner.run() 是核心入口:输入用户消息,返回 Run 结果
result = await Runner.run(agent, "你好!请介绍一下你自己。")
# final_output 是 Agent 的最终文字回复
print(result.final_output)
# ── 执行 ──────────────────────────────────────────────────
if __name__ == "__main__":
asyncio.run(main())
# 输出示例:
# 你好!我是一个 AI 助手,专注于提供准确、简洁的回答。
# 有什么我可以帮助你的吗?
同步版本(适合脚本场景)
from agents import Agent, Runner
agent = Agent(
name="助手",
instructions="你是一个简洁的 AI 助手。",
model="gpt-4o-mini"
)
# run_sync 不需要 asyncio.run(),适合简单脚本
result = Runner.run_sync(agent, "Python 的 GIL 是什么?")
print(result.final_output)
Run 结果对象详解
Runner.run() 返回一个 RunResult 对象,包含这次 Agent 运行的完整信息:
result = await Runner.run(agent, "查询今天的天气")
# ── 最常用字段 ────────────────────────────────────────────
result.final_output # str:Agent 的最终回复文字
result.final_output_as(MyModel) # 如果设置了结构化输出,转为 Pydantic 模型
# ── 消息历史 ──────────────────────────────────────────────
result.new_items # list:本次 Run 新产生的所有消息(含工具调用)
result.to_input_list() # list:将结果转为下次 Run 的输入,实现多轮对话
# ── 追踪信息 ──────────────────────────────────────────────
result.last_agent # Agent:最后执行的 Agent(Handoff 后可能不同)
# ── 实际使用示例 ──────────────────────────────────────────
print(f"最终回复:{result.final_output}")
print(f"共 {len(result.new_items)} 条消息(含工具调用)")
print(f"最后执行的 Agent:{result.last_agent.name}")
名词解释:SDK 专属术语表
Orchestrator(编排 Agent)
在多 Agent 系统中,负责接收用户请求、分析任务类型、决定将任务分配给哪个专业 Agent 的顶层 Agent。Orchestrator 通常持有对所有子 Agent 的 Handoff 权限,但自身不执行具体业务逻辑。类比:公司前台,负责接待和转接,不负责具体业务办理。
Subagent(子 Agent)
在 Orchestrator-Worker 模式中,由 Orchestrator 通过 Handoff 激活的专业 Agent。每个 Subagent 专注于特定领域(如"代码审查 Agent"、"翻译 Agent"、"账单查询 Agent")。Subagent 执行完任务后可以将结果返回给用户,或将控制权再次 Handoff 回 Orchestrator。
Tool Call(工具调用)
LLM 决定调用一个工具时产生的事件。一个 Tool Call 包含:工具名称、工具参数(JSON 格式)、调用 ID。SDK 接收到 Tool Call 后,执行对应的 Python 函数,将返回值包装成 Tool Result 消息,追加到对话历史中,然后继续下一轮 LLM 推理。
Run Loop(运行循环)
Runner 驱动 Agent 执行的核心循环。每次循环(turn):发送当前消息历史给 LLM → 解析 LLM 响应 → 如果是工具调用则执行并记录 → 如果是 Handoff 则切换 Agent → 如果是纯文本则结束。max_turns 参数控制最大循环次数,防止无限循环。
Turn(轮次)
Run Loop 中的一次完整 LLM 调用周期。一个"Turn"从发送消息开始,到 LLM 完整返回响应(可能包含多个工具调用)结束。一次完整的 Run 通常包含多个 Turn——第一轮 LLM 决定调用工具,第二轮 LLM 处理工具结果并给出最终答案。
Tripwire(绊线)
护栏系统中的紧急停止机制。当护栏检测到危险输入或不合规输出时,触发 tripwire,Runner 立即停止整个 Run 并抛出 GuardrailTripwireTriggered 异常。与普通验证失败不同,tripwire 是"不可恢复的停止",不会消耗额外的 LLM Token。
理解执行流程图
用户输入: "帮我搜索 Python 3.13 的新特性"
│
▼
┌─────────────────────────────────────────────┐
│ Runner.run(agent, input) │
│ │
│ ┌─ Turn 1 ──────────────────────────────┐ │
│ │ 发送消息给 GPT-4o │ │
│ │ LLM 决定:调用 search_web 工具 │ │
│ │ SDK 执行:search_web("Python 3.13") │ │
│ │ 返回:搜索结果摘要 │ │
│ └───────────────────────────────────────┘ │
│ │ │
│ ┌─ Turn 2 ──────────────────────────────┐ │
│ │ 发送[消息 + 搜索结果]给 GPT-4o │ │
│ │ LLM 决定:直接回复(无工具调用) │ │
│ │ 输出最终回答 │ │
│ └───────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
│
▼
RunResult.final_output → "Python 3.13 的新特性包括..."
本章小结
OpenAI Agents SDK 是从 Swarm 进化而来的生产级框架,核心设计原则是:轻量、可组合、Python 优先。五个核心概念:Agent(智能体)、Tool(工具)、Handoff(移交)、Runner(运行器)、Guardrails(护栏)。下一章深入 Agent 定义与配置,学习如何写出高质量的 instructions 和调整模型参数。