Composite groups are an admin routing layer for API keys that should choose a concrete provider from the requested model instead of binding the key to a single provider group. They support both built-in model detection and an admin-configured model route registry for public model aliases.
Composite groups can route to these concrete account platforms:
The selected concrete platform is used for account selection, user platform quota checks, post-usage billing, ops error platform attribution, channel mapping/pricing lookup, and platform usage reporting.
Admins can configure routes on a composite group from the group list's
Routes action or through the admin API:
GET /api/v1/admin/groups/:id/composite-routesPOST /api/v1/admin/groups/:id/composite-routesPUT /api/v1/admin/groups/:id/composite-routes/:route_idDELETE /api/v1/admin/groups/:id/composite-routes/:route_idPOST /api/v1/admin/groups/:id/composite-routes/previewEach route belongs to one composite group and contains:
public_model: model identifier the client sends.match_type: exact or prefix.target_platform: concrete provider platform.upstream_model: model identifier sent upstream. If omitted, the public
model is reused.endpoint: any, messages, count_tokens, responses,
chat_completions, embeddings, images, or gemini.priority: lower values win after match specificity.enabled: disabled routes are ignored by runtime resolution but remain
visible to admins.Resolution order is explicit route first, then built-in detection. When more
than one explicit route matches, exact matches beat prefix matches,
endpoint-specific routes beat any, longer prefixes beat shorter prefixes,
then lower priority, then lower route id.
For JSON-body endpoints, the gateway rewrites the request model field to the
route's upstream_model before dispatch. For Gemini native paths such as
/v1beta/models/{model}:generateContent, the gateway resolves {model} and
the handler forwards the resolved upstream model.
Codex Alpha Search and Live requests use the responses route domain. Live
requests resolve the model from session.model, including multipart session
payloads, and apply the configured upstream_model before dispatch.
Codex model manifest requests reuse the existing OpenAI account selection and
failover path within the Composite group.
Composite routing detects common public model IDs and provider-prefixed IDs:
claude-* and anthropic/claude-* route to Anthropic.gemini-* and google/gemini-* route to Gemini.gpt-*, o*, codex-*, text-embedding-*, dall-e-*, and
openai/* route to OpenAI.grok-* and xai/grok-* route to Grok.kimi-*, moonshot-*, and k3 route to Kimi.glm-* routes to Zhipu GLM.deepseek-* routes to DeepSeek.minimax-*, abab*, and minimax/* route to MiniMax.Unknown or ambiguous model names fail closed with a client error instead of guessing a provider.
composite.subscription_type is subscription. The plan grants access to the
composite group; each request is still billed and quota-checked against the
resolved concrete provider platform.group_ids payload is still flat; provider-specific model
mapping and pricing remain keyed by concrete platform.Use one composite subscription group when one customer-facing plan should expose model aliases across OpenAI, Claude, Gemini, and Grok without issuing separate keys per provider.
OpenAI Paid, Claude Paid, Gemini Paid, and Grok Paid.composite group with subscription_type set to subscription.| Public model | Endpoint | Target platform | Upstream model |
| --- | --- | --- | --- |
| all/gpt-5 | responses | openai | gpt-5 |
| all/claude-sonnet | messages | anthropic | claude-sonnet-4-6 |
| all/gemini-pro | gemini | gemini | gemini-2.5-pro |
| all/grok | responses | grok | grok-4.3 |
The same composite group can also rely on built-in detection for standard model
names such as gpt-*, claude-*, gemini-*, and grok-*. Explicit routes are
recommended for bundled plan aliases because they make endpoint, provider, and
upstream model attribution reviewable in the admin UI.
Composite routes choose a concrete provider and upstream model; they do not create synthetic model metadata, pricing, or upstream capability records by themselves. Keep channel pricing/model mapping configured for the concrete provider platforms that the routes target.
This PR intentionally does not implement: