先给结论

OpenAI Agents SDK 适合在自己的 JavaScript 或 Python 服务中编排 Agent。先安装 @openai/agents 或 openai-agents,定义一个职责单一的 Agent,再用 run / Runner.run 执行;Runner 会持续处理模型调用、函数工具和 handoff,直到返回最终结果、遇到审批中断或达到停止条件。部署、工具权限、状态存储和审批决定仍由你的应用负责。

OpenAI Agents SDK 怎么用?

官方资料(2026-11-02 核对):Agents SDK 总览 · Quickstart · Running agents · Orchestration · Guardrails 与审批 · Tracing 与集成

先选对运行方式

方式运行位置适合场景主要责任
Agents SDK你的 JavaScript / Python 应用代码优先的 Agent、工具与多 Agent 编排应用负责部署、工具实现、状态和审批
Responses APIOpenAI API + 你的循环需要直接控制 Items、工具调用和续接应用自行实现完整编排循环
Agents APIOpenAI 托管 harness希望使用托管运行环境与 Agent 基础设施按托管 API 的会话、环境和工具规则接入

Agents SDK 建立在平台 API 之上,但不是“更高级套餐”,也不会自动代替业务授权。想保留 Typed JavaScript/Python 代码、连接现有后端并自行决定存储与审批时选 SDK;只需要一次模型请求时,直接使用 Responses API 往往更简单。

安装 JavaScript 或 Python SDK

# JavaScript / TypeScript
npm install @openai/agents zod

# Python
pip install openai-agents

export OPENAI_API_KEY=sk-...

API Key 只放在服务端环境变量或密钥系统,不要写进浏览器代码、仓库、日志或提示词。先在测试 Project 中运行最小示例,再连接真实业务工具。

最小 JavaScript Agent

import { Agent, run } from "@openai/agents";

const agent = new Agent({
  name: "Support assistant",
  instructions: "Answer support questions clearly and concisely.",
  model: process.env.OPENAI_MODEL
});

const result = await run(agent, "如何查询订单状态?");
console.log(result.finalOutput);

Agent 定义名称、指令、模型、工具和输出约束;run 启动一次应用级 turn。不要把模型名硬编码为永久默认值:用配置项管理,并在发布时核对当前模型可用性、价格和限制。

Python 的同一流程

import asyncio
import os
from agents import Agent, Runner

agent = Agent(
    name="Support assistant",
    instructions="Answer support questions clearly and concisely.",
    model=os.environ["OPENAI_MODEL"],
)

async def main():
    result = await Runner.run(agent, "如何查询订单状态?")
    print(result.final_output)

asyncio.run(main())

JavaScript 的 result.finalOutput 与 Python 的 result.final_output 命名不同;复制跨语言示例时不要混用属性。

Runner 的 Agent 循环做了什么

  1. 把当前输入发送给当前 Agent 的模型。
  2. 检查模型输出;如有函数工具调用,就执行已注册工具并继续。
  3. 如发生 handoff,切换到指定专家并继续。
  4. 如工具需要审批,返回 interruption 和可恢复 state,等待批准或拒绝。
  5. 当没有更多工具工作并得到最终回答时,返回 result。

Runner 只是编排器。工具实现仍在你的服务中运行;网络请求、数据库写入、付款、删除和发布都必须在工具边界重新检查身份、资源、参数、幂等和权限。

给 Agent 添加函数工具

import { Agent, run, tool } from "@openai/agents";
import { z } from "zod";

const getOrder = tool({
  name: "get_order",
  description: "Read one order that belongs to the current user.",
  parameters: z.object({ orderId: z.string() }),
  async execute({ orderId }) {
    return await loadAuthorizedOrder(orderId);
  }
});

const agent = new Agent({
  name: "Order assistant",
  instructions: "Use get_order only for order-status questions.",
  tools: [getOrder]
});

const result = await run(agent, "查询订单 A-123", {
  context: { userId: "user_456" }
});

Schema 负责约束参数形状,不等于授权。execute 仍要根据当前用户验证订单归属,限制返回字段并记录审计。需要托管工具时,可进一步接入 Web Search、File Search 或 Remote MCP;大型工具目录可参考 Tool Search。

多轮状态:四种策略选一种为主

策略状态位置下一轮传什么
result.history你的应用可重放历史
SDK session你的存储 + SDK相同 session
conversationIdOpenAI Conversations API相同 ID + 新输入
previousResponseIdOpenAI Responses API上一 Response ID + 新输入

同一会话通常只选一种主要策略。若同时重放本地 history 又使用服务端 continuation,可能重复上下文、增加 Token 或改变行为。审批暂停则保存 result.state 与 interruptions,批准或拒绝后恢复同一个 run。

Handoff 还是 Agent as Tool

方式谁拥有最终回答何时使用
Handoff被移交的专家 Agent需要切换指令、工具、政策与对话所有权
agent.asTool()主 Agent专家只完成子任务,主 Agent 汇总并回答

先从一个 Agent 开始;只有当分支确实需要不同指令、工具或政策时再拆分。给每个专家窄职责与清晰描述,限制可达路径,并测试错误路由、来回 handoff 和无限循环。

Guardrail、工具校验与人工审批

  • Input guardrail:在主模型前阻止不允许的输入。
  • Output guardrail:在最终输出离开系统前验证或脱敏。
  • Tool guardrail:围绕具体函数工具检查参数与结果。
  • Human review:在取消、编辑、Shell、付款、删除、发布或敏感 MCP 动作前暂停。

Agent 级 guardrail 不会自动覆盖所有嵌套工具:输入 guardrail 只在链路第一个 Agent 上运行,输出 guardrail 只在最终输出 Agent 上运行。对每个有副作用的工具,把校验和审批放在实际执行边界,而不是只依赖顶层提示词。

Tracing、日志与评测

正常服务端 SDK 路径中 tracing 默认启用,可记录模型调用、工具调用、handoff、guardrail 和自定义 span。Trace 用于定位工作流行为,不等于完整生产监控;日志需脱敏,并补充以下指标:

  • 任务完成率、人工接管率、错误路由率和 guardrail 命中率。
  • 每次成功任务的模型 Token、工具调用数、延迟和费用。
  • 工具失败、超时、重试、幂等冲突与审批等待时间。
  • 固定评测集上的正确性、安全性、引用质量和回归结果。

常见错误与排查

  1. 401 / Missing API key:确认服务端进程读取正确 Project 的 OPENAI_API_KEY,不要在前端补发密钥。
  2. 工具没有调用:检查名称、描述、参数 Schema、Agent instructions 与测试输入,避免工具职责重叠。
  3. 工具执行两次:在写操作使用业务幂等键;网络重试前先查询真实状态。
  4. 上下文越来越大:确认只使用一种主要会话策略,限制工具输出并建立归档/压缩策略。
  5. handoff 到错误专家:缩窄专家职责,改进 handoffDescription,并加入路由评测。
  6. 审批后无法恢复:保存 interruptions 和 result.state,恢复同一个 run,不要重新提交成新的用户请求。
  7. Trace 有记录但用户失败:对照真实业务状态、工具结果和最终 UI;模型流程完成不代表外部动作成功。

生产上线检查清单

  • 从一个聚焦 Agent 和最小工具集开始,模型与 SDK 版本通过锁文件管理。
  • API Key、OAuth Token 与第三方凭据只在服务端保存并可轮换。
  • 每个工具都有输入校验、业务授权、幂等、超时、错误语义和审计。
  • 敏感副作用会返回 interruption,并可在审批后恢复同一 state。
  • 会话状态策略唯一且清楚,删除、保留与用户隔离规则已测试。
  • handoff / agent-as-tool 的所有权、最大轮次、失败和循环路径经过评测。
  • Tracing、业务监控、费用告警、脱敏和真实任务评测都已启用。
  • 发布前验证不同模型、工具故障、拒绝、超时和人工接管路径。

常见问题

OpenAI Agents SDK 和 Responses API 有什么区别?

Responses API 是底层模型与工具接口;Agents SDK 是运行在你的应用中的代码优先编排层,替你处理 Agent 循环、工具执行、handoff、guardrail、状态与 tracing。想完全自管循环可直接用 Responses API,想更快搭建编排可用 SDK。

OpenAI Agents SDK 和 Agents API 有什么区别?

Agents SDK 在你的应用运行,部署、工具实现、状态存储和审批决定由你的服务器负责;Agents API 在 OpenAI 服务中运行托管 harness。应按运行位置、基础设施控制和托管需求选择,不要把两者当作同一个产品。

JavaScript 和 Python 分别安装什么包?

JavaScript 安装 @openai/agents 与 zod;Python 安装 openai-agents。两种 SDK 都使用 OPENAI_API_KEY,并从一个聚焦的 Agent 和一次 run 开始。

Agents SDK 会自动执行所有工具吗?

Runner 会执行你注册的函数工具并继续 Agent 循环,但工具代码、权限、参数校验和副作用仍由应用负责。敏感工具应设置审批,并在执行边界做身份、资源、幂等和审计检查。

handoff 和 agent.asTool 怎么选?

需要让专家接管当前对话、指令与后续回答时使用 handoff;需要主 Agent 保留最终答案所有权、把专家当作子任务助手时使用 agent.asTool。每个专家应职责单一,避免无必要的多 Agent 拆分。

多轮会话状态应该怎么保存?

常见选择是 result.history、SDK session、OpenAI Conversations API 的 conversationId,或 Responses API 的 previousResponseId。每个会话通常只选一种主要策略,混合本地重放和服务端状态可能重复上下文。

Tracing 是否等于生产监控和安全审计?

不等于。Agents SDK 的正常服务端路径默认启用 tracing,可记录模型调用、工具、handoff、guardrail 与自定义 span;生产仍要补充业务指标、脱敏日志、权限审计、费用告警和真实任务评测。

本文核对日期为 2026-11-02。Agents SDK、Agents API、模型、工具、会话与 tracing 接口可能变化;上线前请重新读取 SDK 总览、Quickstart、Running agents、Orchestration、Guardrails 与 Integrations 文档。

先跑通一个 Agent、一个只读工具

记录一次完整 run 的输入、工具参数、输出、Trace、Token 和失败路径,再决定是否增加多 Agent、写操作或人工审批。