From b9a89f1ac776719c23a8ec41309fbf55d5d7ece1 Mon Sep 17 00:00:00 2001 From: Jon Saad-Falcon Date: Sat, 28 Feb 2026 07:20:21 +0000 Subject: [PATCH] Add trace and power fields to EvalResult and RunSummary (Task 5) - Add trace_steps and trace_energy_joules to EvalResult - Add avg_power_watts, total_input_tokens, total_output_tokens, and trace_step_type_stats to RunSummary - Add 3 tests covering new field defaults and setters Co-Authored-By: Claude Opus 4.6 --- evals/core/types.py | 6 ++++++ evals/tests/test_types.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/evals/core/types.py b/evals/core/types.py index 95550e1d..1ec24bfc 100644 --- a/evals/core/types.py +++ b/evals/core/types.py @@ -44,6 +44,8 @@ class EvalResult: energy_per_output_token_joules: float = 0.0 throughput_per_watt: float = 0.0 mean_itl_ms: float = 0.0 + trace_steps: int = 0 + trace_energy_joules: float = 0.0 @dataclass(slots=True) @@ -122,6 +124,10 @@ class RunSummary: warmup_samples_excluded: int = 0 steady_state_reached: bool = False energy_method: str = "" + avg_power_watts: float = 0.0 + total_input_tokens: int = 0 + total_output_tokens: int = 0 + trace_step_type_stats: Dict[str, Dict[str, float]] = field(default_factory=dict) # --------------------------------------------------------------------------- diff --git a/evals/tests/test_types.py b/evals/tests/test_types.py index eda1e765..31c437aa 100644 --- a/evals/tests/test_types.py +++ b/evals/tests/test_types.py @@ -209,6 +209,35 @@ class TestRunSummary: # --------------------------------------------------------------------------- +class TestEvalResultTraceFields: + def test_trace_fields_exist(self): + r = EvalResult(record_id="test", model_answer="hi") + assert r.trace_steps == 0 + assert r.trace_energy_joules == 0.0 + + def test_trace_fields_set(self): + r = EvalResult( + record_id="test", model_answer="hi", + trace_steps=5, trace_energy_joules=100.0, + ) + assert r.trace_steps == 5 + assert r.trace_energy_joules == 100.0 + + +class TestRunSummaryTraceFields: + def test_trace_aggregate_fields(self): + s = RunSummary( + benchmark="test", category="test", backend="test", + model="test", total_samples=1, scored_samples=1, + correct=1, accuracy=1.0, errors=0, + mean_latency_seconds=1.0, total_cost_usd=0.0, + ) + assert s.avg_power_watts == 0.0 + assert s.trace_step_type_stats == {} + assert s.total_input_tokens == 0 + assert s.total_output_tokens == 0 + + class TestMetaConfig: def test_defaults(self): m = MetaConfig()