diff --git a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py index 2a536b9ffd1..3731abe3134 100644 --- a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py +++ b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py @@ -50,6 +50,7 @@ from litellm.constants import ( from litellm.exceptions import BlockedPiiEntityError, GuardrailRaisedException from litellm.integrations.custom_guardrail import guardrail_request_data_with_streaming, is_guardrail_intervention from litellm.litellm_core_utils.aws_partition import get_aws_dns_suffix +from litellm.litellm_core_utils.get_llm_provider_logic import resolve_model_and_provider_for_metadata from litellm.llms.anthropic.common_utils import AnthropicModelInfo, merge_anthropic_beta_headers from litellm.llms.azure.passthrough.transformation import ( foreign_azure_deployment, @@ -3927,7 +3928,7 @@ def _vertex_upstream_model(deployment: DeploymentTypedDict) -> str | None: return None upstream: Final = litellm_params["model"] try: - _, provider, _, _ = litellm.get_llm_provider( + _, provider = resolve_model_and_provider_for_metadata( model=upstream, custom_llm_provider=litellm_params.get("custom_llm_provider") ) except litellm.exceptions.BadRequestError: diff --git a/tests/unit/proxy/pass_through_endpoints/test_pass_through_endpoints.py b/tests/unit/proxy/pass_through_endpoints/test_pass_through_endpoints.py index 6452b6c7ccf..8bd2106e8cd 100644 --- a/tests/unit/proxy/pass_through_endpoints/test_pass_through_endpoints.py +++ b/tests/unit/proxy/pass_through_endpoints/test_pass_through_endpoints.py @@ -12,6 +12,7 @@ from contextlib import ExitStack, contextmanager from dataclasses import dataclass from datetime import datetime from io import BytesIO +from pathlib import Path from types import MappingProxyType, ModuleType, SimpleNamespace from typing import Final, Optional, cast from unittest.mock import AsyncMock, MagicMock, patch @@ -8055,6 +8056,35 @@ async def test_vertex_live_full_path_whose_every_name_is_taken_by_another_model_ assert (_policy_close_reason(websocket) is None) is reaches_vertex +@pytest.mark.asyncio +async def test_vertex_live_setup_frame_never_refreshes_the_token_of_a_chatgpt_group_on_the_same_proxy( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +): + (tmp_path / "auth.json").write_text( + json.dumps({"access_token": "expired", "refresh_token": "refresh", "expires_at": 0}) + ) + monkeypatch.setenv("CHATGPT_TOKEN_DIR", str(tmp_path)) + monkeypatch.delenv("CHATGPT_AUTH_FILE", raising=False) + llm_router: Final = litellm.Router( + model_list=[ + {"model_name": "codex", "litellm_params": {"model": "chatgpt/gpt-5.4"}}, + {"model_name": "native-audio", "litellm_params": {"model": f"vertex_ai/{VERTEX_LIVE_GROUP}"}}, + ] + ) + + with respx.mock(assert_all_called=False) as transport: + outbound: Final = transport.route().respond(500) + websocket, upstream_ws = await _run_vertex_live_gated_passthrough( + [_setup_frame("native-audio")], + UserAPIKeyAuth(token="hashed", models=["native-audio"]), + llm_router=llm_router, + ) + + assert not outbound.called + upstream_ws.send.assert_awaited_once() + assert _policy_close_reason(websocket) is None + + @pytest.mark.asyncio @pytest.mark.parametrize( "valid_token",