Davemaina1/iroh_ locks to Anthropic-only, gates extended thinking to Opus
Two commits remove multi-provider routing entirely and replace the model picker with a Quick/Deep/Draft mode selector. If you're evaluating this fork, the provider lock is the defining constraint to know about upfront.
The cleanup in 1f973e7d operates at every layer. gemini.ts gets @ts-nocheck and a throw at the top of both streamGemini and completeGeminiText - dead code kept in place but never reachable. llm/index.ts removes the providerForModel dispatch and replaces it with a toClaudeParams() helper that coerces any non-Claude model to QUICK_MODEL and nulls out user-supplied API keys (the backend uses process.env.ANTHROPIC_API_KEY instead). chatTools.ts does the same with a model.startsWith("claude") check. userSettings.ts drops the Gemini branch from resolveTitleModel.
Three model constants live in backend/src/lib/llm/models.ts:
QUICK_MODEL = "claude-haiku-4-5-20251001"DEEP_MODEL = "claude-opus-4-7"DRAFT_MODEL = "claude-opus-4-7"
A modeToModel() helper maps "deep" and "draft" to Opus, everything else to Haiku. The frontend swaps the ModelToggle dropdown for a ModeToggle 3-button segment (quick/deep/draft), with a useSelectedMode hook and a mode field on MikeMessage. The account models page is replaced with an Iroh notice. Draft mode injects DRAFT_SYSTEM_PROMPT_EXTRA into the system prompt and skips getUserApiKeys.
4fbd7517 gates extended thinking. Haiku and Sonnet reject the thinking parameter - only Opus supports it. The fix is selectedModel.startsWith("claude-opus") in chatTools.ts, and a secondary guard in claude.ts that checks both the enableThinking flag and the model name before passing thinking: { type: "adaptive" } and output_config: { effort: "high" }. The stream.on("thinking") listener is also gated the same way.
The Opus-thinking guard is a real hardening that applies regardless of whether you use Davemaina1's mode system. The ModeToggle UX is cleaner than a raw model picker for most legal-AI users. But both come packaged with the single-vendor lock: user API keys are bypassed at the toClaudeParams layer, so there's no path to swap providers without reworking llm/index.ts.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?