Repository navigation
Releases: Ebony-Vinyl/dsh-our-free-model
Release list
v2.1.0:聚合 API——自带 Key 接入 76 家服务商;省 Token(工具输出压缩实测省 90%);自动降级链路;原生 /v1/messages
聚合 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);登录链路加固
免费渠道:十三个账号渠道,一体接入
- 一次接入 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);错误分类不再误导重登
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 签名车道加固、截断自动续写、设置页子路径修复
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 控制标记
Our Free Model v1.4.4
修一个 DeepSeek V4 系模型的显示缺陷:有的回合里,模型在思考结束、准备调用工具的那一刻,会把内部控制标记 <|DSML| calls> 当成正文漏出来(那次采样里服务端没拦住这个特殊 token),用户会在回答开头看到这串乱码。
修复
- 流式剥除——插件流解析器实时把
<|DSML|…>控制片段从可见正文剥掉;半个标记会缓存到能判定为止再吐,正式的工具调用帧不受影响,工具照常执行 - 两条车道同时生效——免费道与 EAC 渠道走同一个解析器
- 1.4.3 的升级下载三次重试原样保留
实测验证:复现泄漏的同一场景,修复后正文只剩干净换行,工具调用完整执行。
全部 21 个离线套件通过,清单逐字节 Ed25519 重签。
升级
设置 → 插件升级,一键升级。
v1.4.3 — 升级下载逐文件三次重试,瞬时断流不再让升级失败
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 上下文 · 视觉);签名网关与七闸实测
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)
处理了 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
处理了 issue 追踪单上的 #8、#9、#10;发布前自审又在自己刚提交的修复里找出三处,一并修掉;#10 的处理方式在真实内核里实测后做了收敛。#11 本轮未处理。
修复
- 工具调用与工具结果终于送达模型(#9) —— dsh 在两代会话格式里用了两种形状记录工具答案:V4 之前是携带
tool-result内容块的user消息,V4 起才是role:'tool'消息。插件只认后者,于是在dsh0.1.5 / AIO 6.9.3 这一代内核上,免费车道每一个 agent 回合都带着"没有结果" upstream,模型反复发出同一个调用直到用户手动停止。形状取自本机真实 durable 日志而非假设:4 处 session 根共 40 个session*.jsonl.zstd,user+tool-result362 条(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,本轮新增projection40 条与fingerprint20 条两条套件,truncation里 #10 那块 22 条);不出网、不花免费额度。 - 全新克隆公网
main后复核:build-manifest.mjs --check通过——清单与它所描述的 28 个文件、446 418 字节逐字节吻合(旧版本用户点升级时通过的就是这套校验)。 - 真实上游
host-selftest.mjs:11 个模型探测 + 普通对话 + 两轮工具(两种形状各自一轮,都saw-the-result=true)+ 三档思考 + 视觉输入,每轮都落到自己的正常收尾,没有一条被读成截断。 - 真实内核(
dsh0.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 — 一键升级恢复可用,思考档位按模型抬高,不可用模型不再进选择器
逐条处理了 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