Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Application / service account

No person at all: a program holding a virtual key. A backend service, a batch job, a CI pipeline, an agent CLI running headless. It never opens the dashboard; the people who own it do (usually a team lead or an org admin). Its journey is what happens to its traffic, its limits and its credential over months.

Goal: “the service calls models through one endpoint; failures upstream are absorbed, limits are predictable, and rotating its key never takes it down.”

Dogfood setup: a shared key minted by lead@rolter.local in project default/default (step P1.1), used from curl or an SDK. See dogfood data.

The observer watches: request_logs for the key — status mix, retries, target spread, cost — and the gateway’s /metrics for queue depth and rejections while P5 runs.

P1 — get a credential that fits the job

#stepwhereexpectstatus
P1.1the owner mints a shared key for the serviceGovernance → Virtual Keys · POST /api/v1/projects/{id}/virtual-keysshown once; not tied to the person who minted it, so it survives them leavingverified
P1.2narrow it to the models and providers the service usesthe key’s model and provider allow-lists/v1/models with the key lists exactly those; anything else is refused, 403 model_not_allowedverified
P1.3attribute its spendthe key’s business unit and customerevery row the key serves carries both; Governance → Business Units and Customers roll them upverified
P1.4give it an expiry where the service is temporarythe key’s expiryrefused after the date, with an authentication errorverified

P2 — call models

#stepwhereexpectstatus
P2.1the unchanged OpenAI or Anthropic SDK, base URL swapped<gateway>/v1drop-in: no code change beyond the URL and the keyverified
P2.2correlate its own logs with rolter’ssend x-request-id, or read the one returnedthe same id on the request_logs rowverified
P2.3join its distributed tracesend traceparentrolter’s spans land in the service’s trace; the upstream receives the contextverified
P2.4keep a conversation on one replicasend x-session-idsession affinity on consistent_hash and pipeline routes; cache_aware follows the prompt prefix insteadbug — #1851

P3 — rotate its key without an outage

#stepwhereexpectstatus
P3.1rotate in place with an overlap window—a new secret on the same key, the old one honoured until the rollout endsgap — #1837
P3.2the workaroundmint a second key with the same settings, roll it out, delete the firstno outage — as long as every setting was copied by handpartial

P4 — be managed by automation

#stepwhereexpectstatus
P4.1a pipeline mints keys and routes for new customers—a control-plane token scoped to one project, audited as the pipelinegap — #1836 (only the superadmin admin token exists)

P5 — live with limits and failures

Run P5 against the dogfood fleet: its bad targets are what make the answers interesting.

#stepwhereexpectstatus
P5.1an upstream fails transientlydeepseek-r1 (vllm-spot-01 503s a quarter of the time)retried on the other target before the service sees it; no 5xx reached the client in the dogfood runverified
P5.2the service sends many requests at once16 concurrent calls to one routelatency stays near the upstream’s; the queue admits up to its worker count per providerbug — #1815 (one in flight per provider)
P5.3it outruns its rate limita rate limit on the keyHTTP 429 with Retry-After; the service backs offverified
P5.4it exhausts its budgeta budget on the key or its projectHTTP 402; nothing reaches the upstreamverified
P5.5the queue is fullprovider queue at capacityHTTP 429 queue_full / queue_timeout, depending on the backpressure policyworks
P5.6the service disconnects mid-requestclient timeouta 499 row, billed tokens kept, naming the target it waited onbug — #1816 (no provider on the row)