HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Claude Code は3単語のステータスラインにトークンの約15〜20%を消費します

Claude Code burns ~15–20% of your tokens on a 3-word status line (gist.github.com)

187 pointsby NikZaal39 コメント

要約

この記事は、Anthropic の Claude Code が、エージェントのステータスラインを更新するために、バックグラウンドで大量のトークンを消費する問題を指摘しています。この「agent_summary」機能は、デフォルトで有効になっており、APIリクエストの約15〜20%を占め、コスト増加やレート制限の圧迫につながります。著者は、この機能を無効にするためのスクリプトと設定方法を提供し、その仕組みと影響について解説しています。

全文翻訳

Claude Code は3単語のステータスラインにトークンの約15〜20%を消費します。無効にする方法

Claude Code は、エージェントのステータスラインを更新するために、トークンの約15〜20%を消費します。これは Bun のプリロードによって agent_summary が有効になっているためです。Flamerix AI による、flamerix.ai · MITライセンス

Flamerix AI · MITライセンス

Linux、Claude Code 2.1.257–2.1.312 でテスト済み(テスト済みバージョンを参照)。バイナリは変更されていません(BUN_OPTIONS=--preload)。アップデートでサイレントに元に戻される可能性があるため、検証を参照してください。

TL;DR

curl -fsSL https://gist.githubusercontent.com/flamerix-ai/c3905705cc4205e5de3011fa2e74efce/raw/no-agent-summary.js -o ~/.local/share/no-agent-summary.js
claude daemon stop --any
BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload $HOME/.local/share/no-agent-summary.js" claude

すべての Claude Code プロセスで永続化するには、インストールを参照してください。

問題点

約30秒ごとに、すべてのバックグラウンドエージェントに対して、Claude Code はそのエージェントのトランスクリプト全体をエージェント自身のモデル(通常は Opus)に送信し、「直近のアクションを3〜5単語で説明してください」と尋ねます。この回答はエージェントパネルのステータスラインを更新するだけで、モデルや会話には到達しません。これを無効にする設定はなく、2.1.232(2026年8月)以降はデフォルトで有効になっています。

この異常は DRIM によって Claude Code の OpenTelemetry エクスポートで検出されました。claude_code.api_request イベントを query_source でグループ化すると、agent_summary がメインの会話自体よりも多くのコストを占めていることが示されました。

query_source = agent_summaryフック前の週フック後2日間
全 Claude Code 支出に占める割合16.4 % (メイン会話: 15.7 %)0 %
全 API リクエストに占める割合19.7 %、約5件に1件0 %
Opus へのその支出の割合96 %—
出力トークンあたりの入力トークン≈ 9,000 : 1—

ここでの支出は、Claude Code のリクエストごとの見積もり(cost_usd)であり、請求書ではありません。サブスクリプションでは、失うのはレート制限のヘッドルームです。これを測定したのは私たちだけではありません。 #86879 には、4つの独立した測定結果(18〜26%)が集められています。

修正方法(仕組み)

no-agent-summary.js は Bun のプリロード(約80行のコード)です。setTimeout/setInterval をラップし、コールバックのソーステキストにサマライザーアンカー(例: [AgentSummary] Timer fired ログ行)が含まれている場合、タイマーを起動する代わりに不活性なハンドルを返します。他のすべてのタイマーはそのまま通過します。OpenTelemetry エクスポートでは、抑制されたリクエストは query_source = agent_summary を持つ claude_code.api_request イベントです。

なぜタイマーフックなのか、より簡単なものではないのか:モジュールはプリコンパイルされた Bun バイトコードとして出荷されるため、バイナリ内の JS テキストを編集しても何も変わりません。API クライアントはラップされた globalThis.fetch を通過しません。しかし、Function.prototype.toString は、バイトコードから実行される場合でもコールバックのソースを返すため、タイマーは内部の文字列によって認識できます。不活性タイマーは正確に 2³¹−1 ms を使用します。Node と Bun はより大きな遅延を 1 ms として扱います。そのため、「無限」の遅延はすぐに発生します。

インストール

  1. no-agent-summary.js を安定した場所に配置します。その絶対パスをメモしておきます。

  2. BUN_OPTIONS をグローバルに設定して、すべての Claude Code プロセスがそれを受け取るようにします。いずれかを選択してください:

# ~/.profile, ~/.bashrc, ~/.zshrc
export BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload /abs/path/no-agent-summary.js"
# ~/.config/fish/config.fish
set -gx BUN_OPTIONS "--preload /abs/path/no-agent-summary.js"
# ~/.config/environment.d/50-no-agent-summary.conf (systemd user env; user services and timersにも到達します。
# user manager が次に開始するとき(通常は次のログイン時)に適用されます)
BUN_OPTIONS=--preload /abs/path/no-agent-summary.js

または、PATH のより早い位置にあるラッパー claude(case は Claude Code プロセスが別のプロセスを開始するときに冪等性を保ちます):

