dsh-subagent-cost:在输入框工具条按 turn 统计子智能体 token 与人民币花费

前言

在 DeepSeek Harness(DSH)里用 Task 或子智能体并行拆任务时,父会话账单往往只反映你在主对话里的用量;真正跑在子 session 里的 token 要逐个打开子会话或自己扫日志才能加总。多轮对话里还会混进好几批派工,若不分组,很难对应「这一条用户消息到底花了多少」。

dsh-subagent-cost 是 Synapse-ACh 维护的 DSH 网页客户端插件:在 composer 输入框工具条上显示药丸(dock pill),汇总当前父会话派出的子智能体会话数、总 token 与人民币估算,并按父会话的 turn 分组展开明细。计价规则与 @kidli1412/dsh-session-cost 同源(峰谷、缓存分桶),数字是估算而非官方账单。

这是什么

  • 名称:dsh-subagent-cost(npm / 安装 spec 同名)
  • 维护者:Synapse-ACh
  • 分类:客户端(dsh.client.platform: web,注入 @deepseek-ai/dsh-client-ui-conversation)
  • 版本(package.json):0.1.4
  • 许可证:MIT
  • DSH 引擎要求:>=0.2.1-rc.2 <0.3.0

宿主半注册只读 API,客户端半负责药丸与面板;子会话用量从磁盘上的 session.v4.jsonl.zstd 逐帧解压聚合,避免 Node 内置 zstd 只解第一帧导致统计为 0 的问题。

核心功能

工具条药丸与状态圆点

药丸文案形如「3 subagents · ¥0.42」,点击打开面板。圆点含义(README 原文):

  • 蓝:仍有子智能体在运行
  • 绿:全部结束
  • 灰:本会话尚未派发子智能体
  • 红:读取失败

按 turn 分组的面板

面板顶部汇总子智能体数量、总 token、是否有 running,并提供 refresh。下方按 Turn N · 时间 · 本 turn 子智能体数 分段,每行列出子智能体标识、token 与 ¥ 花费。面板底部说明:估算基于 DeepSeek V4.1 峰谷价(CNY / 1M tokens)。

「一次任务」的划分规则

分组依据是父会话的 turn,不是随意按时间戳合并:

  1. 父会话日志中的 subagent/catalog 事件给出每个 childId。
  2. turn/start 事件携带 turn。
  3. 每条 catalog 归到它之前最近一次 turn/start——即「你发一条消息 → 该轮派出的所有子智能体」为一组,同一会话多批派工不会串组。

若父日志较旧、没有 catalog 事件,插件回落到 ctx.subagents.listChildren(parentId),这些子智能体归入「未归轮」(unattributed turn)。

计量与计价(估算)

  • 每个子智能体是独立 session,只累计其自身产生的 assistant/message.data.usage。
  • Fork 子会话(isSeeded)会重放父事件作为 seed;这些 token 已在父会话计费,折叠从 inheritedEventCount 之后开始。
  • lib/cost.js 来自 @kidli1412/dsh-session-cost(MIT):按事件时间戳所在峰谷窗口计价(北京时间工作日 09:00–12:00、14:00–18:00 为高峰),按 provider/model 取价。
  • Token 桶:inputTokens(缓存未命中输入)、cacheReadTokens(约未命中价 1/50)、cacheWriteTokens、outputTokens 互不重叠。
  • 重试与失败请求不在统计内;与官方账单规则一致,但不等价于发票。

宿主 API 与性能要点

只读端点(loopback 校验,非本机访问返回 403):

GET /api/subagent-cost/summary?session=<parent session id>
  • 父会话:ctx.sessionQuery.readSession(parentId) 读一次,取 catalog 与 turn 边界。
  • 子会话:优先读 $DSH_HOME/sessions/<workspace>/<sessionId>/session.v4.jsonl.zstd,按 zstd 帧魔数 28 B5 2F FD 逐帧解压;缺失、不可解或 isSeeded 时回落 sessionQuery.readSession。
  • README 实测:38 个子智能体、约 54.6 万 token 时,磁盘路径约 0.19 s,sessionQuery 约 9.7 s,结果一致(545,792 tokens / ¥1.32122364)。
  • 客户端约 30 s 轮询;子会话增量 fold(state.consumed),以 turn/end 结尾的会话冻结后每 5 分钟再校验。

安装与启用

推荐从 npm 安装(将 <profile> 换成你的 CLI / Web profile):

dsh plugin --profile <profile> add dsh-subagent-cost

跟踪 GitHub main 尖端:

dsh plugin --profile <profile> add github:Synapse-ACh/dsh-subagent-cost

在 DSH 对话内也可通过插件管理器安装:

plugin_manager action:install_bundle target:dsh-subagent-cost
plugin_manager action:install_bundle target:github:Synapse-ACh/dsh-subagent-cost

Desktop profile:由 Electron 应用托管,dsh plugin --profile … CLI 会拒绝该 profile。请在应用内插件管理器的安装框粘贴 dsh-subagent-cost,或使用上述 plugin_manager 调用。

安装完成后刷新浏览器页面:宿主半会自动重启,客户端半(药丸)由 Web UI 加载,需要 reload 才会出现。

本地 checkout 可将仓库目录的绝对路径作为 spec 传入(README 说明;本文不展开 clone 步骤)。

典型用法

  1. 在已启用插件的 DSH Web 对话中派发子智能体(Task 等)。
  2. 观察 composer 工具条上的药丸:子智能体数量与当前估算 ¥;圆点反映运行/完成/无子智能体/读失败。
  3. 点击药丸打开面板,按 turn 查看每个子 session 的 token 与花费;需要时点 refresh。
  4. 若需离线核对聚合逻辑,仓库提供 test/local-summary.mjs,可直接对 $DSH_HOME/sessions 做汇总(见 README Layout 节)。

适用场景与注意

适合:经常在单条父消息下并行多个 subagent、需要按「用户一轮输入」对照 token/¥ 的开发者;希望在主对话界面一眼看到子智能体总成本,而不是逐个打开子 session。

注意:

  • 插件以当前 DSH 进程权限运行;安装前请阅读 GitHub 仓库 源码与 MIT 许可证,确认接受其读会话目录与暴露 loopback API 的行为。
  • 汇总 API 仅允许本机 loopback 访问,但仍属于本机服务面,勿在不信任环境中暴露 DSH 端口。
  • 数字为估算,对账请以官方账单为准。
  • 社区目录页与 GitHub 由维护者发布;与 DeepSeek / 幻方无官方从属关系,DSH 生态遵循「一切皆插件」的扩展方式。

结尾

dsh-subagent-cost 把子智能体会话的 token 与人民币估算收到输入框旁的药丸里,并按父会话 turn 分组,方便对照「这一轮派工」的成本。安装 spec 为 dsh-subagent-cost 或 github:Synapse-ACh/dsh-subagent-cost,Web 端装完记得刷新页面。

  • 目录页:https://www.skillhub.cn/plugins/Synapse-ACh/dsh-subagent-cost
  • GitHub:https://github.com/Synapse-ACh/dsh-subagent-cost
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