on main help sign in
fix: decouple thinking/reasoning from provider type (#2032)

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

commitde64b00392249ff77ab1a178234ab4e223f11fa6 authorCarlos Alexandro Becker <caarlos0@users.noreply.github.com> dateWed 28 Jan 2026, 14:35 (9 months ago) parent5011ba2
4 files changed+6−15
internal/tui/components/chat/sidebar/sidebar.go+2−5 internal/tui/components/dialogs/commands/commands.go+1−3 internal/ui/dialog/commands.go+1−3 internal/ui/model/sidebar.go+2−4
internal/tui/components/chat/sidebar/sidebar.go+2−5
@@ -8,7 +8,6 @@ import (
88
99 tea "charm.land/bubbletea/v2"
1010 "charm.land/lipgloss/v2"
11− "github.com/charmbracelet/catwalk/pkg/catwalk"
1211 "github.com/charmbracelet/crush/internal/config"
1312 "github.com/charmbracelet/crush/internal/csync"
1413 "github.com/charmbracelet/crush/internal/diff"
@@ -548,7 +547,6 @@ func (s *sidebarCmp) currentModelBlock() string {
548547 selectedModel := cfg.Models[agentCfg.Model]
549548
550549 model := config.Get().GetModelByType(agentCfg.Model)
551− modelProvider := config.Get().GetProviderForModel(agentCfg.Model)
552550
553551 t := styles.CurrentTheme()
554552
@@ -560,15 +558,14 @@ func (s *sidebarCmp) currentModelBlock() string {
560558 }
561559 if model.CanReason {
562560 reasoningInfoStyle := t.S().Subtle.PaddingLeft(2)
563− switch modelProvider.Type {
564− case catwalk.TypeAnthropic:
561+ if len(model.ReasoningLevels) == 0 {
565562 formatter := cases.Title(language.English, cases.NoLower)
566563 if selectedModel.Think {
567564 parts = append(parts, reasoningInfoStyle.Render(formatter.String("Thinking on")))
568565 } else {
569566 parts = append(parts, reasoningInfoStyle.Render(formatter.String("Thinking off")))
570567 }
571− default:
568+ } else {
572569 reasoningEffort := model.DefaultReasoningEffort
573570 if selectedModel.ReasoningEffort != "" {
574571 reasoningEffort = selectedModel.ReasoningEffort
internal/tui/components/dialogs/commands/commands.go+1−3
@@ -10,10 +10,8 @@ import (
1010 "charm.land/bubbles/v2/key"
1111 tea "charm.land/bubbletea/v2"
1212 "charm.land/lipgloss/v2"
13− "github.com/charmbracelet/catwalk/pkg/catwalk"
1413
1514 "github.com/charmbracelet/crush/internal/agent"
16− "github.com/charmbracelet/crush/internal/agent/hyper"
1715 "github.com/charmbracelet/crush/internal/agent/tools/mcp"
1816 "github.com/charmbracelet/crush/internal/config"
1917 "github.com/charmbracelet/crush/internal/csync"
@@ -364,7 +362,7 @@ func (c *commandDialogCmp) defaultCommands() []Command {
364362 selectedModel := cfg.Models[agentCfg.Model]
365363
366364 // Anthropic models: thinking toggle
367− if providerCfg.Type == catwalk.TypeAnthropic || providerCfg.Type == catwalk.Type(hyper.Name) {
365+ if model.CanReason && len(model.ReasoningLevels) == 0 {
368366 status := "Enable"
369367 if selectedModel.Think {
370368 status = "Disable"
internal/ui/dialog/commands.go+1−3
@@ -9,8 +9,6 @@ import (
99 "charm.land/bubbles/v2/spinner"
1010 "charm.land/bubbles/v2/textinput"
1111 tea "charm.land/bubbletea/v2"
12− "github.com/charmbracelet/catwalk/pkg/catwalk"
13− "github.com/charmbracelet/crush/internal/agent/hyper"
1412 "github.com/charmbracelet/crush/internal/commands"
1513 "github.com/charmbracelet/crush/internal/config"
1614 "github.com/charmbracelet/crush/internal/ui/common"
@@ -405,7 +403,7 @@ func (c *Commands) defaultCommands() []*CommandItem {
405403 selectedModel := cfg.Models[agentCfg.Model]
406404
407405 // Anthropic models: thinking toggle
408− if providerCfg.Type == catwalk.TypeAnthropic || providerCfg.Type == catwalk.Type(hyper.Name) {
406+ if model.CanReason && len(model.ReasoningLevels) == 0 {
409407 status := "Enable"
410408 if selectedModel.Think {
411409 status = "Disable"
internal/ui/model/sidebar.go+2−4
@@ -5,7 +5,6 @@ import (
55 "fmt"
66
77 "charm.land/lipgloss/v2"
8− "github.com/charmbracelet/catwalk/pkg/catwalk"
98 "github.com/charmbracelet/crush/internal/ui/common"
109 "github.com/charmbracelet/crush/internal/ui/logo"
1110 uv "github.com/charmbracelet/ultraviolet"
@@ -28,14 +27,13 @@ func (m *UI) modelInfo(width int) string {
2827
2928 // Only check reasoning if model can reason
3029 if model.CatwalkCfg.CanReason {
31− switch providerConfig.Type {
32− case catwalk.TypeAnthropic:
30+ if model.ModelCfg.ReasoningEffort == "" {
3331 if model.ModelCfg.Think {
3432 reasoningInfo = "Thinking On"
3533 } else {
3634 reasoningInfo = "Thinking Off"
3735 }
38− default:
36+ } else {
3937 formatter := cases.Title(language.English, cases.NoLower)
4038 reasoningEffort := cmp.Or(model.ModelCfg.ReasoningEffort, model.CatwalkCfg.DefaultReasoningEffort)
4139 reasoningInfo = formatter.String(fmt.Sprintf("Reasoning %s", reasoningEffort))