Four inbound paths, one contract. Whichever way a team integrates, the request resolves to the same Check RPC, so a policy behaves identically across them and there is no second implementation to keep in step.
An OpenAI-compatible endpoint is offered deliberately: for most teams, adoption is a base_url change. That is the cheapest possible migration and it makes Mode A the path of least resistance.
Outbound provider credentials are never held by the application. llm-gateway leases them from Vault per tenant, so a tenant's key can be rotated or revoked without redeploying anything.
Asynchronous: usage rows to ClickHouse, metrics to Prometheus, policy push to every pod.
Batch: nightly Iceberg export to the lakehouse, and the queued bulk admission path.
Risks
The LangChain and LlamaIndex middleware path relies on the framework's callback contract, which is less stable than the other three. It is offered as a convenience and teams are steered to Mode A.
Provider usage block formats differ and change. Where a provider omits token counts on a streaming response, the gateway falls back to its own tokenizer estimate and flags the row as estimated in the ledger.