Repository navigation
Releases: dushaobindoudou/dsh-freeroute
Releases · dushaobindoudou/dsh-freeroute
Release list
dsh-freeroute v0.10.2
Fixed
- 模型标注常驻不消失:
⚡ <模型>之前靠宿主的动作行显隐,但宿主只对
「非最后一条回复」启用 hover 显隐 —— 最后一条回复的整行是
[data-actions-reveal=always](时间/复制本来就常驻),标注跟着常驻,看起来
像是「鼠标移开也不消失」。现在标注自己按 hover 语义收口:默认隐去,悬停
动作行(或键盘聚焦行内按钮)才露出;触摸设备(@media (hover: none))
没有悬停,保持常显。
dsh-freeroute v0.10.1
Fixed
- 持续输出的长推理不再被 600s 整次上限砍断:0.10.0 只解决了「出字前排队」,
出字快但推理很长(实测首 token 25s、整段超过 600s)仍会在已出字后被 curl
--max-time 600砍断、无法切换,整轮失败。现在按阶段约束:- 出字前:首 token 超时(默认 90s);链上最后一个候选放宽到 600s(此前
不设限)。 - 出字后:内容空闲检测,连续 120s 没有新内容(只剩心跳也算)才中止,
FREEROUTE_CONTENT_IDLE_SECONDS可调;内容还在流就不砍。 - curl
--max-time提到 3600s,只作失控兜底。
- 出字前:首 token 超时(默认 90s);链上最后一个候选放宽到 600s(此前
Changed
- auto 链层内按首 token 耗时沉底慢提供方:按「上游|模型」记录首 token
耗时(指数平均,首 token 超时按超时值记入),超过首 token 超时阈值一半
(默认 45s)的提供方沉到所在层的末尾——稳定排序,不跨层、不删除;样本
30 分钟后过期,网关恢复了会回到原位。此前glm-5.3-flash @ amd-radeon
这类排队数分钟的网关会长期占着链首,每次都要等满首 token 超时才切走。
注意:链首换成同层另一家时,auto 上报窗口取新链首的窗口(仍装得下本次会话)。
Tests
integration.mjs第 22b 段:持续出字超过空闲上限不被砍、出字后只剩心跳被
中止且报错/日志说明原因、首 token 慢的提供方第二次请求被同款快提供方超过。
dsh-freeroute v0.10.0
Added
- 每条回复的模型标注(自动模式):回复的时间(如
13:17)右侧多一个小标签
⚡ <实际服务模型>,悬浮显示上游与请求模型(auto)。此前 auto 模式下用户
只能看到「⚡ Auto」,无从知道这一条到底是哪家上游的哪个模型答的;故障转移
之后尤其需要。实现要点:- 适配器成功出字时记录「真正服务的上游 + 模型」,按
(sessionId, turn, step)
暂存;宿主assistant/message落地时绑到该消息的messageId(适配器在消息
落盘前就被调用,拿不到messageId,只能靠这个事件对齐键)。 - 客户端挂到宿主的
conversation.chat.assistant-actions动作行,CSS
order: 1把它排到endInfo(时间)之后 —— 视觉上就在时间右边,并沿用
动作行原有的 hover 显隐,不新增交互。 - 数据经新 RPC
freeroute.served按messageId取回,按会话缓存 1 秒(同批
新消息共用一次请求)。归属只存宿主内存,不写会话日志:dsh 的持久化读
路径会拒绝未登记的未知事件类型(写进去会话就读不回来了),合法的 plugin
record 又要求与宿主同一份 dsh-session 模块实例,插件拿不到。代价是宿主进程
重启后历史消息不再标注。 - 只标注会话消息:
purpose: 'compaction'/ 会话标题这类内部调用、以及没有
sessionId的调用(本地/freeroute/v1入口、面板连通测试)不产生归属。
- 适配器成功出字时记录「真正服务的上游 + 模型」,按
Fixed
- 「本轮运行失败:上游流在结束前中断」高发:0.9.x 的 auto 锚点常落到
glm-5.3-flash @ amd-radeon、nemotron-3-super这类免费网关,4~5.6 万 token
输入时首 token 要排队 4~7 分钟,期间只发 SSE 心跳——心跳也是字节,绕过了
90s 读空闲检测;之后的慢推理再撞上 600s 整次上限,在已出字后被 curl
砍断,无法切换上游,整轮失败(实测 4 次失败全部在请求发出后 600.0~600.4s)。- 新增首 token 超时(默认 90s,
FREEROUTE_FIRST_TOKEN_SECONDS可调,0
关闭):出字前超时即中止并抛TIMEOUT,按普通失败冷却并切下一家候选。
链上最后一个候选不设此限——后面没有退路时,等慢上游好过直接失败。
- 新增首 token 超时(默认 90s,
- 中断原因终于可见:此前在 curl 退出前读 stderr,实测从未读到内容,报错
永远是笼统的「上游流在结束前中断」。现在等 curl 退出(最多 2s)取退出码,
区分「超过整次上限 600s」「连续 90s 无数据」「连接被重置」「关闭但无
[DONE]」,并附已运行时长。 - 出字后中断写入 freeroute.log(含上游、模型、原因):此前这类整轮失败在
日志里一行都没有,只能从 dsh 会话反推。 - 测试的运行日志改写到临时
DSH_HOME,不再把mock-*噪音混进真实
~/.dsh/freeroute/freeroute.log。
Tests
integration.mjs第 22 段:只发心跳的慢上游被首 token 超时中止并切到下一
家、末位候选不设限照常等到出字、出字后中断上抛STREAM_CLOSED且报错带原
因与时长、日志留痕。integration.mjs第 20 段:turn/step 跟踪 →assistant/message绑定 →
freeroute.served读回,覆盖多步独立成条、compaction 不占用归属、无
sessionId不写归属、会话销毁后清理。client-integration.mjs第 8 段:动作行条目注册(id/order)、有归属时渲染
frp-served+ 悬浮说明、无归属 / 缺sessionId时不渲染。
dsh-freeroute v0.9.1
Fixed
- auto 锚点改为「交集家数 → 质量档」:quality 降为平局裁决。用户
custom.models会整表覆盖内置表,档位往往只在部分上游存在,作为第一键会让
「碰巧带了档位的那家」压过真正的主流款。 - 同款模型按「这一家」的窗口排提供方:0.9.0 用跨厂商聚合窗口(取最大值)
判断容量,同款在不同网关标称 32K~400K 时,会把 32K 的提供方当成 400K 排到
链首,auto 上报窗口也随之跌到 32K(压缩风暴根因 D 回归)。现在同款内窗口大
的在前、同窗按用户优先级;「同窗」层与「装得下」层都按每个提供方自己的窗口
判断。 - 容量下限只用本次请求的粗估占用:0.9.0 把进程级粘性窗口并进下限,一次
1M 服务后,所有会话(包括新开的短会话)都被锁到 1M 款,压过主流度。粘性窗口
现在只在交集与质量都打平时裁决锚点;auto 上报窗口按上一次派发的占用对齐
链首。 - 免费自动路由(
*/free)不再凑交集:openrouter/free、orcarouter/free
等归一后都叫free,但背后是各家自己挑的模型,现在按上游隔离计数。 - 模型级失败不再冷却整家上游:auto 链按「同款跨厂商」排列,同一家的模型
通常不相邻。冷却判断改为「链里后面还有没有这家」;上游级失败(限流 / 鉴权
/ 缺 Key / 网络)照常冷却,并跳过链里这家剩下的候选。 - 链长上限只数真正发起的尝试:被整家跳过的候选不占名额,一家模型多的上游
(OpenRouter 十几款)鉴权失败不再吃光 12 个名额。 - 锚点平局时「原首选」裁决恢复生效:池首默认模型是
*/free时,原先按
未隔离的通用名查不到聚合项,这一级裁决会静默失效。 - 文档与面板描述同步为「交集家数优先、quality 平局裁决、四层链」。
Tests
integration.mjs接入npm test(此前 CI 只跑 smoke 与 client 两套,auto
路由的回归断言从未在 CI 执行)。- 修两处随时序飘的断言:3c 的请求体捕获只记 POST(
GET /models探测的空
body 会混入);启动时的首轮目录同步改指向立即失败的本地源,不再拉线上主源
——网络慢时它会在第 9 段之后落地,把 mock 目录整层覆盖。
dsh-freeroute v0.8.18
Changed
- Union Alpha stealth 预览接入(2026-09-16 发布当日复核):
- openrouter 新增
stealth/union-alpha:$0 计费实测出字(cost:0)、
262k 上下文、支持视觉、不占:free日额——freeModels 显式声明免费。 - opencode 上新
union-alpha但免费档启用客户端围栏:API 直调无论
是否带 Key 均报 FreeTierError(「free tier can only be used from within
OpenCode」),7 款 -free 暂无法从第三方工具调用——freeModels 置空、
defaultModel 改 union-alpha,opencode 暂从免费路由退出(目录同步)。
- openrouter 新增
dsh-freeroute v0.8.17
Changed
- 免费模型目录 2026-09-16 全量复查(live 探测 + 带 Key 实测):
- B.AI 免费档失效:deepseek-v4-flash / deepseek-v4-flash-vision-exp 已
从 /models 下线;零余额账户实测全模型返回 insufficient_user_quota(含
旧免费款 hy3 / mimo-v2.5)。种子表 freeModels 置空、models 收敛为在列
2 款、defaultModel 改 hy3——B.AI 暂从免费路由退出(充值后可用性未验证)。 - 远程目录同步更新并部署(config.freetokenbox.com 与
freeroute-catalog.pages.dev 双源一致):openrouter 新增
z-ai/glm-5.2:free 与 inclusionai/ling-3.0-flash-vl:free、移除两款
下线 minimax;amd-radeon 换血(Vision-Exp 下线,GLM-5.3-Flash /
Qwen3.8-27B 上新且实测出字,MinerU2.5-Pro 为 OCR 专用未收录);
aihubmix minimax-m3-free 下线(54→53);orcarouter 清理 qwen3.8-27b-free
(orcaverify-text1.0-free 为检测专用模型不收录);nvidia 清理 minimax-m3。 - 高级设置 freeModels 示例与 test/e2e-bai.mjs 断言同步新现实。
- B.AI 免费档失效:deepseek-v4-flash / deepseek-v4-flash-vision-exp 已
dsh-freeroute v0.8.16
Changed
- 行头内边距收紧
8px 10px→8px;卡片圆角 16px → 10px(与模型条目
一致,紧凑行观感更协调);卡身水平内边距同步对齐 8px。
dsh-freeroute v0.8.15
Fixed
- 根治「旧样式层叠泄漏」——这是 0.8.13/0.8.14 三项症状(行头
width: 100%、text 堆叠换行、卡片双内边距偏高)的真正来源:dsh web
进程重启/插件热更后,长开的浏览器页签里旧版本<style>成为孤儿(其
disposer 已随旧进程消亡),旧规则顶掉新表未显式声明的属性。- CSS 头部加版本标记(
/* dsh-freeroute-client-css v<version> */,
构建时由 package.json 单源注入,动态/静态两条构建链同步)。 - 挂载时执行
sweepStaleStyles():按标记清扫所有非当前版本的
freeroute 样式元素(以.frp-tab/.frp-cards独有选择器识别,
不触碰宿主与第三方样式)。动态(styles.insert)与静态(web 模块)
两条挂载路径都已接入。 - 无头 Chrome 端到端实测:清扫后旧表(0.8.10/0.8.11 模拟)全部移除、
当前版本表保留、宿主样式不动、width:100%/旧 padding/column 泄漏消失。
- CSS 头部加版本标记(
Tests
- client-integration 51 项全绿(清扫函数在无 document 环境下守卫直返)。
dsh-freeroute v0.8.14
Changed
- 上游/模型卡片几何修复(无头 Chrome 实测驱动,修正三项反馈):
- 按反馈删除
.frp-ucard的padding: 12px 14px(连同gap),内边距改由
行头(8px 10px)与卡身(10px 10px 12px)各自承担;卡片高度 46→38px,
不再撑宽撑高。 - chevron 改固定 16px 方形盒:原先裸 '›' 旋转后字形戳出行头右缘
(实测任意宽度恒定溢出 7px,即「head 超出外部区域」),方形盒旋转后
溢出归零。 - 行头/文本区显式
flex-direction: row+flex-wrap: nowrap(防御性:
任何环境下名称/标签/圆点都不堆叠换行,超长一律省略号)。 - ↑/↓ 图标按钮微缩(11px / padding 2px 5px),缓解行头拥挤。
- 按反馈删除
Tests
- 无头 Chrome 几何回归:200–720px 全宽度卡片高 38px、head 溢出 0、
text 单行 20px、name 正常省略。client-integration 51 项不变全绿。
dsh-freeroute v0.8.13
Changed
- 「免费」列表行几何对齐默认 provider 行(修正 0.8.11 引入的布局偏差):
- 模型条目放弃比例网格列(第二列文字从行中 58% 处起排,视觉居中悬浮),
改为单行 flex 左贴:等宽 id 定宽 + 名称·上下文弹性左对齐(超长省略)+
chevron 靠右;条目内边距 6px → 4px 8px(≈原生 candidate 行 26px)。 - 供应商映射行同步收紧(padding 4px 8px),与模型行同高。
- 上游行头对齐原生 rowIdentity/rowActions 结构:名称 → Key 标签 → 状态圆点
顺序(credentialDot 同位),控件区(↑/↓/开关)改margin-left:auto右移,
文本区不再flex:1;圆点 9px → 8px 对齐原生 credentialDot。
- 模型条目放弃比例网格列(第二列文字从行中 58% 处起排,视觉居中悬浮),
Tests
- client-integration 第 7 节断言同步(行头 rowIdentity 三件套、chevron 索引、
模型行条左贴结构),51 项全绿。