Ao criar uma Mensagem, você pode definir "stream": true para transmitir incrementalmente a resposta usando eventos enviados pelo servidor (SSE).

Transmissão com SDKs

Nossos SDKs de Python e TypeScript oferecem múltiplas formas de transmissão. O SDK Python permite transmissões síncronas e assíncronas. Veja a documentação em cada SDK para detalhes.

Tipos de eventos

Cada evento enviado pelo servidor inclui um tipo de evento nomeado e dados JSON associados. Cada evento usará um nome de evento SSE (por exemplo, event: message_stop), e incluirá o type de evento correspondente em seus dados.

Cada transmissão usa o seguinte fluxo de eventos:

  1. message_start: contém um objeto Message com content vazio.
  2. Uma série de blocos de conteúdo, cada um com um content_block_start, um ou mais eventos content_block_delta, e um evento content_block_stop. Cada bloco de conteúdo terá um index que corresponde ao seu índice no array final de content da Mensagem.
  3. Um ou mais eventos message_delta, indicando mudanças de nível superior no objeto Message final.
  4. Um evento final message_stop.

Eventos de ping

As transmissões de eventos também podem incluir qualquer número de eventos ping.

Eventos de erro

Ocasionalmente, podemos enviar erros na transmissão de eventos. Por exemplo, durante períodos de alto uso, você pode receber um overloaded_error, que normalmente corresponderia a um HTTP 529 em um contexto sem transmissão:

Exemplo de erro
event: error
data: {"type": "error", "error": {"type": "overloaded_error", "message": "Overloaded"}}

Outros eventos

De acordo com nossa política de versionamento, podemos adicionar novos tipos de eventos, e seu código deve lidar com tipos de eventos desconhecidos de forma adequada.

Tipos de delta

Cada evento content_block_delta contém um delta de um tipo que atualiza o bloco de content em um determinado index.

Delta de texto

Um delta de bloco de conteúdo text se parece com:

Delta de texto
event: content_block_delta
data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", "text": "ello frien"}}

Delta de JSON de entrada

Os deltas para blocos de conteúdo tool_use correspondem a atualizações para o campo input do bloco. Para suportar máxima granularidade, os deltas são strings JSON parciais, enquanto o tool_use.input final é sempre um objeto.

Você pode acumular as strings delta e analisar o JSON assim que receber um evento content_block_stop, usando uma biblioteca como Pydantic para fazer análise JSON parcial, ou usando nossos SDKs, que fornecem auxiliares para acessar valores incrementais analisados.

Um delta de bloco de conteúdo tool_use se parece com:

Delta de JSON de entrada
event: content_block_delta
data: {"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}}

Nota: Nossos modelos atuais só suportam a emissão de uma propriedade completa de chave e valor do input por vez. Assim, ao usar ferramentas, pode haver atrasos entre eventos de transmissão enquanto o modelo está trabalhando. Uma vez que uma chave e valor de input são acumulados, nós os emitimos como múltiplos eventos content_block_delta com json parcial em chunks para que o formato possa automaticamente suportar granularidade mais fina em modelos futuros.

Resposta de transmissão HTTP bruta

Recomendamos fortemente que use nossos SDKs cliente ao usar o modo de transmissão. No entanto, se você estiver construindo uma integração direta com a API, precisará lidar com esses eventos você mesmo.

Uma resposta de transmissão é composta por:

  1. Um evento message_start
  2. Potencialmente múltiplos blocos de conteúdo, cada um contendo: a. Um evento content_block_start b. Potencialmente múltiplos eventos content_block_delta c. Um evento content_block_stop
  3. Um evento message_delta
  4. Um evento message_stop

Pode haver eventos ping dispersos por toda a resposta também. Veja Tipos de eventos para mais detalhes sobre o formato.

Requisição básica de transmissão

Requisição
curl https://api.anthropic.com/v1/messages \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --data \
'{
  "model": "claude-3-5-sonnet-20241022",
  "messages": [{"role": "user", "content": "Hello"}],
  "max_tokens": 256,
  "stream": true
}'
Resposta
event: message_start
data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-3-5-sonnet-20241022", "stop_reason": null, "stop_sequence": null, "usage": {"input_tokens": 25, "output_tokens": 1}}}

event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "!"}}

event: content_block_stop
data: {"type": "content_block_stop", "index": 0}

event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence":null}, "usage": {"output_tokens": 15}}

event: message_stop
data: {"type": "message_stop"}

Requisição de transmissão com uso de ferramenta

Nesta requisição, pedimos ao Claude para usar uma ferramenta para nos dizer o clima.

Requisição
  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" \
    -d '{
      "model": "claude-3-5-sonnet-20241022",
      "max_tokens": 1024,
      "tools": [
        {
          "name": "get_weather",
          "description": "Get the current weather in a given location",
          "input_schema": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
              }
            },
            "required": ["location"]
          }
        }
      ],
      "tool_choice": {"type": "any"},
      "messages": [
        {
          "role": "user",
          "content": "What is the weather like in San Francisco?"
        }
      ],
      "stream": true
    }'
Resposta
event: message_start
data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-3-haiku-20240307","stop_sequence":null,"usage":{"input_tokens":472,"output_tokens":2},"content":[],"stop_reason":null}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Okay"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" let"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"'s"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" check"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" weather"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" San"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Francisco"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" CA"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":":"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"tool_use","id":"toolu_01T1x1fJ34qAmk2tNTrN7Up6","name":"get_weather","input":{}}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"location\":"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"San"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" Francisc"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"o,"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" CA\""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":", "}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\"unit\": \"fah"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"renheit\"}"}}

event: content_block_stop
data: {"type":"content_block_stop","index":1}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":89}}

event: message_stop
data: {"type":"message_stop"}