Coverage for src/lite_agent/utils/metrics.py: 82%

17 statements  

« prev     ^ index     » next       coverage.py v7.10.5, created at 2025-08-25 22:58 +0900

1from datetime import datetime 

2 

3 

4class TimingMetrics: 

5 """Utility class for calculating timing metrics in LLM responses.""" 

6 

7 @staticmethod 

8 def calculate_latency_ms(start_time: datetime | None, first_output_time: datetime | None) -> int | None: 

9 """Calculate latency from start to first output. 

10 

11 Args: 

12 start_time: When the request started 

13 first_output_time: When the first output was received 

14 

15 Returns: 

16 Latency in milliseconds, or None if either time is missing 

17 """ 

18 if start_time is None or first_output_time is None: 

19 return None 

20 return int((first_output_time - start_time).total_seconds() * 1000) 

21 

22 @staticmethod 

23 def calculate_output_time_ms(first_output_time: datetime | None, output_complete_time: datetime | None) -> int | None: 

24 """Calculate time from first output to completion. 

25 

26 Args: 

27 first_output_time: When the first output was received 

28 output_complete_time: When output was completed 

29 

30 Returns: 

31 Output time in milliseconds, or None if either time is missing 

32 """ 

33 if first_output_time is None or output_complete_time is None: 

34 return None 

35 return int((output_complete_time - first_output_time).total_seconds() * 1000) 

36 

37 @staticmethod 

38 def calculate_total_time_ms(start_time: datetime | None, output_complete_time: datetime | None) -> int | None: 

39 """Calculate total time from start to completion. 

40 

41 Args: 

42 start_time: When the request started 

43 output_complete_time: When output was completed 

44 

45 Returns: 

46 Total time in milliseconds, or None if either time is missing 

47 """ 

48 if start_time is None or output_complete_time is None: 

49 return None 

50 return int((output_complete_time - start_time).total_seconds() * 1000)