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 playgroundDé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]contientusage, y compriscosten USD. Vous n'avez pas besoin destream_options.include_usage: le suivi de l'utilisation est toujours activé. - L'
idest 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: nosur 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înesargumentsparindexavant de les analyser. Voir Appels d'outils. - Les modèles de raisonnement diffusent leur raisonnement dans
delta.reasoningavant la réponse. Voir Raisonnement.