本文へスキップ
claudemods

Agent Profiler:セッションの時間の行方がわかる Claude Code プロファイラー

Claude Code セッションの時間がどこで使われたかを、モデル待ち・ツール・サブエージェントに分けてステータスラインに表示。OTLP トレースも出力できます。

権限

  • ファイルを書き込むお使いのマシン上でファイルを作成・上書きできます($.fs.write)。
  • ネットワークHTTP リクエストを送信したり、MCP サーバーと通信したりできます($.http.fetch / $.mcp.*)。
  • ツール呼び出しを傍受Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
  • UI を変更Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
  • コマンド・ツールを追加あなたや Claude が呼び出せる新しいスラッシュコマンドやツールを登録します($.command.register / $.tool.register)。
検証バージョン
v2.1.303
最終検証日
必要バージョン
Claude Code ≥ 2.1.287
表示先
ステータス、ペイン、トースト

Claude Code 内でインストール:

/plugin install agent-profiler --marketplace YeonwooSung/my-claude-code-mods
すべてのインストール方法 ↓

このModでできること

Agent Profiler は YeonwooSung による Claude Code プロファイラーで、my-claude-code-mods コレクションの一部です。答えてくれる問いはひとつ、「セッションが遅く感じるとき、時間はどこに消えたのか?」です。各ターンの時間を、モデルの応答待ち、ツールの実行、ブロックするサブエージェント、エンジンのオーバーヘッドに分け、結果を 3 か所に表示します。

  • ステータスライン:Claude の作業中にリアルタイムで更新されます。例:model 100% · tools 0% · ▶ model claude-haiku-5-5 12.5s。
  • /profile:セッション全体のテキストレポート。/profile turn なら直近のターンだけです。時間のカテゴリ、最初のトークンまでの時間、トークン数、遅いツール、繰り返し読まれたファイル、サブエージェント、短い所見のリストが載ります。
  • /profile-pane:進行中のリクエストとツールを見せるライブペイン。/profile-export はセッションを OTLP JSON として書き出します。

この Mod は主張に慎重です。「推論時間」は報告しません。各数値には等級が付きます。measured(ツールの所要時間など Claude Code が渡す値)、observed(Mod がイベントの境界で自分で計った値)、reported(API が報告するトークン使用量)、inferred(残りから計算した値)です。作者の README では Claude Code 2.1.287 以降が必要とされています。

デモ

録画では、小さなデモプロジェクトでこの Mod を読み込んだ Claude Code を起動し、README.md を読んでプロジェクトを一文で説明するよう依頼します。ターンの実行中、フッターの上のステータスラインがリアルタイムで進みます。最初は model 92% · tools 0%、続いて model 100% と、実行中のリクエスト ▶ model claude-haiku-5-5 およびその経過秒数です。ターンが終わると /profile を実行します。レポートには、モデル応答待ち 29.0 秒、ツール 5 ミリ秒、最初のトークンまでの時間、入力 82.3k トークン、1 回の Read 呼び出し、そして「モデルの待ち時間がエージェント時間の 100% を占める」という所見が表示されます。

インストール

インストールブロックのどの方法でも構いません。いずれも作者自身のマーケットプレイスから直接インストールします。このマーケットプレイスには多数のプラグインがあるので agent-profiler を選んでください。ステータスラインとコマンドは次のセッション開始時に現れます。

$ install agent-profiler

Claude Code 2.1.287 以上が必要

作者のマーケットプレイスからインストール: YeonwooSung/my-claude-code-mods

  1. 1.Claude Code 内で1行

    /plugin install agent-profiler --marketplace YeonwooSung/my-claude-code-mods

    実行中のセッション(v2.1.275 以降)に貼り付けます。最初に Claude Code がマーケットプレイスの追加を確認します。

  2. 2.シェルから

    claude plugin marketplace add YeonwooSung/my-claude-code-mods
    claude plugin install agent-profiler@my-claude-code-mods

    その後、すでに開いているセッションでは /reload-plugins を実行してください。

  3. 3.インストールせずに試す

    git clone https://github.com/YeonwooSung/my-claude-code-mods
    claude --plugin-dir ./my-claude-code-mods/agent-profiler

    その1セッションだけ Mod を読み込みます。設定には何も追加されません。

仕組み

モジュール hooks/register.tsx はメモリ上に Profiler オブジェクトを持ち、イベントの境界でデータを渡します。turn.start と turn.complete、turn.step 経由の各モデル呼び出し、tool.call 経由の各ツール、そして classic.PostToolUse から得られる Claude Code 自身のツール所要時間です。tool.call フックは観察するだけです。await next(e) でツールの完了を待ち、結果をそのまま返します。hooks/register.tsx より:

