Files
new-api-custom/docs/token-routing-custom18.md

4.0 KiB
Raw Permalink Blame History

Token 路由与 Astra 逐次结算(custom.18)

路由配置

API 密钥编辑页使用一个分组池;数字越小越优先,相同数字轮询。模型规则精确匹配原始请求模型名,规则分组先于默认池内其余分组;不支持的分组会按用户当前权限过滤。

  • custom:自定义池与模型规则。
  • inherit:跟随用户可用的全局 Auto 分组。
  • user:跟随用户当前所属分组。
  • “Astra 优先指定分组”是快捷预设;先从当前分组池选择目标分组,不会自动加入分组或覆盖已有 Astra 规则。
  • 服务端路由预览只计算顺序,不调用上游、不计费。渠道可用性与会话绑定仍会影响实际选择。
  • 成功会话绑定按用户、Token、原始模型和会话隔离;新会话按模型规则选择,已有成功绑定优先。失败清除绑定后不会重新采用同一历史日志绑定。

启动时,主节点迁移所有未删除的存量 Token,保留旧配置的有效顺序/并列优先级与继承模式,不注入任何模型规则。重复启动不会覆盖新策略。Token 缓存使用新版本命名空间,避免旧缓存绕过策略迁移。

Astra 守卫与计费

仅针对 HTTP POST /v1/responses 且原始模型严格为 gpt-6-astra:

  • 守卫开启、明确返回错误模型、尚未交付客户端时,可以切换至未试过的渠道,总上游尝试最多 3 次(不受普通 RetryTimes=1 的两次限制)。
  • 缺失模型、确认超时不触发这个特殊重试;固定渠道、取消请求、已交付响应、previous_response_id 或上游 conversation 不进行该重放。
  • 每个候选渠道自己的守卫开关仍有效。确认阶段共享默认 300 秒预算,而不是每次重新开始。
  • 每次实际消耗独立按请求的 Astra 价格和当次实际分组倍率结算。错误返回 Luna 的已消耗尝试也计费;最终成功只代表最后一次交付成功,不代表前面的尝试免费。
  • 被拒绝的响应不向客户端交付,后台最多收集 60 秒 usage。实际 usage(含缓存命中)优先;缺失 usage 时按实际准备发送的输入及观察到的输出估算,不虚构缓存命中。
  • 除明确模型不匹配外,其他守卫失败只有在观察到实际 usage/输出时收费;纯超时、无输出无 usage 的尝试退回预扣。
  • 保留 custom.17 对 stream=false 上游返回 SSE 的兼容处理。

账本与日志

relay_attempts 保存预扣、检查点、结算状态与日志 outbox,不保存提示词、输出正文或上游密钥。钱包/订阅、Token、用户、渠道和开启导出的看板统计在同一事务结算。唯一 attempt key 防止重复扣费/重复日志;SQLite 写冲突重试的是整个已回滚事务。

失效预扣由恢复任务每 5 秒扫描;活跃请求续租,进程中断后通常最多等待 10 分钟租约过期,再按最后持久化的 usage 检查点结算或退款。独立日志库恢复后可重放 outbox,不重复财务扣款。

用量日志的路由尝试面板显示请求/返回模型、实际分组、费用依据、缓存用量、估算标记和结算状态。面板的合计是各次已结算费用之和,不是再次收费。普通用户只能访问自己的记录,渠道 ID 仅管理员可见。

验证范围

  • SQLite、MySQL 8.4、PostgreSQL 18.6:新库、存量升级、重复迁移、幂等结算、订阅、日志 outbox。
  • SQLite 并发预扣/结算压力回归;钱包、Token 与渠道统计一致。
  • 真实候选 HTTP:两错一对、三次都错、流式切换、固定渠道、previous_response_id、守卫关闭、缺失模型无消耗、缺失 usage 估算、交付后错误模型不重放。
  • 实际 dashboard 鉴权下验证管理员/本人/其他用户记录隔离、看板总额、零上游路由预览。
  • 前端类型检查、目标 lint 和 276 项组件/表单回归。
  • 生产库隔离副本:32 个存量 Token 逐个对比旧配置,重复启动策略哈希不变。

ClickHouse 不是这次验证的数据库范围。