OpenRouter's automatic fallbacks can change model behavior

OpenRouter lets a developer call a single API endpoint for a given model and get routed automatically to whichever backend provider serves it, on the promise, in the service's own words, that it "handles fallbacks automatically and picks the most cost-effective option for each request." The caller does not have to choose which company actually processes the request.

In an 11 September 2026 link-blog post, Simon Willison points to a piece by Mohamed Moustafa that lays out why that convenience has a cost. Because different providers run different serving software with different optimizations and settings, the same OpenRouter endpoint can serve requests that behave in different ways depending on which backend provider ends up handling them.

Moustafa's piece flags two concrete effects of that variability: some providers lack vision capability for models that are supposed to support it, and providers can process OpenRouter's reasoning effort option differently from one another.

OpenRouter's own features offer a way around the inconsistency. The provider.only option lets a caller pin a request to one specific provider instead of leaving the choice to automatic routing, and the /endpoints method returns the list of providers currently available for a given model ID, so a developer can check the options before relying on the default.

Key facts

  • OpenRouter's stated selling point is that it "handles fallbacks automatically and picks the most cost-effective option for each request," routing a single API endpoint per model to whichever backend provider is available.
  • In an 11 September 2026 link-blog post, Simon Willison points to a piece by Mohamed Moustafa arguing that different providers behind the same OpenRouter endpoint run different serving software, so responses can behave differently depending on which one handles a request.
  • Some providers lack vision capability for models that are supposed to support it.
  • Providers can also process OpenRouter's reasoning effort option differently from one another.
  • OpenRouter's provider.only option pins a request to one specific provider, and its /endpoints method lists the providers currently available for a given model ID.

Why it matters

OpenRouter is used specifically so developers do not have to negotiate separate integrations with every model provider: one endpoint, one API key, and the router decides where the request goes. Moustafa's piece, surfaced by Simon Willison, undercuts the assumption built into that convenience, that whichever provider ends up serving a given model ID, the request will be handled the same way. If serving software, vision capability and reasoning effort handling can all vary by provider, an application built against a model name rather than a specific provider can start behaving differently with no code change on the developer's side and no change to which model is nominally being served.

Who it affects

Anyone building on top of OpenRouter rather than talking to a single model provider directly, particularly teams that rely on its automatic routing instead of pinning a provider. It matters most for use cases built on vision input or on tuning the reasoning effort option, since those are the two specific behaviors the piece says can differ from provider to provider. The direct audience is Simon Willison's readership of developers working with LLM APIs, who he is pointing toward Moustafa's piece.

How to use it

The source names two concrete controls. The provider.only option lets a caller specify which provider should handle a request instead of leaving the choice to OpenRouter's automatic fallback, which fixes behavior that needs to stay consistent. The /endpoints method returns the current list of providers available for a specific model ID, letting a developer check, before shipping, whether the provider they tested against is the one they will actually get. Neither control requires abandoning OpenRouter; both simply mean using it more deliberately for requests where provider variance matters, such as anything sending images or setting a specific reasoning effort level.

How solid is it

This is a second-hand pointer: Simon Willison's post links to and summarizes Mohamed Moustafa's piece rather than being the original account itself. Mohamed Moustafa's affiliation, role, and where the piece was originally published are not stated, and no specific provider or model names are given as examples of the behavior differences, missing vision capability, or differing reasoning effort handling, so the claims cannot be checked here against a named case. The underlying mechanics, that OpenRouter routes a single model ID across multiple, distinguishable backend providers, are corroborated by OpenRouter's own provider.only and /endpoints features, which only make sense if different providers really can serve the same model differently.

Risks and caveats

The clearest risk is silent behavior drift: an application that assumes a given model behaves one way through OpenRouter can lose vision capability or see the reasoning effort option handled differently the moment automatic routing switches which provider serves a request, with no corresponding change in the developer's own code. No scale or frequency is given for how often these inconsistencies occur, so it is not possible to say from this source how common the problem is in practice, and no response or reaction from OpenRouter itself is included, leaving it unclear whether the issues Moustafa describes are being addressed. The fixes described, pinning a provider or checking /endpoints, only help once a developer already suspects provider variance is an issue; they do not by themselves surface it.

“handles fallbacks automatically and picks the most cost-effective option for each request”

— OpenRouter, describing its own routing (as quoted by Simon Willison)