console: 任务详情也显示首字、总耗时、token

列表行与详情共用同一口径:新抽 api/taskMeta.ts(首字/
总耗时/token 计算),TaskListSection 改 import 它(逻辑
原样不动),TaskDetailPanel 在状态行下方加一行:首字
方块 + 耗时 + token,title 里写口径。
详情的数据缺口一并补上:单任务接口 _get_task 此前走
_task_to_dict 默认 total_tokens=None,详情 token 只能
显示占位;现与列表一样用 _task_tokens_map 一次聚合
(单任务只多一条查询),详情直接出真数。
types.ts 里过期的“列表不回 token”注释同步更新。
新测试:单任务 GET /tasks/{id} 聚合回 total_tokens。
This commit is contained in:
host committed 2026-10-30 00:39:13 +08:00
1 parent 3696dad7c8
commit 0f7162934b
7 files changed
+127 -99

No files matched your search

+18
View File
@@ -97,6 +97,24 @@ class ListTokensTestCase(unittest.TestCase):
self.assertEqual(by_id[t1["id"]]["total_tokens"], 170)
self.assertEqual(by_id[t2["id"]]["total_tokens"], 0)
def test_single_task_returns_aggregated_total_tokens(self):
# 详情接口(_get_task)与列表口径一致:单任务也聚合回
# total_tokens,否则详情里的 token 栏只能显示占位。
pid = self.project["id"]
_, t1 = self._req("POST", "/tasks",
{"project_id": pid, "prompt": "详情成本"},
self.owner_key)
store = CostStore(self.db_path)
try:
store.record(t1["id"], pid, "m", input_tokens=60,
output_tokens=40, source="actual")
finally:
store._conn.close()
status, body = self._req(
"GET", "/tasks/%s" % t1["id"], key=self.owner_key)
self.assertEqual(status, 200, body)
self.assertEqual(body["total_tokens"], 100)
def test_tokens_map_missing_table_is_zero_not_error(self):
import sqlite3
conn = sqlite3.connect(":memory:")