DSH-WeeklyReport-WhenOneWeekFinish:按周把 token 用量与工作汇总发到邮箱

前言

用 DSH 做智能体开发时,用量面板能看当周数字,但很难在固定时刻留一份可检索的归档,也不方便在手机上扫一眼「这周动了哪些项目」。手工导出会话、手算费用既费时,又容易和面板口径不一致。

下面介绍社区维护者 xkzdwb 发布的 cordis 插件 DSH-WeeklyReport-WhenOneWeekFinish:挂在 DSH HOST 里,按你配置的星期与时区定时发一封邮件;统计只读 DSH 会话日志,不调模型、不改会话数据。SMTP 与 MIME 用 Node 内置能力自实现,无需 npm install。分类为工作流,可在 SkillHub 目录页 查看条目;源码与说明见 GitHub 仓库(截至资料记录为 1 star)。

这是什么

插件在每周指定时刻(某天 HH:MM,可指定时区)向配置收件人发送 HTML 与纯文本双格式的周报。邮件主题示例:

[DSH 周报] 2026-10-29 ~ 2026-11-05 · 2.12 亿 tokens / ¥149.81

数字来自 DSH 写入的会话事件日志;费用由配置中的 currency / pricing 占位单价重算,与用量面板默认价表对齐,并非联网询价。若该周没有任何模型调用,仍会发信,正文标明「这一周没有任何模型调用记录」,便于区分「没发信」和「本周确实无调用」。

到点 DSH 未运行时可启用 catchUp,下次启动补发最近一期;也可在不启动 DSH 时用 node tools/weekly-report.mjs 本地预览或测试发信。运行环境要求 Node >=20(见 package.json),许可证 MIT。

核心功能

邮件内容与边界

做 不做
按周期发 HTML + 纯文本周报 不调模型、不生成「读后感」式总结
从会话日志统计四类 token、调用次数、会话数、工具调用 不改会话数据,只读
按工作目录(header.cwd)分组列出本周有活动的会话与首条请求摘要 不读消息正文、不读工具输出
合并、补发、失败重试,审计写入 audit/sent.jsonl 除 SMTP 外不访问外部服务

正文大致包含:一句话汇总(含与上周对比)、Token 用量明细、按天 7 行、按 provider/model 拆分、工作汇总(项目 → 会话)、工具调用 Top 5。首条请求摘要默认 140 字;疑似密钥片段会打码为 [已隐去密钥] 等。HTML 仅用内联样式,无外链资源。

数据口径(与面板差异处)

统计通过 ctx.sessionQuery.listSessions() 与 readSession(id) 折事件日志:按事件时间落在发送窗口 [from, to) 内过滤,不是按会话创建时间整段归档。四类 token(input / output / cacheRead / cacheWrite)分开计价;子代理计入总量,会话数单独列出。工作汇总分组键是会话工作目录,不是项目显示名。

运维与可观测性

插件注册两条只读 HTTP 路由:/plugin-weekly-report/status(排期、上次发送、错误等)与 /plugin-weekly-report/preview(渲染完整周报但不发信)。state.json 记录安装与发送状态;dryRun: true 时到点只记账不发信。

安装与启用

官方 README 未给出 dsh plugin add 一类命令;启用方式是把片段写入 profile 的 cordis.patch.yml。先做下面几步,再重启 DSH。

  1. 将 examples/cordis.patch.snippet.yml 中的条目加入 ~/.dsh/profiles/<profile>/cordis.patch.yml 的 - insert: 列表,路径改为你机器上的绝对路径:
- id: weekly-report
  name: "/absolute/path/to/DSH-WeeklyReport-WhenOneWeekFinish/src/plugin.js"
  config:
    to: you@example.com
    address: sender@example.com
    secretsFile: "/absolute/path/to/DSH-WeeklyReport-WhenOneWeekFinish/secrets.json"
    weekday: 0        # 0=周日 … 6=周六
    time: "00:00"     # 必须带引号,否则 YAML 会当成 60 进制整数
    timeZone: Asia/Shanghai
    catchUp: true
    windowDays: 7

