追踪
Agents SDK 包含内置追踪功能,可在智能体运行期间收集全面的事件记录:LLM 生成、工具调用、交接、护栏,甚至发生的自定义事件。使用 Traces 仪表板,你可以在开发和生产环境中调试、可视化并监控你的工作流。
导出循环生命周期
Section titled “导出循环生命周期”在受支持的服务器运行时中,追踪会按固定间隔导出。在某些运行时(包括 Cloudflare Workers)中,自动导出循环不可用,即使追踪本身仍然启用。在这些环境中,你应在请求生命周期中调用 getGlobalTraceProvider().forceFlush(),以便在运行时销毁前导出已排队的追踪。
此说明不适用于浏览器,因为浏览器中默认禁用追踪。
例如,在 Cloudflare Worker 中,你应将代码包裹在 try/catch/finally 代码块中,并结合 waitUntil 使用 forceFlush(),以确保在 worker 退出前导出追踪。
import { getGlobalTraceProvider } from '@openai/agents';
export default { async fetch(request, env, ctx): Promise<Response> { try { // your agent code here return new Response(`success`); } catch (error) { console.error(error); return new Response(String(error), { status: 500 }); } finally { // make sure to flush any remaining traces before exiting ctx.waitUntil(getGlobalTraceProvider().forceFlush()); } },};追踪与 span
Section titled “追踪与 span”- Traces 表示“工作流”的一次端到端操作。它们由 Span 组成。Traces 具有以下属性:
workflow_name:逻辑工作流或应用。例如“Code generation”或“Customer service”。trace_id:追踪的唯一 ID。如果不传入会自动生成。格式必须为trace_<32_alphanumeric>。group_id:可选分组 ID,用于关联同一会话中的多条追踪。例如,你可以使用聊天线程 ID。disabled:若为 True,则不会记录该追踪。metadata:追踪的可选元数据。
- Spans 表示具有开始和结束时间的操作。Spans 具有:
started_at和ended_at时间戳。trace_id,表示其所属的追踪parent_id,指向该 Span 的父 Span(如有)span_data,即该 Span 的信息。例如,AgentSpanData包含智能体信息,GenerationSpanData包含 LLM 生成信息等。
默认情况下,SDK 会追踪以下内容:
- 整个
run()或Runner.run()会被包裹在一个Trace中。 - 每次智能体运行时,会被包裹在
AgentSpan中 - LLM 生成会被包裹在
GenerationSpan中 - 每次函数工具调用会分别包裹在
FunctionSpan中 - 护栏会被包裹在
GuardrailSpan中 - 交接会被包裹在
HandoffSpan中
默认情况下,追踪名称为“Agent workflow”。如果你使用 withTrace,可以设置该名称;你也可以通过 RunConfig.workflowName 配置名称和其他属性。
此外,你还可以设置自定义追踪处理器,将追踪推送到其他目标(作为替代目标或次要目标)。
语音智能体追踪
Section titled “语音智能体追踪”如果你在默认 OpenAI Realtime API 下使用 RealtimeAgent 和 RealtimeSession,除非你在 RealtimeSession 上通过 tracingDisabled: true 或使用 OPENAI_AGENTS_DISABLE_TRACING 环境变量禁用追踪,否则追踪会在 Realtime API 侧自动发生。
更多详情请查看语音智能体概述。
更高层级的追踪
Section titled “更高层级的追踪”有时,你可能希望多次 run() 调用属于同一条追踪。你可以通过将整段代码包裹在 withTrace() 中来实现。
import { Agent, run, withTrace } from '@openai/agents';
const agent = new Agent({ name: 'Joke generator', instructions: 'Tell funny jokes.',});
await withTrace('Joke workflow', async () => { const result = await run(agent, 'Tell me a joke'); const secondResult = await run( agent, `Rate this joke: ${result.finalOutput}`, ); console.log(`Joke: ${result.finalOutput}`); console.log(`Rating: ${secondResult.finalOutput}`);});- 因为这两次
run调用被包裹在withTrace()中,所以各次运行会归入同一条整体追踪,而不是创建两条追踪。
你可以使用 withTrace() 函数创建追踪。或者,你也可以使用 getGlobalTraceProvider().createTrace() 手动创建新追踪并将其传入 withTrace()。
当前追踪通过 Node.js AsyncLocalStorage 或对应环境的 polyfill 进行跟踪。这意味着它可自动支持并发。
创建 span
Section titled “创建 span”你可以使用各种 create*Span()(例如 createGenerationSpan()、createFunctionSpan() 等)方法创建 span。通常你不需要手动创建 span。可使用 createCustomSpan() 函数来跟踪自定义 span 信息。
span 会自动属于当前追踪,并嵌套在最近的当前 span 之下;当前 span 通过 Node.js AsyncLocalStorage 或对应环境的 polyfill 进行跟踪。
某些 span 可能会捕获潜在敏感数据。
createGenerationSpan() 会存储 LLM 生成的输入/输出,createFunctionSpan() 会存储函数调用的输入/输出。这些可能包含敏感数据,因此你可以通过 RunConfig.traceIncludeSensitiveData 禁用此类数据捕获。
OpenAI 追踪导出器
Section titled “OpenAI 追踪导出器”在受支持的服务器运行时中,默认追踪配置已导出到 OpenAI。当追踪导出需要使用不同于 OPENAI_API_KEY 的凭证时,请使用 setTracingExportApiKey()。
如果你需要自定义摄取行为,请自行实例化 OpenAITracingExporter,并通过 setTraceProcessors(...) 或 addTraceProcessor(...) 安装。该导出器支持 apiKey、endpoint、organization、project、maxRetries、baseDelay 和 maxDelay。
如果你替换了默认处理器,之后想恢复带批处理器的默认 OpenAI 导出器,请调用 setDefaultOpenAITracingExporter()。
自定义追踪处理器
Section titled “自定义追踪处理器”追踪的高层架构如下:
- 在初始化时,我们会创建全局
TraceProvider,它负责创建追踪,并可通过getGlobalTraceProvider()访问。 - 我们使用
BatchTraceProcessor配置TraceProvider,它会将追踪/span 批量发送到OpenAITracingExporter,再由后者将 spans 和 traces 批量导出到 OpenAI 后端。
要自定义这一默认设置,以将追踪发送到替代或额外后端,或修改导出器行为,你有两个选项:
addTraceProcessor()允许你添加一个额外的追踪处理器,它会在追踪和 spans 就绪时接收它们。这样你可以在将追踪发送到 OpenAI 后端之外进行自己的处理。setTraceProcessors()允许你用自己的追踪处理器替换默认处理器。这意味着除非你包含执行该操作的TracingProcessor,否则追踪不会发送到 OpenAI 后端。