dsh-price-mixer:为自建模型补上 Context 面板的 Est. Cost

前言

在 DeepSeek Harness(DSH)里配合 dsh-context 看上下文用量时,Est. Cost 通常等于 token 数乘以 models.dev 公开价格簿里的单价。若你走自建网关、OpenAI 兼容反代,或模型名挂在簿子上查不到、同名多家报价不一致,面板往往直接显示 —,成本反而最难看清。

下面介绍的 dsh-price-mixer 是社区插件(维护者 ymf2317-tech),分类为联网工具。它在不修改 dsh-context 源码、不额外起服务、不占端口的前提下,向 dsh-context 拉取的那份价格簿注入自定义单价,并提供侧栏编辑器;装好后 Context 里有机会出现正常的 Est. Cost,而不是长期 Not priced。

这是什么

一句话:把「我方模型价」缝进 models.dev 的 api.json 响应链路,并用手填价覆盖。

插件归属仓库 ymf2317-tech/dsh-price-mixer,当前 npm 包版本 0.2.1,许可证 MIT。它是 DSH 生态里的 workaround:上游 dsh-context 若日后内建可配置价格源,README 写明本插件可退役。

与「改 context 配置或 fork 价格源」相比,本插件只拦截宿主里的一个固定 URL(https://models.dev/api.json),其余 HTTP 请求原样放行;注入失败则回退为透传权威价格簿,最坏情况是自定义价不生效,而不是弄坏整本价格簿。

核心功能

价格注入机制

宿主启动时对 globalThis.fetch 套一层壳,仅处理 https://models.dev/api.json:

  1. 照常向 models.dev 拉取权威价格簿;
  2. 在内存中按规则合并自建 provider、派生价、手填价;
  3. 把合并结果交给 dsh-context。

dsh-context 对价格簿的 1 小时缓存 TTL 不受影响;其它 URL 不受影响。

单价解析优先级

优先级 来源 说明
1 手填 侧栏保存,落在 ~/.dsh/price-mixer.json,永远最优先
2 派生 剥掉模型名后缀 -max 后查内置 19 条映射,抄权威簿对应厂商当前价(含 cache_read)
3 模糊匹配 同厂商家族末段同名,或全库同名且各厂商报价一致才采用;不一致则留空
4 无源 不注入,面板标「无价」,等待手填

内置映射示例(README 原文):glm-5.3-max→zhipuai/glm-5.3,deepseek-v4.1-flash-max→deepseek/deepseek-v4-flash,Doubao-Seed-2.1-Pro-max→ofox/volcengine/doubao-seed-2.1-pro 等。

侧栏「价格影子」面板

通过客户端插槽挂在 Web profile 侧栏,可:

  • 列出全部模型及来源标签(手填 / 派生 / 模糊 / 无价);
  • 编辑输入、输出、缓存读、缓存写(USD / 1M tokens);
  • 保存、恢复派生、刷新、重读价格簿、清空手填。

插件自行按需拉取价格簿(约 6 MB,1 小时缓存、60s 超时),不依赖 dsh-context 是否已取过价。

宿主 HTTP API

与 DSH webServer 同端口,无额外监听:

方法 路径 用途
GET /price-mixer/status 壳状态、注入计数、价格簿状态
GET /price-mixer/models 全部模型及生效价、来源
POST /price-mixer/reload 强制重读权威价格簿
POST /price-mixer/override 写手填价
POST /price-mixer/reset 按模型或全部清除手填

安装与启用

DSH 默认 profile 目录为 ~/.dsh/profiles/web。README 给出三种方式,常用的是 npm 安装。

方式 A:从 npm 安装(推荐)

dsh plugin --profile web add dsh-price-mixer

包已发布:dsh-price-mixer。

方式 B:从 GitHub 安装

dsh plugin --profile web add github:ymf2317-tech/dsh-price-mixer

依赖与环境

依赖 版本要求 说明
DeepSeek Harness >= 0.2.0-rc.2(README 实测 0.2.2-rc.1) 需 webServer 与 slots
Node.js >= 22.19.0(README 实测 24.9.0) 全局 fetch 等
dsh-context 任意(README 实测 0.83.1) 被增强方,非硬依赖
网络 需访问 https://models.dev/api.json 拉不到时退化为上次结果 + 手填

安装后重启 dsh,浏览器 Ctrl+Shift+R 强刷。可用下面命令自检(将 <web端口> 换成实际端口):

curl -s http://127.0.0.1:<web端口>/price-mixer/status
# 期望:{"ok":true,"installed":true,...}

典型用法

手填覆盖单价

首次在侧栏保存后,插件自动创建 ~/.dsh/price-mixer.json(位于 ~/.dsh,升级重装不冲掉):

{
  "overrides": {
    "glm-5.3-max": { "input": 1.2, "output": 4.2, "cache_read": 0.3, "cache_write": 1.2 }
  }
}
  • 单位:USD / 1M tokens;省略 cache_read / cache_write 时默认等于 input。
  • 删掉某模型键即回落派生价;删文件则全部回落。

生效时机:dsh-context 自身缓存价格簿 1 小时,保存后需等待其下次取价,或重启宿主(README 说明插件不去绕开该策略)。

用 API 写手填价

curl -s -X POST http://127.0.0.1:<web端口>/price-mixer/override \
  -H 'Content-Type: application/json' \
  -d '{"model":"your-model-id","input":1.0,"output":3.0}'

需要与 Context 里出现的模型 id 一致。

适用场景与注意

适合谁

  • 使用自建或反代 provider(例如 README 提到的 agent2api),models.dev 235 个 provider 里对不上;
  • 模型名带 -max 等自建命名,希望先走派生/模糊匹配,再微调手填价;
  • 已在 Web profile 使用 dsh-context,只想让 Est. Cost 出数。

安装前应知

  • 插件以当前 dsh 进程权限运行,会对 globalThis.fetch 挂壳(非官方插件 API,作用域仅锁上述 API URL)。安装前建议阅读 仓库源码 与 MIT 许可证。
  • README 写明仅在 Web profile 验证过侧栏;Trae 源 -max 模型不回报缓存时按输入全价算是平台差异;注入段不做 DeepSeek 峰时 ×2 加成。
  • 社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方商店从属关系。

回滚:按 README 从 cordis.patch.yml、package.json 移除 dsh-price-mixer 相关项后重启;~/.dsh/price-mixer.json 可留可删,未改动 dsh-context 文件。

结尾

dsh-price-mixer 针对「簿子上没有你家 provider、或同名模型无价」这类链路硬伤,用 fetch 拦截 + 手填影子价把 Est. Cost 补回 Context 面板,并给出侧栏与 HTTP API 两套编辑入口。若你正在 DSH 里烧自建模型的 token,又看不惯成本一栏一直是 —,可以按 profile 装上插件、核对 status 接口后,从派生价或手填价试起。

羽毛球分组比赛记分
小程序二维码

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

小夜