CLAUDE LABEN
OPUS — Claude Opus 4.7が一般提供になりました。ソフトウェアエンジニアリングと長時間コーディングが改善し、画像を高解像度で扱えるようになりましたAPIKEY — ConsoleでAPIキーに有効期限を設定できるようになりました。7日以上のキーは失効前にメールで通知されますREFLECT — Settings > Reflectの月次ふりかえりで、よく触れた話題や最も活発だった時間を確認できます(beta)M365 — Microsoft 365コネクタが書き込みに対応し、メール作成・カレンダー・OneDrive/SharePointのファイル操作を任せられますCOWORK — CoworkがWebとモバイルへ広がり、ChatとCoworkが一つのホームにまとまりましたDESIGN — Anthropic LabsのClaude Designで、設計・プロトタイプ・スライド・1枚資料をClaudeと共同制作できますOPUS — Claude Opus 4.7が一般提供になりました。ソフトウェアエンジニアリングと長時間コーディングが改善し、画像を高解像度で扱えるようになりましたAPIKEY — ConsoleでAPIキーに有効期限を設定できるようになりました。7日以上のキーは失効前にメールで通知されますREFLECT — Settings > Reflectの月次ふりかえりで、よく触れた話題や最も活発だった時間を確認できます(beta)M365 — Microsoft 365コネクタが書き込みに対応し、メール作成・カレンダー・OneDrive/SharePointのファイル操作を任せられますCOWORK — CoworkがWebとモバイルへ広がり、ChatとCoworkが一つのホームにまとまりましたDESIGN — Anthropic LabsのClaude Designで、設計・プロトタイプ・スライド・1枚資料をClaudeと共同制作できます
記事一覧/API & SDK
API & SDK/2026-06-21上級

検索結果を二度運ばない — response_inclusion で消費済みブロックを応答から外す設計

dynamic filtering を有効にしたエージェントで出力トークンが膨らむ原因は、code execution が消費し終えた検索結果ブロックが応答に二重で乗ることにあります。response_inclusion を excluded にして安全に外せる条件と、full を保つべき条件を実装と判断表で整理しました。

claude-api79web-search4tool-use21context-management5cost-optimization23

プレミアム記事

検索を挟むエージェントを一日中走らせていて、ある朝 usage のログを並べ直したときに手が止まりました。web_search_requests の回数はほとんど変わっていないのに、output_tokens だけが前週の倍近くに伸びていたのです。

原因はすぐには腑に落ちませんでした。dynamic filtering を有効にしていたので、検索結果はモデルが書いたコードで絞り込まれ、context window には必要な分しか載らないはずだと思い込んでいたからです。けれど実際に応答の content を一つずつ数えてみると、絞り込みに使われたあとの生の web_search_tool_result ブロックが、そのまま応答の出力として乗り続けていました。フィルタ済みの情報をモデルが持っているのに、フィルタ前の原文がもう一度、出力トークンとして運ばれていたわけです。

2026 年 3 月の web_search_20260318(および web_fetch_20260318)で入った response_inclusion は、ちょうどこの「二度運び」を断つためのパラメータです。地味な追加ですが、検索を含むエージェントを継続運用している身には出力コストに直結します。ここでは、私が 4 サイトの自動運用で実際に踏んだこの落とし穴を起点に、excluded を安全に使える境界線を実装と判断表で整理していきます。

検索結果は「入力」と「出力」の両方でトークンを食う

まず、検索結果がどこでトークンを消費するのかを正確に押さえておきます。ここが曖昧だと、削減策を一つ打っても効いた感触が得られません。

Web 検索の課金は、検索 1,000 回あたり 10 ドルの従量に加え、検索で取得した本文がトークンとして乗ります。公式ドキュメントは「検索結果は、同一ターン内の検索反復でも、後続の会話ターンでも入力トークンとして数えられる」と明記しています。つまり取得した本文は、

  • 取得したターンで、モデルが読むための入力として一度、
  • そのターンの応答 contentweb_search_tool_result ブロックとして乗る出力として一度、

