[!WARNING]
v1.0.5-preview.4 为预览版本,新增 Token 路由策略存储、API Key 路由编辑、OpenAI Alpha Search 中继和健康检查端点,并继续收紧支付回调、Midjourney 异步账务、渠道更新、日志持久化、认证会话和上游 HTTP 边界。升级前请确认生产环境会执行项目 AutoMigrate、重新构建管理端资源,并在测试环境验证自动路线、手工分组顺序、跨分组重试、旧 Token 兼容、Alpha Search 渠道与价格配置、支付金额与币种、Midjourney 提交/失败/回调、渠道多密钥更新以及代理和响应头策略。新版本会在 tokens 表增加 routing_policy 文本字段,创建 midjourney_billing_claims 账务归属表和 auth_flows 一次性认证流程表;既有 Token 不要求立即回填。

TRUSTED_PROXIES、定价 JSON、视频 data URL、OAuth discovery 抓取和上游响应头转发均增加更严格的失败关闭规则。依赖全网可信代理、环境代理访问私网 discovery、超大定价配置、非视频 data URL,或直接透传上游 Set-Cookie / hop-by-hop header 的部署需要在升级前调整配置与集成。

在这里插入图片描述

Release Notes

GitHub 地址

https://github.com/MAX-API-Next/MAX-API/releases/tag/v1.0.5-preview.4

Highlights

  • Token 路由从单一分组投影升级为可持久化策略:每个 Token 可以选择系统定义的自动路线,或配置最多 8 个有序手工分组,并独立控制失败后的跨分组重试。
  • 认证、渠道选择和模型目录使用同一份路由计划:请求进入运行时后,路由策略会被规范化为有序分组计划,普通中继、Affinity 选择、重试和 /v1/models 返回不再各自推导分组。
  • 管理端 API Key 支持可视化路由编辑:可以查看自动路线包含的分组、切换到手工模式,通过拖拽、方向键或按钮调整分组顺序,并配置跨分组重试;已有但当前不可供新选择的路由会被标记并保留。
功能示例(由参与内测平台提供)

在这里插入图片描述

  • 渠道更新改为显式字段补丁:更新接口只接受允许修改的配置字段,省略字段会保留原值,余额、累计用量、测试时间和内部多密钥状态等运行时数据不能再通过普通渠道编辑请求覆盖。
  • 旧 Token 不需要迁移即可继续工作:旧的 groupcross_group_retry 字段仍作为兼容投影,未携带新路由字段的旧客户端仍可创建和更新 Token。
  • 多分组模型目录与实际选组保持一致:手工路由下来自所有有序分组的可用模型都会返回,并按模型名去重,同时保留优先 owner 信息。
  • 随机选择与安全令牌统一使用系统安全随机源:OAuth state、通用随机 key、渠道权重选择、多密钥随机选择、签到随机奖励和模型同步退避抖动不再依赖 math/rand
  • 支付回调以订单真值为准:Stripe、Creem、易支付、Waffo 和 Waffo Pancake 的充值/订阅完成路径会在入账前核对支付渠道和金额,并在供应商提供币种时校验币种;不匹配回调不会把订单标记成功或增加额度。
  • Midjourney 接入持久化异步账务归属:上游任务 ID 按渠道绑定到唯一的本地账务任务,提交重放、重复 provider ID、明确失败退款、未知提交结果和回调/轮询竞争统一进入 CAS 与持久结算流程。
  • 日志和上游 HTTP 边界统一收口:持久日志会清理控制字符、无效 UTF-8 并限制总长度;任务错误不再暴露任意原始上游响应,响应头转发会过滤 cookie、hop-by-hop、畸形值及 Connection 动态声明的字段。
  • 认证与敏感设置使用服务端当前状态:被禁用、删除或降权的用户不能继续依赖旧会话或 Token owner 状态访问;Webhook、Gotify 等通知凭据不会再通过当前用户接口回显,更新时省略凭据会安全保留原值。
  • OpenAI Alpha Search 成为独立中继能力:新增 POST /v1/alpha/search,支持 Codex 原生路径和 Advanced Custom 直通路线,统一纳入渠道选择、模型映射、Param Override、请求体保留和 Web Search 计费。
  • 健康检查面向编排系统补齐:新增 /health/health/live/health/ready,readiness 会执行数据库探测,失败时返回 503 和通用错误消息,便于 Kubernetes/负载均衡探针接入。

