Nous utilisons des cookies. Les cookies et le stockage du navigateur vous gardent connecté et mémorisent vos préférences. Avec votre accord, nous mesurons aussi l’utilisation du site. Vous pouvez à tout moment. Consultez notre politique relative aux cookies.

Streaming

Endpoints

Streaming

Recevez les tokens en streaming via server-sent events en définissant stream: true, avec le format des fragments, l'usage et la gestion des erreurs.

Essayer dans le playground

Définissez stream: true sur Chat completions, Responses ou Completions pour recevoir les tokens au fur et à mesure de leur génération. La réponse utilise les server-sent events (Content-Type: text/event-stream). api14 vous transmet les octets du fournisseur en amont dès leur arrivée, sans les mettre en mémoire tampon.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api14.com/api/v1",
  apiKey: process.env.API14_API_KEY,
});

const stream = await client.chat.completions.create({
  "model": "openai/gpt-5-mini",
  "messages": [
    {
      "role": "user",
      "content": "Explain vector databases in two sentences."
    }
  ],
  "stream": true
});

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

Format des événements

Chaque événement est une ligne data: contenant un fragment JSON. Le flux se termine par data: [DONE].

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{"role":"assistant","content":"Hel"}}]}

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{"content":"lo!"}}]}

data: {"id":"gen-1760000000-abc","object":"chat.completion.chunk","model":"openai/gpt-5-mini","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":10,"completion_tokens":3,"total_tokens":13,"cost":0.0000085}}

data: [DONE]
  • Le dernier fragment avant [DONE] contient usage, y compris cost en USD. Vous n'avez pas besoin de stream_options.include_usage : le suivi de l'utilisation est toujours activé.
  • L'id est le même dans tous les fragments. C'est l'id de génération que vous pouvez passer à Consultation des générations.
  • Certains fournisseurs envoient des lignes de commentaire SSE (qui commencent par :) pour maintenir la connexion ouverte. Les clients SSE et les SDK OpenAI les ignorent. Si vous analysez le flux vous-même, ignorez les lignes qui commencent par :.

Facturation des flux

La passerelle lit le fragment usage final pendant qu'elle transmet le flux et débite votre solde à la fermeture du flux.

Se déconnecter n'annule pas la facturation. Si vous fermez la connexion avant la fin du flux, le fournisseur en amont peut continuer à générer et facturer quand même. Dans ce cas, api14 récupère le coût depuis l'enregistrement de la génération. Pour limiter le coût, définissez max_tokens.

Erreurs pendant un flux

Les erreurs survenant avant le premier octet, comme une clé invalide, un solde insuffisant ou un modèle inconnu, renvoient une erreur JSON classique avec un statut 4xx ou 5xx. Voir Erreurs. Si un fournisseur échoue en cours de flux, celui-ci peut se terminer par un fragment contenant un objet error et finish_reason: "error" :

{ "error": { "code": 502, "message": "Provider disconnected" }, "choices": [{ "delta": { "content": "" }, "finish_reason": "error" }] }

Vérifiez toujours finish_reason sur le dernier fragment.

Conseils

  • Les proxys et les plateformes serverless mettent parfois les réponses en mémoire tampon. Désactivez la mise en mémoire tampon des réponses (par ex. X-Accel-Buffering: no sur nginx) si vous relayez le flux vers des navigateurs.
  • Les appels d'outils arrivent sous forme de fragments delta.tool_calls. Concaténez les chaînes arguments par index avant de les analyser. Voir Appels d'outils.
  • Les modèles de raisonnement diffusent leur raisonnement dans delta.reasoning avant la réponse. Voir Raisonnement.