BBramaDocs
Browse documentation

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.

idDisplay nameWire protocolCredentialsPlan usageMedia
anthropicAnthropicanthropic-messagescapability (API key)——
claude-codeClaude Code (subscription)anthropic-messagessubscription (OAuth) + refreshyes—
kimiKimi (subscription)openai-chatsubscription (OAuth) + refreshyes—
openaiOpenAIopenai-chatcapability (API key)—image, video, voice
codexCodex (ChatGPT subscription)openai-responsessubscription (OAuth) + refreshyes—
openrouterOpenRouteropenai-chatcapability (API key)——
groqGroqopenai-chatcapability (API key)—voice
mistralMistralopenai-chatcapability (API key)——
xaixAIopenai-chatcapability (API key)—image
deepseekDeepSeekopenai-chatcapability (API key)——
cerebrasCerebrasopenai-chatcapability (API key)——
fireworksFireworksopenai-chatcapability (API key)——
togetherTogetheropenai-chatcapability (API key)—image
nvidiaNVIDIA NIMopenai-chatcapability (API key)——
moonshotMoonshotopenai-chatcapability (API key)——
zaiZ.AIopenai-chatcapability (API key)——
qwenQwenopenai-chatcapability (API key)——
huggingfaceHugging Face Inferenceopenai-chatcapability (API key)——
featherlessFeatherlessopenai-chatcapability (API key)——
veniceVeniceopenai-chatcapability (API key)—image, voice
novitaNovitaopenai-chatcapability (API key)——
syntheticSyntheticopenai-chatcapability (API key)——
typesafeTypeSafe AItypesafe-systemonecapability (API key), decisions only——
local-openaiLocal OpenAIopenai-chatroutes 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).