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]- Un premier fragment ouvre le rôle (
delta.role: "assistant"). - Les fragments suivants portent chacun un morceau de texte dans
delta.content. - Un fragment final, sans contenu, porte
finish_reason:stopen temps normal,lengthsi la limite de tokens a été atteinte. 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]type | Origine |
|---|---|
upstream_error | Le fournisseur du modèle ou le runtime de l'agent a échoué |
internal_error | Erreur 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.