Destinations
Declare the model providers and MCP servers Orca AI Gateway can send traffic to, with their credentials, model maps, and pricing.
A destination is a named upstream the gateway can call. Routes reference destinations by name, so switching providers is a change to a route rather than to a caller.
destinations:
openai-primary:
kind: openai
base_url: "https://api.openai.com"
credentials:
vault: openai-key
model_map:
"gpt-5": "gpt-4o"
pricing:
input_per_1m: 2.5
output_per_1m: 10.0Fields
| Field | Notes |
|---|---|
kind | Which adapter handles this destination. See the supported kinds below. |
base_url | HTTP base URL. Required for azure_openai and static MCP destinations; aliased as url for MCP. Other model adapters have provider defaults. |
region | AWS region for bedrock; defaults to us-east-1. |
credentials.vault | Name of a declared vault resolver. Required for every kind. |
credentials.credential_id | Optional logical credential for model destinations. Defaults to credentials.vault. MCP destinations select credentials at request or resolution time. |
model_map | Rewrites the client-supplied model id to a provider-native id. |
pricing.input_per_1m, pricing.output_per_1m | USD per million tokens, used to compute spend for budgets and usage records. |
Any other keys are passed through to the adapter, which is how provider-specific settings such as
Azure's deployment and api_version are supplied.
Supported kinds
kind | Upstream |
|---|---|
openai | OpenAI |
anthropic | Anthropic |
azure_openai | Azure OpenAI Service |
openai_compatible | Any endpoint speaking the OpenAI API |
bedrock | AWS Bedrock |
vertex | Google Vertex AI |
mcp | A Model Context Protocol server |
native_api_key | An allowlisted provider-native API using a static API key |
An unrecognized kind fails at boot with an error naming the destination and listing what is
supported.
Native API-key destinations
Use native_api_key when a client needs a provider's native JSON or SSE protocol without
translating it to Chat Completions. Declare the provider, protocol, trusted upstream URL, allowed
paths, and the vault that holds its static key:
destinations:
pi-openai:
kind: native_api_key
provider: openai
api: openai-responses
base_url: https://api.openai.com
allowed_paths: [/v1/responses]
auth: { type: bearer }
credentials: { vault: openai-key }
routes:
- name: llm-pi-openai-openai-responses
match: { path: /v1/proxy/openai/openai-responses }
strategy: { mode: fallback, targets: [{ destination: pi-openai }] }
idempotency_safe: falseThe proxy requires one matching destination and route. It rejects retries, multiple targets,
fallback to another destination, target parameter shaping, and content guardrails. The allowed_paths
list restricts upstream requests; an arbitrary path under /v1/proxy/ is not forwarded. Supported
protocols include OpenAI Responses, Anthropic Messages, OpenAI Chat Completions, and Google
GenerateContent. Configure allowed_paths and the upstream authentication headers for the
provider protocol you select.
Credentials
Every destination needs credentials.vault, including MCP destinations. The gateway resolves the
named vault resolver at call time and injects the result upstream. Model destinations can use
credentials.credential_id to share one resolver while selecting different logical credentials.
Static MCP requests select the credential with X-Orca-Credential-Id; dynamic MCP resolution returns
the trusted credential id together with the endpoint. The credential is never returned to the caller
and never appears in a response. See Vaults for the resolvers.
Model destinations
These examples show the provider-specific fields on model destinations. See Model providers for complete credential schemes and request examples.
destinations:
anthropic-primary:
kind: anthropic
base_url: "https://api.anthropic.com"
credentials:
vault: anthropic-key
azure-gpt4:
kind: azure_openai
base_url: "https://my-azure.openai.azure.com"
credentials:
vault: azure-key
deployment: gpt-4o-prod
api_version: "2024-08-01-preview"
bedrock-claude:
kind: bedrock
region: us-west-2
credentials:
vault: aws-creds
model_map:
"claude-3-sonnet": "anthropic.claude-3-sonnet-20240229-v1:0"
vertex-gemini:
kind: vertex
project: my-gcp-project
location: us-central1
credentials:
vault: gcp-saProvider requirements
All model adapters require credentials.vault. Their remaining required fields differ:
kind | Required fields | Defaults and optional fields |
|---|---|---|
openai, openai_compatible | credentials.vault | base_url defaults to OpenAI's endpoint. |
anthropic | credentials.vault | base_url defaults to Anthropic's endpoint. |
azure_openai | base_url, credentials.vault | api_version has an adapter default; deployment otherwise falls back to the mapped model. |
bedrock | credentials.vault | region defaults to us-east-1; base_url is derived from region unless set. |
vertex | project, location, credentials.vault | publisher defaults to google; base_url is derived from location unless set. |
model_map is what lets callers use one model name across providers. A caller asking for
claude-3-sonnet gets the Bedrock model id when the request lands on bedrock-claude, without
knowing that mapping exists.
pricing is a per-destination price override for spend calculation, calendar budgets, and usage
records. Without it, the gateway uses plugins.cost_model when configured. With no cost model at
all, request and token limits still work and dollar spend is unpriced. When a cost model is configured
but cannot price a selected model, spend.admission.unpriced_model applies: deny (the default)
rejects it, estimate reserves a configured flat amount, and allow_untracked admits it without
dollar accounting.
See Pricing for the available price sources and Registry integration.
Bedrock and Vertex currently require vault-provided credentials. Their adapters do not use AWS IRSA, the AWS default credential chain, Google ADC, or GCP Workload Identity. Helm service-account annotations alone do not authenticate these destinations.
MCP destinations
An MCP destination proxies JSON-RPC tool calls rather than model calls. It takes base_url (or the
legacy url alias) and a vault:
destinations:
github:
kind: mcp
base_url: "https://api.githubcopilot.com/mcp/"
credentials:
vault: github-patSend JSON-RPC requests with POST /v1/mcp. GET /v1/mcp opens its Streamable HTTP server-push
channel; GET /v1/mcp/sse is the dedicated-path spelling. Because tool calls frequently have side
effects, set idempotency_safe: false on routes that carry them so the retry engine never replays a
call. See MCP egress for static and dynamically resolved
destinations, and Routes for retry behavior.