AI gateway
https://ai.slew.cloud/v1 speaks the OpenAI wire format in front of exclusively EU-hosted inference. Point any OpenAI SDK at it and switch the model id — no new client library, no US data path.
from openai import OpenAI
client = OpenAI(base_url="https://ai.slew.cloud/v1", api_key="slew_...")
resp = client.chat.completions.create(
model="slew/mistral-small",
messages=[{"role": "user", "content": "Hallo!"}],
)
Authentication
Mint an AI key with slew token ai "my app" (or POST /tokens with kind: "ai"). AI keys are the only kind the gateway accepts — CLI tokens are rejected with invalid_api_key. Send it the OpenAI way: Authorization: Bearer slew_....
Endpoints
| Endpoint | Behavior |
|---|---|
GET /v1/models |
Model list in OpenAI format — owned_by names the EU provider actually serving each model |
POST /v1/chat/completions |
Chat completions, JSON or SSE streaming |
Errors use the OpenAI error shape ({ "error": { "message", "type", "param", "code" } }), so OpenAI SDKs surface gateway errors exactly like OpenAI's own.
Models
Model ids are always namespaced slew/… and name the actual model — no
small/medium/large tier aliases, so you always know what serves your prompt
and what it costs. Upstream provider model names are not accepted. Each
model is pinned to one EU provider, named in owned_by for transparency.
Prices are what your plan's monthly AI credit is drawn at, in euro cents
per million tokens (input / output):
| Model | Provider | Serves | € ct/Mtok in | € ct/Mtok out |
|---|---|---|---|---|
slew/mistral-small |
Mistral (FR) | mistral-small-latest |
15 | 45 |
slew/mistral-medium |
Mistral (FR) | mistral-medium-latest |
60 | 300 |
slew/mistral-large |
Mistral (FR) | mistral-large-latest |
300 | 900 |
slew/llama-3.3-70b |
Scaleway (FR) | llama-3.3-70b-instruct |
135 | 135 |
slew/qwen3-coder-30b |
Scaleway (FR) | qwen3-coder-30b-a3b-instruct |
30 | 120 |
slew/gpt-oss-120b |
Scaleway (FR) | gpt-oss-120b |
25 | 100 |
slew/gpt-oss-20b |
OVHcloud (FR) | gpt-oss-20b |
10 | 40 |
slew/qwen3-32b |
OVHcloud (FR) | Qwen3-32B |
15 | 45 |
GET /v1/models always reflects what's actually available, including a
pricing object per model, and is the source of truth when this table
lags.
Limits
| Limit | Default | On exceeding |
|---|---|---|
| Request body | 64 KB | 413 request_too_large |
| Requests per account | 60 / minute | 429 with Retry-After |
| Tokens per account per day (UTC) | 1,000,000 prompt + completion | 429 daily_token_limit_exceeded, Retry-After until UTC midnight |
max_tokens per request |
≤ 4096 | 400 |
If you don't set max_tokens (or max_completion_tokens), the gateway sets it to the ceiling for you. Streaming requests automatically get usage reporting in the final SSE chunk.
Metering and privacy
Every successful completion is metered — model, provider, prompt tokens, completion tokens — and visible via GET /usage/ai on the control-plane API and on the dashboard's usage page. For streamed responses, metering happens off the response path, so it never adds latency.
Prompts and completions are never logged or stored. Usage records contain token counts and model names only, and the gateway's error handling logs errors without request bodies.