細粒度ツールストリーミング
ツール使用は、パラメータ値の細粒度ストリーミングをサポートするようになりました。これにより、開発者はバッファリング/JSON検証なしでツール使用パラメータをストリーミングでき、大きなパラメータの受信開始までのレイテンシを削減できます。
細粒度ツールストリーミングはベータ機能です。本番環境で使用する前に、必ずレスポンスを評価してください。
モデルレスポンスの品質、API自体、またはドキュメントの品質についてのフィードバックを提供するには、このフォームをご利用ください。皆様からのご意見をお待ちしております!
細粒度ツールストリーミングを使用する際、無効または部分的なJSON入力を受信する可能性があります。コードでこれらのエッジケースを考慮するようにしてください。
細粒度ツールストリーミングの使用方法
このベータ機能を使用するには、ツール使用リクエストにベータヘッダーfine-grained-tool-streaming-2025-05-14を追加し、ストリーミングをオンにするだけです。
APIで細粒度ツールストリーミングを使用する方法の例は次のとおりです:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: fine-grained-tool-streaming-2025-05-14" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 65536,
"tools": [
{
"name": "make_file",
"description": "Write text to a file",
"input_schema": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "The filename to write text to"
},
"lines_of_text": {
"type": "array",
"description": "An array of lines of text to write to the file"
}
},
"required": ["filename", "lines_of_text"]
}
}
],
"messages": [
{
"role": "user",
"content": "Can you write a long poem and make a file called poem.txt?"
}
],
"stream": true
}' | jq '.usage'import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.stream(
max_tokens=65536,
model="claude-sonnet-4-5",
tools=[{
"name": "make_file",
"description": "Write text to a file",
"input_schema": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "The filename to write text to"
},
"lines_of_text": {
"type": "array",
"description": "An array of lines of text to write to the file"
}
},
"required": ["filename", "lines_of_text"]
}
}],
messages=[{
"role": "user",
"content": "Can you write a long poem and make a file called poem.txt?"
}],
betas=["fine-grained-tool-streaming-2025-05-14"]
)
print(response.usage)import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic();
const message = await anthropic.beta.messages.stream({
model: "claude-sonnet-4-5",
max_tokens: 65536,
tools: [{
"name": "make_file",
"description": "Write text to a file",
"input_schema": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "The filename to write text to"
},
"lines_of_text": {
"type": "array",
"description": "An array of lines of text to write to the file"
}
},
"required": ["filename", "lines_of_text"]
}
}],
messages: [{
role: "user",
content: "Can you write a long poem and make a file called poem.txt?"
}],
betas: ["fine-grained-tool-streaming-2025-05-14"]
});
console.log(message.usage);この例では、細粒度ツールストリーミングにより、Claudeはlines_of_textパラメータが有効なJSONかどうかを検証するためのバッファリングなしで、長い詩の行をツール呼び出しmake_fileにストリーミングできます。これは、パラメータ全体のバッファリングと検証を待つことなく、到着時にパラメータストリームを確認できることを意味します。
細粒度ツールストリーミングでは、ツール使用チャンクのストリーミング開始が速くなり、多くの場合、より長く、単語の区切りが少なくなります。これは、チャンキング動作の違いによるものです。
例:
細粒度ストリーミングなし(15秒の遅延):
チャンク1: '{"'
チャンク2: 'query": "Ty'
チャンク3: 'peScri'
チャンク4: 'pt 5.0 5.1 '
チャンク5: '5.2 5'
チャンク6: '.3'
チャンク8: ' new f'
チャンク9: 'eatur'
...細粒度ストリーミングあり(3秒の遅延):
チャンク1: '{"query": "TypeScript 5.0 5.1 5.2 5.3'
チャンク2: ' new features comparison'細粒度ストリーミングはバッファリングやJSON検証なしでパラメータを送信するため、結果のストリームが有効なJSON文字列で完了する保証はありません。
特に、停止理由max_tokensに達した場合、ストリームはパラメータの途中で終了し、不完全になる可能性があります。一般的に、max_tokensに達した場合を処理するための特定のサポートを記述する必要があります。
ツールレスポンスでの無効なJSONの処理
細粒度ツールストリーミングを使用する際、モデルから無効または不完全なJSONを受信する可能性があります。この無効なJSONをエラーレスポンスブロックでモデルに戻す必要がある場合、適切な処理を確保するためにJSONオブジェクトでラップできます(適切なキーを使用)。例:
{
"INVALID_JSON": "<your invalid json string>"
}このアプローチは、デバッグ目的で元の不正な形式のデータを保持しながら、コンテンツが無効なJSONであることをモデルが理解するのに役立ちます。
無効なJSONをラップする際は、ラッパーオブジェクトで有効なJSON構造を維持するために、無効なJSON文字列内の引用符や特殊文字を適切にエスケープしてください。