New Features

  • 新增版本为 1 的 Token 路由策略对象,支持 smartmanual 两种模式、自动路线 key、手工分组数组及 retry_on_failure 配置。
  • Token 管理接口现在返回 routingrouting_legacy 信息;分组接口同时返回可供当前用户选择的 auto_routes,前端可以显示系统定义的路线名称和分组链。
  • API Key 管理抽屉新增路由编辑器,支持六种前端语言的路由说明、可用性提示、手工分组搜索、顺序调整、键盘移动和数量上限反馈。
  • 新增 openai-alpha-search endpoint 类型、RelayModeAlphaSearchAlphaSearchRequest DTO;请求解析会保留原始 JSON,模型映射后仍把未知字段转发给上游,避免新参数在网关层丢失。
  • /v1/alpha/search 已接入 Relay 路由和渠道测试流程:Codex 渠道走 /backend-api/codex/alpha/search,Advanced Custom 只在配置了同名 incoming route 且 converter 为 none 时参与选择。
  • 模型详情页新增 Responses Compact 与 Alpha Search 的 curl、Python、TypeScript、JavaScript 调用样例;JS/TS 样例会先检查 response.ok,避免错误响应被当作成功 JSON 展示。
  • 新增公开健康检查端点 /health/health/live/health/ready,readiness 检查复用数据库连接探测并保持错误消息脱敏。

