Releases: fujunchao/zcode2api-plus
Release list
v2.9.2-go
v2.9.2-go
修正风控自动换代理来回选择近期失败线路的问题,并补齐逐次 HTTP 出站日志。
上游客户端版本保持 3.14.4;不修改账号 JSON 和数据库表结构。
账号近期失败线路避让
- 按账号避让最近 24 小时内触发消息风控的线路,匹配代理 ID 与 URL 摘要,最多保留最近 64 条。
- 在未被避让的启用线路中继续按“空闲优先 → 最少绑定”选择,不再出现刚离开 A 又因 A 空闲而选回 A。
- 候选耗尽保留当前绑定和冷却,不强行循环历史失败线路或回退直连。
- 历史存储于现有 SQLite meta,与改派原子提交;重启保留,过期和已删除账号记录在更新时清理。
- 保留并发旧快照保护、冷却阶梯、超限失效和请求级重放防护。其他账号及手工选线不受此避让限制。
出站证据与换线结果
- 新增
[attempt]:每次实际 HTTP 调用记录请求/票 ID、出站序号、选号序号、账号 ID、线路 ID/名称及脱敏端点。 - 分别记录开始、响应头状态或连接错误类别,换号与同账号重试均可追踪;原
[#]汇总格式不变。 risk-proxy补齐换线前后线路、请求关联、避让候选数及结果/跳过原因。- 区分正常代理、直连、强制直连、代理无效回退及注入客户端;不把未使用的代理记为风控失败线路。
- 新日志不输出代理认证、URL 路径/查询参数、Token 或请求正文。端点不是公网 IP 探测结果;收到 200 响应头不等于响应体完整成功。
升级
- 替换二进制或镜像并重启。历史从本版本运行后开始积累,不追溯导入旧日志。
- 不解除已失效账号,也不改变领取风控代理淘汰策略。
- 二进制覆盖 Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 镜像:
ghcr.io/fujunchao/zcode2api-plus:2.9.2-go与latest。
v2.9.1-go
v2.9.1-go
补齐服务器后台领取风控的代理淘汰策略。上游客户端版本仍为 3.14.4,无数据库迁移。
初始体验额度异常 + 领取风控
- 有效余额查询确认新账号无初始套餐及已分配额度,领取链路又明确风控时,自动删除
该次请求使用的命名代理,将全部关联账号按“空闲优先 → 最少绑定”改派。 - 同时覆盖后台入池自动领取、定时领取和手动领取。无启用候选时清除旧代理并回退直连。
- 区分真实风控、验证码失败、已经领取及名额耗尽;兼容 HTTP 200 内的 3012 业务风控。
- 已有套餐(含额度用尽)、成功使用/领取过的账号、查询失败或数据不完整时不触发删除。
- 有效额度证据绑定代理和凭据,锁内再次验证,防止迟到响应误删新线路;重启后重新采集证据。
- 保留领取冷却,不立即换线重领。自动领取首个风控后停止剩余套餐,批量后续账号改用新出口。
- 删除与全部账号改派作为单个事务提交,失败整体回滚。后台提示和日志显示删除及改派结果。
- 补位排除与问题线路相同 URL 的配置,避免换回同一个代理地址。
验证
- 本地 Go 全量测试、静态检查和构建通过,核心专项回归连续 20 轮通过。
- 前端 14 项测试和生产构建通过,内嵌产物已同步。
- 发布前通过 GitHub CI 验证 Linux 竞态检测、SDK 兼容及前端构建一致性。
升级与交付
- 替换二进制或镜像并重启生效;不依据历史日志追溯删除代理。
- CLI 独立登录领取流程不变;本策略作用于服务器后台的三类领取入口。
- 五平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 镜像:
ghcr.io/fujunchao/zcode2api-plus:2.9.1-go与latest。
v2.9.0-go
v2.9.0-go
新增风控自动更换代理及最少绑定账号分配策略。上游客户端版本保持 3.14.4,
不修改账号数据库结构或管理 API 字段;前端已重建并随二进制内嵌。
风控自动更换代理
- 消息请求命中现有
HTTP 405 + 风控文案判定后,为被拦截账号自动更换代理。 - 优先选择启用的空闲代理;无空闲代理时选择绑定账号数最少的其他代理。
- 排除原代理 ID 和相同 URL,没有替代代理时保留原绑定,不回退直连。
- 同步请求与异步任务共用处理逻辑;原本直连或使用手工代理的账号也可改派到命名代理。
- 保留原有风控冷却、连续命中升级失效、请求级判定与重放防护;换代理不立即重试原账号。
- 不删除原代理,也不改变原代理上其他账号的绑定。
- 比对本次请求快照与当前绑定,避免迟到响应重复换线或覆盖管理员的改派。
新账号最少绑定分配
- 普通新增、批量新增、导入、CLI 新号和后台自动登录预选采用统一策略:
空闲优先 → 绑定账号最少 → 无启用代理才直连。持久化失败仍按原接口回报直连兜底。 - 同负载按代理列表顺序选择,批量分配逐个更新绑定数,避免集中到单条代理。
- 绑定统计包括停用、冷却、失效和归档账号,手工 URL 不占用命名代理。
- 新增时显式选择代理、直连或手工 URL 的行为不变;重复入池不修改旧账号的代理。
- 后台提示区分“无空闲但可共享”和“无可用代理”,并修正归档账号绑定未计入空闲数的问题。
验证与升级
- 本地 Go 全量测试最终复跑通过;
go vet ./...、go build ./...通过。 - 并发分配、旧快照保护及同步/异步换线出站回归连续 20 轮通过。
- 4 个前端测试文件、共 12 项测试及生产构建通过。
- 补充事务失败整批回滚、持久化、无替代代理、请求级风控及新增入口回归。
- 发布标签前执行 GitHub CI,包括 Linux 全量竞态检测、SDK 兼容、前端产物一致性和容器构建。
- 替换程序或镜像并重启即可,无需数据库迁移;自动换代理默认启用。
- 五平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 多架构镜像:
ghcr.io/fujunchao/zcode2api-plus:2.9.0-go和latest。
v2.8.7-go
v2.8.7-go
修复项目审查第四部分的 5 项问题。上游客户端版本仍为 3.14.4,不修改账号数据库
JSON/schema;前端已重建并随二进制内嵌。
修复内容
Intel macOS 自动下载浏览器
- 将 darwin/amd64 正确映射为 darwin-x64,不再错误选择 Windows Chromium 版本。
- 下载链统一解析平台、版本和压缩包名称;未知平台明确报错。
- 补齐五平台回归,并核实公开 SHA256SUMS 中存在对应 macOS 包名。
CLI OAuth 重新登录
- CLI 与后台共用授权入库方法,同一身份重登会写入新 JWT 并清除旧鉴权失败状态。
- 原账号 ID、代理、设备指纹、历史用量及自定义名称保持不变。
- 先持久化再更新内存,失败时不提前替换凭据;后续操作使用最新快照。
设置草稿与刷新提示
- 设置页按分组保留草稿,保存其他分组或后台重新拉取数据不会清空未保存输入。
- 保存期间继续编辑时,迟到的成功响应只确认旧版本,不覆盖新草稿。
- 单账号额度刷新检查业务 ok 字段;HTTP 200 但业务失败时显示真实原因。
正确的请求统计
- 原生 Messages、Chat、Responses、Async 四个模型 POST 入口共用请求统计。
- 一次 HTTP 请求只计一次;内部重试单列,不能重复增加请求总数。
- 单独统计成功、失败、取消、在途、上游尝试及重试。
- 成功率为“成功数 / 已完成请求数”;无已完成请求时显示空值。
- SSE 错误、断流和票务超时不再因为 HTTP 200 被计为成功。
- 仪表板和 monitor/usage API 采用统一口径,历史账号用量仍独立保留。
指标与升级说明
- 新请求指标仅统计本次进程启动以来的四个模型接口请求,重启后清零。
不从旧 UseCount/FailCount 推测历史成功率,不影响账号持久化用量。 - 鉴权和参数校验失败计入请求失败;canceled 是 failed 的子集。
- retries 是同一个入站请求中再次尝试上游的次数,不包含客户端重新发出的新 HTTP 请求。
- 替换程序/镜像并重启即可,无需数据库迁移;沿用 v2.8.6-go 的单写者进程锁。
验证与交付
- 新增跨平台、重登入库、四协议请求统计及前端页面交互回归。
- 本地关键 Go 回归连续三轮、8 个前端交互用例、类型检查与生产构建通过。
- CI 新增前端测试与源码/dist 一致性检查;发版前检查 Linux 全量测试、race、
官方 SDK/Pi、前端和容器构建结果。 - 固定前端 HTML 模板及文本产物使用 LF,消除 Windows/Linux 重建的换行差异。
- 五平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 多架构镜像:
ghcr.io/fujunchao/zcode2api-plus:2.8.7-go和latest。
v2.8.6-go
v2.8.6-go
修复项目审查中已复现的 11 项问题,覆盖数据库并发访问、代理一致性、账号调度、
协议转换和停机收尾。上游客户端版本仍为 3.14.4,账号数据库 JSON/schema 不变。
修复内容
- 数据库单写者保护:服务与 CLI 入口使用操作系统独占锁,防止 CLI 删除的账号
被服务旧快照重新写回,以及设置修改后内存与数据库不一致。 - SOCKS4 巡检:复用实际业务的代理实现,不再把支持的 SOCKS4 线路误判为不支持。
- 选号短回避:目标模型筛选后再执行软回避,避免排除唯一支持目标模型的账号。
- 自动领取健康检查:取得槽位后重新检查账号快照,跳过停用、归档、失效及
未到期冷却;额度耗尽但健康的账号仍可领取。 - 额度刷新保留冷却:额度先归零再恢复不再提前解除冷却;真正的鉴权失败仍可
升级为失效。 - Responses 指令角色:输入中的 system/developer 归并到顶层 system,
保留 instructions 与指令顺序;未知角色不再静默降级。 - OAuth 显式直连:保留登录会话中的直连意图,禁止授权完成后自动换成代理;
已有账号明确选择直连时清除旧指派。 - 代理事务一致性:线路与关联账号变更先事务提交,再发布内存;数据库失败时
不再出现“返回失败但实际出口已改变”。 - Chat 初始内容:流式转换保留 content_block_start 的 text/thinking 初始值,
再追加后续增量,避免正常结束却丢失正文。 - 统一停机预算:后台额度、领取、巡检支持取消,异步票务生产者可取消并等待;
HTTP 与后台收尾共享 10 秒总预算。 - CLI 实时额度:刷新完成后重新读取快照,输出最新额度;失败单独提示。
升级与行为变化
- 替换程序/镜像并重启,无需迁移数据库。
- 服务运行期间,访问同一账号库的 CLI 数据命令会明确拒绝执行;请使用管理后台,
或先停止服务再运行 CLI。先停止旧版本再升级,旧程序不会遵守新增的锁协议。 - 数据库旁的
accounts.db.lock是正常锁文件;文件存在不代表锁被占用。
正常或异常退出后操作系统会释放锁,不需要删除文件。 - 入池自动领取忙时跳过、async 默认 300 秒票务寿命、正常模型 SSE 无总时限等
已有契约保持不变。 - 10 秒为停机总预算;超出剩余预算时记录清理未完成并退出,不无限等待外部组件。
验证
- 新增 18 个顶层回归用例及 1 个子进程辅助入口,覆盖全部 11 项修复。
- 本地关键回归连续运行 3 轮通过;构建、静态检查和五平台交叉编译通过。
- Windows 本地全量测试首轮通过,后续存在既有临时目录清理不稳定;
原始提交对照同样能复现,未将它作为本次修复新增问题。 - 发布标签前检查 Linux CI 全量测试、竞态检测、官方 SDK/Pi 兼容回归、
交叉编译和容器构建结果。
发布产物
- 二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 镜像:
ghcr.io/fujunchao/zcode2api-plus:2.8.6-go和latest,
支持 Linux amd64/arm64。
v2.8.5-go
v2.8.5-go
适配 ZCode 3.14.4 的「关闭模型请求验证码校验」更新。修复上游已经允许模型免验证码时,
网关仍因求解器不可用而在本地返回 503 captcha_required 的问题。
修复内容
- 识别官方配置
captcha.skip_model_request。明确为true时,同步/v1/messages、
异步票务以及 OpenAI Chat/Responses 兼容入口均跳过模型验证码,不再依赖浏览器或人工回填。 - 模型策略判断先于人工 token 缓存,避免跳过后仍发送旧验证码;下游传入的验证码头仍被过滤。
- 套餐领取保留验证码,包括人工回填及
3007后换码重试;模型跳过不会清空领取所需的共享人工缓存。 - 将 JWT 请求形态与验证码需求分离,保留原有鉴权、system 注入、设备 metadata、会话归因及风控处理。
- 保留并发、限流、过载和真实验证码挑战的有界重试,不将验证码挑战误判为账号鉴权失败。
- 默认上游客户端版本及环境示例由旧版本同步至 3.14.4。
升级说明
- 替换网关二进制或容器镜像并重启即可,无需数据库迁移。
- 若部署显式覆盖
ZCODE_CLIENT_VERSION/UPSTREAM_USER_AGENT,同步更新为 3.14.4 / ZCode/3.14.4,或移除覆盖值使用默认值。 - 自动领取仍需浏览器求解或人工验证码,不要为了跳过模型验证码关闭整个浏览器池。
- 上游策略沿用默认 10 分钟配置缓存;字段为 false、缺失、配置获取失败时保留原验证要求。
- 本版不修改独立的 zcode-switch 工程,不代表上游关闭了鉴权、限流或其他风控。
回归验证
- 新增 12 个顶层回归测试,覆盖配置解析与失败回退、缓存及策略刷新、同步/异步请求、
领取验证、流式响应、重试,以及 OpenAI Chat/Responses 的 JSON/SSE 两种模式。 - 新增场景连续运行三轮通过;本地
go test ./... -count=1、go vet ./...、go build ./...通过。 - 发布标签前由 GitHub Actions 执行 Linux 全量测试、竞态检测、SDK 兼容性、交叉编译及容器构建检查。
- 测试使用本地模拟上游,不涉及真实账号模型请求或实际领取操作。
发布产物
- 跨平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 多架构镜像:
ghcr.io/fujunchao/zcode2api-plus:2.8.5-go和latest,支持 Linux amd64/arm64。
v2.8.4-go
v2.8.4-go
修复工具链安全漏洞、socks5 鉴权线路、上游错误事件误判断流、以及风控/冷却被启停与
迟到成功绕过的四项问题。上游客户端版本仍为 3.14.3,不改变账号数据库的 JSON 字段
契约,也无需迁移配置。
修复内容
构建工具链升级到 Go 1.25.14
- 此前
go.mod声明go 1.25.0,CI 据此精确安装,发版二进制均由 go1.25.0 编译。
govulncheck二进制模式实测:可达 29 个已修复的标准库漏洞(net/http、
crypto/tls、crypto/x509、net/url等);go1.25.14 构建后为零。 - 直接提升
go指令而非新增toolchain行:CI 的setup-go@v5只读取go行。 - 本地开发需要 Go ≥ 1.25.14;较旧的 Go 会按默认的
GOTOOLCHAIN=auto自动下载。
带用户名密码的 socks5 / socks5h 线路恢复可用
- 方法协商误发
05 02 01 00(GSSAPI + 无鉴权),漏报用户名/密码方法 0x02,
要求鉴权的代理一律回 0xFF 拒绝;网关、async、额度、领取、OAuth 全部出不去。 - 线路巡检走标准库的 SOCKS 实现(会正确协商),所以巡检显示可用、真实流量失败。
- 现按 RFC 1928/1929 发送
05 02 02 00;新增按规范校验方法与凭据的假代理回归测试。
上游错误事件不再被算作线路断流
- 上游在 SSE 中正常发出的
error事件(如overloaded_error)说明线路已把整条流
完整送达,不再累计账号断流、写入回避期或推高线路连击——此前连续 3 次即会移除一条
健康线路。v2.8.2 起原生/v1/messages也受此影响,OpenAI 两个端点则更早就有。 - 客户端仍收到明确的失败:原生接口原样透传上游
error事件(不再重复追加一条
「流式响应中断」),OpenAI 端点照常报upstream_stream_error,async 票务以 error 终止。 - 真正的断流(缺少
message_stop、连接中断、非法事件)判定与记账不变。
停用/启用与迟到成功不再解除风控和冷却
- 启停不再改写失效:停用 invalid 账号只关闭
enabled,状态保持 invalid,再启用也
不会复活(此前停用→启用即把风控失效一键解除)。归档走同一转移。 - 冷却截止时间在启停中保留:启用时冷却未到期则回到 cooling,而非 active。
- 迟到的成功不再冲掉冷却:请求在冷却生效前选中账号、冷却期间才返回 200 时,只累计
调用次数,不复位状态、不清零风控/限流/503 连击;冷却到期后的成功照常归零。
失效账号上的成功同样不改写状态与连击。 - 额度刷新与后台启停按钮改按
enabled判断是否停用:已停用的失效账号不再被轮询,
后台按钮也能正确显示「恢復」。
后台前端产物补齐
- v2.8.3 修改了账号页的新增提示(「已存在(未更動)」)但未重建内嵌的前端产物,
该提示实际未生效;本版随启停按钮修改一并重建。
回归验证
- 新增回归测试:socks5 用户名/密码协商;原生、async、Chat、Responses 四条路径下
上游 error 事件不计断流(并保留「缺少结束事件」仍计断流的对照);单账号/批量/归档
三个入口的启停往返;迟到成功保留冷却与失效;已停用失效账号不参与额度刷新。 - 本地构建、
go vet、全量 Go 测试(Go 1.25.14)及前端类型检查通过。 - 发布前由 GitHub Actions 补充 Linux 全量测试、竞态检测及客户端 SDK 兼容性检查。
发布产物
- 跨平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 多架构镜像:
ghcr.io/fujunchao/zcode2api-plus:2.8.4-go和latest,支持 Linux amd64/arm64。
v2.8.3-go
v2.8.3-go
修复账号入池与管理操作的四项一致性问题。上游客户端版本仍为 3.14.3,不改变账号
数据库的 JSON 字段契约,也无需迁移配置。
修复内容
重新登录会换上新登录令牌
- OAuth 重新登录命中已有账号时写入本次授权的新 JWT,不再保留旧令牌。
- 同时清除旧的失效状态、错误归类和风控连续计数,真实状态由随后的额度刷新判定。
批量新增按同批次判重
- 同一批次内相同凭据、相同用户身份或相同邮箱只创建一个账号,不再虚增池容量。
- 身份派生规则(JWT 用户 ID、邮箱)在普通新增、批量新增和授权入池三处统一。
- 整批回滚时,指向同批新账号的重复项一并标为失败,不返回不存在的 ID。
重复添加不再改动已有账号
- 添加已有凭据只返回原账号 ID,不重新分配线路、不重新刷新额度或自动领取。
- 响应新增
created、duplicated字段区分真正新建与重复;count/ids保持原口径。 - 后台提示同步显示已存在且未更动的数量。
设置更新改为原子操作
- 先校验整份请求,再单事务提交全部字段;任一字段非法时不写入任何设置。
- 数据库中途失败时数据库与内存均保持原值,不会出现“返回失败但后台密码已改”。
回归验证
- 新增回归测试覆盖同批判重、重复添加零副作用、混合添加只指派新账号、重登换令牌和设置原子性。
- 本地构建、
go vet、全量 Go 测试及前端类型检查通过。 - 发布前由 GitHub Actions 补充 Linux 全量测试、竞态检测及客户端 SDK 兼容性检查。
发布产物
- 跨平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 多架构镜像:
ghcr.io/fujunchao/zcode2api-plus:2.8.3-go和latest,支持 Linux amd64/arm64。
v2.8.2-go
v2.8.2-go
修复响应完整性、风控失效状态保留和优雅停机的四项问题。上游客户端版本仍为
3.14.3,不改变账号数据库的 JSON 字段契约,也无需迁移配置。
修复内容
长 JSON 响应不再被静默截断
- 正常非流式 JSON 使用独立的 16 MiB 内存预算,不再误用错误体的 64 KiB 上限。
- 超出预算明确返回 HTTP 502
upstream_response_too_large,不返回损坏的 HTTP 200 正文。 /v1/messages、/v1/chat/completions、/v1/responses共用修复;SSE 总大小不受该限制。
SSE 提前结束不再误报成功
- 同步与异步路径共用消息结束检查:正常 EOF 但缺少
message_stop也属于断流。 - 原生接口通过 SSE
error事件报告截断;异步票务不再误发done,已交付内容后不换号重发。 - 断流会累计线路计数,不再误清零连续断流记录。已经收到的完整终值用量仍正常入账。
- 兼容显式事件名、JSON
type、跨网络块、多行事件以及无尾部换行的完整结束事件。
额度刷新不再意外解除风控失效
- 统一在额度回写边界保留风控失效状态及原始错误证据。
- 覆盖查询失败、405 幂等、空额度和额度耗尽,避免下一次查询成功时误将账号恢复为可用。
- 检查时间和额度快照仍可更新;重开数据库后保护仍有效,不依赖运行期计数。
- 非风控原因的失效恢复逻辑不变。
优雅停机等待在途请求收尾
- 收到退出信号后等待
Shutdown完成,再释放数据库和验证码池等依赖。 - 保持 10 秒等待预算;超时主动关闭剩余连接,取消在途请求。
- 监听失败直接返回,不遗留等待退出信号的协程。
回归验证
- 新增 11 组回归测试,覆盖长响应、消息终态、持久化风控状态和真实 HTTP 停机时序。
- 本地构建、静态检查和串行全量 Go 测试通过;流式、风控及停机核心回归连续运行 10 轮通过。
- 发布前由 GitHub Actions 补充 Linux 全量测试、竞态检测及客户端 SDK 兼容性检查。
发布产物
- 跨平台二进制:Linux amd64/arm64、macOS amd64/arm64、Windows amd64。
- 多架构镜像:
ghcr.io/fujunchao/zcode2api-plus:2.8.2-go和latest,支持 Linux amd64/arm64。
v2.8.1-go
v2.8.1-go
补齐 v2.8.0 批量管理的前端 UI:帳號池頁面表格支持多選與批量啟用/停用/刪除,
打通 v2.8.0 已上線的 /accounts/batch/* 端點。基線上游 2.0.7 不變;偽裝客戶端
版本仍為 3.14.3。
帳號池頁面:批量操作
- 多選列:表格首列新增勾選框;表頭提供全選(三態:全選/半選/未選),
作用範圍是當前篩選結果——切換狀態或錯誤類型篩選時清空勾選,避免殘留
不可見的選中集。 - 批量操作欄:勾選任意帳號後在篩選行下方浮現,顯示已選數量,提供:
- 批量啟用/批量停用:可逆操作,直接執行;轉移語義與單帳號端點一致
(停用 → disabled;啟用僅把 disabled 回 active,不越權改寫 invalid/歸檔); - 批量刪除:危險操作,二次確認後執行。
- 批量啟用/批量停用:可逆操作,直接執行;轉移語義與單帳號端點一致
- 結果回饋:逐條明細合併為一條 toast 摘要(成功/重複/缺失/失敗計數);
有失敗項時逐條提示原因(最多 3 條,防刷屏)。 - 輪詢競態容忍:批量請求攜帶
missing_ok=true——勾選與提交之間帳號若被
並行操作刪除,按「缺失」計入明細而不是讓整批 400。 - 操作完成後自動清空勾選並刷新列表(5 秒輪詢不變)。
佈局
新增多選列(32px)的淨增量由未定寬的「賬號」列吸收;實測(量測腳本)表格
總寬仍與卡片等寬,無橫向滾動、無右側裁切。
相容性
- 後端零改動:本版只含前端(
frontend/src+ 重建的frontend/dist); - 單帳號行內操作(重新整理/領取/停用/歸檔/編輯/刪除)行為不變。
上線驗證
- 帳號池頁面勾選若干帳號 → 批量操作欄出現;批量停用後選中帳號變為「停用」;
- 批量啟用後停用帳號回到 active(invalid/cooling/exhausted 不被改寫);
- 批量刪除出現確認對話框,確認後 toast 回報成功/缺失計數;
- 切換篩選(如「用完」→「全部」)後勾選自動清空,批量操作欄消失。