From a78ae0f99b0816d83714b87d2bdd4c906ea61324 Mon Sep 17 00:00:00 2001 From: yucheng-berriai Date: Thu, 2 Jul 2026 11:48:11 -0700 Subject: [PATCH] fix(otel/v2): satisfy strict-lint and doc gates after merge - routing.py: noqa the fan-out _processor_for blind-except (matches its siblings) - use PEP 585 list[str] for the new logging_exporters fields (ruff UP006) - scope logging_exporters to KeyRequestBase instead of GenerateRequestBase so it is a key field only, not inherited by user requests (it never applied to users; the resolver reads key/team/org columns), which also fixes the api-docs gate - document logging_exporters in the key/team/org endpoint docstrings --- litellm/integrations/otel/plumbing/routing.py | 2 +- litellm/models/organization.py | 2 +- litellm/models/team.py | 2 +- litellm/models/verification_token.py | 2 +- litellm/proxy/_types.py | 10 +++++----- .../management_endpoints/key_management_endpoints.py | 2 ++ .../management_endpoints/organization_endpoints.py | 1 + litellm/proxy/management_endpoints/team_endpoints.py | 2 ++ 8 files changed, 14 insertions(+), 9 deletions(-) diff --git a/litellm/integrations/otel/plumbing/routing.py b/litellm/integrations/otel/plumbing/routing.py index 5ffe25bee6b..b2136ed0be0 100644 --- a/litellm/integrations/otel/plumbing/routing.py +++ b/litellm/integrations/otel/plumbing/routing.py @@ -394,7 +394,7 @@ class TenantFanOutSpanProcessor(SpanProcessor): ) exporter = _exporter_from_spec(spec) processor = _build_processor(exporter, use_simple=False) - except Exception as exc: + except Exception as exc: # noqa: BLE001 verbose_logger.debug( "OTel V2 fan-out: failed to build processor for %s: %s", destination.endpoint, diff --git a/litellm/models/organization.py b/litellm/models/organization.py index 3a78e03d5e8..c211b69dd0c 100644 --- a/litellm/models/organization.py +++ b/litellm/models/organization.py @@ -22,7 +22,7 @@ class LiteLLM_OrganizationTable(LiteLLMPydanticObjectBase): spend: float = 0.0 metadata: Optional[dict] = None models: List[str] = [] - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None model_spend: Optional[dict] = {} created_by: str updated_by: str diff --git a/litellm/models/team.py b/litellm/models/team.py index e735082db26..435d769f979 100644 --- a/litellm/models/team.py +++ b/litellm/models/team.py @@ -92,7 +92,7 @@ class LiteLLM_TeamTable(TeamBase): model_spend: Optional[dict] = {} model_max_budget: Optional[dict] = {} policies: Optional[List[str]] = None - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None allow_team_guardrail_config: Optional[bool] = False litellm_model_table: Optional[LiteLLM_ModelTable] = None object_permission: Optional[LiteLLM_ObjectPermissionTable] = None diff --git a/litellm/models/verification_token.py b/litellm/models/verification_token.py index 457f71ccecd..77771a3aca6 100644 --- a/litellm/models/verification_token.py +++ b/litellm/models/verification_token.py @@ -52,7 +52,7 @@ class LiteLLM_VerificationToken(LiteLLMPydanticObjectBase): object_permission_id: Optional[str] = None object_permission: Optional[LiteLLM_ObjectPermissionTable] = None access_group_ids: Optional[List[str]] = None - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None rotation_count: Optional[int] = 0 auto_rotate: Optional[bool] = False rotation_interval: Optional[str] = None diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 99249a9f4a3..fe34dcb9d7d 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -1055,7 +1055,6 @@ class GenerateRequestBase(LiteLLMPydanticObjectBase): mcp_rpm_limit: Optional[Dict[str, int]] = None guardrails: Optional[List[str]] = None policies: Optional[List[str]] = None - logging_exporters: Optional[List[str]] = None prompts: Optional[List[str]] = None blocked: Optional[bool] = None aliases: Optional[dict] = {} @@ -1077,6 +1076,7 @@ class AllowedVectorStoreIndexItem(LiteLLMPydanticObjectBase): class KeyRequestBase(GenerateRequestBase): key: Optional[str] = None budget_id: Optional[str] = None + logging_exporters: Optional[list[str]] = None tags: Optional[List[str]] = None disable_global_guardrails: Optional[bool] = None enforced_params: Optional[List[str]] = None @@ -1713,7 +1713,7 @@ class NewTeamRequest(TeamBase): tags: Optional[list] = None guardrails: Optional[List[str]] = None policies: Optional[List[str]] = None - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None prompts: Optional[List[str]] = None object_permission: Optional[LiteLLM_ObjectPermissionBase] = None allowed_passthrough_routes: Optional[list] = None @@ -1780,7 +1780,7 @@ class UpdateTeamRequest(LiteLLMPydanticObjectBase): model_aliases: Optional[dict] = None guardrails: Optional[List[str]] = None policies: Optional[List[str]] = None - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None object_permission: Optional[LiteLLM_ObjectPermissionBase] = None disable_global_guardrails: Optional[bool] = None team_member_budget: Optional[float] = None @@ -1924,7 +1924,7 @@ class NewOrganizationRequest(LiteLLM_BudgetTable): models: List = [] budget_id: Optional[str] = None metadata: Optional[dict] = None - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None model_rpm_limit: Optional[Dict[str, int]] = None model_tpm_limit: Optional[Dict[str, int]] = None @@ -2609,7 +2609,7 @@ class LiteLLM_OrganizationTableUpdate(LiteLLM_BudgetTable): spend: Optional[float] = None metadata: Optional[dict] = None models: Optional[List[str]] = None - logging_exporters: Optional[List[str]] = None + logging_exporters: Optional[list[str]] = None updated_by: Optional[str] = None object_permission: Optional[LiteLLM_ObjectPermissionBase] = None model_tpm_limit: Optional[Dict[str, int]] = None diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index e933882cb95..c179e175b1b 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -1475,6 +1475,7 @@ async def generate_key_fn( - metadata: Optional[dict] - Metadata for key, store information for key. Example metadata = {"team": "core-infra", "app": "app2", "email": "ishaan@berri.ai" } - guardrails: Optional[List[str]] - List of active guardrails for the key - policies: Optional[List[str]] - List of policy names to apply to the key. Policies define guardrails, conditions, and inheritance rules. + - logging_exporters: Optional[List[str]] - Names of admin-owned logging destinations (credential names) this key exports its traces to. - disable_global_guardrails: Optional[bool] - Whether to disable global guardrails for the key. - permissions: Optional[dict] - key-specific permissions. Currently just used for turning off pii masking (if connected). Example - {"pii": false} - model_max_budget: Optional[Dict[str, BudgetConfig]] - Model-specific budgets {"gpt-4": {"budget_limit": 0.0005, "time_period": "30d"}}}. IF null or {} then no model specific budget. @@ -2542,6 +2543,7 @@ async def update_key_fn( # noqa: C901 - send_invite_email: Optional[bool] - Send invite email to user_id - guardrails: Optional[List[str]] - List of active guardrails for the key - policies: Optional[List[str]] - List of policy names to apply to the key. Policies define guardrails, conditions, and inheritance rules. + - logging_exporters: Optional[List[str]] - Names of admin-owned logging destinations (credential names) this key exports its traces to. - disable_global_guardrails: Optional[bool] - Whether to disable global guardrails for the key. - prompts: Optional[List[str]] - List of prompts that the key is allowed to use. - blocked: Optional[bool] - Whether the key is blocked diff --git a/litellm/proxy/management_endpoints/organization_endpoints.py b/litellm/proxy/management_endpoints/organization_endpoints.py index 22e675fcdfa..5fe27e9dc13 100644 --- a/litellm/proxy/management_endpoints/organization_endpoints.py +++ b/litellm/proxy/management_endpoints/organization_endpoints.py @@ -146,6 +146,7 @@ async def new_organization( - organization_alias: *str* - The name of the organization. - models: *List* - The models the organization has access to. + - logging_exporters: *Optional[List[str]]* - Names of admin-owned logging destinations (credential names) this organization exports its traces to. - budget_id: *Optional[str]* - The id for a budget (tpm/rpm/max budget) for the organization. ### IF NO BUDGET ID - CREATE ONE WITH THESE PARAMS ### - max_budget: *Optional[float]* - Max budget for org diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index bf94fb6d753..88ab77354db 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -939,6 +939,7 @@ async def new_team( - model_aliases: Optional[dict] - Model aliases for the team. [Docs](https://docs.litellm.ai/docs/proxy/team_based_routing#create-team-with-model-alias) - guardrails: Optional[List[str]] - Guardrails for the team. [Docs](https://docs.litellm.ai/docs/proxy/guardrails) - policies: Optional[List[str]] - Policies for the team. [Docs](https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies) + - logging_exporters: Optional[List[str]] - Names of admin-owned logging destinations (credential names) this team exports its traces to. - disable_global_guardrails: Optional[bool] - Whether to disable global guardrails for the key. - object_permission: Optional[LiteLLM_ObjectPermissionBase] - team-specific object permission. Example - {"vector_stores": ["vector_store_1", "vector_store_2"], "agents": ["agent_1", "agent_2"], "agent_access_groups": ["dev_group"]}. IF null or {} then no object permission. - team_member_budget: Optional[float] - The maximum budget allocated to an individual team member. @@ -1616,6 +1617,7 @@ async def update_team( - model_aliases: Optional[dict] - Model aliases for the team. [Docs](https://docs.litellm.ai/docs/proxy/team_based_routing#create-team-with-model-alias) - guardrails: Optional[List[str]] - Guardrails for the team. [Docs](https://docs.litellm.ai/docs/proxy/guardrails) - policies: Optional[List[str]] - Policies for the team. [Docs](https://docs.litellm.ai/docs/proxy/guardrails/guardrail_policies) + - logging_exporters: Optional[List[str]] - Names of admin-owned logging destinations (credential names) this team exports its traces to. - disable_global_guardrails: Optional[bool] - Whether to disable global guardrails for the key. - object_permission: Optional[LiteLLM_ObjectPermissionBase] - team-specific object permission. Example - {"vector_stores": ["vector_store_1", "vector_store_2"], "agents": ["agent_1", "agent_2"], "agent_access_groups": ["dev_group"]}. IF null or {} then no object permission. - team_member_budget: Optional[float] - The maximum budget allocated to an individual team member.