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
- Chat: Transmite mensajes parciales del asistente. Cada fragmento incluye el campo
contentpara que puedas renderizar los mensajes a medida que llegan. - Razonamiento: Los modelos capaces de razonamiento emiten un campo
thinkingjunto 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. - Llamada a herramientas: Supervisa las
tool_callstransmitidas 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)
```