Streaming
Passez stream: true : la réponse arrive en Server-Sent Events (SSE), au format OpenAI standard. Le flux du fournisseur est transmis intact — votre parsing existant continue de fonctionner.
stream = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Raconte-moi une histoire."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content if chunk.choices else None
if delta:
print(delta, end="", flush=True)
Le coût arrive dans le dernier chunk
Le chunk final du flux porte le bloc usage, avec usage.cost — le montant exact débité de votre solde, comme en non-stream :
data: {"id":"...","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":180,"cost":0.000214}}
data: [DONE]
Ne coupez pas la lecture au dernier token de contenu si vous voulez le coût : lisez jusqu'à [DONE].
La décision de routage est dans les en-têtes
En streaming, le corps commence avant que la réponse complète existe — la décision de routage est donc exposée dans les en-têtes HTTP de la réponse :
| En-tête | Contenu |
|---|---|
X-OpenMulti-Model |
l'id du modèle réellement servi |
X-OpenMulti-Reason |
la trace de routage lisible (même contenu que openmulti.reason) |
with client.chat.completions.with_streaming_response.create(...) as response:
print(response.headers.get("x-openmulti-model"))
Robustesse
- Les retries et bascules de chemin (voir Modèles et routage) ne s'appliquent qu'avant le premier octet transmis : un flux entamé n'est jamais rejoué silencieusement.
- Un flux amont qui se fige est coupé après 60 secondes sans chunk, plutôt que de rester suspendu indéfiniment.