Why One OpenRouter Model Behaves Like Twenty Different Ones
Software / explainer
Why One OpenRouter Model Behaves Like Twenty Different Ones
A builder who routed 18 million messages through the service found a 15-point benchmark gap and vision models that silently stop seeing images.
What does OpenRouter actually route you to?
OpenRouter is an API gateway: a developer sends one request to one OpenRouter endpoint, and the service forwards it to any of the roughly 20 companies that host a given open-weight model on their own hardware. The pitch is that a request for, say, DeepSeek's V4 Flash model works the same way no matter which of those companies actually answers it.
Mo Moustafa tested that pitch directly. He built Olly, an AI assistant for iMessage that has processed more than 18 million messages, about a third of them routed through OpenRouter to open-weight models, and published his findings on Sept. 7, 2026 in a post titled "So you want to use OpenRouter?". His conclusion: two providers serving what OpenRouter lists as the identical model can behave like different models, because each one runs its own serving software, its own precision settings and its own optimizations on its own GPUs.
Why identical requests don't behave identically
Moustafa's clearest example is DeepSeek V4 Flash 0731. On GPQA Diamond, a graduate-level knowledge benchmark, the model scored 90.2 percent when served by its first-party provider and 75.3 percent when served through DigitalOcean, a 15-point gap on the same model weights. On TAU-Bench Airline, a benchmark for tool-calling accuracy in an airline-support scenario, the gap widened to 23 points.
| Benchmark | First-party provider | DigitalOcean |
|---|---|---|
| GPQA Diamond | 90.2% | 75.3% |
| TAU-Bench Airline | 81.3% | 58.4% |
OpenRouter runs its own per-provider leaderboard on these same benchmarks, so the gap is not hidden. It is just not visible to a developer who sends a request to the model name and lets OpenRouter's default routing pick a provider automatically.
When "supports vision" doesn't mean what it says
The inconsistency goes beyond benchmark scores. Moustafa found that DeepInfra's endpoint for Qwen3.5 misread the letter "K" as "R" in an image-recognition test that four other providers serving the same model passed. Venice and Together both returned "no image provided" errors on MiniMax M3, despite OpenRouter listing image support for that model on both. As Moustafa put it: "A 200 tells you the request was served, not that there's an answer in it."
The reasoning.effort parameter, which is supposed to make a model think harder at higher settings, showed the same split. Most providers respected the low, high and max settings distinctly, Moustafa found, but DigitalOcean, GMICloud, Mancer and Venice returned answers that varied little across all three.
How OpenRouter decides where a request goes
OpenRouter's own blog post on reliability draws a line between two mechanisms. Provider failover is automatic and enabled by default through allow_fallbacks: true: if one provider serving a model times out, hits a rate limit or goes down, OpenRouter switches to another provider serving the same model. Model fallback is opt-in, using a models array, and only activates when every provider for the primary model fails, or when a request hits a context-length error a different provider cannot fix either.
OpenRouter says its load balancer follows a three-step rule: prioritize providers with no outage in the last 30 seconds, weight the remaining stable options toward the lowest price using an inverse-square curve, and treat everything else as a fallback. The same post cites an August 2025 gateway outage that lasted roughly 50 minutes as evidence that the routing layer sitting in front of all these providers is itself a point of failure, not just a way around one.
The parameters that pin a request to one provider
Developers who want DeepSeek's numbers rather than DigitalOcean's have a handful of controls: provider.only restricts a request to an allowlist of named providers, provider.order sets an explicit priority sequence, and provider.ignore blocks specific providers outright. A quantizations filter, such as requesting fp8 precision only, looks like a fix for the same problem, but Moustafa found precision alone is a poor stand-in for quality and narrows the pool of providers OpenRouter can fall back to if the pinned one goes down.
The same pattern shows up wherever one API sits in front of many hardware operators serving the same weights, from OpenAI's own API rental of its Codex agent harness to AWS SageMaker's model-caching layer for faster inference autoscaling: the abstraction that makes switching providers easy is the same one that hides which provider actually answered.
Sources
More in Software
- 01ZCode Uploads Users' Full Git History, Zhipu Says It Deletes ItA developer's reverse-engineering forced a same-day apology from Zhipu over a coding assistant that never told users it was packaging their repositories for the cloud.
- 02Alibaba's Open Code Review Tool Ships an IntelliJ PluginVersion 1.12.6 extends the AI code reviewer to JetBrains IDEs the same week Alibaba's own benchmark shows it trading recall for precision against Claude Code.
- 03Flet Reaches 1.0, Ships One Python App to Six PlatformsFeodor Fitsner's framework rebuilt its bridge to Flutter for the stable release, but has not said how many people pay for anything built on top of it.
- 04Bend 2 Bets Formal Proof Can Catch AI's Coding MistakesVictor Taelin's rewritten language backs its safety pitch with a compiler its own README calls 99 percent AI-written and not yet audited.