inference.eu

Guides · Streaming

Diffuser les réponses d'un LLM en streaming avec les server-sent events

Le streaming vous transmet la réponse du modèle token par token pendant sa génération, au lieu d'attendre la fin. L'utilisateur voit du texte tout de suite, les longues réponses paraissent plus rapides et vous pouvez interrompre la génération. L'API inference.eu diffuse au format OpenAI pour chat completions et Responses, et au format Anthropic pour Messages.

  1. 01Format d'API: OpenAI et Anthropic
  2. 02Centres de données dans l'UE
  3. 03Couvert par un seul DPA
stream.py
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.inference.eu/v1", api_key=os.environ["INFERENCE_EU_API_KEY"])

stream = client.chat.completions.create(
    model="gpt-oss-120b",
    messages=[{"role": "user", "content": "Explain the difference between a GmbH and an AG in five sentences."}],
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    if chunk.usage:
        print(f"\n\n{chunk.usage.total_tokens} tokens")

Comment fonctionne le streaming

Passez stream à true dans la requête. L'API garde la connexion HTTP ouverte et envoie des server-sent events : des lignes qui commencent par data: suivies d'un objet JSON. Pour chat completions, chaque objet est un chat.completion.chunk dont choices[0].delta contient le nouveau morceau de texte dans content. Le flux se termine par la ligne data: [DONE].

Les SDK officiels se chargent de l'analyse. En Python, vous itérez sur le flux renvoyé ; en JavaScript, vous utilisez for await. Si vous appelez l'API avec votre propre client HTTP, lisez le corps ligne par ligne, ignorez les lignes vides et les commentaires, et analysez chaque charge data: comme du JSON.

Consommation, motifs d'arrêt et appels d'outils

Par défaut, les fragments diffusés n'incluent pas la consommation de tokens. Ajoutez stream_options: {"include_usage": true} : le dernier fragment avant [DONE] contient alors un objet usage et un tableau choices vide, d'où la vérification de chunk.choices dans l'exemple.

Le fragment qui clôt la réponse porte un finish_reason, comme stop ou length. Les appels d'outils sont aussi diffusés : delta.tool_calls arrive par morceaux, le nom de la fonction d'abord, puis les arguments JSON répartis sur plusieurs fragments. Concaténez les chaînes d'arguments par index et ne les analysez que lorsque finish_reason vaut tool_calls. Les modèles de raisonnement peuvent diffuser leur réflexion dans un champ distinct avant la réponse.

Les événements de Responses et d'Anthropic Messages

L'API Responses diffuse des événements typés plutôt que des fragments. Le texte arrive dans des événements response.output_text.delta, les appels d'outils et autres éléments de sortie ont leurs propres événements, et response.completed transporte l'objet de réponse final avec la consommation. Écoutez les types utiles et ignorez les autres.

Le point de terminaison Messages suit la séquence d'Anthropic : message_start, puis content_block_start, une série d'événements content_block_delta avec text_delta ou input_json_delta, content_block_stop, un message_delta avec stop_reason et la consommation, et enfin message_stop. Les SDK Anthropic proposent des aides comme text_stream qui ne renvoient que le texte.

Erreurs, délais d'attente et proxys

Les erreurs survenues avant le début de la génération, comme une clé invalide ou un modèle inconnu, renvoient une erreur HTTP classique, sans flux. Une erreur pendant la génération arrive sous forme d'événement d'erreur dans le flux, puis la connexion se ferme ; votre boucle doit la traiter et décider d'une éventuelle reprise.

Proxys et répartiteurs de charge mettent parfois les réponses en mémoire tampon, transformant le flux en un bloc de texte tardif. Désactivez ce tampon pour ces routes, par exemple avec X-Accel-Buffering: no sous nginx, et prévoyez des délais d'inactivité plus longs que les pauses entre tokens des modèles de raisonnement. Si l'utilisateur ferme la page, annulez la requête.

Streaming : questions fréquentes

Les questions que nous posent le plus les achats, les développeurs et les juristes. Il en manque une ? Posez-la-nous directement.

Poser une question

Faites passer vos charges IA sur une infrastructure européenne

Dites-nous quels modèles vous utilisez et votre volume approximatif. Nous répondons sous un jour ouvré avec un tarif et la suite.

  • Réponse sous un jour ouvré
  • Tarif adapté à votre volume
  • DPA prêt à signer