Skip to content

Releases: BreakFree003/dsh-clinepass-deepseek

v0.18.20 — 后台同步心跳 backgroundAt

Choose a tag to compare

@BreakFree003 BreakFree003 released this 03 Nov 07:44

后台基线同步加心跳:/api/clinepass.spend 响应里多了 backgroundAt。

这次做了什么

  • 0.18.19 想用日志证明「60 秒定时同步装上了」,但默认日志级别不输出 info,那行 [clinepass]
    在 ~/Library/Logs/dsh-web.log 里根本看不到。
  • 改成心跳进响应:宿主每 60 秒跑一次同步,跑完记下时间;GET /api/clinepass.spend 返回
    backgroundAt(ISO 时间或 null)。null = 定时器没跑过,非空 = 它在跑。
  • 行为不变,只是把「定时器到底有没有跑」从不可见变成可断言。

实测记录

  • npm test:692 条断言全绿。
  • 部署重启后,/api/clinepass.spend 的 backgroundAt 应在一分钟内从 null 变成时间戳。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.20

维护状态

个人使用为主,按需更新。

v0.18.19 — 基线同步的安装日志

Choose a tag to compare

@BreakFree003 BreakFree003 released this 03 Nov 07:38

0.18.18 的可观测性补丁:60 秒基线同步装上与否,现在日志里能看到。

这次做了什么

  • 安装 spend 路由时检查 routeCtx.effect:有就 info 一行 spend baselines sync every 60s,
    没有就 warn(说明宿主没给卸载钩子,定时器没装上)。
  • 行为与 0.18.18 完全一致,只是把「定时器到底有没有跑」从不可见改成可查。

实测记录

  • npm test:692 条断言全绿。
  • 部署后重启,~/Library/Logs/dsh-web.log 里应能 grep 到那行 spend baselines sync every 60s。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.19

维护状态

个人使用为主,按需更新。

v0.18.18 — 基线同步不再依赖设置页打开

Choose a tag to compare

@BreakFree003 BreakFree003 released this 03 Nov 07:33

修「重置后夜间跑完的会话被整段吞掉」:基线同步不再依赖设置页打开。

这次做了什么

  • 症状:设置页累计卡的官方价停在 ¥0.256,而同一窗口里账本 $1.22、会话日志重放 ¥1.595。
  • 原因:每个会话的基线是第一次被扫到时记的,而扫描只在设置页打开时发生;夜里新建或跑完的
    会话在第一次被看见时已经是最终值,整段花费变成「基线」。
  • 修法一(0.18.17):投影记录的 identity.createdAt 晚于重置起点的会话,基线直接记 0;
    已被写脏的基线(>0)下一次扫描就地改回 0。
  • 修法二(0.18.18):路由安装时挂一个 60 秒的 setInterval 调一次 GET 快照(effect 卸载时清掉、
    unref 不挡退出)。「第一次看见」与页面是否打开无关,误差上限从一晚压到一分钟。

修掉的问题

  • 修复前:¥0.256(漏算约 6 倍)。修复后:¥1.674(与重放的 ¥1.595 同量级,差额来自验证时刻
    之后的新请求)。
  • 新增 2 条测试:重置之后创建的会话整段计入、旧脏基线自愈。共 692 条断言。

已知边界

  • 会话如果在重置之前创建、重置之后才跑,且第一次扫描发生在它跑完之后,仍可能丢那段(分钟级
    后台同步把它压到 ≤1 分钟)。
  • 账本是全账号流水(同一 key 在别的客户端用也会计入);本地 ¥ 只覆盖本机 dsh 会话,两者不相等
    是集合不同,不是算错。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.18

维护状态

个人使用为主,按需更新;计费口径实测记录见 clinepass-deepseek-audit/README.md §三十。

v0.18.16 — 文档对齐(无代码改动)

Choose a tag to compare

@BreakFree003 BreakFree003 released this 02 Nov 15:02

文档对齐版:index.js / client.js / cost.js / spend.js 与 0.18.15 逐字节相同。

