slew docs/ai/gateway

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.