追踪
Agents SDK 内置了追踪功能,可在一次智能体运行期间收集完整的事件记录:LLM 生成、工具调用、交接、护栏,甚至发生的自定义事件。通过 Traces dashboard,你可以在开发和生产环境中调试、可视化并监控你的工作流。
导出循环生命周期
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 组成。Trace 具有以下属性:
workflow_name:逻辑工作流或应用名称。例如“代码生成”或“客户服务”。trace_id:Trace 的唯一 ID。若未传入会自动生成。格式必须为trace_<32_alphanumeric>。group_id:可选分组 ID,用于关联同一会话中的多个 Trace。例如可使用聊天线程 ID。disabled:若为 True,则不会记录该 Trace。metadata:Trace 的可选元数据。
- Spans 表示具有开始和结束时间的操作。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 配置名称和其他属性。
此外,你还可以设置自定义追踪处理器,将追踪发送到其他目标(作为替代或次级目标)。
语音智能体追踪
Section titled “语音智能体追踪”如果你在默认 OpenAI Realtime API 下使用 RealtimeAgent 和 RealtimeSession,追踪会在 Realtime API 侧自动进行,除非你在 RealtimeSession 中设置 tracingDisabled: true,或使用 OPENAI_AGENTS_DISABLE_TRACING 环境变量禁用。
更多细节请查看语音智能体概述。
更高层级追踪
Section titled “更高层级追踪”有时你可能希望多次 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 之下;这一关系通过 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,它负责创建 Trace,并可通过getGlobalTraceProvider()访问。 - 我们会将
TraceProvider配置为使用BatchTraceProcessor,它会将 Trace/Span 按批次发送到OpenAITracingExporter,后者再将 Span 和 Trace 按批次导出到 OpenAI 后端。
要自定义该默认设置,以将追踪发送到替代或附加后端,或修改导出器行为,你有两种选择:
addTraceProcessor()允许你添加一个额外的追踪处理器,它会在 Trace 和 Span 就绪时接收它们。这使你可以在发送到 OpenAI 后端之外执行自己的处理。setTraceProcessors()允许你用自己的追踪处理器替换默认处理器。这意味着除非你包含一个会执行该操作的TracingProcessor,否则追踪不会发送到 OpenAI 后端。