Improvements

  • 路由策略保存前会统一校验版本、模式、自动路线可选择性、手工分组权限、分组倍率、重复项和最大数量;不合法策略在进入中继前会失败关闭。
  • 运行时路由计划会按配置顺序选择分组,并在允许跨分组重试时推进到下一分组;重试参数会排除已经失败的渠道,避免同一请求重复命中已知失败渠道。
  • Affinity 渠道命中时会按路线顺序查找首个可使用该渠道和模型的分组,并从实际匹配位置初始化后续重试状态;/pg/chat/completions 中显式指定的分组仍优先于 Token 的存储策略。
  • 已保存但后来不可用的手工分组会在运行时跳过;如果策略中已经没有任何可用分组,请求会明确拒绝,而不是随机落入用户默认分组。
  • 新建和更新 Token 会同时维护新策略与旧 group/cross_group_retry 投影;更新时省略路由字段会保留原有策略,单独提交 cross_group_retry: false 也会作为明确变更生效。
  • API Key 编辑抽屉会等待分组数据加载完成后再初始化表单,并忽略抽屉关闭、目标切换或旧请求晚到后的过期响应;加载失败统一进入现有错误提示路径,后台刷新分组数据不会再清空编辑中的内容。
  • 手工分组选择器收敛为单个全宽、带可访问名称和展开状态的 combobox;已选分组在触发器内统一展示,删除、排序和不可用状态在独立列表中处理,并补充 React Testing Library 交互回归。
  • 多分组模型去重改为集合索引,避免模型数量增加时反复线性扫描;渠道写入则通过 UpdateFields 只持久化本次实际变更的配置和多密钥字段。
  • OAuth state、渠道权重选择、多密钥随机选择、签到奖励和同步退避抖动改用 crypto/rand;底层随机源失败时,安全敏感路径返回错误或采取明确降级,不再继续使用可预测伪随机结果。
  • 支付完成逻辑新增统一 PaymentValidation,金额按最小货币单位精确比较,币种大小写归一化;订单状态迁移、额度增加、订阅激活和缓存失效保持在对应数据库事务或持久失效任务中。
  • Midjourney 提交、轮询和通知回调共享账务任务更新服务;明确拒绝会原子写入失败状态与退款意图,未知是否已发送的请求保留为人工复核,重复任务归属不会再次扣费或误退首个请求。
  • 用户邀请奖励与新用户创建改为同一事务提交,管理员额度覆盖和批量 Token 删除也会在业务事务中登记持久缓存失效,避免数据库成功后缓存或奖励状态脱节。
  • 渠道更新现在持有与轮询一致的渠道锁,并在单个事务内提交字段变化和能力索引;能力重建失败会回滚渠道配置,多密钥数量、禁用时间和禁用原因会随密钥增删同步裁剪。
  • 持久日志内容统一限制为 4096 个字符并规范化控制字符;异步任务失败原因、结算 effect payload、消费日志和审计日志复用同一清理路径。历史日志清理继续保留管理审计日志,并同步分批清理过期账单 receipt。
  • 上游响应头复制收敛为共享 helper,音频、MiniMax TTS、视频代理和普通中继采用同一过滤规则;本地 request ID 不会被上游覆盖,上游 request ID 只在通过安全校验后记录到请求上下文。
  • 自定义 OAuth discovery 使用项目 SSRF 防护和受保护拨号器;开启 SSRF 防护时直接连接已验证目标,不再让环境代理绕过 DNS/IP 绑定校验。
  • 内存限流器和系统监控支持有界停止,服务关闭时会等待后台 goroutine 退出;SMTP 连接/操作增加 30 秒截止时间,Turnstile 校验增加 10 秒请求超时和 HTTP 状态检查。
  • 渠道 Affinity 正则缓存改为容量 4096 的 LRU;计费表达式拒绝 NaN / Infinity,结算表达式失败时使用冻结的预扣值与分组后估算值中较高者并记录可观测错误。
  • 模型倍率与 completion ratio 保存前会规范化模型别名并拒绝冲突键;所有定价映射增加大小、条目数、键长度、空键、空值和非有限数检查,加载失败不会替换正在使用的映射。
  • 管理端代码高亮结果会在写入 innerHTML 前再次净化;图表 ID、CSS 变量名和颜色值会过滤样式逃逸、URL、@import 和可执行表达式,降低服务端配置或动态内容触发 XSS/CSS 注入的风险。
  • OAuth state 改为 32 字节安全随机的一次性流程凭据,只在数据库保存 HMAC,并绑定 provider、login/bind 用途和绑定用户;并发回调只能有一个成功消费,过期记录由后台任务定期清理。
  • OIDC 和 Generic OAuth 的 token/userinfo 请求复用项目 SSRF 防护、DNS/dial 与 redirect 校验,并增加请求超时;调试日志不再记录授权码片段、endpoint、token/userinfo 正文或用户 PII。
  • access token 重生成和邀请额度转移在原 IP 限流之外增加用户维度敏感操作限流,同一账号切换来源 IP 也不能绕过低频限制。
  • Alpha Search 渠道选择按请求路径做显式过滤:普通 OpenAI 渠道不会误接 /v1/alpha/search,Codex 和匹配 incoming route 的 Advanced Custom 才会进入直连与缓存选择路径。
  • Alpha Search 预消费在普通模型估算外追加确定性的单次 Web Search 附加费用,并校验基础 quota、分组倍率和工具价格的有限非负约束;只有上游成功返回后才记录工具用量,失败请求走既有退款路径。
  • Dashboard 账单展示在金额换算前校验 QuotaPerUnit 与 CNY USDExchangeRate,查价失败对外统一返回 billing information unavailable,原始错误仅写入服务端日志。
  • 删除用户现在在同一事务中清理 OAuth 绑定、取消 active 订阅、失效用户 access token,并按软删除/硬删除分别禁用或移除 API Token,同时登记持久缓存失效。
  • 安全随机 helper 不再因可恢复的熵源读取错误触发 panic;access token、邀请码、邮件 Message-ID、充值/订阅订单号和系统任务 runner ID 会显式失败或使用不承载安全语义的唯一性降级。渠道加权选择会传播随机源错误,并修正零基随机区间对首个渠道的额外偏置。
  • Relay JSON 热路径继续迁移到 common.Marshal / common.Unmarshal / common.DecodeJson,覆盖 DTO value、OpenAI message、Ali、Baidu、Coze、SiliconFlow、Vertex 和 Zhipu;JSON policy allowlist 从 158 条收敛到 121 条。
  • Ali、Baidu、Coze 和 SiliconFlow 的可选 provider 参数改为指针字段,缺省值继续省略,客户端显式提交的 0、空字符串或 false 会保留到上游 payload。

