Spaces:
Build error
Build error
File size: 1,942 Bytes
51ff9e5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
from openhands.events.event import Event
from openhands.llm.metrics import Metrics, TokenUsage
def get_token_usage_for_event(event: Event, metrics: Metrics) -> TokenUsage | None:
"""
Returns at most one token usage record for either:
- `tool_call_metadata.model_response.id`, if possible
- otherwise event.response_id, if set
If neither exist or none matches in metrics.token_usages, returns None.
"""
# 1) Use the tool_call_metadata's response.id if present
if event.tool_call_metadata and event.tool_call_metadata.model_response:
tool_response_id = event.tool_call_metadata.model_response.get('id')
if tool_response_id:
usage_rec = next(
(u for u in metrics.token_usages if u.response_id == tool_response_id),
None,
)
if usage_rec is not None:
return usage_rec
# 2) Fallback to the top-level event.response_id if present
if event.response_id:
return next(
(u for u in metrics.token_usages if u.response_id == event.response_id),
None,
)
return None
def get_token_usage_for_event_id(
events: list[Event], event_id: int, metrics: Metrics
) -> TokenUsage | None:
"""
Starting from the event with .id == event_id and moving backwards in `events`,
find the first TokenUsage record (if any) associated either with:
- tool_call_metadata.model_response.id, or
- event.response_id
Returns the first match found, or None if none is found.
"""
# Find the index of the event with the given id
idx = next((i for i, e in enumerate(events) if e.id == event_id), None)
if idx is None:
return None
# Search backward from idx down to 0
for i in range(idx, -1, -1):
usage = get_token_usage_for_event(events[i], metrics)
if usage is not None:
return usage
return None
|