OpenRouter answers again, and says who is asking
Two changes, both of them OpenRouter and nothing else. The first fixes a request the router had always rejected, so every effort tier above the lowest came back with an error instead of an answer. The second adds three headers that say which tool is calling. Neither is a security fix, and nothing here touches any other provider.
- FixedOpenRouter rejected the request before a model ever saw it. We were sending
reasoning.effortandreasoning.max_tokenstogether in onereasoningobject. In OpenRouter's schema those two are alternatives, not a pair, and the router answers400with Only one of "reasoning.effort" and "reasoning.max_tokens" can be specified. The request builder asks for reasoning in several dialects at once and drops whichever one a provider does not recognise. That works for a parameter that is merely unknown. It does not work for two that contradict each other. The effort tier is now sent on its own and the router translates it into whatever the destination actually takes. - The scope is wider than it sounds. That block is gated on reasoning being requested at all, which is every effort tier except
low, including the default, so on stock settings the request was rejected before any model ran./effort lowwas the only setting that worked, because it asks for no reasoning. This is not a 2.0.1 regression: the line predates 2.0.0, and the provider client is unchanged between the two tags. We saw it on one model, and the pair is invalid by OpenRouter's own error text, but we have not measured how many models enforce it and are not going to claim every one does. - Changedrequests to OpenRouter now identify the app as Monarch CLI. Three headers: the app's page (
https://cymela.com/cli), its name, and the categorycli-agent. That is what gives the tool a page on OpenRouter with per-model usage analytics, and makes it eligible for OpenRouter's public app rankings. The headers go to OpenRouter only, they carry a name and a URL and nothing about you, and nothing is sent to Cymela. It does mean your OpenRouter usage through this tool counts toward the app's public numbers. Running entirely on your machine is unchanged. - To head off the obvious misreading: the listing is the tool, not a model. Nothing of ours is served through OpenRouter. The models you reach are whichever ones you choose and pay for yourself, exactly as before. Thirteen providers are supported, none ships enabled, there is no default, and
monarch --doctoron a fresh install still printsProvider — none chosen yet. - Upgradingthe two package names are published from separate accounts, so the alias can land after the main package rather than beside it. On this release it landed 10m later, and
npm install -g cymelaserved 2.0.1 until it did. - Nothing was removed, renamed or deprecated. Requirements are unchanged: Node 20+, and
monarchaiinstalls with no runtime dependencies.