#!/bin/sh
HOOK=/abs/path/no-agent-summary.js
case " ${BUN_OPTIONS-} " in
  *" --preload $HOOK "*) ;; # すでにフックされている場合は何もしない
  *) export BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload $HOOK" ;; # フックを追加
esac
: "${CC_AGENT_SUMMARY_LOG:=${XDG_RUNTIME_DIR:-/tmp}/no-agent-summary.log}" # ログファイルのデフォルトを設定
export CC_AGENT_SUMMARY_LOG
exec /path/to/the/real/claude "$@"
  1. インストール後、デーモンと既に実行中のすべてのセッションを再起動し、BUN_OPTIONS が設定されている環境から Claude Code を起動します。
claude daemon stop --any
環境変数
変数値効果
CC_AGENT_SUMMARY_MODEoff (デフォルト), passoff はサマリータイマーを抑制します。pass は A/B テスト用です。フックをロードし、すべてのタイマーを起動します。他の値は stderr に警告を表示し、off として動作します。
CC_AGENT_SUMMARY_LOGファイルパス、オプションロード時に preload active mode=… bun=… hooked=… を追記します。一致したタイマーごとに1行(最初の20件)、および終了カウントを記録します。
CC_AGENT_SUMMARY_MARKERファイルパス、オプションロード時に preload active … 行で上書きされます。

注意点

  • インストール後はデーモンを再起動してください。 デーモン、pty ホスト、およびプリウォームされた bg-spare セッションは、デーモンを起動したクライアントの環境を継承します。そのため、BUN_OPTIONS が設定される前に起動されたデーモンは、フックされていないセッションを生成し続けます。したがって claude daemon stop --any が必要です。
  • ヘッドレス実行にも必要です: claude -p、cron、CI、エディタ連携など。
  • プラットフォーム: Linux でテスト済み、macOS および Windows では未テスト。Windows では /$bunfs/ ゲートはおそらくフックをインストールしません。
  • A/B テスト: CC_AGENT_SUMMARY_MODE=pass はフックをロードしますが、すべてのタイマーを起動します。サマリーが復活するため、off の結果がフックによるものであることがわかります。
  • バックグラウンドプロセス: デーモン、pty ホスト、bg-spare は、環境に --preload を含める必要があります(Linux では /proc/<pid>/environ)。そうでない場合は、デーモンを再起動してください。

検証(アップデートごと)

  1. プリロードのロード:
BUN_OPTIONS="--preload $HOME/.local/share/no-agent-summary.js" CC_AGENT_SUMMARY_LOG=/tmp/nas.log claude --version && cat /tmp/nas.log

preload active mode=… という出力が期待されます。行がない場合:BUN_OPTIONS がプロセスに到達していないか、パスが絶対パスではありません。

  1. タイマーの抑制: 同じ BUN_OPTIONS と CC_AGENT_SUMMARY_LOG=/tmp/nas.log で、バックグラウンドサブエージェントを1〜2分間実行します。ログに summary timer #1 suppressed (setTimeout, delay=30000) と表示され、エージェントパネルのステータスが更新されなくなります。OpenTelemetry をエクスポートする場合、query_source = agent_summary はゼロのままになるはずです。これは、すべての障害モードを検出できる唯一のチェックです。
Fail-open(失敗時にオープンする)

マッチングはソーステキストで行われます。アンカーはコールバック内に存在する必要があります。アップデートでそれが壊れた場合、フックは何もマッチせず、サマリーはサイレントに戻ります。発生する可能性のあるシナリオ:

  • ログ行またはクエリソースIDの名前が変更された。
  • コールバックが fn.bind(...)(toString にソースがない)または別のラッパー経由で渡された。
  • 文字列がコールバック外の共有定数に移動された。
  • タイマーがアンラップされた API(timers/promises、スケジューラーループ)に移動された。

そのため、アップデートごとに検証を実行してください。

効果

  • 私たちのマシン(2.1.301)では、すべての Claude Code プロセスでこれを実行しています。それ以来、agent_summary リクエストはゼロで、他のサイドクエリが増加してそれを置き換えることもありませんでした。
  • サブエージェント、バックグラウンドエージェント、フォークされたスキル、バックグラウンドセッションは正常に実行されます。サマリーフォークのみがスキップされます。
  • 可視的な変更:エージェントパネルのステータス表示が更新されなくなります。SDK の task_progress に summary がなくなります。
  • オーバーヘッド:各ユニークなタイマーコールバックに対して1回の Function.prototype.toString 呼び出し(WeakMap にキャッシュ)。claude --version:約10 ms → 約17 ms(1回の測定)。

テスト済みバージョン

npm の @anthropic-ai/claude-code-linux-x64 からの Linux x64 バイナリ(SHA256 はネイティブインストーラーの manifest.json チェックサムと一致します)。静的: 抽出されたバンドルのサマリータイマーコールバックにはフックアンカーが含まれています。ライブ: claude -p --model haiku と CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES=1 を使用し、1つのサブエージェントが約20秒の8ステップを実行し、--debug-file で [AgentSummary] Forking をカウントします。

