# Provider reference

All 95 built-in descriptors, with the wire each rides, its authentication scheme, its pricing namespace and the endpoints it serves.

Source: https://tokentriage.com/docs/build/providers-reference

---
import Callout from '../../../components/Callout.astro';
import ProviderReferenceTable from '../../../components/ProviderReferenceTable.astro';
import NextSteps from '../../../components/NextSteps.astro';

Every descriptor compiled into the binary, in alphabetical order. The name in the first column is
what you write as `provider:` on an upstream.

**How to read the columns.** *Wire* is the dialect the request is shaped by; it comes from the
descriptor, so you do not set `dialect:` unless you are enabling
[cross-dialect translation](/docs/build/providers-cross-dialect). *Auth* decides which config fields
the upstream needs, and the parenthetical names the header or parameter where the scheme alone does
not tell you — see [authentication schemes](/docs/build/providers-auth). *Prices under* is the
catalog namespace every price lookup for this provider begins with; `(region)` marks the two whose
keys are region-qualified, and `oci` carries the count of keys its descriptor can reach. *Endpoints*
lists the endpoint kinds the descriptor declares, spelled the way the endpoint vocabulary spells
them; anything else takes the passthrough path, forwarded and ledgered without a cost figure.

**What the count is, and what stands behind it.** TokenTriage ships 95 built-in provider
descriptors: the set the binary compiles in. The verification standard is published beside that
figure rather than folded into it. An end-to-end test drives a request through a descriptor against
a mock shaped like that provider, asserting that the request is authenticated and forwarded, the
response relayed byte for byte, usage extracted, and the price resolved under the right catalog
prefix or left unpriced with a stated reason. The verification is against mocks, not against the
providers' live endpoints.

Byte-for-byte relay has one shipped exception, and it is worth knowing before you read the phrase
elsewhere in this section: a streamed chat request to an `openai`-dialect upstream has
`stream_options.include_usage` spliced into its outbound body, and the terminal usage frame that
comes back is removed from your copy if you did not ask for it. That is how a streamed row carries
provider-reported usage rather than an estimate. It applies to every upstream riding that driver,
and [when a stream misbehaves](/docs/build/providers-troubleshooting#when-a-stream-misbehaves)
carries the switch that turns it off.

**How far that reaches, and where it does not.** The generator scores a provider-by-endpoint pair
rather than a provider, and it publishes the pairs no test touches. The matrix declares 186 such
cells: 99 carry a test asserting the ledger row's own provider and endpoint stamps, 10 carry a
weaker endpoint-only stamp, and 77 are printed as `declared (no e2e gate)`, which the generator
glosses as *"Not a support claim, and printed rather than hidden."* So the *Endpoints* column is
what the descriptor declares. Ten descriptors have no gated cell: `anthropic`, `azure_text`, `black_forest_labs`, `fal_ai`, `fireworks_ai_embeddings`, `openai_compatible`, `runwayml`, `scx_ai`, `text_completion_openai`, `vertex_ai_embedding`.
`PROVIDER_MATRIX.md` §3 names the test behind every other cell, and
`TestMatrixParity` regenerates that file and diffs it, so it cannot drift from the shipped catalog
without a test going red.

<ProviderReferenceTable />

## Reading the shape of that table

**78 of the 95 descriptors ride the `openai` driver.** The other 17 use the other
14 dialect ids listed in [wire dialects](/docs/build/providers-dialects).

**61 use bearer authentication**, 13 present a Google service-account JWT, 10 set a named header,
8 inject nothing, 2 sign with AWS SigV4 and 1 presents a Snowflake keypair JWT. These sum to 95.

**8 are declared-free**, which is a pricing assertion rather than a lookup: `local` plus the seven
named self-hosted servers. Their rows carry an explicit `$0` and a `descriptor@` provenance stamp.

**15 serve no chat**: `assemblyai`, `azure_text`, `black_forest_labs`, `deepgram`, `elevenlabs`, `fal_ai`, `fireworks_ai_embeddings`, `jina_ai`, `recraft`, `runwayml`, `soniox`, `stability`, `text_completion_openai`, `vertex_ai_embedding`, `voyage`.

The Google family includes the `vertex_ai_embedding` descriptor alongside the chat descriptors
described on [the Google page](/docs/build/providers-google).

<Callout type="warning">
`openai_compatible` is the one row whose namespace has no entries in the vendored price table. It is
the generic escape hatch, and its rows come back unpriced unless you assert `pricing: free` or
declare your own descriptor with a namespace that does exist. The coverage arithmetic counts it as
covering nothing for the same reason. See [adding a provider](/docs/build/providers-custom).
</Callout>

## What this table is not

It is not a model list. Models come from your tiers and your traffic, and the price table is a
separate artefact: the vendored `litellm@2026-07-14#179affb` file carries 2,889 priced model keys
across 107 prefixes. That is a statistic about a price table, not a claim about what TokenTriage can
reach.

The descriptors above cover 85 of those 107 prefixes, and 22 are uncovered with the blocker behind
each one published on [what isn't covered](/docs/build/providers-coverage). Covered is not served:
`oci` sits inside the 85 and reaches 19 of its 44 priced keys, and the generator prints the 25 it
cannot.

It is also not a capability matrix for features inside an endpoint. Tool calling, vision, structured
output and reasoning vary by model rather than by provider, and a descriptor that under-claims them
fails closed rather than promising something the model cannot do.

<NextSteps items={[
  {title: "Connect an OpenAI-compatible provider", href: "/docs/build/providers-connect", description: "Pick a row, then wire it up and confirm the first request priced."},
  {title: "Which pricing key your model lands under", href: "/docs/build/providers-pricing-keys", description: "What the Prices under column promises, and what it does not."},
  {title: "What isn't covered, and why", href: "/docs/build/providers-coverage", description: "The rows that are not in this table, and why each one is missing."}
]} />
