Salida en streaming
Salida en streaming en 1折AI: secuencia de eventos SSE nativa de Anthropic, formato de chunks compatible con OpenAI y cómo manejar la interrupción del flujo.
Para respuestas largas usa la salida en streaming ("stream": true), el primer carácter aparece antes y es menos probable que la red intermedia corte la petición por durar demasiado. Ambos protocolos son compatibles y el formato coincide con el oficial en cada caso.
Nativo de Anthropic
Sección titulada “Nativo de Anthropic”Añade "stream": true a la petición; la respuesta es una secuencia de Server-Sent Events. Un flujo normal sigue este orden (procedente de la documentación de streaming de Anthropic):
| Evento | Significado |
|---|---|
message_start | inicio del mensaje, con el modelo y el usage inicial |
content_block_start | comienza un bloque de contenido (texto, thinking, tool_use) |
content_block_delta | incremento de contenido; el texto va en delta.text |
content_block_stop | fin de ese bloque de contenido |
message_delta | actualización a nivel de mensaje, con stop_reason y el recuento final de tokens de salida |
message_stop | fin de todo el mensaje |
Pueden intercalarse eventos ping, que se pueden ignorar; si hay un error se recibe un evento error.
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":"从一数到五"}]}'Al usar el SDK no hace falta analizar los eventos a mano; consulta los ejemplos de streaming del SDK de Anthropic.
Compatible con OpenAI
Sección titulada “Compatible con OpenAI”Añade "stream": true a /v1/chat/completions y la respuesta son chunks en forma de data: {...}, con el texto en choices[0].delta.content y el final marcado por data: [DONE]. Ejemplos de SDK en el SDK de OpenAI.
El último chunk antes de [DONE] lleva usage y choices es un array vacío. También se devuelve aunque no envíes stream_options.include_usage. Flujo completo medido el 2026-10-15:
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]Al procesar los chunks, comprueba primero si choices está vacío; el ejemplo de la página del SDK de OpenAI ya lo hace así.
Qué hacer si se corta el flujo
Sección titulada “Qué hacer si se corta el flujo”- Primero descarta que sea el proxy: desactívalo y conecta directamente para volver a probar.
- El tiempo de lectura del cliente debe ser mayor que el tiempo de generación del modelo; con salidas largas aumenta el valor del timeout.
- Si recibes
overloaded_erroren un eventoerror, espera unos segundos y reintenta; consulta códigos de error y solución de problemas.
Cómo se factura una desconexión a mitad de camino
Sección titulada “Cómo se factura una desconexión a mitad de camino”Una petición que se desconecta a mitad de camino no es gratis en su totalidad: se facturan los tokens de salida ya generados antes de la desconexión, y quedan registrados en el log de llamadas. Los tokens de salida facturados pueden ser algo más que los que el cliente llegó a recibir. Medido el 2026-10-15: al pedir al modelo que cuente del 1 al 600, el cliente recibió 188 líneas (unos 380 tokens de salida) cuando se desconectó en el segundo 4, y el log de llamadas registró 750 tokens de salida. Para salidas largas que no necesitas, en lugar de desconectarte a mitad de camino, mejor pon max_tokens pequeño desde el principio.
