Pi は、ターミナルベースのコーディングエージェントです。Weave は、GenAI semantic conventions に準拠した createOtelExtension インテグレーションを使用して、Pi のセッション、LLM Call、ツール実行を自動的にトレースします。このページでは、Pi アプリケーションで Weave のトレースを有効にして、エージェントの動作を観察し、Runs をデバッグし、トークン使用量とコストを分析する方法を説明します。
このインテグレーションは、Pi のセッションデータを Weave に送信します。このデータには、ユーザーのプロンプト、モデルの応答、ツールの入力と出力、Pi ツールが読み取った file の内容、シェルコマンドとその出力、取得した URL やページの内容が含まれる場合があります。このインテグレーションでは、PII の除去や機密データのマスキングは実装されていません。セキュリティ要件またはコンプライアンス要件のためにこのデータを Weave に送信できない場合は、Pi アプリケーションで Weave のトレースを有効にしないでください。
- Node.js (v18 以降)。
- W&B アカウントと、
WANDB_API_KEY 環境変数として設定された APIキー。
Pi は TypeScript と Node.js のフレームワークで、Python に相当するものはありません。Pi では ESM モジュールシステムが必要です。package.json で "type": "module" を使用するか、TypeScript を ESM 出力にコンパイルする必要があります。CommonJS プロジェクトではエラーが発生します。ESM project の設定について詳しくは、TypeScript SDK integration を参照してください。
Weave、Pi、Node のタイプ定義を、ローカルの project の依存関係としてインストールします。
npm install weave @earendil-works/pi-coding-agent
npm install --save-dev @types/node tsx typescript
以下の例は、単一の Pi のプロンプトと応答をトレースするために必要な最小限のセットアップを示しています。エージェントのセッションを作成する前に weave.init() を呼び出し、拡張機能ファクトリとして createOtelExtension() を渡します。Weave は、会話、各プロンプト/応答サイクル (invoke_agent) 、個々の LLM Call (chat) 、およびツール実行 (execute_tool) を含む、エージェントのライフサイクル全体をトレースします。SessionManager.inMemory() はセッション ID を自動的に生成します。
import {init, createOtelExtension} from 'weave';
import {
createAgentSession,
DefaultResourceLoader,
SessionManager,
getAgentDir,
} from '@earendil-works/pi-coding-agent';
async function main() {
// 1. Initialize Weave. Sets up the OTEL TracerProvider that points at your
// Weave project. All spans created by createOtelExtension() are
// automatically exported here.
await init('[YOUR-TEAM]/[YOUR-PROJECT]');
// 2. Create a resource loader and inject the Weave OTEL extension.
// The resource loader provides the Pi runtime environment and
// extension lifecycle used for tracing agent activity.
const resourceLoader = new DefaultResourceLoader({
cwd: process.cwd(),
agentDir: getAgentDir(),
extensionFactories: [createOtelExtension({})],
});
await resourceLoader.reload();
// 3. Start the agent session
const {session} = await createAgentSession({
resourceLoader,
sessionManager: SessionManager.inMemory(),
});
// 4. 拡張機能をバインドします。session_start イベントをトリガーし、OTEL アダプターが
// ルート会話 span を作成して会話 ID を取得します。
await session.bindExtensions({});
// 5. Stream assistant output to stdout
session.subscribe(event => {
if (
event.type === 'message_update' &&
event.assistantMessageEvent.type === 'text_delta'
) {
process.stdout.write(event.assistantMessageEvent.delta);
}
});
// 6. Send a prompt and wait for the full response
await session.prompt('What files are in the current directory?');
console.log();
}
main();
tsx を使用してスクリプトをコンパイルし、実行します。[FILENAME] は TypeScript file の名に置き換えてください:
コードを実行すると、トレースが Weave プロジェクトの Agents タブ (https://wandb.ai/[YOUR-TEAM]/[YOUR-PROJECT]/weave/agents) に表示されます。Weave は、アプリケーションの各 run について、Pi セッション、LLM Call、およびツール実行を取得します。
この例をマルチターンの会話にするには、プロンプトを追加します。Weave は session.prompt() を呼び出すたびに、それぞれが単一のルート span の下にネストされた個別の invoke_agent span としてトレースします。エージェントはプロンプト間で自動的にコンテキストを保持します。
コードを実行すると、Agents タブに、ネストされた LLM Call、ツール実行、トークン使用量、コストを含む、マルチターンの完全なタイムラインが表示されます。