这次做了什么

  • 「对话成本」一节:删掉「与用量卡对不上是预期行为」——设置页累计卡现在同时显示官方价(¥)与
    ClinePass 账本价($),两套口径各占一行;面板标题写「官方价」,没有子代理会话时不出现
    「本会话」行。
  • 「官方定价累计」一节:补上第二行 ClinePass 计费 $X · 月额度 Y% 的来源与规则 —— 金额读账本
    /users/<uid>/usages 的 costUsd(按重置起点截断,cursor 翻页、上限 12 页、未到起点标 ≥);
    百分比 = /usage-limits 当前 percentUsed − 重置基线;重置同时更新 since 与
    quota.monthlyPercent 两套基线。
  • 「验证」一节:npm test 链补上 test-spend 与 test-cost。

修掉的问题

  • README 里「额度记账恒按高峰价(低峰期两者正好差 2 倍)」这类只描述旧界面的说法已更新。
  • 面板标题「官方价明细」统一为「官方价」;「本会话」行只在有子代理时出现,文档同步。
  • 安装示例的 tag 指向 v0.18.16。

实测记录

本次无代码改动。npm test:688 条断言全绿(与 0.18.15 相同)。

已知边界

  • 账本是全账号流水;同一个 key 在别的客户端用会算进去,此时账本金额大于本地会话累计,
    属于集合不同,不是算错。
  • 月额度百分比是整数(网关只返回整数,$50 额度上 1% ≈ $0.50)。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.16

维护状态

个人使用为主,按需更新;计费口径实测记录见 clinepass-deepseek-audit/README.md §三十。

v0.18.15 — 计费口径收口:账本金额、API 百分比、官方价各归各的

Choose a tag to compare

@BreakFree003 BreakFree003 released this 02 Nov 14:58

0.18.15 把累计卡与明细面板的计费口径收口:金额、百分比、币种各归各的 API,不做任何换算。

这次做了什么

  • 设置页累计卡:ClinePass 计费 $X 直接来自网关账本 /users/<uid>/usages 的 costUsd
    合计(按重置起点截断);月额度 Y% = /usage-limits 当前 percentUsed − 重置时记录值。
    两个数各来自一个 API,互不推算。
  • 明细面板:标题 官方价明细 → 官方价;没有子代理会话时不再写「本会话」行(与合计重复)。
  • 面板保留「ClinePass 计价」,算法是同一批 token 全按高峰价、用官方人民币价目表直接算
    (cnyPeak),不叫「两倍价」、不乘汇率。
  • 测试隔离:test-usage.mjs 整体把 DSH_HOME 指向临时目录,mock 网关不会再写脏真实基线文件。

修掉的问题

  • 账本翻到页数上限仍未到重置起点时,金额标 ≥,不再把部分和当精确值。
  • ledgerPath 对 userId 做 encodeURIComponent;load(true) 加了存在性守卫。
  • 账本与本地 token 推算的对比(⚠)已删除 —— 账本是全账号流水,和本机会话的花费不可比。
  • 0.18.8 之前 mock 网关会把假的 monthlyPercent 写进真实基线文件,导致百分比长期卡在 0。

实测记录(2026-11-02 22:52:36 起,UTC+8)

  • 官方实际价 ¥0.01741608,全按高峰价 ¥0.03483216,比值 0.500000(全部落在谷段)。
  • 同窗口账本 $0.00522481(2 笔):$ × (¥2.00 / $0.30) = ¥0.03483207,与 cnyPeak
    只差末位浮点舍入 —— 配额记账与官方峰价人民币数同源,只是币种不同。
  • npm test:688 条断言全绿。

已知边界

  • 账本是全账号流水;同一个 key 在别的客户端用会算进去,此时账本金额大于本地会话累计,
    属于集合不同,不是算错。
  • 月额度百分比是整数(网关只返回整数 1% 步进,$50 额度上 1% ≈ $0.50)。
  • 官方价按请求发生的时刻判峰谷,法定节假日不做例外(既定口径)。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.15

维护状态

个人使用为主,按需更新;计费口径的实测记录见 clinepass-deepseek-audit/README.md §三十。

v0.18.2 — 金额格式三处统一

Choose a tag to compare

@BreakFree003 BreakFree003 released this 01 Nov 19:15

同一笔钱,三个界面上的位数统一了。

这次做了什么

  • 0.18.1 把胶囊与明细面板的金额格式统一成 formatCny(≥¥1 两位、¥0.01–1 三位、<¥0.01 四位),
    但设置页「官方定价累计」仍是旧的两位固定格式 —— 累计值 ¥0.703 会显示成 ¥0.70。
    现在三处共用同一个格式化。
  • 只改 client.js 的一处渲染;投影、累计基线、价格表、峰谷判定都没有变化。

