diff --git a/litellm/router.py b/litellm/router.py index 01089f98d5..9099371c66 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -6806,6 +6806,19 @@ class Router: **deployment.litellm_params.model_dump(exclude_none=True) ).model_dump(exclude_none=True) + # Resolve litellm_credential_name to actual credentials + if deployment.litellm_params.litellm_credential_name is not None: + credential_values = CredentialAccessor.get_credential_values( + deployment.litellm_params.litellm_credential_name + ) + if not credential_values: + verbose_router_logger.warning( + f"Credential '{deployment.litellm_params.litellm_credential_name}' not found in credential_list" + ) + credentials.update(credential_values) + # Remove the credential name since we've resolved it + credentials.pop("litellm_credential_name", None) + # Add custom_llm_provider if deployment.litellm_params.custom_llm_provider: credentials[ diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 01626aabfa..af2bf437f1 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -1726,6 +1726,54 @@ def test_get_deployment_credentials_with_provider_aws_bedrock_runtime_endpoint() assert credentials["custom_llm_provider"] == "bedrock" +def test_get_deployment_credentials_with_provider_resolves_credential_name(): + """ + Test that get_deployment_credentials_with_provider correctly resolves + litellm_credential_name to actual credential values (for UI-created models). + """ + from litellm.types.utils import CredentialItem + + # Setup credential list with a test credential + litellm.credential_list = [ + CredentialItem( + credential_name="test-azure-cred", + credential_info={"custom_llm_provider": "azure"}, + credential_values={ + "api_key": "resolved-api-key", + "api_base": "https://resolved.openai.azure.com", + "api_version": "2024-02-01" + } + ) + ] + + router = litellm.Router( + model_list=[ + { + "model_name": "azure-gpt-4", + "litellm_params": { + "model": "azure/gpt-4", + "litellm_credential_name": "test-azure-cred", + }, + } + ], + ) + + credentials = router.get_deployment_credentials_with_provider( + model_id="azure-gpt-4" + ) + + assert credentials is not None + assert credentials["api_key"] == "resolved-api-key" + assert credentials["api_base"] == "https://resolved.openai.azure.com" + assert credentials["api_version"] == "2024-02-01" + assert credentials["custom_llm_provider"] == "azure" + # Ensure credential name is removed after resolution + assert "litellm_credential_name" not in credentials + + # Cleanup + litellm.credential_list = [] + + def test_get_available_guardrail_single_deployment(): """ Test get_available_guardrail returns the single guardrail when only one exists.