Skip to content

El streaming te permite renderizar el texto a medida que el modelo lo genera.

El streaming está habilitado de forma predeterminada a través de la API REST, pero deshabilitado de forma predeterminada en los SDK.

Para habilitar el streaming en los SDK, establece el parámetro stream en True.

Conceptos clave del streaming

  1. Chat: Transmite mensajes parciales del asistente. Cada fragmento incluye el campo content para que puedas renderizar los mensajes a medida que llegan.
  2. Razonamiento: Los modelos capaces de razonamiento emiten un campo thinking junto con el contenido habitual en cada fragmento. Detecta este campo en los fragmentos de streaming para mostrar u ocultar las trazas de razonamiento antes de que llegue la respuesta final.
  3. Llamada a herramientas: Supervisa las tool_calls transmitidas en cada fragmento, ejecuta la herramienta solicitada y agrega los resultados de las herramientas de nuevo a la conversación.

Manejo de fragmentos transmitidos

Note

Es necesario acumular los campos parciales para mantener el historial de la conversación. Esto es especialmente importante en el caso de las llamadas a herramientas, donde el razonamiento, la llamada a herramienta del modelo y el resultado de la herramienta ejecutada deben enviarse de nuevo al modelo en la siguiente solicitud.

Python

```python
from ollama import chat

stream = chat(
  model='qwen3',
  messages=[{'role': 'user', 'content': 'What is 17 × 23?'}],
  stream=True,
)

in_thinking = False
content = ''
thinking = ''
for chunk in stream:
  if chunk.message.thinking:
    if not in_thinking:
      in_thinking = True
      print('Thinking:\n', end='', flush=True)
    print(chunk.message.thinking, end='', flush=True)
    # acumular el razonamiento parcial
    thinking += chunk.message.thinking
  elif chunk.message.content:
    if in_thinking:
      in_thinking = False
      print('\n\nAnswer:\n', end='', flush=True)
    print(chunk.message.content, end='', flush=True)
    # acumular el contenido parcial
    content += chunk.message.content

  # agregar los campos acumulados a los mensajes para la siguiente solicitud
  new_messages = [{ role: 'assistant', thinking: thinking, content: content }]
```

JavaScript

```javascript
import ollama from 'ollama'

async function main() {
  const stream = await ollama.chat({
    model: 'qwen3',
    messages: [{ role: 'user', content: 'What is 17 × 23?' }],
    stream: true,
  })

  let inThinking = false
  let content = ''
  let thinking = ''

  for await (const chunk of stream) {
    if (chunk.message.thinking) {
      if (!inThinking) {
        inThinking = true
        process.stdout.write('Thinking:\n')
      }
      process.stdout.write(chunk.message.thinking)
      // acumular el razonamiento parcial
      thinking += chunk.message.thinking
    } else if (chunk.message.content) {
      if (inThinking) {
        inThinking = false
        process.stdout.write('\n\nAnswer:\n')
      }
      process.stdout.write(chunk.message.content)
      // acumular el contenido parcial
      content += chunk.message.content
    }
  }

  // agregar los campos acumulados a los mensajes para la siguiente solicitud
  new_messages = [{ role: 'assistant', thinking: thinking, content: content }]
}

main().catch(console.error)
```