修掉的问题

  • 设置页累计卡与胶囊/面板的金额位数不一致(0.18.1 漏掉的第三处)。

已知边界

与 0.18.1 相同:旧会话历史不计入累计;升级前的子代理会话在被打开前可能显示 0;
非 flash 模型不计价。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.2

维护状态

7 个测试套件全过(npm test)。

v0.18.1 — 峰谷口径写成契约,评审收尾

Choose a tag to compare

@BreakFree003 BreakFree003 released this 01 Nov 19:07

峰谷口径写成契约,另把上一轮评审的 P0/P1/P2 一次性收尾。

这次做了什么

  • 峰谷判定口径写明:只看周一至周五与钟点(北京时间 09:00–12:00、14:00–18:00 为峰,其余为谷),
    不做节假日例外;删掉此前「官方有节假日例外、本插件是缺陷」的说法。
  • spend(设置页「官方定价累计」)改为按会话基线:每个会话第一次被扫到时把当时花费记成基线,
    之后只计增量。旧会话稍后被打开时不会再把它整段历史倒灌进「自 X 起」的累计。
  • spend 扫描改异步(fs/promises、32 并发、30 秒缓存、in-flight 复用),只读接口不再阻塞事件循环。
  • 缓存目录读不到时接口带 reachable: false,卡片写明「读不到本地投影缓存」,与「没有花费」区分。
  • 读取缓存行时校验 row.ver;价表按模型门控:非 deepseek-v4.1-flash-* 跳过不计价,不按 flash 低估。
  • 客户端:面板与胶囊统一金额格式;面板打开期间跟随 resize 重新定位;重置失败不再被吞掉;
    useSessions 兜底改成 hook 形态。
  • 测试:新增不依赖 zod 的 view 形状闸(字段集合、四桶、非负)、seq === inheritedEventCount 边界、
    面板监听器挂载/清理断言;test-spend 期望值改字面量。

修掉的问题

  • 打开旧会话让累计跳涨(P0)。
  • 安装副本里 test-usage 必红的两条断言(zod 可解析环境)。
  • 同步扫描 902 个缓存文件阻塞 233 ms。
  • README 里「所有会话之和 = 全部请求」与实现相反。

已知边界

  • 会话在「重置之后、第一次被扫到之前」花掉的部分不计(懒数据的必然窗口)。
  • 升级前就没有 clinepassCost 行的旧对话,子代理那一段可能显示 0,直到该子代理会话被打开过。
  • 价表只覆盖 flash 快照;其它模型跳过不计价。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.1

维护状态

7 个测试套件全过(npm test)。上一版 0.18.0 的投影 / 面板 / 累计功能不变,本版以口径与健壮性为主。

v0.18.0 — 对话成本(官方峰谷价)与可重置累计

Choose a tag to compare

@BreakFree003 BreakFree003 released this 01 Nov 18:43

对话下方开始显示「这条对话按 DeepSeek 官方峰谷价实际值多少钱」,设置页多一个可重置的累计总计。

这次做了什么

  • 逐请求计价:新增会话投影 clinepassCost,只读会话事件(request/header 的 provider/model、
    assistant/message 的 usage、event.time),不联网、不改请求、不写盘;apply 是同步纯函数,
    重启后从日志重放得到同样的数字。峰时 = 北京时间(UTC+8)周一至周五 09:00–12:00、14:00–18:00,
    其余半价。
  • Provider 胶囊同一行追加 · ¥1.86(位数随量级),点开有明细面板:合计、本会话与子代理分组、
    峰/谷各花多少、ClinePass 自身计费(恒按高峰价)、token 四桶与缓存命中率。
  • 设置页新增「官方定价累计」:标注起点时间,带两段式「重置为 0」。
  • 合计包含该对话下所有子代理会话;seeded(fork / 子代理)跳继承前缀,父会话历史不会算第二遍。

