(results: TaskRunResult[])
| 128 | } |
| 129 | |
| 130 | function avg(nums: number[]): number { |
| 131 | if (nums.length === 0) return 0; |
| 132 | return nums.reduce((a, b) => a + b, 0) / nums.length; |
| 133 | } |
| 134 | |
| 135 | export function summarize(results: TaskRunResult[]): EvalSummary { |
| 136 | const passed = results.filter(r => r.passed).length; |
| 137 | return { |
| 138 | total: results.length, |
| 139 | passed, |
| 140 | passRate: results.length === 0 ? 0 : passed / results.length, |
| 141 | avgIterations: avg(results.map(r => r.iterations)), |
| 142 | avgToolCalls: avg(results.map(r => r.toolCalls)), |
| 143 | totalCostUsd: results.reduce((a, r) => a + r.costUsd, 0), |
| 144 | avgWallMs: avg(results.map(r => r.wallMs)), |
no test coverage detected