Le streaming vous permet d'afficher le texte au fur et à mesure qu'il est généré par le modèle.
Le streaming est activé par défaut via l'API REST, mais désactivé par défaut dans les SDK.
Pour activer le streaming dans les SDK, définissez le paramètre stream sur True.
Concepts clés du streaming
- Chat : Diffuser les messages partiels de l'assistant. Chaque bloc inclut le champ
contentafin que vous puissiez afficher les messages au fur et à mesure de leur arrivée. - Réflexion : Les modèles capables de raisonnement émettent un champ
thinkingen plus du contenu classique dans chaque bloc. Détectez ce champ dans les blocs de streaming pour afficher ou masquer les traces de raisonnement avant l'arrivée de la réponse finale. - Appel d'outils : Surveillez les
tool_callsdiffusés dans chaque bloc, exécutez l'outil demandé et ajoutez les résultats de l'outil à la conversation.
Gestion des blocs de streaming
Note
Il est nécessaire d'accumuler les champs partiels pour conserver l'historique de la conversation. Ce point est particulièrement important pour les appels d'outils, où la réflexion, l'appel d'outil émis par le modèle et le résultat de l'outil exécuté doivent être renvoyés au modèle lors de la requête suivante.
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)
# accumuler la réflexion partielle
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)
# accumuler le contenu partiel
content += chunk.message.content
# ajouter les champs accumulés aux messages pour la requête suivante
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)
// accumuler la réflexion partielle
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)
// accumuler le contenu partiel
content += chunk.message.content
}
}
// ajouter les champs accumulés aux messages pour la requête suivante
new_messages = [{ role: 'assistant', thinking: thinking, content: content }]
}
main().catch(console.error)
```