Pular para o conteúdo
Português

Saída em streaming

Saída em streaming no 1折AI: sequência de eventos SSE nativa da Anthropic, formato de chunks compatível com OpenAI e como lidar com interrupções do fluxo.

Para respostas longas, use a saída em streaming ("stream": true): o primeiro caractere aparece mais rápido e há menos risco de a rede intermediária interromper a requisição por tempo excessivo. Ambos os protocolos são suportados, cada um com formato idêntico ao oficial.

Adicione "stream": true na requisição; a resposta é uma sequência de Server-Sent Events. Um fluxo normal segue esta ordem (conforme a documentação de Streaming da Anthropic):

EventoSignificado
message_startinício da mensagem, com o modelo e o usage inicial
content_block_startinício de um bloco de conteúdo (texto, thinking, tool_use)
content_block_deltaincremento de conteúdo; o texto fica em delta.text
content_block_stopfim deste bloco de conteúdo
message_deltaatualização no nível da mensagem, com stop_reason e a contagem final de tokens de saída
message_stopfim da mensagem inteira

Eventos ping podem aparecer intercalados e podem ser ignorados; em caso de erro, você recebe um evento error.

bash
curl -N https://1zheai.com/v1/messages \
-H "x-api-key: $ONEZHE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5-5","max_tokens":128,"stream":true,
"messages":[{"role":"user","content":"从一数到五"}]}'

Ao usar o SDK, não é necessário analisar os eventos manualmente; veja o exemplo de streaming do SDK da Anthropic.

Adicione "stream": true a /v1/chat/completions; a resposta são chunks no formato data: {...}, com o texto em choices[0].delta.content, terminando com data: [DONE]. Exemplos no SDK da OpenAI.

O último chunk antes de usage contém [DONE], e choices é uma matriz vazia. Também é retornado se stream_options.include_usage não for enviado. Fluxo completo medido em 2026-10-15:

text
data: {"id":"msg_011Cg3ERqM8nN58LxLt7TVuG","object":"chat.completion.chunk","created":1792031230,"model":"claude-sonnet-4-6","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}
data: {"id":"msg_011Cg3ERqM8nN58LxLt7TVuG","object":"chat.completion.chunk","created":1792031230,"model":"claude-sonnet-4-6","choices":[{"index":0,"delta":{"content":"ok"},"finish_reason":null}]}
data: {"id":"msg_011Cg3ERqM8nN58LxLt7TVuG","object":"chat.completion.chunk","created":1792031230,"model":"claude-sonnet-4-6","choices":[{"index":0,"delta":{"content":""},"finish_reason":"stop"}]}
data: {"id":"msg_011Cg3ERqM8nN58LxLt7TVuG","object":"chat.completion.chunk","created":1792031230,"model":"claude-sonnet-4-6","choices":[],"usage":{"prompt_tokens":370,"completion_tokens":4,"total_tokens":374}}
data: [DONE]

Ao processar chunks, verifique primeiro se choices está vazio; o exemplo na página do SDK da OpenAI já faz isso.

  • Verifique primeiro se é proxy: desative o proxy e tente conectar diretamente.
  • O tempo de leitura do cliente deve ser maior que o tempo de geração do modelo; aumente o timeout para saídas longas.
  • Ao receber overloaded_error em um evento error, aguarde alguns segundos e tente novamente; consulte códigos de erro e solução de problemas.

Como é cobrado quando a conexão cai no meio

Seção intitulada "Como é cobrado quando a conexão cai no meio"

Uma requisição interrompida no meio não é gratuita por completo: é cobrada pelos tokens de saída já gerados antes da interrupção, registrados no log de chamadas. A saída cobrada pode ser um pouco maior do que o que o cliente realmente recebeu. Medido em 2026-10-15: ao pedir ao modelo para contar de 1 a 600, o cliente recebeu 188 linhas (cerca de 380 tokens de saída) quando desconectou no 4º segundo, enquanto o log de chamadas registrou 750 tokens de saída. Para saídas longas que não são necessárias, em vez de interromper no meio, é melhor definir max_tokens com um valor menor desde o início.