diff --git a/engine/selection.go b/engine/selection.go index 0e0398d..11c3850 100644 --- a/engine/selection.go +++ b/engine/selection.go @@ -22,11 +22,13 @@ func (e *Engine) EffectiveSelection(ctx context.Context, opts SelectionOptions) active := e.ActiveSelection(ctx) provider := NormalizeProviderID(active.Provider) model := strings.TrimSpace(active.Model) + hasProviderOverride := false if override := NormalizeProviderID(opts.ProviderOverride); override != "" { if override != provider && strings.TrimSpace(opts.ModelOverride) == "" { model = "" } provider = override + hasProviderOverride = true } if override := strings.TrimSpace(opts.ModelOverride); override != "" { model = override @@ -53,7 +55,7 @@ func (e *Engine) EffectiveSelection(ctx context.Context, opts SelectionOptions) if provider == "" && hasConfigured { provider = preferredConfiguredGateway(gateways, configured) } - if provider != "" && hasConfigured && !configured[provider] { + if provider != "" && hasConfigured && !configured[provider] && !hasProviderOverride { provider = preferredConfiguredGateway(gateways, configured) model = "" } diff --git a/engine/selection_contract_test.go b/engine/selection_contract_test.go index 3f4aea7..0bedbc2 100644 --- a/engine/selection_contract_test.go +++ b/engine/selection_contract_test.go @@ -63,6 +63,29 @@ func TestEffectiveSelectionClearsModelWhenProviderOverrideChanges(t *testing.T) } } +func TestEffectiveSelectionPreservesUnconfiguredProviderOverride(t *testing.T) { + ctx := context.Background() + store := &credentials.MapStore{} + if err := store.Set(ctx, credentials.AccountForEnv("CLINE_API_KEY"), "cline-live-secret-1234567890"); err != nil { + t.Fatal(err) + } + eng, err := New(Options{SecretStore: store, StateDir: t.TempDir()}) + if err != nil { + t.Fatal(err) + } + + selection := eng.EffectiveSelection(ctx, SelectionOptions{ + ProviderOverride: "anthropic", + ModelOverride: catalog.ClaudeOpusV4_6, + }) + if selection.Provider != "anthropic" { + t.Fatalf("explicit provider override was replaced by a configured provider: %+v", selection) + } + if !selection.HasConfiguredDeployment { + t.Fatal("configured deployment state was lost while preserving the explicit override") + } +} + func TestCustomProviderOverrideDoesNotReuseOtherCustomModel(t *testing.T) { ctx := context.Background() eng, err := New(Options{