fix(proxy): keep the token's team model list in the websocket passthrough gate without a database

This commit is contained in:
mateo-berri 2026-09-04 19:05:35 -07:00
parent 7351911b53
commit 2a7fc8de01
3 changed files with 15 additions and 6 deletions

View file

@ -4164,7 +4164,7 @@ async def enforced_model_allowlists(
"""One model allowlist per level that ``common_checks`` enforces on a request from this identity."""
key_models: Final = _resolve_key_models_for_auth_check(valid_token=valid_token)
if prisma_client is None:
return (key_models,)
return (key_models, tuple(valid_token.team_models or ()))
team_object: Final = (
None
if valid_token.team_id is None

View file

@ -7392,7 +7392,13 @@ async def test_enforced_model_allowlists_reads_every_level_from_cache():
proxy_logging_obj=proxy_logging_obj,
)
without_database = await enforced_model_allowlists(
valid_token=UserAPIKeyAuth(token="hashed-fake", models=["gpt-4o"], user_id="user-fake", team_id="team-fake"),
valid_token=UserAPIKeyAuth(
token="hashed-fake",
models=["gpt-4o"],
team_models=["gpt-4o-mini"],
user_id="user-fake",
team_id="team-fake",
),
prisma_client=None,
user_api_key_cache=cache,
proxy_logging_obj=proxy_logging_obj,
@ -7406,4 +7412,4 @@ async def test_enforced_model_allowlists_reads_every_level_from_cache():
["gpt-4.1"],
]
assert [list(scope) for scope in personal] == [[], [], [], ["o3"], []]
assert [list(scope) for scope in without_database] == [["gpt-4o"]]
assert [list(scope) for scope in without_database] == [["gpt-4o"], ["gpt-4o-mini"]]

View file

@ -14,6 +14,7 @@ from litellm.proxy._types import UserAPIKeyAuth
from litellm.proxy.pass_through_endpoints.llm_passthrough_endpoints import (
_OPENAI_WS_DISABLED_REFUSAL,
_OPENAI_WS_MODEL_RESTRICTED_REFUSAL,
_has_model_restrictions,
_openai_websocket_refusal,
_proxy_model_allowlists,
openai_websocket_proxy_route,
@ -288,8 +289,10 @@ async def test_openai_websocket_allows_unrestricted_identities(scopes):
@pytest.mark.asyncio
async def test_proxy_model_allowlists_reads_the_key_scope_without_a_database():
async def test_proxy_model_allowlists_reads_the_token_scopes_without_a_database():
token: Final = UserAPIKeyAuth(models=[], team_id="team-fake", team_models=["gpt-4o"])
with patch("litellm.proxy.proxy_server.prisma_client", None):
scopes = await _proxy_model_allowlists()(UserAPIKeyAuth(models=["gpt-4o"]))
scopes = await _proxy_model_allowlists()(token)
assert tuple(tuple(scope) for scope in scopes) == (("gpt-4o",),)
assert tuple(tuple(scope) for scope in scopes) == ((), ("gpt-4o",))
assert _has_model_restrictions(scopes)