Skip to content

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

  1. Chat : Diffuser les messages partiels de l'assistant. Chaque bloc inclut le champ content afin que vous puissiez afficher les messages au fur et à mesure de leur arrivée.
  2. Réflexion : Les modèles capables de raisonnement émettent un champ thinking en 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.
  3. Appel d'outils : Surveillez les tool_calls diffusé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)
```