Detailed changes
@@ -13,8 +13,9 @@ require (
github.com/charlievieth/fastwalk v1.0.14
github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e
- github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5
+ github.com/charmbracelet/catwalk v0.6.5-0.20251010111259-a1bafd2530bb
github.com/charmbracelet/fang v0.4.2
+ github.com/charmbracelet/fantasy v0.0.0-20251003071236-5d39f0348e5d
github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706
@@ -46,8 +47,6 @@ require (
mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
)
-require github.com/charmbracelet/fantasy v0.0.0-20251003071236-5d39f0348e5d
-
require (
cloud.google.com/go v0.116.0 // indirect
cloud.google.com/go/auth v0.9.3 // indirect
@@ -45,8 +45,8 @@ github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e h1:4BBnKWFwJ5FLyhw/ijFxKE04i9rubr8WIPR1kjO57iA=
github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e/go.mod h1:F7AfLKYQqpM3NNBVs7ctW417tavhvoh9SBjsgtwpzbY=
-github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5 h1:d/Gs0/fQoe4fJ7wnu7C1oA72C5KkTmacbXLN86EeqqE=
-github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
+github.com/charmbracelet/catwalk v0.6.5-0.20251010111259-a1bafd2530bb h1:1dANrQJF+y+irksWTqd4dvN91JP7e/gdYZscef3PxkY=
+github.com/charmbracelet/catwalk v0.6.5-0.20251010111259-a1bafd2530bb/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
github.com/charmbracelet/fang v0.4.2 h1:nWr7Tb82/TTNNGMGG35aTZ1X68loAOQmpb0qxkKXjas=
@@ -563,7 +563,7 @@ func (c *ProviderConfig) TestConnection(resolver VariableResolver) error {
testURL = baseURL + "/models"
headers["x-api-key"] = apiKey
headers["anthropic-version"] = "2023-06-01"
- case catwalk.TypeGemini:
+ case catwalk.TypeGoogle:
baseURL, _ := resolver.ResolveValue(c.BaseURL)
if baseURL == "" {
baseURL = "https://generativelanguage.googleapis.com"
@@ -282,12 +282,6 @@ func (c *Config) configureProviders(env env.Env, resolver VariableResolver, know
c.Providers.Del(id)
continue
}
- if providerConfig.Type != catwalk.TypeOpenAI && providerConfig.Type != catwalk.TypeAnthropic && providerConfig.Type != catwalk.TypeGemini {
- slog.Warn("Skipping custom provider because the provider type is not supported", "provider", id, "type", providerConfig.Type)
- c.Providers.Del(id)
- continue
- }
-
apiKey, err := resolver.ResolveValue(providerConfig.APIKey)
if apiKey == "" || err != nil {
slog.Warn("Provider is missing API key, this might be OK for local providers", "provider", id)
@@ -326,7 +326,7 @@ func (c *commandDialogCmp) defaultCommands() []Command {
}
// OpenAI models: reasoning effort dialog
- if model.HasReasoningEffort {
+ if len(model.ReasoningLevels) > 0 {
commands = append(commands, Command{
ID: "select_reasoning_effort",
Title: "Select Reasoning Effort",
@@ -151,7 +151,7 @@ func (m *ModelListComponent) SetModelType(modelType int) tea.Cmd {
ContextWindow: model.ContextWindow,
DefaultMaxTokens: model.DefaultMaxTokens,
CanReason: model.CanReason,
- HasReasoningEffort: model.HasReasoningEffort,
+ ReasoningLevels: model.ReasoningLevels,
DefaultReasoningEffort: model.DefaultReasoningEffort,
SupportsImages: model.SupportsImages,
}
@@ -5,6 +5,8 @@ import (
"github.com/charmbracelet/bubbles/v2/key"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/lipgloss/v2"
+ "golang.org/x/text/cases"
+ "golang.org/x/text/language"
"github.com/charmbracelet/crush/internal/config"
"github.com/charmbracelet/crush/internal/tui/components/core"
@@ -130,19 +132,13 @@ func (r *reasoningDialogCmp) populateEffortOptions() tea.Cmd {
currentEffort = model.DefaultReasoningEffort
}
- efforts := []EffortOption{
- {
- Title: "Low",
- Effort: "low",
- },
- {
- Title: "Medium",
- Effort: "medium",
- },
- {
- Title: "High",
- Effort: "high",
- },
+ efforts := []EffortOption{}
+ caser := cases.Title(language.Und)
+ for _, level := range model.ReasoningLevels {
+ efforts = append(efforts, EffortOption{
+ Title: caser.String(level),
+ Effort: level,
+ })
}
effortItems := []list.CompletionItem[EffortOption]{}
@@ -563,7 +563,7 @@ func (p *chatPage) openReasoningDialog() tea.Cmd {
model := cfg.GetModelByType(agentCfg.Model)
providerCfg := cfg.GetProviderForModel(agentCfg.Model)
- if providerCfg != nil && model != nil && model.HasReasoningEffort {
+ if providerCfg != nil && model != nil && len(model.ReasoningLevels) > 0 {
// Return the OpenDialogMsg directly so it bubbles up to the main TUI
return dialogs.OpenDialogMsg{
Model: reasoning.NewReasoningDialog(),