September 25, 2026
GMI Cloud combines multi-model APIs and custom-weight hosting in one account. MaaS serves catalog models through an OpenAI-compatible API, GMI Router selects within the approved pool, and Prime Inference hosts customer weights on dedicated GPUs with managed runtime tuning.
Evaluate aggregation and serving separately: catalog access alone does not provide GPUs and operations for private weights.
The gateway owns request routing; the serving provider owns the hardware and runtime.
| Layer | What it owns | What you configure |
|---|---|---|
| Aggregation and gateway | One endpoint, one key, routing between providers, fallbacks, spend tracking | Model IDs, priority order, budgets, keys |
| Serving | The GPUs, the inference engine, quantization, replica count, region | Weights, GPU type, replicas, scaling policy |
OpenRouter's fallback array tries models in priority order and bills the one that ultimately responds, identified in the response's model field. Its Private Models feature routes to a customer's dedicated or fine-tuned deployment only if it uses a supported BYOK provider and serves an existing catalog model with the same request/response shape and behavior. (OpenRouter model fallbacks docs; OpenRouter private models docs)
Read that literally and the architecture is explicit: the deployment lives with a GPU provider you contract separately, and the aggregation layer points at it. LiteLLM draws the same line from the open-source side. Its documentation describes "a self-hosted server" that "gives your applications one OpenAI-compatible endpoint for 100+ LLM providers, MCP tools, and A2A agents." Reliability there is yours to configure, through fallbacks, context_window_fallbacks, and content_policy_fallbacks under router_settings (LiteLLM proxy docs, LiteLLM reliability docs). You run the gateway, and the weights still need a GPU host.
Model count is the wrong tiebreaker for this request. What decides the architecture is whether one platform runs a model catalog and reserved GPU capacity behind the same account, so the two halves of your workload do not end up behind two vendors. GMI Cloud runs both halves, and the next section puts each half of the request against the product line that answers it.
GMI Cloud is an AI-native inference cloud that operates a multi-model API layer and reserved NVIDIA GPU capacity on the same platform, so a workload can start on shared capacity and move onto its own GPUs without changing the integration.
| Your requirement | GMI Cloud layer | What it gives you |
|---|---|---|
| One endpoint for many models | Inference API | "One endpoint, 200+ models" on base URL https://api.gmi-serving.com, with POST /v1/chat/completions, POST /v1/responses (OpenAI Responses API), POST /v1/messages (Anthropic Messages API), and GET /v1/models |
| Automatic model choice per request | GMI Router | Cost, Balanced, and Quality modes, plus an "Allowed Model Pool" setting to "route only within models your org owner approves", and workspace-wide Auto Mode |
| Your own weights on dedicated GPUs | Prime Inference | "Any open-source, fine-tuned, or proprietary weights. Load from Hugging Face, S3, or your own storage" on single-tenant GPUs, with vLLM, TensorRT-LLM, or SGLang pre-tuned per GPU class |
| One commercial relationship | MaaS platform terms | "Centralized billing with a single invoice across all models" and "Per-client customization across pricing, policies, and deployment" |
Two details matter when you compare this with a pure routing layer. First, the MaaS page draws the distinction itself under the heading "Not Just An API Router." and states: "GMI hosts and operates critical models on its own datacenter infrastructure, ensuring consistent performance that routing-only platforms cannot guarantee." Second, routing on GMI Cloud is not a billed middleman today. The GMI Router page carries the label "FREE DURING PREVIEW" over the line "You pay only for the model that runs your prompt", and states: "No judge model. No routing fees. Parsing and routing run on GMI's own model and add nothing on top." That page also says recommendation and routing are free "for a limited time", so treat it as a preview term to confirm with sales rather than a permanent price.
For how the routing decision itself is made, GMI Cloud's launch write-up Automatic Model Selection for Every Prompt: GMI Router Is Live covers the mechanics, and the coding agent escalation experiment shows it running across two harnesses.
Four neighboring routing questions have their own write-ups. On the control side: workspace-level governance of modes and the allowed pool in Cost, Balanced, and Quality modes, and routing a coding agent without a judge call or a cold cache in routing without a judge call. On the money side: multi-turn cache reuse in balancing cost and quality across multi-turn caches, and the harness for measuring answer quality, session cost, and routing latency in how to test model routing. This guide stays on the migration itself.
Four answers separate the two layers: whose GPUs the weights run on, what each half bills in, whether moving a workload changes the API, and how many accounts and invoices the split adds. Ask every candidate on your shortlist. The answers are usually in public documentation, and they decide the architecture more than any benchmark does.
Model slugs are provider-specific strings, so the API half needs a mapping table rather than a global find-and-replace of the base URL. Four of the seven mappings below change the organization prefix, the capitalization, or both.
| Model | OpenRouter model ID | GMI Cloud model ID |
|---|---|---|
| DeepSeek V4.1 Flash | deepseek/deepseek-v4.1-flash | deepseek-ai/DeepSeek-V4.1-Flash |
| DeepSeek V4 Pro 0813 | deepseek/deepseek-v4-pro-0813 | deepseek-ai/DeepSeek-V4-Pro-0813 |
| GLM 5.3 | z-ai/glm-5.3 | zai-org/GLM-5.3 |
| Qwen3.8 27B | qwen/qwen3.8-27b | Qwen/Qwen3.8-27B |
| Kimi K3 | moonshotai/kimi-k3 | moonshotai/kimi-k3 |
| Gemini 3.8 Flash | google/gemini-3.8-flash | google/gemini-3.8-flash |
| GPT-6 Astra | openai/gpt-6-astra | openai/gpt-6-astra |
OpenRouter IDs read from its public models API on October 15, 2026; GMI Cloud IDs read from the model library the same day. Both catalogs change, so copy IDs from GET /v1/models or the model library rather than transforming strings by rule.
Keep the map in one place and fail loudly on anything unmapped, so a silent typo does not turn into a 404 in production traffic:
import os, time
from datetime import datetime, timezone
from email.utils import parsedate_to_datetime
from openai import OpenAI, APIStatusError, APITimeoutError
OPENROUTER_TO_GMI = {
"deepseek/deepseek-v4.1-flash": "deepseek-ai/DeepSeek-V4.1-Flash",
"deepseek/deepseek-v4-pro-0813": "deepseek-ai/DeepSeek-V4-Pro-0813",
"z-ai/glm-5.3": "zai-org/GLM-5.3",
"qwen/qwen3.8-27b": "Qwen/Qwen3.8-27B",
"moonshotai/kimi-k3": "moonshotai/kimi-k3",
"google/gemini-3.8-flash": "google/gemini-3.8-flash",
"openai/gpt-6-astra": "openai/gpt-6-astra",
}
client = OpenAI(
base_url="https://api.gmi-serving.com/v1",
api_key=os.environ["GMI_API_KEY"],
timeout=60.0,
max_retries=0, # this function owns the retry policy, so the SDK must not retry too
)
RETRYABLE = {408, 429, 500, 502, 503, 504}
def _retry_after(err):
"""Seconds requested by a Retry-After header, in either delay or HTTP-date form."""
response = getattr(err, "response", None)
header = response.headers.get("retry-after") if response is not None else None
if not header:
return None
try:
return float(header)
except ValueError:
pass
try:
when = parsedate_to_datetime(header)
except (TypeError, ValueError):
return None
if when.tzinfo is None:
when = when.replace(tzinfo=timezone.utc)
return max(0.0, (when - datetime.now(timezone.utc)).total_seconds())
def _backoff(attempt, err=None):
delay = float(2 ** attempt)
requested = _retry_after(err) if err is not None else None
return max(delay, requested) if requested is not None else delay
def complete(legacy_model_id, messages, attempts=3):
if attempts < 1:
raise ValueError("attempts must be at least 1")
if legacy_model_id not in OPENROUTER_TO_GMI:
raise ValueError(f"no GMI Cloud model mapped for {legacy_model_id!r}; check GET /v1/models")
if not messages:
raise ValueError("messages must not be empty")
model = OPENROUTER_TO_GMI[legacy_model_id]
for attempt in range(attempts):
last = attempt == attempts - 1
try:
response = client.chat.completions.create(model=model, messages=messages)
except APITimeoutError:
if last:
raise
time.sleep(_backoff(attempt))
continue
except APIStatusError as err:
if err.status_code in RETRYABLE and not last:
time.sleep(_backoff(attempt, err))
continue
raise
if not response.choices:
raise RuntimeError(f"{model} returned no choices")
text = response.choices[0].message.content or ""
if not text.strip():
raise RuntimeError(f"{model} returned an empty completion")
return text
Fallback semantics also differ, and that is worth one test before cutover. An OpenRouter models array is a priority list you supply. GMI Router instead selects inside your allowed pool by mode, then backs the choice with one retry. In streaming mode, "One backup model may be tried before the first token on a 5xx, provider error, 429, or a 10-second first-token timeout", and once tokens start flowing there is no further fallback. Non-streaming tries "the primary model plus one backup on a transient failure (5xx, provider error, 429), with a combined timeout of 10 minutes for primary and backup" (GMI Router docs). The selected model and any backups come back in routing_metadata, so your logs keep telling you which model answered.
One practical note for the cutover: a routed call is not the same request as a catalog call. The documented quickstart posts an OpenAI-style messages[] array plus a mode field to https://console.gmicloud.ai/api/v1/ie/recommendation/autoroute with a bearer token, and most routed responses carry an X-Recommendation-ID header (GMI Router docs). Give that client a longer timeout than the 60 seconds used above for a single named model: the documented non-streaming budget covers primary and backup together over 10 minutes, so a 60-second client gives up well inside the window the router is still allowed to use.
The workload moves onto reserved GPUs of its own and the integration stays where it is. This is the half that aggregation alone cannot cover, and it is where Prime Inference takes over.
Your weights land on reserved GPUs. The Prime Inference page states: "Any open-source, fine-tuned, or proprietary weights. Load from Hugging Face, S3, or your own storage, onto a runtime built to serve it well." Its FAQ adds that models "load on the GMI inference stack, vLLM, TensorRT-LLM, SGLang, without re-engineering the serving layer", with per-model runtime tuning applied to custom weights as well. The step-by-step of bringing weights out of an S3 bucket is covered in the companion piece on deploying private model weights from S3, and GPU sizing math for a 70B class model is in sizing a 70B deployment on B200 and B300.
The switch does not rewrite your integration. Same account, same API shape. The MaaS FAQ states that GMI Cloud lets teams "transition between these deployment models without changing APIs", and the Developers page frames the dedicated endpoint as the scaling step rather than a migration project. In practice the application keeps its client and changes the endpoint it points a given workload at, which also means you can run one model dedicated and leave the rest of the catalog on shared capacity. If that model gets a new checkpoint every week, the release and rollback flow is laid out in managing frequent fine-tuned model updates.
GMI cites dedicated break-even around 35% sustained utilization, with another comparison giving 35–45%; treat that as a workload-dependent band. Its up-to-5.6x tokens-per-dollar figure uses DeepSeek V4 Pro at full utilization versus serverless list price. Keep bursty experiments on MaaS and evaluate dedicated serving for steady workloads using the cost-per-million-tokens and serverless-to-dedicated guides. (Prime Inference page; cost per million tokens; moving a serverless inference bill onto dedicated GPUs)
Is GMI Cloud a drop-in replacement for an OpenRouter-based integration? The OpenAI-compatible base is https://api.gmi-serving.com/v1, with Responses and Anthropic Messages support on the same base. Change the key and base URL, then validate model IDs and behavior against GET /v1/models; names and capitalization are not automatically interchangeable.
Can GMI Cloud host weights we fine-tuned ourselves, or only catalog models? Both. Prime Inference hosts catalog or customer weights from Hugging Face, S3, or private storage and tunes runtime, kernels, scheduling, and routing. Training a fine-tune is separate and listed as coming soon with sales-led early access. (fine-tuning page)
What does GMI Router cost on top of the model? Routing and recommendation are free for a limited preview; the model's token charges remain. Confirm post-preview terms before long-term budgeting. (GMI Router page)
How is routing different from an OpenRouter models fallback array? An OpenRouter fallback array follows a customer-defined order. GMI Router selects within the approved pool using Cost, Balanced, or Quality and permits one backup on transient failures. GMI's +2.4 quality points and 28% lower cost versus GPT-5.5 in Quality mode are internal eight-category results, directional and not independently audited. (GMI Router page)
Do we need a second GMI Cloud account to get dedicated GPUs? No. Catalog, routing, and dedicated endpoints use one account and Console. MaaS bills model usage on a consolidated invoice; Prime Inference bills per GPU-hour without a minimum contract. Qualified trials and reserved pricing are arranged with sales.
Do we have to move every model at once? No. Centralize the model-ID map, test one low-risk workload, and compare outputs and latency before expanding. A customer model can use a dedicated endpoint while catalog workloads remain on MaaS.
If the API half is urgent, create a key in the console, map your model IDs, and send the first request to https://api.gmi-serving.com/v1 from the developer quickstart. If the weights half is urgent, bring three things to Prime Inference: where the weights live (Hugging Face, S3, or your own storage), the traffic profile of the workload that will run on them, and your latency target. We will size the GPUs and quote the reserved rate against your actual token volume. Current GPU list prices are on the pricing page, and routing stays free during preview on the GMI Router page.
Colin Mo
GMI Cloud helps you architect, deploy, optimize, and scale your AI strategies
