@@ -161,20 +161,21 @@ async def process_row(row: EvaluationRow) -> EvaluationRow:
161161 tool_calls = converted_tool_calls ,
162162 )
163163 ]
164+ row .messages = messages
164165
165- row .execution_metadata .finish_reason = str (finish_reason ) if finish_reason is not None else None
166- row .execution_metadata .tool_call_count = (
167- len (converted_tool_calls ) if converted_tool_calls is not None else 0
168- )
169- row .execution_metadata .usage = (
170- CompletionUsage ( # Note: LiteLLM sets usage dynamically via setattr(), not as a typed field
171- prompt_tokens = response .usage .prompt_tokens , # pyright: ignore[reportAttributeAccessIssue]
172- completion_tokens = response .usage .completion_tokens , # pyright: ignore[reportAttributeAccessIssue]
173- total_tokens = response .usage .total_tokens , # pyright: ignore[reportAttributeAccessIssue]
166+ usage = getattr (response , "usage" , None )
167+ if usage is not None :
168+ prompt_tokens = getattr (usage , "prompt_tokens" , 0 ) or 0
169+ completion_tokens = getattr (usage , "completion_tokens" , 0 ) or 0
170+ total_tokens = getattr (usage , "total_tokens" , None )
171+ if total_tokens is None :
172+ total_tokens = prompt_tokens + completion_tokens
173+
174+ row .execution_metadata .usage = CompletionUsage (
175+ prompt_tokens = prompt_tokens ,
176+ completion_tokens = completion_tokens ,
177+ total_tokens = total_tokens ,
174178 )
175- )
176-
177- row .messages = messages
178179
179180 row .execution_metadata .duration_seconds = time .perf_counter () - start_time
180181
0 commit comments