From c1896e0a63090df2d10f5710d084d6c8f61cd141 Mon Sep 17 00:00:00 2001 From: sora <2075279110@qq.com> Date: Thu, 10 Sep 2026 10:03:19 +0000 Subject: [PATCH] Center run plan, result panel, and Run Summary table; add lat p50/p90 + truncation columns Co-Authored-By: Claude --- evalharness/cli.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/evalharness/cli.py b/evalharness/cli.py index d4c5613..dd94021 100644 --- a/evalharness/cli.py +++ b/evalharness/cli.py @@ -187,7 +187,8 @@ def _print_run_plan(console, args, model_spec): table.add_row('Performance', '[green]enabled[/green]' if args.perf else '[dim]disabled[/dim]') table.add_row('Checkpoint', '[green]resume[/green]' if args.resume else '[dim]new run[/dim]') table.add_row('Output', args.out_dir or '[dim](not specified)[/dim]') - console.print(Panel(table, title=title, border_style='blue', expand=False)) + console.print(Panel(table, title=title, border_style='blue', expand=False), + justify='center') def _print_phase(console, index, total, name, message): @@ -309,7 +310,8 @@ def _print_result_panel(console, rep, wall_s: float = 0.0): else f'{k}={perf[k]}' for k in keys if perf.get(k) is not None] if pstats: body.add_row('perf', ' '.join(pstats)) - console.print(Panel(body, title=title, border_style='blue', expand=False)) + console.print(Panel(body, title=title, border_style='blue', expand=False), + justify='center') return True def _compose_judge_spec(args): @@ -397,7 +399,8 @@ def _print_result_panel(console, rep, wall_s: float = 0.0): else f'{k}={perf[k]}' for k in keys if perf.get(k) is not None] if pstats: body.add_row('perf', ' '.join(pstats)) - console.print(Panel(body, title=title, border_style='blue', expand=False)) + console.print(Panel(body, title=title, border_style='blue', expand=False), + justify='center') return True def _compose_judge_spec(args): @@ -504,6 +507,13 @@ def _cmd_eval_run(args) -> int: if isinstance(v, dict) and k not in ('run_info',) and not k.startswith('agg_error')} info = report.metric_groups.get('run_info', {}) or {} + lats = sorted(float((s.usage or {}).get('latency_s', 0) or 0) + for s in report.samples + if float((s.usage or {}).get('latency_s', 0) or 0) > 0) + def _pct(q): + return lats[min(int(len(lats) * q), len(lats) - 1)] if lats else 0.0 + fins = [(s.usage or {}).get('finish_reason', '') + for s in report.samples] rows.append({'name': name, 'metric': primary, 'value': report.metrics.get(primary), 'n': report.num_samples, 'extract_fail': report.num_failed_extractions, @@ -514,6 +524,8 @@ def _cmd_eval_run(args) -> int: 'tok_out': info.get('gen_output_tokens', 0) or 0, 'tokens': (info.get('gen_input_tokens', 0) or 0) + (info.get('gen_output_tokens', 0) or 0), + 'lat_p50': _pct(0.50), 'lat_p90': _pct(0.90), + 'trunc': sum(1 for f in fins if f == 'length'), 'groups': groups, 'ok': True}) _print_benchmark_result(console, i + 1, total_runs, name, 'done', _time.time() - t0) @@ -621,7 +633,8 @@ def _print_summary_table(console, rows): for col, just in (('benchmark', 'left'), ('metric', 'left'), ('score', 'right'), ('n', 'right'), ('time', 'right'), ('tok in', 'right'), ('tok out', 'right'), - ('in/s', 'right'), ('out/s', 'right')): + ('in/s', 'right'), ('out/s', 'right'), + ('lat p50/p90', 'right'), ('trunc', 'right')): t.add_column(col, justify=just) for r in rows: v = _fmt_score(r.get('value')) if r['ok'] else 'ERR' @@ -632,8 +645,11 @@ def _print_summary_table(console, rows): tout = f'{to:,}' if to else '—' tis = f'{ti / wall:.0f}' if (wall > 1 and ti) else '—' tos = f'{to / wall:.0f}' if (wall > 1 and to) else '—' + lat = f"{r.get('lat_p50', 0):.1f}/{r.get('lat_p90', 0):.1f}s" \ + if r.get('lat_p50') else '—' + trunc = str(r['trunc']) if r.get('trunc') else '—' t.add_row(r['name'], r['metric'], v, str(r.get('n', '')), tm, - tin, tout, tis, tos, + tin, tout, tis, tos, lat, trunc, style='green' if r['ok'] else 'red') wall_all = sum(r.get('wall') or r.get('secs') or 0 for r in rows) ti_all = sum(r.get('tok_in', 0) for r in rows) @@ -646,8 +662,8 @@ def _print_summary_table(console, rows): t.add_row(f'[bold]{len(rows)} benchmarks[/bold]', '', f'{sum(1 for r in rows if r["ok"])}/{len(rows)} ok', str(n_all), tm_all, f'{ti_all:,}', f'{to_all:,}', - tis_all, tos_all) - console.print(t) + tis_all, tos_all, '', str(sum(r.get('trunc', 0) for r in rows))) + console.print(t, justify='center') return print(f'\n{"benchmark":<20} {"metric":<16} {"score":>8} {"n":>6} {"time":>8}') print('-' * 64)