Providers¶
One page per provider, written against src/providers/adapter.rs — the
descriptor table in the source is the truth and these pages follow it. What a provider is
at all, and what it deliberately is not, is defined once in
concepts/provider; this catalog is about the part
that differs per provider: how we authenticate to each one.
Three ways in¶
Subscriptions (OAuth). claude-code, codex and
kimi are provider accounts in the shared subscription pool. The credential is an OAuth grant — an
access token, a rotating refresh token, and an expiry — minted by a real browser sign-in
that Weles drives on its own host and writes into the Skarbiec vault at
provider:<provider>:<subscription>. The gateway refreshes the grant
ahead of expiry against the provider's own token endpoint and never opens a browser
itself; a grant the provider disowns waits for the next sign-in
(subscription, each provider's page for the
exact token shape).
Deployment API keys. Every other remote provider is paid by the deployment's own long-lived API key, stored once in the vault and redeemed at final use through a capability. There is no login flow, no refresh and no invented expiry — the key works until the provider revokes it or an operator replaces it.
The routes file. local-openai is the deployment's own
inference: its endpoint resolves per request through the routes file and only loopback or
Tailscale IPv4 endpoints are accepted (alias).
One provider serves no chat. typesafe answers
typed decisions and nothing else, so a chat
completion naming one of its routes is refused rather than sent anywhere. Every other
provider here serves chat.
Unrestricted and abliterated models
These are ordinary model routes, not a mode that disables Brama authentication.
The live catalogue supplies the provider and model IDs. Use
brama models --search abliterated --json to discover publisher-named
models, then select the exact provider/model route. Catalogue
presence describes a model; it does not establish that your deployment has
credentials or that the provider will accept a request.
The catalogue provider abliteration-ai uses the trusted base
https://api.abliteration.ai/v1, with bearer authentication and
OpenAI-compatible chat and model discovery, as documented by
Abliteration AI.
Brama does not trust a new destination merely because an upstream catalogue
names one. The provider credential still comes through the normal capability
or subscription credential path; a missing credential remains a refusal.
Existing venice, featherless and
local-openai routes can serve models their providers or your own
deployment expose. A self-hosted abliterated model uses the existing local
OpenAI route contract, not an arbitrary external URL supplied by a model.
No provider promise of being unrestricted bypasses Brama's workload identity,
entitlements or endpoint trust checks.
For an operator-maintained grouping, use
model categories with explicit providers,
routes or publisher-name terms. Categories describe the operator's declaration,
not a guarantee about a model's moderation, quality or capabilities.
Use a real authenticated inference request or the configured host's
brama probe to verify service.
Owned-system security assessments are part of Probierz. Probierz constrains the target origin, resolved addresses and available checks outside the model; selecting an unrestricted model never grants wider scope.
The real route qualification is
cargo test --features unrestricted-live-tests --test unrestricted-model.
Declare BRAMA_TEST_ORIGIN, BRAMA_TEST_UNRESTRICTED_ROUTE,
BRAMA_TEST_BEARER, BRAMA_TEST_AGENT,
BRAMA_TEST_AGENT_SECRET and the serving
BRAMA_TEST_SOURCE_REVISION. It checks live catalogue discovery,
asks the selected model to interpret an authorization failure, and verifies
that an unsigned request without a bearer is refused. It spends a real
provider request and retains request, response, hashes and refusal evidence
under target/real-tests/unrestricted/. Missing credentials or
unavailable inference fail the qualification; they are never a passing skip.
| id | Display name | Wire protocol | Credentials | Plan usage | Media |
|---|---|---|---|---|---|
anthropic | Anthropic | anthropic-messages | capability (API key) | — | — |
claude-code | Claude Code (subscription) | anthropic-messages | subscription (OAuth) + refresh | yes | — |
kimi | Kimi (subscription) | openai-chat | subscription (OAuth) + refresh | yes | — |
openai | OpenAI | openai-chat | capability (API key) | — | image, video, voice |
codex | Codex (ChatGPT subscription) | openai-responses | subscription (OAuth) + refresh | yes | — |
openrouter | OpenRouter | openai-chat | capability (API key) | — | — |
groq | Groq | openai-chat | capability (API key) | — | voice |
mistral | Mistral | openai-chat | capability (API key) | — | — |
xai | xAI | openai-chat | capability (API key) | — | image |
deepseek | DeepSeek | openai-chat | capability (API key) | — | — |
cerebras | Cerebras | openai-chat | capability (API key) | — | — |
fireworks | Fireworks | openai-chat | capability (API key) | — | — |
together | Together | openai-chat | capability (API key) | — | image |
nvidia | NVIDIA NIM | openai-chat | capability (API key) | — | — |
moonshot | Moonshot | openai-chat | capability (API key) | — | — |
zai | Z.AI | openai-chat | capability (API key) | — | — |
qwen | Qwen | openai-chat | capability (API key) | — | — |
huggingface | Hugging Face Inference | openai-chat | capability (API key) | — | — |
featherless | Featherless | openai-chat | capability (API key) | — | — |
venice | Venice | openai-chat | capability (API key) | — | image, voice |
novita | Novita | openai-chat | capability (API key) | — | — |
synthetic | Synthetic | openai-chat | capability (API key) | — | — |
typesafe | TypeSafe AI | typesafe-systemone | capability (API key), decisions only | — | — |
local-openai | Local OpenAI | openai-chat | routes file | — | — |
Exactly three providers publish a free plan-usage report; the absence everywhere else is recorded as the provider's own answer (subscription).
The Media column is what a provider generates besides text, and it is written only where the vendor documents that exact OpenAI-shaped endpoint: /v1/images/generations for an image, /v1/videos with /v1/videos/{id} for a video job, /v1/audio/speech for a voice. A provider with a dash there is refused by name on the media endpoints rather than sent a request its server has no route for (media).