|
|
""" |
|
|
Monitoring utilities for tracking execution timing and token usage. |
|
|
""" |
|
|
|
|
|
from dataclasses import dataclass, field |
|
|
|
|
|
__all__ = ["Timing", "TokenUsage"] |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class TokenUsage: |
|
|
""" |
|
|
Contains the token usage information for a given step or run. |
|
|
""" |
|
|
|
|
|
input_tokens: int |
|
|
output_tokens: int |
|
|
total_tokens: int = field(init=False) |
|
|
|
|
|
def __post_init__(self): |
|
|
self.total_tokens = self.input_tokens + self.output_tokens |
|
|
|
|
|
def dict(self): |
|
|
return { |
|
|
"input_tokens": self.input_tokens, |
|
|
"output_tokens": self.output_tokens, |
|
|
"total_tokens": self.total_tokens, |
|
|
} |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class Timing: |
|
|
""" |
|
|
Contains the timing information for a given step or run. |
|
|
""" |
|
|
|
|
|
start_time: float |
|
|
end_time: float | None = None |
|
|
|
|
|
@property |
|
|
def duration(self): |
|
|
return None if self.end_time is None else self.end_time - self.start_time |
|
|
|
|
|
def dict(self): |
|
|
return { |
|
|
"start_time": self.start_time, |
|
|
"end_time": self.end_time, |
|
|
"duration": self.duration, |
|
|
} |
|
|
|
|
|
def __repr__(self) -> str: |
|
|
return f"Timing(start_time={self.start_time}, end_time={self.end_time}, duration={self.duration})" |
|
|
|