OPTIONAL_CONTROLS_RESULTS_2026-09-15.md 8.8 KB

可选流量策略与完整统计:本地交付记录

本轮将原先列出的严格 RPM、自适应并发、独立完整性检查、完整分组统计实现为可选功能,并按管理员要求解除保护策略对并发数的预设锁定。最后补充“一键填入建议参数”,建议仍可编辑,不会自动开启或保存。

全部修改仅在本地完成。未连接或部署远程服务器,未改写实际业务数据库,未调用真实上游账号。默认保护策略仍是“初代兼容”。

本文件更新了 SITE_TUNING_RESULTS_2026-09-14.md 中“严格 RPM / 自动调节尚未实现”“分组 stats 返回 501”“mode1 完整性不可关闭”的历史状态;旧报告保留作审查记录。

入口与默认行为

功能 操作位置 默认与自定义
严格 RPM、突发预算 账号编辑 → 可选流量控制 默认关闭;RPM、突发额度可编辑,独立保存
自适应并发 同一区域 → 启用自适应并发 默认关闭;可选只显示建议或自动降速、缓慢恢复
建议参数 同一区域 → 填入建议参数 只填数值;保留开关和运行方式,不自动保存;填入后可继续改
账号并发上限 账号编辑原有并发输入 所有策略可编辑,不再锁为 4 / 8 / 16;切换、撤销策略保留当前正数配置
请求完整性 账号编辑 → 请求完整性选项 关闭 / 仅观察 / 严格拦截独立选择;mode1 也可显式关闭
完整分组统计 分组管理 → 勾选“完整统计” → 行内“统计” 显示开关默认关闭,浏览器记住偏好;只在打开统计弹窗后查询

流量控制关闭时不参与新增 Redis 准入。完整性“跟随策略默认”保留兼容行为:初代兼容先观察,mode1 默认严格;显式选择优先于策略默认。本轮没有批量改变已有账号的配置。

建议参数与管理员控制

建议起点:每分钟 60 次、突发 5 次、最低并发 1;60 秒内出现 3 次上游 429 / 5xx 后建议降速,稳定 60 秒且至少成功完成 3 次后逐步恢复。

这些数值是起步配置,不是对真实上游额度的测量。管理员可修改 RPM、突发额度、账号并发上限、自适应最低并发、失败次数、失败统计窗口、恢复周期。自动模式只调整运行时有效并发,不改写管理员保存的并发上限;每次减半至最低值,恢复时每周期增加 1 个名额。最低值会随管理员后来调低的上限收敛,不会反过来限制管理员修改上限。

RPM 目前采用管理员设定值,动态调节作用于并发;不会自行猜测并提高账号 RPM。输入保留正整数及合理技术范围校验,保护策略不再附加固定并发上限。

实现与修复

  1. 原子准入。 Redis Lua 在一次事务内检查滚动 60 秒请求数、令牌桶突发预算及自动并发名额。相同账号跨客户端共享预算;本地拒绝不消耗新的请求令牌。使用 Redis 时间,减少节点时钟差异。
  2. 正常业务与测试共享。 模型 HTTP 请求、应用层重试、普通及智能账号测试、OpenAI 插件调用、WebSocket 转发及透传的模型轮次接入控制。嵌套传输不重复计数。模型目录、配额等 GET 查询不计入模型请求预算;一次应用请求内部的 TCP/TLS 重试不单独视为模型请求。
  3. 流式生命周期。 HTTP 流读取完成、关闭或取消时释放名额;WebSocket 每个 response.create 单独计数,控制帧不计数,完成、失败和取消事件释放名额。短暂写入超时上下文不会被误当作整轮生命周期。
  4. 恢复证据。 流中的 429 / 5xx 纳入失败观测;响应中断、取消、不完整和未知错误不当作恢复成功,后续 [DONE] 分隔符不能把失败改成成功。
  5. 故障行为。 严格 RPM / 自动并发无法确认准入时返回可重试错误;仅建议模式在缓存不可用或续租失败时继续原请求,不因观测故障降低吞吐。租约失效时执行模式取消受控请求,避免失去并发计数后无限放行。
  6. 错误含义。 本地拒绝按请求范围处理,不将其当作账号凭据故障;HTTP 保留等待提示,WebSocket 返回本地错误原因及建议等待信息。智能测试在尚未收到实际上游响应时可按限流等待重新排队。
  7. 修改一致性。 账号单独编辑、批量编辑、策略切换和撤销均保留可编辑并发,并同步保护标记。旧策略任务结束不会覆盖新配置的自动调整状态。账号编辑弹窗保存普通设置时保留刚独立保存的流量策略。
  8. 完整性独立。 包括透传首帧、后续帧在内的已接入路径读取账号选择;身份与 TLS 策略不再强制锁定完整性开关。

