FromSettings now fails with llm.ErrInvalidKey for a key with a control
character such as CR or LF, for every preset that sends a key, and
openai.New rejects such a key too, so neither defers the failure to the
first request. anthropic.New already rejected it. No error quotes the key.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
internal/ai/llm/presets defines the anthropic, openai, openrouter, ollama
and openai_compatible presets (base URL, adapter, key policy, headers,
structured output modes and model quirks) and FromSettings, which turns
llm.Settings plus the decrypted key into a ready llm.Provider or a typed
configuration error from package llm.
Temperature is omitted for model ids matching ^o1 or ^o3, listed once in
TemperatureRejectingModels.
Maestro task: 4d90a725-5a7c-4bee-bbe4-d036cfb69c5b
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>