dsh-plugin-session-cost
Manifest validDSH plugin: estimated session cost in the composer status bar, split by DeepSeek peak/idle tariff periods
dsh-session-tariff
给 DSH(DeepSeek Harness) Web GUI 的输入框状态栏加一个「本会话花费」胶囊:按每条请求所属 provider 的高峰 / 空闲两档价分别计价——deepseek-account(DeepSeek 官方)与 bailian / bailian-chat(阿里云百炼)内置价目表,也可以用 config.providers 逐 provider 覆盖——点开可看到每个时段、每个模型的缓存读取、未缓存输入、缓存写入、输出各自的 token 数与金额。
A DSH plugin that shows the estimated monetary cost of the current session beside the composer status pills, priced per provider with built-in DeepSeek official and Alibaba Cloud Bailian price books (and
config.providersoverrides). Click the pill for a per-provider, per-model, per-period token and amount breakdown.
效果
胶囊排在原有统计控件之后、上下文占用圆环之前:
⌁ 3 轮 102 步 · 251 tok/s ⛁ 18.2M tok · 缓存命中 99% ⊙ ≈¥1.72 ◔ 19%
点开胶囊:
本会话花费 ¥1.72
──────────────────────────────────────────────────────────
高峰时段 149 次请求 ¥1.72
缓存读取 18.2M ¥0.729
未缓存输入 133.0K ¥0.266
输出 90.9K ¥0.727
──────────────────────────────────────────────────────────
空闲:命中 ¥0.02 · 未命中 ¥1 · 输出 ¥4 / 百万 tokens
高峰:命中 ¥0.04 · 未命中 ¥2 · 输出 ¥8 / 百万 tokens
高峰时段为工作日 09:00-12:00 / 14:00-18:00;其余时间含周末与法定节假日按空闲计
- 金额标
≈:这是按 token 用量和单价算出的估算,不是账单 - token 列用
K/M缩写;鼠标悬停可看到完整千分位数(如18,234,567) - 三行金额各自四舍五入(3 位),相加可能与时段合计差 ±0.001
- 会话跨多个 provider 时,明细行在时段标签前多一个 provider 小标签,底部单价与时段规则也按 provider 分组;只有一个 provider 时与上面完全一致
- 模型名用 DSH 模型选择器里的显示名称(读实时模型目录);鼠标悬停可看到真实 model id,计价与价目表仍按 model id 精确匹配,不受显示名影响
功能
- 胶囊显示本会话(整个日志,不是当前窗口)的估算花费,口径与旁边的 token 统计一致
- 按 provider 计价:
deepseek-account(DeepSeek 官方)与bailian/bailian-chat(阿里云百炼)内置价目表和时段规则,开箱即用;也可以用config.providers逐 provider 覆盖 - 价目在 GUI 里改:设置 → 插件 → dsh-session-tariff(或内置插件页的「会话花费」标签),行随 DSH 注册的 provider / 模型自动生成,改完保存立即生效(写入 profile 的
cordis.patch.yml,不用重启) - 按时段分组:只在某个时段用过量就只显示那一档
- 每个时段给出请求次数与四个用量桶的 token 数、分摊金额
- 底部注明本次实际结算的单价(模型自定义行优先于供应商默认档)与时段规则;同一 provider 下费率不同时按模型分行标注
- 同一个会话跨多个 provider 时按 provider 分账:明细行带 provider 标签,底部说明按 provider 分组列出各自的单价与时段规则
- 跟随 DSH 主题令牌与语言(中/英),桌面与窄屏都不换行错位
- 支持键盘:
Esc关闭,点击面板外关闭
工作原理
为什么需要宿主侧的投影
DSH 自带的 tokenUsage 投影只给全量聚合桶,没有时间维度,因此无法回答「这 1800 万 token 分别发生在哪些时段」。本插件在宿主侧注册一个会话投影 sessionCost(host.js),逐事件折叠每次模型请求:按 request/context 与 message.source 解析出 provider / 模型,再按该 provider 的价目表与请求发起时刻计价,输出「provider × 模型 × 时段」账本;客户端(client.js)只负责取数、套单价、渲染。
session/* 事件流
├─ request/context → 路由变化(首个请求或切 provider / 模型)时更新当前 provider + model
├─ step/start → 记录本次请求的发起时刻
├─ assistant/attempt → 流式上报的 usage(随后会被同一请求的 message 覆盖)
├─ assistant/message → 该请求的最终 usage,按 message.source.provider / model 归入
│ 对应 provider 的价目表与该模型的独立账本,按发起时刻归入 idle / peak
└─ llm/retry-started → 关闭覆盖槽,重试算作第二次请求
↓
sessionCost 投影 → { idle: {…}, peak: {…}, books: [{ provider, peakWindows, weekends, idle, peak, models }], models: [{ provider, model, idle, peak }] }
↓
胶囊 + 明细对话框(按「provider × 模型 × 时段」分行,每行用该 provider 价目表里该模型的单价)
计价口径
- 一次请求 = 一次模型调用,归属时段取
step/start事件的time(请求发起时刻,不是完成时刻) - provider 与模型归属:以该请求
assistant/message的message.source.provider/message.source.model为准;assistant/attempt不带 source,归到最近一次request/context记下的当前路由。每个 provider 有独立的价目表(时段规则 + 单价),跨 provider 时按 provider 分账,总额口径不变 - 同一步骤内先到的
assistant/attempt用量会被该步骤的assistant/message覆盖,不会重复计 llm/retry-started后的重试是另一次计费请求,单独累加- 没有 provider usage 的请求(被取消且未上报)不计入
- 金额 = Σ(桶 token × 该桶单价) ÷ 1,000,000
该折叠与官方 tokenUsage 单元同口径,因此两档合计应与 tokenUsage 合计逐项相等(见「已验证」)。
时段判定
时区固定为 UTC+8(utcOffsetMinutes: 480,中国无夏令时):
| 时间 | 档位 |
|---|---|
| 工作日 09:00–12:00 | 高峰 |
| 工作日 12:00–14:00 | 空闲 |
| 工作日 14:00–18:00 | 高峰 |
| 工作日 18:00–次日 09:00 | 空闲 |
| 周六、周日(除非是调休上班日) | 空闲 |
| 法定节假日 | 空闲 |
workdays(调休上班日)优先于 holidays 与周末:一个落在周六的调休上班日,工作时段内仍按高峰计。
安装
前置:一个可用的 DSH(Desktop 或带 profile 启动的 dsh),插件按 profile 安装,对该 profile 下所有会话生效。声明的兼容范围是 @deepseek-ai/dsh ^0.2.1-rc.2,实测于 0.2.1-rc.3;0.1.x 的客户端 slot / 投影 API 与 0.2 不同,没有测过。
方式一:npm 安装(发布后可用)
dsh plugin add dsh-session-tariff
方式二:让 DSH 助手从源码安装(推荐,当前可用)
在本仓库或任意 DSH 会话里对它说:
把这个插件装到当前 profile:
https://github.com/xuanyuanli/dsh-session-tariff,克隆到本地后用plugin_manager install_bundle安装那个目录。
方式三:手动 clone 后安装
git clone https://github.com/xuanyuanli/dsh-session-tariff.git
然后在 DSH 里让助手对该目录执行 plugin_manager 的 install_bundle(目标为绝对路径),或在插件页安装本地目录。
安装后:
- 客户端半(胶囊与对话框)刷新页面即可生效(必要时
Ctrl+Shift+R) - 宿主半(
sessionCost投影)在 DSH 进程内注册;从 1.1.0 升级时投影键名仍是sessionCost,但宿主状态形状(stateVersion: 2)和计价逻辑都已改变,需要重启 DSH 才能装载新的模块;只改客户端半时刷新页面即可
卸载:让助手执行 plugin_manager remove_bundle dsh-session-tariff(用 npm 装的则 dsh plugin remove dsh-session-tariff)。
配置
在 GUI 里改价目:设置 → 插件 → dsh-session-tariff
装好之后不用改任何 YAML。打开 设置 → 插件,在本插件(dsh-session-tariff)的页面上,描述下面就是 会话花费价目 编辑区;session-tariff 这一行右侧还有一个「配置」按钮,点开是同一份编辑器的整页版本。设置 → 内置插件 里另有 会话花费 标签页,内容相同——三个入口指向同一份价目。
- 行来自 DSH 自己:页面从宿主读到 DSH 当前注册的 provider 与模型(
ctx.llm.listProviders()/listModels()),一个模型一行。新增 provider 或模型,刷新页面就多一行,默认费率已经按「内置预设 → 供应商默认档 → 兜底价目」的顺序填好,留空即沿用;删掉模型,那一行就不再出现,它残留的配置会归到「已失效的配置」里,一键清除即可。 - 改哪一格就只覆盖那一格:输入框有内容 = 该格显式定价;清空输入框 = 恢复继承(不是写 0)。每行右边「恢复默认」清掉该行;供应商卡片右上角「清除本供应商全部覆盖」清掉整块。
- 保存即生效:保存走宿主的
configEditor,写进当前 profile 的cordis.patch.yml并重新应用插件行——胶囊、明细面板和投影下一次计算就用新价,不需要重启。 - 时段规则同页可改:高峰窗口、周末口径、时区、节假日/调休工作日都在同一张卡片上;空着就继承(预设或兜底)。
- 兜底价目卡:给没有内置预设的 provider 用,也能改币种。
- 页面底部提示「已保存,胶囊已按新价重算」时,改动已经落到磁盘。
服务端只有一套接口:
GET /dsh-session-tariff/api/state返回「实时目录 + 当前配置 + 可写标记」,POST /dsh-session-tariff/api/save校验后写盘。写入只接受同源application/json请求,配置在落盘前先过sanitizeConfig()严格校验(未知字段、负数、坏的HH:MM-HH:MM/YYYY-MM-DD、原型污染键都直接拒绝,不会写进 profile)。
宿主半是代码,改了 host.js 才需要重启 DSH;只改客户端半刷新页面即可,价目本身是配置,永远热更新。
下面的 YAML 写法仍然完全有效,适合「一次写死、随仓库分发」,也适合脚本化安装:
单价(客户端)
默认值在 client.js 顶部,它同时也是没有预设的 provider 的兜底价目表:
const DEFAULT_PRICING = {
currency: '¥',
idle: { cacheHit: 0.02, cacheMiss: 1, cacheWrite: 1, output: 4 },
peak: { cacheHit: 0.04, cacheMiss: 2, cacheWrite: 2, output: 8 }
}
单位是货币单位 / 百万 tokens。config.pricing 仍可覆盖这份兜底表(可只覆盖部分字段),但它只对既没有内置预设、也没有 config.providers 条目的 provider 生效:
- insert:
- id: session-tariff
name: dsh-session-tariff
config:
pricing:
currency: '¥'
idle: { cacheHit: 0.02, cacheMiss: 1, cacheWrite: 1, output: 4 }
peak: { cacheHit: 0.04, cacheMiss: 2, cacheWrite: 2, output: 8 }
价目来源。 上面这组数字是 DeepSeek 官方《模型 & 价格》页(2026-10 核对)的
deepseek-flash档:空闲 0.02 / 1 / 4,高峰 0.04 / 2 / 8,高峰正好是空闲的两倍;它既是兜底默认值,也是内置deepseek-account预设的顶层费率。三个注意点:
cacheWrite默认取未命中价:DeepSeek 没有单独的缓存写入价(写入的 token 落在未命中桶里),对会单独上报写入量的 provider 来说,按未命中价计也最接近账单。会话里cacheWriteTokens恒为 0 时这一项自然为 0。deepseek-v4-pro的两档价(空闲0.15 / 4.5 / 4.5 / 13.5、高峰0.30 / 9 / 9 / 27)已经包含在deepseek-account预设里,不用再手动改;预设之外的其他模型在config.providers里补。- 价目是会变的,它不是从 API 实时取的,改价后自己更新对应的
config.providers.<provider>条目或兜底config.pricing。
按 provider 计价
同一个会话可能跑过多个 provider(切 provider、切模型、子代理),它们的价目表和时段规则并不相同。插件按每条请求所属的 provider 选价目表,归属信息从事件流里取:
- 每次路由变化(会话第一个请求,或切到别的 provider / 模型)宿主会追加一条
request/context,携带provider与model;折叠时用它记住当前路由 - 每条
assistant/message的message.source.provider/message.source.model是该次请求的权威归属 assistant/attempt本身不带 source,归到当前路由
内置预设覆盖两个常见的 provider:deepseek-account(DeepSeek 官方)与 bailian / bailian-chat(阿里云百炼),开箱即用;config.providers 可以逐 provider 覆盖,也可以给没有预设的 provider 补一份价目表。价目表的单位与前面一致:货币单位 / 百万 tokens(两套内置预设都是人民币 ¥),每组数字依次为「缓存命中 / 未命中 / 写入 / 输出」。
内置预设:DeepSeek 官方
deepseek-account 采用 DeepSeek 官方口径:高峰窗口为工作日 09:00-12:00 / 14:00-18:00,周末与法定节假日全天按空闲(weekends: 'idle')。
| 模型 | 空闲(命中 / 未命中 / 写入 / 输出) | 高峰(命中 / 未命中 / 写入 / 输出) |
|---|---|---|
deepseek-flash(默认) | 0.02 / 1 / 1 / 4 | 0.04 / 2 / 2 / 8 |
deepseek-v4-pro | 0.15 / 4.5 / 4.5 / 13.5 | 0.30 / 9 / 9 / 27 |
内置预设:阿里云百炼
bailian(OpenAI-responses 端点)与 bailian-chat(OpenAI-completions 端点)是两个 provider id,共用同一套百炼预设。百炼的口径和 DeepSeek 有几处根本不同(以 deepseek-v4.1-flash-1017 为例):
| DeepSeek 官方 | 百炼 | |
|---|---|---|
| 闲时时段 | 无统一「闲时」,只有工作日的高峰窗口 | 东八区 22:00–次日 08:00 为闲时,其余全部忙时 |
| 周末 | 全天按空闲计 | 无优惠,照常按忙时 |
| 缓存命中 | 0.02 / 0.04 | 0.1 / 0.2 |
插件默认的 peakWindows 无法表达跨零点区间(22:00-24:00 这类写法不生效),所以预设用「反着填」的方式实现:把白天写成忙时窗口(peakWindows: ['08:00-22:00']),并让周末也走钟点判定(weekends: 'clock')。这些都已经内置,不需要再在 bundle 里全局改 peakWindows / weekends。
| 模型 | 空闲(命中 / 未命中 / 写入 / 输出) | 高峰(命中 / 未命中 / 写入 / 输出) |
|---|---|---|
deepseek-v4.1-flash-1017(默认) | 0.1 / 1 / 1 / 4 | 0.2 / 2 / 2 / 8 |
qwen3.8-max | 1.5 / 12 / 12 / 36 | 与空闲相同 |
ZHIPU/GLM-5.3-Flash | 0.23 / 0.8 / 0.8 / 2.8 | 与空闲相同 |
ZHIPU/GLM-5.3 | 2 / 8 / 8 / 28 | 与空闲相同 |
config.providers 覆盖
config.providers.<provider> 里的内容会逐字段合并到该 provider 的预设之上(没有预设时合并到兜底价目表之上):只写要改的字段即可,没写的规则字段继承预设(或兜底规则),没写的费率字段逐字段继承,models 表按 model id 逐行合并。pricing.currency / pricing.defaultModel 同样可以按 provider 写。
- insert:
- id: session-tariff
name: dsh-session-tariff
config:
providers:
bailian: # 百炼:只写要改的字段,其余继承预设
peakWindows: ['08:00-22:00'] # 22:00-08:00 之外按高峰(与预设相同,改这里即覆盖)
weekends: clock # 周末不优惠,照常按钟点判定(与预设相同)
pricing:
idle: { cacheHit: 0.1, cacheMiss: 1, cacheWrite: 1, output: 4 }
peak: { cacheHit: 0.2, cacheMiss: 2, cacheWrite: 2, output: 8 }
deepseek-account: # DeepSeek 官方:显式写出默认规则与模型表
peakWindows: ['09:00-12:00', '14:00-18:00']
weekends: idle
pricing:
idle: { cacheHit: 0.02, cacheMiss: 1, cacheWrite: 1, output: 4 }
peak: { cacheHit: 0.04, cacheMiss: 2, cacheWrite: 2, output: 8 }
models:
deepseek-v4-pro:
idle: { cacheHit: 0.15, cacheMiss: 4.5, cacheWrite: 4.5, output: 13.5 }
peak: { cacheHit: 0.30, cacheMiss: 9, cacheWrite: 9, output: 27 }
按模型定价
每张价目表(内置预设、config.providers.<provider>.pricing 或兜底 config.pricing)都可以带 models 表,按 model id 精确匹配;每一项可各自覆盖 idle / peak,没列出的模型回落到该价目表顶层的 idle / peak。预设里没有的模型这样补:
- id: session-tariff
name: dsh-session-tariff
config:
providers:
deepseek-account:
pricing:
models:
my-proxy-model: # 预设里没有的模型,按这张表的费率计
idle: { cacheHit: 0.1, cacheMiss: 1, cacheWrite: 1, output: 4 }
peak: { cacheHit: 0.2, cacheMiss: 2, cacheWrite: 2, output: 8 }
模型 id 取自每条 assistant/message 的 message.source.model,因此和 DSH 发给 provider 的 id 完全一致(含 ZHIPU/GLM-5.3 这类带斜杠的名字,YAML 里加引号即可)。明细面板会按「provider × 模型 × 时段」分行,每行用该 provider 价目表里该模型的费率结算;只有一个 provider 时不显示 provider 标签。
优先级
某条请求的 provider 确定后,价目表按这个顺序取:
config.providers[provider]:合并到该 provider 的预设(有预设时)或兜底价目表(无预设时)之上- 该 provider 的内置预设
- bundle 行
config顶层的平铺价目表 / 时段规则(兜底) - 代码里的
DEFAULT_PRICING/DEFAULT_RULES(DeepSeek 官方数字)
也就是说,平铺的 pricing / peakWindows / weekends 只在 provider 既没有预设、也没有 config.providers 条目时才决定计价。
从旧配置迁移
如果你以前在 bundle 行里为已知 provider(deepseek-account、bailian、bailian-chat)自定义过 config.pricing 或 peakWindows / weekends / holidays / workdays,请把整段挪到 config.providers.<provider> 下的同名位置:字段照搬,只是外面多包一层 provider id。平铺字段现在只给没有预设的 provider 兜底,不再影响已知 provider;原来「全局改 peakWindows: ['08:00-22:00'] + weekends: clock」的百炼写法会失效,表现为百炼请求回到预设的数字。
时段规则(宿主)
默认值在 host.js 的 DEFAULT_RULES,它是没有预设的 provider 的兜底规则:
{
utcOffsetMinutes: 480,
peakWindows: ['09:00-12:00', '14:00-18:00'],
holidays: [], // 'YYYY-MM-DD'
workdays: [], // 'YYYY-MM-DD',调休上班日
weekends: 'idle' // 'idle':周末全天按空闲(DeepSeek);'clock':周末照钟点算(百炼等)
}
同样的字段既可以写在 bundle 行 config 顶层(兜底规则),也可以写在 config.providers.<provider> 下(只覆盖该 provider 的规则,见 cordis.patch.yml 的注释)。有预设的 provider 默认用预设规则:deepseek-account 是工作日 09:00-12:00 / 14:00-18:00 + weekends: 'idle',bailian / bailian-chat 是 peakWindows: ['08:00-22:00'] + weekends: 'clock'。
法定节假日表默认是空的:不填时,节假日会被当作普通工作日、只在 peakWindows 内按高峰计;要精确请按当年国务院公告补 holidays / workdays(写在对应 provider 下,或写进兜底规则)。
weekends 决定没有被 workdays 列出的周六周日怎么算:'idle'(默认,DeepSeek 口径:周末整天按空闲)或 'clock'(不区分周末,只看 peakWindows,百炼等按量计费的 provider 用这个,内置的百炼预设即 'clock')。holidays 里的日期无论在哪种口径下都按空闲计。
已验证
-
折叠单元测试(test/fold.test.mjs,无依赖):
node test/fold.test.mjs覆盖:
09:00/12:00/14:00/18:00边界、周末、法定节假日、调休上班日、assistant/attempt被message覆盖、重试双计、无关事件保持状态引用、检查点状态复原、wire 视图形状、weekends: 'clock'口径与按模型归集(同一模型的一次attempt+message只记一次请求,两个模型各自成行、各段合计回到总量),以及按 provider 选择价目表:deepseek-account与bailian的请求各用各的预设、config.providers的逐字段合并、同一会话里两个 provider 分开计账,还有「旧的全局百炼配置不再给 DeepSeek 官方会话计价」的回归用例。 -
价目编辑器测试(
npm test,三个文件、28 个用例,无外部依赖):- test/editor.test.mjs 覆盖宿主半:
liveCatalog列出实时 provider / 模型并按 id 排序、单个 provider 取模型失败时只记一条 warning 并保留该 provider、describeState的下标(预设 / 配置 / 兜底)与defaults/stale、sanitizeConfig的接受与拒绝(未知字段、负数、坏的时间窗与日期、__proto__/constructor污染键、空行裁剪)、plainConfig解包、以及通过真实apply()装出来的路由:GET /state、POST /save(经configEditor.edit落盘并回新 state)、非法草稿不写盘、跨站与表单提交被 403、没有可写行时给出说明、未知路径 404。 - test/client.test.mjs 在
vm里加载client.js,用一套极小的 React shim 真正渲染设置页,再把onChange/onClick打进去,断言:模型行随目录生成、留空格显示继承值作为 placeholder、改一格后 POST 的 body 恰好只有那一格、清空输入框是删除覆盖而不是写 0、失效项一键清除、宿主半缺失 / 只读部署的提示、四种按钮状态、三个入口(插件页 bundle 单元、行配置单元、内置插件标签页)各自注册到位且view: 'summary'只渲染一句话不发请求,以及中英两份词典覆盖页面用到的每个 key。 - 运行方式:
npm test(等价于node --test test/fold.test.mjs test/editor.test.mjs test/client.test.mjs)。
- test/editor.test.mjs 覆盖宿主半:
-
运行时对账:某个
deepseek-flash会话(144 次请求)的sessionCost两档合计与同会话tokenUsage合计逐项相等——缓存读取 17,137,024 / 未缓存输入 131,962 / 输出 87,763——说明既没有重复计费也没有漏计。 -
价目核对:2026-10 对照官方《模型 & 价格》,
deepseek-flash空闲 0.02 / 1 / 4、高峰 0.04 / 2 / 8 与deepseek-account预设逐项一致;deepseek-v4-pro的 0.15 / 4.5 / 4.5 / 13.5 与 0.30 / 9 / 9 / 27 也按官方价目写进预设。bailian预设采用百炼的按量计费口径:22:00-08:00 空闲、周末不优惠、缓存命中 0.1 / 0.2。 -
视觉部分(胶囊位置、对话框排版)在 DSH 桌面版中人工确认;设置页的观感尚未在浏览器里人工核验(本项目没有浏览器自动化测试,DSH Web GUI 需要登录会话),逻辑层由上面的
vm渲染测试覆盖。
已知限制
- 价目是静态值:内置预设只覆盖
deepseek-account、bailian/bailian-chat三个 provider id(两套预设)和上面列出的模型;其他 provider / 模型按兜底价目表计,或自己补config.providers.<provider>.pricing(见「按模型定价」),未列出的模型回落到该价目表顶层的费率;改价后需手动更新 - 设置页读的是宿主当时注册的 provider / 模型,所以「新增模型自动出现、删除模型自动消失」以页面重新读取为准:切走再切回设置页、或点「刷新模型列表」;页面不会订阅目录变化事件
- 保存后由 Loader 重新应用插件行来完成热更新;如果某个 provider 的费率只写在被删掉的失效行里,删除前该行仍参与计价(页面会把它列出来)
- provider 归属取自
message.source.provider(缺失时用最近一次request/context的路由);两者都没有的老日志整段按兜底价目表计 - 模型归属取自
message.source.model;拿不到时(老日志、或宿主尚未发布分模型行)整段算作defaultModel那一行 - 显示名称取自 DSH 的实时模型目录:目录还没连上、或模型已从 DSH 删除时,明细行回落到 model id(计价口径不变)
peakWindows不能表达跨零点的区间(如22:00-24:00);百炼这类「夜间闲时」由内置预设用08:00-22:00反填实现,自定义 provider 也要同样处理(见「内置预设:阿里云百炼」)- 法定节假日 / 调休表需要自己维护,默认空表;周末默认按空闲处理(
weekends: 'idle'),百炼预设则是'clock' - 时段归属按请求发起时刻;跨越 12:00 或 18:00 边界的长请求整体计入发起时段的价
- 只统计 provider 上报了 usage 的请求;被中断且无 usage 的请求不计
- 明细行金额四舍五入到 3 位,与时段合计可能差 ±0.001
- 仅适用于 DSH Web GUI 的
conversation.composer.dock位置;宿主投影键名sessionCost为全局唯一,若与其他插件冲突会注册失败
兼容性
| 项 | 值 |
|---|---|
| 声明范围 | @deepseek-ai/dsh ^0.2.1-rc.2(package.json 的 peerDependencies) |
| 实测版本 | 0.2.1-rc.3(DSH 桌面版) |
| 依赖面 | 无运行时依赖:宿主半只用 sessionProjections(必需)与 webServer / configEditor / llm(可选,缺了就不提供设置页或只读),客户端半只从模块表取 react / react-dom |
| 宿主键名 | cordis 插件 session-tariff,投影 sessionCost,设置页 API /dsh-session-tariff/api |
目录结构
dsh-session-tariff/
├── package.json # bundle 清单:dsh.bundle.patch + dsh.client(Web 客户端半)
├── cordis.patch.yml # 插入 session-tariff 这一行(含配置示例)
├── host.js # 宿主半:sessionCost 投影 + 价目编辑 API(目录 / 校验 / 落盘)
├── client.js # 客户端半:状态栏胶囊、明细对话框、设置→插件 里的价目编辑器
├── locale/{zh,en}.json # 插件在插件页显示的标题与描述
├── icon.svg # 插件图标(原创)
└── test/
├── fold.test.mjs # 折叠逻辑单元测试
├── editor.test.mjs # 宿主半:目录 / 校验 / HTTP API(经真实 apply 装配)
└── client.test.mjs # 客户端半:vm 里渲染设置页并驱动交互
客户端半是 window.__ModuleLoader__.load({ id, factory }) 形式的无构建模块,只从 DSH 的模块表取 react / react-dom,样式用 DSH 主题令牌(--dsw-alias-*),不依赖任何 Harness 客户端包。设置页不读 Loader 配置(客户端模块拿不到),一律通过宿主 API 取「实时目录 + 当前配置」。
开发
# 语法检查
node --check host.js
node --check client.js
# 全部测试(不依赖 DSH、不依赖任何包)
npm test
# 只跑折叠逻辑
node test/fold.test.mjs
改完宿主半后重启 DSH 才会装载新模块;只改客户端半刷新页面即可。
许可
Comments
Loading…
From the same category
by ccch1mneyyy
DSH 官方公众号收录的 TUI 补位插件:Claude Code 风,鲸鱼顶栏/实时状态/流式思考/双击 Esc 回滚/上下文进度+TPS。npm 一键装。 DSH official WeChat featured TUI plugin — Claude Code style: whale bar, live status, streaming thoughts, double-Esc rol
★ 6.5k
↓ 22.4k/wk
MIT
TypeScript
Nov 2, 2026
dsh plugin --profile terminal add @deepseek-harness-tui/dsh-tuiby kingcharleslzy-ai
Community-maintained dsh-purge fork with host-policy patches, prompt and rule settings, diagnostics, separate update-check and install controls, and local backup/rollback.
★ 4k
MIT
JavaScript
Nov 1, 2026
dsh plugin --profile web add dsh-purge-communityby bowenliang123
The best DeepSeek Harness plugin for context insight and management, with context dashboard / browser / sidebar and context command, for context statistics, composition, breakdown, evolution details,
★ 4k
↓ 139k/wk
Apache-2.0
TypeScript
Nov 2, 2026
dsh plugin --profile web add dsh-contextby strukto-ai
The World's First Virtual Terminal for AI Agents
★ 3.8k
↓ 316/wk
Apache-2.0
TypeScript
Nov 2, 2026
dsh plugin --profile agent add @struktoai/mirage-dshby mmparko
DeepSeek Harness 破甲 (mirror of YuJunZhiXue/dsh-purge) — 上游即将删库,此为本仓库全量镜像:含全部分支/73 个 tag/完整提交历史。原作者署名与二开要求见 README 署名章节。
★ 2.9k
MIT
JavaScript
Oct 13, 2026
dsh plugin --profile web add dsh-purgeby c1overzz
DSH 插件:每天替你刷一轮 B站,读字幕挑出值得的、写一份日报,值得的 @ 你
★ 1.1k
↓ 36.2k/wk
MIT
JavaScript
Oct 31, 2026
dsh plugin --profile web add dsh-bili-scroll