「周六 24:00」在实现上等于周日 00:00,故 weekday: 0;若要周六 00:00,将 weekday 改为 6。

  1. 复制 secrets.example.json 为 secrets.json,填入邮箱服务商的应用专用密码(163 为「客户端授权码」):
{ "authCode": "你的授权码", "user": "sender@example.com" }

也可在 config 中直接写 authCode,无需文件。默认 SMTP 为 smtp.163.com:465(SSL),换邮箱时改 smtp 配置。

  1. 重启 DSH。修改 cordis.patch.yml 可自动重载;修改插件源码 src/*.mjs 需重启后生效。

  2. 确认装配成功:

curl http://127.0.0.1:1869/plugin-weekly-report/status
curl "http://127.0.0.1:1869/plugin-weekly-report/preview?days=7&format=html" -o preview.html

package.json 中 dsh.bundle.patch 指向 ./cordis.patch.yml,若你使用 DSH 的 bundle 流程,可按仓库内对应文件一并纳入 profile。

典型用法

在 HOST 内定时发送

装好并配置 to、weekday、time、timeZone 后,插件按 tickIntervalMs(默认 60000)检查是否到点。首次安装不会立刻发信,只会排下一次;错过时刻且 catchUp: true 时启动后补发一期,主题带「(补发)」。SMTP 失败会 10 分钟后重试,最多 5 次。

命令行预览与测试(不依赖 DSH 进程)

# 渲染纯文本,默认不发信
node tools/weekly-report.mjs --to you@example.com --secrets secrets.json

# 保存 HTML 到本地
node tools/weekly-report.mjs --to you@example.com --secrets secrets.json --html preview.html

# 实际发一封测试信
node tools/weekly-report.mjs --to you@example.com --secrets secrets.json --send --subject-prefix "[DSH 周报测试]"

# 按配置的发送时刻取上一完整周期
node tools/weekly-report.mjs --to you@example.com --secrets secrets.json --end schedule

# 仅探测 SMTP 认证
node tools/probe-mail.mjs secrets.json

命令行读 ~/.dsh/sessions/*/*/session.v4.jsonl.zstd,与 HOST 内 sessionQuery 共用同一套 collect.mjs / report.mjs 逻辑。

常用配置项摘要

键 说明
to 收件人(必填)
windowDays 统计窗口天数,默认 7
pricing 每 100 万 token 单价,可按模型覆盖
topProjects / sessionsPerProject / topTools 工作汇总与工具榜截断
dryRun 到点记账不发信,便于观察一周

完整表格见仓库 README 第 4 节。

适用场景与注意

适合谁: 需要每周固定收到 DSH 用量与工作清单、希望与面板费用口径一致、又不愿引入额外 npm 邮件库的用户。适合配合 163 等支持应用密码的 SMTP;也可改 smtp 适配其他服务商。

权限与安全: 插件以当前 DSH 进程权限运行,能读本会话日志与配置的 secretsFile;安装前请自行审阅 src/plugin.js 等源码与 MIT 许可证。勿将 secrets.json 提交到版本库(仓库已列入 .gitignore)。

已知限制(README 摘录): DSH 未运行时无法到点发送,仅能启动补发;长期关机只补最近一期。「工作汇总」是清单而非语义摘要;跨周会话的会话数口径与面板按会话归档的方式不完全相同;费用为配置占位值,中转或多模型场景需自行维护 pricing。

DSH 社区目录(SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系;插件属「一切皆插件」生态中的第三方工作流扩展。

结尾

经过上面的步骤,你可以在周日零点(或任意 weekday / time)自动收到一封可存档的周报:token 四类拆分、按模型费用、按目录的项目与会话摘要,且无第三方邮件依赖。开发与验证侧,仓库提供 node test/run-tests.mjs(32 条用例,CI 使用 Node 20)。

  • 目录页:https://www.skillhub.cn/plugins/xkzdwb/DSH-WeeklyReport-WhenOneWeekFinish
  • GitHub:https://github.com/xkzdwb/DSH-WeeklyReport-WhenOneWeekFinish
羽毛球分组比赛记分
小程序二维码

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

Xiaoye