Bug Fixes

  • 修复手工多分组 Token 的 /v1/models 只读取第一个 owner group,导致后续分组独有模型不出现在模型目录的问题。
  • 修复已有运行时专用自动路线无法在 API Key 编辑器中保存其他基础字段的问题;未改变路由时现在保留原值,真正修改路由时才要求选择可用路线。
  • 修复路由计划选择过程中没有可用 priority 时的边界处理,避免空候选集合进入负索引或错误选择路径。
  • 修复 Playground 显式 group 与 Token 路由计划同时存在时的优先级问题;显式请求分组不会再被保存的 Token 计划覆盖。
  • 修复仅更新 cross_group_retry 时请求被当作“未修改路由”的问题,特别是显式关闭重试的 false 值现在不会被零值语义吞掉。
  • 修复 Affinity 渠道只在路线首组检查、导致本可用于后续分组的固定渠道被错误放弃,以及重试索引从错误位置开始的问题。
  • 修复旧 Token 的空分组在缺少用户分组上下文时生成空手工策略的问题;现在优先使用认证用户分组,否则回退到系统默认自动路线。异常类型或空指针形式的上下文策略也会继续按 legacy 路径处理。
  • 修复旧 Token group 为空时 API Key 表单保留空手工分组并阻止保存的问题;表单会使用当前可用默认分组,同时限制默认列表不超过 8 项。
  • 修复 API Key 编辑期间分组查询完成或重新获取后重置用户输入、并发详情请求晚到覆盖新目标,以及详情加载失败产生未处理 Promise 的问题。
  • 修复手工路由最大选择状态下触发器被拆成多个交互区域、删除按钮混入 combobox,以及长路由标签无法正确截断的问题;相关测试改为按角色、可访问名称和真实删除行为断言。
  • 修复渠道更新接口直接绑定完整 Channel 模型造成的批量赋值风险;伪造的余额、用量、创建/测试时间、内部状态和 channel_info 不再写入数据库。
  • 修复只更新渠道状态时其他配置可能被零值清空、未知状态值可以进入持久层,以及多密钥管理操作写回无关字段的问题。
  • 修复充值与订阅回调只验签、不核对订单金额或币种的问题;低金额、超额、错误币种、错误支付 provider 和非正额度会在订单完成前失败,易支付的订单完成与用户入账也改为原子事务。
  • 修复 Creem 回调重复写入相同客户邮箱、Waffo Pancake 创建 checkout 失败后订单状态处理不一致,以及订阅完成重放可能重复产生副作用的问题。
  • 修复 /api/user/self 回显 Webhook secret、Gotify token 等通知凭据,以及编辑设置时因前端收到脱敏值而清空已有凭据的问题;通知邮箱现在使用标准地址解析校验。
  • 修复旧会话中的管理员角色、用户状态或 Token owner 状态与数据库不一致时仍可继续授权的问题;除 enabled 外的用户状态统一拒绝,已删除 Token owner 返回明确禁止响应。
  • 修复邀请注册中受邀者和邀请人奖励分步提交、任一步失败后可能只完成一侧的问题;奖励、邀请计数、新用户额度和缓存失效现在随用户创建一起提交或回滚。
  • 修复渠道更新和后台轮询并发写多密钥状态、能力索引重建失败后配置已提交,以及清空最后一个密钥时旧多密钥元数据残留的问题。
  • 修复 Midjourney 同一 provider task ID 被重复提交时可能重复扣费或错误退款、跨渠道同名任务被错误认领,以及通知回调无法完成本地 shadow task 的问题。
  • 修复 Midjourney/视频/Suno 轮询因临时获取渠道缓存失败就把已计费任务标记失败并触发退款的问题;临时基础设施错误现在保留任务状态等待后续轮询。
  • 修复异步任务明确提交失败时任务状态与退款操作分开写入、进程中断可能遗留已扣额度的问题;失败状态、展示 quota 和持久退款意图现在原子提交。
  • 修复任务失败原因、无结构上游错误体和调试日志可能持久化敏感 URL、IP、密钥、控制字符或超长正文的问题;对外错误只保留可解析的安全消息,原始读取上限为 1 MiB。
  • 修复上游 Set-CookieTransfer-Encoding、CR/LF 注入值和 Connection 声明的临时 header 被转发,以及被动态声明的 request ID 仍被错误捕获的问题。
  • 修复 OAuth discovery 管理接口可直接访问私网/本机地址、且受保护请求可能经环境代理在代理侧重新解析目标的问题。
  • 修复视频代理接受任意 MIME 的 data URL 和无限制解码的问题;现在仅接受 MP4、WebM、QuickTime、Matroska,解码后最大 100 MiB,并复用安全响应头复制。
  • 修复未配置价格的 mj_*suno_*swap_face 任务模型继续使用隐式兜底价格的问题;只有明确模型价格、默认价格或 rate card 可用时才允许继续计费。
  • 修复智谱流式读取 panic、scanner 错误或客户端取消后仍可能伪装成正常 [DONE] 的问题;Gemini 图片响应超过 OpenAI 兼容上限时也会明确拒绝。
  • 修复前端代码高亮 HTML 和图表动态 CSS 可越过标签/样式边界的问题,恶意事件属性、脚本、外链 URL 和样式注入不再进入最终 DOM。
  • 修复 HTTP/2 transport 重放请求时 GetBody 复用同一个可变 seeker、并发 retry 可能共享 cursor 或发送错误内容的问题;内存和磁盘 body 现在都会为每次重放创建独立 reader。
  • 修复 Ali 渠道在客户端省略 top_p 时仍注入最小值的问题;缺省值保持不发送,仅对显式越界值按 Ali 范围钳制。
  • 修复 Compatible、Responses 和 Claude 的 PassThrough 原始 JSON 绕过渠道字段权限、默认可透传 service_tierspeed 等可能增加成本字段的问题;只有渠道显式允许的受控字段才会保留。
  • 修复 Zhipu 和 Vertex token 缓存出现非预期值类型时直接断言导致 relay panic 的问题;无效缓存会被清理并重新获取。Zhipu 密钥格式错误现在直接返回失败,且日志不再包含密钥原文;Vertex 的畸形 PEM 会稳定返回解析错误。
  • 修复 GetRandomIntGetRandomString 和 CPU profile 监控在随机源、CPU 采样、目录或文件错误时终止进程的问题;GenerateRandomKey 改用可返回读取错误的 reader 路径,避免 Go 新版本 crypto/rand.Read 的不可恢复 fatal 行为。
  • 修复 SiliconFlow 图片参数、Coze stream/历史保存、Baidu 搜索/引用开关及 Ali provider 参数的显式零值被 omitempty 丢弃;相关请求现在区分“未提交”和“明确提交零/false”。
  • 修复 2FA 统计和备用码查询在 SQL 字符串中硬编码布尔字面量的问题,统一改为 GORM 绑定参数,保持 SQLite、MySQL 和 PostgreSQL 方言兼容。
  • 修复 Alpha Search 未作为独立 endpoint/relay mode 进入路由、渠道测试和模型详情样例的问题;现在 Codex 与 Advanced Custom 路径可被正确识别,普通 OpenAI 渠道不会错误承接。
  • 修复 Alpha Search 请求体重建可能丢失未来字段的问题;原始 JSON 会在模型替换后保留未知字段,避免前端或上游新增参数被中继层静默裁剪。
  • 修复 Alpha Search 写回客户端前未完成成功结算的风险;当前路径会在复制响应体前记录 Web Search 用量并结算,写响应失败不会把已成功的上游调用当成未计费请求。
  • 修复 Alpha Search 前端 JS/TS 样例先解析 JSON、后检查 HTTP 状态的误导;错误响应现在会先触发状态检查。
  • 修复 Midjourney plus action custom_id 对空分片、缺失索引、非正索引和未知 *_variation 后缀处理不完整的问题,避免 malformed custom ID 导致 panic 或被错误转换为合法动作。
  • 修复软删除用户后 OAuth 绑定、access token、已启用 API Token 与 active 订阅仍可残留的问题;硬删除用户现在同时移除 Token 并取消订阅,已取消订阅记录保留历史状态。
  • 修复软删除路径试图更新 Token 表不存在的 updated_at 字段而导致清理失败的问题。
  • 修复账单展示在 QuotaPerUnit0、负数、NaNInfinity 或 CNY 汇率无效时可能除零/产生非有限金额的问题;token 展示和 unlimited token 路径保持兼容。
  • 修复账单查价错误把内部模型或配置失败细节暴露给客户端的问题;对外错误消息统一,便于监控和客户端稳定处理。