分组金额口径

展示字段 计算口径 使用边界
实际计费用量 历史用量记录 SUM(actual_cost) 包含余额扣减与订阅消耗,订阅消耗不是现金收入
账面费用 SUM(total_cost) 使用记录中的标准定价
上游账号成本(本地统计) SUM(COALESCE(account_stats_cost,total_cost) * COALESCE(account_rate_multiplier,1)) 使用历史记录保存的成本与倍率,不是上游发票

用量按历史 usage_logs.group_id 归属,不随密钥之后转组或删除而重归属。零计费记录纳入请求数,但不当作成功率。密钥数和绑定账号数表示当前状态,排除已删除对象;启用密钥数另排除禁用和过期。各聚合分开执行,避免连接多张表后重复累计费用。支持时间范围、全部历史、空数据和错误提示,接口不再返回占位零值。

验证

验证项 结果
后端全量 go test -tags=unit ./... 19,403 个测试及子测试通过,0 失败,29 跳过
最终修改后的流量 / 策略 / WebSocket / handler 专项 53 个测试及子测试通过,0 失败、0 跳过
前端最终全量 Vitest 2,061 项通过,0 失败、0 跳过
本轮独立 PostgreSQL 专项(前序执行) 116 个测试及子测试通过,0 失败、0 跳过;使用本机独立合成数据库
Vue 类型检查、ESLint 通过
后端与前端生产构建 通过,产物位于本机临时目录

后端全量之后补充了 WebSocket 本地提示及 SSE 失败结束标记处理,最终专项覆盖这些改动;专项与全量数量不可相加当作独立用例数。原子准入测试覆盖两组缓存客户端同时发起 40 次请求、额度为 1 时仅准入 1 次。策略测试覆盖手动设置大于预设值、再次修改、切换与撤销后保留数值。前端测试覆盖建议只填入、管理员再次自定义、独立启停和保存。

本轮最新页面的浏览器目视验收未完成:浏览器工具返回 unsupported Codex auth method: apikey,无法取得浏览器会话。组件测试和生产构建通过,但不能据此声称已完成最新页面截图验收。此前完成的 B 方案 v3 评分和鹈鹕 SVG 展示保留,未调用真实模型补测。

构建仍有浏览器兼容数据较旧、部分前端包较大的非阻断提示;这些不影响本轮构建,后续可独立做依赖维护和页面拆包。

剩余边界

  • 观测来自 Redis 当前缓存周期,非持久监控历史;状态长期无流量约 24 小时过期,缓存重置会重建计数与预算。请求次数、错误次数和平均响应耗时不是完整的排队等待时间分布。
  • 严格并发租约每 30 秒续租、120 秒失效。动态上限只约束后续准入;正常调整不会中断已经准入的任务。已建立的旧配置长连接遇到配置版本变化可能需要重连。
  • 未验证真实上游账号的限流概率、握手兼容性或模型能力。保护和流量策略不能保证上游不降质、不限流。
  • 独立流量保存已避免同一弹窗覆盖;多个旧编辑窗口并发提交普通账号完整配置仍沿用现有最后写入语义,不等同于所有账号配置都具备版本冲突检测。
  • 本轮复用账号 JSON 配置和 Redis,无新增数据库迁移;未来上线仍需核对之前的 248_intelligent_assessment_v2.sql,配套更新前后端。本轮未执行上线。

备份与本地环境

原调整前归档继续保留,没有重复覆盖:

  • C:/Users/30214/Desktop/sub2本地/sub2新站-调整前-20260914-213426-complete.tar.gz
  • C:/Users/30214/Desktop/sub2备份/sub2新站-调整前-20260914-213426-complete.tar.gz

前序已验证两份完整归档一致,SHA-256 为 4C7A328E9A265C668451B198D4EF40DFBE66D17C4F3C4B3FDE39BFC5DD20A71A。归档不包含未读取的服务器数据库。

本机测试 PostgreSQL 当前未运行;本轮临时组件服务结束后停止,测试产物保留在临时目录供复核。仓库仍没有已跟踪文件的 Git 基线,本轮未代为提交整个项目。