diff --git a/src/rotator_library/routing_policy.py b/src/rotator_library/routing_policy.py index 4d1410d1..77d00c5e 100644 --- a/src/rotator_library/routing_policy.py +++ b/src/rotator_library/routing_policy.py @@ -45,7 +45,9 @@ def __init__( self.model_overrides = model_overrides self.available_providers = set(available_providers) - self.known_providers = set(known_providers or self.available_providers) + # A provider is valid for config validation if it has credentials, + # a loaded plugin, or both. + self.known_providers = self.available_providers | set(known_providers or ()) self.provider_models = provider_models or {} self.rng = rng or random.Random() self._validate() diff --git a/tests/test_routing_policy.py b/tests/test_routing_policy.py index 0e904b53..4bcb7069 100644 --- a/tests/test_routing_policy.py +++ b/tests/test_routing_policy.py @@ -119,6 +119,16 @@ def test_provider_model_mismatch_fails_validation_when_models_are_known(): ) +def test_provider_in_available_providers_remains_known_when_plugins_differ(): + policy = RoutingPolicy( + model_overrides={}, + available_providers={"ollama", "chutes"}, + known_providers={"opencode_go"}, + ) + + assert policy.known_providers == {"ollama", "chutes", "opencode_go"} + + def test_weighted_override_rewrites_qwen3_5_to_allowed_provider(): policy = RoutingPolicy( model_overrides={