コンテンツにスキップ

トレーシング

Agents SDK には組み込みのトレーシングが含まれており、エージェント実行中のイベントを包括的に記録します。対象には LLM 生成、ツール呼び出し、ハンドオフ、ガードレール、さらに発生したカスタムイベントも含まれます。 Traces ダッシュボードを使用すると、開発中および本番環境でワークフローをデバッグ、可視化、監視できます。

エクスポートループのライフサイクル

Section titled “エクスポートループのライフサイクル”

サポートされているサーバーランタイムでは、トレースは一定間隔でエクスポートされます。Cloudflare Workers を含む一部のランタイムでは、トレーシング自体は有効なままでも、自動エクスポートループは利用できません。そのような環境では、ランタイムが破棄される前にキューに入ったトレースをエクスポートするため、リクエストライフサイクルの一部として getGlobalTraceProvider().forceFlush() を呼び出す必要があります。

ブラウザーではトレーシングがデフォルトで無効になっているため、このガイダンスはブラウザーには適用されません。

たとえば、Cloudflare Worker では、コードを try/catch/finally ブロックでラップし、ワーカーが終了する前にトレースがエクスポートされるように waitUntil とともに forceFlush() を使用する必要があります。

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 で名前やその他のプロパティを構成できます。

さらに、トレースを他の送信先へ送信するために、カスタムトレーシングプロセッサーを設定できます (置き換え、または第 2 の送信先として)。

音声エージェントのトレーシング

Section titled “音声エージェントのトレーシング”

デフォルトの OpenAI Realtime API で RealtimeAgentRealtimeSession を使用している場合、RealtimeSessiontracingDisabled: true を使用するか、OPENAI_AGENTS_DISABLE_TRACING 環境変数を使用して無効にしない限り、Realtime API 側で自動的にトレーシングが行われます。

詳細については、音声エージェントの概要をご覧ください。

複数回の 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. 2 回の run 呼び出しが withTrace() でラップされているため、個々の実行は 2 つのトレースを作成するのではなく、全体のトレースの一部になります。

withTrace() 関数を使用してトレースを作成できます。または、getGlobalTraceProvider().createTrace() を使用して新しいトレースを手動で作成し、それを withTrace() に渡すこともできます。

現在のトレースは、Node.js の AsyncLocalStorage または各環境に対応するポリフィルを介して追跡されます。つまり、並行処理でも自動的に機能します。

さまざまな create*Span() (例: createGenerationSpan()createFunctionSpan() など) メソッドを使用してスパンを作成できます。通常、スパンを手動で作成する必要はありません。カスタムスパン情報を追跡するための createCustomSpan() 関数が利用できます。

スパンは自動的に現在のトレースの一部になり、最も近い現在のスパンの下にネストされます。現在のスパンは、Node.js の AsyncLocalStorage または各環境に対応するポリフィルを介して追跡されます。

特定のスパンは、機微な可能性のあるデータをキャプチャする場合があります。

createGenerationSpan() は LLM 生成の入力/出力を保存し、 createFunctionSpan() は関数呼び出しの入力/出力を保存します。これらには機微なデータが含まれる可能性があるため、 RunConfig.traceIncludeSensitiveData を通じてそのデータのキャプチャを無効にできます。

OpenAI トレーシングエクスポーター

Section titled “OpenAI トレーシングエクスポーター”

サポートされているサーバーランタイムでは、デフォルトのトレーシング設定はすでに OpenAI にエクスポートします。トレースのエクスポートで OPENAI_API_KEY とは異なる認証情報を使用する必要がある場合は、setTracingExportApiKey() を使用してください。

カスタムの取り込み動作が必要な場合は、 OpenAITracingExporter を自分でインスタンス化し、setTraceProcessors(...) または addTraceProcessor(...) でインストールします。このエクスポーターは apiKeyendpointorganizationprojectmaxRetriesbaseDelay、および maxDelay をサポートします。

デフォルトのプロセッサーを置き換えた後で、バッチプロセッサーを使ったデフォルトの OpenAI エクスポーターを復元したい場合は、 setDefaultOpenAITracingExporter() を呼び出します。

カスタムトレーシングプロセッサー

Section titled “カスタムトレーシングプロセッサー”

トレーシングのハイレベルなアーキテクチャは次のとおりです:

  • 初期化時に、グローバルな TraceProvider を作成します。これはトレースの作成を担当し、getGlobalTraceProvider() を通じてアクセスできます。
  • TraceProviderBatchTraceProcessor を設定します。これはトレース/スパンをバッチで OpenAITracingExporter に送信し、スパンとトレースを OpenAI バックエンドへバッチでエクスポートします。

このデフォルト設定をカスタマイズして、代替または追加のバックエンドにトレースを送信したり、エクスポーターの動作を変更したりするには、2 つの選択肢があります:

  1. addTraceProcessor() を使用すると、トレースとスパンが準備できた時点で受け取る 追加の トレースプロセッサーを追加できます。これにより、OpenAI のバックエンドへトレースを送信することに加えて、独自の処理を行えます。
  2. setTraceProcessors() を使用すると、デフォルトのプロセッサーを独自のトレースプロセッサーで 置き換える ことができます。これは、そうした処理を行う TracingProcessor を含めない限り、トレースは OpenAI バックエンドに送信されないことを意味します。

外部トレーシングプロセッサーの一覧

Section titled “外部トレーシングプロセッサーの一覧”