Skip to content

Commit dcda781

Browse files
committed
perf: update setting
1 parent fb4dfa4 commit dcda781

3 files changed

Lines changed: 21 additions & 14 deletions

File tree

internal/config/settings.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ type ProviderConfig struct {
2020
// Settings holds application-level configuration.
2121
// Fields use pointer types so unset fields fall back to defaults.
2222
type Settings struct {
23-
Model *string `json:"model,omitempty"` // "provider/model" e.g. "anthropic/claude-sonnet-4-6"
23+
Provider *string `json:"provider,omitempty"` // provider name (matches key in providers map)
24+
Model *string `json:"model,omitempty"` // model name sent to API as-is
2425
SmallModel *string `json:"small_model,omitempty"` // "provider/model" for explore sub-agent
2526
Providers map[string]*ProviderConfig `json:"providers,omitempty"`
2627

@@ -37,8 +38,8 @@ type Settings struct {
3738

3839
// Resolved holds settings resolved to concrete values (no pointers).
3940
type Resolved struct {
40-
Provider string // active provider name
41-
Model string // active model name (without provider prefix)
41+
Provider string // active provider name
42+
Model string // model name sent to API as-is
4243
Providers map[string]ProviderConfig // per-provider credentials
4344
SmallModel string // "provider/model" or ""
4445

@@ -98,8 +99,9 @@ func ParseModelID(id string) (provider, model string) {
9899
}
99100

100101
// FormatModelID combines provider and model into "provider/model".
102+
// If model already contains "/", it is returned as-is.
101103
func FormatModelID(provider, model string) string {
102-
if provider == "" {
104+
if provider == "" || strings.Contains(model, "/") {
103105
return model
104106
}
105107
return provider + "/" + model
@@ -115,8 +117,11 @@ func (s Settings) Resolve() Resolved {
115117
ThinkingLevel: "low",
116118
MaxTurns: 30,
117119
}
120+
if s.Provider != nil && *s.Provider != "" {
121+
r.Provider = *s.Provider
122+
}
118123
if s.Model != nil {
119-
r.Provider, r.Model = ParseModelID(*s.Model)
124+
r.Model = *s.Model
120125
}
121126
if s.SmallModel != nil {
122127
r.SmallModel = *s.SmallModel
@@ -194,6 +199,9 @@ func LoadSettings(cwd string) Resolved {
194199

195200
// mergeSettings merges two Settings; non-nil fields in override take precedence.
196201
func mergeSettings(base, override Settings) Settings {
202+
if override.Provider != nil {
203+
base.Provider = override.Provider
204+
}
197205
if override.Model != nil {
198206
base.Model = override.Model
199207
}

internal/config/setup.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,13 @@ func RunSetup(cwd string, settings Resolved, listModels ModelLister) error {
7272
}
7373

7474
s := Settings{
75+
Provider: &prov,
7576
Providers: map[string]*ProviderConfig{prov: pc},
7677
}
77-
if model != "" {
78-
modelID := FormatModelID(prov, model)
79-
s.Model = &modelID
80-
} else {
81-
modelID := FormatModelID(prov, DefaultModelName(prov))
82-
s.Model = &modelID
78+
if model == "" {
79+
model = DefaultModelName(prov)
8380
}
81+
s.Model = &model
8482

8583
if err := SaveSettings(cwd, s); err != nil {
8684
return fmt.Errorf("save settings: %w", err)

settings.example.jsonc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
2-
// Format: "provider/model". Providers: anthropic, openai, gemini
3-
"model": "anthropic/claude-sonnet-4-6",
4-
"small_model": "anthropic/claude-haiku-4-5", // for SubAgents; empty = same as main
2+
// Providers: anthropic, openai, gemini
3+
"provider": "anthropic",
4+
"model": "claude-sonnet-4-6",
5+
"small_model": "claude-haiku-4-5", // for SubAgents; empty = same as main
56

67
// Per-provider credentials. Only configure the ones you use.
78
"providers": {

0 commit comments

Comments
 (0)