【AI】Claude APIのFine-grained tool streamingを使う方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

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向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【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_streamingtrueで追加し、リクエストでストリーミングを有効にするだけです。

eager_input_streamingは任意項目で、省略すると従来どおりバッファリングありのストリーミングになります。

以前はベータヘッダーfine-grained-tool-streaming-2025-05-14が必要でしたが、ツールごとのeager_input_streaming項目に置き換えられました。

Claude APIに加え、Amazon Bedrock・Google Cloud・Microsoft Foundryの全モデルで利用できます。

実装(コード付き)

Pythonで簡単に実装してみます。

STEP
SDKを準備する

Python用のanthropicパッケージをインストールします。

pip install anthropic

APIキーは環境変数ANTHROPIC_API_KEYに設定しておきます。

STEP
ツールにeager_input_streamingを付ける

ファイル書き込みツールを定義し、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"],
        },
    }
]
STEP
ストリームで断片を受け取る

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つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • 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を使う方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Fine-grained tool streamingはツール引数をバッファリングせず生成順に流す機能。
  • ユーザー定義ツールにeager_input_streaming: trueを付け、ストリーミングを有効にするだけで使える。
  • 連結したJSONは不正な場合があるため、パースは例外処理で囲み、失敗時はis_error付きでClaudeに返す。
  • 引数が大きいツールやエージェントUIで待ち時間の短縮に効く。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次