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