Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion litellm/litellm_core_utils/litellm_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -1638,11 +1638,19 @@ def _transform_usage_objects(self, result):
"standard_logging_object"
)
) is not None:
standard_logging_payload["response"] = (
response_dict = (
result.model_dump()
if hasattr(result, "model_dump")
else dict(result)
)
# Ensure usage is properly included with transformed chat format
if transformed_usage is not None:
response_dict["usage"] = (
transformed_usage.model_dump()
if hasattr(transformed_usage, "model_dump")
else dict(transformed_usage)
)
standard_logging_payload["response"] = response_dict
elif isinstance(result, TranscriptionResponse):
from litellm.litellm_core_utils.llm_cost_calc.usage_object_transformation import (
TranscriptionUsageObjectTransformation,
Expand Down Expand Up @@ -4540,6 +4548,10 @@ def get_usage_from_response_obj(
)
elif isinstance(usage, Usage):
return usage
elif isinstance(usage, ResponseAPIUsage):
return ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage(
usage
)
elif isinstance(usage, dict):
if ResponseAPILoggingUtils._is_response_api_usage(usage):
return (
Expand Down
2 changes: 1 addition & 1 deletion litellm/llms/anthropic/chat/transformation.py
Original file line number Diff line number Diff line change
Expand Up @@ -1369,7 +1369,7 @@ def calculate_usage(
else 0
)
completion_token_details = CompletionTokensDetailsWrapper(
reasoning_tokens=reasoning_tokens if reasoning_tokens > 0 else None,
reasoning_tokens=reasoning_tokens if reasoning_tokens > 0 else 0,
text_tokens=completion_tokens - reasoning_tokens if reasoning_tokens > 0 else completion_tokens,
)
total_tokens = prompt_tokens + completion_tokens
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1750,6 +1750,8 @@ def _transform_chat_completion_usage_to_responses_usage(
and prompt_details.cached_tokens is not None
):
input_details_dict["cached_tokens"] = prompt_details.cached_tokens
else:
input_details_dict["cached_tokens"] = 0

if (
hasattr(prompt_details, "text_tokens")
Expand Down Expand Up @@ -1782,6 +1784,8 @@ def _transform_chat_completion_usage_to_responses_usage(
output_details_dict["reasoning_tokens"] = (
completion_details.reasoning_tokens
)
else:
output_details_dict["reasoning_tokens"] = 0

if (
hasattr(completion_details, "text_tokens")
Expand Down
6 changes: 3 additions & 3 deletions litellm/types/llms/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -1114,7 +1114,7 @@ class ResponsesAPIRequestParams(ResponsesAPIOptionalRequestParams, total=False):


class OutputTokensDetails(BaseLiteLLMOpenAIResponseObject):
reasoning_tokens: Optional[int] = None
reasoning_tokens: int = 0

text_tokens: Optional[int] = None

Expand All @@ -1123,7 +1123,7 @@ class OutputTokensDetails(BaseLiteLLMOpenAIResponseObject):

class InputTokensDetails(BaseLiteLLMOpenAIResponseObject):
audio_tokens: Optional[int] = None
cached_tokens: Optional[int] = None
cached_tokens: int = 0
text_tokens: Optional[int] = None

model_config = {"extra": "allow"}
Expand Down Expand Up @@ -1193,7 +1193,7 @@ class ResponsesAPIResponse(BaseLiteLLMOpenAIResponseObject):
status: Optional[str] = None
text: Optional[Union["ResponseText", Dict[str, Any]]] = None
truncation: Optional[Literal["auto", "disabled"]] = None
usage: Optional[Any] = None
usage: Optional[ResponseAPIUsage] = None
user: Optional[str] = None
store: Optional[bool] = None
# Define private attributes using PrivateAttr
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1842,7 +1842,7 @@ def test_calculate_usage_completion_tokens_details_always_populated():

# completion_tokens_details should NOT be None
assert usage.completion_tokens_details is not None
assert usage.completion_tokens_details.reasoning_tokens is None
assert usage.completion_tokens_details.reasoning_tokens is 0
assert usage.completion_tokens_details.text_tokens == 248
assert usage.completion_tokens == 248
assert usage.prompt_tokens == 37
Expand Down
Loading
Loading