追踪
Agents SDK 内置追踪功能,会在智能体运行期间收集完整的事件记录:LLM 生成、工具调用、交接、护栏,甚至包括发生的自定义事件。使用 Traces 仪表板,你可以在开发和生产环境中调试、可视化并监控你的工作流。
导出循环生命周期
Section titled “导出循环生命周期”在受支持的服务器运行时中,Trace 会定期导出。在某些运行时中,包括 Cloudflare Workers,即使追踪本身仍处于启用状态,自动导出循环也不可用。在这些环境中,你应在请求生命周期中调用 getGlobalTraceProvider().forceFlush(),以便在运行时被销毁之前导出队列中的 Trace。
此建议不适用于浏览器,因为追踪在那里默认禁用。
例如,在 Cloudflare Worker 中,你应将代码包裹在 try/catch/finally 块中,并结合 waitUntil 使用 forceFlush(),确保在 worker 退出前导出 Trace。
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()); } },};Trace 与 Span
Section titled “Trace 与 Span”- Trace 表示一个”工作流”的单次端到端操作。它们由 Span 组成。Trace 具有以下属性:
workflow_name:这是逻辑工作流或应用。例如”代码生成”或”客户服务”。trace_id:Trace 的唯一 ID。如果你没有传入,则会自动生成。格式必须为trace_<32_alphanumeric>。group_id:可选的组 ID,用于关联同一对话中的多个 Trace。例如,你可以使用聊天线程 ID。disabled:如果为 True,则不会记录该 Trace。metadata:Trace 的可选元数据。
- Span 表示具有开始和结束时间的操作。Span 具有:
started_at和ended_at时间戳。trace_id,表示它们所属的 Traceparent_id,指向此 Span 的父 Span(如果有)span_data,即关于该 Span 的信息。例如,AgentSpanData包含有关智能体的信息,GenerationSpanData包含有关 LLM 生成的信息,等等。
默认情况下,SDK 会追踪以下内容:
- 整个
run()或Runner.run()会被包裹在一个Trace中。 - 每次智能体运行时,都会被包裹在
AgentSpan中 - LLM 生成会被包裹在
GenerationSpan中 - 每个函数工具调用都会被包裹在
FunctionSpan中 - 护栏会被包裹在
GuardrailSpan中 - 交接会被包裹在
HandoffSpan中
默认情况下,Trace 名为”Agent workflow”。如果使用 withTrace,你可以设置该名称;也可以通过 RunConfig.workflowName 配置名称和其他属性。
此外,你可以设置自定义追踪处理器,将 Trace 推送到其他目标(作为替代目标或次要目标)。
语音智能体追踪
Section titled “语音智能体追踪”如果你将 RealtimeAgent 和 RealtimeSession 与默认的 OpenAI Realtime API 一起使用,则追踪会自动在 Realtime API 端发生,除非你在 RealtimeSession 上使用 tracingDisabled: true 或使用 OPENAI_AGENTS_DISABLE_TRACING 环境变量将其禁用。
请查看语音智能体概述了解更多详细信息。
更高层级的 Trace
Section titled “更高层级的 Trace”有时,你可能希望对 run() 的多次调用成为同一个 Trace 的一部分。可以通过将整段代码包裹在 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()中,各次运行会成为整体 Trace 的一部分,而不是创建两个 Trace。
Trace 的创建
Section titled “Trace 的创建”你可以使用 withTrace() 函数创建 Trace。或者,你也可以使用 getGlobalTraceProvider().createTrace() 手动创建新 Trace,并将其传入 withTrace()。
当前 Trace 通过 Node.js AsyncLocalStorage 或相应环境的 polyfill 进行跟踪。这意味着它可以自动适配并发。
Span 的创建
Section titled “Span 的创建”你可以使用各种 create*Span() 方法(例如 createGenerationSpan()、createFunctionSpan() 等)创建 Span。通常,你不需要手动创建 Span。可使用 createCustomSpan() 函数跟踪自定义 Span 信息。
Span 会自动成为当前 Trace 的一部分,并嵌套在最近的当前 Span 之下;该当前 Span 通过 Node.js AsyncLocalStorage 或相应环境的 polyfill 进行跟踪。
某些 Span 可能会捕获潜在敏感数据。
createGenerationSpan() 会存储 LLM 生成的输入/输出, createFunctionSpan() 会存储函数调用的输入/输出。这些可能包含敏感数据,因此你可以通过 RunConfig.traceIncludeSensitiveData 禁用对此类数据的捕获。
OpenAI 追踪导出器
Section titled “OpenAI 追踪导出器”在受支持的服务器运行时中,默认追踪设置已经会导出到 OpenAI。当 Trace 导出需要使用不同于 OPENAI_API_KEY 的凭据时,请使用 setTracingExportApiKey()。
如果需要自定义摄取行为,请自行实例化 OpenAITracingExporter 并使用 setTraceProcessors(...) 或 addTraceProcessor(...) 安装它。该导出器支持 apiKey、endpoint、organization、project、maxRetries、baseDelay 和 maxDelay。
如果你替换了默认处理器,之后又想恢复带批量处理器的默认 OpenAI 导出器,请调用 setDefaultOpenAITracingExporter()。
自定义追踪处理器
Section titled “自定义追踪处理器”追踪的高层架构如下:
- 初始化时,我们会创建一个全局
TraceProvider,它负责创建 Trace,并可通过getGlobalTraceProvider()访问。 - 我们使用一个
BatchTraceProcessor配置TraceProvider,它会将 Trace/Span 批量发送到OpenAITracingExporter,后者会将 Span 和 Trace 批量导出到 OpenAI 后端。
若要自定义此默认设置,例如将 Trace 发送到替代或额外的后端,或修改导出器行为,有两个选项:
addTraceProcessor()允许你添加一个额外的追踪处理器,它会在 Trace 和 Span 准备就绪时接收它们。这使你可以在将 Trace 发送到 OpenAI 后端之外,执行自己的处理。setTraceProcessors()允许你用自己的追踪处理器替换默认处理器。这意味着除非你包含一个负责发送的TracingProcessor,否则 Trace 不会发送到 OpenAI 后端。