实战:路径与工作流

OpenAI Agents SDK JS/TS 快速入门

OpenAI Agents SDK 的 JavaScript/TypeScript 版适合把 Agent 嵌进 Node.js 应用、后台任务和 Web 产品后端。它不是 Claude Code 这类交互式编程工具,而是一个可编程运行时:你定义 Agent、工具、运行方式和错误处理,再把它接到自己的业务系统里。

来源:OpenAI Agents SDK JS/TS 文档 · openai/openai-agents-js · Quickstart · Tools | 整理时间:2026-05-15 类型:原创整合 | 标签:openai-agents-sdk, typescript, tutorial, tools

OpenAI Agents SDK 的 JavaScript/TypeScript 版适合把 Agent 嵌进 Node.js 应用、后台任务和 Web 产品后端。它不是 Claude Code 这类交互式编程工具,而是一个可编程运行时:你定义 Agent、工具、运行方式和错误处理,再把它接到自己的业务系统里。

如果你已经看过 Python 版,可先读 OpenAI Agents SDK 实战指南。本文只处理 JS/TS 开发者最关心的最小闭环:安装、运行第一个 Agent、加一个函数工具、处理常见错误。


适合谁

场景 是否适合 原因
Node.js 后端里加一个任务助手 适合 SDK 原生支持 JS/TS,容易接 Express、Hono、Next.js API Route
给已有 SaaS 加客服、报告、检索 Agent 适合 工具函数可以直接调用现有业务 API
要让 Agent 改代码、跑测试 谨慎 可以看 SandboxAgent,但要先做目录隔离和权限控制
只想日常写代码提效 不适合 直接用 Claude Code、Cursor、Copilot Agent 更快
需要极强流程确定性 不适合单独使用 应结合普通代码状态机,Agent 只负责不确定步骤

推荐路线:先做一个单 Agent + 一个工具的闭环,不要一上来做多 Agent。等你能稳定观测输入、工具调用、最终输出后,再考虑 handoffs、sessions 和 tracing。


环境要求

官方 README 标注支持 Node.js 22 或更高版本,也支持 Deno、Bun;Cloudflare Workers 属于实验支持,需要启用 nodejs_compat。本篇示例用 Node.js 22。

mkdir openai-agents-js-demo
cd openai-agents-js-demo
npm init -y
npm install @openai/agents zod

把项目切到 ESM:

npm pkg set type=module

配置 API Key:

export OPENAI_API_KEY="sk-..."

不要把 Key 写进代码或提交到仓库。生产环境应通过平台密钥管理注入环境变量。


第一个 Agent

创建 index.mjs

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

const agent = new Agent({
  name: 'ReleaseAssistant',
  instructions: 'You explain technical release notes as concrete engineering actions.',
});

const result = await run(
  agent,
  'Summarize how a backend team should evaluate a new SDK release.'
);

console.log(result.finalOutput);

运行:

node index.mjs

这个例子只有一个 Agent,没有工具。它适合验证三件事:包能正常加载、认证能通过、你能拿到 finalOutput。如果这一步不稳定,不要继续加工具或多 Agent。


加一个函数工具

真实 Agent 的价值来自工具。下面的例子模拟一个内部文档查询工具,让 Agent 先查资料再回答。

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

const docs = {
  mcp: 'MCP connects models to external tools and resources through a standard protocol.',
  tracing: 'Tracing records agent runs, tool calls, and model usage for debugging.',
  guardrails: 'Guardrails validate inputs or outputs before the workflow proceeds.',
};

const searchDocs = tool({
  name: 'search_docs',
  description: 'Search the internal agent glossary by keyword.',
  parameters: z.object({
    keyword: z.string().describe('One lowercase keyword, such as mcp or tracing'),
  }),
  execute: async ({ keyword }) => {
    return docs[keyword.toLowerCase()] ?? 'No matching entry found.';
  },
});

