From 0f54d76079003cc16c23f3570f459c9b7146a53a Mon Sep 17 00:00:00 2001 From: kerry Date: Sat, 19 Sep 2026 00:24:34 +0000 Subject: [PATCH] fix(timing): drop banned typing.cast from provider duration accounting Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../llm_response_utils/response_metadata.py | 5 ++--- litellm/litellm_core_utils/logging_utils.py | 14 ++++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/litellm/litellm_core_utils/llm_response_utils/response_metadata.py b/litellm/litellm_core_utils/llm_response_utils/response_metadata.py index 3778ae1281f..780691b4696 100644 --- a/litellm/litellm_core_utils/llm_response_utils/response_metadata.py +++ b/litellm/litellm_core_utils/llm_response_utils/response_metadata.py @@ -1,6 +1,6 @@ import datetime from collections.abc import Mapping -from typing import Any, Final, cast +from typing import Any, Final import httpx @@ -49,8 +49,7 @@ def response_timing_metrics( if caching_details is not None and caching_details.get("cache_hit") is True else None ) - metadata_value: Final = get_litellm_metadata_from_kwargs(logging_obj.model_call_details) - metadata: Final = cast(dict[str, object], metadata_value) if isinstance(metadata_value, dict) else {} + metadata: Final[Mapping[str, object]] = get_litellm_metadata_from_kwargs(logging_obj.model_call_details) llm_api_duration_ms: Final = logging_obj.model_call_details.get("llm_api_duration_ms") if cache_duration_ms is not None: overhead_ms: float | None = total_response_time_ms - cache_duration_ms diff --git a/litellm/litellm_core_utils/logging_utils.py b/litellm/litellm_core_utils/logging_utils.py index 82bfb0efdb1..91cc13c8315 100644 --- a/litellm/litellm_core_utils/logging_utils.py +++ b/litellm/litellm_core_utils/logging_utils.py @@ -5,7 +5,7 @@ import re import time from collections.abc import Iterator, Mapping, Sequence from datetime import datetime -from typing import TYPE_CHECKING, Any, Final, cast +from typing import TYPE_CHECKING, Any, Final from litellm._logging import format_base64_size, verbose_logger from litellm.constants import ( @@ -287,13 +287,11 @@ def _set_duration_in_model_call_details( duration_ms: Final = (end_time - start_time).total_seconds() * 1000 if logging_obj and hasattr(logging_obj, "model_call_details"): logging_obj.model_call_details["llm_api_duration_ms"] = duration_ms - metadata_value: Final = get_litellm_metadata_from_kwargs(logging_obj.model_call_details) - if isinstance(metadata_value, dict): - metadata: Final = cast(dict[str, object], metadata_value) - existing_total: Final = metadata.get("llm_api_duration_ms_total") - metadata["llm_api_duration_ms_total"] = ( - existing_total if isinstance(existing_total, float) else 0.0 - ) + duration_ms + metadata: Final[dict[str, object]] = get_litellm_metadata_from_kwargs(logging_obj.model_call_details) + existing_total: Final = metadata.get("llm_api_duration_ms_total") + metadata["llm_api_duration_ms_total"] = ( + existing_total if isinstance(existing_total, float) else 0.0 + ) + duration_ms else: verbose_logger.debug("`logging_obj` not found - unable to track `llm_api_duration_ms") except Exception as e: