Skip to content

feat: 添加账号级 UltraFast 响应档位计费开关 - #641

Merged
ranxi2001 merged 2 commits into
ranxi2001:productionfrom
zhang2580384:feat/account-ultrafast-billing
Nov 3, 2026
Merged

ranxi2001 merged 2 commits into
ranxi2001:productionfrom
zhang2580384:feat/account-ultrafast-billing

Conversation

@zhang2580384

@zhang2580384 zhang2580384 commented Nov 2, 2026 •

Copy link
Copy Markdown

解决的问题与行为变化

兼容上游可能将整个 API Key 账号下的模型固定服务为 UltraFast:客户端没有指定档位,上游仍返回 service_tier=ultrafast 并按该档位收费。现有只允许响应降档的策略会保留普通/priority 请求档位;模型专属6倍规则也无法覆盖该账号的所有模型。

  • 在 OpenAI API Key 账号新增/编辑页加入默认关闭的 UltraFast 档位计费 开关,存于 extra.openai_response_tier_billing_enabled。
  • 开启后按已知上游响应档位结算,允许升档和降档;终态没有重复 model 也可读取 service_tier。缺失/未知响应档位时按最终出站请求档位回退并记录告警。
  • 所有最终按 ultrafast 结算的 token 模型统一使用模型标准单价×6,包含缓存读写,再应用有效账号/分组倍率。Fast/priority 保持独立规则,不重复套 Fast 价格。
  • 账号开关控制是否采用上游响应升档,不豁免客户端明确请求的 UltraFast 价格。 客户端请求 UltraFast、最终仍按该档位结算时,开关关闭也按6倍计费。
  • 开关不会强制修改出站请求或开启上游加速。按次及媒体/工具独立计量维持现状,本 PR 的全模型6倍指有基础价卡的 token 模型。

关联记录与来源

  • 无关联 Issue。已检索仓库开放/关闭的 UltraFast 记录,未发现同等账号开关;feat: 精选适配 v0.2.11 模型、Codex 目录与 API Key 限制 #253 涉及已有 UltraFast 模型能力,不是同一开关。
  • 基于 ranxi2001/sub2api 的 production,提交 c0de6149ebcfd43002f7540e192f2e5d9bd8b03f(v2.19.2)。这是在本 fork 上整理的本地改动,没有从其他仓库 cherry-pick 提交。

复现与验收

使用虚构 OpenAI API Key 账号与离线响应,不需要真实上游凭据:

  1. 默认不开启,客户端未发送档位,上游终态为 {"response":{"service_tier":"ultrafast"}}:保留请求普通档,不自动升档。
  2. 开启账号开关,同样的上游终态:账单档位为 ultrafast,所有受测 token 模型的普通输入、输出、缓存读写按标准价×6。
  3. 响应缺失/未知档位:回退到出站请求档位;明确返回 default:允许降档。
  4. 客户端明确请求 ultrafast,响应同档或无档位:开关关闭、缺失、开启三种情况均按6倍;例如离线 GPT-6 Sol 用例在分组0.25时实扣 $0.01665000。
  5. 新增账号开关默认关闭,开启后正确提交;编辑账号能回填、保持开启及关闭清除配置。调度缓存投影保留 true/false。

新增回归覆盖 GPT-5.6 Sol/Terra、GPT-6 Astra/Sol、GPT-6.1 Sol/Terra;272000/272001上下文边界、高缓存命中、普通/UltraFast交替计价、5m/1h混合缓存写、显式零价缓存写、实际 RecordUsage 扣费命令及模拟耐久仓库重试/缓存失败恢复。

HTTP/SSE/WS 使用现有的响应观察和用量结算接口。本次仅扩展档位识别与结算策略,不新增网络重试、故障转移或扣费路径。幂等/缓存恢复测试使用模拟仓库,不作为真实 PostgreSQL/Redis 事务或进程崩溃测试的证明。

实际验证

首轮隔离验证对应实现提交 5fc0ef4724585d65a0d14564ce64fd29978c3a6d,基线为上述 c0de614。补充测试提交 6d5eb5c90e6bd8f189cc2ef7a7bc8552208946c5 仅更新响应观察器的原有契约测试,生产源码不变。后端在断网、限额的隔离容器中执行,不连接生产数据库、Redis 或付费上游。

首轮 GitHub 完整单元测试在 TestUpstreamResponseModelObserver_ObservesServiceTier 失败:原断言要求无 model 时忽略终态 service_tier,与本 PR 支持兼容上游不重复模型名的行为冲突。已将其更新为普通、Priority、UltraFast 三种明确期望,并保留非终态请求回显必须忽略、模型名不凭空生成、已有模型名不被清空的断言。

