メインコンテンツへスキップ
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 のプロンプトと応答をトレースする

以下の例は、単一の Pi のプロンプトと応答をトレースするために必要な最小限のセットアップを示しています。エージェントのセッションを作成する前に weave.init() を呼び出し、拡張機能ファクトリとして createOtelExtension() を渡します。Weave は、会話、各プロンプト/応答サイクル (invoke_agent) 、個々の LLM Call (chat) 、およびツール実行 (execute_tool) を含む、エージェントのライフサイクル全体をトレースします。SessionManager.inMemory() はセッション ID を自動的に生成します。
import {, } from 'weave';

import {
  ,
  ,
  ,
  ,
} from '@earendil-works/pi-coding-agent';

async function () {
  // 1. Initialize Weave. Sets up the OTEL TracerProvider that points at your
  //    Weave project. All spans created by createOtelExtension() are
  //    automatically exported here.
  await ('[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  = new ({
    : .(),
    : (),
    : [({})],
  });

  await .reload();

  // 3. Start the agent session
  const {} = await ({
    ,
    : .inMemory(),
  });

  // 4. 拡張機能をバインドします。session_start イベントをトリガーし、OTEL アダプターが
  //    ルート会話 span を作成して会話 ID を取得します。
  await .bindExtensions({});

  // 5. Stream assistant output to stdout
  .subscribe( => {
    if (
      .type === 'message_update' &&
      .assistantMessageEvent.type === 'text_delta'
    ) {
      ..(.assistantMessageEvent.delta);
    }
  });

  // 6. Send a prompt and wait for the full response
  await .prompt('What files are in the current directory?');
  .();
}

();
tsx を使用してスクリプトをコンパイルし、実行します。[FILENAME] は TypeScript file の名に置き換えてください:
npx tsx [FILENAME].ts
コードを実行すると、トレースが 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、ツール実行、トークン使用量、コストを含む、マルチターンの完全なタイムラインが表示されます。