From 21f742041a6cede248d57efc53c2dd1d969330e2 Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Sat, 8 Aug 2026 20:05:43 -0700 Subject: [PATCH] fix(xai): type tool usage details helpers without Any --- litellm/llms/xai/cost_calculator.py | 4 +-- litellm/llms/xai/responses/transformation.py | 26 ++++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/litellm/llms/xai/cost_calculator.py b/litellm/llms/xai/cost_calculator.py index a32e2af0959..0f117c586f1 100644 --- a/litellm/llms/xai/cost_calculator.py +++ b/litellm/llms/xai/cost_calculator.py @@ -5,7 +5,7 @@ Helper util for handling XAI-specific cost calculation """ from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Final +from typing import TYPE_CHECKING, Final from litellm.litellm_core_utils.llm_cost_calc.utils import generic_cost_per_token from litellm.types.utils import PromptTokensDetailsWrapper, Usage @@ -17,7 +17,7 @@ if TYPE_CHECKING: _DEFAULT_WEB_SEARCH_COST_PER_CALL = 5.0 / 1000.0 -def apply_server_side_tool_usage_details_to_usage(usage: Usage, details: Mapping[str, Any] | None) -> None: +def apply_server_side_tool_usage_details_to_usage(usage: Usage, details: Mapping[str, object] | None) -> None: """ Attach server_side_tool_usage_details and mirror web_search_calls onto prompt_tokens_details.web_search_requests for built-in tool cost gating. diff --git a/litellm/llms/xai/responses/transformation.py b/litellm/llms/xai/responses/transformation.py index 35be5602029..3dc11cd2d92 100644 --- a/litellm/llms/xai/responses/transformation.py +++ b/litellm/llms/xai/responses/transformation.py @@ -1,3 +1,4 @@ +from collections.abc import Mapping from typing import TYPE_CHECKING, Any, Final import httpx @@ -14,6 +15,7 @@ from litellm.llms.xai.cost_calculator import ( from litellm.responses.utils import ResponseAPILoggingUtils from litellm.secret_managers.main import get_secret_str from litellm.types.llms.openai import ( + ResponseAPIUsage, ResponseCompletedEvent, ResponseFailedEvent, ResponseIncompleteEvent, @@ -107,18 +109,22 @@ class XAIResponsesAPIConfig(OpenAIResponsesAPIConfig): return event @staticmethod - def _server_side_tool_usage_details_from_usage(usage: Any) -> Any: + def _server_side_tool_usage_details_from_usage( + usage: Usage | ResponseAPIUsage | Mapping[str, object] | None, + ) -> Mapping[str, object] | None: if usage is None: return None - if isinstance(usage, dict): - return usage.get("server_side_tool_usage_details") - details = getattr(usage, "server_side_tool_usage_details", None) - if details is not None: - return details - model_extra = getattr(usage, "model_extra", None) or getattr(usage, "__pydantic_extra__", None) - if isinstance(model_extra, dict): - return model_extra.get("server_side_tool_usage_details") - return None + if isinstance(usage, Mapping): + details = usage.get("server_side_tool_usage_details") + else: + details = getattr(usage, "server_side_tool_usage_details", None) + if details is None: + model_extra = getattr(usage, "model_extra", None) or getattr(usage, "__pydantic_extra__", None) + if isinstance(model_extra, Mapping): + details = model_extra.get("server_side_tool_usage_details") + if not isinstance(details, Mapping): + return None + return details @staticmethod def _attach_server_side_tool_usage_details_to_usage(