メインコンテンツへスキップ
W&B Weave SDK を使用してマルチターンのエージェント型アプリケーションを計装し、エージェントの動作を確認、デバッグ、評価する方法を学びます。このガイドは、エージェントを構築または統合し、会話、ターン、LLM Call、ツール実行を構造化された形で可視化したい開発者を対象としています。 Agents 向けの Weave SDK は、マルチターンのエージェント会話のライフサイクル全体をモデル化します。これには、多数の会話を持つエージェント、ターンをグループ化する会話、ユーザーとエージェントの各やり取り (ターン) 、ターン内の LLM Call、そして LLM によってトリガーされるツール実行が含まれます。トレースは Weave プロジェクトの Agents タブに表示されます。各会話には、ネストされたツール呼び出し、トークン使用量、feedback を含むマルチターンのタイムラインが表示されます。 Weave は、分散トレースのオープン標準である OpenTelemetry (OTel) を基盤としています。各ターン、LLM Call、ツール呼び出し はそれぞれ OTel の スパン (1 つの操作を表す構造化レコード) を生成します。各 スパン には、gen_ai.agent.namegen_ai.conversation.id などの GenAI semantic-convention 属性 がタグ付けされます。 個々の関数を @weave.op デコレーターで Ops としてトレースしている場合は、代わりに LLM アプリケーションをトレースする を参照してください。

始める前に

使い始めるには、weave パッケージをインストールして project を初期化します。この手順により、チームと project が Weave に登録され、SDK がスパンを UI の正しい場所にルーティングできるようになります。
[YOUR-TEAM] は W&B チーム名に、[YOUR-PROJECT] は W&B のプロジェクト名に置き換えてください。
start_conversation()start_turn()start_llm()start_tool()start_subagent() を呼び出す前に、weave.init() を呼び出してください。トレースが無効になっている場合、または init 呼び出しがない場合、すべてのエージェント トレース関数は何もせずに終了します。そのため、インストルメンテーションは本番コードに残したまま、設定で制御できます。

エージェントのデータモデル

Weave では、エージェントの動作を 1 対多の関係からなる階層としてモデル化します。各エージェントは複数の会話を持つことができ、各会話は複数のターンを持つことができ、各ターンは複数の LLM Call を持つことができ、各 LLM Call は複数のツール呼び出しをトリガーできます。
概念Weave SDK クラスOTel スパン タイプ説明参照ページ
エージェント(no class)(no スパン, grouped by the agent_name 属性)Agents タブ内のエージェント型アプリケーション。1 つ以上の会話を含みます
会話Conversation(no スパン, turns are grouped by the conversation_id 属性)1 つ以上のターンを含む会話または runPython
TypeScript
ターンTurninvoke_agent1 つのユーザーメッセージと、それに対するエージェントの完全な応答Python
TypeScript
LLM CallLLMchat言語モデル API への 1 回の CallPython
TypeScript
ツール呼び出しToolexecute_toolLLM の応答によってトリガーされる 1 回のツール呼び出しPython
TypeScript
サブエージェント呼び出しSubAgentinvoke_agentネストされたエージェント呼び出し。通常は、あるエージェントが別のエージェントに委譲する場合に発生しますPython
TypeScript
次の図は、1 つのエージェントに複数の会話が含まれ、1 つの会話に複数のターンが含まれ、その後も同様に続くことを示しています。 会話は、親 スパン ではなく、共有された conversation_id 属性によって ターン をグループ化します。そのため、各 ターン はそれぞれ独立した OTel トレースを開始します。この設計は、分散トレースと並列実行をサポートします。クライアントは、サーバー側での集約を行わずに、スパン を OTel collector に直接送信します。
Claude Agent SDK や Codex などの SDK やハーネスに Weave を統合するには、Trace agent integrations を参照してください。Weave は、エージェント構築 SDK やエージェントハーネスのいくつかに自動でパッチを適用するため、すばやく統合できます。

エージェントのトレース API

以下のセクションでは、各トップレベルのトレース関数と、その関数が受け入れる引数について説明します。これらを使用して、前のセクションで説明したデータモデルの 会話、turn、LLM Call、および ツール呼び出し の各レイヤーを計測します。 Weave では、次のトップレベル関数を提供しています。各関数は、コンテキストマネージャーとして動作するオブジェクト (Python では with、TypeScript では try/finally を使用) を返すか、.end() を呼び出して手動で終了できます。

会話を開始する

start_conversation() (Python) または startConversation() (TypeScript) は、すべての子スパンに conversation_id 属性を付与し、ターンが Agents タブでグループ化されるようにします。conversation_id / conversationId を渡す場合は、会話のライフタイム全体で不変である必要があります。同じ ID を再利用すると、既存の会話に新しいターンを追加できます。省略した場合は、SDK が UUID を自動的に生成します。 アクティブな会話はコンテキスト (Python の ContextVar または Node.js の AsyncLocalStorage) に格納されるため、同じ非同期コンテキストで実行されるコードであれば、会話オブジェクトを明示的に渡さなくても weave.get_current_conversation() / weave.getCurrentConversation() で取得できます。

