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)
```