mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
ec89abd6e5
## Problem Title generation uses the same model the user selected for chat. This breaks when: 1. **Thinking/extended thinking models** — `ToolChoice: None` conflicts with extended thinking on Anthropic. The bare call has no thinking config, so provider-level defaults can conflict. 2. **Expensive models** — User picks `o3` or `claude-opus-4`, and a trivial 8-word title generation burns through tokens/cost unnecessarily. 3. **Provider quirks** — Different providers have different constraints around thinking mode + tool choice combinations. ## Solution Modeled after how `coder/mux` handles this with `NAME_GEN_PREFERRED_MODELS` + ordered candidate fallback: ### Phase 1: Candidate model list with fallback - New `TitleModelFunc` type returns an ordered list of candidate models - Tries `claude-haiku-4-5` → `gpt-4o-mini` → user's model - Gracefully skips unavailable candidates (missing API key, provider not configured) - Falls back to the user's chat model as last resort ### Phase 2: Provider-safe call options - Removed `ToolChoice: None` which conflicts with extended thinking on some providers - Added `MaxOutputTokens: 256` to cap token usage - Improved title prompt with verb-noun format guidance (`Fix sidebar layout`, `Add user authentication`) and explicit no-markdown/no-code-fences instructions ### Files changed - `coderd/chatd/title.go` — Candidate loop, improved prompt, safe call options - `coderd/chatd/chatd.go` — Build `TitleModelFunc` closure with lightweight candidates