v1.20.17 — Live reasoning streaming + native ChatOpenAI + Anthropic per-model thinking
Highlights
💭 Live agent reasoning (config-driven)
Agents stream their chain-of-thought to the progress UI wherever the provider API supports it — OpenAI (Responses summary), DeepSeek (reasoning_content), the ReAct loop, and structured-output nodes via an auto-tool path. Reasoning is enabled solely by the per-model "Configuration LLM" matrix and never injected, so a reasoning block appears only for agents the admin turned it on for; it disappears when the final answer arrives.
🧠 Anthropic per-model extended thinking (Admin · Configuration LLM)
- opus-4-6 / sonnet-4-6: adaptive thinking + effort (
off · low · medium · high · max). - opus-4-5 / haiku-4-5: manual thinking budget (on/off + tokens, 1024–16384).
- Temperature/top-p are locked when thinking is on (Anthropic API constraint), enforced at UI + service + factory.
- Separate global
effortcontrol for opus-4-5.
⚙️ Native OpenAI client
Removed the ~1800-line custom ResponsesLLM in favor of native ChatOpenAI (use_responses_api=True). Only ChatOpenAICached (~1 method) remains, preserving LIA's static-prefix prompt_cache_key routing.
🔧 Fix
Structured-output nodes no longer 400 on a thinking-enabled Claude ("Thinking may not be enabled when tool_choice forces tool use") — they route through the auto-tool path, the only API-supported combination.
Notes
- Architecture decision: ADR-087.
- 2 Alembic migrations (
anthropic_thinking_config_001,anthropic_global_effort_001) — single head. - FAQ changelog updated in all 6 languages (en, fr, de, es, it, zh).
- Gates: Ruff / Black / MyPy strict clean; backend unit suite green (947 tests); frontend tsc + eslint clean; i18n parity verified.
🤖 Generated with Claude Code