学習内容
このクイックスタートを終えると、Agent Lens 互換の OTel スパンを出力するマルチターンエージェントが動作する状態になります。また、Agent Lens が会話、ターン、LLM Call、ツール呼び出しをエージェントコードにどのように対応付けるかを理解できるため、同じパターンを独自のカスタムエージェントにも適用できるようになります。 このガイドのコードでは、Wikipedia で情報を調べられる小規模な Python または TypeScript のリサーチエージェントをセットアップします。このエージェントは 3 つの質問 (3 ターン) を行い、Wikipedia を検索して回答を探すタイミングを LLM に判断させます。Agent Lens はすべてのステップ (会話、各質問、各 AI の応答、各 Wikipedia ルックアップ) を記録するため、Agent Lens の Conversations タブで処理の流れを確認できます。 このガイドでは、次の方法を説明します。tracing.init()を使用して、エージェントトレース用に Agent Lens を初期化する。start_conversation/startConversationとstart_turn/startTurnを使用して、会話とターンを開始する。start_llm/startLLMで LLM Call をラップし、使用量を記録する。start_tool/startToolでツール実行をラップし、結果を記録する。- トークン数とコストがレンダリングされるように、完全なトークン使用量と料金を算出可能なモデルを記録する。
- 生成された会話、ターン、ツール呼び出しを Conversations タブで表示する。
Agent Lens SDK とエージェントの連携の仕組み
Agent Lens SDK には、エージェント向けの汎用的な OTel 取り込みシステムが含まれています。そのため、Agent Lens はエージェントのコード内にある任意の OTel スパンから情報を取得できます。ただし、Agent Lens UI の Conversations タブでエージェントのトレースをレンダリングするには、以下のスパンを特別に処理する必要があります。
Python では、4 つの関数はいずれもコンテキストマネージャーとして使用できます (
with tracing.start_*(...) as obj:) 。ブロックを抜ける際には、例外が発生した場合も含め、スパンが終了し属性がフラッシュされます。TypeScript では、返された各オブジェクトに対して .end() を呼び出してください。例外発生時にも確実にクリーンアップされるよう try { ... } finally { obj.end(); } を使用し、同時に実行される run 同士が会話を共有しないよう、エージェントの各 run を tracing.runIsolated() でラップしてください。
gen_ai.usage.* や gen_ai.agent.name など、その他の GenAI セマンティック規約の属性を使用すると追加のレンダリングが可能になりますが、これらは必須ではありません。
前提条件
- CoreWeave Forge アカウントと APIキー
- OpenAI APIキー
- Python 3.9 以降 (Python のサンプルを使用する場合)
- Node.js 18 以降と、
tsxなどの TypeScript ランナー (TypeScript のサンプルは組み込みのfetchを必要とし、プレーンな JavaScript としては実行できません)
パッケージのインストール
開発環境に次のパッケージをインストールします。.mts ファイルとして保存し、npx tsx [FILENAME].mts で実行します。
Agent Lens を初期化する
tracing.init() は APIキーで認証を行い、エージェント スパンを Agent Lens に送信する OTel エクスポーターを設定します。プロジェクト名にはチーム名を含める必要があります。SDK は WANDB_API_KEY 環境変数から APIキーを読み取りますが、api_key / apiKey 引数で渡すこともできます。
ツールを定義する
次のコードでは、エージェントが使用する Wikipedia 検索ツールと、そのツールをいつどのように使用するかを指定する OpenAI のツールスキーマを定義します。トレースされるマルチターンエージェントを実行する
ツールと Agent Lens の初期化が完了したら、次のステップではそれらを組み合わせて完全なエージェントループを構築します。このループを見ると、会話、ターン、LLM Call、ツール呼び出しがどのようにネストされるかがわかります。 次の例では、1 つの会話の中で 3 つのターンを実行します。各ターンでは次の処理を行います。chatスパンを開始し、ツールを呼び出すかどうかを LLM に判断させます。- LLM がツールの使用をリクエストした場合は、その呼び出しを囲む
execute_toolスパンを開始し、結果を LLM に返します。 - 2 つ目の
chatスパンを開始し、最終的な回答を生成します。
Agent Lens SDK は、OpenAI、Anthropic、Google Gen AI の各クライアントライブラリによる呼び出しを自動的にトレースします。このクイックスタートでは、スパン同士の関係を示すために
start_llm() を使用して各 LLM Call を手動で記録するので、init() に autopatch_integrations=False を渡しています。これを指定しないと、各呼び出しが start_llm() スパンと自動インテグレーションの両方で記録され、二重に記録されます。この引数は最初の init() 呼び出しで渡してください。以前の呼び出しで適用されたパッチは、後から autopatch_integrations=False を指定して呼び出しても削除されません。独自のコードでは、自動パッチ適用で LLM Call を記録するか、自動パッチ適用を無効にして自分で記録するかのどちらかにしてください。トークン使用量とコストを記録する
各chat スパンには、トークン使用量とモデル ID が含まれます。Agent Lens は使用量からトークン数をレンダリングし、使用量とモデル ID からコストを算出します。そのため、値が不完全な場合や価格を算出できない場合は、トレースの他の部分が正しく見えていても、トークンが 0 in / 0 out、またはコストが Cost - と表示されます。record(...) を使用すると、これらのフィールド (output_messages、response_id、reasoning など) を 1 回の呼び出しでまとめて設定できます。適用されるのは、渡したフィールドのみです。
コストを表示するには、次の 2 点を正しく設定する必要があります。
- 完全な使用量。
input_tokensは、キャッシュされたトークンを含む入力の合計です。Agent Lens はキャッシュの読み取りと書き込みをそれぞれ個別の料金で計算し、入力の合計から差し引きます。そのため、cache_read_input_tokensとcache_creation_input_tokensは、これらを含めた合計のinput_tokensとあわせて報告する必要があります。プロンプトキャッシュを備えたプロバイダー (Anthropic など) では、キャッシュされたトークンが入力の大半を占めることが多いため、これらを省略すると使用量とコストがほぼゼロとしてレンダリングされます。 - 価格を算出できるモデル ID。 応答で返される具体的な ID (
resp.model) をresponse_modelとして渡します。コストはモデルに基づくルックアップで算出されます。Agent Lens はresponse_model(プロバイダーが実際に使用したモデル) を優先し、これがない場合はstart_llmに渡したmodelを使用します。opusやsonnetなどのエイリアスでは価格を算出できず、Cost -と表示されます。
prompt_tokens に含めてカウントするため、上記の例をそのまま適用できます。一方、Anthropic はキャッシュされたトークンを input_tokens とは別に報告するため、Agent Lens が価格計算に使用する合計にこれらを加算してください。
Conversations タブでエージェントのトレースを確認する
Agent Lens で project を開き、Conversations を選択します。次の内容が表示されます。research-botの会話が 1 つあり、3 つのターンが含まれています。- 各ターン (
invoke_agent) の中に、2 つのchatスパンと 1 つのexecute_toolスパンがネストされています。 - 各
chatには、トークン数、レイテンシー、モデル、メッセージのやり取り全体が表示されます。
アプリから会話にリンクする
独自の UI から Agent Lens 内の会話にディープリンクするには、その会話の ID が必要です。start_conversation / startConversation はこの ID を conversation_id / conversationId として公開しています。この ID をログしたり、独自のリクエスト ID と一緒に保存したりしておけば、後で Conversations タブから該当の会話を開くことができます。
次のステップ
- Agent Lens でエージェントをトレースする方法と、Agent Lens SDK で利用できる機能やオプションについて確認してください。
- Agent Lens をエージェントと統合するその他の方法については、エージェントインテグレーションを選択するを参照してください。