Improved wildcard route handling on /models and /model_group/info (#8473)

* fix(model_checks.py): update returning known model from wildcard to filter based on given model prefix

ensures wildcard route - `vertex_ai/gemini-*` just returns known vertex_ai/gemini- models

* test(test_proxy_utils.py): add unit testing for new 'get_known_models_from_wildcard' helper

* test(test_models.py): add e2e testing for `/model_group/info` endpoint

* feat(prometheus.py): support tracking total requests by user_email on prometheus

adds initial support for tracking total requests by user_email

* test(test_prometheus.py): add testing to ensure user email is always tracked

* test: update testing for new prometheus metric

* test(test_prometheus_unit_tests.py): add user email to total proxy metric

* test: update tests

* test: fix spend tests

* test: fix test

* fix(pagerduty.py): fix linting error
This commit is contained in:
Krish Dholakia 2025-02-11 19:37:43 -08:00 committed by GitHub
parent 5e58ae0347
commit 57e5ec07cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 190 additions and 38 deletions

View file

@ -17,16 +17,8 @@ def _check_wildcard_routing(model: str) -> bool:
- openai/*
- *
"""
if model == "*":
if "*" in model:
return True
if "/" in model:
llm_provider, potential_wildcard = model.split("/", 1)
if (
llm_provider in litellm.provider_list and potential_wildcard == "*"
): # e.g. anthropic/*
return True
return False
@ -156,6 +148,28 @@ def get_complete_model_list(
return list(unique_models) + all_wildcard_models
def get_known_models_from_wildcard(wildcard_model: str) -> List[str]:
try:
provider, model = wildcard_model.split("/", 1)
except ValueError: # safely fail
return []
# get all known provider models
wildcard_models = get_provider_models(provider=provider)
if wildcard_models is None:
return []
if model == "*":
return wildcard_models or []
else:
model_prefix = model.replace("*", "")
filtered_wildcard_models = [
wc_model
for wc_model in wildcard_models
if wc_model.split("/")[1].startswith(model_prefix)
]
return filtered_wildcard_models
def _get_wildcard_models(
unique_models: Set[str], return_wildcard_routes: Optional[bool] = False
) -> List[str]:
@ -165,13 +179,13 @@ def _get_wildcard_models(
if _check_wildcard_routing(model=model):
if (
return_wildcard_routes is True
return_wildcard_routes
): # will add the wildcard route to the list eg: anthropic/*.
all_wildcard_models.append(model)
provider = model.split("/")[0]
# get all known provider models
wildcard_models = get_provider_models(provider=provider)
wildcard_models = get_known_models_from_wildcard(wildcard_model=model)
if wildcard_models is not None:
models_to_remove.add(model)
all_wildcard_models.extend(wildcard_models)