feat: reorder first/latency in seconds, add effort column

- logs columns are now Key | Account | Model | Effort | Type | Tokens |
  Cost | First | Latency | Tok/s | Time
- First and Latency render in seconds (5.3s) instead of milliseconds
- Effort shows the request reasoning_effort (- when absent) and is
  filterable; the detail line appends it to the model as model (effort)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-21 11:45:19 +08:00
parent 2d3d433f4f
commit fd4e3256d4
5 changed files with 53 additions and 20 deletions
+24 -6
View File
@@ -341,6 +341,7 @@ def sample_logs_payload() -> dict:
"user": {"id": 1, "name": "shujakuin"},
"model": "gpt-5.5",
"upstream_model": "gpt-5.5-codex",
"reasoning_effort": "high",
"request_type": "stream",
"stream": True,
"input_tokens": 1200,
@@ -454,8 +455,21 @@ class Sub2APILogsTests(unittest.TestCase):
oldest = rows[-1]
self.assertEqual(oldest["first_token_ms"], 800)
self.assertAlmostEqual(oldest["tokens_per_second"], 340 * 1000.0 / 4521)
self.assertIn("first 800ms", mod.log_detail_line(oldest))
self.assertIn("75.2/s", mod.log_detail_line(oldest))
self.assertEqual(oldest["effort"], "high")
self.assertEqual(rows[0]["effort"], "-")
detail = mod.log_detail_line(oldest)
self.assertIn("first 0.8s latency 5.3s", detail)
self.assertIn("(high)", detail)
self.assertIn("75.2/s", detail)
def test_format_seconds_converts_ms(self) -> None:
mod = load_module()
self.assertEqual(mod.format_seconds(5321), "5.3s")
self.assertEqual(mod.format_seconds(800), "0.8s")
self.assertEqual(mod.format_seconds(200735), "200.7s")
self.assertEqual(mod.format_seconds(0), "-")
self.assertEqual(mod.format_seconds(None), "-")
def test_key_color_is_stable_and_from_palette(self) -> None:
mod = load_module()
@@ -483,10 +497,14 @@ class Sub2APILogsTests(unittest.TestCase):
self.assertIn("stream", text)
self.assertIn("5.7K", text)
self.assertIn("$0.012", text)
self.assertIn("5321ms", text)
self.assertIn("first", text)
self.assertIn("tok/s", text)
self.assertIn("800ms", text)
header = text.splitlines()[1]
self.assertLess(header.index("model"), header.index("effort"))
self.assertLess(header.index("effort"), header.index("type"))
self.assertLess(header.index("first"), header.index("latency"))
self.assertIn("tok/s", header)
self.assertIn("high", text)
self.assertIn("5.3s", text)
self.assertIn("0.8s", text)
self.assertIn("75.2/s", text)
self.assertIn("total 2.3K records", text)