dsh-task-digest:每晚逐任务 token/金额日报

前言

在使用 DeepSeek Harness(DSH)编排智能体时,任务的执行情况、Token 消耗和费用往往是事后统计。手工翻看日志既耗时,也容易遗漏细节。dsh-task-digest 插件在每天固定时间自动对前一天的任务进行汇总,生成包含 Token、费用、任务类型、结果与建议的中文日报。

插件定位

这是一个 DSH Web 插件,由维护者 nwasvsad 提供。它的核心是「按天」对 Session 日志进行聚合:将同一天内执行过的任务按类型、结果和用量整理成一份 Markdown 报告,同时生成一个「每日总结」会话留在会话列表中。

自动日报生成

插件在每天北京时间 00:05 自动触发。它会读取前一天创建或更新过的 root Session,排除子代理和历史总结会话,按日志统计每个任务的:

  • 标题
  • 类型(计划任务通过 [[dsh-task-plan]] 标记识别,其他通过标题/工具启发式判断)
  • 结果(取最后一条 assistant 回复)
  • 输入/输出 Token
  • 峰谷时段的费用
  • 耗时与会话 ID

若当天有运行中的 root Session,插件最多等待 summaryWaitMs(默认 10 分钟),之后按部分数据出报。

峰谷与计费口径

费用按公开单价估算,不直接对应账单。计费规则与 dsh-token-cost 和 dsh-task-plan 保持一致:

  • 峰时:周一至周五排除法定节假日,北京时间 09:00–12:00、14:00–18:00
  • 谷时:其余时间
  • 价格(元 / 百万 token,缓存命中 / 未命中 / 输出):
  • deepseek-flash:谷 0.02 / 1 / 4,峰 0.04 / 2 / 8
  • deepseek-v4-pro:谷 0.15 / 4.5 / 13.5,峰 0.3 / 9 / 27

每个用量样本按它自己的事件时间判峰谷;未知模型只统计 token,金额标未知。

安装

从 GitHub 安装:

dsh plugin --profile web add github:nwasvsad/dsh-task-digest#<commit>

插件市场索引位于:

https://nwasvsad.github.io/dsh-plugin-market/index.json

Git 安装会拉取源码并执行 prepare(重新构建 lib/client.js)。如果 pnpm 要求构建授权,把包名加入 profile 的 pnpm-workspace.yaml 的 allowBuilds。lib/ 已提交,未授权构建时通常可直接加载。

安装后默认使用 $DSH_HOME/task-digest;计划任务识别不依赖 dsh-task-plan,两个包可分别安装。

配置

安装后默认配置如下:

# dsh-task-digest: nightly per-task digest
- insert:
    - id: task-digest
      name: dsh-task-digest
      config:
        dataDir: '~/.dsh/task-digest'
        defaultCwd: '~'
        summaryAt: '00:05'
        summaryWaitMs: 600000
        holidays: []
        currency: '¥'

主要配置项:

键 默认值 说明
enabled true 总开关
dataDir $DSH_HOME/task-digest 报告根目录
defaultCwd process.cwd() 总结 Session 的工作目录
summaryEnabled true 每日总结开关
summaryAt '00:05' 总结前一天的时刻(北京时间)
summaryWaitMs 600000 等待运行中 root Session 的上限;0 表示不等
summaryTimeoutMs 600000 总结 Session 超时
summaryMaxSessions 40 日报最多任务数
summaryResultChars 400 每任务结果进 prompt 的截断
skipEmptyDays true 无会话不生成日报,只推进日期
reportKeepDays 180 预留的报告保留天数
holidays [] 全天谷值的 YYYY-MM-DD
currency '¥' 金额前缀
startTimeoutMs 15000 总结 Agent 进入 running 的上限
pollIntervalMs 500 状态轮询

holidays / currency 应与计划包保持一致,否则两边的金额口径会不同。

查看方式

安装后刷新 http://127.0.0.1:3080,左侧栏会出现「每日总结」:

  • 日报列表 + 正文
  • 「生成昨日总结 / 重新生成」手动触发
  • 「打开总结会话」跳到当天的总结 Session

日报文件落在 dataDir/reports/,页面只读索引,不依赖计划页。

迁移旧版日报

旧版 dsh-task-plan 把日报存在 .../task-plan/reports/。安装本包后可执行迁移:

node scripts/migrate-from-plan.mjs `
  --from ~/.dsh/task-plan `
  --to   ~/.dsh/task-digest

该脚本会复制 reports/*.json|*.md,合并索引,lastSummaryDate 取最新日期。重复执行为幂等操作,--force 可覆盖目标文件。迁移后旧 reports/ 保留为备份。

数据结构

数据目录结构如下:

<dataDir>/
  reports/
    index.json          # { version, lastSummaryDate, items[] }
    2026-10-22.json     # 事实 + Markdown + summaryUsage/summaryCost
    2026-10-22.md       # Markdown 原文
  • 索引与报告均原子写;索引缺失/损坏时从 reports/*.json 重建,lastSummaryDate 取最新日期。
  • lastSummaryDate 只前进不后退;空日跳过也会推进,避免反复重试。
  • 历史总结 Session 通过索引里的 summarySessionId 与 prompt 标记排除,不会进入下一次日报。

HTTP API

所有接口走 connection.requestRejection,body ≤ 64KB:

方法 路径 说明
GET /api/task-digest/state 下次总结、运行状态、日报列表
POST /api/task-digest/summary {date?},默认昨天;运行中 409
GET /api/task-digest/reports 日报列表
GET /api/task-digest/report?date= 单份日报

机制说明

运行机制如下:

  1. 每 30 秒 tick;当前 ≥ 当天 summaryAt 且 lastSummaryDate !== 昨天 时触发。
  2. sessionController.list 取 root Session;按 updatedAt 过滤当日候选;排除子代理与历史总结会话。
  3. 逐个读日志:
    - createdAt 在当日 → 折叠整段会话;否则只折叠当日时间窗。
    - 计划任务识别 [[dsh-task-plan]],类型解析 (类型:X);否则用标题/工具启发式。
    - 最后一条 non-empty assistant 文本作为结果;子代理用量归并。
  4. 构建事实 JSON → 总结 Session 写中文 Markdown;失败用 fallback 模板。
  5. 写报告文件 + 索引 + lastSummaryDate;页面轮询 state。

注意事项

  • Host 必须常开。停机则当天不生成,启动后补最近一天。
  • 计划任务的边界:若任务在创建 Session 前就失败(无会话),日报看不到;计划页仍会显示失败。
  • 跨午夜:当日创建的会话按整段统计,可能包含少量次日凌晨用量;报告会标注 whole-session。
  • 审批:总结 Session 继承部署的 sandbox/approval 策略;Prompt 要求不调用工具,但不会强制。
  • 配置重复:两包的 tier.js/usage.js 是复制关系;修改价格/峰谷规则时两份一起改,parity 测试会失败提醒。
  • 不新增模型侧工具;日报质量取决于当天日志与总结模型。

适用场景

适合需要按天复盘智能体执行情况、关注 Token 与费用分布的开发者。插件与 dsh-task-plan 互相独立,可分别安装/启停。

参考资料

  • 插件目录页:https://www.skillhub.cn/plugins/nwasvsad/dsh-task-digest
  • GitHub 仓库:https://github.com/nwasvsad/dsh-task-digest
羽毛球分组比赛记分
小程序二维码

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

小夜