跳转到内容

追踪

Agents SDK 内置了追踪功能,可全面记录智能体运行期间发生的事件:LLM 生成、工具调用、交接、护栏,甚至是发生的自定义事件。使用追踪仪表板,您可以在开发和生产环境中调试、可视化和监控工作流。

在支持的服务器运行时中,追踪数据会定期导出。在包括 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());
}
},
};
  • 追踪表示一次”工作流”的完整端到端操作,由多个跨度组成。追踪具有以下属性:
    • workflow_name:逻辑工作流或应用。例如”代码生成”或”客户服务”。
    • trace_id:追踪的唯一 ID。如果未传入,则会自动生成。格式必须为 trace_<32_alphanumeric>
    • group_id:可选的组 ID,用于关联同一对话中的多个追踪。例如,可以使用聊天线程 ID。
    • disabled:如果为 True,则不会记录该追踪。
    • metadata:追踪的可选元数据。
  • 跨度表示具有开始和结束时间的操作。跨度具有以下属性:
    • started_atended_at 时间戳。
    • trace_id,表示其所属的追踪
    • parent_id,指向此跨度的父跨度(如果存在)
    • span_data,即有关跨度的信息。例如,AgentSpanData 包含有关智能体的信息,GenerationSpanData 包含有关 LLM 生成的信息,依此类推。

默认情况下,SDK 会追踪以下内容:

  • 整个 run()Runner.run() 都封装在一个 Trace 中。
  • 每次运行智能体时,都会封装在 AgentSpan
  • LLM 生成封装在 GenerationSpan
  • 每个函数工具调用都封装在 FunctionSpan
  • 护栏封装在 GuardrailSpan
  • 交接封装在 HandoffSpan

默认情况下,追踪名为”Agent workflow”。使用 withTrace 时可以设置此名称,也可以通过 RunConfig.workflowName 配置名称和其他属性。

此外,还可以设置自定义追踪处理器,将追踪数据推送到其他目的地(作为替代目的地或辅助目的地)。

如果您将 RealtimeAgentRealtimeSession 与默认的 OpenAI Realtime API 配合使用,追踪将自动在 Realtime API 端进行,除非您通过 tracingDisabled: trueRealtimeSession 上将其禁用,或使用 OPENAI_AGENTS_DISABLE_TRACING 环境变量将其禁用。

有关更多详细信息,请参阅语音智能体概述

有时,您可能希望多次调用 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}`);
});
  1. 由于两次 run 调用都封装在 withTrace() 中,因此各次运行将成为整体追踪的一部分,而不会创建两个追踪。

可以使用 withTrace() 函数创建追踪。也可以使用 getGlobalTraceProvider().createTrace() 手动创建新追踪,并将其传入 withTrace()

当前追踪通过 Node.js AsyncLocalStorage 或相应环境中的 polyfill 进行跟踪。这意味着它可以自动处理并发。

可以使用各种 create*Span() 方法(例如 createGenerationSpan()createFunctionSpan() 等)创建跨度。通常不需要手动创建跨度。可以使用 createCustomSpan() 函数来跟踪自定义跨度信息。

跨度会自动归属于当前追踪,并嵌套在最近的当前跨度下;当前跨度通过 Node.js AsyncLocalStorage 或相应环境中的 polyfill 进行跟踪。

某些跨度可能会捕获潜在的敏感数据。

createGenerationSpan() 会存储 LLM 生成的输入和输出,createFunctionSpan() 会存储函数调用的输入和输出。这些内容可能包含敏感数据,因此可以通过 RunConfig.traceIncludeSensitiveData 禁用此类数据的捕获。

在支持的服务器运行时中,默认追踪设置已配置为导出到 OpenAI。如果追踪导出需要使用与 OPENAI_API_KEY 不同的凭据,请使用 setTracingExportApiKey()

如果需要自定义数据接收行为,请自行实例化 OpenAITracingExporter,并使用 setTraceProcessors(...)addTraceProcessor(...) 安装它。该导出器支持 apiKeyendpointorganizationprojectmaxRetriesbaseDelaymaxDelay

如果替换了默认处理器,之后希望恢复使用批处理器的默认 OpenAI 导出器,请调用 setDefaultOpenAITracingExporter()

追踪的高层架构如下:

如果要自定义此默认设置,将追踪发送到替代或附加后端,或修改导出器行为,可以使用以下两个选项:

  1. addTraceProcessor() 允许添加一个额外的追踪处理器,在追踪和跨度就绪时接收它们。这样,除了将追踪发送到 OpenAI 后端外,还可以执行自己的处理。
  2. setTraceProcessors() 允许使用自己的追踪处理器替换默认处理器。这意味着,除非包含一个能够将追踪发送到 OpenAI 后端的 TracingProcessor,否则追踪不会发送到 OpenAI 后端。