Loading...
  • Construir
  • Admin
  • Modelos e preços
  • SDKs do cliente
  • Referência da API
Search...
⌘K
Log in
Streaming granular de ferramentas
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Solutions

  • AI agents
  • Code modernization
  • Coding
  • Customer support
  • Education
  • Financial services
  • Government
  • Life sciences

Partners

  • Amazon Bedrock
  • Google Cloud's Vertex AI

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Company

  • Anthropic
  • Careers
  • Economic Futures
  • Research
  • News
  • Responsible Scaling Policy
  • Security and compliance
  • Transparency

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Help and security

  • Availability
  • Status
  • Support
  • Discord

Terms and policies

  • Privacy policy
  • Responsible disclosure policy
  • Terms of service: Commercial
  • Terms of service: Consumer
  • Usage policy
Construir/Infraestrutura de ferramentas

Streaming de ferramentas de granularidade fina

Transmita entradas de ferramentas caractere por caractere para aplicações sensíveis à latência.

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.

Como usar streaming de ferramentas de granularidade fina

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.

Acumulando deltas de entrada de ferramentas

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:

  1. Em content_block_start com type: "tool_use", inicialize uma string vazia: input_json = ""
  2. Para cada content_block_delta com type: "input_json_delta", acrescente: input_json += event.delta.partial_json
  3. Em content_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.

Tratando JSON inválido em respostas de ferramentas

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.

Próximas etapas

Mensagens de streaming

Referência completa para eventos enviados pelo servidor e tipos de eventos de stream.

Lidar com chamadas de ferramentas

Execute ferramentas e retorne resultados no formato de mensagem necessário.

Referência de ferramentas

Diretório completo de ferramentas de schema Anthropic e suas strings de versão.

Was this page helpful?

  • Como usar streaming de ferramentas de granularidade fina
  • Acumulando deltas de entrada de ferramentas
  • Tratando JSON inválido em respostas de ferramentas
  • Próximas etapas
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}")