Ao criar uma Message, você pode definir "stream": true para transmitir a resposta de forma incremental usando server-sent events (SSE).
Os SDKs de Python e TypeScript oferecem várias formas de streaming. O SDK de PHP fornece streaming via createStream(). O SDK de Python permite streams síncronos e assíncronos. Consulte a documentação de cada SDK para obter detalhes.
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
model="claude-opus-4-8",
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Se você não precisa processar o texto conforme ele chega, os SDKs fornecem uma maneira de usar streaming internamente enquanto retornam o objeto Message completo, idêntico ao que .create() retorna. Isso é especialmente útil para requisições com valores grandes de max_tokens, onde os SDKs exigem streaming para evitar timeouts de HTTP.
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=128000,
messages=[{"role": "user", "content": "Write a detailed analysis..."}],
model="claude-opus-4-8",
) as stream:
message = stream.get_final_message()
print(message.content[0].text)A chamada .stream() mantém a conexão HTTP ativa com server-sent events, e então .get_final_message() (Python) ou .finalMessage() (TypeScript) acumula todos os eventos e retorna o objeto Message completo. Em Go, você chama message.Accumulate(event) dentro do loop do stream para construir o mesmo Message completo. Em Java, use MessageAccumulator.create() e chame accumulator.accumulate(event) em cada evento. Em C#, aguarde o método de extensão .Aggregate() do stream para obter o Message completo, ou passe um MessageContentAggregator para .CollectAsync() para agregar enquanto trata os eventos. Em Ruby, chame .accumulated_message no stream. No SDK de PHP, você itera manualmente sobre os eventos do stream para acumular a resposta.
Cada server-sent event inclui um tipo de evento nomeado e dados JSON associados. Cada evento usa um nome de evento SSE (por exemplo, event: message_stop) e inclui o type de evento correspondente em seus dados.
Cada stream usa o seguinte fluxo de eventos:
message_start: contém um objeto Message com content vazio.content_block_start, um ou mais eventos content_block_delta e um evento content_block_stop. Cada bloco de conteúdo tem um index que corresponde ao seu índice no array content final da Message. Uma exceção: durante respostas de fallback do lado do servidor, um bloco de conteúdo fallback chega em cada limite de modelo como um par de content_block_start e content_block_stop sem deltas entre eles.message_delta, indicando alterações de nível superior no objeto Message final.message_stop final.As contagens de tokens mostradas no campo usage do evento message_delta são cumulativas.
Streams de eventos também podem incluir qualquer número de eventos ping.
A API pode ocasionalmente enviar erros no stream 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 streaming:
event: error
data: {"type": "error", "error": {"type": "overloaded_error", "message": "Overloaded"}}De acordo com a política de versionamento, novos tipos de eventos podem ser adicionados, e seu código deve tratar tipos de eventos desconhecidos de forma adequada.
Cada evento content_block_delta contém um delta de um tipo que atualiza o bloco content em um determinado index.
Um delta de bloco de conteúdo text tem a seguinte aparência:
event: content_block_delta
data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", "text": "ello frien"}}Os deltas para blocos de conteúdo tool_use correspondem a atualizações para o campo input do bloco. Para oferecer suporte à máxima granularidade, os deltas são strings JSON parciais, enquanto o tool_use.input final é sempre um objeto.
Você pode acumular os deltas de string e fazer o parse do JSON assim que receber um evento content_block_stop, usando uma biblioteca como Pydantic para fazer parsing parcial de JSON, ou usando os SDKs, que fornecem helpers para acessar valores incrementais já parseados.
Um delta de bloco de conteúdo tool_use tem a seguinte aparência:
event: content_block_delta
data: {"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}}Observação: os modelos atuais só oferecem suporte à emissão de uma propriedade completa de chave e valor do input por vez. Assim, ao usar ferramentas, pode haver atrasos entre eventos de streaming enquanto o modelo está trabalhando. Uma vez que uma chave e valor de input são acumulados, eles são emitidos como múltiplos eventos content_block_delta com JSON parcial fragmentado, para que o formato possa oferecer suporte automaticamente a uma granularidade mais fina em modelos futuros.
Ao usar pensamento estendido com streaming habilitado, você receberá conteúdo de pensamento via eventos thinking_delta. Esses deltas correspondem ao campo thinking dos blocos de conteúdo thinking.
Para conteúdo de pensamento, um evento especial signature_delta é enviado logo antes do evento content_block_stop. Essa assinatura é usada para verificar a integridade do bloco de pensamento.
Quando display: "omitted" é definido na configuração de pensamento, nenhum evento thinking_delta é enviado. O bloco de pensamento abre, recebe um único signature_delta e fecha. Consulte Controlando a exibição do pensamento.
Um delta de pensamento típico tem a seguinte aparência:
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "I need to find the GCD of 1071 and 462 using the Euclidean algorithm.\n\n1071 = 2 × 462 + 147"}}O delta de assinatura tem a seguinte aparência:
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}Use os SDKs de cliente ao usar o modo de streaming. No entanto, se você estiver construindo uma integração direta com a API, precisará tratar esses eventos por conta própria.
Uma resposta de stream consiste em:
message_startcontent_block_startcontent_block_deltacontent_block_stopmessage_deltamessage_stopTambém pode haver eventos ping dispersos ao longo da resposta. Consulte Tipos de eventos para mais detalhes sobre o formato.
client = anthropic.Anthropic()
with client.messages.stream(
model="claude-opus-4-8",
messages=[{"role": "user", "content": "Hello"}],
max_tokens=256,
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)event: message_start
data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-opus-4-8", "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"}
O uso de ferramentas oferece suporte a streaming de granularidade fina para valores de parâmetros. Habilite-o por ferramenta com eager_input_streaming.
Esta requisição pede ao Claude que use uma ferramenta para informar o clima.
client = anthropic.Anthropic()
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"],
},
}
]
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
tools=tools,
tool_choice={"type": "any"},
messages=[
{"role": "user", "content": "What is the weather like in San Francisco?"}
],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)event: message_start
data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-opus-4-8","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_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"}Esta requisição habilita o pensamento estendido com streaming. A configuração display: "summarized" transmite um resumo condensado do raciocínio do Claude em vez da cadeia completa de pensamento.
client = anthropic.Anthropic()
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=20000,
thinking={"type": "adaptive", "display": "summarized"},
messages=[
{
"role": "user",
"content": "What is the greatest common divisor of 1071 and 462?",
}
],
) as stream:
for event in stream:
if event.type == "content_block_delta":
if event.delta.type == "thinking_delta":
print(event.delta.thinking, end="", flush=True)
elif event.delta.type == "text_delta":
print(event.delta.text, end="", flush=True)event: message_start
data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-opus-4-8", "stop_reason": null, "stop_sequence": null}}
event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "thinking", "thinking": "", "signature": ""}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "I need to find the GCD of 1071 and 462 using the Euclidean algorithm.\n\n1071 = 2 × 462 + 147"}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n462 = 3 × 147 + 21"}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n147 = 7 × 21 + 0"}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\nThe remainder is 0, so GCD(1071, 462) = 21."}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}
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": "text", "text": ""}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "text_delta", "text": "The greatest common divisor of 1071 and 462 is **21**."}}
event: content_block_stop
data: {"type": "content_block_stop", "index": 1}
event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence": null}}
event: message_stop
data: {"type": "message_stop"}Esta requisição pede ao Claude que busque na web informações atuais sobre o clima.
client = anthropic.Anthropic()
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
tools=[{"type": "web_search_20250305", "name": "web_search", "max_uses": 5}],
messages=[
{"role": "user", "content": "What is the weather like in New York City today?"}
],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)event: message_start
data: {"type":"message_start","message":{"id":"msg_01G...","type":"message","role":"assistant","model":"claude-opus-4-8","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":2679,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":3}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"I'll check"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the current weather in New York City for you"}}
event: ping
data: {"type": "ping"}
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":"server_tool_use","id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","name":"web_search","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":"{\"query"}}
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":" \"weather"}}
event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" NY"}}
event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"C to"}}
event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"day\"}"}}
event: content_block_stop
data: {"type":"content_block_stop","index":1 }
event: content_block_start
data: {"type":"content_block_start","index":2,"content_block":{"type":"web_search_tool_result","tool_use_id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","content":[{"type":"web_search_result","title":"Weather in New York City in May 2025 (New York) - detailed Weather Forecast for a month","url":"https://world-weather.info/forecast/usa/new_york/may-2025/","encrypted_content":"Ev0DCioIAxgCIiQ3NmU4ZmI4OC1k...","page_age":null},...]}}
event: content_block_stop
data: {"type":"content_block_stop","index":2}
event: content_block_start
data: {"type":"content_block_start","index":3,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"Here's the current weather information for New York"}}
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" City:\n\n# Weather"}}
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" in New York City"}}
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"\n\n"}}
...
event: content_block_stop
data: {"type":"content_block_stop","index":17}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":10682,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":510,"server_tool_use":{"web_search_requests":1}}}
event: message_stop
data: {"type":"message_stop"}Para modelos Claude 4.5 e anteriores, você pode recuperar uma requisição de streaming que foi interrompida devido a problemas de rede, timeouts ou outros erros, retomando de onde o stream foi interrompido. Essa abordagem evita que você tenha que reprocessar a resposta inteira.
A estratégia básica de recuperação envolve:
Para modelos Claude 4.6 e posteriores, a mesma estratégia de capturar e retomar se aplica, mas o passo 2 muda: em vez de colocar a resposta parcial em uma mensagem do assistente, adicione uma mensagem do usuário que instrua o modelo a continuar de onde parou.
Your previous response was interrupted and ended with [previous_response]. Continue from where you left off.text, tool_use, thinking). Blocos de uso de ferramentas e de pensamento estendido não podem ser recuperados parcialmente. Você pode retomar o streaming a partir do bloco de texto mais recente.Trate cada valor de stop_reason assim que um stream for concluído.
Transmita JSON de input de ferramentas sem buffering do lado do servidor para menor latência.
Transmita a saída de pensamento estendido com eventos thinking_delta e signature_delta.
Use os SDKs oficiais, que tratam streaming, acumulação e reconexão para você.
Processe grandes volumes de requisições de forma assíncrona quando você não precisa de respostas em tempo real.
Was this page helpful?