Compatibility Notes

  • tokens 表新增 routing_policy 文本字段,由 GORM AutoMigrate 创建,SQLite、MySQL 和 PostgreSQL 均使用通用文本类型。升级前请确认数据库账号具备迁移权限,并在副本上先演练启动迁移。
  • 既有 Token 的空 routing_policy 会根据原 group、用户分组和 cross_group_retry 在运行时合成兼容策略;不会自动把历史 Token 批量改写为新 JSON。旧字段仍保存首个投影分组和重试开关,供旧客户端继续使用。
  • 新 API 客户端应优先发送 routing。只发送旧 group 时仍按兼容路径处理;更新请求省略 routinggroup 时会保留当前存储策略。显式提交新策略时,自动路线必须是当前用户可选择的路线,手工模式只能使用真实可用分组,最多 8 个且不能重复。
  • cross_group_retry 现在按可选布尔值处理:省略表示保持现状,显式 false 表示关闭重试。自定义客户端不应再依赖布尔零值等同于“未提交”的旧行为。
  • 管理端允许展示并保留已经存储、但当前不再出现在新选择列表中的路由。若用户实际切换路由或编辑手工分组,应先移除不可用项,后端不会接受新的不可用策略。
  • /api/group 响应新增 auto_routes 字段;自定义客户端应忽略未知响应字段,并继续兼容原有分组字典。Token 详情响应新增路由字段,routing_legacy 可用于区分兼容合成结果和实际存储策略。
  • PUT /api/channel/ 现在是显式允许字段的局部更新:未提交字段保持原值,空白密钥不会清除已有密钥,未知渠道状态会被拒绝,余额、用量、时间戳、内部状态和客户端提交的原始 channel_info 会被忽略。依赖该接口直接改写运行时字段的非标准客户端需要迁移到专用管理流程。
  • 源码构建新增开发依赖 @testing-library/react@16.3.2。从源码升级时应在 web/default 使用 Bun 按最新 web/bun.lock 安装依赖,不要复用旧 node_modules
  • 安全随机数依赖操作系统熵源。极少数熵源不可用场景下,OAuth state、签到奖励或渠道选择可能返回明确错误;RandomSleep 的抖动会降级为零延迟,而不会切回可预测的伪随机实现。
  • 自定义 Relay 或审计中间件若曾依赖 Ali、Baidu、Coze、SiliconFlow 显式零值被省略,需要同步调整:缺省字段仍不发送,但显式 0、空字符串和 false 现在属于有意上游参数。
  • AutoMigrate 会新增 midjourney_billing_claims,以 (channel_id, mj_id) 唯一索引绑定上游任务与本地账务任务。数据库账号需要具备建表和索引权限;历史同名 Midjourney 任务不会自动合并,无法唯一判定时会失败关闭并要求人工复核。
  • 支付 webhook 现在必须与本地订单的 provider 和实际支付金额一致,并在供应商返回币种时同时匹配币种。自定义支付适配器应传递可靠的支付证据;允许折扣的渠道只能少付且不能超出订单金额,无法确认金额的回调不应伪造校验值。
  • TRUSTED_PROXIES 只接受具体 IP 或受限 CIDR;0.0.0.0/0::/0、可组合覆盖整个地址空间或无效条目会使进程启动失败。未配置时仍只信任默认 loopback,反向代理部署应显式填写真实代理网段。
  • 开启 SSRF 防护后,受保护抓取不会使用 HTTP_PROXY / HTTPS_PROXY,以确保连接目标与已验证 DNS/IP 一致。必须经代理访问的内部 discovery 地址需要通过明确的 SSRF allowlist 和受控网络方案处理,不能依赖环境代理绕过校验。
  • 上游响应不再向客户端转发 Set-Cookie、hop-by-hop header、畸形名称/值,以及 Connection 中动态列出的字段。依赖这些非端到端 header 的自定义渠道应改用专用响应处理;安全的多值端到端 header 仍会保留。
  • 持久日志 content 与任务失败原因现在最多保留 4096 个 Unicode 字符,换行和制表会规范化为空格,并在截断时追加标记。依赖完整原始上游正文排障的部署应改用受控 debug 日志或外部追踪,不能再从业务日志读取无限正文。
  • 定价 JSON 上限为 2 MiB、20000 项、单个模型键 256 个 Unicode 字符;ModelRatioCompletionRatio 会按模型匹配规则规范化键并拒绝别名冲突。升级前应检查自动生成的大型配置和只在大小写/后缀上不同的重复键。
  • Midjourney、Suno 和换脸任务不再接受未配置价格的隐式通用兜底。升级前应为实际任务模型配置固定价格、默认价格或 task rate card,否则请求会返回价格未配置错误。
  • 视频代理 data URL 仅接受 video/mp4video/webmvideo/quicktimevideo/x-matroska,解码后上限为 100 MiB。返回其他媒体类型或超大内联视频的自定义适配器需要改为受控视频 URL 或调整上游输出。
  • 当前用户接口中的 Webhook secret 和 Gotify token 会返回空值。客户端更新通知设置时应省略未修改的凭据;服务端仅在通知类型与已保存配置匹配时保留旧值,不能再依赖读回明文后原样提交。
  • AutoMigrate 会新增 auth_flows 表和唯一 token HMAC 索引。OAuth state 接口由 GET /api/oauth/state 改为 POST,请求必须携带 providerintent;自定义前端或客户端需要同步升级,绑定流程还必须携带有效用户会话。
  • OIDC/Generic OAuth 的私网 IdP 在启用 SSRF 防护时默认会被拒绝;确有需要的部署应通过现有域名/IP/端口 allowlist 精确放行,不能依赖环境代理或全局关闭保护。
  • PassThrough 不再自动绕过渠道字段权限。需要 service_tierspeedinference_geo 等能力的渠道必须显式启用对应允许项,并同步确认本地倍率或计费表达式覆盖真实上游价格。
  • 前端路由编辑器属于管理端构建产物。发布前必须执行 cd web/default && bun run build 生成最新资源,再重启 Go 进程;直接使用旧 dist 不会包含本版路由配置入口。
  • /v1/alpha/search 使用新的 openai-alpha-search endpoint 类型。自定义渠道若要承接该路径,需要使用 Codex 渠道类型,或在 Advanced Custom 中配置 incoming_path: /v1/alpha/search、无转换器的直通路线。
  • Alpha Search 会在模型基础预消费外追加单次 Web Search 附加费用,并受工具价格、分组倍率和 tiered billing fallback 影响;升级前应检查相关模型、分组和工具价格配置,避免生产请求因价格无效被失败关闭。
  • 模型详情页新增 Alpha Search/Responses Compact 样例属于前端构建产物;发布包仍需要重新执行 web/default 构建,直接复用旧静态资源不会显示新的 endpoint 样例。
  • /health/ready 在数据库探测失败时返回 HTTP 503 与通用 "database connection failed" 消息;部署探针应优先使用该 readiness 端点,不应继续依赖管理后台状态接口解析。
  • 删除用户会立即使 OAuth 绑定、系统 access token 和 API Token 失效,并取消 active 订阅。外部集成不应依赖“删除用户后 Token/OAuth 仍可短期可用”的旧残留行为。
  • Dashboard CNY 金额展示现在要求 USDExchangeRate 为正且有限;配置为 0、负数、NaNInfinity 会返回通用账单不可用错误,而不会继续输出不可信金额。

Verification

  • 主体变更延续此前对 1e8e5cf6..06b82459 范围执行的集中门禁结果;本次补充基于当前 09654cc5 干净源码树重新核查 06b82459..09654cc5 的实际差异。
  • 后端全量 go test ./... -count=1 通过,覆盖 Controller、Model、Service、Relay、计费表达式、认证、支付、Midjourney、任务轮询、渠道更新和数据库兼容回归;资源独占时 relay/helper 时间敏感用例连续 3 次通过。
  • 前端全量 Bun 测试通过:143 项通过、0 项失败,共 37 个测试文件;新增覆盖代码高亮 HTML 净化和图表 CSS 注入,同时保留 Token 路由、Playground、OAuth、通知和既有安全回归。
  • go vet ./...go run ./tools/jsonwrapcheckbun run typecheck 通过;JSON wrapper 检查报告为 121 条 allowlisted direct calls。
  • 当前提交额外通过 bun run build:check,包含 tsc -b、Rsbuild 生产构建和 Tailwind 产物校验;构建生成 2 个 CSS 文件并通过 Tailwind 检查。
  • 当前补充通过 go test ./relay ./service ./model ./controller ./router -run "TestAlphaSearch|TestAlphaSearchSelectionUsesOnlySupportedChannelTypes|TestBuildTestRequestAlphaSearch|TestRelayRouterRegistersAlphaSearch|TestBilling(QuotaDisplayAmount|SubscriptionDisplayAmount)|TestCoverPlusActionToNormalActionRejectsMalformedCustomID|TestHealth|TestGetHealth|TestUserSoftDelete|TestUserHardDelete" -count=1 -p=1,覆盖 Alpha Search、账单展示、Midjourney custom ID、健康检查、路由注册和用户删除清理。
  • 当前补充通过 bun.cmd test src/features/pricing/components/model-details-api.test.ts:8 项通过、0 项失败,覆盖 Responses Compact 与 Alpha Search 的四种 API 样例。
  • .test 已同步并复核 222 个测试源和 2 个 workflow 文件,当前无镜像漂移。
  • git diff --check 通过,当前可见源码差异没有空白错误。
  • 本草稿已直接 UTF-8 读回校验:replacement_chars=0trailing_whitespace=0,并用关键词检查确认 09654cc506b82459..09654cc5Alpha Search/health/readybilling information unavailable222 个测试源 均已落入文稿。
  • 路由与渠道回归覆盖自动/手工路线顺序、跨分组重试、Affinity、旧 Token 合成、多 owner 模型列表、渠道更新锁、能力事务回滚以及多密钥元数据清理。
  • 支付与账务回归覆盖金额/币种/provider 不匹配、易支付原子入账、订阅幂等、余额不足、邀请奖励原子提交、Midjourney 重复归属、失败退款、未知提交结果和轮询/回调竞争。
  • 安全与可靠性回归覆盖 OAuth discovery 私网拦截、通知凭据脱敏与保留、禁用/删除用户授权、日志清理和截断、上游错误遮蔽、动态 Connection header 过滤、视频 data URL 限制、受保护抓取禁用环境代理、Turnstile/SMTP 超时及后台 runner 停止。
  • 本轮新增回归覆盖内存/磁盘请求体独立重放、Ali top_p 缺省和边界、OAuth state 生成/绑定/过期/并发消费/重放、OIDC/Generic 私网 endpoint 拒绝和敏感日志、用户级跨 IP 限流,以及 PassThrough 默认过滤和显式允许。
  • Relay/运行时补充回归覆盖 Zhipu/Vertex 非预期缓存类型、Vertex 畸形 PEM、随机源失败、CPU 采样失败,以及 Ali/Baidu/Coze/SiliconFlow 显式零值保留。
  • 集中 full profile 在进入 frontend lint 前的测试、vet、JSON policy 和 typecheck 均通过,随后因全仓既有 81 项 lint 基线问题(75 errors / 6 warnings)停止;production build 已通过单独执行的 bun run build:check。当前 OAuth 前端差异只触及 state API 参数,变更文件中的唯一 lint 命中是 use-oauth-login.ts:50 既有的 set-state-in-effect,该行不在本轮差异内。
  • 本文件位于 Git 忽略的 .tmp/v1.0.5-preview.3 本地标签仍未检出,下面的 compare URL 按计划发布标签名称生成,正式发布前请确认远端标签与目标提交。
  • 本轮未连接独立 MySQL/PostgreSQL 实例执行真实迁移矩阵,也未运行 Redis 多实例故障演练、支付平台 sandbox webhook、浏览器 E2E、真实 OAuth/IdP、真实 provider HTTP/2 reset/GOAWAY 或显式高价 PassThrough 字段账单对账;本机 CGO_ENABLED=0 且没有 GCC/Clang,Go race detector 也未执行。这些环境级验证仍应在正式发布前完成。

Full Changelog: https://github.com/MAX-API-Next/MAX-API/compare/v1.0.5-preview.3…v1.0.5-preview.4

Logo

中科创新烁智(CSCITech)

更多推荐