CLAUDE LABEN
SANDBOX — Claude Managed Agentsが自前のサンドボックスとプライベートMCPサーバー接続に対応(自己ホスト型ベータ・MCPトンネルはプレビュー)PLATFORM — Claude Developer Platformにcode execution・web search・web fetchのツール新版。長時間コードのセル90秒上限を明示しますCONTEXT — response_inclusionで消費済みの結果ブロックを切り詰め、エージェント処理のコンテキストを節約できますMCP — エンタープライズ管理型MCPコネクタ(Okta連携)が継続。Claude・Claude Code・Cowork横断でゼロタッチ利用できます(Team/Enterpriseベータ)CODE — Claude Codeに/cd・ポストセッションフック・安全モードが加わり、MCPポリシー強制が厳格化されましたMODEL — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。Fable 5はClaude Codeから利用できますSANDBOX — Claude Managed Agentsが自前のサンドボックスとプライベートMCPサーバー接続に対応(自己ホスト型ベータ・MCPトンネルはプレビュー)PLATFORM — Claude Developer Platformにcode execution・web search・web fetchのツール新版。長時間コードのセル90秒上限を明示しますCONTEXT — response_inclusionで消費済みの結果ブロックを切り詰め、エージェント処理のコンテキストを節約できますMCP — エンタープライズ管理型MCPコネクタ(Okta連携)が継続。Claude・Claude Code・Cowork横断でゼロタッチ利用できます(Team/Enterpriseベータ)CODE — Claude Codeに/cd・ポストセッションフック・安全モードが加わり、MCPポリシー強制が厳格化されましたMODEL — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。Fable 5はClaude Codeから利用できます
記事一覧/API & SDK
API & SDK/2026-06-21上級

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

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

claude-api66web-search4tool-use17context-management3cost-optimization18

プレミアム記事

検索を挟むエージェントを一日中走らせていて、ある朝 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-05-29
Claude API のプロンプトキャッシュを 5m と 1h で二段に分ける — TTL を分けるとコストは下がり運用は安定する
Anthropic API の cache_control には 5 分と 1 時間という 2 種類の TTL があります。これを「静的な前提情報は 1h、可変な few-shot は 5m」と二段に分けて運用する設計を、私の本番ワークロードで観測した数値とともに整理しました。
API & SDK2026-05-26
Claude API の構造化レスポンスを本番で安定させる — tool_use と JSON Schema、多層検証の実装メモ
Claude API の応答を JSON で受け取る実装は数行で書けますが、本番運用では「形は正しいが意味が壊れている」レスポンスにどう備えるかが分かれ目になります。tool_use・JSON Schema・ドメイン検証を組み合わせた多層パイプラインを、壁紙アプリの分類処理での実体験を交えて整理しました。
API & SDK2026-05-25
二段構えのモデル構成 — Haiku 4.5 オーケストレーター × Opus 4.6 ワーカーで保つコストと品質の均衡
Haiku 4.5 にオーケストレーション、Opus 4.6 に専門タスクを任せる二段構えで、個人開発のコストを月単位で抑えながら出力品質を維持するための実装パターンと実コストの記録です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →