Claudeの思考が削られているという話を手元で数えたら、7月には数える欄が無かった

土曜の朝に、Reddit と Hacker News と GitHub から「個人が作れそうな OSS の種」を掘ってきて、ノートに追記するタスクを回している。前の記事の次に何を作るかを、自分で探す代わりに機械に探させる仕組みだ。種は1件ごとに、困りごと、根拠、既にあるもの、最小版、リスク、の欄が埋まったカードで出てくる。最初の土曜に出てきたのは1件で、Claude Code の思考トークンの使われ方を見る道具だった。

根拠の欄に貼られていたのは r/ClaudeAI の投稿で、43,000 件超の Claude Code 呼び出しを65日間集めた分析として、Fable 5 の呼び出しの 39% が思考トークンゼロ、中央値は 123 トークン、8月の思考予算は7月比で 18〜50% 減った、と書いてある。題は「It’s time to cancel your subscriptions」で始まる。本当かどうかは分からない。ただ、俺は毎日 Claude Code を使っていて、その呼び出しの記録は全部手元にある。数えれば自分の分は分かる。

フックには無くて、ディスクには既にあった

種の最小版の欄には、PostToolUse フックで思考トークン数を受け取ってファイルに追記し、それを週次で集計する、と書いてあった。リスクの欄には「Claude Code のフックコールバックペイロードに thinking token 数が含まれるかどうか未確認」とある。まずそこを確かめた。

含まれていなかった。stdin を丸ごとファイルに落とすフックを一時的に仕込んでみると、来るのはセッション ID、ツール名、ツールの入出力、transcript_path といった項目で、トークン数はどこにも無い。公式のリファレンスとも一致する。OpenTelemetry で出るメトリクスにも入力・出力・キャッシュ読み込み・キャッシュ書き込みの4種しか無く、思考の内訳は無い。

代わりに、transcript_path が指す JSONL の中にあった。Claude Code は会話の記録を ~/.claude/projects/ の下に1行1イベントで書いていて、assistant の応答の行には usage が付いている。その中の output_tokens_details.thinking_tokens が思考トークン数だ。思考の本文は空で署名だけが残っているので中身は読めないが、数は残っている。

つまりフックは要らない。書き足すものも無く、既に書かれているものを後から読めばいい。種の提案より小さくなった。

数える道具

claude-thinking-stats という Go の CLI にした。前の2本と同じで標準ライブラリだけ、依存なし、何も書き換えない。brew install nobu666/tap/claude-thinking-stats で入る。引数なしで実行すると、直近7日を日ごとにこう出す。Claude Code を使わなかった日の行は出ないので、この週は6行だ。9月21日の 418 件は、この道具を作っていた日のものだ。

$ claude-thinking-stats
day         requests   output  thinking  think%  zero%  p50    p95  missing  models
2026-09-15         4    4,212       484    11.5   75.0    0    411        0  claude-opus-5
2026-09-18        75   62,020    21,009    33.9   34.7  101  1,185        0  claude-fable-5-1,claude-opus-4-8,claude-opus-5,claude-sonnet-4-6
2026-09-19       128  142,638    64,250    45.0   21.9  146  1,517        0  claude-fable-5-1,claude-sonnet-4-6
2026-09-20        60   82,744    51,813    62.6   25.0  127  3,298        0  claude-fable-5-1,claude-opus-5,claude-sonnet-4-6
2026-09-21       418  445,982   135,882    30.5   30.6  104  1,211        0  claude-fable-5-1,claude-sonnet-4-6
2026-09-22        43   45,427    15,056    33.1   32.6  141  1,271        0  claude-fable-5-1

requests は応答の数。同じ応答が content ブロックごとに複数行に分かれて書かれていて usage は同じ値なので、message.id で束ねている。output と thinking は合計トークンで、think% は出力トークンに占める思考トークンの割合。zero% は思考トークンがゼロだった応答の割合、p50 と p95 は応答あたりの思考トークンの中央値と 95 パーセンタイル。models はその行に含まれるモデルの一覧だ。-by でセッション別、モデル別、プロジェクト別、effort(思考の強さの設定)別に切り替えられ、-top 10 で思考の多かった応答を10件出す。

missing は、usagethinking_tokens の欄そのものが無かった応答の数だ。自分で仕様を書いた時点では「古い版や思考しないモデルでは欄が無いだろうから、欠落は0扱いにして件数だけ見せる」という保険のつもりだった。この列が主役になる。

7月には欄が無かった

全期間をモデル別で回した。

