diff --git a/apps/backend/internal/agent/runtime/lifecycle/start_model.go b/apps/backend/internal/agent/runtime/lifecycle/start_model.go index 28d252be85..4965022913 100644 --- a/apps/backend/internal/agent/runtime/lifecycle/start_model.go +++ b/apps/backend/internal/agent/runtime/lifecycle/start_model.go @@ -140,6 +140,13 @@ func applyStartModelPolicy( decision.SetModelCalled = true if err := applier.SetModel(ctx, policy.Model); err != nil { if sessionmodel.IsMethodNotFound(err) { + if policy.AutoFallback { + log.Debug("agent does not support model selection, continuing on provider default", + zap.String("model", policy.Model), zap.Error(err)) + decision = providerDefaultDecision(state, policy, ModelSelectionReasonSelectionUnsupported) + decision.SetModelCalled = true + return decision, nil + } unsupported, unavailableErr := unavailableStartModel(state, policy, ModelSelectionReasonSelectionUnsupported) unsupported.SetModelCalled = true return unsupported, unavailableErr diff --git a/apps/backend/internal/agent/runtime/lifecycle/start_model_executor_authority_test.go b/apps/backend/internal/agent/runtime/lifecycle/start_model_executor_authority_test.go index 7faf00a833..0542413564 100644 --- a/apps/backend/internal/agent/runtime/lifecycle/start_model_executor_authority_test.go +++ b/apps/backend/internal/agent/runtime/lifecycle/start_model_executor_authority_test.go @@ -79,6 +79,16 @@ func TestApplyStartModelPolicyExecutorAuthority(t *testing.T) { wantCalls: []string{"requested"}, wantErr: `requested model "requested" is unavailable (reason: selection_unsupported)`, }, + { + name: "auto fallback allows unsupported model selection", + state: modelState("requested"), + policy: StartModelPolicy{Model: "requested", AutoFallback: true}, + applierErrors: []error{methodNotFoundErr()}, + wantCalls: []string{"requested"}, + wantOutcome: ModelSelectionOutcomeProviderDefault, + wantReason: ModelSelectionReasonSelectionUnsupported, + wantWarning: true, + }, { name: "auto fallback allows absent requested model", state: modelState("executor-default"),