diff --git a/pilot/ai_review.py b/pilot/ai_review.py index 31c7a1b..3575a8a 100644 --- a/pilot/ai_review.py +++ b/pilot/ai_review.py @@ -1033,7 +1033,7 @@ def inline_comment_body(f: dict) -> str: tok = f.get("_tok_attrib") if tok is not None: pct = (f.get("_tok_pct", 0.0) or 0.0) * 100 - body += f"\n\n🪙 ~{tok} tok ({pct:.0f}% · attributed output)" + body += f"\n\n🪙 ~{fmt_tokens(tok)} tok ({pct:.0f}% · attributed output)" return body @@ -1122,7 +1122,9 @@ def _render_collapsible_usage(usage: dict | None, model: str, config: dict | Non "🔋 AI Usage & Run Details", "", f"- **Model / Engine**: `{model}` · opencode · {usage.get('steps', 0)} steps · {dur_s}", - f"- **Total Tokens**: {in_tok} in / {out_tok} out ({reason_tok} reasoning, cache {cache_r} read / {cache_w} write, {total} total)", + f"- **Total Tokens**: {fmt_tokens(in_tok)} in / {fmt_tokens(out_tok)} out " + f"({fmt_tokens(reason_tok)} reasoning, cache {fmt_tokens(cache_r)} read / " + f"{fmt_tokens(cache_w)} write, {fmt_tokens(total)} total)", f"- **Est. cost on {eq_label}**: {eq_s}{eq_note}", f"- **Actual**: {actual_s}{actual_note}", f"- **Scope**: {scope}", diff --git a/tests/pilot/test_ai_review.py b/tests/pilot/test_ai_review.py index c72176d..334a0b7 100644 --- a/tests/pilot/test_ai_review.py +++ b/tests/pilot/test_ai_review.py @@ -335,7 +335,7 @@ def test_inline_comment_body_with_token_attribution(): "fix": "f", "suggestion": "", "reference": "", "_tok_attrib": 1234, "_tok_pct": 0.30} body = inline_comment_body(f) - assert "🪙 ~1234 tok" in body + assert "🪙 ~1,234 (1.2K) tok" in body assert "30%" in body assert "attributed output" in body @@ -757,7 +757,7 @@ def test_render_collapsible_usage_renders_totals(): assert "`glm-5.2:cloud`" in sec assert "7 steps" in sec assert "142.0s" in sec - assert "18420 in / 612 out" in sec and "19032 total" in sec + assert "18,420 (18.4K) in / 612 out" in sec and "19,032 (19.0K) total" in sec assert "$0.00" in sec assert "Whole-repo checkout" in sec assert "attributed" in sec @@ -824,7 +824,7 @@ def test_render_collapsible_usage_contains_details(): assert "🔋 AI Usage & Run Details" in block assert "" in block assert "glm-5.2:cloud" in block - assert "1000 in / 200 out" in block + assert "1,000 (1.0K) in / 200 out" in block def test_render_collapsible_usage_empty_when_no_usage(): @@ -1668,3 +1668,27 @@ def test_fmt_tokens_none(): def test_fmt_tokens_negative(): assert fmt_tokens(-1) == "?" + +# --------------------------------------------------------------------------- +# fmt_tokens — applied in usage + inline comment bodies (Task 3) +# --------------------------------------------------------------------------- + + +def test_collapsible_usage_renders_humanized_tokens(): + usage = {"input": 2_071_025, "output": 17303, "reasoning": 0, + "cache_read": 0, "cache_write": 0, "total": 2_088_328, + "cost": 0.0, "steps": 1, "duration_s": 10.0} + block = _render_collapsible_usage(usage, "glm-5.2:cloud", config={}) + assert "2,071,025 (2.1M) in" in block + assert "17,303 (17.3K) out" in block + + +def test_inline_comment_body_humanized_tokens(): + # Value chosen > 1000 so fmt_tokens actually adds the comma + short suffix; + # the plan's 362 would render identically with or without fmt_tokens. + f = {"severity": "medium", "path": "x.py", "line": 1, + "problem": "p", "fix": "", "suggestion": "", "reference": "", + "_tok_attrib": 17303, "_tok_pct": 0.11} + body = inline_comment_body(f) + assert "🪙 ~17,303 (17.3K) tok" in body +