So you want to use OpenRouter?

18 million messages through OpenRouter taught Mo Moustafa that the same model is a different model depending on who hosts it.

10 cards · 2m · tap to begin

From · · · 2m

So you want to use OpenRouter?

18 million messages through OpenRouter taught Mo Moustafa that the same model is a different model depending on who hosts it.

In brief

18 million messages through OpenRouter taught Mo Moustafa that the same model is a different model depending on who hosts it. On OpenRouter you are not buying a model, you are buying a provider. Benchmark them yourself, from prod, and never pin your way into a single point of failure. Originally reported by Mmoustafa.

The model is not the product

Ask for deepseek/deepseek-v4-flash and you get one of about 20 hosts you've never heard of. Same weights, their GPUs, their precision, their parsers, their bugs.

“They're the same model on paper, but very different models in real life.”

Same weights, 20 point swing

On DeepSeek V4 Flash, first-party scored 90% GPQA and 81% TAU. DigitalOcean served the identical weights at 75% and 58%.

“For an agent TAU is the score that matters and a 20 point swing is not noise.”

Some vision providers are blind

DeepInfra's Qwen endpoint read a K as an R and called red blue. Venice and Together never saw the MiniMax images at all, and returned 200 OK anyway.

“The model page says it supports image input, but two of its providers don't”

The effort knob may do nothing

reasoning.effort is accepted everywhere but honored selectively. Testing low, high and max across every DeepSeek host showed four providers whose reasoning token counts barely moved.

Precision is a bad proxy

Filtering for fp8 over fp4 buys you nothing. The fp4 hosts landed mid-pack, and GLM's top scorer declared no precision at all while shrinking your fallback pool.

“Filter on the board, not the bits.”

Tool calls leak into text

Provider parsers miss, and the raw markup lands in the reply as user-facing content. You will end up parsing wrapped tool calls and half-wrapped responses yourself.

“<use_skills><parameters>{"skills":["search"]}</parameters></use_skills>”

200 OK with no answer

Reasoning models dump everything into the reasoning field and return content: null with finish_reason stop. 345 tokens billed, nothing to show the user.

“A 200 tells you the request was served, not that there's an answer in it.”

Hollow completions happen at scale

Some endpoints return null content, null reasoning, and no usage object. StreamLake was 20% of traffic in July and 92% of the empty completions.

The contract is per provider

SiliconFlow 400s with code 20015 if you pass back empty reasoning_content from a tool call. Baidu, Alibaba and Cloudflare accept the exact same history.

“So the contract isn't per model, it's per provider.”

Pinning is not safety

Three reliable providers pinned with fallbacks off. Two weeks later Baidu was 429ing, Cloudflare had dropped the model, and Alibaba buckled under 100% of traffic. Olly went down.

“Benchmark from where prod runs, a few at a time, more samples than feels necessary.”

The main idea

On OpenRouter you are not buying a model, you are buying a provider. Benchmark them yourself, from prod, and never pin your way into a single point of failure.

Read the original on Mmoustafa

React

Sign in to react and comment.

Comments (0)

Life is short. Keep it sweet. Respect others' opinions and be kind!

    Recommended next

    More decks on openrouter and related topics.