Ingest disables reasoning at all eight structured call sites (analysis, page
generation, image captioning, dedup detection and merge, AnyTXT search). Off is
the right default and this keeps it: thinking buys little on structured
extraction, and a model that spends its budget on chain-of-thought can end the
stream with empty content, which costs the page entirely.
It is wrong as a rule, though. Some models refuse to run with reasoning
disabled and reject the request outright — OpenRouter's stealth/ox-alpha, for
one, answers 400 "Reasoning is mandatory for this endpoint and cannot be
disabled". Every ingest call then fails, the queue stalls, and nothing in the
UI can change it, because the existing reasoning selector only reaches chat.
Adds llmConfig.ingestReasoning with its own selector next to the chat control,
defaulting to "off" so existing setups are byte-identical in behaviour.
Two details worth keeping:
- resolveIngestReasoning does not normalize. The provider layer already
normalizes when it builds the payload; doing it in both places turned "off"
into "auto" for providers whose capability list is auto-only, quietly
re-enabling the thinking ingest means to disable.
- preset-resolver drops any field it does not list explicitly, so the new one
is carried in every branch. Without that the selector would save a value the
resolved config discards and ingest would keep using the default.
Tests cover the default, the override, chat/ingest independence, the auto-only
non-decay, the resolved payload on the wire, and survival through the preset
resolver. Full suite green (1871 tests).