how does it ask claude?
On the Messages API, with the web search tool on or left off. It qualifies on the same ground the first engine did: it searches, and it reports the pages it retrieved as structured data rather than leaving them to be scraped back out of prose. It is the engine every paid command defaults to.
why a second engine?
Not redundancy. A visibility number is about one door, and the published gap between doors is larger than the run-to-run noise this library exists to quantify, so an engine is a condition rather than an implementation detail. One engine measured well is a fact about that engine, and engine answers are never pooled into one proportion.
why is the number of searches capped?
The fee is charged per search, not per call. One question can send the model searching several times, and the provider's own guidance says a comparative one can run ten or more, so an uncapped call has no price anybody can know in advance. --max-searches caps it, and the cap is also what keeps two rounds the same experiment: a round that searched once and a round that searched nine times are two conditions, not one measurement taken twice. A search that fails is not billed.
why is the tool version pinned?
Later versions of the search tool turn on dynamic filtering: the model writes and runs code that filters the search results before they reach its own context. That is a good feature and a bad instrument. What the model was shown is the condition being measured, and a filter composed afresh on every call is a condition that changes between two runs of the same question with nothing on screen to say so. So web_search_20250305 is asked for, pinned rather than tracking the newest.
what counts as a failed call?
A search that failed is not a search that found nothing. The API answers 200 and puts the failure inside the body, so a reader that only looks at the result list records an absence of sources that never happened. Those codes come back on the answer and the round is marked failed, because an answer composed without the search it asked for is a different condition from the one being collected.
A paused turn is not a short answer either. Recording the fragment would enter a half-finished answer as an observation, and every such fragment is one where the brand had less room to be named.
what does --no-search change?
The tool is left off the request entirely rather than capped at nothing, so the model answers from its weights instead of from pages it fetched while answering. That difference is the measurement: it separates a brand the model knows from one it finds. A cap of zero with the tool still attached would be a third thing again, a model told it may look and then refused.
The arm records itself under its own surface, api_unsearched, derived and never accepted from a caller, so no round can be filed under the other arm's name.
which pages count as its sources?
The ones retrieved, not the ones cited. This response reports both, the results a search returned and the subset the answer quoted, and the other engine reports only the first, so the first is what travels. Pooling one engine's retrievals with another's citations would give the source graph two meanings and no label.
No cost figure is published in this response, and inventing one from the price table would turn this library's arithmetic into the provider's invoice.
how do you get a key?
From the console's API keys page, and a subscription to the Claude assistant is not one. The API is billed separately and issues its own key, and that is the step people miss. lulu setup --provider anthropic stores one under the service lulumelon and the account anthropic, and nothing else on the machine reads that pair.
what does claude cost?
Read 2026-08-01 from platform.claude.com/docs/en/about-claude/models/overview and platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool.
where is the key read from?
From the environment first, so a key exported for one command wins over a stored one: ANTHROPIC_API_KEY then LULU_ANTHROPIC_API_KEY. Then the OS keychain, under the service lulumelon and the account anthropic. Then ./.env and ~/.lulu/env, and nothing else, so a run can never quietly pick up a key from a directory you were not thinking about.
A key is checked with claude-haiku-4-5, and that is also the model a command asks when no --model is given. This is the engine a command asks when no --provider is given.
The key page is console.anthropic.com/settings/keys. Keys starting sk-ant- are expected, which is the shape Anthropic's own docs print, read 2026-08-01.