#16899: feat(config): per-agent and per-model thinking defaults
app: web-ui
gateway
commands
agents
stale
size: S
Cluster:
Agent Thinking Defaults Enhancement
## Summary
This PR adds first-class config support to set thinking defaults by **agent** and by **model**, enabling mixed strategies such as:
- global default: `agents.defaults.thinkingDefault: "high"`
- per-agent override: `agents.list[].thinkingDefault: "xhigh"`
- per-model override: `agents.defaults.models["openai-codex/gpt-5.3-codex"].thinkingDefault: "xhigh"`
## What changed
### 1) Per-agent thinking default
- Added `agents.list[].thinkingDefault` in config types + schema.
- `resolveAgentConfig()` now returns `thinkingDefault`.
- Auto-reply path (`get-reply.ts`) merges per-agent `thinkingDefault` into effective defaults.
- CLI agent command (`openclaw agent ...`) respects per-agent `thinkingDefault`.
- Gateway `chat.history` resolves thinking level with per-agent override before global default.
### 2) Per-model thinking default
- Added `agents.defaults.models["provider/model"].thinkingDefault` in config types + schema.
- `resolveThinkingDefault()` now checks per-model override first.
### 3) Effective precedence
For effective default thinking level:
1. Session-stored / explicit command override (`/think`, etc.)
2. **Per-agent** `agents.list[].thinkingDefault`
3. **Per-model** `agents.defaults.models["provider/model"].thinkingDefault`
4. Global `agents.defaults.thinkingDefault`
5. Catalog fallback (`low` for reasoning models, else `off`)
## Tests
Added/updated tests:
- `src/agents/agent-scope.e2e.test.ts`
- verifies per-agent `thinkingDefault` resolution.
- `src/agents/model-selection.e2e.test.ts`
- verifies per-model override precedence over global,
- verifies global fallback,
- verifies reasoning-catalog fallback.
Validated locally:
- `pnpm vitest run --config vitest.e2e.config.ts src/agents/agent-scope.e2e.test.ts src/agents/model-selection.e2e.test.ts` ✅
- `pnpm vitest run --config vitest.unit.config.ts src/auto-reply/reply/model-selection.inherit-parent.test.ts src/auto-reply/reply/model-selection.override-respected.test.ts` ✅
<!-- greptile_comment -->
<h3>Greptile Summary</h3>
This PR adds first-class config support for setting thinking defaults at both the agent level (`agents.list[].thinkingDefault`) and model level (`agents.defaults.models["provider/model"].thinkingDefault`), enabling fine-grained control over default thinking behavior.
The implementation correctly establishes precedence: per-agent > per-model > global > catalog fallback. This precedence is consistently applied across all code paths including the gateway (`chat.history`), auto-reply flow (`get-reply.ts`), and CLI agent command.
Key changes:
- Config types and Zod schemas updated to support `thinkingDefault` at agent and model levels
- `resolveAgentConfig()` now returns per-agent `thinkingDefault`
- `resolveThinkingDefault()` checks per-model override before global default
- Gateway chat logic properly resolves thinking precedence before falling back to model-based resolution
- Auto-reply merges per-agent thinking default into effective defaults
- CLI agent command respects per-agent override in thinking level resolution chain
- Comprehensive e2e tests validate precedence behavior across all levels
<h3>Confidence Score: 5/5</h3>
- This PR is safe to merge with minimal risk
- The implementation is clean, follows established patterns, and has comprehensive test coverage. All config changes are backward compatible (new optional fields), the precedence logic is correctly implemented across all code paths, and e2e tests validate the expected behavior. The changes are well-scoped and don't introduce breaking changes or risky refactoring.
- No files require special attention
<sub>Last reviewed commit: 9509c07</sub>
<!-- greptile_other_comments_section -->
<!-- /greptile_comment -->
Most Similar PRs
#21558: config: support agents.list[].thinkingDefault
by Uarmagan · 2026-02-20
89.1%
#15030: Agents: support per-agent thinking defaults
by sauerdaniel · 2026-02-12
88.7%
#18695: feat(agents): add per-agent thinkingDefault override
by cathrynlavery · 2026-02-17
86.7%
#21959: feat(config): add per-agent thinkingDefault, heartbeat thinking ove...
by heyhudson · 2026-02-20
83.3%
#16399: feat: auto-escalate thinking level based on context window usage
by cmfinlan · 2026-02-14
79.3%
#19329: feat: add per-agent compaction and context pruning overrides
by curtismercier · 2026-02-17
78.3%
#16298: feat(xai): switch grok-4-1-fast variants by thinking level
by avirweb · 2026-02-14
78.0%
#20458: feat: per-model thinkingDefault config and /think default directive
by kmixter · 2026-02-18
77.7%
#14640: feat(agents): support per-agent temperature and maxTokens in agents...
by lailoo · 2026-02-12
77.3%
#10998: fix(agents): pass session thinking/reasoning levels to session_stat...
by wony2 · 2026-02-07
76.3%