Skip to content

Releases: Ebony-Vinyl/dsh-our-free-model

v2.1.0:聚合 API——自带 Key 接入 76 家服务商;省 Token(工具输出压缩实测省 90%);自动降级链路;原生 /v1/messages

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 11 Oct 06:26
7e3a1da

聚合 API、省 Token、降级链与原生 Anthropic 网关

  • 聚合渠道(自带 Key):注册表内置 76 家提供商(NVIDIA NIM、OpenRouter、Groq、Cerebras、DeepSeek、SiliconFlow、Z.ai、Kimi、MiniMax、QwenCloud、Azure OpenAI,以及免账号的 Ollama、LM Studio、llama.cpp 等)。写入 Key 后其模型以 provider/model 进入选择器与本地网关;Key 只写入 0600 的 settings.json,接口永不回显,只显示 hasKey 与 …abcd 指纹。每家可单独启停、测试(列表探测,不花一次生成)、发现模型、覆盖 Base URL 与模型清单;OAuth/ADC 提供商照常列出并标注「不可驱动」。
  • 省 Token:工具输出压缩(RTK)在请求发出前就地重写 tool_result——git diff/status/log、grep、find、ls、tree、构建与包管理器日志、编号转储、搜索清单、重复日志行;实测 40 KB 的 git diff 移除 90% 字节且模型仍能就它作答。报错结果永不触碰、替换永不大于原文、过滤器抛错原样放行、整条管线幂等,对全部车道生效,默认开启。另有两族提示词瘦身(caveman / ponytail,默认关)与五个不占上游请求的本地应答(额度探测、命令前缀、会话标题、建议模式、文件路径提取)。
  • 路由(降级链):把任意车道的模型串成命名链,以 combo:<name> 作为虚拟模型出现在选择器与网关上。fallback 固定从链首开始,round-robin 轮换起点并连续 N 轮粘滞。链接在输出任何正文之前失败会被整段丢弃,切换对调用方不可见——「想了很久才撞上配额墙」正是降级最有价值的场景。
  • 本地网关原生说 Anthropic:新增 POST /v1/messages(流式与非流式,含 thinking / tool_use 块、真实 stop_reason 与流内 error 事件)与 POST /v1/messages/count_tokens(本地估算)。Claude Code 与 Anthropic 各 SDK 可直接指向本插件;网关页新增「接入客户端」分区,按实际端口与真实密钥生成可复制配方。
  • 稳定性修复:combo 链的降级判定修复——此前候选产出过思考增量后即使失败也不再切换(思考不算交付);思考块的收尾帧不再被当作提交点;工具调用在 id 迟到的流上不再折叠出重复调用。设置页扩为九页,新增聚合渠道、省 Token、路由三页,并与独立服务架构、图片计价、三套 UI 世界观完成整合。

v2.0.0:免费渠道大升级——Kilo 车道上线;EAC 接入 GitHub 授权(登录 + Star);登录链路加固

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 07 Oct 05:04

免费渠道:十三个账号渠道,一体接入

  • 一次接入 CodeArts(华为云)、CodeBuddy / WorkBuddy(腾讯)、LobsterAI(有道)、Qoder / Qoder 中国版(阿里系)、TRAE(字节)、Cline、Loomy(讯飞)、Raccoon(商汤)、MiniMax Code、ZCode(智谱)、Gemini(Google Code Assist)十一个账号渠道;加上新增的 Kilo 免费车道与原匿名免费通道,共十三条白嫖车道。OpenCode 账号渠道在本插件中默认停用。
  • 渠道列表换成真实 logo,每账号实时余额、自动签到,号池英雄区恢复。
  • 各渠道的登录流程、账号池、每日积分领取、模型黑名单与其本地 OpenAI 网关(Chat Completions + Responses,默认 127.0.0.1:8326)原样挂载与运行;凭据只写入宿主凭据库,浏览器永远拿不到明文。

