Repository navigation
Releases: BreakFree003/dsh-clinepass-deepseek
Release list
v0.18.20 — 后台同步心跳 backgroundAt
后台基线同步加心跳:/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 — 基线同步的安装日志
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 — 基线同步不再依赖设置页打开
修「重置后夜间跑完的会话被整段吞掉」:基线同步不再依赖设置页打开。
这次做了什么
- 症状:设置页累计卡的官方价停在
¥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 — 文档对齐(无代码改动)
文档对齐版: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 百分比、官方价各归各的
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 — 金额格式三处统一
同一笔钱,三个界面上的位数统一了。
这次做了什么
- 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 — 峰谷口径写成契约,评审收尾
峰谷口径写成契约,另把上一轮评审的 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 — 对话成本(官方峰谷价)与可重置累计
对话下方开始显示「这条对话按 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 — 撤掉误判的「降级池」判定:只记事实
撤掉误判的「降级池」判定:观察者只记事实,不再从别名回显推断落点。 行为与 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 才是开关
上游钉选修正:providerOptions.gateway.has 才是路由开关;只写 only 的配方一直是空转。
这次做了什么
patch-gateway-routing.mjs从单锚点扩成三锚点,一次管完 pi-ai 链路:@deepseek-ai/dsh-llm-pi-ai/lib/index.js的COMPLETIONS_COMPAT_GATE:
vercelGatewayRoutingwithhold→offer(否则 YAML 的 compat 在启动时被拒);@earendil-works/pi-ai/dist/providers/compat-schema.js:VercelGatewayRoutingSchema
补has声明;@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。