You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Priced off each package's own rate table (USD per 1M tokens, read from Anthropic_Pricing.ts and OpenAI_Pricing.ts at 2d36880):
adapter
default
in / out
cheapest capable sibling in the same table
ratio
anthropic
claude-opus-5
5 / 25
claude-haiku-4-5 — 1 / 5
5.0x in, 5.0x out
openai
gpt-5.5
5 / 30
gpt-5.4-mini — 0.75 / 4.5
6.7x in, 6.7x out
openrouter
openai/gpt-5.2
2.5 / 10
—
mid tier
gemini
gemini-3.6-flash
flash tier
—
cheap tier
A concrete search — ~2,000 prompt tokens (query + tool results) and ~800 output tokens — costs $0.030 on claude-opus-5 against $0.006 on claude-haiku-4-5, for a task whose job is to retrieve citations and summarise them.
Why it matters
register<Vendor>WebSearchProvider() with no options is the documented call.providers/<vendor>/src/web-search.ts takes options: XWebSearchOptions = {}, and the package CLAUDE.md's registration guidance shows it bare. The default is therefore what most hosts will actually run.
"auto" routing makes it worse.WebSearchTask's provider: "auto" picks by capability, not price. All four declare answer: true and content: false; anthropic and openai additionally declare domainFilter: "native". So a plain keyword search with a site: restriction can land on claude-opus-5 with nothing in the request that says so.
Nothing documents it. None of the four provider READMEs mentions ./web-search at all:
The other two adapters chose the cheap tier, so this is not a considered house style — it is four independent choices.
Proposed fix
Default to the cheapest model in each family that carries the server-side search tool — claude-haiku-4-5 and a gpt-5.*-mini, matching what gemini and openrouter already did. Grounding is retrieval; the synthesis is a paragraph.
Say it in the adapter, beside the constant, the way the rest of these files argue their choices (AnthropicWebSearchProvider.ts:61-71 is the model): "the default is the cheapest id that carries web_search; a caller wanting the flagship passes model."
Optionally, a one-line assertion in each package's existing co-located test file that new XWebSearchProvider({}).model equals the intended cheap id, so a bump is a decision someone writes down.
Found during the 2026-09-14 review of providers/. Verified against origin/main @ 2d36880.
What
The four grounded
./web-searchadapters that shipped this window each pick a default model, and the four choices are not made on one principle:Priced off each package's own rate table (USD per 1M tokens, read from
Anthropic_Pricing.tsandOpenAI_Pricing.tsat2d36880):claude-opus-5claude-haiku-4-5— 1 / 5gpt-5.5gpt-5.4-mini— 0.75 / 4.5openai/gpt-5.2gemini-3.6-flashA concrete search — ~2,000 prompt tokens (query + tool results) and ~800 output tokens — costs $0.030 on
claude-opus-5against $0.006 onclaude-haiku-4-5, for a task whose job is to retrieve citations and summarise them.Why it matters
register<Vendor>WebSearchProvider()with no options is the documented call.providers/<vendor>/src/web-search.tstakesoptions: XWebSearchOptions = {}, and the package CLAUDE.md's registration guidance shows it bare. The default is therefore what most hosts will actually run."auto"routing makes it worse.WebSearchTask'sprovider: "auto"picks by capability, not price. All four declareanswer: trueandcontent: false; anthropic and openai additionally declaredomainFilter: "native". So a plain keyword search with asite:restriction can land onclaude-opus-5with nothing in the request that says so../web-searchat all:providers/openrouter/README.mdis 9 lines total.Proposed fix
claude-haiku-4-5and agpt-5.*-mini, matching what gemini and openrouter already did. Grounding is retrieval; the synthesis is a paragraph.AnthropicWebSearchProvider.ts:61-71is the model): "the default is the cheapest id that carriesweb_search; a caller wanting the flagship passesmodel."./web-searchsubpath is a fifth undocumented cross-provider surface).new XWebSearchProvider({}).modelequals the intended cheap id, so a bump is a decision someone writes down.Found during the 2026-09-14 review of
providers/. Verified againstorigin/main@2d36880.