Riferimento API
L'autenticazione, la superficie di endpoint compatibile OpenAI, lo streaming, il reasoning e la tassonomia degli errori.
Autenticazione
Ogni richiesta a /v1/* si autentica con una chiave virtuale nell'header Authorization: Bearer. Genera le chiavi nella Console; il segreto viene mostrato una sola volta e ne viene memorizzato solo l'hash. Una chiave porta i propri rate limit, budget, tag e una lista opzionale di modelli consentiti (vuota = qualsiasi modello).
Una richiesta il cui modello non è nella lista di consentiti non vuota della chiave viene rifiutata con un 403 permission_error sigillato prima che venga inoltrato alcunché; il rifiuto stesso finisce nella catena di audit.
Generare una chiave di produzione richiede un indirizzo email verificato.
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
Endpoint
Sluis espone la superficie compatibile OpenAI qui sotto. Gli endpoint senza un handler di prima classe vengono inoltrati alla lettera al provider instradato, streaming incluso, così gli upstream compatibili OpenAI mantengono piena fedeltà.
| Endpoint | Scopo |
|---|---|
| POST /v1/chat/completions | Chat completions, la superficie principale: instradamento, protezione dei dati, caching, streaming. |
| POST /v1/completions | Text completions legacy. |
| POST /v1/embeddings | Embeddings; alimenta anche la cache semantica. |
| POST /v1/moderations | Classificazione di moderazione. |
| POST /v1/responses | L'API Responses di OpenAI. |
| GET /v1/models | I modelli che la tua policy e le tue credenziali possono davvero raggiungere, niente di ipotetico. |
| GET /v1/models/{id} | I metadati di un modello. |
| POST /v1/audio/* | Trascrizione, traduzione, voce · inoltrato al provider instradato. |
| POST /v1/images/* | Generazione e modifica di immagini · inoltrato. |
| POST /v1/video/generations | Generazione di video · inoltrato. |
| /v1/files | Operazioni sui file · inoltrato. |
Streaming
Imposta stream: true e la risposta arriva come server-sent events: ogni frame è un delta chat.completion.chunk e lo stream termina con data: [DONE]. Gli stream non vengono mai bufferizzati nel gateway: lo attraversano in tee, e il sigillo di audit e la misurazione avvengono anche se il client si disconnette in anticipo.
Richiedi stream_options.include_usage e il frame finale porta l'uso esatto dei token, gli stessi numeri che il gateway misura e fattura.
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 ?? ""); }
Ragionamento
Passa il parametro OpenAI reasoning_effort (minimal | low | medium | high) su qualsiasi modello capace di ragionamento. Sluis lo traduce per provider (il thinking level di Gemini, l'adaptive thinking effort di Claude) e lo omette dove un modello lo rifiuterebbe, così un solo parametro funziona su tutto il catalogo.
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
)Codici di errore
Gli errori usano l'envelope di errore di OpenAI; il valore error.type rispecchia lo stato HTTP, così la gestione degli errori del tuo SDK continua a funzionare invariata.
| Codice | Quando |
|---|---|
| 400 invalid_request_error | Corpo della richiesta o parametri malformati. |
| 400 invalid_request_error | Id del modello senza prefisso del provider. Ogni id richiamabile è provider/model, ad es. mistral/mistral-large-latest; il body riporta: model must be provider-prefixed. |
| 401 authentication_error | Chiave API mancante o sconosciuta. |
| 402 insufficient_quota | Quota gratuita esaurita o budget raggiunto. Attiva un piano o alza il budget; la richiesta non raggiunge mai un provider. |
| 403 permission_error | La chiave non ha il permesso, ad esempio il modello non è nella sua lista di consentiti. |
| 422 invalid_request_error | Rifiutata prima dell'inoltro, ad esempio la protezione dei dati in modalità block ha trovato corrispondenza nella richiesta. |
| 429 rate_limit_error | Rate limit raggiunto. Applicato al gateway; la richiesta non raggiunge mai un provider. |
| 451 permission_error | Bloccata dalla policy di residenza: nessuna giurisdizione consentita serve la richiesta. Il body include il motivo. |
| 5xx api_error | Errore del provider upstream dopo i retry; il circuit breaker devia il traffico attorno ai provider non integri. |