This feature is eligible for Zero Data Retention (ZDR). When your organization has a ZDR arrangement, data sent through this feature is not stored after the API response is returned.
O streaming de ferramentas de granularidade fina está geralmente disponível em todos os modelos e em todas as plataformas. Ele permite streaming de valores de parâmetros de uso de ferramentas sem buffering ou validação JSON, reduzindo a latência para começar a receber parâmetros grandes.
Ao usar streaming de ferramentas de granularidade fina, você pode potencialmente receber entradas JSON inválidas ou parciais. Certifique-se de levar em conta esses casos extremos em seu código.
O streaming de ferramentas de granularidade fina está disponível em todos os modelos e em todas as plataformas (Claude API, Amazon Bedrock, Google Vertex AI e Microsoft Foundry). Para usá-lo, defina eager_input_streaming como true em qualquer ferramenta definida pelo usuário onde você deseja que o streaming de granularidade fina seja ativado e ative o streaming em sua solicitação.
Aqui está um exemplo de como usar streaming de ferramentas de granularidade fina com a API:
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=65536,
model="claude-opus-4-7",
tools=[
{
"name": "make_file",
"description": "Write text to a file",
"eager_input_streaming": True,
"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?",
}
],
) as stream:
for event in stream:
pass
final_message = stream.get_final_message()
print(final_message.usage)Neste exemplo, o streaming de ferramentas de granularidade fina permite que Claude transmita as linhas de um poema longo para a chamada de ferramenta make_file sem buffering para validar se o parâmetro lines_of_text é um JSON válido. Isso significa que você pode ver o parâmetro sendo transmitido conforme chega, sem ter que esperar que todo o parâmetro seja armazenado em buffer e validado.
Com streaming de ferramentas de granularidade fina, os chunks de uso de ferramentas começam a ser transmitidos mais rapidamente e geralmente são mais longos e contêm menos quebras de palavra. Isso ocorre devido a diferenças no comportamento de chunking.
Exemplo:
Sem streaming de granularidade fina (atraso de 15s):
Chunk 1: '{"'
Chunk 2: 'query": "Ty'
Chunk 3: 'peScri'
Chunk 4: 'pt 5.0 5.1 '
Chunk 5: '5.2 5'
Chunk 6: '.3'
Chunk 8: ' new f'
Chunk 9: 'eatur'
...Com streaming de granularidade fina (atraso de 3s):
Chunk 1: '{"query": "TypeScript 5.0 5.1 5.2 5.3'
Chunk 2: ' new features comparison'Como o streaming de granularidade fina envia parâmetros sem buffering ou validação JSON, não há garantia de que o stream resultante será concluído em uma string JSON válida.
Particularmente, se a razão de parada max_tokens for atingida, o stream pode terminar no meio de um parâmetro e pode estar incompleto. Geralmente, você tem que escrever suporte específico para lidar com quando max_tokens é atingido.
Quando um bloco de conteúdo tool_use é transmitido, o evento inicial content_block_start contém input: {} (um objeto vazio). Este é um espaço reservado. A entrada real chega como uma série de eventos input_json_delta, cada um carregando um fragmento de string partial_json. Seu código deve concatenar esses fragmentos e analisar o resultado assim que o bloco fechar.
O contrato de acumulação:
content_block_start com type: "tool_use", inicialize uma string vazia: input_json = ""content_block_delta com type: "input_json_delta", acrescente: input_json += event.delta.partial_jsoncontent_block_stop, analise a string acumulada: json.loads(input_json)A incompatibilidade de tipo entre o input: {} inicial (objeto) e partial_json (string) é intencional. O objeto vazio marca o slot no array de conteúdo; as strings delta constroem o valor real.
Os SDKs Python e TypeScript fornecem helpers de stream de nível superior (stream.get_final_message(), stream.finalMessage()) que realizam essa acumulação para você. Use o padrão manual acima apenas quando você precisar reagir à entrada parcial antes do bloco fechar, como renderizar um indicador de progresso ou iniciar uma solicitação downstream antecipadamente.
Ao usar streaming de ferramentas de granularidade fina, você pode receber JSON inválido ou incompleto do modelo. Se você precisar passar esse JSON inválido de volta para o modelo em um bloco de resposta de erro, você pode envolvê-lo em um objeto JSON para garantir o tratamento adequado (com uma chave razoável). Por exemplo:
{
"INVALID_JSON": "<your invalid json string>"
}Essa abordagem ajuda o modelo a entender que o conteúdo é JSON inválido enquanto preserva os dados malformados originais para fins de depuração.
Ao envolver JSON inválido, certifique-se de escapar adequadamente quaisquer aspas ou caracteres especiais na string JSON inválida para manter a estrutura JSON válida no objeto wrapper.
Referência completa para eventos enviados pelo servidor e tipos de eventos de stream.
Execute ferramentas e retorne resultados no formato de mensagem necessário.
Diretório completo de ferramentas de schema Anthropic e suas strings de versão.
Was this page helpful?
import json
import anthropic
client = anthropic.Anthropic()
tool_inputs = {} # index -> accumulated JSON string
with client.messages.stream(
model="claude-opus-4-7",
max_tokens=1024,
tools=[
{
"name": "get_weather",
"description": "Get current weather for a city",
"eager_input_streaming": True,
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}
],
messages=[{"role": "user", "content": "Weather in Paris?"}],
) 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:
parsed = json.loads(tool_inputs[event.index])
print(f"Tool input: {parsed}")