$ claude-thinking-stats -by model -since all
model              requests     output  thinking  think%  zero%  p50    p95  missing
claude-fable-5          513    515,442         0     0.0  100.0    0      0  513
claude-fable-5-1        943  1,020,927   284,017    27.8   32.0  140  1,200  0
claude-opus-4-8          49    272,302       191     0.1   98.0    0      0  45
claude-opus-5           227    222,721    37,356    16.8   76.7    0  1,162  144
claude-sonnet-4-6     1,688  1,904,717   592,570    31.1   56.8    0  1,061  827
claude-sonnet-5         510    262,013         0     0.0  100.0    0      0  510
note: 2039 responses had no thinking_tokens field (counted as 0; see the missing column)

Fable 5 は 513 件全部が missing。思考ゼロなのではなく、数える欄が無い。Sonnet 5 の 510 件も全部無く、Sonnet 4.6 は 1,688 件のうち 827 件、Opus 5 は 227 件のうち 144 件が無い。表の6モデル、全部で 3,929 件のうち 2,039 件、半分強に欄が無かった。

月ごとの応答数を、思考トークンの欄がある応答と無い応答に分けた棒。7月は 1,434 件すべてに欄が無い。8月は 1,177 件のうち 572 件にあり 605 件に無い。9月は 1,318 件すべてにある。欄が現れた日は 8月16日

月で切ると、7月の 1,434 件は全部欄なし、8月は 1,177 件のうち 605 件が欄なし、9月の 1,318 件は全部欄あり。欄が最初に現れた日は8月16日で、最後に欄なしの応答があった日は8月23日だった。transcript には書いた時点の Claude Code の版も記録されていて、版で切ると境目は 2.1.229 で、それより前の版で書かれた行に thinking_tokens は1つも無い。

モデル別の表で欄なしが多いのはモデルの新旧ではなく、いつ使ったかで決まっている。Fable 5 と Sonnet 5 を使っていたのは7月で、Opus 5 の欄なし 144 件は8月14日まで、欄あり 83 件は8月16日からだ。Opus 4.8 も欄ありは9月の4件だけ。Fable 5.1 が transcript に現れるのは9月に入ってからで、942 件は全部9月だ。

投稿は、8月は7月比で減ったと言っている。俺の transcript では、7月の応答はモデルが何であれ思考トークンを数えられない。8月も後半に入るまで数えられない。投稿の人がどうやって7月の数を出したのかは書かれていないので分からないが、少なくとも Claude Code が自分で残している記録から、7月と8月の思考量を比べることは、俺の手元ではできなかった。

欄がある範囲では、投稿の数字から大きくは外れていなかった

投稿が数えたのは Fable 5 で、手元でその欄があるのは後継の Fable 5.1 だけだ。世代が違うので厳密には並べられない。その上で見ると、Fable 5.1 の 942 件は、思考ゼロが 32.1%、中央値が 140 トークン。投稿の 39% と 123 から、大きくは外れていない。

ここからは道具の出力ではなく、同じ Fable 5.1 の応答を手元で分けて数えた。思考ゼロの応答は出力トークンの中央値が 377 で、思考ありの応答の 906 より短い。ツールを呼んで結果を受けて次のツールを呼ぶ、という連鎖の途中の短い応答が思考なしで返っていると読める。

これを「削られている」と呼ぶかどうかは、この数字からは言えない。比べる相手が無いからだ。7月の Fable 5 が同じ種類の応答でどれだけ思考していたかは、欄が無いので分からない。分かるのは、いつから数えられるようになったかと、数えられるようになってからの分布だけだ。解約するかどうかを決める材料は、少なくとも俺の記録からは出てこなかった。

だから道具は、そこまでしか主張しない。思考が減った気がしたら -by day で週をまたいで zero% を見る。effort やモデルを選ぶときに -by effort-by model で、払っている設定が思考量を変えているかを見る。使用量の上限に当たったら -top 10 で、何がそれだけ思考したかを見る。俺の場合、-top 10 の上位はブログ記事のレビューと書き直しの応答で、1件で1万7千トークン思考していた。

比べる前に、数えられる範囲を見る

投稿を読んだときは、数えれば白黒つくと思っていた。数えて出てきたのは白黒ではなく、俺の記録のどこからが数えられるか、だった。種のリスク欄の「含まれるかどうか未確認」は当たっていて、その代わりに記録は既にディスクにあり、その記録は8月16日より前には思考の欄を持っていなかった。

外の誰かの数字を自分の記録で検算するときは、数字を突き合わせる前に、欄なしの列を見る。保険で足したつもりの列に、最初に回した日で一番大きな数字が入っていた。

comments powered by Disqus