Two new gateways behind the same keys, the same grants and the same accounting as models.
Images — ghcr.io/azrtydxb/fastllm-proxy:v0.2.0 and ghcr.io/azrtydxb/fastllm-operator:v0.2.0, linux/amd64 and linux/arm64. Each architecture is built on a runner that is that architecture and the two digests are merged into one manifest.
MCP gateway
One endpoint in front of every tool server. A server is a row; a grant is mcp:invoke on mcp/<name>, deliberately not implied by model:invoke — tools have side effects and models do not.
Tools arrive namespaced <server>__<tool>, so two servers can both expose search without the gateway losing track of which one a model meant. A tool name is what the model emits, so a collision is not a listing problem — it is the gateway being unable to tell, after the fact, with no way to ask. One server being down names itself in unreachable rather than failing the list.
GET /v1/mcp/servers, POST /v1/mcp/tools/list, POST /v1/mcp/tools/call, an MCP servers screen, and /admin/mcp-servers. Documentation.
A2A gateway
One address in front of every agent, with the agent card rewritten to point at the gateway — served unchanged, that URL sends the client's next call straight past the key check and the spend attribution.
Protocol versions are pinned per agent rather than inferred: 0.3 and 1.0 are different wire formats, and guessing means the card says one thing and the response is the other. Forwarded JSON-RPC methods are a closed list.
GET /v1/agents, the card, POST /v1/agents/{name}, an Agents screen, and /admin/a2a-agents. Documentation.
Fixed
All found by running the importer against a real database rather than trusting its tests:
- Four backend fields it parsed and then discarded —
protocol,auth_header,auth_scheme,default_max_tokens— soprotocol: anthropicimported as an OpenAI backend pointed at Anthropic. auth_schemecollapsing "absent" into "empty", droppingBearerfrom every backend that did not mention the field.- The
limits:andbudget:blocks never written, so a key imported from a rate-limited deployment arrived unlimited. - A native provider prefix stripped where it is part of an OpenRouter model id.
Also
Interactive API reference, a Kubernetes operator with a FastllmProxy CRD, portable manifests with TLS and LoadBalancer overlays, and CI checks that fail a PR when behaviour changes without documentation, when the admin API changes without the UI, or when an install path is left pinned to an older release.
Full notes in CHANGELOG.md.