DSH Plugins Marketplace

DSH Plugins

Plugins

/

Terminal & Clients

/

dsh-plugin-session-cost

d

dsh-plugin-session-cost

Manifest valid

DSH plugin: estimated session cost in the composer status bar, split by DeepSeek peak/idle tariff periods

UI (client)hasBundlePatch

dsh-session-tariff

简体中文 · English · 日本語 · 繁體中文

给 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.providers overrides). 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 / 40.04 / 2 / 2 / 8
deepseek-v4-pro0.15 / 4.5 / 4.5 / 13.50.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.040.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 / 40.2 / 2 / 2 / 8
qwen3.8-max1.5 / 12 / 12 / 36与空闲相同
ZHIPU/GLM-5.3-Flash0.23 / 0.8 / 0.8 / 2.8与空闲相同
ZHIPU/GLM-5.32 / 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 确定后,价目表按这个顺序取:

  1. config.providers[provider]:合并到该 provider 的预设(有预设时)或兜底价目表(无预设时)之上
  2. 该 provider 的内置预设
  3. bundle 行 config 顶层的平铺价目表 / 时段规则(兜底)
  4. 代码里的 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)。
  • 运行时对账:某个 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 才会装载新模块;只改客户端半刷新页面即可。

许可

MIT

Comments

Loading…

From the same category

dsh-TUI

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

Terminal & ClientsManifest valid

★ 6.5k

↓ 22.4k/wk

MIT

TypeScript

Nov 2, 2026

dsh plugin --profile terminal add @deepseek-harness-tui/dsh-tui

by 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.

Tools & CapabilitiesTerminal & ClientsManifest valid

★ 4k

MIT

JavaScript

Nov 1, 2026

dsh plugin --profile web add dsh-purge-community

by 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,

Tools & CapabilitiesUI & ExperienceTerminal & ClientsManifest valid

★ 4k

↓ 139k/wk

Apache-2.0

TypeScript

Nov 2, 2026

dsh plugin --profile web add dsh-context

by strukto-ai

The World's First Virtual Terminal for AI Agents

Terminal & ClientsManifest valid

★ 3.8k

↓ 316/wk

Apache-2.0

TypeScript

Nov 2, 2026

dsh plugin --profile agent add @struktoai/mirage-dsh

by mmparko

DeepSeek Harness 破甲 (mirror of YuJunZhiXue/dsh-purge) — 上游即将删库,此为本仓库全量镜像:含全部分支/73 个 tag/完整提交历史。原作者署名与二开要求见 README 署名章节。

Terminal & ClientsManifest valid

★ 2.9k

MIT

JavaScript

Oct 13, 2026

dsh plugin --profile web add dsh-purge

by c1overzz

DSH 插件:每天替你刷一轮 B站,读字幕挑出值得的、写一份日报,值得的 @ 你

Tools & CapabilitiesNotifications & IntegrationsTerminal & ClientsManifest valid

★ 1.1k

↓ 36.2k/wk

MIT

JavaScript

Oct 31, 2026

dsh plugin --profile web add dsh-bili-scroll