前言¶
在 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:
- 照常向 models.dev 拉取权威价格簿;
- 在内存中按规则合并自建 provider、派生价、手填价;
- 把合并结果交给 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 接口后,从派生价或手填价试起。