修掉的问题

  • 投影的 viewSchema 曾要求 tokens.requests 而视图不产出 → 宿主对每条会话投影抛错、整个 Web 端
    读不出历史。现在 tokens 用独立 schema,注册前自检 state + view(含折叠一条样本),不一致
    只降级不炸。
  • 失败/中断的 assistant/attempt 的 usage 只在 data.stream 最后一帧,之前只读 data.usage 会
    永久漏计;现在与上游 tokenUsage 同一套兜底。
  • 累计值曾用全局基线,而投影缓存是懒生成的 → 每打开一个旧会话都会把它整段历史汇进来,数字跳涨、
    「自 X 起」不成立。改成按会话基线:每个会话第一次被看见时记基线,之后只计增量。

实测记录

  • 真实会话 27 次请求全在低峰:官方峰谷价 ¥0.138,额度口径 ¥0.277,比值 2.000(预期)。
  • 界面实测:胶囊 Provider: deepseek · ¥1.07,子代理 3 个合计与独立口径逐项吻合;seeded fork
    (inheritedEventCount=1150)只计自己的 3 次请求。
  • 设置页累计:基线建立后从 0 开始涨;重置后 UI 归零、服务端基线更新。

已知边界

  • 中国法定节假日官方全天低峰,本插件按「周一至周五」判峰 → 节假日按峰价,最多高估 2 倍。
  • 金额随当前价表回溯重算;计价时刻取结算时刻(实测 3957 次请求 0 次跨界)。
  • 价表只覆盖 deepseek-v4.1-flash-1017;同一路由换 deepseek-v4-pro 会按 flash 价低估。
  • 升级前就有、之后没被打开过的子代理会话在列表里没有投影行,老对话的子代理部分可能显示 0,
    直到它被打开(之后自愈)。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.18.0

维护状态

  • 与 pi 侧(pi-clinepass-deepseek)的同步标记已更新到 v0.18.0;计价功能是 dsh 侧独有,pi 行为无变化。

v0.17.1 — 撤掉误判的「降级池」判定:只记事实

Choose a tag to compare

@BreakFree003 BreakFree003 released this 31 Oct 10:25

撤掉误判的「降级池」判定:观察者只记事实,不再从别名回显推断落点。 行为与 0.16.0 一致(纯观察者,不碰请求),状态文件多两个诊断字段。

这次做了什么

  • 0.17.0(从未发布)用帧回显的 model 后缀判 degraded,把「回退池」做成了一等事实。实测证明这条信号在这条网关上无效:cline-pass/… 是别名,网关先解析成虚拟模型
    deepseek-v4p1-flash-1017-contributor-fallbacks,再在候选池里选 provider;钉住第一方 deepseek 时回显仍是同一个虚拟模型名。所以 0.17.1 整个撤掉该判定。
  • 改为如实记录两个名字:virtualModel(帧回显的虚拟模型名)与 upstreamModel
    (routing.canonicalSlug,网关实际执行的规范模型 id)。落点看 provider + upstreamModel。
  • 删除 DEGRADED_MODEL_PATTERN、isDegradedModel()、degraded 字段与胶囊的「降级池」角标 / tooltip / 图标分支;servedModelOfText() 更名为 virtualModelOfText(),新增 upstreamModelOfRoutings()。
  • ?status=1 返回 virtualModel / upstreamModel;状态文件 lastVerified / lastAnonymized 同步。
  • 文档同步:README 胶囊与状态字段表、CHANGELOG 的 0.17.0 段标「已撤销、从未发布」并加更正注记。

修掉的问题

  • 钉住第一方的每一条生产请求都被误标成「降级池」(0.17.0 的假警报)。
  • upstreamModel 与 provider 解析口径不一致:canonicalSlug 改为取最后一处 routing(与 routingOfText / observedProviderOf 一致),避免网关多发一帧时出现 provider=deepseek 而 upstreamModel=private/…。
  • 测试补上「被删字段不再出现」「lastAnonymized 带新字段」「缺证据时两字段为 null」等断言。

实测记录(2026-10-31)

生产形状(providerOptions.gateway = { only: [deepseek], has: [vision, implicit-caching] }):

  • finalProvider=deepseek、canonicalSlug=deepseek/deepseek-v4.1-flash-1017,
    planningReasoning 写明 Provider set restricted to: deepseek;
  • 冷前缀 6045 token 连发两次:第 1 次 cached=0,第 2 次 cached=5888(97.4%),费用降到 1/21.4;
  • 未钉住(无 has)才落 openai-compatible-private + private/…-contributor,两轮都 0 缓存。

