API-referentie
Authenticatie, het OpenAI-compatibele endpoint-oppervlak, streaming, reasoning en de fouttaxonomie.
Authenticatie
Elk verzoek naar /v1/* authenticeert met een virtuele key in de Authorization: Bearer-header. Keys maak je aan in de Console; het secret wordt één keer getoond en alleen de hash ervan wordt bewaard. Een key draagt zijn eigen rate limits, budget, tags en een optionele allow-list voor modellen (leeg = elk model).
Een verzoek waarvan het model niet op de niet-lege allow-list van de key staat, wordt geweigerd met een verzegelde 403 permission_error voordat er iets wordt verzonden; de weigering zelf belandt in de auditketen.
Het aanmaken van een productie-key vereist een geverifieerd e-mailadres.
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 biedt het onderstaande OpenAI-compatibele oppervlak. Endpoints zonder een eigen handler worden letterlijk doorgestuurd naar de gerouteerde provider, streaming inbegrepen, zodat OpenAI-compatibele upstreams volledige getrouwheid behouden.
| Endpoint | Doel |
|---|---|
| POST /v1/chat/completions | Chat completions, het primaire oppervlak: routing, gegevensbescherming, caching, streaming. |
| POST /v1/completions | Legacy text completions. |
| POST /v1/embeddings | Embeddings; voeden ook de semantische cache. |
| POST /v1/moderations | Moderatieclassificatie. |
| POST /v1/responses | De OpenAI Responses API. |
| GET /v1/models | De modellen die je beleid en credentials daadwerkelijk kunnen bereiken, niets hypothetisch. |
| GET /v1/models/{id} | Metadata van één model. |
| POST /v1/audio/* | Transcriptie, vertaling, spraak · doorgestuurd naar de gerouteerde provider. |
| POST /v1/images/* | Beeldgeneratie en -bewerkingen · doorgestuurd. |
| POST /v1/video/generations | Videogeneratie · doorgestuurd. |
| /v1/files | Bestandsbewerkingen · doorgestuurd. |
Streaming
Zet stream: true en het antwoord komt binnen als server-sent events: elk frame is een chat.completion.chunk-delta en de stream eindigt met data: [DONE]. Streams worden nooit gebufferd in de gateway: ze lopen er via een tee doorheen, en de auditverzegeling en metering gebeuren zelfs als de client vroegtijdig ophangt.
Vraag om stream_options.include_usage en het laatste frame draagt het exacte tokengebruik, dezelfde cijfers die de gateway meet en factureert.
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 ?? ""); }
Redeneren
Geef de OpenAI-parameter reasoning_effort (minimal | low | medium | high) door op elk model dat kan denken. Sluis vertaalt hem per provider (het denkniveau van Gemini, de adaptieve denk-inspanning van Claude) en laat hem weg waar een model hem zou weigeren, zodat één parameter over de hele catalogus werkt.
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
)Foutcodes
Fouten gebruiken de OpenAI-foutenvelop; de waarde error.type weerspiegelt de HTTP-status, zodat de foutafhandeling van je SDK ongewijzigd blijft werken.
| Code | Wanneer |
|---|---|
| 400 invalid_request_error | Onjuiste request-body of parameters. |
| 400 invalid_request_error | Model-id zonder providerprefix. Elk aanroepbaar id is provider/model, bijv. mistral/mistral-large-latest; de body meldt: model must be provider-prefixed. |
| 401 authentication_error | Ontbrekende of onbekende API-key. |
| 402 insufficient_quota | Gratis tegoed op of budget bereikt. Activeer een plan of verhoog het budget; het verzoek bereikt nooit een provider. |
| 403 permission_error | De key mist toestemming, bijvoorbeeld het model staat niet op de allow-list. |
| 422 invalid_request_error | Geweigerd vóór verzending, bijvoorbeeld gegevensbescherming in block-modus matchte het verzoek. |
| 429 rate_limit_error | Rate limit bereikt. Afgedwongen op de gateway; het verzoek bereikt nooit een provider. |
| 451 permission_error | Geblokkeerd door het residency-beleid: geen toegestane jurisdictie bedient het verzoek. De body bevat de reden. |
| 5xx api_error | Upstream-providerfout na retries; de circuit breaker leidt verkeer om onhealthy providers heen. |