Saltar al contenido principal

Descripción general

El streaming te permite recibir salida parcial a medida que se genera, lo que mejora la latencia percibida y la experiencia del usuario. Para nuevas integraciones de estilo OpenAI, prioriza primero Responses streaming. Si tu framework aún usa streaming de Chat Completions, AI Sonar también admite esa ruta de compatibilidad.

Recomendado: Responses Streaming

curl https://api.aisonar.dev/v1/responses \
  -H "Authorization: Bearer sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4",
    "input": "Write a short poem.",
    "stream": true
  }'

Streaming de Chat Completions

Si tu framework aún espera fragmentos SSE de /v1/chat/completions, eso también funciona:
stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Write a short poem"}],
    stream=True
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

Condiciones de finalización del stream

Condiciones típicas de finalización:
  • response.completed para streams de Responses API
  • finish_reason: "stop" para streams de Chat Completions
  • finish_reason: "length" cuando se alcanza un límite de token
  • eventos de llamada a tool/function cuando el modelo quiere usar herramientas

Patrón para aplicaciones web

async function streamChat(message) {
  const response = await fetch('https://api.aisonar.dev/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sk-your-api-key',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      model: 'gpt-4o',
      messages: [{ role: 'user', content: message }],
      stream: true
    })
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    const chunk = decoder.decode(value);
    const lines = chunk.split('\\n').filter(line => line.startsWith('data: '));

    for (const line of lines) {
      const data = line.slice(6);
      if (data === '[DONE]') return;
      const parsed = JSON.parse(data);
      const content = parsed.choices?.[0]?.delta?.content;
      if (content) {
        document.getElementById('output').textContent += content;
      }
    }
  }
}

Mejores prácticas

Usa /v1/responses si tu SDK o aplicación ya lo admite. Mantén el streaming de /v1/chat/completions para integraciones impulsadas por compatibilidad.
Agrega fragmentos delta a la UI o al terminal a medida que llegan en lugar de esperar la respuesta completa.
Trata las caídas de red y las desconexiones del upstream como modos de fallo normales y vuelve a conectar con cuidado en sesiones de larga duración.