ターンを開始する

start_turn() (Python) と startTurn() (TypeScript) は、新しい OTel トレースのルートとなる invoke_agent スパン を新しく作成します。Weave は、この スパン を使用して、タイムラインビュー内で 1 回の完全なユーザーとエージェントのやり取りを表現します。 呼び出し方法は 2 とおりあります。
  • トップレベル関数として (weave.start_turn(...) / weave.startTurn(...))。以下の例で示す形式です。コンテキストからアクティブな会話を取得し、その会話 ID を継承します。アクティブな会話がない場合、ターンは conversation_id なしで作成され、ほかのターンとグループ化されません。
  • 参照を保持している会話のインスタンスメソッドとして (conversation.start_turn(...) / conversation.startTurn(...))。コンテキストマネージャーブロック内など、スコープ内に明示的な会話オブジェクトがある場合に便利です。以下の「コンテキストマネージャーまたは try-finally パターン」の例では、この形式を使用しています。両方の SDK の ConversationTurnLLMToolSubAgent のリファレンスページへの直接リンクについては、上記のデータモデル表を参照してください。

LLM Call を開始する

start_llm() / startLLM() は、現在のターンの下にネストされた chat span を作成します。Weave はこの span を使用して、Agents ビューに token 使用量、モデル名、入力メッセージと出力メッセージ、および推論を表示します。
LLM Call が完了したら、閉じる前にレスポンスデータを llm オブジェクトに割り当ててください。
provider_name / providerName は明示的に渡してください。Weave はモデル文字列からこれを推測しません。

ツール呼び出しを開始する

start_tool() / startTool()execute_tool span を作成します。この span は、コンテキスト内でアクティブな OTel span の子になります (通常は、ツール呼び出しを生成した LLM Call の chat span です) 。
閉じる前にツールの結果を設定します。

エージェント トレースの使用パターン

以下のセクションでは、エージェント コードの構造に応じて、これらの関数をどのように組み合わせるかを説明します。 以下の例では、Weave SDK の 2 つのタイプを使用します。
  • Message (Python · TypeScript) は、会話内の 1 つのエントリ (ユーザー入力、アシスタントの応答、system prompt、または tool の結果) を表します。モデルが受け取った内容を記録するには、メッセージのリストを llm.input_messages / llm.inputMessages に割り当て、生成した内容を記録するには llm.output_messages / llm.outputMessages に割り当てます。
  • Usage (Python · TypeScript) は、LLM の応答から token 数を取得し、llm.usage に割り当てられます。
Weave はこの両方を使用して、各 LLM Call の入力、出力、token 使用量を Agents ビュー に表示します。

コンテキストマネージャーまたは try-finally パターン

ほとんどのエージェントでは、Python ではコンテキストマネージャーパターン、TypeScript では try-finally パターンを使用します。スパン は、例外が発生した場合でも、ブロックの最後でクローズされて送信されます。 Weave はアクティブな 会話、ターン、LLM Call をコンテキストに保持するため、ブロック内で呼び出される任意の関数は、親への明示的な参照を持たなくても start_llm() / startLLM() または start_tool() / startTool() を呼び出せます。これは、コードが同じ async コンテキスト内で実行されている限り、モジュール境界をまたいでも機能します。コールスタック内のどこからでも現在アクティブなオブジェクトを取得するには、weave.get_current_conversation() / weave.getCurrentConversation()weave.get_current_turn() / weave.getCurrentTurn()、および weave.get_current_llm() / weave.getCurrentLLM() を使用します。

手動で開始・終了するパターン

with ブロックや try/finally を使用できない場合は、.end() を明示的に使用します。たとえば、スパン の開始と終了が別々の関数呼び出しにまたがる場合や、コルーチンの外で非同期ライフサイクルを管理する場合です。作成したすべてのオブジェクトに対して .end() を呼び出し、スパン が終了して collector に flush されるようにする責任はユーザーにあります。

セマンティック規約

Weave SDK は、GenAI semantic conventions および GenAI agent span conventions に準拠する OTel span を出力します。Weave はあらゆる OTel span を受け付け、すべての属性を保存し、クエリできるようにします。標準の OTel span API を Weave のトレース オブジェクトと併用して、span に任意の属性を追加できます。

Weave UI でデータがどのように表示されるか

前述のパターンを使ってエージェントをインストルメントし、実行すると、トレースは Weave プロジェクトの Agents タブ (https://wandb.ai/[YOUR-TEAM]/[YOUR-PROJECT]/weave/agents) に表示されます。
  • Conversations タブには、すべての会話と、ターンのアクティビティを示すミニマップが表示されます。
  • Conversation detail view は会話をクリックすると開き、すべてのターン、LLM Call、ツール実行、トークン数、関連付けられたフィードバックが表示されます。
Weave で Agents データを表示する方法の詳細については、エージェントのアクティビティを表示する を参照してください。