on main help sign in
chore: change reasoning effort
b3d2319kujtimiihoxha
go.mod+2−3
@@ -13,8 +13,9 @@ require (
13 github.com/charlievieth/fastwalk v1.0.14
13 github.com/charlievieth/fastwalk v1.0.14
14 github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
14 github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
15 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e
15 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e
16− github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5
16+ github.com/charmbracelet/catwalk v0.6.5-0.20251010111259-a1bafd2530bb
17 github.com/charmbracelet/fang v0.4.2
17 github.com/charmbracelet/fang v0.4.2
18+ github.com/charmbracelet/fantasy v0.0.0-20251003071236-5d39f0348e5d
18 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
19 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
19 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
20 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
20 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
21 github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
@@ -46,8 +47,6 @@ require (
46 mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
47 mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
47)
48)
48
49
49−require github.com/charmbracelet/fantasy v0.0.0-20251003071236-5d39f0348e5d
50−
51require (
50require (
52 cloud.google.com/go v0.116.0 // indirect
51 cloud.google.com/go v0.116.0 // indirect
53 cloud.google.com/go/auth v0.9.3 // indirect
52 cloud.google.com/go/auth v0.9.3 // indirect
go.sum+2−2
@@ -45,8 +45,8 @@ github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
45github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
45github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
46github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e h1:4BBnKWFwJ5FLyhw/ijFxKE04i9rubr8WIPR1kjO57iA=
46github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e h1:4BBnKWFwJ5FLyhw/ijFxKE04i9rubr8WIPR1kjO57iA=
47github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e/go.mod h1:F7AfLKYQqpM3NNBVs7ctW417tavhvoh9SBjsgtwpzbY=
47github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e/go.mod h1:F7AfLKYQqpM3NNBVs7ctW417tavhvoh9SBjsgtwpzbY=
48−github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5 h1:d/Gs0/fQoe4fJ7wnu7C1oA72C5KkTmacbXLN86EeqqE=
48+github.com/charmbracelet/catwalk v0.6.5-0.20251010111259-a1bafd2530bb h1:1dANrQJF+y+irksWTqd4dvN91JP7e/gdYZscef3PxkY=
49−github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
49+github.com/charmbracelet/catwalk v0.6.5-0.20251010111259-a1bafd2530bb/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
50github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
50github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
51github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
51github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
52github.com/charmbracelet/fang v0.4.2 h1:nWr7Tb82/TTNNGMGG35aTZ1X68loAOQmpb0qxkKXjas=
52github.com/charmbracelet/fang v0.4.2 h1:nWr7Tb82/TTNNGMGG35aTZ1X68loAOQmpb0qxkKXjas=
internal/config/config.go+1−1
@@ -563,7 +563,7 @@ func (c *ProviderConfig) TestConnection(resolver VariableResolver) error {
563 testURL = baseURL + "/models"
563 testURL = baseURL + "/models"
564 headers["x-api-key"] = apiKey
564 headers["x-api-key"] = apiKey
565 headers["anthropic-version"] = "2023-06-01"
565 headers["anthropic-version"] = "2023-06-01"
566− case catwalk.TypeGemini:
566+ case catwalk.TypeGoogle:
567 baseURL, _ := resolver.ResolveValue(c.BaseURL)
567 baseURL, _ := resolver.ResolveValue(c.BaseURL)
568 if baseURL == "" {
568 if baseURL == "" {
569 baseURL = "https://generativelanguage.googleapis.com"
569 baseURL = "https://generativelanguage.googleapis.com"
internal/config/load.go−6
@@ -282,12 +282,6 @@ func (c *Config) configureProviders(env env.Env, resolver VariableResolver, know
282 c.Providers.Del(id)
282 c.Providers.Del(id)
283 continue
283 continue
284 }
284 }
285− if providerConfig.Type != catwalk.TypeOpenAI && providerConfig.Type != catwalk.TypeAnthropic && providerConfig.Type != catwalk.TypeGemini {
286− slog.Warn("Skipping custom provider because the provider type is not supported", "provider", id, "type", providerConfig.Type)
287− c.Providers.Del(id)
288− continue
289− }
290−
291 apiKey, err := resolver.ResolveValue(providerConfig.APIKey)
285 apiKey, err := resolver.ResolveValue(providerConfig.APIKey)
292 if apiKey == "" || err != nil {
286 if apiKey == "" || err != nil {
293 slog.Warn("Provider is missing API key, this might be OK for local providers", "provider", id)
287 slog.Warn("Provider is missing API key, this might be OK for local providers", "provider", id)
internal/tui/components/dialogs/commands/commands.go+1−1
@@ -326,7 +326,7 @@ func (c *commandDialogCmp) defaultCommands() []Command {
326 }
326 }
327
327
328 // OpenAI models: reasoning effort dialog
328 // OpenAI models: reasoning effort dialog
329− if model.HasReasoningEffort {
329+ if len(model.ReasoningLevels) > 0 {
330 commands = append(commands, Command{
330 commands = append(commands, Command{
331 ID: "select_reasoning_effort",
331 ID: "select_reasoning_effort",
332 Title: "Select Reasoning Effort",
332 Title: "Select Reasoning Effort",
internal/tui/components/dialogs/models/list.go+1−1
@@ -151,7 +151,7 @@ func (m *ModelListComponent) SetModelType(modelType int) tea.Cmd {
151 ContextWindow: model.ContextWindow,
151 ContextWindow: model.ContextWindow,
152 DefaultMaxTokens: model.DefaultMaxTokens,
152 DefaultMaxTokens: model.DefaultMaxTokens,
153 CanReason: model.CanReason,
153 CanReason: model.CanReason,
154− HasReasoningEffort: model.HasReasoningEffort,
154+ ReasoningLevels: model.ReasoningLevels,
155 DefaultReasoningEffort: model.DefaultReasoningEffort,
155 DefaultReasoningEffort: model.DefaultReasoningEffort,
156 SupportsImages: model.SupportsImages,
156 SupportsImages: model.SupportsImages,
157 }
157 }
internal/tui/components/dialogs/reasoning/reasoning.go+9−13
@@ -5,6 +5,8 @@ import (
5 "github.com/charmbracelet/bubbles/v2/key"
5 "github.com/charmbracelet/bubbles/v2/key"
6 tea "github.com/charmbracelet/bubbletea/v2"
6 tea "github.com/charmbracelet/bubbletea/v2"
7 "github.com/charmbracelet/lipgloss/v2"
7 "github.com/charmbracelet/lipgloss/v2"
8+ "golang.org/x/text/cases"
9+ "golang.org/x/text/language"
8
10
9 "github.com/charmbracelet/crush/internal/config"
11 "github.com/charmbracelet/crush/internal/config"
10 "github.com/charmbracelet/crush/internal/tui/components/core"
12 "github.com/charmbracelet/crush/internal/tui/components/core"
@@ -130,19 +132,13 @@ func (r *reasoningDialogCmp) populateEffortOptions() tea.Cmd {
130 currentEffort = model.DefaultReasoningEffort
132 currentEffort = model.DefaultReasoningEffort
131 }
133 }
132
134
133− efforts := []EffortOption{
135+ efforts := []EffortOption{}
134− {
136+ caser := cases.Title(language.Und)
135− Title: "Low",
137+ for _, level := range model.ReasoningLevels {
136− Effort: "low",
138+ efforts = append(efforts, EffortOption{
137− },
139+ Title: caser.String(level),
138− {
139− Title: "Medium",
140− Effort: "medium",
141− },
142− {
143− Title: "High",
144− Effort: "high",
140+ Effort: level,
145− },
141+ })
146 }
142 }
147
143
148 effortItems := []list.CompletionItem[EffortOption]{}
144 effortItems := []list.CompletionItem[EffortOption]{}
internal/tui/page/chat/chat.go+1−1
@@ -563,7 +563,7 @@ func (p *chatPage) openReasoningDialog() tea.Cmd {
563 model := cfg.GetModelByType(agentCfg.Model)
563 model := cfg.GetModelByType(agentCfg.Model)
564 providerCfg := cfg.GetProviderForModel(agentCfg.Model)
564 providerCfg := cfg.GetProviderForModel(agentCfg.Model)
565
565
566− if providerCfg != nil && model != nil && model.HasReasoningEffort {
566+ if providerCfg != nil && model != nil && len(model.ReasoningLevels) > 0 {
567 // Return the OpenDialogMsg directly so it bubbles up to the main TUI
567 // Return the OpenDialogMsg directly so it bubbles up to the main TUI
568 return dialogs.OpenDialogMsg{
568 return dialogs.OpenDialogMsg{
569 Model: reasoning.NewReasoningDialog(),
569 Model: reasoning.NewReasoningDialog(),