API publiqueStreaming SSE

Streaming SSE

En passant stream: true au body de POST /v1/chat/completions, la réponse est délivrée en flux Server-Sent Events au lieu d'un JSON unique. Idéal pour afficher le texte au fil de la génération.

Principe#principe

La gateway proxifie le stream upstream en temps réel, en réécrivant chaque chunk pour normaliser l'identifiant id et le champ model exposé. Aucun buffering intermédiaire — les premiers tokens arrivent en quelques centaines de millisecondes.

Format SSE#format

Chaque chunk suit la convention OpenAI : data: {...JSON...}\n\n. Le flux se termine par data: [DONE]. Le dernier chunk JSON contient le champ usage (compteurs de tokens) et finish_reason.

text/event-stream
data: {"id":"3gk-cmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"}}]}

data: {"id":"3gk-cmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Bonjour"}}]}

data: {"id":"3gk-cmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":" !"},"finish_reason":"stop"}],"usage":{"prompt_tokens":8,"completion_tokens":2,"total_tokens":10}}

data: [DONE]

Headers émis#headers

  • Content-Type: text/event-stream
  • Cache-Control: no-cache
  • Connection: keep-alive
  • X-Accel-Buffering: no — désactive le buffering Nginx.

Exemple Python#exemple-python

openai>=1.40.0
from openai import OpenAI

client = OpenAI(
    base_url="https://ai.3gks.cloud/v1",
    api_key="sk-3gk-7XQp4kL8…",
)

stream = client.chat.completions.create(
    model="3gk-llm",
    messages=[{"role": "user", "content": "Compte de 1 à 10."}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="", flush=True)

Exemple cURL#exemple-curl

curl -N (no buffering)
curl -N https://ai.3gks.cloud/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-3gk-7XQp4kL8…" \
  -d '{
    "model": "3gk-llm",
    "messages": [{"role": "user", "content": "Bonjour"}],
    "stream": true
  }'

Tokens & usage#usage

Le bloc usage (prompt_tokens / completion_tokens / total_tokens) est inclus dans le dernier chunk de données avant data: [DONE]. Si votre code ferme la connexion prématurément, vous perdrez ces compteurs côté client (mais ils restent enregistrés côté gateway pour la facturation).

Reconnexion / timeouts. Les Server-Sent Events ne supportent pas la reprise sur erreur de manière native. Si la connexion est coupée pendant la génération, vous devrez relancer la requête depuis le début.