Streaming e Conversas Multi-Turno
- Faça streaming das respostas token a token para que os usuários vejam a saída imediatamente
- Entenda por que a API é stateless e como carregar o histórico da conversa você mesmo
- Continue uma conversa multi-turno reenviando a troca anterior completa
- Impeça que conversas longas estourem a janela de contexto e o custo
Construir experiências semelhantes a chat na API se resume a duas realidades práticas: faça streaming para que os usuários vejam a saída imediatamente e gerencie o histórico você mesmo, porque a API é stateless. Domine ambos e sua UX de chat parecerá rápida e lembrará de tudo.
Streaming
Sem streaming, o usuário espera pela resposta inteira. Com streaming, os tokens chegam conforme são gerados — uma velocidade percebida muito melhor.
- Use o auxiliar de streaming do SDK em vez de analisar eventos brutos manualmente — ele gerencia o ciclo de vida dos eventos para você.
- Python
- TypeScript
with client.messages.stream(
model="claude-sonnet-5", max_tokens=1024,
messages=[{"role": "user", "content": "Explain RAG in two sentences."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
const stream = client.messages.stream({
model: "claude-sonnet-5", max_tokens: 1024,
messages: [{ role: "user", content: "Explain RAG in two sentences." }],
});
for await (const event of stream) {
if (event.type === "content_block_delta") process.stdout.write(event.delta.text ?? "");
}
Multi-turno: você guarda o histórico
A API não tem memória entre chamadas (por quê). Para continuar uma conversa, reenvie a troca anterior inteira a cada vez.
Guided walkthrough1 of 4
- Envie a primeira mensagem do usuário na lista de mensagens.
- Leia o texto da resposta do assistente a partir do resultado.
- Adicione a resposta do assistente e a próxima mensagem do usuário à mesma lista de mensagens.
- Envie a lista completa de mensagens novamente — é assim que o Claude 'lembra' da troca.
messages = [{"role": "user", "content": "Hi, I'm planning a trip."}]
# ... get assistant reply, then append both turns:
messages.append({"role": "assistant", "content": assistant_text})
messages.append({"role": "user", "content": "Make it 3 days."})
# send the full `messages` list again
Conversas longas enchem a janela
Conforme o histórico cresce, ele consome a janela de contexto e o custo aumenta. Estratégias para mantê-lo sob controle:
- Resuma/compacte turnos mais antigos em um breve resumo que você carrega adiante.
- Remova turnos anteriores irrelevantes.
- Combine com o cache de prompt para evitar pagar de novo por um prefixo estável.
- Toda chamada reenvia o histórico inteiro — conversas longas custam mais e podem eventualmente exceder a janela de contexto se você nunca compactar ou remover turnos.
- Faça streaming dos tokens para uma velocidade percebida rápida; o auxiliar do SDK lida com o ciclo de vida dos eventos.
- A API é stateless — ela não tem memória entre chamadas.
- Continue uma conversa anexando cada turno e reenviando a lista completa de mensagens.
- Compacte, remova e use cache para controlar o custo e o tamanho de conversas longas.