diff --git a/src/agents/extensions/models/litellm_model.py b/src/agents/extensions/models/litellm_model.py index 3fb0c20ea1..fd80151afb 100644 --- a/src/agents/extensions/models/litellm_model.py +++ b/src/agents/extensions/models/litellm_model.py @@ -234,8 +234,12 @@ async def get_response( [message.model_dump()] if message is not None else [] ) span_generation.span_data.usage = { + "requests": usage.requests, "input_tokens": usage.input_tokens, "output_tokens": usage.output_tokens, + "total_tokens": usage.total_tokens, + "input_tokens_details": usage.input_tokens_details.model_dump(), + "output_tokens_details": usage.output_tokens_details.model_dump(), } # Build provider_data for provider specific fields @@ -304,8 +308,20 @@ async def stream_response( if final_response and final_response.usage: span_generation.span_data.usage = { + "requests": 1, "input_tokens": final_response.usage.input_tokens, "output_tokens": final_response.usage.output_tokens, + "total_tokens": final_response.usage.total_tokens, + "input_tokens_details": ( + final_response.usage.input_tokens_details.model_dump() + if final_response.usage.input_tokens_details + else {"cached_tokens": 0} + ), + "output_tokens_details": ( + final_response.usage.output_tokens_details.model_dump() + if final_response.usage.output_tokens_details + else {"reasoning_tokens": 0} + ), } @overload diff --git a/src/agents/models/openai_chatcompletions.py b/src/agents/models/openai_chatcompletions.py index 2ca4c11979..560fb3fe6a 100644 --- a/src/agents/models/openai_chatcompletions.py +++ b/src/agents/models/openai_chatcompletions.py @@ -119,8 +119,12 @@ async def get_response( [message.model_dump()] if message is not None else [] ) span_generation.span_data.usage = { + "requests": usage.requests, "input_tokens": usage.input_tokens, "output_tokens": usage.output_tokens, + "total_tokens": usage.total_tokens, + "input_tokens_details": usage.input_tokens_details.model_dump(), + "output_tokens_details": usage.output_tokens_details.model_dump(), } # Build provider_data for provider_specific_fields @@ -209,8 +213,20 @@ async def stream_response( if final_response and final_response.usage: span_generation.span_data.usage = { + "requests": 1, "input_tokens": final_response.usage.input_tokens, "output_tokens": final_response.usage.output_tokens, + "total_tokens": final_response.usage.total_tokens, + "input_tokens_details": ( + final_response.usage.input_tokens_details.model_dump() + if final_response.usage.input_tokens_details + else {"cached_tokens": 0} + ), + "output_tokens_details": ( + final_response.usage.output_tokens_details.model_dump() + if final_response.usage.output_tokens_details + else {"reasoning_tokens": 0} + ), } @overload