Référence API
L'authentification, la surface d'endpoints compatible OpenAI, le streaming, le raisonnement et la taxonomie d'erreurs.
Authentification
Chaque requête vers /v1/* s'authentifie avec une clé virtuelle dans l'en-tête Authorization: Bearer. Générez des clés dans la Console ; le secret n'est affiché qu'une seule fois et seul son hash est stocké. Une clé porte ses propres limites de débit, son budget, ses tags et une liste d'autorisation de modèles facultative (vide = tout modèle).
Une requête dont le modèle ne figure pas sur la liste d'autorisation non vide de la clé est refusée avec un 403 permission_error scellé avant tout envoi ; le refus lui-même est inscrit dans la chaîne d'audit.
La création d'une clé de production requiert une adresse e-mail vérifiée.
curl https://api.sluis.ai/v1/models \ -H "Authorization: Bearer $SLUIS_KEY" # a model outside the key's allow-list never dispatches: # → 403 permission_error · the refusal is sealed in the audit chain
Endpoints
Sluis expose la surface compatible OpenAI ci-dessous. Les endpoints sans gestionnaire de premier niveau sont relayés tels quels vers le fournisseur routé, streaming compris, afin que les upstreams compatibles OpenAI conservent une fidélité totale.
| Endpoint | Rôle |
|---|---|
| POST /v1/chat/completions | Chat completions, la surface principale : routage, protection des données, mise en cache, streaming. |
| POST /v1/completions | Text completions historiques. |
| POST /v1/embeddings | Embeddings ; alimente aussi le cache sémantique. |
| POST /v1/moderations | Classification de modération. |
| POST /v1/responses | L'API OpenAI Responses. |
| GET /v1/models | Les modèles que votre politique et vos identifiants peuvent réellement atteindre, rien d'hypothétique. |
| GET /v1/models/{id} | Les métadonnées d'un modèle. |
| POST /v1/audio/* | Transcription, traduction, synthèse vocale · relayé vers le fournisseur routé. |
| POST /v1/images/* | Génération et retouche d'images · relayé. |
| POST /v1/video/generations | Génération de vidéo · relayé. |
| /v1/files | Opérations sur fichiers · relayé. |
Streaming
Définissez stream: true et la réponse arrive sous forme de server-sent events : chaque frame est un delta chat.completion.chunk et le flux se termine par data: [DONE]. Les flux ne sont jamais mis en tampon dans la passerelle : ils la traversent en dérivation, et le sceau d'audit ainsi que le comptage se produisent même si le client raccroche tôt.
Demandez stream_options.include_usage et le frame final porte l'usage exact en tokens, les mêmes chiffres que la passerelle compte et facture.
stream = client.chat.completions.create(
model="mistral/mistral-large-latest",
messages=[{"role": "user", "content": "Write a haiku"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")const stream = await client.chat.completions.create({ model: "mistral/mistral-large-latest", messages: [{ role: "user", content: "Write a haiku" }], stream: true, stream_options: { include_usage: true }, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); }
Raisonnement
Passez le paramètre OpenAI reasoning_effort (minimal | low | medium | high) sur n'importe quel modèle capable de raisonnement. Sluis le traduit selon le fournisseur (le niveau de réflexion de Gemini, l'effort de réflexion adaptatif de Claude) et l'omet là où un modèle le rejetterait, de sorte qu'un seul paramètre fonctionne sur tout le catalogue.
resp = client.chat.completions.create(
model="vertex/claude-opus-4-8",
messages=[{"role": "user", "content": "Prove it step by step…"}],
reasoning_effort="high", # minimal | low | medium | high
)Codes d'erreur
Les erreurs utilisent l'enveloppe d'erreur OpenAI ; la valeur error.type reflète le statut HTTP, si bien que la gestion d'erreurs de votre SDK continue de fonctionner sans changement.
| Code | Quand |
|---|---|
| 400 invalid_request_error | Corps de requête ou paramètres mal formés. |
| 400 invalid_request_error | Identifiant de modèle sans préfixe de fournisseur. Chaque identifiant appelable est provider/model, p. ex. mistral/mistral-large-latest ; le corps indique : model must be provider-prefixed. |
| 401 authentication_error | Clé API manquante ou inconnue. |
| 402 insufficient_quota | Allocation gratuite épuisée ou budget atteint. Activez un forfait ou relevez le budget ; la requête n'atteint jamais un fournisseur. |
| 403 permission_error | La clé n'a pas la permission, par exemple le modèle ne figure pas sur sa liste d'autorisation. |
| 422 invalid_request_error | Refusée avant l'envoi, par exemple la protection des données en mode block a détecté la requête. |
| 429 rate_limit_error | Limite de débit atteinte. Appliquée à la passerelle ; la requête n'atteint jamais un fournisseur. |
| 451 permission_error | Bloquée par la politique de résidence : aucune juridiction autorisée ne sert la requête. Le corps inclut le motif. |
| 5xx api_error | Défaillance du fournisseur en amont après plusieurs tentatives ; le disjoncteur détourne le trafic des fournisseurs défaillants. |