dsh-cost-manager
Đã xác minh@dachengge/dsh-cost-manager · v0.1.1 · Apache-2.0 · Giao diện web
DSH 成本管理插件:余额/费用/模型能力/任务会话统计 + 防死(硬地板与欠费切换建议)。适配用户绑定的模型,自动扫描会话用量。
Cài đặt
dsh plugin add @dachengge/dsh-cost-manager Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Tác giả
Readme
@dachengge/dsh-cost-manager
DSH 成本管理插件:把余额、费用、模型能力、任务会话用量统计交给 Agent 自动调用,并内置「防死」机制(硬地板 + 欠费切换建议)。
提供 4 个工具
| 工具 | 作用 |
|---|---|
cost_status |
各平台余额与状态 + 硬地板提示 + 切换建议 |
cost_stats |
会话 token 用量统计(按 模型/任务/日,支持时间与关键词筛选) |
cost_report |
最近花费账本(图片/视频/数字人等实付项,按平台聚合) |
cost_models |
读用户「绑定的模型」并与价目表对齐(单价/来源/擅长场景) |
与用户配置的适配
- 通过
ctx.llm.listProviders()/listModels()读取用户绑定的模型,按实际绑定做价目对齐,不做写死的模型假设。 - 会话用量来自本机 DSH 会话文件(
session.jsonl.zstd),按用户自己的任务/会话聚合。
UI:设置页「费用与余额」面板 + 3082 上的实时总览页
插件是双半区插件(host + client):
| 半区 | 文件 | 职责 |
|---|---|---|
| Host | lib/index.js |
注册 4 个工具;inject: ['tools','llm','webServer'];注册 JSON 路由与页面路由 |
| Host | lib/page.js |
GET /cost 的实时总览页(自包含 HTML,替代原先单独进程的 cost.mjs serve) |
| Host | lib/board.js |
GET /board 运维看板:同一标签内两个页签,iframe 嵌 /cost 与 /dshm |
| Client | lib/client.js |
浏览器半区,注册到 settings.section(费用面板)与 sidebar.footer.action(侧栏「运维看板」入口) |
注册的路由(都挂在 DSH 自己的端口下,默认 3082):
GET /dsh-cost/api/overview 余额 / 速率 / 用量 / 两套账(?force=1 强制重测)
GET /cost · /cost/ 实时总览页(原 8899 那份,已并入 DSH 端口)
GET /board · /board/ 运维看板:费用与余额 / 会话管理 两个页签合一
多页签看板说明:/board 用 iframe 嵌 /cost 与 /dshm(同源,均无 X-Frame-Options/CSP 限制),
切换页签只切 display——iframe 不卸载,各自的自动刷新继续跑,也不会丢当前视图状态。
页签选择记在 localStorage,也支持 #cost / #dshm 直达。打开时会 HEAD 预检两个地址,
哪一页没就绪(插件没装/没重启)就在该页签上标红点,而不是白屏。
侧栏底部由 sidebar.footer.action 提供「📊 运维看板」入口(新标签打开 /board)。
注意:看板依赖两个插件同时在位——/cost 来自本插件,/dshm 来自 @dachengge/dsh-session-manager。
布局铁律:/board 不渲染自己的页头。 它只有一条细页签栏(.tabstrip,不叫 header、
字号也刻意压小),页面身份交给被嵌入页面自己的页头。否则会出现"重复头"(看板一层 + iframe 内一层)。
test-smoke.mjs 为此加了回归断言:/board 的 HTML 里 <header> 数量必须为 0、且不得出现 class="brand"。
- 客户端 bundle 采用 DSH 约定格式
window.__ModuleLoader__.load({ id, factory }),纯 JavaScript +React.createElement(禁止 import / TS / JSX);React 由模块加载器注入。 - 视觉规范:
lib/page.js与 dshm 的/dshm页面共用同一套设计令牌与页头结构——同一组:root变量(--bg/--panel/--border/--text/--muted/--accent/--green/--yellow/--red/--radius)、同样的<header>结构(brand + 副标题 + toolbar、padding:14px 22px、background:var(--panel)、sticky)、同样的.cards/.card/.panel/.foot语法。改样式时请与dshm/lib/web/index.html对齐,不要单独漂移。 - 数据通路:host 用
ctx.webServer.register({ kind:'exact', path, handler })暴露 JSON/HTML,client 用fetch取。 - 面板内容:消耗速率(¥/h + 距硬地板可撑时长,不足 2 小时标红)、各平台余额(低于预警/地板着色)、两套账(账 A 估费 / 账 B 实付 / 成本待补,口径不同勿相加)、账 B 按平台分布。
- 性能:单家余额探测 6s 超时(
COST_CHECK_TIMEOUT_MS可调)+ 45s 结果缓存;会话扫描走异步 + mtime 增量 + 30s 缓存,不阻塞 host 事件循环;面板用 localStorage 回显上次数据(打开即出内容,后台再刷新)。 - 账 B(实付记账)文件按优先级查找:
COST_LEDGER环境变量 → 包内lib/core/data/ledger.jsonl→ 本地开发布局../../ledger.jsonl。包内不含账目数据。 - 安装后如未显示,硬刷新 Web UI 即可。
状态(内联完成,待真机验证)
- ✅ 核心已内联进
lib/core/(balances / sessions / pricing / catalog),发布后自包含、无包外相对路径依赖。 - ✅ 双半区齐全:
dsh.plugin.json声明client.main,package.json导出./client。 - 🔒 包内不含用户数据:
ledger.jsonl(真实记账明细)与config.json(本机阈值设置)不进包,运行时由代码自动创建/回退默认值。sync-core.mjs会主动剔除它们。 - 同步脚本:
node sync-core.mjs把 CLI 侧同源文件复制进lib/core/并剔除用户数据,防止两套代码漂移。 - 冒烟测试:
node test-smoke.mjs(4 个工具 + UI 路由注册与返回结构,含账 B 汇总)、node test-client.mjs(客户端半区加载、slot 注册、组件渲染)。
如何上市场
dsh plugin --profile web <args> 实际转发给 pnpm,所以「上插件市场」= 发布到 npm registry:
npm login # 需 npm 账号(当前机器未登录)
cd dsh-plugin
node sync-core.mjs # 内联核心 + 剔除用户数据
npm pack --dry-run # 复核包内容
npm publish --access public
发布前置:① ✅ LICENSE = Apache-2.0(已附全文,含专利授权,保留署名);② ⏳ npm 账号登录(npm login,当前机器未登录);③ ⏳ 真机装进 profile 验证(dsh plugin --profile web add @dachengge/dsh-cost-manager + 重启)。
当前包内容(npm pack --dry-run):11 个文件 / 26.1 kB —— LICENSE、README、cordis.patch.yml、dsh.plugin.json、package.json、lib/index.js、lib/client.js、lib/core/{balances,sessions,pricing}.mjs、lib/core/data/catalog.json。
本地校验:
node test-smoke.mjs(host 半区)、node test-client.mjs(client 半区)。安装后硬刷新 Web UI 即可看到设置页面板。
价目表覆盖
- 31 个模型/工具。绑定模型已对齐:
deepseek-v4-pro(实测)、deepseek-v4-flash-vision-exp(估算 5 元/1M token)、kimi-k2.6/glm-5.2(已登记,单价待测——前者待余额差法标定,后者为 coding 套餐不计 token 单价)。