The control plane between your providers and your teams.
Trifrost sits in the request path: every inference call from every app and every team flows through one governed, load-balanced, tamper-evident API — and every provider you use hides behind it.
Providers above. Teams below. Control in the middle.
Three composable layers run on every request — governance decides who may spend what, policy decides what may be captured, and audit records that it happened.
27+ provider kinds. One wire format.
Chat completions, completions, embeddings, and responses — streaming or not — over every provider you already use. Aliases decouple app config from model and provider, so swapping vendors is a console edit, not a deploy.
Reasoning passed through
reasoning_content / reasoning / thinking blocks flow upstream and back untouched — thinking models work exactly as the provider documented.
Usage you can trust
usage.cost injection, stream_options.include_usage translation, and a synthesized usage chunk on streams — never anything after data: [DONE].
Cost in the headers
Every response carries X-TF-Cost-USD, X-TF-Prompt-Tokens, X-TF-Completion-Tokens, X-TF-Total-Tokens, X-TF-Model, and X-TF-Provider.
Change the base URL. Keep your code.
Trifrost speaks the OpenAI wire format, so any OpenAI or OpenRouter SDK works against it. Swap the base URL, issue a virtual key, and every call is budgeted, allowlisted, load-balanced, and audited from the first request.
- No SDK changes — only configuration
- Aliases, not model IDs — your app says kimi3, you decide what that means
- Failover included — alias groups survive provider outages mid-stream
# before — direct to a provider export OPENAI_BASE_URL=https://api.openai.com/v1 export OPENAI_API_KEY=sk-... # after — governed by Trifrost export OPENAI_BASE_URL=https://api.trifrost.tech/v1 export OPENAI_API_KEY=sk-bf-... # your virtual key # every call now: budgeted, allowlisted, audited, # load-balanced, failover-protected, cost-attributed.
One platform, three APIs.
Each surface has its own authentication model and its own audience. Inference never shares credentials with administration.
| Surface | Path | Auth | Audience |
|---|---|---|---|
| Inference | /v1/* | Virtual key (sk-bf-*) | Applications, agents, the playground |
| Admin | /api/v1/* | OIDC server-side session + RBAC | Platform admins, FinOps, compliance |
| Auth | /api/auth/* | Your identity provider (OIDC) | Browser sign-in flow |
Everything is a plugin
The request path is a priority-ordered pipeline of PreLLMHook / PostLLMHook plugins — governance, billing, and policy are composable modules on that pipeline, not hardcoded middleware. A pre-hook can short-circuit a request, and when it does, exactly one blocked event row proves it happened.
Explore the platform.
Gateway & failover
Alias-group load balancing, zero-content stream failover, per-request provider directives. Your inference never goes down because one provider did.
Explore the gateway →Governance & cost
Per-model budgets per department, user, and key. Regulatory model allowlists. Session-level cost attribution. Zero DB hits on the hot path.
Explore governance →Observability & audit
Every request is one HMAC-signed, JOIN-free event. Live in-flight visibility, TTFT and tokens/sec, Syslog export for your SIEM.
Explore observability →Security & identity
OIDC BFF sessions behind your IdP, claim-driven teams, resource×operation RBAC, hashed virtual keys, and regional data residency.
Explore security →