@@ -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.
2222type 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).
3940type 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.
101103func 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.
196201func 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 }
0 commit comments