Releases: HengXin666/freebuff-proxy
Release list
v1.6.0 — 幽灵连接全链路有界化 + 付费/免费模型分层调度
v1.6.0 — 幽灵连接全链路有界化 + 付费/免费模型分层调度
🐛 幽灵连接(一条链卡死 → 其他连接全部超时)全链路修复
网络波动导致连接一直卡死、前端显示仍占用连接、新请求全部超时——根因是请求链路存在多处无限等待,现全部有界化:
- 下游背压缺口:客户端"活着但不再读"(网络波动/卡顿)时,等待 drain 不再裸挂,受 idle 超时约束自动掐断释放账号锁
- chat 兜底锁不再无限排队:预算耗尽后的锁等待设上界,超时返回
account_busy可重试,绝不无限挂起 - chat 响应头等待 600s → 120s:上游/代理网络波动(TCP 黑洞)时账号锁尽快释放,不再占死 10 分钟
- 会话切换等在途请求有上界(2×idle+60s),超时放弃该账号换下一个
- 代理池单代理挂起自动回落:连接成功但永不响应的代理 ≤20s 即视为失败,落到池内下一个
✨ 付费/免费模型分层调度
- 付费模型(premium)恒走热 session 复用,绝不暴力分散:每次 admit 都是计费会话,分散 = 每个账号各 admit 一次(烧钱 + 抖动)。
spreadFreeModels开关只对免费模型生效 - 免费模型会话剩余 <5 分钟不再调度:新配置
session.free_model_re_admit_lead_sec(默认 300s),提前 re-admit 换新会话,避免请求发到马上过期的免费会话上中途被掐断/白占额度;付费模型沿用re_admit_lead_sec(默认 60s)用到接近过期 - spread 模式下临近过期且正被在途流占用的账号自动降优先级
📦 镜像
ghcr.io/hengxin666/freebuff-proxy:latest / :1.6.0 / :1.6(GitHub Actions 自动构建推送)
升级:git pull && docker compose pull && docker compose up -d
v1.5.9
v1.5.9 — 标准模式思维增强:多轮稳定 + 一键回退
修复:多轮对话思维链混用(用户实测反馈)
- 标准模式移除逐轮动态引导注入(v4-flash-godmode rc.6 教训:动态注入不可靠、每轮 GUIDE 随轮次变化 → 思维链模式混用)
- 深度思考引导静态并入 persona,每轮请求改写注入同一份 persona → 多轮恒定、稳定触发
新增:标准模式(standard)路由实现风格(v1.5.8)
- flash 恒走 weak 内路由(w7 最优)+ 深度引导静态并入(参考 v4-flash-godmode-opencode-go)
- Pro 用 w6c persona(spec 句 + 分类,无锚,参考 dsh-anchored-standard)
- 一键开关:dashboard「思维路由」总开关 + 「路由实现风格」选择器(standard 默认 / minimal 旧行为),性能不佳可随时回退
修复:DS4 思考链稍长即截断(v1.5.7,参考 freebuff2api-wokers#8)
- 客户端小 max_tokens/max_completion_tokens 不再掐断长思考链:转发上游前把输出预算抬到 floor(65536),统一为 max_completion_tokens 单字段
部署
git pull && docker compose pull && docker compose up -d镜像
- ghcr.io/hengxin666/freebuff-proxy:v1.5.9
- ghcr.io/hengxin666/freebuff-proxy:latest
v1.5.6 修复 DS4 长思考链截断 + 保留 max 思考深度
🎯 参考 freebuff2api-wokers#8
症状:deepseek-v4-flash 思考链稍长即自动截断,再次继续仍断(cc / Pi 客户端均复现,mimo 正常)。评论指出:推理任务会触发上游返回不同 agent(code-reviewer / base3 / base2),部分 agent 带单次 output 限制。
修复内容
1. 保留 reasoning_effort: max(不再降档)
- 旧实现把
max一律降为high(注释误以为 Luna 上限);官方 efforts 表:flash=[low, high, max]、pro=[high, max]——max 是合法档位; - 实测保留 max 后思考深度 30K → 45K 字符(智力提升),且完整返回(finish=stop,不截断)——这正是「思维链模式核心 = 模型智力提升」所需要的。
2. agent 兜底回退 base3 孪生
- 主 agent 被上游以
free_mode_invalid_agent_model(403)拒绝时,自动回退base3-free-*孪生(官方 free-agents.ts FREEBUFF_WEB_BASE3_AGENT_ID_BY_MODEL); - 应对「上游按用途/推理任务路由到不同 agent、部分带 output 限制」的场景;
-max扩展上下文 root 为预置配额、普通免费账号 403,不选作默认。
3. 路由模式不受影响:persona 替换(套件 applyPersona 语义)+ 首轮核心工具 + weak 近距引导 + flash 近距引导(用户指定文本)全部保留。
验证
- 单元:
normalizeReasoningFieldsmax 保留断言 +agent_fallbackmock(主 agent 403 → base3 成功)✓ - 真实上游:
effort=max + spec 路由→ reasoning=45K / 18K 字符,finish=stop 不截断 ✓ npm test/ typecheck / compose / docker build 全绿 ✓- 本地代理已启动(127.0.0.1:28299,路由开 + spec + 免费模型分散 + 断连自愈)
🐳 镜像
ghcr.io/hengxin666/freebuff-proxy:1.5.6(latest 同步),升级:docker compose pull && docker compose up -d(含远程部署)。
v1.5.5 persona 恢复逐字符原样 + 近距引导独立注入
🎯 本次修复
persona 恢复套件逐字符原样(哈希不可变):
- spec persona =
You are a helpful software engineer assistant.(与 dsh-routing-suite router-core.mjs 逐字符一致); - 移除了此前追加在 pro spec persona 后的
Plan and reason collectively...文本——那污染了 RL 句的哈希,导致模型语域僵硬(用户反馈「禁锢/反常」),且被指为角色设定而非路由优化。
近距引导独立注入:用户指定文本 Plan and reason collectively: use first-person plural (we / let's). Begin your reasoning with "We". 保留为 flash+spec 的独立 user 消息注入(与套件 GUIDE_WEAK 的近距机制一致,不修改 persona 哈希);工具循环轮次也持续注入。
验证
- 单元测试:spec persona 断言改为「不包含追加文本」(哈希纯净);flash 近距引导断言保留 ✓
- 真实上游:turn1 强集体语域(we=82/let's=57/let me=21,引导被模型引用);turn2 工具轮混合(flash 固有方差)✓
npm test/ typecheck / compose / docker build 全绿 ✓
🐳 镜像
ghcr.io/hengxin666/freebuff-proxy:1.5.5(latest 同步),升级:docker compose pull && docker compose up -d(含你服务器上的远程部署)。
v1.5.4 persona 替换语义:与 dsh-routing-suite 的 applyPersona 对齐
🎯 本次修复:persona 从「前置」改为「替换」
重新审视了 dsh-routing-suite 的原始实现(applyPersona):它的语义是移除客户端 persona section、换成路由 persona,其余 section 全部保留。
旧实现的问题:我们只在请求最前前置了一条 persona system 消息,客户端原本的 persona(如 "You are a coding agent powered by...")原样保留在后面——模型同时看到两个身份互相打架,路由效果被稀释,等于没改变实质。
新实现:移除客户端第一条 system 开头的 persona 段("You are..." 段落),换成路由 persona(free-mode 门禁标记保留在最前),其余 section(工具指导 / 工作区 / 回复格式)原样保留——与套件语义一致;无法识别 persona 段时回退为前置。
验证
- 单元 + e2e:标准预设形态("You are a coding agent powered by...")被替换、"### " section 保留、消息数从 3 → 2;非 "You are" 开头回退前置 ✓
npm test/ typecheck / compose / docker build 全绿 ✓- 本地代理已重启加载(路由开 + spec + 免费模型分散 + 断连自愈 + 多轮锚定)
🐳 镜像
ghcr.io/hengxin666/freebuff-proxy:1.5.4(latest 同步),升级:docker compose pull && docker compose up -d。你服务器上的远程部署也需要拉取这个版本(hxapi→SUBapi 链路才会带上替换语义 + 多轮锚定修复)。
v1.5.3 思维链不再衰减:工具循环轮次持续锚定 we/let's
🐛 修复:we/let's 思维链在工具循环里衰减回 let me
- 根因:near-field 锚定只在「最后一条是用户消息」时注入。工具循环里最后一条通常是 tool 结果,锚定在第二轮起断供——实测「做一个我的世界网页版」会话:turn1 step1 完美(we=121 / let me=4),turn1 step2(工具结果返回后)let me 飙到 18。
- 修复:最后一条是「用户消息」**或「tool 结果」**都持续注入锚定/引导;assistant 文本回复 / tool_calls 之后不追加(避免"用户插话"或破坏 tool_call→tool 结果配对);复杂度判断在 tool 轮次回退到会话首个用户任务。
- 真实上游复验:turn2(tool 结果后)we=8 / let's=6 / let me=1——集体语域跨轮保持。
🐳 镜像
ghcr.io/hengxin666/freebuff-proxy:1.5.3(latest 同步),升级:docker compose pull && docker compose up -d。
v1.5.2 稳定性修复:断连自愈 + 免费模型分散
🐛 修复:客户端断开占死账号锁(严重影响使用)
- 根因:node 的
IncomingMessage 'close'是「请求体读完」事件(body 读完即触发),不是连接关闭。旧实现监听它,导致客户端断开(请求体已读完)后上游 fetch 一直挂着(最长等 120s 超时),账号 chat 锁被占死,后续所有请求排队超时。 - 修复:改为监听底层 socket close(真正的断开信号)+ pipe 内显式 client-gone race。断开瞬间中止上游读取并释放锁——实测 3 秒恢复服务(原 120 秒);once/removeListener 防止 keep-alive 连接监听器泄漏。
🚀 新特性:免费模型暴力分散(spreadFreeModels,默认开)
控制台「负载均衡设置 → 免费模型分散到不同账号」:
- 请求轮转分散到不同账号(空闲槽位 → 在途少 → 轮询公平),不再钉死单个热 session;
- 单账号被占死不再拖垮全部请求,多账号并行吞吐更高(实测 4 个请求 → 4 个不同账号);
- 免费额度不心疼 admit,每个账号各持一个热 session,轮转到时复用;
- 关闭则恢复「最省额度」的热 session 优先调度。
📊 科研结论(README 已更新)
标准模式(35K 完整系统提示)+ 代理 spec 路由:we/let's 链出现(we=11)但被完整系统提示稀释为混合语域;官方 minimal 模式为纯链(we=44/let's=18)。客户端模式选择指引已写入 README:minimal=纯链 / standard+代理=完整能力+稳定性 / 自定义路由预设勿与代理路由同开。
🐳 镜像
ghcr.io/hengxin666/freebuff-proxy:1.5.2(latest 同步),升级:docker compose pull && docker compose up -d。
v1.5.0 极简路由(路由模式)
✨ 新特性:极简路由(路由模式)
控制台「总览 → 免费额度策略」新增「极简路由」开关与「路由风格」选择器,保存立即生效、持久化 /data/settings.json。
代理侧按 dsh-routing-suite(P1-P30 实测)的请求协议改写请求,解决"客户端注入的路由经翻译/反向代理链失效"的问题:
- persona 注入:任务自动分类 → spec(计划-集体)/ react(执行-个体)/ weak(内部路由),极简 persona 置顶,客户端 system 保留在后;
- 首轮核心工具面:首个
tool_calls前裁剪到核心集(spec 读优先 / react 写优先)+ shell;工具保证——不裁空、Freebuff 特殊签名工具end_turn始终保留(保住请求模型/额度); - weak 近距离引导:用户消息后追加固定引导(简单/复杂任务分级收敛);
- 路由风格钉死(
minimalRoutingMode:auto/spec/react/weak)。
🎯 目标模型:deepseek-v4-flash(V4 Fast)
we/let's 集体思维链按模型自适应锚定:
- v4-flash:远距锚定反噬 → 近距 user 注入 + 首 token We 自锚定(P14/P15),实测工具化多轮会话 we=4~6 / let's=3 / let me=0;
- v4-pro(对照):persona 远距锚定即生效(we=7~12)。
📊 Benchmark
README 新增「基准测试与验证」章节,含思维链实测数据表与测试归属:
- P1-P30 理论实验:dsh-routing-suite 作者 yjh051108(官方 API 实测);
- 本项目真实上游验证:freebuff-proxy 维护者用真实 Freebuff 账号、codebuff.com 上游实测;
- 合规/回归测试:
test/smoke.mjs(mock 上游自动化,覆盖 free-mode 门禁 + 路由改写不变量)。
🐳 镜像
ghcr.io/hengxin666/freebuff-proxy:1.5.0(latest 同步更新),升级:docker compose pull && docker compose up -d。
v1.4.1
v1.4.1 - 流量/会话切换不断流 + 并发上限可配
修复:切换流量/会话时不再掐断正在传输的 SSE(本次核心)
用户端「用着用着突然卡住、前端请求为 0、无在线连接」的根因:切换代理或 re-admit 会话时,
把正在传输的 SSE 流底下的 session 直接 DELETE 了——上游连接还在但 session 已消失,
客户端只能永久等待。本次修复:
- 会话临近过期切换平滑化:需要 re-admit 换新会话时,若旧会话正被在途流使用,
先等在途流结束后才释放重建(循环等待防竞态),绝不掐断健康连接; - 代理切换不断流:前端保存代理池/账号出口后立即生效(新请求走新出口),旧 runtime
的 session 在后台等在途 SSE 结束后再优雅释放; - 排队等锁期间切换不卡死:请求排队时若发生代理/账号切换,会自动检测到 runtime
已被顶替并无冷却重新选号(走新出口、新 session),不会撞上已失效的旧会话; - 新增 3 个回归测试覆盖上述场景(re-admit 不断流 / 代理切换不断流 / 排队切换重新选号)。
负载均衡增强
- 账号并发上限可配(控制台「负载均衡设置」,默认 1:1,范围 1..16,保存立即生效):
一个账号可同时转发多条 SSE 响应流;总览每账号显示「并发(在途/上限)」实时监控; - 前端「全部断开重连」(admin,
POST /api/system/reconnect):释放全部 session +
重置并发信号量,比重启更轻量,下个请求自动 re-admit; - 会话临近过期提前 re-admit(
session.re_admit_lead_sec,默认 60s),流 idle 超时按
会话剩余时间收敛。
其他
- README 顶部增加 Releases 发布页链接。
部署
git pull && docker compose pull && docker compose up -dv1.4.0
v1.4.0 - 幽灵连接治理 + 账号级串行化 + 前端一键重启
修复:幽灵连接(连接卡死不自动断开)
上游偶尔会出现"发了一半不再吐数据、也不断开连接"的卡死状态,导致该连接永远挂着并拖住后续请求。本次治理:
- 上游流式响应 body 增加 idle 超时(
limits.stream_idle_timeout_sec,默认 120 秒):只要超过该时长没有新数据块,立即取消上游读取并断开下游连接,让客户端感知截断后自行重试,不再有无限期挂起的幽灵连接。 - 控制面请求(session / agent-runs 等)的 body 读取同样带超时兜底,杜绝任何路径挂死。
- 断开后不误伤账号:session 本身正常的话,下一个请求仍可复用,不浪费免费额度。
负载均衡:一个账号一个并发
- 账号级串行化:一个账号同一时间只处理一个 chat(新增账号互斥锁),并发请求按热 session 排队复用,不再同时打在同一个
instanceId上(上游会话不稳定时并发容易互相干扰/顶号)。 - 选号在同层级内优先空闲账号;排队超过
limits.account_chat_wait_ms(默认 120000ms)兜底换号;预算耗尽时自动转入受 idle 超时约束的最终等待,不会误报失败。 - 冷启动原子化保持不变:多个并发请求同时到达仍只创建一个 session。
新增:前端一键「重启服务」(终极兜底)
- 控制台右上角管理员专属「重启服务」按钮(
POST /api/system/restart,仅 admin)。 - 服务端 spawn 自重启子进程等待端口释放后无缝接管并优雅退出;Docker 场景下容器主进程退出会触发
restart: unless-stopped整容器重建,双保险。 - 前端自动轮询
/healthz直到恢复;Web 登录态持久化在/data,重启后无需重新登录。 - 已实测:容器场景(Docker 自动恢复)与裸机场景(子进程接管 + 登录态保留)均验证通过。
其他
- 新增 smoke 回归测试:zero/partial 幽灵连接掐断、账号串行化并发峰值、重启 API 权限与回调。
部署
git pull && docker compose pull && docker compose up -d