Skip to content

Releases: MAX-API-Next/MAX-API

v2.0.0-smartops.pre2

Choose a tag to compare

@CSCITech CSCITech released this 13 Sep 18:59
9ab9ba6

Warning

v2.0.0-smartops.pre2 是一次面向订阅策略、异步任务结算、跨协议工具计费和认证授权可靠性的 Preview 增量。升级前请备份数据库,并在目标环境完成迁移、回滚和账务核对。

本版的账本化工具计费只结算可稳定识别且已完成的 custom/Responses 内置工具调用;流式中途失败、未终止或身份冲突的调用会失败关闭,不按声明或不完整片段收费。Claude 等供应商自报的 server-tool usage 仍走各自的 usage metadata 路径。涉及真实支付、订阅并发、跨节点迁移和上游供应商协议的场景,应在目标环境独立验收。

Note

本版本聚焦订阅与结算策略、异步任务用量与终态结算、MiniMax-H3/Doubao 任务协议、跨协议工具计费、SmartOps 人工结算以及认证与授权安全边界。

MAX API 2.0 SmartOps pre2:订阅策略、异步任务结算、跨协议计费与认证授权可靠性

GitHub 地址

正式发布:https://github.com/MAX-API-Next/MAX-API/releases/tag/v2.0.0-smartops.pre2