カウントされ得ます。dynamic filtering は前者の入力側を賢く絞る仕組みです。モデルが code execution の中でコードを書き、検索結果を context window に載せる前に選別する。だから入力側は確かに軽くなります。

ところが後者の出力側、すなわち応答に echo される生の結果ブロックは、dynamic filtering だけでは消えません。フィルタに使い終わった原文が、クライアントに送り返す応答の中に残り続けるのです。私の自動運用のように「最終的な要約だけ受け取れればよく、検索原文をユーザーに見せない」ワークフローでは、この出力分は丸ごと無駄でした。

response_inclusion が外せるのは「完了した code execution が消費した結果」だけ

response_inclusion の既定値は "full" です。"excluded" を指定すると、同一ターン内で完了した code execution の呼び出しが消費した検索結果について、入れ子になった server_tool_use と結果ブロックの対を応答から丸ごと落とします。

ここで効いてくる条件が二つあります。読み飛ばすと事故になる部分なので、はっきり書いておきます。

第一に、外れるのは「完了した code execution が消費した結果」に限られます。dynamic filtering はコード実行を伴うので、検索結果はコードに消費されます。そのコード実行がそのターン内で完走したなら、モデルは既にフィルタ後の情報を手にしている。だから生ブロックは応答に echo されるだけの存在になり、安全に落とせる、という理屈です。

第二に、direct call の結果(dynamic filtering を介さない素の検索)と、pause_turn で中断した code execution の結果は、excluded を指定しても常に full で返ります。これらは次のターンに送り返して引用や継続に使う必要があるためで、API 側が落とさないよう守ってくれています。response_inclusion は「もう次ターンに要らないと確定したブロックだけを外す」設計になっている、と理解すると腑に落ちます。

なお、引用(citations)の cited_texttitleurl は、そもそも入力にも出力にもトークンとして数えられません。excluded で落ちるのは原文側の重い web_search_tool_result ブロックであって、引用そのものはテキストブロック側に残ります。ここを混同して「excluded にすると引用が消える」と早合点しないことが大切です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
dynamic filtering 下で生の検索結果ブロックが出力トークンとして二重計上される仕組みを、usage の実測の読み方とあわせて把握できます
response_inclusion を 「excluded」 にして安全に外せる条件(同一ターンで完了した code execution が消費した結果のみ)と、引用・継続ターンで 「full」 を保つべき条件を判断表で持ち帰れます
context editing の clear_tool_uses・クライアント側圧縮との三者を、出力削減か入力削減かの軸で切り分ける設計指針を得られます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-06-29
Claude API の Context Editing を入れたらエージェントが同じ調査を繰り返したとき — クリア境界とキャッシュ無効化を計測する運用メモ
Context Editing でツール結果を自動クリアしたら、エージェントが直前に読んだ内容を忘れて同じツールを呼び直し、キャッシュも毎回壊れてコストが上がった。沈黙する劣化を計測ログで切り分け、trigger・keep・clear_at_least を実測で決める運用メモです。
API & SDK2026-06-24
ツール定義を一行直しただけで、キャッシュが丸ごと作り直しになりました — cache_control ブレークポイントの置き場所
ヒット率が突然ゼロに張り付いた原因は、揮発するブロックを安定したブロックより上流に置いていたことでした。prefix キャッシュのカスケード失効の仕組みと、安定→揮発でブロックを並べ替え、4つしかない cache_control ブレークポイントをどこに置くかを実装と判断表で整理します。
API & SDK2026-07-09
出力は同じ、道筋は違う — エージェントの軌跡を不変条件で守る
既定モデルが入れ替わっても最終出力は正しいまま、ツール呼び出しの道筋だけが静かに変わることがあります。実行トレースを記録し、不変条件で機械的にアサートする軌跡回帰ハーネスを実装コードと実測値で整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →