Skip to main content

Providers & Day-Zero Models

Supported providers

Create an agent against any of these upstreams. Each agent gets its own route with the provider key injected from a KnoxCall secret — your app never holds it.

The OpenAI base path matters

For every provider with a base path in that column, point an OpenAI SDK at the agent URL plus that pathOPENAI_BASE_URL=https://<tenant>.knoxcall.com/v1/ai/<agent>/openai/v1 for Groq, …/v1 for the rest. KnoxCall forwards agent URL + everything after it to the provider’s host, so the sub-path is what turns POST /chat/completions into Groq’s real api.groq.com/openai/v1/chat/completions. The Connect tab renders the right one for you; the catalog is the source of truth (GET /admin/ai-gateway/quickstart/context returns openai_compat_path per provider).

Tenant-supplied upstreams

Azure OpenAI, Ollama, Bedrock and “Other OpenAI-compatible” point at your endpoint, so you supply the upstream base URL when creating the agent. For Bedrock and “Other OpenAI-compatible” that URL is resolved and checked before the agent is created: a hostname that resolves to a loopback, private, link-local or cloud-metadata address is refused with a 400. That is not paranoia about your network — the request carries your decrypted provider credential to whatever that name resolves to, so it is the one place a typo or a hostile DNS record costs you a key. Ollama is deliberately exempt: pointing at your own box on 10.0.0.5 or localhost:11434 is the entire point of it. “Other OpenAI-compatible” also requires a default_model, because we cannot know which model your endpoint serves — and for the same reason its cost is recorded as unpriced. Azure and Ollama are unpriced too: an Azure deployment is billed under your own Azure agreement, and a self-hosted Ollama box has no per-token price at all.

AWS Bedrock: you keep the key, we sign

Bedrock is the one provider with no static credential header. Its secret access key is never transmitted — it is the HMAC key for a signature over the request itself. So KnoxCall stores a JSON AWS credential as the secret:
…and computes the SigV4 signature server-side over the finalized request, after PII tokenization and body injection, immediately before the bytes leave. Your application holds no AWS credential at all, and neither does anything downstream of us. Two limits worth knowing up front. Bedrock streams application/vnd.amazon.eventstream — length-prefixed binary frames, not SSE — so the mid-stream PII rewriter cannot apply; redaction runs on its buffered responses, exactly as it does for Cohere. And Bedrock prices are region-scoped, while the shipped pricebook carries the us-east-1/us-west-2 rates, so an agent pinned elsewhere is estimated rather than exact.
Gemini and Cohere use their own native request/response shapes — send Gemini requests in Gemini’s format and Cohere in Cohere’s. The gateway proxies them through unchanged; PII redaction, firewall, budgets, and usage attribution all still apply. OpenAI ↔ Anthropic shape translation is automatic on the buffered path for those two.

Day-zero models — the runbook

When a provider ships a new model, you don’t wait on a KnoxCall release. Two steps, no remote config fetch (a deliberate post-supply-chain-compromise choice — the gateway never pulls config from a third party at runtime):
  1. Use it immediately. Set the new model id in your request (or as the agent’s default model). The gateway proxies any model the upstream accepts — there is no allowlist unless you add one.
  2. Price it (for budgets/chargeback). Add a row to the relevant packs/ai-gateway-pricebook/{provider}.json manifest with the list price and a dated effective_from, then reseed. Until then the call still succeeds and is recorded with cost_source = 'unpriced' (never silently $0), and the weekly pricebook-drift check raises an alertable ai_gateway.unpriced_model event so you know to add it. See Budgets & FinOps.
That’s the whole loop: a new model works on day zero; adding one manifest row makes its cost exact.

Model allow/deny

Optionally constrain which models an agent may call via its model allowlist / denylist (Models tab, or model_allowlist on the agent). A request for a model outside the allowlist is rejected before it reaches the upstream.