EAC 协付渠道:GitHub 登录 + Star 后使用

  • 设置页一键发起 GitHub 授权,浏览器自动回传,无需复制粘贴;star 后解锁,取消 star 定期复查后失效;免费车道完全不受影响。
  • 登录链路加固:领取令牌串行且幂等、网关重启不再吞掉已完成的登录、关闭重开或页面重载后同会话恢复、取消与重复发起保护、本机保存成功后再确认服务端领取(#107)。

其他修复

  • 自更新激活/回滚/恢复状态(#93)
  • 无名称工具调用投毒(#92)与旧内核回退(#89)
  • EAC 开放 web 端(#58/#59)
  • 长对话不再被前置 WAF 拦截(#63)
  • 号池饱和时长回合不再被砍(#69/#70)

升级

在插件设置页检查更新即可升级到 2.0.0;新装与已装用户升级后按提示完成 EAC 授权即可,免费车道不受任何影响。

v1.4.6:EAC 协付渠道开放 web 端(#58/#59);长对话不再被前置 WAF 拦截(#63);错误分类不再误导重登

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 05 Oct 12:08

Our Free Model v1.4.6 一轮针对 issue 追踪单的集中处理:

  • EAC 协付渠道开放 web 端(#58/#59/#61)——宿主闸门新增内核声明的 web 档案(web / web-desktop):使用 web-desktop 档案的「Deepseek Harness EAC」桌面壳与 dsh web 组合现在能看到六个 EAC 模型;渠道凭据的密封与签名机制原样保留。完全无法识别的宿主仍保持隐藏,但设置页的模型清单会显示一句明确的说明,不再是无声的缺席(#60)。
  • 长对话不再被前置 WAF 拦截(#63)——服务器侧已把 /eac/v1/ 加入前置 WAF 的 URL 白名单;插件侧同步加固:前置代理(WAF / CDN)返回的 HTML 错误页统一化简为一行可读文案并指明真正原因;WAF 的 403 页不再被误诊为「凭据失效」;200 状态下的 HTML 折叠路径改为不可重试。
  • 首字延迟的结论与一处补充(#66)——实测与服务器日志共同证明:签名车道、SSE keepalive、并发闸门全程正常,34–221 秒的首字等待来自中继上游共享号池的排队。插件侧补上 thinking 拼写的思考帧透传。
  • 升级信任链补课(#64)——1.4.5 清单因仓库改名提交产生 4 个文件各 1 字节漂移、导致旧版本「一键升级」全部失败的问题,已在 1.4.5 清单重签时修复;本轮发布照常通过清单一致性校验与真实清单全链路升级测试。

全部离线套件(24/24)通过,清单逐字节重签;WAF 白名单变更已用真实签名请求实测验证(64KB 与 300KB 请求体均直达网关)。请前往 设置 → 插件升级 一键升级。

v1.4.5 — 出口代理上线(订阅/单代理);EAC 签名车道加固、截断自动续写、设置页子路径修复

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 05 Oct 05:30

Our Free Model v1.4.5

一次维护整合:地区受限与线路不稳的朋友等来了出口代理,同时修掉了一批报告集中的实际故障。

新增

  • 出口代理(订阅 / 单代理)——插件的上游请求现在可以走你自己的出口:机场订阅(自动拉起本机 mihomo、测速选最佳节点、踢除 429 节点)或单个 HTTP/SOCKS5 代理。设置页显示当前最佳节点与访问耗时;订阅地址按凭据对待,只在点「显示」时读取。升级/公告/EAC 车道不经出口,故障域隔离。
  • 看板:号池负载面板 + 最近一回合——号池面板显示容量、24h 活跃、进行中并发,畅通/繁忙/过载判定由网关进程实时给出,数字全部真实;「最近一回合」一行摘要,让刚发完消息的用户立刻看到 token 去向(#26)。

修复

  • EAC 签名车道加固——签名后的请求体改走 Node 核心 http(s) 模块直发,billion-context 等改写 fetch 的本地插件不再碰得到签名字节;此前网关报「request signature rejected」被误诊为凭据失效,现在会明确提示是本地代理改写(#50)。
  • 设置页连不上后端——挂在反向代理子路径下的部署不再丢前缀;桌面端 dsh-app:// 中继请求的准入兼容合并自社区 PR,准入异常转为 503 并输出固定字段诊断日志(#49/#54)。
  • 截断自动续写——回答撞到输出上限被截断时,插件会把已出正文回灌并自动续写一次,不再要你手动发「继续」(#28)。
  • 网关默认单 IP 并发 20→5——一条 LLM 流会占住上游连接几十秒到几分钟,旧默认让单个用户就能打满共享车道、拖垮整机(#55 现场之一)。

实测验证:本地网关与实机自检(对话/工具/视觉/更新链路)全绿。

全部 24 个离线套件通过,清单逐字节 Ed25519 重签。

升级

设置 → 插件升级,一键升级。

v1.4.4 — 剥除 DeepSeek 泄漏的 DSML 控制标记

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 04 Oct 10:12

Our Free Model v1.4.4

修一个 DeepSeek V4 系模型的显示缺陷:有的回合里,模型在思考结束、准备调用工具的那一刻,会把内部控制标记 <|DSML| calls> 当成正文漏出来(那次采样里服务端没拦住这个特殊 token),用户会在回答开头看到这串乱码。

修复

  • 流式剥除——插件流解析器实时把 <|DSML|…> 控制片段从可见正文剥掉;半个标记会缓存到能判定为止再吐,正式的工具调用帧不受影响,工具照常执行
  • 两条车道同时生效——免费道与 EAC 渠道走同一个解析器
  • 1.4.3 的升级下载三次重试原样保留

实测验证:复现泄漏的同一场景,修复后正文只剩干净换行,工具调用完整执行。

全部 21 个离线套件通过,清单逐字节 Ed25519 重签。

升级

设置 → 插件升级,一键升级。

v1.4.3 — 升级下载逐文件三次重试,瞬时断流不再让升级失败

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 04 Oct 08:35

Our Free Model v1.4.3

修的是升级链路自己:升级下载逐文件三次重试。

有用户在 1.3.1 → 1.4.2 升级时遇到 staging failed: README_EN.md: fetch failed; README.md: fetch failed——国内出口到 CDN 的连接会瞬间抖动,而 staging 此前每个文件只有一次机会,抖一下整包升级失败。

现在的行为:

  • 传输类失败自动重试:连接被断、超时、HTTP 5xx / 429,按 0.7s → 1.4s 退避,最多三次
  • 完整性失败依旧一次拒绝:大小 / SHA-256 不符是信任链在拒绝,不给侥幸、不重试

全部 21 个离线套件通过,清单逐字节 Ed25519 重签。1.4.2 的全部内容(EAC 协付渠道、签名网关、七闸实测、思考档位、贡献者 9 PR)在本版原样保留。

升级

设置 → 插件升级,一键升级。遇到升级失败请直接再点一次「立即升级」,1.4.3 起会自己扛住瞬时抖动。

v1.4.2 — EAC 协付渠道上线(六个旗舰 · 1M 上下文 · 视觉);签名网关与七闸实测

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 04 Oct 07:08

Our Free Model v1.4.2

把 9 月发布(v1.3.2)之后的全部积累一次带到:一条新的 EAC 协付渠道、它背后的签名网关与防滥用闸门,以及贡献者的 8 个 PR。全部 21 个离线套件通过,清单逐字节 Ed25519 重签。

EAC 协付渠道(桌面端专属)

新增六个旗舰模型:

模型 上下文 最大输出 视觉 思考档位
DeepSeek V4.1 Flash 1M 384K ✓ 关 / 低 / 高 / 极
Kimi K3 1M 131K ✓ 低 / 高 / 极
Kimi K2.6 262K 98K ✓ 低 / 高 / 极
GLM-5.3 1M 131K — 低 / 高 / 极
GLM-5.3 Flash 1M 131K ✓ 低 / 高 / 极
GPT-OSS 20B 131K 32K — 低 / 中 / 高

渠道凭据以 AES-256-GCM 三分片密封在插件内,运行时 HKDF 派生;宿主闸门确认 dsh 桌面端才解锁(web 档案 EAC 模型行数为 0),锁死时 LANE_LOCKED 一次失败、不重试风暴。

签名网关:密钥不出服务器

中继真 key 只活在网关环境;插件请求带 HMAC-SHA256 签名(重放窗口 ±600s、恒时比较、多密钥并存轮换、仅放行两条路由)。

SSE 预冲刷:验签一过就回 200 + 流头 + : keepalive 心跳——推理模型 20–140s 的首字等待不再被 nginx 60s / Cloudflare 100s 掐断(实测 124 秒的 GLM-5.3 完整走完);上游拒绝改走流内错误帧,分类照旧。

防滥用七闸(全部真发请求验收)

无签名 / 伪造 / 重放 → 401;白名单外模型 → 403;超 8MB → 413;未知路由 → 404;61 次/分钟 → 429。再加 20 并发/IP、模型白名单、Cloudflare 边缘;网关看板按盐值哈希 IP 记账,New API 面板侧边栏自动挂「EAC 看板」入口。

思考控制

档位菜单照搬 ZCode 的模型声明(DeepSeek 关/低/高/极,Kimi 低/高/极,GLM 低/高/极,GPT-OSS 低/中/高),默认档必须在自己的菜单内;EAC 请求带防过度思考系统提示,静默回合自动续写兜底。

贡献者 PR(全部合并)

#23 / #24 / #25 / #27 / #35 / #36 / #37 / #38 / #39 —— 转发 LAN 中继、同步双启动竞态、端口顺延提示、refusal/pause_turn 续写等。

体验细节

  • 前置代理的 HTML 错误页化简为一行可读文案
  • 免费道限流徽章改「暂不可用」(它本来就是上游公共池的波动,不是你的额度)

升级

设置 → 插件升级,一键升级。EAC 渠道仅 dsh 桌面端可见;免费道一切照旧。

v1.3.2 — 自更新加签名(#19);转发工具调用修复(#20/#21);限额退避(#13);热力图贴合并(#11)

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 02 Oct 07:26
7f6d9d7

处理了 issue 追踪单上的 #11、#13、#19、#20、#21(#20 与 #21 同根因,一并修复)。评审环节在自己刚写的代码里又找出两处(EventSource 退避作用域、/v1/responses 流式 output_index 碰撞),一并修掉。

修复

  • 自更新信任链换根(#19) —— 此前升级清单就是一份 HTTPS 拉下来的裸 JSON:文件 sha256 写在清单里,伪造清单的人连哈希一起伪造;jsDelivr 这个第三方 CDN 也在信任链上,仓库账号被接管或 CDN 投毒都直接等于在宿主进程里执行任意代码。现在每份清单必须带发布私钥的 Ed25519 签名,公钥 pin 在插件内(src/updater.js 的 PINNED_MANIFEST_PUBLIC_KEY),私钥不入仓;build-manifest.mjs 无 --key 拒绝写未签名清单,且发布前校验私钥与 pin 公钥配对。镜像(含 jsDelivr)被投毒从"直接 RCE"降级为"所有用户升级失败"。feedUrl 设置与更新源彻底解耦——只重定向公告,且公告 override 本身收紧为 https+无凭据(回环 http 例外,本机镜像与测试仍可用)。清单 base 只允许相对路径;插件 API 请求体加 1MB 上限(413);转发监听改按 dns.lookup 解析绑定、要求全部解析结果回环,hosts 文件把 localhost 指到可路由接口不再能一边通过校验一边把免密车道分给整个子网。
  • 转发端口下工具调用修复(#20/#21) —— 流式 tool_calls[].index 此前与 reasoning 块共用上游计数器,首个工具调用常以 index 2+ 到达,按 index 累积的客户端拿到带洞数组、参数被并丢或丢弃;现在按调用重编从 0 起。模型去调 bash/read/grep 这些为过免费层指纹门而追加的诱饵工具——#21 报的 Unknown tool 'bash'/'read'/'grep' 正是这个四件套:车道强制声明它们,模型真的去调,转发客户端却没有注册——现在这类调用在转发口被按块抑制(未命名块先扣留参数再分类,防片段泄漏)。被输出上限截断的工具参数回合,流式也如实回 length 而不是 tool_calls。stream.js 侧:无 index 的并行工具调用按 call id 分块,裸参数续写归前一块。/v1/responses 补齐 instructions/max_output_tokens/流式 SSE,流式 item 以互异递增的 output_index 宣告、最终 output 数组按宣告顺序回放。
  • 达到限额的体验(#13) —— 车道的 429 自带递增的 retry-after,插件此前还把它当可重试错误自动再撞两次,同一面墙撞三次、配额付三份;现在 429 当场上报。可用性探测整轮全 429 后按 30→120 分钟指数退避(boot、手动 reprobe、出口变化不受限)——探测与你的回合吃同一个按 IP 计额的池子,不再自己把自己的额度探没。探测识别 200 流内的 error 帧,"每轮都失败"的模型不再挂绿牌。测速按钮改用默认档(deep 每次最多烧 32K 输出且常把自己打到 429)并按路由放宽前端超时(测速 240s、升级 600s)。
  • 热力图贴合并(#11) —— 格子 gap 归零、圆角收小,GitHub contribution graph 式连贯观感。
  • 其它 —— 公告推送断连后按 30s→5min 退避重连,不再永久静默失效;升级完成会清掉旧错误横幅;看板"速度"文案与最近 40 次的实现一致;store 落盘失败会在日志说一次。

验证

  • 全部 20 个离线套件(含新增 forward-test:真实 listener + 脚本化 lane 的流式/非流式/400/404/回环绑定用例)与 tsc --noEmit 通过
  • updater-test 新增签名/篡改/异钥/feedUrl 不跟随四组负控;release-e2e 负控改在签名处拒绝;CRLF 全树哈希一致
  • 真实 dsh 0.1.7-rc.1 宿主安装验收:插件激活、转发口面(models 200 / 无 key 401 / 未知模型 404 / 非 JSON 400)、真实非流式+流式补全全通;对真实更新源的 update/check 确认未签名清单被签名校验拒绝(按设计)

请前往 设置 → 插件升级 一键升级。

v1.3.1 — 工具结果终于送达模型;被掐断的长思考不再算成功;上游来源写进 README

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 27 Sep 09:33

处理了 issue 追踪单上的 #8、#9、#10;发布前自审又在自己刚提交的修复里找出三处,一并修掉;#10 的处理方式在真实内核里实测后做了收敛。#11 本轮未处理。

修复

  • 工具调用与工具结果终于送达模型(#9) —— dsh 在两代会话格式里用了两种形状记录工具答案:V4 之前是携带 tool-result 内容块的 user 消息,V4 起才是 role:'tool' 消息。插件只认后者,于是在 dsh 0.1.5 / AIO 6.9.3 这一代内核上,免费车道每一个 agent 回合都带着"没有结果" upstream,模型反复发出同一个调用直到用户手动停止。形状取自本机真实 durable 日志而非假设:4 处 session 根共 40 个 session*.jsonl.zstd,user+tool-result 362 条(AIO 6.9.3 的 v3 写 336 条、~/.dsh 的 v1 写 26 条),V4 的 role:'tool' 27 条——两代都有人在用。现在三种 wire 格式都认,嵌在结果里的图像也不再丢。原报告里的第二半也修了:过免费层指纹门需要 bash/glob/grep/read 四个名字,Windows 上内核的 shell 叫 pwsh,此前补进去的 bash 诱饵被模型真的调了 24 次、全部 unknown tool;现改为把真实 shell 提升去占该名字、回来时还原,调用因此可执行(真实上游验过:网关接受提升后的声明,返回的调用名是 pwsh)。
  • 流被上游提前关闭不再算说完了(#10) —— 网关在既没发 finish token 也没发 usage 帧时直接 FIN,插件会落到兜底的 stop:一轮五分钟的纯思考被标记为 completed,统计里还是 ok:true / 0 tokens。现在这是失败,界面写明「本轮运行失败」与截断发生在第几秒,统计行留下 truncated / noUsage 以便审计。且重发按已经流出什么来分(见下)。
  • 上游来源写进 README(#8) —— 新增「上游是哪些源」一节(中英双版):只有一个来源,OpenCode 的 Zen 网关 https://opencode.ai/zen/v1/*,用其公开免密额度,不经任何第三方中转或号池;出网目标共四类逐项列出(推理与 /models、本仓库 feed/*.json 的 raw→jsDelivr 兜底、三个只读本机出口 IP/国家码的服务),每一条都与代码里的出网点逐一核对过。应用内的选择器、设置页与报错文案仍不出现厂名,公告正文作为披露位例外并写明。

发布前自审,修掉了上面这两条自身的毛病

  • Messages 线把 V4 的结果发了两遍 —— 认出 role:'tool' 之后没有跳过该消息自己的 content,同一段答案既进了 tool_result 又留在紧随的普通块里;文本两份,图像连整段 base64 两份(上游按两份计费)。Chat 与 Responses 线本来就是发出结果即跳过,只有这条线漏了。新断言改为按发出的字节数答案出现次数——只断言块类型看不见重复,把修复撤掉这条立刻红。
  • Responses 线的终止事件只认一个 —— response.incomplete / response.failed / response.done 同样是网关有意收尾;只认 response.completed 会让"撞到输出上限"被读成"被掐断",于是 #10 的检查在一条已完成的回答上白白重试两遍。现在仍由 status 决定 finish token,且不带原因的终止帧不再抹掉前一帧给过的 token(否则 length 会悄悄退回 stop)。
  • 另:src/feed.js 的注释与源顺序相反、README 里「任何面向用户的位置都不出现上游厂名」与实际不符(公告已点名)、会话统计的语料口径写错——三处文字都改到可复现为止。

#10 的重试策略是实测后收敛的

在真实 dsh web 内核里、从浏览器发一轮 MiMo V2.6 Flash · Deep:这条车道稳定在 304 秒掐断纯思考回合。当时代码是可重试的 TRANSPORT,durable 会话日志记下 llm/retry retry=1 delay=702ms(304s)与 retry=2 delay=1124ms(608s),turn/end 落在 912s——同一个五分钟付了三遍,最后仍然没有回答;stats.json 里是三条间隔 304s 的 ok:false truncated:true 行。上限由这回合的思考长度决定,不是网络抖动,重发拦不住它。

所以现在:已经流出过内容的截断判为 STREAM_CUT(在可重试名单外,第一刀就结束),一个 token 都没出来的截断仍是 TRANSPORT(重发只花一个 blip 的成本,而那种回合撞不到 304s 上限)。同一入口回归验证:一次请求、305s 落地、日志里没有任何 llm/retry、界面显示 STREAM_CUT、统计只多一行。

未处理

  • #11 Token 热力图美观性建议(格子分开的样子)——本轮未动,issue 保持打开。

升级方式

设置 → Our Free Model → 插件升级 → 立即升级。全过程在应用内完成(下载 → 校验 → 备份 → 替换 → 热重载),任一步失败自动恢复上一版本并给出原因;新安装用户无需操作。

验证

  • 18/18 离线套件(npm test,本轮新增 projection 40 条与 fingerprint 20 条两条套件,truncation 里 #10 那块 22 条);不出网、不花免费额度。
  • 全新克隆公网 main 后复核:build-manifest.mjs --check 通过——清单与它所描述的 28 个文件、446 418 字节逐字节吻合(旧版本用户点升级时通过的就是这套校验)。
  • 真实上游 host-selftest.mjs:11 个模型探测 + 普通对话 + 两轮工具(两种形状各自一轮,都 saw-the-result=true)+ 三档思考 + 视觉输入,每轮都落到自己的正常收尾,没有一条被读成截断。
  • 真实内核(dsh 0.1.7-rc.1,web profile)两轮长思考回合,事件级取自 durable 会话日志,数字见上一节。
  • 发布产物:gh api 确认 main 上 index.js 就是清单声明的 60 224 字节;jsDelivr 在不可变 ref(@v1.3.1)下 28 个文件全部 SHA-256 与回读校验通过。同一 CDN 的 @main 文件层在推送后仍短暂发上一版(这是 CDN 分支解析缓存,不是发布物错误),新增的 scripts/live-audit.mjs 就是用来把这件事跑成结论而不是靠 curl 看版本号的 runbook 第 6 步。

Full Changelog: v1.3.0...v1.3.1

v1.2.2 — 一键升级恢复可用,思考档位按模型抬高,不可用模型不再进选择器

Choose a tag to compare

@Ebony-Vinyl Ebony-Vinyl released this 26 Sep 01:41

逐条处理了 issue 追踪单上的问题,并在此之上自审了两轮。

修复

  • 应用内升级恢复可用(#1) —— 1.2.1 的发布清单与仓库实际发布的文件在 6 个文件上不一致(比报告里多 2 个,说明提报之后还复发过一次),任何旧版本点「一键升级」都会在校验阶段失败。清单已随版本重新生成,并新增 build-manifest.mjs --check:清单与实物不一致就非零退出,已接进 npm test 与 CI。摘要改为按 LF 归一化后的字节计算——.gitattributes 是 text=auto eol=lf,用户下载到的是 blob,而编辑器可以把工作区写成 CRLF 且 git status 依然干净,这正是它复发的那条路。新增 release-e2e.mjs 把升级完整跑一遍,并带「清单谎报 1 个字节必须被拒绝」的反向对照。
  • 思考关不掉的模型不再被频繁截断(#2) —— MiMo V2.6 这类模型的思考与正文共用同一份额度,实测单日 92 次调用中 82% 的输出 token 是思考,未翻倍的 8192 只给正文留下约 1500。三档整体抬高为 4 096 / 16 384 / 模型上限;设置页每张模型卡与档位说明改为按真实下发的数字生成,不再出现「界面写 8K、实际发 16K」。
  • 探测判定不可用的模型不再进选择器(#3) —— 只有网关明确点名「这个 id 不路由」才移出下拉框(响应体点名,或 400/404/422);5xx、限流、超时、断连都不再被当作对模型的判定,全新安装里尚未探测完的模型照常可选,整轮全部被拒时保护性保留名单。
  • 无 web 服务的 composition 也能装(#4) —— inject 只保留 llm;设置页半身挂到独立的 ctx.inject(['webServer']) fiber 上,没有 HTTP 服务器时不再把模型线路一起拖住。真实 dsh-tui 尚未实机验证(本机两套内核都不含 tui profile),这一条只做到结构性验证。
  • 流式响应按 body 而不是 header 判定(#6) —— 高负载下网关会用 application/json 的 content-type 回一整套 SSE 帧;现在按响应体形状判定,已嗅探的字节回放进流里,既不会整轮报错,也不会把可用模型误判成不可用。

自审另外修掉的

  • 嗅探窗口原来要填满 4 096 字节才下结论:一条网关已经说完、但连接没立刻关掉的短回答,会在嗅探里等到超时,然后被 cancel 连帧一起丢掉——一个已完成的回合被报成可重试的 TIMEOUT,内核重发、额度付两次(本地复现输出 frames delivered: 0)。
  • 流内错误的分类写进了 llmCode,而 toFailure 只读 code:每条流内拒绝都降级成可重试的 TRANSPORT(已经吐过 token 的回合被重发),中途的 RegionError 也永远触发不了换出口重探。
  • 设置入口没做类型检查:probeIntervalMinutes:'abc' → setTimeout(fn, NaN) 在 Node 里等价于 1 ms,一秒一整轮全量探测;清空 defaultMaxTokens 输入框会发 0,把每一轮都裁到 512 token 下限。数值项改为在写入与读取两侧各设一道。
  • 转发监听拒绝可路由的绑定地址(否则整个子网都会花掉这台机器的免费额度)。
  • stateOf 的消息兜底不再把 5xx 的原因短语 Service Unavailable 读成「网点名了这个模型」(否则过载的网关会让模型一个个从选择器里消失)。
  • 探测周期不再被静默抬到 1 小时;retry-safety / tui 两个「看起来在测」的套件改为真发请求、按周期逐个核对。

升级方式

设置 → Our Free Model → 插件升级 → 立即升级。全过程在应用内完成(下载 → 校验 → 备份 → 替换 → 热重载),失败会自动恢复上一版本并给出原因;新安装用户无需任何操作。

验证

  • 14/14 离线套件通过(npm test);本轮新增的 5xx 断言逐条还原旧实现反向确认过,2 条立刻变红。
  • 真实上游 host-selftest.mjs:10 个模型、地区分组、用量统计、转发端口(流式与非流式)。
  • 真实内核(dsh 0.1.7-rc.1,web profile)实机启动,并在浏览器里逐项读取设置页,控制台零报错。
  • 发布后逐文件复核:线上清单所列 26 个文件的字节数与 SHA-256 全部吻合——即旧版本用户点「一键升级」时会通过的那套校验。

Full Changelog: v1.1.2...v1.2.2