いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「Claude APIのツール入力をストリーミングで受け取り、レスポンスを低遅延にしたい」とお考えではありませんか?
Claudeにツールを渡すと、ツールの引数(JSON)が完成するまでサーバー側でバッファリングされます。
長い文章やコードを引数に取るツールでは、最初の断片が届くまでの待ち時間が長くなりがちです。
Fine-grained tool streamingを有効にすると、ツール引数を生成された端から受け取れるようになります。



体感速度がかなり変わるので、実装方法をまとめます。
ということで、本記事ではClaude APIのFine-grained tool streamingを使う方法を解説します。



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【AI】Claude APIのFine-grained tool streamingを使う方法
早速、Claude APIのFine-grained tool streamingを使う方法を解説します。
Fine-grained tool streamingとは
Fine-grained tool streamingは、ツール入力をサーバー側でバッファリング・JSON検証せずに、生成された端からクライアントへ流す仕組みです。
通常のツール利用では、引数の値ごとにAPIが完成を待ってからまとめて送ってきます。
長いドキュメントやコードブロックを引数に取る場合、Fine-grained tool streamingを使うと最初の断片が届くまでの時間が短くなります。



要するに「引数の入力をリアルタイムで覗ける」機能ですね。
有効にする方法
ユーザー定義ツールの定義にeager_input_streamingをtrueで追加し、リクエストでストリーミングを有効にするだけです。
eager_input_streamingは任意項目で、省略すると従来どおりバッファリングありのストリーミングになります。
以前はベータヘッダーfine-grained-tool-streaming-2025-05-14が必要でしたが、ツールごとのeager_input_streaming項目に置き換えられました。
Claude APIに加え、Amazon Bedrock・Google Cloud・Microsoft Foundryの全モデルで利用できます。
実装(コード付き)
Pythonで簡単に実装してみます。
Python用のanthropicパッケージをインストールします。
pip install anthropicAPIキーは環境変数ANTHROPIC_API_KEYに設定しておきます。
ファイル書き込みツールを定義し、eager_input_streamingをTrueにします。
import anthropic
client = anthropic.Anthropic()
tools = [
{
"name": "make_file",
"description": "テキストをファイルに書き込む",
"eager_input_streaming": True,
"input_schema": {
"type": "object",
"properties": {
"filename": {"type": "string", "description": "書き込み先のファイル名"},
"lines_of_text": {"type": "array", "description": "書き込む行の配列"},
},
"required": ["filename", "lines_of_text"],
},
}
]client.messages.stream()を使い、input_jsonイベントで断片を表示します。
with client.messages.stream(
model="claude-opus-5",
max_tokens=8192,
tools=tools,
messages=[
{"role": "user", "content": "長めの詩を書いてpoem.txtというファイルを作って"}
],
) as stream:
for event in stream:
if event.type == "input_json":
print(event.partial_json, end="", flush=True)
final_message = stream.get_final_message()
print()
for block in final_message.content:
if block.type == "tool_use":
print(f"完成したツール入力: {block.input}")詩を書き進めるそばからpartial_jsonがターミナルに流れていきます。



Python SDKのアキュムレータが断片の結合まで面倒を見てくれます。
生イベントを自分で組み立てる場合
アキュムレータを使わず生イベントを扱う場合、コンテンツブロックのインデックスごとに文字列を貯めます。
手順は「content_block_startで空文字を用意」「input_json_deltaのpartial_jsonを連結」「content_block_stopでパース」の3ステップです。
import json
tool_inputs: dict[int, str] = {}
with client.messages.stream(
model="claude-opus-5",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "東京の天気は?"}],
) as stream:
for event in stream:
if event.type == "content_block_start" and event.content_block.type == "tool_use":
tool_inputs[event.index] = ""
elif event.type == "content_block_delta" and event.delta.type == "input_json_delta":
tool_inputs[event.index] += event.delta.partial_json
elif event.type == "content_block_stop" and event.index in tool_inputs:
raw = tool_inputs[event.index]
try:
print("ツール入力:", json.loads(raw))
except json.JSONDecodeError:
print("不正なJSON:", raw)最初のcontent_block_startのinputは{}という空オブジェクトで、スロットを確保するためのプレースホルダーにすぎません。
不正なJSONへの備え
Fine-grained tool streamingではサーバーがJSONを検証しないため、連結した文字列が不正なJSONになることがあります。
stop_reasonがmax_tokensになった場合、引数が途中で切れることもあります。
パース処理は必ずtry/exceptで囲み、失敗時はエラーとしてClaudeに返します。
ツール結果のcontentには{"INVALID_JSON": "受け取った文字列"}のようなラッパーを文字列化して入れ、is_errorをtrueにします。
tool_result = {
"type": "tool_result",
"tool_use_id": tool_use_id,
"is_error": True,
"content": json.dumps({"INVALID_JSON": raw}),
}


ラッパーは文字列連結ではなくjson.dumpsで作るのが安全です。
使いどころ
引数が短いツールでは、バッファリングの有無で体感差はほとんど出ません。
コード生成・長文の下書き・大きな構造化データなど、引数が大きいツールで効果が出ます。
引数を画面にストリーミング表示したいエージェントUIとも相性が良いです。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【厳選】フリーランスエンジニアにおすすめなエージェント3選


フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。
僕が実際に利用しているおすすめエージェントを紹介しますね。



エージェントは必ず複数登録してください。
担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…
僕は実際に5つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- IT案件に特化したフリーランスエージェント。
- 週2〜3日の案件が豊富。
- リモート案件が多く、直エンドなので単価も高い。
※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。
ITプロパートナーズ
![]()
![]()
週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。



週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。
とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!
よくある質問
ベータヘッダーはまだ必要ですか?
不要です。
ツール定義にeager_input_streamingをtrueで付ければ有効になります。
旧fine-grained-tool-streaming-2025-05-14ヘッダーは、項目を指定していないツールを一括で有効化する互換用として残っているだけです。
Anthropic製ツールでも使えますか?
eager_input_streamingはユーザー定義ツールにのみ設定できます。
旧ベータヘッダーはcomputer useやbrowser useのツールセットと同時に送るとリクエストが拒否されます。
受け取ったJSONが壊れていることはありますか?
あります。
サーバー側で検証しないため、断片を連結した結果が不正なJSONになる場合があります。
パースは必ず例外処理で囲んでください。
まとめ
今回は、Claude APIのFine-grained tool streamingを使う方法について解説しました。
以下が本記事のまとめになります。



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。