const agent = new Agent({
  name: 'DocsAssistant',
  instructions: [
    'Answer in three short bullets.',
    'Use search_docs before explaining glossary terms.',
    'If the tool returns no match, say what is missing instead of guessing.',
  ].join('\n'),
  tools: [searchDocs],
});

const result = await run(agent, 'Explain tracing for an agent product team.');
console.log(result.finalOutput);

工具设计要保守:参数越窄,Agent 越容易稳定调用。不要把一个 execute_sql(query: string) 这种高权限工具直接暴露给模型;先封装成 get_user_order_summary(userId) 这类业务动作。


最小项目结构

小项目不需要复杂目录。先用这套结构:

openai-agents-js-demo/
  package.json
  src/
    agents/
      docs-agent.mjs
    tools/
      search-docs.mjs
    index.mjs

拆分规则很简单:

文件 放什么 不放什么
agents/*.mjs Agent 名称、instructions、工具组合 具体数据库查询逻辑
tools/*.mjs 参数 schema、业务 API 调用、错误返回 长篇提示词
index.mjs 运行入口、输入输出、日志 复杂业务规则

这样拆不是为了“架构优雅”,而是方便后续测试:工具可以单测,Agent instructions 可以单独评审,入口只负责把它们串起来。


什么时候加多 Agent

不要因为 SDK 支持 handoffs 就马上拆多 Agent。满足下面任一条件再拆:

信号 拆法
同一个 Agent 的 instructions 超过 40 行 拆成 Router + Specialist
工具权限差异很大 高权限工具放到单独 Agent 后面
输出需要不同审查标准 生成 Agent 和 Review Agent 分开
任务需要长期运行或文件系统状态 研究 SandboxAgent,而不是普通 Agent 硬撑

最常见的第一种拆法是 Router 模式:入口 Agent 只判断任务类型,把问题交给“文档检索”“数据分析”“写作整理”等专门 Agent。不要让 Router 自己完成所有工作。


错误处理基线

上线前至少处理四类错误:

错误 典型现象 处理方式
缺少 API Key 启动后认证失败 进程启动时检查 OPENAI_API_KEY
工具参数不合法 工具没有执行或反复重试 用 Zod 收窄 schema,描述写具体
工具内部失败 返回异常堆栈给模型 捕获异常,返回结构化错误字符串
输出不可用 Agent 答非所问或格式漂移 缩短 instructions,加输出格式约束

工具内部不要直接抛业务细节给模型:

const safeTool = tool({
  name: 'get_order_status',
  description: 'Get order status by order ID.',
  parameters: z.object({ orderId: z.string().min(6) }),
  execute: async ({ orderId }) => {
    try {
      return await getOrderStatus(orderId);
    } catch {
      return 'ORDER_LOOKUP_FAILED: ask the user to verify the order ID.';
    }
  },
});

Agent 看到稳定的错误码,才有机会做合理降级。随机堆栈只会污染上下文。


生产化检查表

检查项 最小要求
输入边界 用户输入长度、文件大小、请求频率有限制
工具权限 每个工具只做一个业务动作,不暴露通用 Shell 或 SQL
日志 记录 run id、工具名、耗时、错误码,不记录敏感原文
回归样例 保存 10-20 个真实用户问题,每次改 instructions 后重跑
人工兜底 高风险操作必须有人确认或只生成草稿

JS/TS SDK 的优势是容易嵌进现有产品;风险也是太容易把现有产品的高权限 API 暴露给模型。先把工具边界做窄,再谈复杂编排。


和 Python 版怎么选

你当前团队 推荐
主应用是 Node.js / Next.js / Cloudflare Workers 先用 JS/TS SDK
数据、评估、机器学习脚本主要在 Python 先用 Python SDK
要接前端实时语音体验 看 JS/TS 的 Realtime Agents
要做离线批处理、评估流水线 Python 生态更顺手

选择标准不是“哪个 SDK 更强”,而是哪个能更快接入你已有的鉴权、日志、数据库和部署链路。Agent 框架本身只是运行时,真正的工程成本在工具边界和观测系统。