バージョン公開日sha256静的約2.5分間のエージェント実行におけるサマリーフォーク:フックなし / フック pass / フック offメモ
2.1.3122026-10-274f4178ce41d8OK5 / 5 / 02026-10-28 時点の latest。インタラクティブ:6(フックなし)/ 0 (off)
2.1.3102026-10-23b73676430af1OK5 / 5 / 0
2.1.3082026-10-22356733f185faOK5 / 6 / 02026-10-28 時点の stable。pass 実行のエージェントは8ステップではなく9ステップかかりました
2.1.3012026-10-15bc1aad9982c7OK5 / 5 / 0前のフックビルドでも同様。インタラクティブ off も 0。2026-10-26 から日常使用、テレメトリで agent_summary リクエストはゼロ
2.1.2802026-09-221e08503dbdf3OK1 / 1 / 0 (タイマーは 11 / 11 / 0 回発生)インタラクティブ:-p ではこのバージョンでサマリーを有効にできません。エージェントは権限プロンプトで停止したため、後続のタイマーは変更されていないトランスクリプトをスキップしました
2.1.2572026-09-019a64bda9d872OK1 / 1 / 0 (タイマーは 11 / 11 / 0 回発生)2.1.280 と同じ

5 / 5 / 0 = そのバージョンではフォークが発生しますが、フックをロードするだけでは何も変わりません。off でそれが削除されます。

これに設定がない理由

  • ドキュメント化されたスイッチは有効にするだけです。 SDK オプション agentProgressSummaries はデフォルトで false ですが、バンドル内では OR の1つの項であり、それを書き込むすべてのコードパスが true を設定します。したがって、false は何も変更せず、ドキュメント化されていない CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES はサマリーを有効にするだけです。
  • 間隔はサーバーに属します。 これはモデルファミリーごとのサーバーフラグから取得され、30〜240秒に制限されます。デフォルトは既に最小値であり、どの値もタイマーを無効にしません。
  • 明白な環境変数は見つかりません。 DISABLE_NON_ESSENTIAL_MODEL_CALLS は、一部のパッケージャーが設定しますが、バイナリには全く存在しません。CLAUDE_CODE_FORK_SUBAGENT=0 および CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 はそれを停止しますが、フォークサブエージェントやバックグラウンドエージェントを一緒に停止するだけです。
  • プロンプトキャッシュはコストを削減しますが、ゼロにはしません。 これらの呼び出しの約 98% はキャッシュからトランスクリプトを再読み込みします。コールドキャッシュにヒットする約 2% は、そのコストの3分の1を占めます。
  • トランスクリプトを読み取るコストツールはこれを見ません。 これらのリクエストはディスク上のセッションログに書き込まれません(#104358)。OpenTelemetry エクスポートのみがそれらを表示します。バックグラウンドトークン使用量に関するドキュメントにもリストされていません。一方、Agent View の行サマリーは、Haiku クラスのモデルが数分ごとに更新されるとドキュメント化されています。
  • より安価なバリアントが既に存在しますが、無効になっています。 2.1.310 には short モードが搭載されています。フルトランスクリプトの代わりに約2kトークンのノートで、オプションでより小さなモデルによって書き込まれます。デフォルトは依然としてフルトランスクリプトであり、サーバーフラグのみがそれを変更できます。
タイムライン(2026年)
バージョン(公開日)変更内容
2.1.32 (2月5日)コードが最初に登場。パブリックビルドでは無効
2.1.72 (3月9日)SDK オプトインとしてアクセス可能に
2.1.117 (4月21日)フォークゲートまたはサーバーロールアウトの背後にあるインタラクティブ CLI でアクセス可能に
≤ 2.1.220 (7月24日)フォークされたスキルは常に要約される
2.1.232 (8月13日)インタラクティブなバックグラウンドエージェントでデフォルトで有効に
2.1.300 (10月14日)間隔がサーバーで調整可能に(30〜240秒)
2.1.310 (10月23日)より安価な short モードが登場、無効なまま

私たちのテレメトリでは、その週あたりの支出の割合は7月(フォークゲートは既に私たちに開かれていました)の 3.5〜7% から、2.1.233 を取得した週には 7.3%、次に 11.8% に増加し、10月中旬には約16%になりました。

ライセンスと免責事項

MIT © 2026 Flamerix AI。現状有姿で提供され、いかなる保証もありません。使用は自己責任で行ってください。Flamerix AI は、その使用に起因するいかなる損害、データ損失、またはアカウントアクションについても責任を負いません。クライアントの実行時動作を変更することは、使用するサービスの利用規約に違反する可能性があります。その確認はご自身で行ってください。

「Claude」および「Claude Code」は Anthropic, PBC の商標です。このプロジェクトは独立しており、Anthropic と提携、スポンサー、または承認されているものではありません。