前言¶
用 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。
- 将
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。
- 复制
secrets.example.json为secrets.json,填入邮箱服务商的应用专用密码(163 为「客户端授权码」):
{ "authCode": "你的授权码", "user": "sender@example.com" }
也可在 config 中直接写 authCode,无需文件。默认 SMTP 为 smtp.163.com:465(SSL),换邮箱时改 smtp 配置。
-
重启 DSH。修改
cordis.patch.yml可自动重载;修改插件源码src/*.mjs需重启后生效。 -
确认装配成功:
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