检查与执行目录 / 命令 结果 覆盖范围、证据或未运行原因
后端 service:Go 1.27.3 / linux amd64,go test -p 1 -tags unit -json 文件列表定向回归 通过 首轮编译全部 service 生产源码,选择新增 UltraFast 两套测试及现有 service tier、响应观察、billing、模型定价和 channel pricing 测试;552 条 test/subtest 通过记录,零失败、零跳过,测试包通过。
补充提交的 service 定向回归 通过 在原回归范围中加入从原文件直接提取的 TestUpstreamResponseModelObserver_ObservesServiceTier,总计557条 test/subtest 通过记录,零失败、零跳过;该函数及4个新增子测试均通过。测试源文件 SHA-256 与提交前源码一致。
GitHub CI 当前提交完整验收 通过 Actions run 41471395301 对应 head 6d5eb5c;make test-unit、make test-integration、前端类型/关键测试及构建、golangci-lint 均通过。当前 PR 24 项检查成功、25 项按工作流条件跳过,零失败、零等待。
后端 repository:同样按全部生产源码加账号投影测试运行 通过 1 条测试通过,验证账号开关 true/false 均保留在精简调度缓存中;零失败、零跳过。
前端:pnpm 9.15.9 / Node 25.8.1,Vitest 新增/编辑账号表单与 locale 完整性 通过 3 个文件、235 个测试通过,覆盖中英文说明、默认关闭、开启提交、回填和关闭。
前端:相关 6 个文件 ESLint 通过 无 lint 错误。
前端:pnpm run build 通过 包含 i18n 检查、vue-tsc 与 Vite 构建;存在既有 chunk-size 警告。表单测试存在 jsdom localhost 请求警告,未导致失败。
后端:CGO_ENABLED=0 go build -p 1 -o /out/sub2api ./cmd/server 通过 Linux 服务端二进制构建成功;SHA-256:ae7e0dccb12548fb5d890484cefebc4693cf80c0678ac8dc228d61784913855c。此项未使用 embed tag,前端构建单独验证。
后端源码与提交逐文件 SHA-256 核对(统一 CRLF/LF) 通过 5,090 个已跟踪后端文件全部一致。
git diff --check、公开内容凭据/敏感信息检查 通过 仅提交本功能的 19 个文件,未包含构建产物、生产运维脚本或私有历史。

本地隔离验证仅为上述定向回归:完整 service 包的无关测试图超出隔离构建内存预算,因此按 Go 选定的全部生产源文件与相关测试文件编译并复用现有 fixture helper。后续 GitHub 当前 head 已完成全仓单元/集成测试命令及全量 lint;通过命令不表示所有条件性集成用例都实际运行,也不替代 UltraFast 的真实数据库扣费、进程崩溃恢复或付费上游验收。未进行真实上游 TPS 测试或生产部署。

兼容性与运行影响

  • 默认关闭响应升档;OAuth及其他平台保持现有响应结算策略。客户端最终按 UltraFast 结算的 token 请求统一6倍,因此此前使用通用2倍的模型有明确价格变化,包括未开启响应档位开关的账号。
  • 没有数据库迁移,使用既有账号 extra。开关加入调度精简缓存白名单,沿用正常保存时的账号快照同步与outbox。
  • 缓存token先拆成互斥桶再计价;沿用长上下文、8位金额精度、统一扣费命令及扣费后的缓存失效恢复。不重算或补扣历史账单。
  • 日志只增加请求/响应/结算档位和缺失标识回退信息,不采集凭据或请求正文。
  • 可先在确认响应收费约定的兼容 API Key 账号开启。关闭开关撤销响应升档;若需恢复旧的通用2倍价格,需回退本次计价代码,单独关闭开关不会恢复旧价格。

文档与用户可见变化

  • README新增入口,docs/openai-ultrafast-billing.md 说明账号开关、档位选择表、缓存/长上下文、有效倍率与成本统计倍率区别、适用范围和兼容性。
  • 新增/编辑账号显示中英文开关说明,明确客户端显式请求 UltraFast 时也收费。交互由表单测试覆盖;未附浏览器截图。

Agent 使用声明

  • Agent 名称与参与范围:OpenAI Codex,参与原始问题排查、实现、审计、回归测试、文档及本 PR 整理;本次未派生子 Agent。
  • 模型名称与推理强度:本会话原始实现/审计及整理记录涉及 gpt-6-astra(xhigh),以及 gpt-6.1-sol(high、xhigh、max);本次 PR 整理使用 gpt-6.1-sol / max。名称与强度取自本地会话元数据。

提交前自查

  • base 分支和改动范围正确。
  • 公开内容使用虚构测试数据,不含生产账号、凭据、上游地址或客户对话。
  • 默认值、价格变化、适用范围和相关文档已说明。
  • Agent 使用声明已填写。

@ranxi2001
ranxi2001 merged commit b5e678c into ranxi2001:production Nov 3, 2026
49 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants