Documentation
Inférence

Streaming

Recevoir la réponse au fil de l'eau, au format server-sent events d'OpenAI.

Avec stream: true, la réponse arrive en server-sent events (Content-Type: text/event-stream), chaque événement portant un fragment chat.completion.chunk au format OpenAI. Le SDK officiel les assemble tout seul :

const stream = await client.chat.completions.create({
  model: '<MODEL_ID>',
  messages: [{ role: 'user', content: 'Raconte-moi une histoire.' }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}

Anatomie du flux

data: {"id":"…","object":"chat.completion.chunk","model":"…","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"id":"…","object":"chat.completion.chunk","model":"…","choices":[{"index":0,"delta":{"content":"Il était"},"finish_reason":null}]}

data: {"id":"…","object":"chat.completion.chunk","model":"…","choices":[{"index":0,"delta":{"content":" une fois"},"finish_reason":null}]}

data: {"id":"…","object":"chat.completion.chunk","model":"…","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]
  1. Un premier fragment ouvre le rôle (delta.role: "assistant").
  2. Les fragments suivants portent chacun un morceau de texte dans delta.content.
  3. Un fragment final, sans contenu, porte finish_reason : stop en temps normal, length si la limite de tokens a été atteinte.
  4. data: [DONE] clôt le flux — toujours, même après une erreur.

Consommation en fin de flux

Le décompte de tokens n'est pas envoyé par défaut. Demandez-le avec stream_options :

{ "model": "…", "messages": [  ], "stream": true, "stream_options": { "include_usage": true } }

Un dernier fragment, avec choices: [] et un objet usage, précède alors [DONE] :

{ "object": "chat.completion.chunk", "choices": [], "usage": { "prompt_tokens": 12, "completion_tokens": 87, "total_tokens": 99 } }

C'est ce usage qui sert de base à la facturation en orbs.

Erreurs en cours de flux

Une fois les en-têtes envoyés, le code HTTP est 200 quoi qu'il arrive. Une erreur survenue pendant la génération est signalée dans le flux, puis le flux se termine :

data: {"error":{"message":"…","type":"upstream_error"}}

data: [DONE]
typeOrigine
upstream_errorLe fournisseur du modèle ou le runtime de l'agent a échoué
internal_errorErreur côté Oreus pendant la relecture du flux

Un client qui ne gère que les fragments chat.completion.chunk ignore silencieusement ces événements : vérifiez la présence d'un champ error sur chaque data. Les erreurs avant le premier octet (clé invalide, orbs insuffisants…) restent des réponses HTTP classiques — voir Erreurs.

Avec une agent key, le flux est traduit depuis le runtime des agents vers le format OpenAI : seuls les deltas de contenu sont transmis. Vous ne verrez ni les appels d'outils intermédiaires de l'agent, ni son raisonnement.

Sur cette page