Highlights

  • 订阅套餐支持钱包溢出和到期降级策略:管理员可以决定订阅额度耗尽后是否允许回退钱包,并为到期/取消指定目标分组;购买时将策略快照写入用户订阅,后续编辑套餐不会改变已购买实例。(证据:model/subscription.goSubscriptionPlanUserSubscriptionCreateUserSubscriptionFromPlanTx;关键逻辑:allow_wallet_overflowdowngrade_group 在购买时冻结。)
  • 异步任务用量和结算形成完整闭环:任务提交阶段保存不可变的参数化计费计划并预留额度,轮询阶段只接受经过版本化契约校验的供应商用量,终态阶段执行一次性差额结算;缺失、无效或不一致的终态证据会进入可恢复的人工对账,而不会静默按错误用量扣费。(证据:types/task_billing_plan.gotypes/task_usage.goservice/task_billing.goservice/task_polling.go;关键逻辑:TaskBillingPlanTaskUsageEnvelopeApplyBillingSettlementOnce。)
  • MiniMax-H3 与 Doubao Video 支持官方及中转站任务结果形态:H3 兼容官方 task.id/task.status/task.content.url、MiniMax 视频中转站根级 id/status/data[0].url 和成功包装 data.data,并在结果 URL 真正可取前保持轮询;Doubao 同时兼容官方响应、配置化包装响应、结果 URL 和 usage 提取。(证据:relay/channel/task/hailuo/h3.gorelay/channel/task/doubao/adaptor.gorelay/channel/task/taskcommon/protocol_config.go;关键逻辑:parseH3TaskResultparseGenericMiniMaxTaskResultParseConfiguredTaskResult。)
  • SmartOps 提供可审计的任务结算处置:Root 管理员可以对符合条件的 MiniMax-H3 任务批量确认最终额度为 0,也可以逐任务输入 0..预留额度 的精确最终额度;普通告警仍可独立审核关闭,避免把告警关闭误当成资金已结算。(证据:service/smart_ops_alert.gocontroller/smart_ops_alert.goweb/default/src/features/smart-ops/components/billing-settlement-evidence.tsx;关键逻辑:revision/CAS、幂等 operation key、失败明细和重试恢复。)
  • 工具计费从散落计数升级为请求级、重试感知的账本:OpenAI Chat/Responses、Claude Messages custom tool 和 Gemini function call 统一记录稳定身份、去重别名、调用阶段和价格版本;只有获胜尝试在终态提交后进入结算。(证据:relay/common/tool_usage.goToolUsageLedger;关键逻辑:BeginAttemptCommitAttemptToolCallIdentity 和冲突失败关闭。)
  • Responses 与多协议转换更符合上游终态语义:支持 custom_tool_call 输入、Responses 标准 error/failed/cancelled 事件、内置 Web/File Search 去重和 OpenAI/Claude/Gemini 流式工具终态识别。(证据:dto/openai_response.gorelay/channel/openai/relay_responses.gorelay/channel/openai/chat_via_responses.gorelay/channel/claude/relay-claude.gorelay/channel/gemini/relay-gemini.go。)
  • 部署和来源说明更安全、可复现:Compose、README 和宝塔文档将本地端口绑定到 127.0.0.1,固定镜像 digest,并在 Preview clone 后对 commit 不匹配直接失败。(证据:docker-compose.ymlREADME*.mddocs/installation/BT.mdNOTICE;关键逻辑:actual_commit 校验、loopback 端口和上游 Notice。)
  • 认证与管理员授权边界得到加固:OAuth/Telegram 状态绑定浏览器会话并一次性消费,身份变更与状态消费在同一事务内完成;新增只读权限目录、用户级授权覆盖和 shadow 评估,为后续逐路启用细粒度授权提供稳定契约。(证据:model/auth_flow.gocontroller/oauth.gocontroller/telegram.goservice/authz/*.gomiddleware/authz_shadow.go;关键逻辑:SessionIdConsumeAuthFlowWithActionTxClaimExternalAuthAssertionWithTxGET /api/authz/catalog。)

New Features

  • 管理端订阅套餐表单新增 Allow wallet fallback after quota exhaustionDowngrade Group 字段和列表展示;套餐购买卡片会显示降级分组与钱包回退状态,六种前端语言同步新增文案。(证据:web/default/src/features/subscriptions/components/subscriptions-mutate-drawer.tsxsubscriptions-columns.tsxlib/plan-form.tstypes.tsweb/default/src/features/wallet/components/subscription-plans-card.tsxweb/default/src/i18n/locales/*.json。)
  • 新增 provider-neutral 的 TaskBillingPlanTaskUsageEnvelope:计划冻结来源、规则、组件单价、请求/预留/最终阶段语义;用量信封冻结 producer、schema、contract digest、presence/completeness 和 evidence digest,区分缺失、显式零值、部分、无效与歧义用量。(证据:types/task_billing_plan.gotypes/task_usage.gopkg/taskusage/taskusage.go;关键逻辑:ContractDigestBuildEnvelopeValidateEnvelope。)
  • MiniMax-H3 参数化计费支持输出时长、输入视频/音频时长、输入图片数、分辨率和视频输入附加费,并以同一请求快照计算 estimate/reserve/final;官方 H3 v2 content 支持文字、首尾帧、参考图/视频/音频及 callback 参数校验。(证据:setting/task_billing_setting/h3.gorelay/channel/task/hailuo/h3.gorelay/channel/task/hailuo/models.go。)
  • 异步任务轮询支持配置化查询路径、任务 ID、状态映射、进度和多候选结果 URL;成功 MAX 包装会有界展开 data.data,官方 MiniMax task 和兼容网关根级 video.generation 也有显式解析分支。(证据:relay/channel/task/taskcommon/protocol_config.go;关键逻辑:MaxWrappedTaskUnwrapDepthstripWrappedTaskPathExtractConfiguredResultURL。)
  • 新增 SmartOps 任务人工结算和批量处置接口:精确额度输入、显式 0 值、revision 校验、按任务失败明细、普通告警关闭与财务结算分离,并同步前端多选、对话框、刷新失效和六种语言文案。(证据:controller/smart_ops_alert.goservice/smart_ops_alert.goweb/default/src/features/smart-ops/{api.ts,components, hooks}web/default/src/i18n/locales/*.json。)
  • 模型广场和任务计费设置页展示结构化 MiniMax 组件价格、单位和参数默认值;价格组件不再回退到普通模型单价,覆盖输出视频、输入视频、输入图片和输入音频等明细。(证据:web/default/src/features/pricing/components/model-details.tsxweb/default/src/features/pricing/lib/task-rate-card.tsweb/default/src/features/system-settings/models/task-rate-card-settings.tsx。)
  • 新增请求级 ToolUsageLedger:支持 custom/built-in 两类工具、Call ID/位置双别名合并、稳定身份要求、别名冲突 tombstone、并发重复观察去重、重试尝试隔离和价格版本快照。(证据:relay/common/tool_usage.go;关键逻辑:observeinvalidateAmbiguousLockedSnapshot。)
  • Responses DTO 现在保留 custom tool 的字符串 input,并补齐 Web Search、File Search、Google Search、Image Generation 及多种 Responses output 类型常量;Chat↔Responses 转换可继续传递 custom-tool 输入。(证据:dto/openai_response.gorelay/channel/openai/chat_via_responses.gorelay/channel/openai/responses_via_chat.go。)
  • 订阅策略迁移增加跨数据库列补齐与历史默认值修复:subscription_plansuser_subscriptions 增加钱包回退和降级字段,旧行默认允许钱包溢出、降级目标为空。(证据:model/main.goensure*SubscriptionPolicyColumnsmigrate*SubscriptionPolicyDefaultsensureSubscriptionPlanTableSQLite。)
  • 新增细粒度权限能力目录和用户覆盖存储:管理员可读取 /api/authz/catalog 获取资源、动作和内置角色基线;authz_user_overrides 保存显式允许/拒绝,GetSelf 返回 admin_permissions。本版仍处于 shadow rollout,目录为只读,尚未把覆盖策略作为所有管理路由的强制门禁。(证据:router/api-router.gocontroller/authz.gomodel/authz.goservice/authz/catalog.goservice/authz/override.gocontroller/user.go。)

Improvements

  • 订阅扣费路径现在在订阅额度不足时读取所有 active 订阅的快照策略;只要存在一个显式禁止钱包溢出的订阅,就保持失败关闭,不再悄悄切换到钱包。(证据:service/billing_session.goNewBillingSessionmodel/subscription.goUserActiveSubscriptionsAllowWalletOverflow。)
  • 购买上限、升级/降级分组和订阅到期处理增加行锁及事务边界;到期批次只使用当前事务锁定的快照,并在仍有其他订阅授予同一分组时保留该分组,避免多节点过期任务交叉覆盖。(证据:model/subscription.goCreateUserSubscriptionFromPlanTxdowngradeUserGroupForSubscriptionTxExpireDueSubscriptions;关键逻辑:withRowLock、按 end_time/id 排序和 active upgrade 检查。)
  • 订阅策略 DDL 按 common.UsingSQLitecommon.UsingMySQLcommon.UsingPostgreSQL 选择列定义;并发节点已先执行 ALTER TABLE、再用 GORM HasColumn 复核,仅抑制“另一节点已经成功加列”的竞态,其他错误继续返回。(证据:model/main.goaddSubscriptionPolicyColumnexecSubscriptionPolicyColumnDDLmodel/main_migration_test.go 的并发和数据库旗标测试。)
  • 自定义工具调用按 price_per_1k × call_count × group_ratio × QuotaPerUnit 使用 Decimal 计算附加额度;即使上游 token 为零,已完成且有价的工具调用仍会结算,并写入 tool_callstool_price_versiontool_billing_model 账单元数据。(证据:service/text_quota.gocustomToolItemQuotacalculateCustomToolCallSurchargePostTextConsumeQuotaservice/quota.goPostAudioConsumeQuota。)
  • 内置工具计数改为由账本投影到 ResponsesUsageInfo,Web/File Search 在 item.doneresponse.completed 或重复输出中只计一次;custom 工具与保留的内置名称分离,避免同一调用重复收费。(证据:relay/common/tool_usage.goObserveBuiltInToolCallrelay/channel/openai/relay_responses.goobserveResponsesToolOutput。)
  • 工具价格索引改为原子发布、最长模型前缀匹配并带单调递增版本;请求开始时捕获不可变快照,预扣和结算均使用同一价格,运行中管理员 reload 不会改变在途请求的价格;custom tool 用量 metadata 会携带价格版本。(证据:setting/operation_setting/tools.goRebuildToolPriceIndexCaptureToolPriceSnapshotrelay/common/tool_usage.goFrozenToolPriceservice/alpha_search_billing.goservice/text_quota.go。)
  • 异步任务计费将估算额度、预留额度和最终额度分开记录;实际用量不足、超出预留、配置禁用差额结算或供应商证据不完整时分别走退款、封顶或人工对账路径,不把任务提交成功直接等同于最终完成。(证据:service/task_billing.goresolveTaskBillingQuotasprepareTaskTerminalBillingDecisionsetting/task_billing_setting/h3.goQuoteH3Estimate/QuoteH3Reserve/QuoteH3Final。)
  • 任务轮询在 provider 终态与资金结算之间增加协调:提交结算仍 pending/manual 时保持任务可轮询;结算意图先持久化后应用,进程重启或 effect 失败可恢复,CAS 丢失不会覆盖并发发布的终态证据。(证据:service/task_polling.gotaskTerminalSettlementStatepersistPendingTaskTerminalEvidencerecoverAppliedTaskTerminalEvidencemodel/task.go 的 pending terminal 字段。)
  • 用量生产和结算按来源、阶段、producer、版本和摘要审计;MiniMax-H3 的秒数转毫秒、输入媒体数量及显式零值保持指针语义,Doubao 的无效/部分 token 不再污染旧 token 结算字段。(证据:pkg/taskusage/taskusage.gorelay/channel/task/hailuo/h3.gorelay/channel/task/doubao/adaptor.go;关键逻辑:ValidateEnvelopenormalizeH3UsagebuildDoubaoUsageEnvelope。)
  • 结算存储对 SQLite 串行化完整写入生命周期;MySQL/PostgreSQL 继续使用 GORM 事务和行锁,operation key、revision/CAS 和 effect 状态共同提供重试幂等与失败恢复边界。(证据:model/billing_settlement.gobillingSettlementSQLiteWriteMuwithRowLockApplyBillingSettlementOnce。)
  • SmartOps 对账投影现在同时包含 request-finalize 正向资金记录和 task-finalize 人工记录,但只有未解决的正向 request-finalize 记录影响新请求准入;人工结算支持选择刷新后 revision 失效、逐项失败而不影响其他项。(证据:model/billing_settlement.goservice/smart_ops_alert.goweb/default/src/features/smart-ops/hooks/use-billing-settlement-selection.ts。)
  • 批量结算 API 对响应 schema、数量、任务 ID、显式 0 和 actual_quota 范围做边界校验;前端输入兼容 Base UI/React Hook Form 事件形态,避免额度字段无法编辑或零值提交被吞掉。(证据:web/default/src/features/smart-ops/api.tsweb/default/src/features/smart-ops/hooks/use-manual-task-batch-settlement.tsweb/default/src/features/smart-ops/components/manual-task-settlement*.tsx。)
  • 任务协议配置允许上游路径和包装层独立演进,同时限制展开深度、URL 候选和状态映射;显式零值请求参数使用指针包装,保留 false0 等客户端意图。(证据:relay/channel/task/taskcommon/protocol_config.gorelay/channel/task/doubao/adaptor.go 的 request DTO;dto.BoolValue/dto.IntValue。)
  • OpenAI Chat 流式观察器先缓存碎片,只有 finish_reason=tool_calls 才提交工具调用;Claude 只有 message_delta.stop_reason=tool_use 才提交;Gemini 会把 willContinue=true 的身份带到最终片段,缺少终态的调用不会进入账本。(证据:relay/channel/openai/relay-openai.gorelay/channel/claude/relay-claude.gorelay/channel/gemini/relay-gemini.go 及对应 *_test.go。)
  • Responses 流在尚未向下游发送可见内容时允许重试;已经转发内容后标记 skip-retry,避免重复输出。标准 error 事件保留 code/message/paramresponse.failed、`canc...
Read more

v2.0.0-smartops.pre1

Choose a tag to compare

@CSCITech CSCITech released this 01 Sep 04:48
b709615

Warning

v2.0.0-smartops.pre1 的重大更新是面向管理员的 智能运维中心,包含活动告警、渠道性能、模型性能、系统信息和计费结算对账。渠道/模型结果中的请求量、错误量、消耗额度、估算成功率、重试和日志延迟来自既有 Consume/Error 日志聚合,并不是完整的 Relay Attempt 追踪;模型吞吐量和详情趋势来自 perf_metrics 聚合桶。日志缺失、错误日志未启用、历史重试标记未就绪、性能采集关闭或查询结果被截断时,部分指标可能不可用或不完整。

吞吐量与模型趋势属于桶级近似指标,当前默认桶粒度仍为 1 小时。非整点“最近 x 小时”查询可能与日志事件窗口存在桶边界差异,接口会返回请求窗口、实际桶覆盖、桶粒度和 approximate 标记。请勿仅依据这些预览指标自动禁用渠道、调整路由、执行账务对账或驱动自治 Agent;自动治理前仍需结合原始日志、告警和人工确认。

活动告警复用当前进程的 CPU、内存和磁盘采样以及管理员既有通知配置,只提供告警、恢复通知和只读查询,不执行自动修复。告警状态与通知队列均为进程内状态,重启后不会保留;多节点部署也不会在本版自动聚合为跨节点 Incident。渠道/模型性能列表默认最近 1 小时、最长 168 小时,仅在管理员点击“应用筛选”或“刷新”后执行,模型详情在打开抽屉后按最近 24 小时加载。生产部署应监控大日志库查询负载,并在发布前重新构建管理端资源。

本版还调整了账户安全和计费失败语义:用户表新增 session_generation,密码、Passkey、2FA、Telegram 绑定等安全事件会撤销其他登录会话;密码恢复还会撤销管理 Access Token 和全部 API Token。上游已经接受异步任务、但本地最终结算尚未完成时,接口会返回 409 billing_settlement_pendingtask_id,调用方不得自动重复提交,应继续按任务 ID 查询或交由管理员对账。对于已经存在 pending / manual 正向最终结算的用户,新付费请求是否返回 403 billing_reconciliation_pending,由根管理员默认策略和单条审阅覆盖共同决定;默认策略为允许。管理员“审阅并关闭”只关闭运维告警并留下审计记录,不会把结算标记为 applied、改动余额或停止持久化恢复。PreConsumedQuota 现在仅作为请求前的预留额度下限,不是最终收费下限。

Note

本稿以远端正式标签 v1.0.574a7ed3e)为基线,当前本地与 origin/cscitech 均为 7aa40757,相对基线新增 127 个提交、提交态差异涉及 256 个文件;工作树没有未提交的源代码变更。0114540d 之后新增的 27 个提交、34 个差异文件,主要补齐 SmartOps 计费结算对账证据、可配置用户阻断、管理员审阅/批量关闭、财务快照选择、并发冲突保护及六语言界面。此前截至 0114540d 的 CodeRabbit 全量审查与修复记录继续保留,但不把该审查结果误称为覆盖当前最新 HEAD。Passkey 首次注册仍遵循既定兼容契约:已有 2FA 或 Passkey 时必须使用强方式,没有强凭据的密码账户可使用现有密码,OAuth-only 且没有其他凭据的账户可使用刚完成 OAuth 登录授予的用途受限 grant。本稿位于 Git 忽略的 .tmpv1.0.5 已包含的既有能力和说明不在本版重复,正式创建 v2.0.0-smartops.pre1 标签前仍应按最终标签重新核对范围、审查状态与构建产物。

MAX API 2.0:开启智能运维时代

以全新的 智能运维中心 为核心,MAX API 2.0 将主机资源告警、渠道与模型性能分析、系统信息和计费结算对账整合为统一的管理员运维工作台。

GitHub 地址

https://github.com/MAX-API-Next/MAX-API/releases/tag/v2.0.0-smartops.pre1

Highlights

Major Update: 智能运维中心

智能运维中心v2.0.0-smartops.pre1 的核心重大更新。它把主机资源告警、渠道与模型生产性能、系统信息和计费结算对账集中到统一管理员入口,并以只读证据、显式数据质量边界、角色权限和人工审阅为基础,为后续可控运维自动化建立安全边界。

  • 智能运维中心升级为统一运维入口:后台集中提供“活动告警”“渠道性能”“模型性能”“系统信息”四个模块;告警与性能视图对管理员开放,系统信息继续仅对超级管理员开放。
  • 主机资源异常可主动通知管理员:CPU、内存或磁盘连续两个有效新样本超过配置阈值后触发告警,恢复时发送恢复通知,并在管理端活动告警页持续展示当前进程仍在触发的项目。
  • 渠道与模型提供独立生产性能视图:渠道性能按渠道/模型/分组定位问题,模型性能汇总所有模型的请求、错误、消耗额度、成功率、延迟、重试和吞吐量,均支持 1–168 小时自定义查询与独立排序。
  • 模型详情提供运维级性能证据:按需展示模型级 TPS、平均延迟、成功率、各分组性能,以及最近 24 小时延迟趋势和可用率趋势。
  • 模型级指标改为后端加权汇总:成功率按请求数、TTFT 按样本数、吞吐量按总输出 Token/总生成时间计算,避免流量不均衡时跨分组简单平均导致结果失真。
  • 大日志库默认不自动查询:页面初次进入不会加载数据,仅在“应用筛选”或“刷新”时计算;默认最近 1 小时,并允许输入 1–168 小时的自定义窗口。
  • 观测结论显式携带数据质量边界:除日志开关、历史回填、截断和弱关联标记外,吞吐量明确区分 availablecollection_disabledno_samplesquery_failed,并披露实际桶覆盖范围。
  • 不新增数据库表即可迁移接入:首阶段直接复用现有日志库和渠道元数据,通过只读聚合 API 提供能力,主库与独立日志库之间不执行跨库 JOIN,也不读取渠道密钥或上游配置。
  • 实际路由分组进入日志与计费上下文:自动路线、Token 多分组路线及 Affinity 命中后,会同步记录实际选中的分组,使生产性能中的分组维度与真实运行路线保持一致。
  • SmartOps 增加计费结算对账闭环:活动告警页集中展示仍处于 pending / manual 的正向最终结算、未结资金、重试与错误证据;根管理员可配置默认用户阻断策略,管理员可按当前 revision 原子批量审阅并关闭告警。审阅状态与真实资金结算状态严格分离,不会通过关闭告警伪造扣费成功或改动余额。
image-1 image-2 05b74ec8398cd5df72fccfdb155842c6 a7c7cef3b9c82d344ed9e770ef518370 image

Other Highlights

  • 充值结算增加事务化钱包上限保护与人工对账状态:Epay、Stripe、Creem、Waffo、Waffo Pancake 与管理员补单统一在本地事务内完成订单状态变更、额度入账和持久化缓存失效任务登记;外部已付款但钱包上限阻止入账时,订单会进入“已付款,待对账”,避免继续停留在待支付或重复触发回调重试。
  • Relay 兼容性集中补强:Responses 保留缓存键与惩罚参数,Claude 修复无参数工具转换,Ollama 补齐 reasoning 和工具上下文,Gemini 模型列表及阿里云映射模型路由也按实际上游协议处理。
  • 高风险账户操作统一增加分作用域重新验证:Passkey 注册或替换、2FA 初始化与启用、Telegram 绑定,以及 API Token 创建、单个明文查看和批量导出,均要求当前用户在 5 分钟内使用 2FA、Passkey 或受限密码回退完成对应 scope 的 step-up 验证;OAuth-only 账户仅在重新完成受支持 OAuth 登录后取得用途受限的 oauth_reauthentication grant,用于首次 Passkey、2FA 或 Telegram 绑定引导。
  • 安全凭据变化可立即撤销其他设备会话:Cookie 会携带并校验用户 session_generation;密码修改或恢复、Passkey 增删、2FA 启停或备用码重建、Telegram 绑定都会原子递增代次,同时保留当前操作会话并清除其旧 step-up 状态。
  • 预扣费与最终结算改为明确的可恢复生命周期:管理员预扣配置只作为完整估算后的预留下限,实际用量仍按原始最终额度结算;资金结算成功前不会提前写入成功消费日志、请求计数或渠道用量,失败结果由持久化结算记录和 effect 恢复。
  • 异步任务在结算恢复期间保持可查询:上游已接受的 Midjourney、Suno、视频及通用任务不会因本地最终结算暂时失败而伪装成功或直接转为失败;资金状态恢复前阻止终态切换,资金已应用而仅剩日志 effect 时继续正常轮询。

New Features

  • 新增管理员接口 GET /api/smart-ops/alerts 和管理端路由 /smart-ops/alerts,按 5 秒间隔读取当前进程活动告警,并提供加载、空、错误、手动刷新和窄屏横向滚动状态。
  • 新增 CPU、内存和磁盘持续超阈值检测:连续两个有效新样本才触发,活动期间去重,指标恢复后发送恢复事件;通知复用每位管理员已经配置的 Email、Webhook、Bark 或 Gotify 渠道。
  • 新增管理员接口 GET /api/smart-ops/channel-performance,支持 hourschannel_idmodelgroupstartendlimit 查询条件,并限制最大时间窗口和返回行数。
  • 新增管理员接口 GET /api/smart-ops/model-performanceGET /api/smart-ops/model-performance/detail;前者支持 hoursmodelgroupstartendlimit,后者按模型返回最近 24 小时的分组指标、加权汇总、趋势、桶覆盖和采集状态。
  • 新增管理端路由 /smart-ops/alerts/smart-ops/channel-performance/smart-ops/model-performance/smart-ops/system-info 及独立“智能运维中心”侧边栏视图。原用户侧数据看板继续保留,管理员模型性能作为独立运维视图追加,不替代用户功能。
  • 渠道性能新增摘要与明细展示,包括观测日志事件、消费日志、已记录错误日志、消耗额度、估算成功率、日志延迟、重试次数、探测延迟和最近观测时间。
  • 模型性能新增全模型结果,包括渠道数、观测日志事件、错误日志、消耗额度、估算成功率、日志延迟、吞吐量 TPS、重试次数和最近观测时间。
  • 渠道与模型表格的关键指标均支持独立升序或降序排序;无数据指标固定排在有效数值之后,不改变 API 原始结果顺序。
  • 模型性能详情抽屉复用并完善模型广场的性能展示方式,提供各分组性能、延迟趋势和可用率趋势,并仅在打开详情后请求数据。
  • 新增详情抽屉、结果截断提示、空状态、错误状态和数据质量标签;表格最多展示 200 行时,摘要卡片仍覆盖全部符合条件的日志。
  • 智能运维中心相关文案已同步至中文、英文、法文、日文、俄文和越南文。
  • 新增管理员只读接口 GET /api/smart-ops/billing-settlements,默认返回最早 100 条、最多 200 条未关闭对账告警,并同时提供 pending / manual 数量、阻断记录数、受影响用户数、最早创建时间和截断标记;返回字段排除 Token 密钥、effect payload、请求正文等敏感内容,错误文本在展示前会脱敏和清理。
  • 新增根管理员接口 PUT /api/smart-ops/billing-settlements/blocking-policy,可持久化“默认阻止受影响用户”策略;普通管理员可以查看当前策略但不能修改。
  • 新增管理员批量审阅接口 POST /api/smart-ops/billing-settlements/reviews,支持一次原子关闭 1–200 条当前告警;同时保留单条 POST /api/smart-ops/billing-settlements/:id/review,用于记录 3–1000 字审阅说明和单条用户阻断覆盖。两类操作都会记录执行管理员和目标记录审计信息,但不会改变财务结算状态。
  • 活动告警页新增计费对账摘要、只读证据表、全选/逐条选择、批量关闭、阻断策略开关、截断提示和独立错误状态;前端以 Zod 校验对账响应,详情加载失败或响应畸形时仍保留主 SmartOps 告警。
  • Ollama 渠道新增 reasoning_effort / Responses reasoning.effort 到原生 think 的映射,并在多轮工具调用中保留 assistant reasoning、tool call ID、工具名称和工具响应关联。
  • 充值订单新增 paid_reconciliation 状态:外部支付已确认但本地钱包容量校验无法入账时,系统持久化该状态并正常确认支付回调,管理员可在账单历史中识别并手动完成订单。
  • 新增 POST /api/user/sessions/revoke,允许用户在完成 credentials 安全验证后撤销其他设备会话,并保持当前设备继续登录。
  • 新增 credentialsapi_tokenpasskey_register 与仅由新鲜 OAuth 登录授予的 oauth_reauthentication 安全验证作用域;管理端使用全局安全验证 Provider,在受保护请求返回 VERIFICATION_REQUIRED 后弹出验证框,成功后自动继续原操作,取消或验证失败不会误执行后续请求。
  • Telegram 绑定新增 POST /api/oauth/telegram/bind/state 初始化接口和 POST 绑定流程;state 同时绑定当前浏览器会话、用户、provider 与 bind intent,默认 5 分钟有效并在成功绑定事务中一次性消费。

Improvements

  • SmartOps 告警通知改为 3 个固定、有界、按“节点 + 资源”确定性分片的异步 worker,总队列容量仍为 24;不同节点或资源的事件可并发投递,不再被单个慢重试阻塞,同一事件的 firingresolved 仍进入同一 worker 并保持顺序。收件人查询、通知限流及单个管理员发送失败均使用有限退避重试,已经成功送达的管理员不会因其他收件人失败而重复收到同一事件。
  • 告警通知限流键加入节点、资源和 firing / resolved 状态,避免不同节点或恢复事件互相占用同一个通知槽;队列满时记录丢弃事件,不阻塞系统采样和请求处理。
  • 聚合查询仅纳入具有渠道和模型标识的 Consume/Error 日志,并排除渠道测试、违规费用、任务账务调整等已知非生产调用记录,减少计费记录对渠道性能判断的干扰。
  • 估算成功率仅在消费日志和错误日志均启用时返回;重试指标仅在历史重试标记可确认就绪后返回,避免使用 0 伪装“不可观测”。
  • 日志延迟只使用非重试样本并保留现有整秒精度;渠道探测延迟单独来自渠道元数据,不会混入生产日志延迟或成功率计算。
  • perf_metrics 新增模型级加权汇总:成功率基于总成功数/总请求数,平均延迟基于请求样本,TTFT 基于独立 TTFT 样本数,TPS 基于总输出 Token/总生成时间;趋势同样按时间桶合并原始计数。
  • 性能指标查询新增请求窗口、实际桶起止、桶秒数和近似标记;非整点窗口不再被展示为与日志事件完全等价的精确窗口。
  • 性能采集状态明确区分正常可用、采集关闭、窗口无样本和查询失败;日志聚合仍可用时,吞吐量故障不会遮蔽其余模型结果。
  • 行级查询使用 limit + 1 判断截断,摘要使用独立聚合覆盖完整筛选范围,避免因表格行数限制低估总请求量和错误量。
  • 日志聚合与渠道标签查询保持分离,独立 LOG_DB 部署无需跨数据库关联;主库只返回渠道名称、类型、状态、探测延迟和探测时间等安全元数据。
  • 后端通过窄化的只读 Reader 接口隔离当前 legacy log 数据源,为后续替换为 Attempt/Evidence 观测模型保留稳定的控制器与前端契约。
  • 模型广场与智能运维详情共享的性能组件改为优先使用后端模型级汇总,不再由前端对分组指标二次平均;单分组旧响应仍保留兼容回退。
  • 智能运维列表改为完全手动查询,详情改为按需加载,避免页面进入、筛选输入变化或抽屉未打开时对大日志库和性能指标重复计算。
  • 智能运维导航按角色生成:管理员可访问渠道/模型性能,超级管理员额外访问系统信息;后台模块显隐设置新增智能运维中心控制项。
  • 计费结算积压现在作为独立 SmartOps 活动告警投影:关闭审阅后会立即刷新当前进程内告警,但不会把“告警已关闭”误发为“资金已恢复”;禁用主机性能监控也不会清除计费告警,较旧的周期采样不能覆盖更新的管理员审阅结果。
  • 对账查询在 MySQL/PostgreSQL 使用只读 Repeatable Read 事务获取摘要与明细快照,并以 limit + 1 判断截断;阻断记录数与受影响用户数按完整筛选范围统计,不会因表格最多 200 行而低估。
  • 管理员审阅以结算 id + revision 校验当前财务快照,批量操作在单一事务中全部成功或全部回滚;记录按 ID 升序取得更新锁,并在更新后以一次查询读回完整批次,降低重叠审阅的数据库死锁与 N+1 查询风险,读回失败时同样整体回滚。
  • 对账界面的状态、时间、数量、角色和计费术语已在中、英、法、日、俄、越六种语言中统一;前端 mutation 错误优先使用有效业务消息,空白或异常响应安全回退到本地化提示。
  • 充值入口在创建外部支付订单前按最终可入账额度检查钱包容量;结算阶段使用带余额上限谓词的条件更新,避免并发的不同订单分别通过预检查后共同把钱包推过上限。
  • 充值结算将订单成功状态、用户额度更新和持久化缓存失效任务置于同一数据库事务,提交后再派发缓存失效;支付金额、币种或支付渠道不匹配时不会提前完成本地订单。
  • Waffo 与 Waffo Pancake 在 Tokens 展示模式下统一容量预估与订单入账单位;Waffo 进一步从同一归一化额度快照推导订单 Amount、可入账额度和外部支付报价,避免报价与最终入账采用不同基数。
  • RelayInfo 会从 Chat、Responses、Claude 和 Gemini 请求读取 reasoning effort,并在 Param Override 修改或删除相关字段后同步最终状态,使日志与审计记录反映实际发送给上游的参数。
  • 控制台公告、FAQ、API 信息和 Uptime Kuma 配置的长度限制改用 JavaScript UTF-16 code unit 语义,前后端对 emoji、代理对等字符的计数保持一致;JSON 解析同时统一改用项目包装器。
  • 渠道编辑页传入模型抓取弹窗的当前模型列表改为稳定的 memoized 引用,减少父组件重渲染时无意义的派生数组变化;Turnstile 令牌消费 helper 同时补充显式返回类型,固定调用方可依赖的字段契约。
  • 分阶段计费本地估算器补齐 hourminuteweekdaymonthday 时区函数,并在无效时区时回退 UTC,使管理端试算与后端表达式运行环境保持一致;可视化编辑器现在也允许删除新建的兜底档位,并自动保证最后一档仍为兜底。
  • 前端测试入口改为统一发现 Bun 支持的测试文件,按文件过滤和 --shard 分片,隔离会修改浏览器全局状态的测试,并将子进程并发固定为串行,减少 JSDOM/React 全局污染;GitHub CI 现在会在类型检查与构建前执行前端测试。
  • 默认控制面限流在保持各自时间窗口不变的前提下放宽:Web 请求由 60 提升至 600、关键操作与关键路由由 20 提升至 200、账户级登录由 10 提升至 100、用户搜索由 10 提升至 100;所有现有环境变量覆盖仍然有效,并新增默认值回归测试。
  • PreConsumedQuota 统一作用于倍率、固定价格、按次任务、rate-card、分阶段表达式和 Alpha Search 等付费模式,并在模型/分组覆盖及确定性附加费汇总完成后只应用一次;免费分组继续保持零预留。
  • 预扣配置更新现在严格要求非负整数,并在写数据库前完成规范化;负数、小数、溢出值和解析失败不再静默变成零或污染运行时配置。
  • 任务跨渠道或分组重试时会根据新的完整估算幂等补足预留额度,任务占位记录保存实际已预留额度,最终任务额度与钱包/订阅、Token 额度在同一持久化结算事务中推进。
  • 用户、Token 和安全凭据缓存失效继续使用事务内持久化 outbox,并以待处理失效任务作...
Read more

v1.0.5

Choose a tag to compare

@CSCITech CSCITech released this 16 Aug 07:22
74a7ed3

Important

v1.0.5 是一次围绕路由能力、计费可靠性、安全边界和渠道兼容性的正式更新。版本整合了 v1.0.5-preview.1 至 v1.0.5-preview.4 的主要成果,并将预览阶段的零散改动归并为面向用户的功能与稳定性说明。

本版本包含数据库结构变更。生产升级前请备份主库与日志库,确认数据库账号具备 AutoMigrate 所需权限,并在同版本数据副本或测试环境完成迁移与核心计费流程验证。前端资源也必须重新构建后再重启服务。

Release Notes

GitHub 地址

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

Highlights

  • Token 路由策略升级:API Key 可选择系统自动路线,或配置最多 8 个有序手工分组,并控制失败后是否跨分组重试;模型目录、Affinity、实际选组和重试流程现在使用同一份路由计划。
  • 计费与退款更加可靠:钱包、订阅、Token、Realtime 和异步任务结算引入持久化幂等记录与后台恢复机制,降低重复扣费、重复退款、进程中断和并发回调造成账务不一致的风险。
  • OpenAI Alpha Search 正式接入:新增 POST /v1/alpha/search,支持 Codex 与 Advanced Custom 直通渠道,并纳入模型映射、Param Override、渠道选择和 Web Search 计费。
  • 视频与异步任务能力增强:DoubaoVideo / Seedance 支持完成态差额结算控制和实际 usage 结算;通用视频任务可配置创建、更新时间字段,Midjourney 提交、轮询、回调和退款统一进入持久化账务流程。
  • 缓存与限流可靠性提升:用户和 Token 缓存增加版本栅栏、持久失效任务和跨进程恢复;Redis 限流异常时会回退到本机同策略限流,避免缓存故障导致保护整体失效。
  • 安全边界全面收紧:OAuth 一次性 state、SSRF 防护、支付回调校验、删号二次验证、Midjourney 签名图片地址、敏感凭据隐藏、上游响应头过滤和日志脱敏得到统一加强。
  • 模型与渠道兼容性扩展:新增 DeepSeek Responses,保留 Qwen/QwQ thinking_budget,完善 OpenAI Realtime、Alpha Search、状态码映射及多家渠道显式 0 / false 参数转发。
  • 管理端体验与可观测性优化:新增 API Key 路由编辑器、Playground 参数面板、离线实例批量清理和健康检查端点,并改善移动端表格、渠道编辑、模型定价和错误提示。

New Features

  • API Key 新增可持久化路由策略,支持自动路线、手工分组排序和跨分组重试,同时兼容旧 Token 的 group 配置。
  • 新增 /v1/alpha/search 中继能力,以及 /health/health/live/health/ready 编排探针。
  • Playground 新增温度、Top P、频率惩罚、存在惩罚、最大 Token 和随机种子等可视化参数配置。
  • DoubaoVideo 渠道新增视频任务差额结算开关;通用视频任务新增创建时间和更新时间路径配置。
  • DeepSeek 渠道新增 Responses API 支持;Qwen/QwQ 请求支持 enable_thinkingthinking_budget,并保留显式零值。
  • 系统实例面板新增一键清理离线实例,模型详情页补充 Responses Compact 与 Alpha Search 调用样例。

Performance and Reliability

  • 计费预扣、最终结算、退款、账单日志和 usage 写入使用稳定 operation key 与数据库事务,服务重启后可继续处理未完成副作用。
  • 用户与 Token 缓存失效改为版本化、可恢复流程;待处理失效任务同时阻止旧数据重新写回 Redis。
  • Redis 限流采用原子滚动窗口,并提供标准 429 重试信息;Redis 异常时使用有界超时和本机降级策略。
  • 多分组模型去重、Affinity 正则和计费表达式缓存采用有界索引或淘汰策略,减少大规模模型、渠道与表达式场景下的重复扫描和全量缓存清空。
  • Realtime、Bedrock、Cohere、PaLM、智谱、Gemini 等链路补齐取消、心跳、超时和资源释放,降低异常断连后的连接与 goroutine 滞留。
  • 前端构建增加 Tailwind 产物守卫,DataTable、移动端列表和长标签布局得到优化,减少源码与发布静态资源不一致及窄屏溢出。

Bug Fixes

  • 修复重复请求、并发 worker、支付回调或进程中断可能造成重复扣费、重复退款、Token 与资金账本不一致以及账单日志重复的问题。
  • 修复 Stripe、Creem、易支付和 Waffo 等支付回调只验签但未完整核对订单渠道、金额或币种的问题。
  • 修复异步任务失败退款不可恢复、Midjourney 重复任务归属、Seedance usage 未进入差额结算,以及临时渠道故障被误判为任务失败的问题。
  • 修复 OAuth 回调重复兑换、外部跳转、私网 discovery、旧会话继续授权,以及用户删除后 OAuth、access token、API Token 或订阅残留的问题。
  • 修复 Token 多分组模型目录不完整、Affinity 从错误分组开始重试、Playground 显式分组被覆盖,以及显式关闭跨分组重试未生效的问题。
  • 修复渠道更新可能覆盖运行时字段、状态码映射保存后丢失、多密钥并发更新冲突,以及部分渠道丢弃显式 0、空字符串或 false 的问题。
  • 修复 OpenAI Realtime、DeepSeek、Qwen、AWS Nova、讯飞、Vertex、Gemini、Baidu、Zhipu 等渠道的协议、流式断连、空响应、配置异常和资源释放问题。
  • 修复敏感上游错误、凭据、Cookie、控制字符或超长正文进入客户端响应与业务日志,以及图片、视频和动态 HTML/CSS 内容校验不足的问题。
  • 修复模型与供应商同名并发创建、定价配置被异步表单误清空、负数或非有限价格写入,以及账单汇率无效时仍展示不可信金额的问题。

Compatibility Notes

  • 本版本会新增或调整 Token 路由、持久化结算、缓存失效、账单日志回执、OAuth 流程、Midjourney 账务归属、quota_data 聚合及模型/供应商唯一键等数据库结构;请确保 AutoMigrate 可执行并提前演练。
  • 既有 Token 无需立即回填路由 JSON,会继续根据旧 groupcross_group_retry 生成兼容策略;新客户端建议优先使用 routing 字段。
  • OAuth state 接口改为 POST /api/oauth/state,并要求携带 provider 与 intent;删号接口现在要求 account_delete 二次验证,旧 Midjourney 裸图片地址不再可用。
  • 渠道更新接口改为显式字段补丁,未提交字段会保留,余额、累计用量、内部状态和时间戳等运行时字段不能再通过普通编辑接口修改。
  • tiered_exprheader() / param() 读取范围进一步收紧;Midjourney、Suno 和换脸任务不再使用未配置价格的隐式兜底,升级前应复核表达式、任务费率和 Alpha Search 工具价格。
  • TRUSTED_PROXIES、SSRF、防护抓取、PassThrough 字段权限、视频 data URL 和上游响应头转发采用更严格的失败关闭规则;非标准代理或自定义渠道需要复核配置。
  • Redis 故障时的本机限流按实例分别计数,不能替代多实例部署中的全局 Redis 窗口;应继续监控 Redis 可用性。
  • 发布前必须进入 web/default 执行 bun installbun run build,再重启 Go 服务;直接复用旧 dist 不会包含新的路由编辑、Alpha Search 样例和前端修复。

Upgrade Checklist

  • 备份主库、日志库和关键配置,并在数据副本上完成 AutoMigrate 演练。
  • 核对钱包、订阅、Token、Realtime、视频任务、Midjourney 和支付回调的预扣、结算与退款结果。
  • 复核 Token 路由、渠道状态码映射、任务价格、Alpha Search 工具价格和 tiered billing 表达式。
  • 检查 OAuth/OIDC、反向代理、Redis、SSRF allowlist、通知凭据和自定义 PassThrough 集成。
  • 使用 Bun 安装最新前端依赖并重新构建静态资源,再执行滚动升级和健康探针验证。

Verification

  • preview 阶段已完成后端全量测试、go vet、JSON wrapper 检查及计费、认证、路由、支付、任务和数据库兼容性定向回归。
  • 前端已完成类型检查、生产构建、Tailwind 产物检查及路由编辑、Playground、OAuth、渠道配置和安全渲染等测试。
  • 正式发布前仍建议在实际 MySQL/PostgreSQL、Redis 多实例、支付 sandbox、真实 OAuth/IdP 和常用上游渠道环境执行部署级回归。

Full Changelog: v1.0.4...v1.0.5

v1.0.5-preview.4

Choose a tag to compare

@CSCITech CSCITech released this 10 Aug 12:32
0aed3fd

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 支持可视化路由编辑:可以查看自动路线包含的分组、切换到手工模式,通过拖拽、方向键或按钮调整分组顺序,并配置跨分组重试;已有但当前不可供新选择的路由会被标记并保留。
功能示例(由参与内测平台提供)
image image
  • 渠道更新改为显式字段补丁:更新接口只接受允许修改的配置字段,省略字段会保留原值,余额、累计用量、测试时间和内部多密钥状态等运行时数据不能再通过普通渠道编辑请求覆盖。
  • 旧 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 后缀处理不完整的问题,避免 malforme...
Read more

v1.0.5-preview.3

Choose a tag to compare

@CSCITech CSCITech released this 05 Aug 04:35
4c62e58

Warning

v1.0.5-preview.3 为预览版本,包含计费结算、订阅预扣、异步任务退款、缓存失效、日志幂等以及模型/供应商名称唯一键相关数据库结构变更。升级前请备份主库与日志库,并在测试环境验证钱包/订阅计费、Realtime 长会话、异步任务成功/失败/超时、Redis 故障恢复、渠道状态码映射、模型元数据迁移和 Midjourney 图片转发。日志幂等使用独立小型 receipt 表,不会在大体量 logs 表上创建新的唯一索引。

Note

本稿只描述 v1.0.5-preview.2 之后需要对外说明的变化。preview.2 已覆盖的 generation fence、进程内缓存重试、BillingSession 补偿状态、quota_data 刷盘、OAuth/Turnstile 收口和管理端基础优化不在这里重复;本版仅描述这些机制在持久化恢复、原子结算、Redis 限流降级、渠道协议兼容和具体缺陷修复上的新增增量。

Release Notes

GitHub 地址

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

Highlights

  • 计费结算进入持久化幂等阶段:钱包、订阅、Token 和异步任务额度调整使用稳定 operation key 与数据库结算记录,相关账本变更在同一事务内提交;瞬时失败保留为可恢复状态,参数冲突、跨订阅周期等不安全重放会失败关闭或进入人工处理。
  • 异步任务退款与差额结算可恢复:任务最终结算、失败退款、任务 quota 更新、账单日志和 usage 统计建立持久化关联;CAS 竞争只允许获胜者触发计费,进程重启后可继续恢复未完成退款及日志副作用。
  • 缓存失效支持跨进程恢复:preview.2 的进程内有限重试进一步增加数据库持久任务;用户资料/绑定/删除、Token 更新/删除及钱包/订阅额度变更会在业务事务内同时登记失效任务,Redis 抖动期间的待处理工作不会因进程退出直接丢失,并继续使用 revision 防止旧任务覆盖新状态。
  • Redis 限流故障保留本机保护:Redis 不能给出有效判定时不再直接放行,自动降级到进程内限流器;Redis 恢复后继续使用原子滚动窗口。
  • 渠道状态码映射形成保存到运行时闭环:修复表单更新后映射消失、未写入数据库的问题,补齐后端严格校验,并将映射扩展到通用异步任务和 Midjourney;重试判断仍以原始上游状态为准,避免把不可重试提交错误映射成 5xx 后重复创建任务。
  • 渠道适配器可靠性加固:AWS Bedrock 请求跟随客户端取消,讯飞 WebSocket 握手和上游业务错误不再挂起或伪装成功,Nova/Vertex 异常配置与空响应改为受控错误;Cohere、PaLM、智谱流式请求会随客户端断开退出,Gemini 等响应资源在失败路径也会正确释放。
  • 高风险账号与图片访问收口:删号必须完成 2FA、Passkey 或密码二次验证;Midjourney 图片转发改为绑定任务、用户和 15 分钟有效期的 HMAC URL,旧的匿名裸 URL 不再可用。
  • 前端会话恢复与复核收口:认证状态只保存在内存中,页面冷启动通过服务端 cookie session 恢复;会话按有界窗口重新校验,401 会清理状态,并防止切换用户时复用旧的并发校验结果。
  • Realtime 与模型配置兼容性修复:OpenAI Realtime 按 preview/正式模型决定是否发送旧 beta 协议头,双向 Ping/Pong 与读超时会回收异常断线会话,累计 usage 改为按会话目标额度预留;模型定价抽屉和共享 JSON 编辑器修复异步回填、模式切换及误清空配置问题。
  • 支付回调、订阅权限和渠道故障转移收口:Stripe 入账遇到可重试错误时会返回 500 交由上游重放;高等级订阅取消或到期后会按仍有效订阅的实际授权分组回落;单次中继重试会排除已经失败的渠道,避免重复消耗重试预算。
  • 模型目录与定价管理一致性增强:模型/供应商活跃名称使用非空唯一键约束,上游元数据同步失败会明确中止;Anthropic 空模型列表、供应商引用保护和表达式计费模型切换后的旧价格残留问题一并修复。

New Features

  • 通用视频任务协议新增 created_at_pathupdated_at_path 可视化配置,可从不同供应商响应中提取任务创建和更新时间;相关字段已同步到中、英、法、日、俄、越六种前端语言。
  • 计费结算与缓存失效新增后台恢复任务:服务启动后会继续处理数据库中待完成的结算、账单日志/usage 副作用及 Redis 缓存失效记录。

Improvements

  • 新增 BillingSettlement 持久化结算记录,operation key 会绑定资金来源、用户、订阅、Token、任务、额度参数和日志副作用;重复调用返回既有结果,参数变化或身份不一致不会再次扣费/退款。
  • 新增 BillingPreConsumeSelection,同一 request ID 首次选定钱包或订阅后不可在重试中切换资金来源,避免余额变化或并发回放把一次请求结算到两个来源。
  • 钱包/订阅预扣与 Token 预扣收敛到原子事务;订阅记录绑定用户、Token、模型、额度和 last_reset_time,跨重置周期的延迟结算或退款会失败关闭。
  • Realtime 追加预留使用递增 revision 和累计目标额度,每个 reserve 操作可幂等重放,不再把累计 usage 当作互相独立的扣费片段。
  • 任务最终结算与退款通过任务主键和旧 quota 做 CAS,资金、Token、任务 quota 和结算状态在同一事务中更新;日志以结算 operation key 去重,提交节点归属不会被后续轮询节点覆盖。
  • 任务轮询新增失败退款恢复扫描;Suno 响应按旧状态 CAS 更新,未知 task ID 会被忽略并记录,竞争失败的轮询实例不再继续执行计费。
  • 任务账单日志使用独立 BillingLogReceipt 表完成幂等声明和日志同事务写入,避免给高容量 logs 表增加唯一索引;receipt 通过随机 claim token 判断本次归属,不依赖 MySQL RowsAffected 的连接参数语义。
  • 用户/Token 缓存失效写入 CacheInvalidationTask;用户资料、OAuth 绑定、用户删除、Token 更新/删除及钱包/订阅结算会在同一数据库事务中登记任务,提交后由持久 runner 执行,成功处理时按 revision 删除,较旧 worker 不会误删更新后的任务。
  • 待处理的持久缓存失效任务同时构成读侧栅栏:任务未处理前不会命中或回填该用户/Token 的 Redis 缓存;签到、兑换码和直接用户额度调整也统一接入这一事务性失效路径。
  • Redis 限流返回错误、异常类型或非法判定时自动使用进程内同策略限流器,避免 Redis 短暂故障使登录、关键操作和全局 API 限流整体失效。
  • tiered billing 表达式和异步任务费率卡的运行时配置改为带读写锁的映射;管理员同步计价配置时不会与并发请求读取同一 Go map 发生数据竞争。
  • Realtime 连接会在关闭时终止 reader、Ping worker 和上下游 WebSocket;usage 累计与预扣序列化,避免异常断线长期占用 goroutine、上游连接或会话额度。
  • 渠道故障转移会在同一次普通中继或未锁定渠道的任务提交中记录已失败渠道,并在内存缓存与数据库选择路径中排除这些候选;优先级、权重、自动分组和新请求之间的选择语义保持不变。
  • 多密钥轮询索引在渠道缓存刷新时复用同一渠道锁进行读取和迁移,避免后台缓存重建与并发取 Key 使用不同锁访问同一状态。
  • max_tokens / max_completion_tokens 的解析收敛为共享规则,显式 0 在没有旧字段时仍会保留;AWS Nova、Baidu、Ollama、智谱、讯飞和阿里任务适配器也会保留客户端显式传入的 0 / false
  • 渠道多密钥操作在同一渠道锁内重新读取完整配置;无效渠道 ID 在建立锁之前拒绝,避免无效管理请求长期占用锁表条目。
  • 系统配置更新会在落库前拒绝 pointer-backed JSON 配置字段的 null,避免运行时配置被空值意外置空。
  • 状态码映射只接受规范的 100..599 源/目标状态码,拒绝 0429 等别名、重复规范化 key、null、非对象和越界值;运行时遇到无效配置会保持原状态码。
  • 通用异步任务和 Midjourney 返回现在复用统一状态码映射函数,同时保留原始上游状态用于任务重试分类。
  • 通用视频任务协议回写配置时保留未知厂商扩展字段,新增时间路径不会覆盖 vendor_extension 等自定义内容。
  • 前端 session verifier 合并并发 getSelf(),默认 30 秒内复用同一身份的验证结果;身份变化时会等待并重新验证,不应用旧用户的在途响应。
  • OpenAI Realtime 正式模型不再发送已废弃的 openai-beta: realtime=v1 / openai-beta.realtime-v1*-realtime-preview 模型继续保留旧协议兼容。
  • 模型定价抽屉将定价读取逻辑独立出来,系统设置异步到达后可正确回填固定价格/倍率/高级倍率;固定价格优先于残留倍率,并避免“同名新建”流程误删其他模型配置。
  • 模型固定价格和各类倍率在前后端统一要求有限且非负,拒绝负数、NaNInfinitynull 和非对象配置,避免产生负计费或静默写入无效 JSON。
  • 渠道模型多选不再只显示前 6 个标签,管理员可直接核对全部已选模型。
  • OAuth 已存在身份查询失败统一包装为安全业务错误,避免将数据库主机等内部细节返回给客户端。
  • 模型和供应商使用独立的非空 name_key 建立活跃名称唯一性;软删除时原子切换为记录专属保留键,使三种数据库都能阻止并发创建同名活跃记录,同时允许删除后重新使用原名称。
  • 模型元数据同步会同时校验供应商与模型数据源的 HTTP/业务结果,不再在供应商拉取失败时继续创建无归属模型;上游显式 status: 0 也会按禁用状态保留。
  • 系统 Option 写接口只接受已初始化注册表中的配置 key,并将 DataExportInterval 规范为 1..1440 分钟,避免任意配置落库和零/负间隔触发导出忙循环。
  • HTTPS ServerAddress 在未显式设置 SESSION_COOKIE_SECURE 时会自动启用 Secure cookie;显式环境变量仍保持最高优先级,纯 HTTP 部署继续兼容并输出风险日志。
  • 删除未被生产路径使用的旧 PreConsumeQuota / ReturnPreConsumedQuota 入口及重复 operation-key 命名空间,避免新代码绕开持久化幂等结算;同时移除需手工同步迁移列表的死代码 migrateDBFast()

Bug Fixes

  • 修复渠道 status_code_mapping 在编辑抽屉中填入后,保存时被表单转换遗漏,导致更新后内容消失且数据库字段未写入的问题。
  • 修复共享 JsonEditor 首次渲染已有 JSON 时可视行为空、切换“可视化/JSON”模式会回写空值,以及外部 value 更新后表格未同步的问题。
  • 修复异步任务提交和 Midjourney 接口未应用渠道状态码映射的问题。
  • 修复映射后的 5xx/429 可能改变原始任务错误的重试语义,进而把本应不可重试的非幂等提交再次发送到上游的问题。
  • 修复通用视频任务协议编辑后丢失 created_at_pathupdated_at_path 和未知扩展字段的问题。
  • 修复 AWS Bedrock 使用 context.Background() 导致客户端断开后仍继续调用上游的问题;无全局 Relay timeout 时也保留显式取消能力。
  • 修复 Redis 限流依赖异常时所有策略只记录日志后直接放行的问题;现在自动回退本机限流,而不会将 Redis 波动扩大为登录与关键接口防护失效。
  • 修复 SumUsedToken 使用 MySQL 专用 ifnull(),导致 PostgreSQL 日志统计查询报错的问题;现在使用三种数据库均支持的 COALESCE()
  • 修复 AWS Nova、Baidu、Ollama、智谱、讯飞和阿里任务请求在 JSON 重编码时丢失显式 0false 的问题;同时修复讯飞将 n 错写为 top_k,以及 max_completion_tokensmax_tokens 的优先级在渠道间不一致的问题。
  • 修复 Baidu access token 接口的非 2xx HTTP 响应仍按成功 JSON 解析的问题;修复 Cohere、PaLM、智谱流式客户端提前断开时 producer goroutine 可能阻塞泄漏的问题。
  • 修复 OpenAI Realtime 对异常网络断线没有读超时与心跳,造成上下游 WebSocket、worker 和预扣额度长期滞留的问题;并消除并发使用量累计的读写竞争。
  • 修复 Hailuo 任务在视频文件 URL 尚不可用时过早标记成功并结算的问题;修复即梦顶层错误响应没有立即进入失败/退款路径的问题。
  • 修复管理员并发启用、禁用或删除同一渠道多个密钥时,较旧 ChannelInfo 快照可能覆盖较新修改的问题。
  • 修复管理员一次提交 Token 重新启用和新过期时间/余额时仍按旧值拒绝的问题,并拒绝非法 Token 状态值。
  • 修复 MySQL/PostgreSQL 旧 subscription_plans.price_amount 类型迁移失败只记录日志后继续启动的问题;迁移现在在核心表创建后执行,并向上返回失败。
  • 修复 AWS Nova 在 guardrail 等场景返回空 content 时访问 Content[0] 引发 panic 的问题。
  • 修复讯飞 WebSocket 非 101 握手可能返回 nil 错误和 nil channel 并永久阻塞,以及未检查 Header.Code 导致上游业务错误被当作 200 成功的问题;读取、发送和客户端取消现在共享同一事件生命周期。
  • 修复 Vertex 渠道区域配置不是字符串时直接类型断言 panic 的问题;无效模型项会回退有效默认区域或 global
  • 修复模型价格/倍率允许负数或非有限数的问题,防止负计费增加余额或 Infinity 序列化为 null 后破坏配置。
  • 修复 Midjourney 图片代理只按可猜测的 mj_id 查询且无需身份凭据造成的跨用户读取问题;签名校验失败、过期或用户不匹配统一返回 403。
  • 修复账号删除只比较前端用户名、后端仅凭现有 session 即永久删号的问题;删除接口现在要求 account_delete 作用域的短期二次验证。
  • 修复 BillingSession、旧 post-consume 路径和异步任务在重复回调、并发 worker、进程中断或错误结果不明确时可能重复执行资金/Token 调整的问题。
  • 修复同一请求重放时可能因当前余额或订阅状态变化,从钱包切换到订阅或从订阅切换到钱包的问题。
  • 修复订阅退款被额度下限截断后,Token 仍按请求值全额回退而造成两个账本不一致的问题;现在使用资金侧实际应用的 signed delta 同步 Token。
  • 修复订阅重置后仍可能重放旧周期预扣/退款,以及相同 request ID 用不同用户、Token、模型或额度参数再次执行的问题。
  • 修复异步任务失败退款只依赖当次轮询,数据库或日志写入短暂失败后进入终态便不再恢复的问题。
  • 修复任务结算成功但账单日志/usage 写入失败后无法恢复,或并发恢复产生重复日志的问题。
  • 修复 Token 已删除时异步任务终态退款无法返还用户钱包/订阅额度的问题;终态退款允许跳过已不存在的 Token 镜像,但仍校验用户和资金来源。
  • 修复 Realtime 会话累计用量传参错误,导致后续 usage 未按累计目标正确预留和结算的问题。
  • 修复正式 OpenAI Realtime 模型仍携带 preview beta header,可能被新版上游拒绝的问题。
  • 修复前端“仅验证一次”的 session 标记在用户被封禁、会话过期或用户切换后仍可能继续信任旧状态的问题。
  • 修复认证 store 将完整用户对象写入 localStorage,以及登出/删号路径仍操作该持久缓存的问题。
  • 修复 User.Edit、邮箱/OAuth 绑定清理、GitHub 身份迁移和用户设置更新在数据库提交后才清理缓存,进程中断或 Redis 故障可能长期保留旧身份/分组/设置的问题;outbox 不可写时相关业务事务现在会整体回滚。
  • 修复软删除/硬删除用户与其 Token 缓存清理分散在 model/controller 两阶段执行的问题;用户删除、user cache 和该用户全部 Token cache 失效任务现在同事务提交,不再存在中途退出后遗漏 Token 失效的窗口。
  • 修复模型抽屉在系统定价设置尚未加载时初始化空字段,随后保存可能清除已有价格;同时修复同名模型创建流程误删既有价格配置的问题。
  • 修复 OAuth provider 身份回填查询失败时可能把底层数据库错误详情直接暴露给客户端的问题。
  • 修复 Gemini Chat/Image 在 io.ReadAll 失败路径未关闭上游响应体的问题;Baidu、Zhipu、Cohere 写客户端响应失败现在会记录错误而不再静默丢弃。
  • 修复 SQLite 日志库兜底分支错误修改主库类型标志的问题,并移除两套 AutoMigrate 列表长期漂移的维护隐患。
  • 修复 Stripe checkout 完成或异步支付成功事件在订阅/充值入账遇到临时数据库错误时仍返回 200、导致 Stripe 不再重试的问题;已完成订单、永久状态不匹配和并发完成事件仍会安全确认,避免重复入账。
  • 修复高等级订阅取消、替换或到期时,只要还有任意低等级活跃订阅就跳过用户分组回落的问题;现在只有仍授予当前相同分组的其他订阅才会保留该权限。
  • 修复渠道缓存刷新和多密钥轮询并发访问 MultiKeyPollingIndex 的数据竞争,以及故障转移可能反复选中本次请求中已经失败渠道的问题。
  • 修复 OpenAI、Replicate 和 Sora multipart 转发将客户端文件名直接拼入 Content-Disposition,可能破坏 part 头的问题;文件名现在通过标准媒体类型编码安全生成。
  • 修复 OpenAI 图片编辑仅按文件扩展名判断 MIME 类型的问题;图片和 mask 现在按实际内容识别并转发 JPEG、PNG 或 WebP,空文件和伪装内容会被拒绝。
  • 修复 Anthropic 格式 /v1/models 在可见模型列表为空时读取首尾元素导致 panic 的问题;空列表现在返回 data: []has_more: false
  • 修复模型/供应商原联合唯一索引无法在 MySQL、PostgreSQL 的 NULL deleted_at 语义下阻止并发同名创建的问题;同时阻止删除仍被模型引用的供应商,并让模型软删除中的保留键更新与删除动作同事务回滚。
  • 修复上游模型/供应商元数据拉取失败被静默吞掉,以及上游显式 status: 0 被当作未提供而回退启用的问题。
  • 修复表达式计费模型之间切换时编辑器只更新模型名、仍显示首次打开模型价格的问题;编辑器现在按所选模型的完整定价快照重建状态,并同步刷新输入/输出等表达式价格。

Compatibility Notes

  • 本版新增 billing_settlementsbilling_pre_consume_selectionsbilling_log_receiptscache_invalidation_tasks 四张表;subscription_pre_consume_records 新增 Token 和订阅重置周期绑定字段。SQLite、MySQL、PostgreSQL 部署均需先完成项目 AutoMigrate,生产升级前应在同版本数据副本上演练。
  • modelsvendors 新增非空 name_key 列和单列唯一索引,并移除原 (name, deleted_at) / (model_name, deleted_at) 联合唯一索引。迁移会保留 ID 最小的同名活跃记录作为名称占用者,其他历史重复记录改写为记录专属保留键;软删除后的名称可重新创建。生产升级前应先检查重复元数据并在三种数据库的同版本副本上演练。
  • MySQL/PostgreSQL 的既有 subscription_plans.price_amount 会在核心 schema 就绪后迁移为 decimal(10,6);元数据查询或 ALTER TABLE 失败会阻止启动,升级前应先在数据副本演练,不应依赖原先的仅日志告警行为。
  • 任务账单日志幂等信息写入小型 billing_log_receipts 表,不再修改 logs 表索引;独立日志库同样需要允许 AutoMigrate 创建该 receipt 表。receipt 会随幂等记录长期保留,未建立安全保留期前不要手工删除。
  • 结算和预扣幂等记录当前不会按固定 TTL 清理;这是为了覆盖长时间异步任务、延迟回调和重启恢复。请将相关表增长纳入数据库容量与归档监控,未建立安全保留期前不要手工清理。
  • 需要修改余额的兼容路径现在要求稳定 request_id;缺少 request ID 时会失败关闭,不再退回非幂等直接扣减。自定义 relay/插件若调用旧 PostConsumeQuota 路径,应确保整个请求生命周期复用同一 ID。
  • 2025-02-22 00:00:00 UTC 之前提交的旧失败任务仍按历史策略不自动退款;新恢复扫描只处理 cutoff 之后且仍有 quota 的失败任务。本版只修正注释和发布说明日期,不改变原有退款资格边界。
  • 状态码映射保存现在执行严格校验:key/value 必须是规范的 100..599 状态码。此前可保存但不规范的 0429、小数、越界值、null 或非对象配置需要先修正。
  • 模型固定价格及 prompt/completion/cache/ima...
Read more

v1.0.5-preview.2

Choose a tag to compare

@CSCITech CSCITech released this 25 Jul 19:20
ca4f604

Warning

v1.0.5-preview.2 为预览版本,重点是安全、计费一致性、缓存一致性、限流策略和管理端细节修复。升级前建议先在测试环境验证 OAuth 登录/绑定、系统访问令牌生成、用户/Token 缓存、BillingSession、quota_data 看板刷盘、登录/关键接口限流和渠道编辑器。

Note

本稿只描述 v1.0.5-preview.1 之后需要对外说明的变化。v1.0.5-preview.1 已经覆盖的 Playground 参数、DoubaoVideo/Seedance 差额结算、系统实例面板基础能力等内容不在这里重复;已有的 tiered pricing 表达式变量和可视化编辑能力也只按本轮安全/结构优化描述。

Release Notes

GitHub 地址

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

Highlights

  • 缓存一致性加固:用户缓存和 Token 缓存引入 Redis generation fence,DB 回填必须匹配当前版本;删除、禁用、额度变更和 Token 删除后的缓存失效增加有限重试,降低旧缓存继续授权或旧额度继续命中的风险。
  • 计费与看板一致性修复:BillingSession 对资金差额、Token 调整失败和部分补偿状态做更明确建模;quota_data 刷盘改为快照化、幂等聚合和失败重试,减少异常退出、重放或并发刷盘导致的重复/丢失。
  • 限流策略隔离与可观察性增强:全局 API、SPA 回退页、公共状态接口、关键操作和账号登录使用更明确的独立策略;Redis 限流改为原子滚动窗口,429 响应补齐重试信息,Redis 异常时采用有界超时、记录错误并放行请求,避免限流依赖故障放大为站点 500。
  • 账号与 OAuth 安全收口:OAuth 身份写入增加串行化和长度约束,身份占用查询错误会被显式处理;OAuth 回调只允许站内 redirect,绑定回调不再只依赖 window.opener 判断。
  • 系统访问令牌路径防回归:access-token-only 更新从通用 OAuth 身份锁路径中剥离,普通用户资料更新也不会再从旧快照回写 access_token,避免生成后的系统访问令牌被并发资料更新覆盖。
  • 管理端可用性修正:渠道编辑器、模型映射、Pricing 侧边筛选、系统实例清理、移动端表格和状态徽章继续修复长内容、状态同步和错误提示细节。

New Features

  • 新增 QUOTA_DATA_AGGREGATE_MIGRATION_ENABLED 环境开关,默认不自动整理历史大表,需要时可在低峰期单主节点手动开启。
  • 新增 Turnstile token header 传递方式:前端默认发送 X-Turnstile-Token,后端保留 query 参数兼容。

Improvements

  • tiered pricing 表达式编译缓存从整表清空改为有序淘汰,避免达到缓存上限时丢弃所有已编译表达式。
  • tiered pricing 的 header() / param() 改为正向白名单,只暴露定价所需的 provider feature header 和少量 request metadata path,避免表达式读取 prompt、工具定义、凭据或任意 payload。
  • tiered pricing 前端编辑器拆分为主编辑器、可视化阶梯编辑器和请求规则编辑器,降低单文件复杂度,并补充运行时测试。
  • BillingSession 结算失败后会区分已确认资金差额、部分补偿残差和补偿结果不明,后续重试不会盲目重复非幂等资金操作。
  • quota_data 启动迁移增加操作锁、心跳和释放重试,历史聚合键整理默认跳过并写入明确日志,避免多节点启动时抢跑重活。
  • 用户状态、角色、分组、设置、签到和 Token 额度等缓存相关路径统一向版本化失效模型收敛,Redis 短暂异常时保留可恢复窗口。
  • 全局 API、SPA HTML 回退、/api/status / /api/setup、关键操作聚合、关键路由和密码登录限流拆分独立策略;登录桶按规范化账号哈希,减少共享出口 IP 下不同账号相互挤占登录额度。
  • Redis 限流改为 Lua + 有序集合实现的原子滚动窗口;内存与 Redis 路径统一返回 Retry-AfterX-RateLimit-* 和结构化 rate_limit_exceeded 错误,前端查询不会再自动重试 429。
  • Redis 限流调用增加 500ms 有界超时和明确错误日志;Redis 不可用或返回异常时限流故障开放,避免缓存故障阻断正常请求。
  • OAuth provider 身份占用判断和绑定/注册错误处理更严格,数据库错误不会被当作“未占用”继续放行。
  • 登录、注册、邮箱验证和密码重置的 Turnstile 传参方式统一,后端 JSON 解析继续走项目 common.DecodeJson 包装。
  • 渠道编辑器拆分状态逻辑,渠道测试结果会更稳定地回写列表缓存;模型映射预检会拒绝非字符串目标模型。
  • Pricing 侧边栏、AUTO_GROUP/auto route 展示、渠道能力矩阵和长标签展示继续细化,减少管理员误读配置状态。
  • 系统实例批量清理流程改为统一 mutation/hook 和 query key 失效,批量操作期间会禁用刷新和单实例删除,减少重复提交。
  • DataTable、移动端卡片列表、StatusBadge 和表格 skeleton 支持更精细的 header/cell/mobile class,长模型名或长标签不再轻易撑破布局。
  • Footer 自定义 HTML 改用统一 HtmlContent 渲染;OAuth、支付和公共外链打开时补齐 noopener,noreferrer
  • handleServerError 在生产环境只展示安全业务信息,调试详情限制在开发环境输出。

Bug Fixes

  • 修复 access-token-only 用户更新可能被新增 OAuth 身份锁阻塞的问题,避免系统访问令牌生成受到邮箱/OAuth 身份写锁释放异常影响。
  • 修复普通用户资料更新会从旧快照默认复制 access_token,从而覆盖并发生成的新系统访问令牌的问题。
  • 修复用户资料更新可能把旧的 quota、used_quota、request_count 等账务字段写回数据库的问题。
  • 修复用户/Token 缓存缺少版本栅栏时,删除或失效后的旧 DB 快照仍可能异步回填 Redis 的问题。
  • 修复用户删除后缓存清理失败可能中断后续 Token 缓存失效的问题。
  • 修复用户状态/角色等管理操作只记录缓存失效失败、没有重试窗口的问题。
  • 修复 BillingSession 在资金结算成功但 Token 调整失败后可能留下资金、Token 和日志状态不一致的问题。
  • 修复 BillingSession 部分补偿返回残差或结果不明确时,后续自动重试可能重复执行资金补偿的问题。
  • 修复 quota dashboard 缓存刷盘失败静默丢失、重放同一快照可能重复累计、旧数据缺少聚合键时无法安全创建唯一索引的问题。
  • 修复静态资源请求消耗全局 Web 限流额度、公共状态接口与普通 API 共用同一桶、关键操作只使用单一聚合桶,以及 Redis 限流多命令并发竞态可能造成额度判断不准确的问题。
  • 修复 Redis 限流异常直接返回 500 或长时间阻塞请求、429 响应缺少可操作重试信息的问题。
  • 修复 OAuth 回调 redirect 可携带外部 URL、协议相对 URL 或非法路径导致跳转不受控的问题。
  • 修复 OAuth 绑定页在 noopener 或浏览器限制下可能被误判为登录回调的问题。
  • 修复 Turnstile token 混用 body/query 导致前后端保护接口口径不一致的问题。
  • 修复渠道模型映射预检忽略非字符串 target 的问题。
  • 修复长模型名、长渠道标签、多语言状态徽章和移动端表格内容在窄屏下溢出的问题。
  • 修复 OpenAI Responses/audio、Claude cache creation、Gemini thought/candidate/modality token、MiniMax TTS 和部分任务 usage 解析边界,降低实际计费与日志展示不一致风险。

Compatibility Notes

  • v1.0.5-preview.2 会新增或更新 quota_data 相关结构,包括 aggregate_key、snapshot marker、retry marker 和操作锁表;SQLite、MySQL、PostgreSQL 均应走项目迁移流程。
  • 历史 quota_data.aggregate_key 整理默认不会自动执行。需要整理旧大表时,请在低峰期、单主节点下显式设置 QUOTA_DATA_AGGREGATE_MIGRATION_ENABLED=true,并预留迁移时间。
  • Redis 用户/Token 缓存会新增 generation key;升级后旧缓存可自然过期,新读写路径会逐步按版本化规则刷新。
  • Token 缓存重试队列是进程内有限重试,不是跨进程持久队列;进程退出后未完成的缓存重试不会自动恢复。
  • tiered pricing 的 header() / param() 读取范围比 preview.1 更严格;若已有表达式依赖非白名单 header/path,需要改成受支持的定价 metadata。
  • X-Turnstile-Token 是新的前端默认传递方式;后端仍保留 ?turnstile= 查询参数兼容旧调用方。
  • OAuth 回调 redirect 现在只能是站内相对路径;外部 URL、//host 和非法路径会回退到 /dashboard
  • 新增 CRITICAL_ROUTE_RATE_LIMITCRITICAL_ROUTE_RATE_LIMIT_DURATIONLOGIN_RATE_LIMIT_ENABLELOGIN_RATE_LIMITLOGIN_RATE_LIMIT_DURATION 环境变量;默认分别为每路由 20 次/1200 秒、每账号 10 次/900 秒。关键路由桶仍受 CRITICAL_RATE_LIMIT_ENABLE 总开关控制,账号桶只用于密码登录并可独立关闭。
  • GLOBAL_WEB_RATE_LIMIT 现在只统计 SPA HTML 回退请求,不再统计已命中的静态资源;GET /api/statusGET /api/setup 使用独立的公共状态桶,但仍沿用 GLOBAL_API_RATE_LIMIT 及其 duration 配置。
  • Redis 限流 key 和存储结构已切换为按 policy 区分的有序集合,升级时旧计数不会延续到新桶并会按原 TTL 自然过期。Redis 限流故障现在会记录日志并放行请求;对安全边界要求更高的部署应同时监控 Redis 可用性和对应错误日志。
  • 429 响应现在返回结构化 JSON 及 Retry-AfterX-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-ResetX-RateLimit-Policy;自定义客户端应优先遵循 Retry-After,不要立即重试。
  • 发布前仍需要先执行 cd web/default && bun run build 生成前端产物,再重启 Go 进程;直接 go run main.go 不会自动重建嵌入资源。

Verification

  • 后端建议执行:go test ./...go vet ./...go run ./tools/jsonwrapcheck
  • 系统访问令牌生成入口新增锁隔离回归测试,验证该路径不会重新等待 OAuth 身份写锁。
  • 限流定向测试通过:go test ./middleware -run "Test(CriticalRateLimit|LoginRateLimit|RateLimitResponse|BootstrapStatus|RedisRateLimit)" -count=1,覆盖关键路由/聚合桶、账号登录桶、公共状态桶、429 元数据、Redis 原子并发和故障开放。
  • 定向后端验证应覆盖:Redis versioned hash、user cache、token cache、用户字段更新、access token 并发更新、BillingSession、tiered settle、quota_data snapshot/aggregate migration、OAuth lookup、Turnstile header。
  • 前端建议执行:cd web/default && bun run typecheckbun run i18n:sync,并对渠道编辑、Pricing、System Info、safe redirect、handle-server-error、StatusBadge 和 DataTable 相关文件做 ESLint / Prettier 定向检查。
  • 前端定向测试应覆盖:channel editor state/actions、model mapping guardrail、pricing sidebar、tiered pricing runtime、safe redirect、handle-server-error、status badge 和系统实例批量清理。
  • Seedance Fast 端到端验证通过:上游完成响应返回 usage.total_tokens=50638 后,通用 media.task 轮询链路能够进入 token 重算,并在测试费率下从预扣 ¥8.325000 调整为 ¥1.686244、退款 ¥6.638756。
  • 发布草稿写入后应使用 UTF-8 直接读回检查标题、链接、关键字和乱码;.tmp 文件为 gitignored,不依赖 git status / git diff 验收。
  • 变更空白检查建议执行:git diff --check

Full Changelog: v1.0.5-preview.1...v1.0.5-preview.2

v1.0.5-preview.1

Choose a tag to compare

@CSCITech CSCITech released this 23 Jul 15:02
24162dd

Warning

v1.0.5-preview.1 为预览版本,建议先在测试环境验证前端构建、渠道配置保存、异步任务轮询和计费日志后再用于生产。

Release Notes

GitHub 地址

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

Highlights

  • 本地前端构建完整性收口:修复完整仓库检出时根 .gitignore 的裸 home 规则误排除 web/default/src/features/home,导致 Tailwind 未生成首页桌面栅格 CSS、go run main.go 嵌入后宽屏首页仍显示单列的问题。
  • 构建产物增加回归守卫:前端构建会检查首页 Hero 桌面双列规则是否写入 CSS;缺失时 bun run buildbun run build:check 直接失败,避免本地构建与 Docker 构建产物出现静默差异。
  • 游乐场模型参数可视化配置:新增温度、Top P、频率惩罚、存在惩罚、最大 Token 和随机种子设置,让开发者可以在发送请求前直接调整生成行为。
  • Seedance / DoubaoVideo 任务计费可控化:完成态差额结算现在支持按 DoubaoVideo 渠道单独开关,兼容 Seedance 类上游按 usage.total_tokens 返回实际 token 的任务结果,同时允许运营侧在费率调整或上游结算策略不匹配时关闭差额补退。
  • 系统实例清理补齐:管理员控制台的 系统信息 -> 实例 增加删除所有离线实例操作,后端批量接口只清理超过离线判定阈值的实例记录,并返回实际删除数量。

New Features

  • 新增 Tailwind CSS 产物验证脚本,聚合检查已生成的 CSS 文件,并验证首页 Hero 的关键响应式栅格规则。
  • 游乐场输入区新增参数设置面板:桌面端使用 Popover,移动端使用底部 Sheet;参数开关数量通过工具栏角标显示。
  • 参数面板提供滑块和数字输入两类控件,并为每个参数显示当前值、范围和用途说明。
  • 管理员控制台的 DoubaoVideo 渠道编辑页新增 Video Task Billing 模块,可在高级设置中开启或关闭 Completion delta settlement
  • DoubaoVideo 渠道新增 disable_task_delta_settlement 设置项。默认保持完成态差额结算开启;仅当管理员显式关闭时,保存为渠道级关闭配置。
  • 异步任务提交时会记录差额结算开关快照,轮询完成后的结算按提交时的渠道策略执行,避免任务执行过程中渠道设置变化影响已提交任务。
  • 系统信息 -> 实例 新增 删除所有离线 按钮和确认弹窗;按钮仅在存在离线实例时展示,执行后自动刷新实例列表。
  • 新增 DELETE /api/system-info/stale-instances Root 管理接口,用于一次性删除所有超过心跳离线判定阈值的实例记录。

Improvements

  • 根忽略规则收窄为仅匹配仓库根目录的 /home,不再影响前端源码扫描。
  • Tailwind 入口显式纳入 features/home,即使上层工作区后续增加宽泛忽略规则,首页 utility 仍会进入构建产物。
  • 游乐场参数偏好会自动保存在浏览器本地,下次打开时继续使用上次配置。
  • 仅启用的参数会进入请求;显式 0 等有效值会保留,随机种子为空时不会发送 seed,避免把“未设置”误解为固定种子。
  • 参数输入会按控件范围和步进值规范化,降低负数、超范围值或小数精度对请求的影响;中、英、法、日、俄、越六种语言均补齐对应文案。
  • 通用 media.task 结果解析补充读取 usage.completion_tokensusage.total_tokens,Seedance 兼容接口返回实际 token 后可进入统一任务计费链路。
  • DoubaoVideo 差额结算开关在新轮询链路和旧视频任务更新链路中保持一致判定;非 DoubaoVideo 渠道会忽略该设置,避免误伤其他视频渠道。
  • DoubaoVideo 渠道编辑时会自动展开高级设置导航并展示视频任务计费入口,减少管理员找不到差额结算开关的情况。
  • 前端渠道设置表单在读取、保存和重新编辑时保持开关语义一致:关闭开关才写入 disable_task_delta_settlement: true,重新开启会移除该字段。
  • 系统实例删除流程改用 React Query mutation,并在删除成功后通过统一 query key 失效实例列表,避免组件内手动维护删除 loading 状态和成功后直接 refetch()
  • 系统实例批量删除期间会禁用刷新和单实例删除操作,避免管理员重复提交或在列表刷新中产生误操作。

Bug Fixes

  • 修复 Windows 本地构建中首页 JSX 已带响应式类名、CSS 却缺少对应规则的问题;Docker 与本地构建现在遵循同一首页扫描契约。
  • 修复俄语界面中 +{{count}} more mapping(s) 的映射计数文案不自然问题。
  • 修复 DoubaoVideo 渠道缺少前端差额结算配置入口的问题;管理员现在可在 渠道 -> 编辑 -> 高级设置 -> Video Task Billing 中直接调整。
  • 修复 Seedance 兼容任务结果中的 usage token 未被通用视频任务协议解析的问题,降低完成态无法按真实 token 调整计费的风险。
  • 修复完成态差额结算策略没有随任务提交持久化的问题,避免长时间异步任务在轮询完成时读取到与提交时不同的渠道策略。
  • 修复渠道模型映射预检会把非字符串目标模型强制转成字符串的问题;前端现在与保存 schema 一致,将数字、对象等非字符串映射目标标记为无效配置。
  • 修复通用视频任务 usage token 解析测试中 completion_tokenstotal_tokens 使用相同值的问题,避免错误的共享字段映射被测试漏过。
  • 修正法语、日语和俄语界面中的若干术语翻译,覆盖 Completion delta settlement、新建渠道 API Key 提示、订单完成、兼容 API 支持、embeddings 和 Seed 等文案。
  • 统一系统实例清理流程中的中文“离线”和日文「オフライン」术语,避免同一面板内批量删除与单实例删除使用不同表达。

Compatibility Notes

  • go run main.go 仍只嵌入已有的 web/default/dist。从源码启动前应先执行 cd web/default && bun run build,再重启 Go 进程;Docker 构建已自动执行此前端步骤。
  • 自定义前端构建若绕过 bun run build / bun run build:check,不会自动执行 CSS 产物守卫;发布流水线应继续使用项目脚本。
  • 游乐场参数沿用现有聊天补全请求字段,不新增数据库迁移;不支持某个参数的上游模型仍可能由上游接口返回参数校验错误。
  • DoubaoVideo 完成态差额结算默认仍为开启;关闭后任务会按提交时预扣/固定计费结果保留,不再按完成回调的 total_tokens 自动补扣或退款。
  • 旧任务记录没有提交时开关快照时,会回退读取当前 DoubaoVideo 渠道设置;升级后如需改变历史未完成任务的结算方式,应先评估该回退行为。
  • disable_task_delta_settlement 存储在渠道 settings JSON 中,不需要数据库迁移;该字段只对 DoubaoVideo 渠道生效。
  • Seedance 费率仍需在 ModelRatio / 任务计费配置中按实际上游成本单独校准;本版本提供结算开关和 usage 解析,不自动改写生产费率。
  • 批量删除离线实例只删除 last_seen_at 早于当前时间 SystemInstanceStaleAfterSeconds 的记录;在线实例和正好处于阈值边界的实例不会被删除。
  • DELETE /api/system-info/stale-instances 复用现有 system_instances 表,不新增数据库迁移;响应中的 deleted_count 仅用于管理端提示。

Verification

  • 前端构建输出 Tailwind build verification passed,确认新增产物守卫已执行。
  • 单独运行 node scripts/verify-tailwind-build.mjs,确认生成的 CSS 包含首页 Hero 桌面双列规则。
  • 从本地 Go 服务回读嵌入的 CSS,确认其包含同一桌面栅格规则。
  • Playground 定向测试:23 项通过,覆盖参数范围裁剪、seed 空值处理、显式零值发送和禁用参数过滤。
  • bun run typecheckbun run lint、定向 Prettier 检查及 bun run i18n:sync 通过。
  • DoubaoVideo 计费定向测试通过:go test ./service ./controller ./relay/channel/task/taskcommon ./relay/channel/task/doubao
  • 系统实例删除定向测试通过:go test ./model -run "TestDeleteStaleSystemInstance|TestDeleteStaleSystemInstances" -count=1
  • 系统实例面板定向前端验证通过:bun run typecheckbunx eslint src/features/system-info/components/system-instances-panel.tsx src/features/system-info/hooks/use-stale-instance-cleanup.ts、对应文件 Prettier 检查。
  • 通用视频任务 usage 解析定向测试通过:go test ./relay/channel/task/taskcommon -run TestParseConfiguredTaskResultReadsUsageTokens -count=1
  • 渠道编辑状态定向测试通过:bun test src/features/channels/components/drawers/channel-editor-state.test.ts
  • 后端全量验证通过:go test ./...go vet ./...go run ./tools/jsonwrapcheck
  • 前端表单与 i18n 验证通过:bun run typecheck、相关渠道编辑文件的 ESLint / Prettier 定向检查、bun run i18n:sync
  • 变更空白检查通过:git diff --check

Full Changelog: v1.0.4...v1.0.5-preview.1

v1.0.4

Choose a tag to compare

@CSCITech CSCITech released this 20 Jul 17:36
75ab64a

Important

Claude/Anthropic 流式输出 token 计费回归已修复。 v1.0.4 曾在 Claude/Anthropic 流结束时正确解析顶层 CompletionTokens,但生成最终 BillingUsage 快照时遗漏 OutputTokens,导致用量日志中的 completion_tokens 可能为 0,输出 token 也可能未进入实际结算。当前版本已补齐最终快照回填,并加入完整流式事件链回归测试。

该问题按响应处理器而不是模型名称划分:Anthropic 原生、AWS Bedrock Claude、Vertex Claude 模式、Advanced Custom Anthropic Messages,以及通过 /v1/messages 复用 Claude 流式处理器的兼容渠道都可能受影响。Claude 非流式请求以及原生 OpenAI Chat、OpenAI Responses、Gemini 路径未发现同类问题。

历史受影响请求无法仅凭本地 completion_tokens=0 恢复精确输出量,应优先结合上游 usage 或账单记录进行对账;根据响应文本重新分词只能作为估算。

额度并发与结算一致性已完成正式版加固。 发布前复核确认并修复了用户/token 额度在 Redis 与数据库之间异步更新、并发扣减缺少余额条件、邀请奖励全字段覆盖,以及资金结算成功但 token 调整失败后被错误标记为已完成等问题。额度扣减现在以数据库条件写为最终判定;旧版预扣路径会在同一数据库事务中同时扣减用户与 token;Redis 通过共享单调代次、条件回填、实体删除清理和持续失效重试阻断旧快照或已撤销 token;结算会分别处理已确认的部分补偿与结果不明的补偿错误,后者不会自动重复非幂等资金操作。

v1.0.4 涉及计费结算、分阶段计费、GPT-5.6 缓存写入、异步任务、Responses 兼容、安全验证、数据库迁移和项目授权说明等关键变化。升级前建议在测试环境核对常用模型、缓存创建价格、任务类渠道、用户额度、反向代理和 access token 相关流程,并阅读最新版 README 中的授权要求。

生产数据库提醒:正式环境不建议使用 SQLite。 SQLite 仅适合本地体验、开发和小规模测试;并发请求、多实例部署、大量日志与用量数据、数据库迁移、备份恢复和长事务可能引发锁等待、写入阻塞、迁移耗时或失败,以及可用性和数据维护问题。正式环境请使用 MySQL ≥ 5.7.8 或 PostgreSQL ≥ 9.6,并配置可靠的备份与恢复方案。

Note

本正式版草稿汇总 v1.0.4-preview.1 至 v1.0.4-preview.4 的主要更新,并补充正式发布前确认的授权政策、前端体验更新和 Claude/Anthropic 流式计费关键修复。

MAX API V1.0.4 Release Notes

GitHub 地址

https://github.com/MAX-API-Next/MAX-API/releases/tag/v1.0.4

在这里插入图片描述

Highlights

  • Responses 跨协议兼容全面增强:完善 OpenAI Responses 与 Chat Completions 双向转换,覆盖普通响应、流式事件、工具调用、reasoning、usage 聚合,并新增 Gemini Responses 与 Advanced Custom 转换能力。
  • 计费精度与表达能力升级:引入语义化 BillingUsagetiered_expr 分阶段计费和统一 quota 转换策略,扩展 OpenAI、Claude、Gemini 的缓存、图片、音频、reasoning 等细分用量,并补齐 GPT-5.6 cache_write_tokens 的跨协议结算以及 Claude/Anthropic 流式输出 token 的最终快照映射。
  • 额度与结算并发安全补强:用户和 token 扣减改为数据库条件写,旧版预扣路径改为同库事务,Redis 使用跨节点单调版本栅栏拒绝旧快照回填,并为 token 撤销增加去重、指数退避和缓存 TTL 截止边界;BillingSession 分开处理已确认的部分补偿与结果不明的资金操作,避免自动重放非幂等补偿。
  • 配置、缓存与身份约束继续收口:分组倍率注册配置与旧 GroupRatio 入口共享同一运行时 RWMap;指针型配置会在原对象上安全更新,坏 JSON 不会污染现值;用户缓存失效/删除、token 缓存删除、quota_data 聚合键和 OAuth 身份唯一性都有更明确的迁移与重试边界。
  • 异步任务进入通用计费阶段:新增任务 rate card 与通用计费框架,可按时长、分辨率、音频、媒体输入、图片数量和最终请求体进行预扣费与结算。
  • 视频与多模态任务能力扩展:集中完善 Doubao Seedance、Ali/Kling/Wan、Gemini、Vertex、Vidu、Hailuo、Jimeng、Sora 等任务渠道的请求透传、动态计费、轮询和结果解析。
  • 渠道与自动路由管理升级:支持 autoauto:fastauto:cheap 等多条具名自动链路,并优化渠道抽屉、模型/分组倍率编辑、模型广场链路展示和 OAuth 回调配置提示。
  • 账户敏感操作进一步加固:access token 改为 POST 生成并接入二次验证、禁缓存和双重限流;验证状态绑定当前用户,并支持 Passkey、2FA 或限定作用域的密码验证。
  • 生产运行可靠性提升:完善优雅关闭、流式连接保护、Redis 原子更新、多节点任务归因、日志审计以及 SQLite、MySQL、PostgreSQL 老库兼容。
  • 二次开发与授权说明完善:多语言 README 新增项目来源/社区鸣谢要求及临时商用授权说明,同时明确 One API MIT、New API AGPLv3 和本项目 AGPLv3 等既有开源义务仍需分别遵守。

New Features

  • 新增 service/openaicompat 兼容层和 Gemini Responses adaptor,支持 Responses 请求接入 Chat Completions 或 Gemini 上游。
  • 新增 dto.BillingUsage 协议用量快照,并在 InputTokenDetails 中支持 cache_write_tokens,为格式转换后的原始协议语义、缓存写入量及 Claude/Anthropic 流式输出量结算提供统一载体。
  • 新增 tiered_expr 分阶段计费及可视化/表达式编辑能力,可按上下文长度、输入输出、缓存、图片、音频、请求参数、header 和时间条件组合价格规则。
  • 新增通用任务请求构造、路径配置、结果解析和 rate card 计费模块;Pass Through Body、模型映射与 Param Override 可组合使用。
  • 豆包 Seedance 2.0 支持官方 content[] 请求及 safety_identifierprioritygenerate_audioratioresolution 等参数,并按分辨率和视频输入动态计费。
  • 新增多自动链路配置,每条链路可独立设置名称、启用状态、用户可见性和真实分组顺序。
  • 用量聚合新增分组、令牌、渠道和节点维度,并补充 retry、empty retry、quota 区间等筛选能力。
  • 管理端新增订阅重置、安全验证方式发现、OAuth 回调提示和更完整的渠道高级设置入口。
  • Dashboard 新增运行状态摘要、真实加载失败提示和失败项重试入口,密钥、可用模型、额度与请求量状态更容易确认。
  • 前端新增统一的安全富文本渲染链路,并为新增设置、日志、订阅和计费能力补齐多语言文案。

Major Improvements

  • 任务提交会先生成最终上游请求,再执行计费;Param Override 修改后的时长、尺寸、媒体输入和 header 会同时作用于实际请求与费用计算。
  • Playground 改善模型与分组选项恢复、聊天历史清理、选区处理、长文本输入和窄屏布局;auto / auto:* 自动链路会从用户完整模型集合加载选项,避免使用虚拟分组过滤后得到空列表。
  • 服务关闭时会等待在途请求完成,超时后主动关闭连接,再执行 quota cache 落库与退出清理,降低重启期间的流式中断和数据丢失风险。
  • 渠道表单、倍率编辑器和自动路由展示进一步统一校验与状态管理,复杂配置更易维护,也减少旧字段残留。
  • 配置加载和导出路径进一步统一:group_ratio_setting.group_ratio 与旧 GroupRatio 指向同一运行时倍率表,UpdateConfigFromMap 会原地更新指针型子配置,坏 JSON 会在校验失败后返回错误且不污染现有 RWMap
  • 用户、token、订阅和兑换码的局部更新加强零值与并发保护;额度列升级为 bigint,管理端操作保持在 JavaScript 安全整数范围内。
  • Redis 通用计数增量继续通过 Lua 保留 TTL 语义;用户/token 可用额度不再依赖 Redis 增量,而是以数据库条件更新为最终结果,并通过版本化失效重建缓存。用量日志和异步任务结算同时增强写入、回填与多节点归因。
  • GPT-5.6 cache_write_tokens 可在 Responses 非流式、流式、compact 和 Responses/Chat 转换中完整保留;结算时归一为缓存创建 token,并写入用量日志便于对账。
  • 前端数据表改为按实际容器宽度切换桌面/移动布局,移动端支持批量操作;公共头部集中收纳 GitHub、语言和主题工具,并补充更多无障碍与多语言状态提示。
  • 上游协议兼容性进一步扩展,完善 Claude/Gemini 工具调用、Ollama 非流式 tool_calls 和 Wan2.7 图生视频 input.media 等请求响应格式。
  • 上游错误响应、流式扫描、SSE ping、任务轮询和回调结算得到集中优化,异常请求对内存、连接和后台任务的影响更可控。
  • 控制台与管理接口的全局 API 限流默认值由 180 秒内 180 次提升为 180 秒内 720 次,为管理端并发加载和连续操作保留更多余量;该调整只覆盖 /api/* 及旧版 Dashboard 账单接口,模型中继 /v1/*、Gemini /v1beta/* 继续使用独立的模型请求限流。
  • 管理端渠道测试补齐响应时间反馈:直接测试按钮与测试弹窗都会显示测试耗时,并把最新 response_time / test_time 同步回渠道列表,便于管理员即时判断上游连通性和延迟。
  • 模型定价图形化编辑器现在会区分保存快照与草稿快照;删除已保存模型时不会再被旧保存值回填,删除动作会立即从图形列表中生效,待保存后再落到配置。
  • 用户/token 额度更新不再进入延迟批量落库路径;普通 token 通过 remain_quota >= amount 条件保护并发下界,无限额度 token 继续保留原有不受余额限制的使用语义。
  • Token 的 remain_quota / used_quota 与用户额度统一为 64 位整数,并为 MySQL、PostgreSQL 老库补充 bigint NOT NULL DEFAULT 0 迁移;SQLite 继续使用兼容的类型亲和性与 AutoMigrate 路径。
  • 数据看板 quota 缓存改为锁内快照、锁外落库;每批聚合数据会携带稳定快照 ID,并在 quota_data_snapshots 中与累计更新同事务去重。数据库失败会保留原快照 ID 重新入队,提交结果不明确时重复执行也不会再次累加;看板刷盘和聚合键迁移现在共用跨数据库 operation lock,并使用短租约 heartbeat 持续续租,避免启动迁移扫描后被并发写入覆盖。
  • quota_data.aggregate_key 迁移改为在保留唯一索引约束的前提下清理 stale key、合并旧 NULL/空聚合键记录、删除重复行并回填 survivor;迁移使用有界批量扫描、bigint scratch 表和跨库 set-based apply,后续 upsert 会命中迁移后的累计行,避免同一统计维度拆出并行记录。
  • 看板 flush 现在贯穿调用方 context 与截止时间:关机保存不再仅停止等待一个仍在后台运行的 goroutine,本地 flush 串行锁、数据库 operation lock 获取和单条持久化事务都会响应取消;截止时间到达时,已摘取 snapshot 会在函数返回前按原 SnapshotID 重入队。单条持久化失败也会在保留失败项重试的同时向调用方返回非空错误,不再把“仅存在于内存中的待重试数据”报告为保存成功。
  • quota_data_operation_locks 的创建、过期抢占和 heartbeat 续租统一使用数据库服务器时钟,并在同一 SQL 语句中计算当前时间与新过期时间;SQLite 使用 strftime、MySQL 使用 UNIX_TIMESTAMP()、PostgreSQL 使用 CURRENT_TIMESTAMP,避免多节点主机时钟偏差导致仍有效的租约被提前抢占。
  • tiered_expr 编译缓存达到上限时只淘汰最早条目,不再全量清空;订阅资金源也改为严格使用调用方传入的预扣额度。
  • 用户/token 缓存回填增加 Redis 共享单调 generation 与 WATCH 条件写;用户 group、status、role、name、setting 等窄字段也会在 DB 查询前捕获 generation。实体删除会同时清理 hash 与专属版本键;token 撤销删除失败后会按 HMAC 缓存键去重并在缓存 TTL 窗口内指数退避重试,执行中的旧任务也不能吞掉同一 token 的新删除请求。
  • 用户设置保存、用户删除和 token 撤销的 Redis 缓存处理共用有界重试语义;用户删除的数据库事务已提交后,缓存删除失败会写入日志并登记删除重试,不再把已完成的删除操作返回为失败。
  • 有限额度 token 的信任判断统一读取 Gin 中的 int64 上下文值,避免 64 位额度升级后被误读为 0 并触发错误预扣。

Stability and Security

  • 管理端模型拉取统一执行 SSRF 校验,默认可信代理范围收紧为 loopback,并加强真实客户端 IP 与关键验证接口的限流边界。
  • 注册、邮箱绑定、充值回调和通知邮箱统一采用更严格的邮箱规范化与唯一性检查;验证码和密码重置流程强化一次性使用与并发占用语义。
  • 富文本和 HTML 内容统一经过 sanitizer,公告、首页、关于页、法律文档等用户可见内容采用一致的安全渲染策略。
  • MySQL 命名锁、老库字段迁移及 SQLite/PostgreSQL 差异路径得到补强,root 用户删除保护下沉到 model 层。
  • 计费、日志审计和用户更新路径增加边界保护,降低异常数据、旧快照或极端额度对账务字段的影响。
  • 渠道测试成功和失败提示统一携带渠道/模型上下文,多语言界面会明确区分“测试失败”和“未执行/未完成”状态;失败场景会保留上游错误码与错误摘要,减少管理员排查连接问题时的二次定位成本。
  • 自定义 Footer HTML 复用统一 sanitizer,OAuth 登录回跳只接受同源站内路径;外部支付、预览和 OAuth 绑定窗口统一隔离 window.opener,并通过短时 OAuth state 标记维持绑定流程。
  • Turnstile token 改由 X-Turnstile-Token 请求头传递,避免进入 URL、浏览器历史和常规 query 日志;后端暂时保留 query 回退以兼容旧客户端。
  • 浏览器端价格预估移除 new Function,改用受限表达式解释器;服务端 header() / param() 改用正向白名单,只开放明确的计价元数据,并拒绝整个请求、GJSON 查询/修饰符/通配符、未知 body 根和伪装认证 header。
  • Setup 完成状态不再永久写入 localStorage,后端重置后刷新页面即可重新进入初始化流程;流式 Playground 状态改为响应式 state,未收到 [DONE] 时即使 SSE 已关闭也会进入错误收尾,生产错误处理不再输出包含请求头的完整 Axios 对象。
  • GitHub、Discord、OIDC、WeChat、Telegram 和 Linux DO 身份占用检查改为“存在任意匹配即占用”;即使老库中已经存在重复 OAuth 标识,也不会因为匹配行数大于 1 而错误放行新的绑定。唯一性查询的数据库错误会写入服务端日志,公开登录/绑定响应只返回本地化通用错误,不再暴露连接地址、表名或驱动信息。
  • OAuth 身份唯一性现在同时由数据库迁移层兜底:启动时会把空字符串归一为 NULL,清理重复 GitHub、Discord、OIDC、WeChat、Telegram 和 LinuxDO 标识,并在支持的数据库上建立非空唯一约束,减少检查通过后并发写入重复身份的窗口。
  • Redis 缓存失效/删除失败会进入带截止时间的进程内重试,并在到期后写入终态日志;用户删除已提交后,缓存删除失败只登记重试,不再把已完成的数据库删除包装成接口失败。
  • 清理了 token 与用户缓存中已无调用的逐字段写入 helper,包括旧 token hash 字段写入入口和用户 group/role/email/name/setting/status setter;当前保留的窄字段回填均继续走 version fence,降低后续误接回旧 Redis 写法的风险。

Critical Fixes

  • P0 — 修复 Claude/Anthropic 流式输出 token 未进入日志与结算:最终构造 Claude BillingUsage 时,会在上游快照缺少输出量的情况下,从已解析的 CompletionTokens 回填 ClaudeUsage.OutputTokens;若上游已提供非零 OutputTokens,则继续保留上游原值。
  • 覆盖范围:所有最终由 Claude 流式响应处理器完成 usage 快照的请求,包括 Anthropic、AWS Bedrock Claude、Vertex Claude 模式、Advanced Custom Anthropic Messages,以及部分通过 Claude 协议接入的 Ali、DeepSeek、Moonshot、MiniMax、VolcEngine、Zhipu 等兼容路径。模型名称本身不是判断依据。
  • 其他模型核查:Claude 非流式、OpenAI Chat、OpenAI Responses、Chat/Responses 双向转换、Gemini 原生流式/非流式及 Gemini 本地 usage 估算路径未发现同类问题。
  • 历史对账:修复前已产生的异常日志无法仅凭本地 completion_tokens=0 恢复精确输出量,应优先使用上游 usage/账单记录;根据响应文本重新分词只能作为估算。
  • HIGH — 修复并发扣减突破余额下界:用户和普通 token 的扣减在同一条更新语句中校验剩余额度,只有实际更新一行才视为成功;并发请求不能再同时通过旧余额检查后把额度打成负数。
  • HIGH — 修复 Redis/DB 更新顺序、旧快照回填与结算部分失败:额度变更先提交数据库,再以共享单调 generation 原子推进并失效缓存;旧 DB 读取只能在 generation 未变化时写回。BillingSession 的 token 调整失败时会尝试反向补偿:返回成功但仅部分应用时记录已确认残差,并在再次调整 token 前补齐;补偿调用报错时视为结果不明,不采用返回额度推断结果,也不会自动再次调用同一笔非幂等补偿。
  • 持续失败边界:单次结算最多尝试 3 次。若 token 对账仍失败,错误会继续返回并写入结算错误日志;补偿结果不明时后续只允许 token 对账重试,不能视为资金已自动恢复完成。运维侧仍需依据 user/token/request 标识和上游账单人工对账。
  • HIGH — 修复 token 撤销后旧缓存继续鉴权:单个和批量删除会在数据库提交后同步登记缓存删除任务;Redis 长故障不再于 350ms 后放弃,而是在缓存 TTL 窗口内按缓存键去重、指数退避并持续重试,到期仍失败会写入终态日志并清理队列。任务代次会阻止执行中的旧成功结果覆盖后到的新删除请求。
  • HIGH — 修复预扣失败遗留 token 扣减:旧版钱包预扣不再先扣 token、再依赖失败后补偿;用户额度与 token 额度在同一数据库事务中执行条件扣减,任一步骤失败都会整体回滚。
  • HIGH — 修复数据看板快照重试重复累计:新增持久化快照去重记录,快照登记与 quota_data 累计更新在同一事务中完成;数据库已提交但客户端收到错误时,携带同一快照 ID 的重试不会再次增加 count、quota 或 token_used。
  • HIGH — 修复邀请奖励覆盖并发字段:邀请次数、可转额度和历史额度改为原子增量,不再用旧用户快照覆盖 quota、status、role 等并发修改。
  • HIGH — 修复配置别名与指针配置更新脱节group_ratio_setting.group_ratio 不再在旧入口更新后提前返回,注册配置导出和运行时倍率读取会保持一致;指针型配置优先复用已有 UnmarshalJSON 对象,避免替换掉被其他包持有的运行时实例。
  • HIGH — 修复旧 quota_data 聚合键迁移后重复建行与迁移竞态:迁移会在保持正式唯一索引在线时清理 stale key、合并同维度历史行、回填 aggregate_key 并删除重复记录;跨实例迁移和看板刷盘通过数据库 operation lock 串行化,短租约由 heartbeat 全程续租,失去 owner 会中止后续写入,避免全局 scratch 表互相覆盖,或用旧扫描汇总覆盖迁移期间的新 quota 写入。
  • **HIGH — 修复关机 quota flush 超时后 snapshot 滞留后台 goro...
Read more

v1.0.4-preview.5

Choose a tag to compare

@CSCITech CSCITech released this 15 Jul 18:55
5c88bc9

Warning

v1.0.4 正式版发布继续阻断

正式发布前进一步核查发现,Claude Messages、OpenAI Responses、Gemini、Realtime、OpenAI 音频和 MiniMax TTS 的 usage 归一化与最终结算存在多类同源缺陷,可能导致输出 token、缓存、图片、音频或精确字符用量未进入日志、普通倍率计费或 tiered_expr 结算。由于这些问题直接影响账务准确性,v1.0.4 暂不进入正式版,先发布 v1.0.4-preview.5 完成验证。

本预览版同时合并原计划进入 v1.0.5-preview.1 的 Dashboard、统一表格、移动导航、系统设置、渠道编辑、Tiered Billing、Ollama 模型管理、Playground、多语言和 README 更新,避免已确认修复继续滞留在下一版本分支。

升级前请在测试环境重点核对 Claude/Anthropic 流式输出、Responses 多模态 usage、Gemini 图片/音频生成、Realtime 音频表达式、TTS/STT、MiniMax 字符计费,以及移动端表格、Dashboard、系统设置、渠道编辑和 Playground 自动分组。

Important

修复前已经产生的异常日志无法始终仅凭本地记录恢复精确用量。Claude completion_tokens=0、丢失的 Responses modality 明细或异常 Gemini fallback 应优先结合上游 usage、供应商账单和原始响应进行对账;根据响应文本或媒体数量重新估算只能作为辅助依据。

Note

v1.0.4-preview.5 是正式版前的计费阻断修复与前端体验集中验证版本。该版本没有新增数据库迁移,但会改变部分模型在异常 usage、音频路由和分阶段计费下的最终结算结果;发布前请以最终 tag、构建产物、上游官方价格和实际部署验证结果为准。

Release Notes

GitHub 地址

https://github.com/MAX-API-Next/MAX-API/releases/tag/v1.0.4-preview.5

Highlights

  • 多协议 usage 与实际结算完成系统性补强:修复 Claude、Responses、Gemini、Realtime、TTS/STT 和 MiniMax 在最终 usage、BillingUsage 或细分 token 归一化中的缺口。
  • Claude/Anthropic 流式输出恢复完整message_delta 缺少 output_tokens 时会从累计 CompletionTokens 回填,并同步写回客户端 JSON;上游已有非零值继续优先保留。
  • Responses 多模态明细完整保留:非流式、流式和 Compact 统一复制缓存创建、文本、图片、音频及 reasoning 等输入输出明细,并支持官方 output_tokens_details
  • Gemini fallback 支持混合模态:候选总量为零时可同时恢复 reasoning、文本、图片和音频明细,保留上游已有 modality 数据,并避免把流式 audio/* inline data 错算成图片。
  • Realtime 与音频计费语义对齐:Realtime tiered_expr 可读取 craiao,OpenAI TTS/STT 会归一化音频明细,Responses 音频路由覆盖 gpt-4o-audio*gpt-4o-mini-audio*gpt-audio* 和带音频 usage 的模型别名。
  • MiniMax TTS 使用精确字符用量:上游 usage_characters 会直接进入输入 token、日志和倍率结算,缺失时才回退本地估算。
  • Dashboard 首页由固定装饰横幅升级为真实运营摘要,集中展示请求、额度、模型与密钥状态,让异常和风险更容易在首屏识别。
  • 统一 DataTable 改为根据内容容器宽度切换布局,不再只依赖浏览器视口;移动端支持行选择、批量操作和更安全的长内容展示。
  • 应用端与公开页面 Header 完善响应式导航,将语言、主题、配置和 GitHub 等低频入口收进紧凑工具菜单,并保留移动端通知入口。
  • 全局查询错误策略完成收敛:Dashboard、API Key、模型等普通请求失败时保留当前页面、筛选和操作上下文,通过局部错误状态提供重试,不再因任意 HTTP 500 直接跳转 /500
  • 设置页增加结构化加载骨架、局部错误恢复和更完整的表单语义,Switch 标签、说明、错误信息与禁用状态可被键盘和辅助技术正确识别。
  • 修复公开首页 Hero 在窄屏下横向扩展和内容裁切的问题,390px 等移动视口下页面宽度保持在可视区域内。
  • 修复 Playground 选择 autoauto:* 模型分组后无法选择模型的问题,自动分组现在会正确加载用户模型集合。
  • 渠道编辑、Param Override 和 Tiered Billing 等大型交互模块完成分层整理,并补齐异步状态、表单关联和关键工具函数测试,降低后续维护与回归风险。
  • 法语、日语、俄语和越南语翻译继续补齐,修复日语插值与越南语 Tiered Billing 文案,并完善相关屏幕阅读器文本。
  • 六种公开 README 语言新增二次开发、社区鸣谢和授权边界说明,进一步明确 AGPLv3、临时商用授权及上游项目许可之间的关系。

Critical Billing Fixes

  • P0 — Claude message_delta 输出 token 清零:最终事件或上游快照缺少 OutputTokens 时,从已累计的 CompletionTokens 恢复;修复值同时进入 BillingUsage、日志、结算和客户端 usage.output_tokens
  • P1 — OpenAI Responses 丢失多模态 usage:非流式、流式和 Compact 不再只保留总量与部分缓存字段,输入侧 cached_creation_tokens、text/image/audio 和输出侧 reasoning/text/image/audio 明细均可进入内部结算。
  • P1 — Gemini fallback 覆盖或漏算 modality 明细:fallback 改为按候选 token 而非包含 reasoning 的 completion 判断;原始缓存、工具和 modality metadata 会被保留,图片估算写入 ImageTokens
  • P1 — Gemini 混合文本与图片只记录一种输出:文本估算和 imageCount * 1400 可同时进入候选总量与 CandidatesTokensDetails;已有非零 IMAGE/AUDIO/TEXT 明细不会被本地估算覆盖。
  • P1 — Gemini 流式音频误判为图片:inline data 仅在 MIME 为 image/* 时计入图片数量,audio/* 不再产生错误的 1400 图片 token。
  • P1 — Realtime tiered_expr 缺少音频和缓存变量:结算参数现包含缓存读取、音频输入与音频输出,并继续按表达式实际使用的变量从基础 p/c 中自动排除,避免重复或遗漏计费。
  • P1 — OpenAI TTS/STT usage 和音频路由不完整:流式 TTS 与 STT 的 input_tokens_details / output_tokens_details 会映射到统一 usage;Responses 可按模型家族或实际音频明细进入音频结算。
  • P2 — MiniMax 精确字符数未参与结算usage_characters 现在作为 PromptTokensTotalTokens 和文本明细参与日志及倍率结算;生产代码统一使用项目 JSON wrapper。
  • 视频任务核查:未发现 Claude 式最终 usage 快照清零问题;按次任务保留预扣额度,其他任务仍依次使用 adaptor 实际额度、TotalTokens 重算或原预扣额度。

New Features

  • 统一表格新增容器宽度响应能力,可在侧栏展开或内容区变窄时自动切换为移动卡片布局。
  • 移动表格新增可配置的行选择与批量操作支持,并允许列通过元数据定义移动端标题、内容布局和换行策略。
  • 新增 Header 工具菜单,统一承载语言切换、主题切换、界面配置和 GitHub 等入口,减少窄屏顶部空间占用。
  • Dashboard 新增运营状态摘要和查询状态工具,支持独立处理加载、成功、空数据与失败重试状态。
  • 设置页新增结构化 Skeleton 和局部错误恢复入口,加载或请求失败时仍保持稳定页面几何。
  • Param Override 新增专用编辑器工具函数与测试,强化特殊字段类型、空键和同步字段的状态处理。
  • Tiered Billing 编辑器补充本地化 token 提示、价格字段辅助组件和计算工具测试。
  • README 新增多语言二次开发与社区鸣谢说明,公开自用二开项目适用的显示条件、临时授权范围和上游许可边界。

Improvements

  • 统一 Responses usage 复制入口,避免非流式、流式和 Compact 在新增 token 明细时再次发生字段漂移。
  • Gemini 候选 token 恢复改为汇总 TEXT、IMAGE、AUDIO 明细,并将 reasoning 独立计入 completion;原始 BillingUsage metadata 在估算过程中保持可追溯。
  • Gemini 流式和非流式图片识别共用严格 MIME 判断,减少不同 handler 对同一媒体类型产生不同结算语义。
  • Realtime 通过统一 BuildTieredTokenParams 进入分阶段结算,缓存与音频变量遵循和文本请求相同的自动排除规则。
  • OpenAI 音频接口通过统一归一化函数映射总量和细分 usage,降低 TTS/STT、流式/非流式之间的分支差异。
  • DataTable 的桌面/移动判断从 viewport media query 调整为容器尺寸观察,侧栏、抽屉和中等宽度内容区中的表格更符合实际可用空间。
  • 表格单元格不再依赖全局强制不换行;模型名、标签和其他长内容可按列契约换行,减少横向撑宽和内容裁切。
  • 移动卡片列表完善选择状态、操作区和字段展示,分页与批量操作在窄屏下保持可用。
  • 公开 Header 和应用 Header 统一移动端导航逻辑,语言、主题、配置、GitHub 与通知入口在不同断点下保持一致。
  • 移动菜单在切换回桌面布局时会主动清理页面滚动锁,避免响应式切换后页面仍无法滚动。
  • Dashboard 概览信息改用当前主题的语义色和现有卡片体系,减少固定深色、装饰网格和静态文案对首屏空间的占用。
  • Dashboard 查询状态改由明确的辅助函数描述,替代复杂嵌套条件,加载、失败和局部数据状态更容易维护。
  • 系统设置 Switch 行补齐 id、Label 关联、aria-describedby、错误提示和禁用原因,点击标签和键盘操作更加可靠。
  • 设置页面在加载、失败和恢复过程中保留主要布局结构,减少内容跳动和整页空白。
  • Ollama 模型对话框会取消过期请求、隔离不同渠道的异步响应,并在切换渠道或重新打开时重置删除状态。
  • Param Override 专用编辑器拆分为更清晰的字段组件;输入 Label 与控件建立关联,sync_fields 在键为空时仍保留已选类型。
  • 渠道编辑抽屉的导航、表单状态和转换逻辑进一步分离,减少大型组件内部的隐式状态耦合。
  • Tiered Billing 编辑器将字段、辅助展示和计算逻辑分层,保留原有配置契约并改善后续扩展与测试能力。
  • Markdown、分页、对话框、菜单、侧栏、Spinner 等共享组件统一部分可访问性和样式细节。
  • 修正多个无效的 text-xsst 样式类和零散的响应式样式问题,避免构建后样式静默失效。
  • 多语言同步报告更新,减少法语、日语、俄语和越南语中直接回退英文的新增文案。
  • Dashboard 查询工具测试改用 TypeScript 与 CI 均可识别的测试方式,避免 bun:test 类型声明导致 GitHub Frontend checks 失败。
  • 六种 README 的项目定位、二次开发说明和授权表述保持同步,明确临时授权只覆盖项目方有权授权的新增与修改部分。

Bug Fixes

  • 修复 Claude 流式最终快照和 message_delta JSON 未携带累计输出 token,导致日志、结算或客户端 usage 中 output_tokens=0 的问题。
  • 修复 Responses 重新构造 usage 时丢失缓存创建、图片、音频、文本及输出 reasoning 明细的问题。
  • 修复 Responses DTO 未接收官方 output_tokens_details,导致部分输出明细在反序列化阶段消失的问题。
  • 修复 Gemini 仅因 reasoning 非零就跳过候选 token fallback,以及重建 BillingUsage 时丢失缓存、工具和 modality metadata 的问题。
  • 修复 Gemini 图片 fallback 未标记 ImageTokens、混合文本图片漏算图片、已有细分值被估算覆盖和音频 inline data 被误识别为图片的问题。
  • 修复 Realtime 分阶段表达式中的 craiao 永远为零,音频 token 也无法按表达式变量从 p/c 自动排除的问题。
  • 修复 OpenAI 流式 TTS 只复制总 token、STT 未映射输入音频明细,以及 Responses 音频模型家族识别不完整的问题。
  • 修复 MiniMax TTS 上游精确字符数只写入 TotalTokens、实际倍率结算仍使用本地估算的问题。
  • 修复公开首页 Hero 网格在 320px、390px 等窄屏下被内容撑到视口之外,导致标题、说明和标签被横向裁切的问题。
  • 修复任意 React Query 请求返回 HTTP 500 时全局跳转 /500,导致表单、筛选、分页和任务上下文丢失的问题。
  • 修复 Dashboard 查询失败时缺少局部错误展示与重试入口的问题。
  • 修复应用 Header 在移动端直接隐藏 TopNav,导致已实现的移动导航无法显示的问题。
  • 修复移动菜单打开后切换到桌面宽度,body 滚动锁可能残留的问题。
  • 修复表格只按视口宽度切换布局,侧栏展开后内容区已经过窄却仍渲染桌面表格的问题。
  • 修复表格默认 whitespace-nowrap 使长模型名、标签或描述撑宽容器的问题。
  • 修复移动表格统一隐藏选择和批量操作,管理员在手机上无法完成批处理的问题。
  • 修复设置 Switch 的可见 Label 未与控件关联,点击标签和辅助技术导航不可靠的问题。
  • 修复设置页加载时只显示单行文字,导致页面结构大幅跳动且失败后缺少局部恢复的问题。
  • 修复 Playground 将 auto / auto:* 作为真实 group 参数请求模型,导致自动分组下模型列表为空、无法选择模型的问题。
  • 修复 Ollama 模型对话框中旧渠道请求晚返回后覆盖当前渠道数据、删除状态未正确复位等异步竞态问题。
  • 修复 Param Override 中部分专用字段的 Label 未关联控件,以及 sync_fields 在 key 暂时为空时丢失所选类型的问题。
  • 修复 Tiered Billing token 提示未完整本地化、部分状态计算在空值场景下不稳定的问题。
  • 修复日语翻译插值格式异常和越南语 Save tiered billingTiered Billing、保存成功提示及 JSON 标签仍显示英文的问题。
  • 修复 Dashboard 测试直接导入 bun:test,导致 GitHub Actions 执行 tsc -b 时找不到模块类型声明的问题。

Compatibility Notes

  • 本预览版会改变部分异常 usage 的最终结算结果:修复后此前为零或被当作普通文本的输出、缓存、图片、音频和字符用量可能产生正确费用,请在升级前核对模型价格与表达式配置。
  • Claude/Anthropic 流式客户端现在可能在最终 message_delta.usage.output_tokens 中收到本地累计回填值;已有非零上游值不会被覆盖。
  • Responses 内部日志和结算会保留更多 input_tokens_detailsoutput_tokens_detailscompletion_tokens_details;依赖旧零值行为的对账脚本应同步更新。
  • Gemini 在上游候选总量为零但存在可见输出时会使用本地估算;图片仍按每张 1400 token 估算。混合文本和图片会分别记录,最终候选总量为各 modality 之和。
  • Gemini 上游已提供的非零 TEXT、IMAGE 或 AUDIO 明细优先于本地估算;音频 inline data 不会在缺少音频计量依据时被错误改按图片计费。
  • Realtime tiered_expr 现在可使用 craiao,引用这些变量时会改变 p/c 的归一化结果;升级前应复核实时音频模型表达式。
  • gpt-4o-audio*gpt-4o-mini-audio*gpt-audio* 或返回音频 token 明细的 Responses 请求会进入音频结算路径。
  • MiniMax TTS 的倍率结算改用上游 usage_characters;上游精确字符数与历史本地 token 估算存在差异时,升级后费用可能变化。
  • 本预览版没有新增数据库字段或迁移要求,也没有改变上述前端模块使用的后端 API 数据格式。
  • 普通 React Query 请求返回 HTTP 500 时不再自动跳转 /500;页面会保留当前上下文并显示局部错误与重试。依赖旧跳转行为的自动化测试需要更新。
  • Playground 选择 autoauto:* 分组时会省略模型列表请求中的 group 参数,这是自动分组的预期行为;显式分组仍按原有参数请求。
  • DataTable 的移动布局现在取决于表格容器宽度,而不是只看浏览器视口;侧栏、嵌套页面或窄内容区可能比以前更早切换为卡片列表。
  • 移动表格可按页面配置暴露行选择和批量操作;请检查高风险批量操作的确认流程、权限和触控可用性。
  • Header 的语言、主题、配置和 GitHub 入口在窄屏下会进入统一工具菜单;通知入口仍保留在应用 Header。
  • Ollama 模型请求支持取消过期加载;快速切换渠道时,旧请求结果不会再更新当前对话框。
  • Param Override、渠道编辑和 Tiered Billing 的内部组件结构已调整,但现有配置数据格式与后端接口保持不变。
  • README 已增加二次开发、社区鸣谢与临时商用授权说明。使用、分发或二次开发前,请同时核对 AGPLv3、显示条件、临时授权适用范围以及 One API、New API 等上游项目的许可要求。
  • 正式环境升级前建议重点复核 usage 对账、模型倍率、分阶段计费、Dashboard、系统设置、渠道编辑、Tiered Billing、Ollama、Playground、移动导航以及移动表格的失败重试和批量操作流程。

Verification

本预览版已完成以下针对性验证;正式发布前仍建议在最终 tag 和发布构建上重新执行:

  • go test ./relay/channel/gemini -count=1
  • go test ./dto ./service -count=1
  • go test ./relay/channel/claude ./relay/channel/openai ./relay/channel/minimax ./relay -count=1
  • go vet ./relay/channel/claude ./relay/channel/openai ./relay/channel/gemini ./relay/channel/minimax ./dto ./service ./relay
  • Claude OutputTokens 缺失回填、上游非零值保留和 message_delta.usage.output_tokens JSON 写回回归测试
  • Responses 非流式、流式、Compact 多模态 usage 与官方 output_tokens_details 回归测试
  • Gemini reasoning+文本、纯图片、文本+图片、已有图片明细、已有音频明细和流式音频 MIME 分类回归测试
  • Realtime cr/ai/ao 参数与 p/c 自动排除回归测试
  • OpenAI 流式 TTS、STT 输入明细、Responses 音频模型家族及模型别名回归测试
  • MiniMax 上游字符用量与本地估算 fallback 回归测试
  • cd web/default && bun run typecheck
  • cd web/default && bun run build:check
  • Dashboard、Playground、Param Override 与 Tiered Billing 共 17 项针对性前端测试
  • cd web/default && bun run i18n:sync
  • 相关变更文件的 ESLint 与 Prettier 定向检查
  • git diff --check
  • 390px 与 1280px 浏览器视口回归检查
  • 390px 首页验证 scrollWidth === innerWidth,确认无横向溢出
  • 移动菜单打开后切换到桌面宽度,验证页面滚动锁可以正确清理

说明:当前仓库的全量 bun run lint 与全量格式检查仍存在与本版本无关的历史基线问题,因此本稿不将其列为已通过项。正式版发布前仍建议在最终分支执行完整后端、前端和部署回归。

Full Changelog: https://github.com/MAX-API-Next/MAX-API/compare/v1.0.4-previe...

Read more

v1.0.4-preview.4

Choose a tag to compare

@CSCITech CSCITech released this 13 Jul 02:35
ec8d02a

[!WARNING] 发布阻断:Claude/Anthropic 流式输出 token 计费回归。 截至 2026-07-16,v1.0.4-preview.4 当前代码在 Claude/Anthropic 流结束时会正确解析顶层 CompletionTokens,但生成最终 BillingUsage 快照时遗漏 OutputTokens,导致用量日志中的 completion_tokens 可能为 0,输出 token 也可能未进入实际结算。

该问题按响应处理器而不是模型名称划分:Anthropic 原生、AWS Bedrock Claude、Vertex Claude 模式、Advanced Custom Anthropic Messages,以及通过 /v1/messages 复用 Claude 流式处理器的兼容渠道都可能受影响。Claude 非流式请求以及原生 OpenAI Chat、OpenAI Responses、Gemini 路径未发现同类问题。

在修复和完整回归通过前,不应将当前 v1.0.4-preview.4 用于需要准确计费的 Claude/Anthropic 流式生产请求;临时可强制 stream: false,历史受影响请求应结合上游 usage 记录进行对账。

重要升级说明

v1.0.4-preview.4 覆盖计费结算、GPT-5.6 cache_write_tokens 缓存写入计费、Responses/Chat 跨协议转换、异步任务计费、渠道请求改写、日志审计、access token 生成与二次验证、前端富文本渲染、登录注册合规和多数据库兼容等关键路径。升级前建议先在测试环境验证主要模型调用、缓存创建价格、分阶段计费表达式、任务类渠道、用户额度变更、用量日志筛选、Playground、OAuth/注册登录、access token 重新生成、订阅重置和管理端渠道配置。

如果部署使用 GPT-5.6、Responses API、缓存创建倍率或自定义计费表达式,请重点检查 cache_write_tokens 是否按预期进入缓存创建费用;同时复核 Param Override、自动分组/自动路由、Redis 配额缓存、旧 MySQL/PostgreSQL 数据库和反向代理真实 IP 配置。

Note

v1.0.4-preview.4 是预览版草稿,整理自当前分支中已合入的 v1.0.4 系列变更,并补充最近确认的 GPT-5.6 缓存写入计费、分阶段计费、日志审计、额度安全、密码重置和 access token 安全验证更新。发布前请以最终 tag、上游官方价格和实际验证结果为准。

Release Notes

GitHub 地址

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

Highlights

  • 补强 OpenAI Responses 与 Chat Completions 的双向兼容转换,覆盖普通响应、流式事件、工具调用、reasoning 文本、usage 聚合和跨协议 billing usage 恢复。
  • 完善 OpenAI / Claude / Gemini 语义化 BillingUsage,结算时优先使用原始协议 usage,并保留 cache、cache write、image、audio、reasoning 等细分 token。
  • 补齐 GPT-5.6 Responses usage 中 input_tokens_details.cache_write_tokens 的计费链路,非流式、流式、compact 和 Responses/Chat 转换均会保留缓存写入 token,不再在跨协议后退化为普通输入 token 或被遗漏。
  • cache_write_tokens 会归一为缓存创建 token:ratio 模式使用 CacheCreationRatiotiered_expr 模式进入 cc 变量,并从基础输入 token 中扣除后单独计价,避免漏计或重复计费。
  • 引入统一 quota 饱和转换策略,避免超大计费结果发生 int32 wraparound;严格预扣费路径只拒绝真正越界值,允许精确 MaxInt32 / MinInt32 边界。
  • 异步任务渠道新增更通用的 rate-card / generic billing 框架,支持按输入、输出、图片数量、时长、任务结果和渠道元数据计算费用。
  • 任务类渠道 Param Override 在计费前生效,header override 会在 adaptor 默认值之后写入上游请求,局部配置错误保持本地失败而不触发无意义重试。
  • Doubao、Ali/Kling/Wan、Gemini、Vidu、Vertex、Hailuo、Jimeng、Sora 等任务渠道补齐请求体构造、参数透传、计费和回调结果处理细节。
  • 管理端渠道抽屉、模型/分组倍率编辑器、自动路由展示、OAuth 回调提示、订阅重置和用量日志筛选得到集中优化。
  • Playground 增强选项持久化、清理历史、长输入和选区处理,减少常见交互中的状态丢失与布局问题。
  • 富文本与 HTML 渲染路径继续收紧安全边界,统一用户可见内容展示并降低异常 Markdown/HTML 输入导致的前端崩溃风险。
  • 日志审计字段写入更稳健,quota saturation 和 billing path 只在有效 admin_info 容器中追加,不再覆盖异常字段或在 nil 目标上记录误导性 warning。
  • 用户额度管理和密码重置流程补强安全边界:管理端额度保持在 JavaScript 可精确表示的整数范围内,密码写入失败时重置令牌仍可重试。
  • access token 生成改为 POST 敏感操作并强制执行二次验证、禁缓存和关键操作限流;验证状态绑定当前用户,避免同一浏览器切换账号后继承旧验证结果。
  • 无 2FA 或 Passkey 的普通用户可在 access_token 专用作用域内使用账户密码完成重验证,同时继续优先使用已启用的 Passkey 或 2FA。

New Features

  • 新增 service/openaicompat 兼容层,用于 Responses request/response 与 Chat Completions request/response 互转。
  • 新增 Gemini Responses adaptor,支持 Gemini 通道参与 Responses API 兼容路径。
  • 新增 dto.BillingUsage 协议快照结构,支持 OpenAI、Claude、Gemini usage 在跨协议转换后仍按原始语义结算。
  • InputTokenDetails 新增 cache_write_tokens 字段和共享复制逻辑,支持在 input_tokens_detailsprompt_tokens_detailsBillingUsage 之间完整传递 GPT-5.6 缓存写入用量。
  • 新增 tiered_expr 分阶段计费模式,单条表达式即可描述模型的基础价格、长上下文阶梯、缓存价格、媒体 token 价格和请求条件倍率。
  • 新增分阶段计费可视化编辑器与表达式编辑器,支持价格档位、兜底档位、请求体/header/时间规则、实时费用预估、命中档位展示和 JSON 批量配置。
  • 新增 GPT-5.4 Priority/Flex、Claude 长上下文与 Fast Mode、多模态和时段折扣等模板,管理员也可按实际上游价格创建其他模型表达式。
  • 计费表达式支持 pclencrcccc1himgimg_oaiao 等变量,以及 param()header() 和时间函数,可覆盖文本、缓存、多模态和请求级价格规则。
  • 新增 quota math helper 和测试,统一 float、decimal、rounding 到 quota 的饱和处理。
  • 新增 protected fetch client 与管理端模型拉取防护测试,用于统一 SSRF 边界和响应体关闭行为。
  • 新增任务通用请求体构造、路径配置和协议配置工具,减少各任务 adaptor 重复实现。
  • 新增任务通用计费模块和覆盖测试,用于图像、视频、音频等异步任务统一结算。
  • 新增订阅重置入口和管理端对话框,便于管理员批量处理用户订阅状态。
  • 新增用量日志 quota 区间筛选控件,普通日志和任务日志筛选栏都可按额度状态过滤。
  • 新增自动路由/自动分组前端展示工具,模型价格页可解释自动链路的实际分组来源。
  • 新增 OAuth 回调地址提示组件,帮助管理员检查第三方登录回调配置。
  • 新增安全验证方式发现接口和作用域化密码重验证,前端可根据当前账户实际可用的 Passkey、2FA 或密码方式打开对应验证界面。
  • 新增多语言文案,覆盖新增设置项、日志筛选、订阅操作、渠道表单和计费说明。

Improvements

  • Responses 转 Chat 后会把 input_tokens_details 映射回 prompt_tokens_details,并在 BillingUsage 恢复时保留细分 input token,避免 cache write、cached、image、audio input 在结算中丢失;六类 input token 字段改由 DTO 共享映射统一维护,降低后续新增字段时跨路径漏同步的风险。
  • Chat 转 Responses 会保留 usage 细节和 billing usage 快照,跨协议返回后仍能走统一计费入口。
  • Claude / Gemini usage 恢复逻辑补齐 cache creation、cache read、thoughts/reasoning 和 modality token 映射。
  • OpenAI BillingUsage 恢复会从 input_tokens_details 补齐 prompt_tokens_details.cache_write_tokens,保证 GPT-5.6 Responses 转 Chat 后仍使用原始缓存写入数据结算。
  • cached_creation_tokenscache_write_tokens 作为同类缓存创建统计进行兼容归一化;两者同时存在时取较大值,不直接相加,避免同一批缓存写入被重复收费。
  • 分阶段计费使用 len 判断上下文档位;len 始终表示包含缓存 token 在内的完整输入长度,避免大量缓存命中后误进入较低的长上下文价格档位。
  • 表达式会根据实际引用的变量自动从 p / c 中排除已单独计价的缓存、图片和音频 token,减少基础 token 与细分类 token 重复计费。
  • 预扣费会冻结模型名、表达式、请求条件、分组倍率和预计命中档位;结算时使用同一快照与实际 usage 重新计算,避免请求处理中途修改配置导致前后价格不一致。
  • 用量日志会写入归一化后的 cache_write_tokens,分阶段计费结果还会记录 billing mode、表达式和命中档位,便于管理员核对缓存创建费用。
  • 计费表达式 rounding 增加 quota 专用转换,降低浮点乘法和极端金额输入带来的边界风险。
  • quota saturation 会写入日志 admin_info.quota_saturation,便于管理员追踪被截断的原始值和 clamp 类型。
  • 预扣费和结算路径统一使用 quota helper,超大价格、倍率或 token 数不会因为整数溢出变成反向扣费。
  • BillingSession 预扣费和 legacy 预扣费入口共用同一套 QuotaClamp / 负数 quota 校验,保持模型价格错误的状态码、错误码和 skip-retry 语义一致。
  • 上游错误处理限制本地日志体积,保留排障信息同时减少异常响应占用内存。
  • 流式扫描器和 ping 处理逻辑得到重构,减少空 chunk、ping frame 和异常 EOF 对流式 relay 的影响。
  • API request 构造逻辑补充上下文、参数和 header 合并测试,降低高级自定义渠道回归风险。
  • 渠道表单抽屉拆分更多字段状态和转换逻辑,复杂通道配置更容易维护。
  • 分组倍率和模型倍率编辑器优化输入、验证和视觉反馈,减少配置错误。
  • 模型价格可视化编辑器的空状态文案改为显式条件计算,搜索、未设置价格和默认空列表状态更容易维护。
  • 自动路由显示会过滤不可见分组和重复分组,并保留旧配置 fallback。
  • 用量日志 retry / empty-retry / quota 筛选逻辑更清晰,前端过滤和后端聚合语义保持一致。
  • 用户、token、订阅和兑换码相关模型更新路径增加零值安全处理,避免局部更新意外覆盖会计字段。
  • 管理端用户额度对话框增加安全整数校验、行内错误提示和多语言文案,增加、扣减或覆盖操作在提交前会检查输入值与计算结果。
  • 密码重置验证码增加并发占用和提交语义:密码更新成功后才消费验证码,数据库写入失败或异常退出时释放占用并允许在有效期内重试。
  • access token 对话框接入统一安全验证流程,并按实际可用性选择默认方式;仅启用 2FA 的用户不会再进入不可用的 Passkey 状态。
  • /api/verify 同时按客户端 IP 和已认证用户 ID 限制关键验证请求,降低通过代理轮换扩大密码或验证码尝试次数的风险。
  • OpenAPI 补齐 POST /api/user/tokenPOST /api/verify 请求体以及 GET /api/verify/methods?scope=access_token 的参数与验证方式枚举。
  • 订阅、任务和日志模型增加 CAS / row-lock / 异步落库测试,降低并发状态回退风险。
  • README 和多语言 README 调整为新的产品定位和能力描述,保持各语言文档同步。

Bug Fixes

  • 修复 GPT-5.6 Responses 返回 cache_write_tokens 时,部分非流式、流式、compact 或 Responses → Chat 路径没有把该字段带入最终 PromptTokensDetails,导致缓存写入 token 可能按普通输入价格结算或未按缓存创建倍率计费的问题。
  • 修复跨协议 BillingUsage 恢复只保留 input token 总数和部分明细、遗漏 cache_write_tokens,导致转换后的实际结算与上游原始 usage 不一致的问题。
  • 修复 Responses 转 Chat / 跨协议后 BillingUsage 恢复只保留 token 总数,导致 input token 细分项从结算视角消失的问题。
  • 修复 strict quota 把精确 2147483647-2147483648 误判为 clamp 错误的问题。
  • 修复 attachQuotaSaturationToOtheradmin_info 已存在但不是 map 时覆盖原值的问题。
  • 修复 attachQuotaSaturationother == nil 时仍输出“已写入审计信息”语义 warning 的问题。
  • 修复部分 OpenAI Responses / Chat 转换路径中 tool call id、reasoning、finish reason、usage 聚合和流式 done event 不一致的问题。
  • 修复 Gemini 非 function tool、Responses relay 和 usage metadata 在跨协议路径中的兼容问题。
  • 修复 Doubao 任务可选标量字段使用非指针类型时,显式 0 / false 可能在转发时被 omitempty 丢弃的问题。
  • 修复任务 Param Override 在计费后才生效,导致实际上游请求与本地计费参数可能不一致的问题。
  • 修复 task header override 不能稳定覆盖 adaptor 默认 header 的问题。
  • 修复本地 Param Override 配置错误被当作可重试上游错误的问题。
  • 修复异步任务回调和轮询结算中部分任务状态、费用、结果字段缺失或类型不一致的问题。
  • 修复用量日志 retry 筛选、任务日志 quota 筛选和聚合读路径中的类型/边界问题。
  • 修复富文本 HTML 渲染和 sanitizer 在部分异常输入下的展示或安全边界问题。
  • 修复 Playground 清空历史、长文本输入、选项恢复和请求参数同步中的前端状态问题。
  • 修复管理端用户设置、用户资料、余额调整和 token 更新中零值字段无法正确保存或可能被误覆盖的问题。
  • 修复管理员可把用户额度设置到 int64 上限,导致超过 Number.MAX_SAFE_INTEGER 后前端展示和回传值发生精度丢失的问题。
  • 修复密码重置先销毁验证码再更新密码,导致密码哈希或数据库写入失败后重置链接提前失效的问题。
  • 修复 access token 通过 GET 生成且缺少禁缓存与二次验证,可能被缓存、预取或误重放的问题。
  • 修复安全验证 session 只记录时间戳,账号 A 验证后在同一浏览器会话登录账号 B 时,账号 B 可能继承验证状态的问题。
  • 修复未启用 2FA 或 Passkey 的普通用户无法生成 access token,以及仅启用 2FA 时前端仍默认选择 Passkey 的问题。
  • 修复 /api/verify 仅按 IP 限流,攻击者可通过切换代理地址扩大同一账户验证尝试次数的问题。
  • 修复管理用户接口收到非正用户 ID 时可能形成空条件查询并错误命中首条用户记录的问题。
  • 修复订阅重置、订阅弹窗和订阅 delta 返回值在管理端交互中的状态同步问题。
  • 修复模型列表、分组显示和自动链路价格页在自动分组配置缺失或别名分组存在时的展示问题。
  • 修复部分数据库迁移、命名锁、quota bigint 和老库兼容路径在 MySQL/PostgreSQL/SQLite 上的差异问题。
  • 修复日志审计写入在异常 admin_info 结构下可能丢失已有审计元数据的问题。
  • 修复 jsonwrapcheck allowlist 与当前代码不一致,减少业务代码直接调用标准 JSON marshal/unmarshal 的回归空间。

Compatibility Notes

  • 任务类渠道如果依赖 Param Override,请注意本版本会在计费前应用最终请求参数;升级后计费结果会更贴近实际发送给上游的 payload。
  • header override 现在会在 adaptor 默认 header 后生效;如果旧配置依赖默认值覆盖自定义值,需要重新检查渠道配置。
  • 本地 Param Override 配置错误不再进入重试链路;这类错误应作为配置问题修正,而不是依赖自动重试。
  • Responses API 兼容路径会尽量保留原始协议 usage;如果外部系统读取 usage 字段,请同时关注 prompt_tokens_detailsinput_tokens_detailsbilling_usage
  • GPT-5.6 上游可能在 input_tokens_details.cache_write_tokens 返回缓存写入量;该值会按缓存创建 token 处理。ratio 模式需要正确配置 CacheCreationRatio,表达式模式应使用 cc 为缓存写入单独定价。
  • 如果上游同时返回 cached_creation_tokenscache_write_tokens,系统会取两者中的较大值作为归一化缓存创建总量,不会相加;外部账单对账工具应采用相同口径。
  • 计费表达式中的系数是每 100 万 token 的实际美元价格,不再隐含旧倍率表的 /2、completion multiplier 或其他换算;从 ratio 模式迁移时不能直接复制旧倍率数值。
  • 未显式把模型切换为 tiered_expr 时,现有模型继续使用 ModelRatio / ModelPrice 计费;启用后该模型的预扣费与实际结算以表达式和请求条件为准。
  • GPT/OpenAI usage 的 prompt_tokens 通常包含缓存和媒体 token;表达式只有在引用 crimgai 等变量时才会自动拆分对应 token。长上下文条件应使用 len,不要使用拆分后的 p
  • strict quota 只拒绝超出 int32 可表示范围的值;精确边界值不再记录 saturation 或返回错误。
  • 管理端用户额度调整接口只接受不超过 9007199254740991 的正整数变更量,加减结果必须保持在 JavaScript 安全整数区间,覆盖值必须位于 0..9007199254740991。历史超范围额度可通过覆盖操作恢复到安全范围,依赖更大 int64 额度的外部管理脚本需要同步调整。
  • 预扣费入口遇到 quota clamp 或负数预扣费时仍返回 model_price_error、HTTP 400 和 skip-retry;本次只是统一校验来源,不改变外部错误契约。
  • quota saturation 审计只会写入 map 形态的 admin_info;如果调用方传入了异常类型,已有值会被保留但不会追加 saturation 详情。
  • 异步任务通用计费会让部分历史上未精确计费的任务按 rate-card 细则结算;建议先在测试环境核对常用任务模型的价格配置。
  • 自动路由展示更贴近实际配置,但只展示当前可见分组;隐藏分组不会被前端强行暴露。
  • 用量日志筛选项更细,旧的 retry 过滤理解应区分普通 retry 与 empty retry 等子类型。
  • access token 生成接口已从 GET /api/user/token 改为 POST /api/user/token;依赖旧接口的脚本、SDK 或自动化客户端必须同步调整请求方法,旧 GET 路由不再可用。
  • 密码重验证仅作为 access_token 作用域的回退方案,并且只在账户没有启用 2FA 和 Passkey 时提供;密码验证结果不能用于其他敏感操作。
  • PasswordLoginEnabled=false 只禁止新的密码登录,不会使已登录账户现有的密码凭证失效;符合回退条件的用户仍可用当前密码完成 access token 重验证。
  • 多数据库迁移继续要求 SQ...
Read more