gen_ai.agent.name や gen_ai.conversation.id などの GenAI セマンティック規約に準拠した属性が付与されます。
@weave.op デコレーターを使用して個々の関数を Op としてトレースする場合は、LLM アプリケーションをトレースするを参照してください。
はじめる前に
まず、weave パッケージをインストールして project を初期化します。このステップでチームと project が Weave に登録され、SDK がスパンを UI 上の正しい場所に送信できるようになります。
- Python
- TypeScript
[YOUR-TEAM] を CoreWeave Forge のチーム名に、[YOUR-PROJECT] を Weights & Biases のプロジェクト名に置き換えてください。start_conversation()、start_turn()、start_llm()、start_tool()、start_subagent() のいずれかを呼び出す前に、weave.init() を呼び出してください。トレースが無効になっている場合や init が呼び出されていない場合、エージェントトレースの関数はすべて、エラーを出さずに no-op として動作します。そのため、インストルメンテーションを本番コードに残したまま、設定で有効・無効を切り替えられます。エージェントのデータモデル
Weave は、エージェントの動作を 1 対多の関係からなる階層としてモデル化します。各エージェントは複数の会話を持つことができ、各会話は複数のターンを、各ターンは複数の LLM Call を持つことができます。さらに、各 LLM Call は複数のツール呼び出しをトリガーできます。
次の図は、1 つのエージェントが複数の会話を持ち、1 つの会話が複数のターンを持つ、といった階層関係を示しています。
会話は、親スパンではなく共通の
conversation_id 属性によってターンをグループ化します。そのため、各ターンはそれぞれ独立した OTel トレースを開始します。この設計により、分散トレースと並列実行がサポートされます。クライアントはサーバー側で集約を行わず、スパンを OTel コレクターへ直接送信します。
エージェントトレース API
以下のセクションでは、トップレベルの各トレース関数と、それぞれが受け入れる引数について説明します。これらの関数を使用して、前のセクションで説明したデータモデルの会話、ターン、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() で取得できます。
- Python
- TypeScript
ターンを開始する
start_turn() (Python) と startTurn() (TypeScript) は、新しい invoke_agent スパンを作成します。このスパンは新しい OTel トレースのルートになります。Weave はこのスパンを使用して、ユーザーとエージェント間の 1 回分の完結したやり取りをタイムラインビューに表示します。
呼び出し方法は 2 通りあります。
- トップレベル関数として呼び出す (
weave.start_turn(...)/weave.startTurn(...))。以下のサンプルではこの形式を使用しています。コンテキストから実行中の会話を解決し、その会話 ID を継承します。実行中の会話がない場合、ターンはconversation_idなしで作成され、他のターンとはグループ化されません。 - インスタンスメソッドとして、参照を保持している会話から呼び出す (
conversation.start_turn(...)/conversation.startTurn(...))。コンテキストマネージャーのブロック内など、会話オブジェクトをスコープ内で明示的に扱える場合に便利です。以下の「コンテキストマネージャーまたは try-finally パターン」のサンプルではこの形式を使用しています。両 SDK のConversation、Turn、LLM、Tool、SubAgentの各リファレンスページへの直接リンクについては、上記のデータモデルの表を参照してください。
- Python
- TypeScript
LLM Call を開始する
start_llm() / startLLM() は、現在のターンの下にネストされた chat スパンを作成します。Weave はこのスパンを使用して、トークン使用量、モデル名、入力メッセージと出力メッセージ、推論を Agents ビューに表示します。
- Python
- TypeScript
llm オブジェクトが閉じられる前に応答データを割り当てます。
- Python
- TypeScript
provider_name / providerName は明示的に指定してください。Weave はモデルの string からプロバイダーを推測しません。
ツール呼び出しを開始する
start_tool() / startTool() は execute_tool スパンを作成します。このスパンは、コンテキスト内で実行中の OTel スパン (通常は、そのツール呼び出しを生成した LLM Call の chat スパン) の子になります。
- Python
- TypeScript
- Python
- TypeScript
エージェントトレースの使用パターン
以下のセクションでは、エージェントのコード構成に応じてこれらの関数をどのように組み合わせるかを説明します。 以下のサンプルでは、Weave SDK の 2 つのタイプを使用します。Message(Python · TypeScript) は、会話内の 1 つのエントリ (ユーザー入力、アシスタントの応答、システムプロンプト、ツール結果のいずれか) を表します。モデルが受け取った内容を記録するには、メッセージのリストをllm.input_messages/llm.inputMessagesに割り当てます。モデルが生成した内容を記録するには、llm.output_messages/llm.outputMessagesに割り当てます。Usage(Python · TypeScript) は、LLM の応答からトークン数を取得するもので、llm.usageに割り当てます。
コンテキストマネージャーまたは try-finally パターン
ほとんどのエージェントでは、Python ではコンテキストマネージャーパターンを、TypeScript では try-finally パターンを使用してください。例外が発生した場合でも、ブロックの終了時にスパンが閉じられ、送信されます。 Weave は実行中の会話、ターン、LLM Call をコンテキストに保持します。そのため、ブロック内で呼び出される関数は、親への参照を明示的に保持していなくてもstart_llm() / startLLM() や start_tool() / startTool() を呼び出せます。コードが同じ非同期コンテキストで実行されている限り、この仕組みはモジュールの境界を越えても機能します。コールスタック内のどこからでも実行中のオブジェクトを取得するには、weave.get_current_conversation() / weave.getCurrentConversation()、weave.get_current_turn() / weave.getCurrentTurn()、weave.get_current_llm() / weave.getCurrentLLM() を使用します。
- Python
- TypeScript
手動で開始・終了するパターン
with ブロックや try/finally を使用できない場合は、.end() を明示的に呼び出します。たとえば、スパンの開始と終了を別々の関数の Call で行う場合や、コルーチンの外部で非同期のライフサイクルを管理する場合などです。スパンを確実に閉じてコレクターにフラッシュするため、作成したすべてのオブジェクトに対して必ず .end() を呼び出してください。
- Python
- TypeScript
セマンティック規約
Weave SDK は、GenAI セマンティック規約および GenAI エージェントスパン規約に準拠した OTel スパンを出力します。Weave はあらゆる OTel スパンを受け入れ、すべての属性を保存してクエリできるようにします。Weave のトレースオブジェクトと併用して、標準の OTel スパン API でスパンに任意の属性を追加することもできます。Weights & Biases UI でのデータの表示
前述のパターンでエージェントをインストルメントして実行すると、トレースは Weave プロジェクトの Agents タブ (https://forge.coreweave.com/wandb/[YOUR-TEAM]/[YOUR-PROJECT]/weave/agents) に表示されます。
- Conversations タブには、すべての会話が、ターンのアクティビティを示すミニマップとともに表示されます。
- Conversation 詳細ビューは会話をクリックすると開きます。このビューには、その会話のすべてのターン、LLM Call、ツール実行、トークン数、および関連付けられたフィードバックが表示されます。