证据与完整字段矩阵:clinepass-deepseek-audit/evidence/samples/2026-10-31-response-shape/。

已知边界

  • 网关卡在别名上时,回显 model 永远是虚拟模型名,不代表服务方;本版不再据此推断任何「池」。
  • 网关不再回显 model 时 virtualModel 为 null;routing 没有 canonicalSlug 时 upstreamModel 为 null(读不到就不猜)。
  • 0.17.0 从未打 tag、从未发布;本版取代它。本地部署需重装或复制新版,profile 里按 #v0.17.1 安装。

安装

dsh plugin --profile web add 'github:BreakFree003/dsh-clinepass-deepseek#v0.17.1'

维护状态

纯观察者:不改写请求、不重试、不另发请求。pi 侧行为镜像 pi-clinepass-deepseek 0.1.16 已同步(no behavior change,状态字段同名)。

v0.16.0 — 上游钉选修正:gateway.has 才是开关

Choose a tag to compare

@BreakFree003 BreakFree003 released this 29 Oct 22:03

上游钉选修正:providerOptions.gateway.has 才是路由开关;只写 only 的配方一直是空转。

这次做了什么

  • patch-gateway-routing.mjs 从单锚点扩成三锚点,一次管完 pi-ai 链路:
    1. @deepseek-ai/dsh-llm-pi-ai/lib/index.js 的 COMPLETIONS_COMPAT_GATE:
      vercelGatewayRouting withhold → offer(否则 YAML 的 compat 在启动时被拒);
    2. @earendil-works/pi-ai/dist/providers/compat-schema.js:VercelGatewayRoutingSchema
      补 has 声明;
    3. @earendil-works/pi-ai/dist/api/openai-completions.js:routing 分支把 has 抄进
      providerOptions.gateway(不补就永远发不出去)。
  • --check 现在要求「三锚点 + YAML 的 only/has」同时成立才 exit 0;--revert 一并还原
    (profile 上还有 pin 时仍拒绝,需 --force);锚点形状变化直接 exit 2,不再猜。
  • 新增库级验证脚本(审计仓库)
    clinepass-deepseek-audit/evidence/scripts/verify-pi-ai-has.mjs:假 fetch 截请求体,
    不花额度地证明 has 到了线上。
  • 插件运行时行为未改:仍是纯观察者,不改写请求。

修掉的问题

0.15.0 的钉选配方(compat.vercelGatewayRouting.only: [deepseek] + 门禁补丁)在 2026-10-23
之后实测无效:请求全部落 openai-compatible-private(VMC contributor 通道),only 被忽略。
根因是网关需要一个从未被发送的字段 gateway.has —— 而 pi-ai 的 schema/wire 根本不认识它。

实测记录(2026-10-30,同一把 key,…-1017,每项 2~3 次)

请求里的 gateway 落点
无 openai-compatible-private
only: [deepseek] openai-compatible-private(only 被忽略)
has: [vision, implicit-caching] fireworks
only + has deepseek + 原生 systemFingerprint=bc19ba97cbe016479903222bb1578db6
order + has deepseek
顶层 provider.only openai-compatible-private

带 tools + system prompt、流式/非流式结论一致。修复后本机重启,真实流量
lastVerified.provider = "deepseek"(anonymized: false)。证据与复现见审计 §二十。

已知边界

  • 三处补丁都在 node_modules 里,升级 dsh / 重装 pi-ai 会被还原;升级后先跑
    patch-gateway-routing.mjs --check(非 0 就应用)再起服务,否则 PiAiCatalogError 会拦住启动。
  • 钉选只限制候选集合,不改计费:仍走 Cline Pass 订阅;canonical deepseek/… 命名空间是
    usage-billing,需要额外 credits。
  • 网关调度会变。--check 只能证明「补丁在 + 请求体里有 has」,落点仍要看
    ~/.dsh/dsh-clinepass-status.json 的 lastVerified.provider。

安装

dsh plugin --profile web add github:BreakFree003/dsh-clinepass-deepseek#v0.16.0
node ~/.dsh/profiles/web/node_modules/dsh-clinepass/patch-gateway-routing.mjs   # 再重启 dsh web

维护状态

pi 侧 pi-clinepass-deepseek 0.1.15 同步:pi-ai 4.x 的同样限制由插件在
before_provider_request 里补 gateway.has,无需改 node_modules。