From b601d8855b111069faf1d205f3bed322ed78f476 Mon Sep 17 00:00:00 2001 From: Milan Date: Thu, 19 Feb 2026 00:54:39 +0200 Subject: [PATCH 1/4] fix(router): resolve litellm_credential_name in get_deployment_credentials_with_provider When models are created via UI with pre-existing credentials, they use litellm_credential_name to reference credentials stored separately. The batch file upload endpoint uses get_deployment_credentials_with_provider() to retrieve model credentials, but this method was returning the credential reference name instead of resolving it to actual API keys and endpoints. This fix adds credential resolution using CredentialAccessor.get_credential_values() to ensure UI-created models work the same as YAML-configured models for batch file uploads and other passthrough endpoints. Fixes: Batch file uploads failing with 'Missing credentials' error for UI models --- litellm/router.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/litellm/router.py b/litellm/router.py index 4e268a94a2..52ada36abf 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -6750,6 +6750,13 @@ 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 + ) + credentials.update(credential_values) + # Add custom_llm_provider if deployment.litellm_params.custom_llm_provider: credentials[ From d80ae36e4a0bb421e99b979d5f93554696fb9855 Mon Sep 17 00:00:00 2001 From: Milan Date: Thu, 19 Feb 2026 17:21:01 +0200 Subject: [PATCH 2/4] test(router): add test for credential name resolution Add test to verify that get_deployment_credentials_with_provider correctly resolves litellm_credential_name to actual credential values and removes the credential name from the returned dictionary. --- tests/test_litellm/test_router.py | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 9dcb16b545..4108c82f79 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. From d477ddf59180277bff3eb325755387a2f5bd9649 Mon Sep 17 00:00:00 2001 From: Milan Date: Thu, 19 Feb 2026 17:40:23 +0200 Subject: [PATCH 3/4] trigger PR update From 83c88d5ab102960f12d88872a8055c23d0c01bcf Mon Sep 17 00:00:00 2001 From: Milan Date: Thu, 19 Feb 2026 18:09:19 +0200 Subject: [PATCH 4/4] fix(router): add warning log and cleanup for credential resolution - Add warning when credential name is not found in credential_list - Remove litellm_credential_name from credentials dict after resolution Addresses Greptile bot review comments on PR #21502 --- litellm/router.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/litellm/router.py b/litellm/router.py index 52ada36abf..865e060648 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -6755,7 +6755,13 @@ class Router: 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: