Gateway Integrations
ACE in front of (or behind) OpenRouter: the endpoint, the headers a call sets, what passes through untouched, and a runnable example.
A gateway integration is a base-URL change: the client points at ACE with the ACE key, and the gateway's own credential and headers ride along. The gateway keeps its routing, fallbacks and billing.
OpenRouter
OpenRouter is the openai channel pointed at https://openrouter.ai/api/v1, and it works today. The ACE key is the SDK's api_key; the OpenRouter key rides on x-ace-openai-key and is used for that call only. Model slugs and OpenRouter's own body fields (models, provider, transforms) reach OpenRouter as sent, and x-ace-served-by names the channel (openai), not the host. Storing the OpenRouter key as the tenant's openai vendor key, with https://openrouter.ai/api/v1 as its endpoint, replaces both headers. The cURL form is under Provider Integrations → OpenAI; the AI SDK form is in the Vercel AI SDK guide.
Endpoint: https://engine.acefleet.dev/v1/chat/completions · also https://engine.acefleet.dev/v1/responses. ACE credential: Authorization: Bearer ace_dev_....
| Topology | Shape |
|---|---|
| ACE in front | Client → ACE → https://openrouter.ai/api/v1, as the openai channel pointed at OpenRouter. |
| ACE behind | Not offered. |
| Header | Required | Description |
|---|---|---|
| x-ace-openai-key | Yes | The OpenRouter key (sk-or-v1-...), used for this call only. |
| x-ace-openai-base-url | Yes | https://openrouter.ai/api/v1. |
| x-ace-provider | Situational | openai, so a slug such as anthropic/claude-sonnet-4.5 is not resolved to the Anthropic channel. |
Passed through untouched
- the model slug, verbatim
- body fields
models,provider,transforms
Storing the OpenRouter key as the openai vendor key with endpoint https://openrouter.ai/api/v1 replaces x-ace-openai-key and x-ace-openai-base-url.
OpenRouter through ACE (Python)
from openai import OpenAI
client = OpenAI(
base_url="https://engine.acefleet.dev/v1",
api_key="ace_dev_<your-dev-key>",
default_headers={
"x-ace-provider": "openai",
"x-ace-openai-base-url": "https://openrouter.ai/api/v1",
"x-ace-openai-key": "sk-or-v1-...", # OpenRouter key, used for this call only
},
)
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4.5", # OpenRouter's own slug, sent verbatim
messages=[{"role": "user", "content": "Summarise the failing checks."}],
# OpenRouter routing fields are relayed as written.
extra_body={
"models": ["anthropic/claude-sonnet-4.5", "openai/gpt-4o"],
"provider": {"sort": "price"},
},
)
print(response.choices[0].message.content)