One gateway between your organisation and every model.
Virtual keys, budgets, routing that keeps personal data on-prem, and fallback when a provider goes down. The gateway stores usage metadata only, never prompts or responses.
1.0 msAdded latencyMedian overhead per chat request, one client
17 888Messages per secondStreaming chat on 4 vCPUs
0Database calls per requestKeys and routing are cached in memory
0Prompts storedUsage metadata only, by design
Measured 27 Oct 2026: the gateway in a Docker container limited to 4 vCPUs, against a fake LLM that answers instantly. How we measure
Made for the public sector
Control over AI that you can explain to a data protection officer.
shield_lock
Personal data stays where it should
Detect Swedish personnummer, samordningsnummer, emails, phone numbers and IBANs, then block, redact or keep the request on-prem.
checkPer-key PII policy
checkResidency limits: on-prem, EU, external
checkPrompts and responses never stored
savings
Budgets, not surprises
Set limits per department, team and key. Alerts fire at your thresholds and requests stop when a budget runs out.
checkMonthly, weekly or quarterly periods
checkLimits in USD, like provider prices
checkExports for finance and BI
electric_bolt
Keeps working when a provider doesn't
Ordered fallback within the allowed residencies. A circuit breaker moves a failing provider to the back of the line.
checkRetries only what is safe to retry
checkNever falls back mid-stream
checkHealth visible in the admin UI
Routing rules
Apps ask for a model. Rules decide where it goes.
Write a condition on headers, team, budget use or personal data, then send matching requests to weighted targets with fallbacks. Test a sample request before you rely on it. The response header x-ume-rule tells you which rule applied.
pii_detected && endpoint == "chat_completions"
→ send to ume/chat-onprem · no fallbacks, on purpose
Point the OpenAI or Anthropic SDK at the gateway and swap in a virtual key. Chat, Responses, Messages, embeddings, speech to text, images and live audio all go through one pipeline: key, limits, rules, residency, budget, fallback.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://gateway.example.se/v1",
api_key=os.environ["UME_API_KEY"], # a virtual key
)
reply = client.chat.completions.create(
model="ume/chat-standard", # an alias, not a vendor model
messages=[{"role": "user", "content": "Sammanfatta ärendet"}],
)
using OpenAI;
using System.ClientModel;
var client = new OpenAIClient(
new ApiKeyCredential(Environment.GetEnvironmentVariable("UME_API_KEY")!),
new OpenAIClientOptions { Endpoint = new Uri("https://gateway.example.se/v1") });
var chat = client.GetChatClient("ume/chat-standard");
var reply = await chat.CompleteChatAsync("Sammanfatta ärendet");
curl https://gateway.example.se/v1/chat/completions \
-H "Authorization: Bearer $UME_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"ume/chat-standard",
"messages":[{"role":"user","content":"Hej"}]}'
# x-ume-rule, x-ume-residency, x-ume-fallbacks
# come back as response headers
Admin UI
Built for the people who run it, in three themes.
Departments, teams, keys, budgets and alerts in one place. Every release is tested with axe against WCAG 2.2 AA in light, dark and Lumen, plus keyboard, reflow, forced colours and target size.
KeysCreate, rotate with a grace period, or revoke. Secrets are shown once.
Budgets & alertsSee who is close to their limit before requests start failing.
UsageLatency, time to first token and cost per model, department and rule.