on main help sign in
fix: decouple thinking/reasoning from provider type (#2032)
de64b00Carlos Alexandro Becker
internal/tui/components/chat/sidebar/sidebar.go+2−5
@@ -8,7 +8,6 @@ import (
8
8
9 tea "charm.land/bubbletea/v2"
9 tea "charm.land/bubbletea/v2"
10 "charm.land/lipgloss/v2"
10 "charm.land/lipgloss/v2"
11− "github.com/charmbracelet/catwalk/pkg/catwalk"
12 "github.com/charmbracelet/crush/internal/config"
11 "github.com/charmbracelet/crush/internal/config"
13 "github.com/charmbracelet/crush/internal/csync"
12 "github.com/charmbracelet/crush/internal/csync"
14 "github.com/charmbracelet/crush/internal/diff"
13 "github.com/charmbracelet/crush/internal/diff"
@@ -548,7 +547,6 @@ func (s *sidebarCmp) currentModelBlock() string {
548 selectedModel := cfg.Models[agentCfg.Model]
547 selectedModel := cfg.Models[agentCfg.Model]
549
548
550 model := config.Get().GetModelByType(agentCfg.Model)
549 model := config.Get().GetModelByType(agentCfg.Model)
551− modelProvider := config.Get().GetProviderForModel(agentCfg.Model)
552
550
553 t := styles.CurrentTheme()
551 t := styles.CurrentTheme()
554
552
@@ -560,15 +558,14 @@ func (s *sidebarCmp) currentModelBlock() string {
560 }
558 }
561 if model.CanReason {
559 if model.CanReason {
562 reasoningInfoStyle := t.S().Subtle.PaddingLeft(2)
560 reasoningInfoStyle := t.S().Subtle.PaddingLeft(2)
563− switch modelProvider.Type {
561+ if len(model.ReasoningLevels) == 0 {
564− case catwalk.TypeAnthropic:
565 formatter := cases.Title(language.English, cases.NoLower)
562 formatter := cases.Title(language.English, cases.NoLower)
566 if selectedModel.Think {
563 if selectedModel.Think {
567 parts = append(parts, reasoningInfoStyle.Render(formatter.String("Thinking on")))
564 parts = append(parts, reasoningInfoStyle.Render(formatter.String("Thinking on")))
568 } else {
565 } else {
569 parts = append(parts, reasoningInfoStyle.Render(formatter.String("Thinking off")))
566 parts = append(parts, reasoningInfoStyle.Render(formatter.String("Thinking off")))
570 }
567 }
571− default:
568+ } else {
572 reasoningEffort := model.DefaultReasoningEffort
569 reasoningEffort := model.DefaultReasoningEffort
573 if selectedModel.ReasoningEffort != "" {
570 if selectedModel.ReasoningEffort != "" {
574 reasoningEffort = selectedModel.ReasoningEffort
571 reasoningEffort = selectedModel.ReasoningEffort
internal/tui/components/dialogs/commands/commands.go+1−3
@@ -10,10 +10,8 @@ import (
10 "charm.land/bubbles/v2/key"
10 "charm.land/bubbles/v2/key"
11 tea "charm.land/bubbletea/v2"
11 tea "charm.land/bubbletea/v2"
12 "charm.land/lipgloss/v2"
12 "charm.land/lipgloss/v2"
13− "github.com/charmbracelet/catwalk/pkg/catwalk"
14
13
15 "github.com/charmbracelet/crush/internal/agent"
14 "github.com/charmbracelet/crush/internal/agent"
16− "github.com/charmbracelet/crush/internal/agent/hyper"
17 "github.com/charmbracelet/crush/internal/agent/tools/mcp"
15 "github.com/charmbracelet/crush/internal/agent/tools/mcp"
18 "github.com/charmbracelet/crush/internal/config"
16 "github.com/charmbracelet/crush/internal/config"
19 "github.com/charmbracelet/crush/internal/csync"
17 "github.com/charmbracelet/crush/internal/csync"
@@ -364,7 +362,7 @@ func (c *commandDialogCmp) defaultCommands() []Command {
364 selectedModel := cfg.Models[agentCfg.Model]
362 selectedModel := cfg.Models[agentCfg.Model]
365
363
366 // Anthropic models: thinking toggle
364 // Anthropic models: thinking toggle
367− if providerCfg.Type == catwalk.TypeAnthropic || providerCfg.Type == catwalk.Type(hyper.Name) {
365+ if model.CanReason && len(model.ReasoningLevels) == 0 {
368 status := "Enable"
366 status := "Enable"
369 if selectedModel.Think {
367 if selectedModel.Think {
370 status = "Disable"
368 status = "Disable"
internal/ui/dialog/commands.go+1−3
@@ -9,8 +9,6 @@ import (
9 "charm.land/bubbles/v2/spinner"
9 "charm.land/bubbles/v2/spinner"
10 "charm.land/bubbles/v2/textinput"
10 "charm.land/bubbles/v2/textinput"
11 tea "charm.land/bubbletea/v2"
11 tea "charm.land/bubbletea/v2"
12− "github.com/charmbracelet/catwalk/pkg/catwalk"
13− "github.com/charmbracelet/crush/internal/agent/hyper"
14 "github.com/charmbracelet/crush/internal/commands"
12 "github.com/charmbracelet/crush/internal/commands"
15 "github.com/charmbracelet/crush/internal/config"
13 "github.com/charmbracelet/crush/internal/config"
16 "github.com/charmbracelet/crush/internal/ui/common"
14 "github.com/charmbracelet/crush/internal/ui/common"
@@ -405,7 +403,7 @@ func (c *Commands) defaultCommands() []*CommandItem {
405 selectedModel := cfg.Models[agentCfg.Model]
403 selectedModel := cfg.Models[agentCfg.Model]
406
404
407 // Anthropic models: thinking toggle
405 // Anthropic models: thinking toggle
408− if providerCfg.Type == catwalk.TypeAnthropic || providerCfg.Type == catwalk.Type(hyper.Name) {
406+ if model.CanReason && len(model.ReasoningLevels) == 0 {
409 status := "Enable"
407 status := "Enable"
410 if selectedModel.Think {
408 if selectedModel.Think {
411 status = "Disable"
409 status = "Disable"
internal/ui/model/sidebar.go+2−4
@@ -5,7 +5,6 @@ import (
5 "fmt"
5 "fmt"
6
6
7 "charm.land/lipgloss/v2"
7 "charm.land/lipgloss/v2"
8− "github.com/charmbracelet/catwalk/pkg/catwalk"
9 "github.com/charmbracelet/crush/internal/ui/common"
8 "github.com/charmbracelet/crush/internal/ui/common"
10 "github.com/charmbracelet/crush/internal/ui/logo"
9 "github.com/charmbracelet/crush/internal/ui/logo"
11 uv "github.com/charmbracelet/ultraviolet"
10 uv "github.com/charmbracelet/ultraviolet"
@@ -28,14 +27,13 @@ func (m *UI) modelInfo(width int) string {
28
27
29 // Only check reasoning if model can reason
28 // Only check reasoning if model can reason
30 if model.CatwalkCfg.CanReason {
29 if model.CatwalkCfg.CanReason {
31− switch providerConfig.Type {
30+ if model.ModelCfg.ReasoningEffort == "" {
32− case catwalk.TypeAnthropic:
33 if model.ModelCfg.Think {
31 if model.ModelCfg.Think {
34 reasoningInfo = "Thinking On"
32 reasoningInfo = "Thinking On"
35 } else {
33 } else {
36 reasoningInfo = "Thinking Off"
34 reasoningInfo = "Thinking Off"
37 }
35 }
38− default:
36+ } else {
39 formatter := cases.Title(language.English, cases.NoLower)
37 formatter := cases.Title(language.English, cases.NoLower)
40 reasoningEffort := cmp.Or(model.ModelCfg.ReasoningEffort, model.CatwalkCfg.DefaultReasoningEffort)
38 reasoningEffort := cmp.Or(model.ModelCfg.ReasoningEffort, model.CatwalkCfg.DefaultReasoningEffort)
41 reasoningInfo = formatter.String(fmt.Sprintf("Reasoning %s", reasoningEffort))
39 reasoningInfo = formatter.String(fmt.Sprintf("Reasoning %s", reasoningEffort))