fix: handle ResponseAPIUsage objects in get_usage_from_response_obj

- Fix bug where ResponseAPIUsage objects from ResponsesAPIResponse were not being transformed
- Add explicit handling for ResponseAPIUsage objects (not just dicts)
- Use _is_response_api_usage() helper to handle both ResponseAPIUsage objects and dicts
- Remove problematic 'or {}' fallback that was converting None to empty dict

This fixes the test failure where prompt_tokens was 0 instead of 8 for ResponsesAPIResponse objects.
This commit is contained in:
Alexsander Hamir 2026-01-14 11:42:54 -08:00
parent 1130b94342
commit d5f76a4da4

View file

@ -4506,12 +4506,11 @@ class StandardLoggingPayloadSetup:
)
if isinstance(response_obj, dict):
usage = response_obj.get("usage", None) or {}
usage = response_obj.get("usage", None)
else:
usage = getattr(response_obj, "usage", None) or {}
if usage is None or (
not isinstance(usage, dict) and not isinstance(usage, Usage)
):
usage = getattr(response_obj, "usage", None)
if usage is None:
return Usage(
prompt_tokens=0,
completion_tokens=0,
@ -4519,13 +4518,12 @@ class StandardLoggingPayloadSetup:
)
elif isinstance(usage, Usage):
return usage
elif ResponseAPILoggingUtils._is_response_api_usage(usage):
# Handle ResponseAPIUsage (object or dict) from ResponsesAPIResponse
return ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage(
usage
)
elif isinstance(usage, dict):
if ResponseAPILoggingUtils._is_response_api_usage(usage):
return (
ResponseAPILoggingUtils._transform_response_api_usage_to_chat_usage(
usage
)
)
return Usage(**usage)
raise ValueError(f"usage is required, got={usage} of type {type(usage)}")