on('tool.call', async ($, e, next) => {
  anonymous += 1
  const id = e.tool_use_id ?? `anonymous-${anonymous}`
  const tool = String(e.tool)
  safe(() => profiler.toolStart(Date.now(), { id, tool, agentId: e.agentId, input: summarizeInput(tool, e as unknown as Record<string, unknown>) }))
  paint($)
  try {
    const answer = await next(e)
    safe(() => profiler.toolEnd(Date.now(), id, toolOutcome(answer)))
    return answer
  } // ...
}).catch(($, e, next) => next(e))

記録のすべてのステップは safe() を通るため、プロファイラー自身のエラーはセッションを壊さず破棄されます。ステータスラインの再描画は 1 秒に最大 2 回です。各ターンの後、Mod は新たに完了したスパンを <outputDir>/<sessionId>/<loadId>-<seq>.otlp.json に書き込み、セッション終了時に残りとセッションのルートスパンを書き込みます。スパン名は GenAI の規約(chat <model>、execute_tool <tool>、invoke_agent <type>)に従います。スパン ID とトレース ID は決定的なので、同じセッションを 2 回送っても同じスパンになります。メモリ上には最大 20,000 件のリクエストとツール呼び出しを保持し、それを超えると完了済みの古いターンから破棄されます。

カスタマイズ

3 つのオプションが /plugin の設定メニューまたは pluginConfigs にあります。

オプション デフォルト 意味
otlpEndpoint 空 OTLP/HTTP コレクターのベース URL。例:http://localhost:4318。空ならファイルのみ。
outputDir ~/.claude/agent-profiler トレースファイルの書き込み先。セッションごとに 1 フォルダ。
exportCommandText false ターンのプロンプト、Bash のコマンドライン、検索パターンをエクスポートに含めます。明らかなシークレットはマスクされます。

Jaeger でトレースを見るには、リポジトリの examples/jaeger/docker-compose.yml を起動し、otlpEndpoint を http://localhost:4318 に設定して http://localhost:16686 を開きます。Grafana Tempo も同じ OTLP/HTTP エンドポイントを使えます。

権限と安全性

実行する前に、プラグインが実行しうるファイルを確認しました。.claude-plugin/plugin.json、hooks/hooks.json、そして hooks/register.tsx と Jaeger の compose ファイルは全文です。hooks/core/ の 11 モジュールのうち、export.ts、otlp.ts、redact.ts と profiler.ts の入力要約部分は全文を読み、すべてのモジュールでネットワーク、プロセス、ファイル、eval、import()、環境変数の呼び出しを検索しました(該当は register.tsx のみです)。テストファイルは一覧を確認しただけで、中身は読んでいません。package.json、インストールスクリプト、バイナリ、バンドルや minify されたコード、eval、動的 import() はありません。hooks/ のソースにゼロ幅文字や隠し文字はなく、ASCII 以外の文字は █、░、·、⏱ などの表示用のステータス・レポート記号だけです。プロンプトやツール結果にテキストを注入することはありません。

主な所見:

  • デフォルトでファイルを書き込みます。 各ターンの後とセッション終了時に $.fs.write を呼び、outputDir を設定しない限り ~/.claude/agent-profiler/<sessionId>/ に書き込みます。これはプラグイン自身のフォルダで、settings.json やシェルのファイルではありませんが、確認なしで書き込まれます。ファイルには所要時間、トークン数、モデル名、ツール名、Read/Edit/Write のファイルパス、各 Bash コマンドのカテゴリ(test や build など)が含まれます。ファイルパスは常にエクスポートされます。プロンプト、Bash コマンド、検索パターンは exportCommandText が有効なときだけエクスポートされます。
  • ネットワークは、あなたが選んだ場合のみ。 $.http.fetch は otlpEndpoint が空でないときだけ呼ばれ、同じトレース JSON を <endpoint>/v1/traces に POST するだけです。ホストは入力したものがそのまま使われます。リモートのコレクターを指定すると、ファイルパスと、exportCommandText が有効ならマスク済みのコマンドがマシンの外に出ます。README は、マスクは可能な範囲での対応だと注意しています。
  • 環境変数は HOME を 1 つ読みます。 outputDir の ~ を展開するためです。
  • ツール呼び出しを横取りしますが、変更はしません。 tool.call と tool.check は観察されてそのまま通され、どちらにも .catch のガードがあります。拒否や書き換えは行いません。claude plugin validate は classic.* フックも .catch なしのゲーティングフックとして挙げますが、実際には next(e) を返す観察用です。validate によると、組織が Claude Code を管理している環境では classic.* フックは動かないため、その環境ではレポートが不完全になる場合があります。
  • プロセス、デーモン、モデル呼び出しはありません。 コマンドは実行せず、バックグラウンドサービスもありません。使うのはセッション内のタイマーだけです。
  • 任意の外部サービス。 Jaeger や Tempo はトレースを閲覧したいときだけ必要です。compose ファイルは jaegertracing/all-in-one:latest を取得しますが、Mod 自身が実行することはありません。
  • ライセンス。 Apache-2.0(リポジトリ直下の LICENSE)。

claude plugin validate はエラーも警告も報告せず、上記のノートだけでした。作者の 11 ファイル・67 件のテストは、Claude Code 2.1.303 上の claude plugin test ですべて通過しました。

ファイルを書き込む
お使いのマシン上でファイルを作成・上書きできます($.fs.write)。
ネットワーク
HTTP リクエストを送信したり、MCP サーバーと通信したりできます($.http.fetch / $.mcp.*)。
ツール呼び出しを傍受
Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
UI を変更
Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
コマンド・ツールを追加
あなたや Claude が呼び出せる新しいスラッシュコマンドやツールを登録します($.command.register / $.tool.register)。

互換性とトラブルシューティング

macOS 上の Claude Code 2.1.303 で、validate、作者のテスト、デモの録画を確認しました。README によると、作者自身のエンドツーエンド検証は 2.1.280 で行われ、イベントの形は 2.1.292 の型宣言に従っています。ペインとステータスラインはターミナルとデスクトップの Code タブで描画されますが、VS Code のチャットパネルと claude -p では描画されません。/profile のテキストはどこでも動きます。

  • ステータスラインやコマンドが出ない。 claude --version が 2.1.287 以降であることを確認し、起動中のセッションにインストールした後は /reload-plugins を実行してください。
  • トレースファイルがない。 セッション ID が分かるまで何も書き込まれません。書き込みに失敗するとトーストが 1 回表示されるので、outputDir に書き込めるか確認してください。
  • ホットリロード後に数値がリセットされる。 メモリ上の状態はやり直しになりますが、書き込み済みのバッチは古いロード ID の下でディスクに残ります。
  • Bash 経由で変更されたファイル。 繰り返し読み取りの検出には見えません。
  • モデルサーバー内部の時間(キュー待ち、プリフィル、デコード)は、どのクライアント側ツールでも分けられません。最初のトークンまでの時間にはまとめて含まれます。

よくある質問

Agent Profiler は私のデータをどこかに送信しますか?
デフォルトでは送信しません。トレースファイルを手元のフォルダに書き込むだけです。otlpEndpoint オプションを設定した場合に限りネットワークリクエストを行い、各トレースのバッチをそのURLの /v1/traces に POST します。作者に送られることはありません。
トレースファイルはどこに書き込まれますか?
outputDir を設定しない限り、~/.claude/agent-profiler/<sessionId>/ です。ターンが終わるたびと、セッション終了時に書き込まれます。ファイルには所要時間、トークン数、ツール名、ファイルパスが含まれます。
プロンプトや Bash コマンドもエクスポートされますか?
exportCommandText を有効にしない限りされません。オフの間は、プロンプト、Bash のコマンドライン、検索パターンはファイルにも POST にも含まれず、test や build といったコマンドのカテゴリだけが残ります。オンにすると、可能な範囲でシークレットをマスクしたうえでエクスポートされます。
モデルが計算していた時間を測れますか?
いいえ。README にもそう書かれています。測るのはクライアントが待った時間で、たとえば最初のトークンまでの時間にはネットワーク、キュー待ち、プリフィルが含まれます。各数値には observed、measured、reported、inferred のいずれかが付きます。
Jaeger など別のサービスは必要ですか?
不要です。/profile とステータスラインは単独で動きます。エクスポートした OTLP トレースを UI で見たいときだけ Jaeger か Grafana Tempo が必要です。リポジトリには小さな Jaeger の docker-compose ファイルが付属しています。
Claude Code で動作中の Agent Radarおすすめ

Agent Radar

実行中のサブエージェントごとに入力欄の上へ 1 行表示:経過時間、ツール数、現在の動作。/radar ペイン付き。

  • プロンプト上部
  • ペイン
  • トースト
  • ツール呼び出しを傍受
  • プロンプトを読み取る
  • UI を変更
  • コマンド・ツールを追加

v2.1.291 で検証済み

Claude Code で動作中の Cache Clockおすすめ

Cache Clock

Claude Code のステータスラインの下に、プロンプトキャッシュの残り時間、ヒット率、コールド後の再キャッシュ量を表示します。

  • ステータス
  • ファイルを読み取る
  • ファイルを書き込む
  • コマンドを実行
  • コマンド・ツールを追加

v2.1.296 で検証済み

Claude Code で動作中の ツール呼び出しカウンターおすすめ

ツール呼び出しカウンター

Claude のツール呼び出しをターンごと・セッションごとに数え、スピナーの横に件数を表示。/tally で内訳も確認できます。

  • スピナー
  • トランスクリプト
  • ステータス
  • ツール呼び出しを傍受
  • UI を変更
  • コマンド・ツールを追加

v2.1.310 で検証済み

同じカテゴリの Mod: タイマー、ToDo、スタンドアップ、ステータスラインとプロンプトバー、ペインとダッシュボード。