路由策略与成本护栏

账号级与 API Key 级共用同一份策略结构。设置入口在 控制台 · 路由偏好 令牌管理

立场

成本可预测性优先于可用性
你设的上限导致请求失败是可接受的;悄悄花掉超预算的钱不可接受。 下面标注为「硬约束」的项,任何保底与兜底逻辑都不会放宽它们。

路由预设

预设决定打分权重,不决定过滤。四档:

预设语义
cheapest低价优先:价格明显低的权重更高,接近时看成功率与延迟
fastest高速优先:首响应更快的节点优先,价格仍参与筛选
stable稳定优先:最近成功率更高、失败更少的节点优先
balanced高质综合:成功率、响应速度与价格综合(默认)

存活候选内部走价格加权随机而不是取最优。取最优会让最便宜的渠道被打爆 → 限流 → 所有人一起 failover(羊群效应);从商户视角看,确定性排序意味着第 2 名永远拿不到流量,市场会死。

关闭智能优选后不做加权随机,严格按你写的批次 / 白名单顺序依次尝试 —— 你明确知道自己要什么时,我们不该二次猜测。

成本护栏

1. 单次请求花费上限(硬)

字段 maxSpendPerRequest,按美元设定单次请求的花费上限。三道里最直观的一道 —— 但它只能在请求前按估算拦截,精确到每 token 的硬顶要靠下面的单价上限。

它和单价上限管的不是同一件事:单价上限约束 $/1M token,这一道约束一次调用的总花费。$0.05/1M 听起来很便宜,但一个 200K context + 长输出的请求照样能花掉一大笔; Claude Code 这类 Agent 客户端动辄几十万 token 的上下文,差距是数量级的。

  • 请求前:按 max_tokens × 渠道出价估算上界,超了直接拒绝, 请求不会发出
  • 结算时:实际花费超了会告警并记账(估算总有偏差)

2. 绝对单价上限(硬)

字段 absoluteMaxOutPer1M,美元 / 1M output tokens。

与百分位池的本质区别:百分位是相对的,市场整体涨价时它跟着涨; 绝对上限是的、钉死不动。超过它的渠道直接淘汰,过滤后候选为空则该请求失败, 不受百分位保底、也不受强制兜底影响。

3. 价格刺客护栏(硬)

字段 maxPriceMultipleOfCheapest:候选价格不得超过「当前同模型最便宜可用渠道」的 N 倍。

绝对上限只能保护知道行情的用户。真正的价格刺客长这样: 便宜渠道集体挂掉 → failover 一路往下走 → 静默落到一个贵 50 倍的渠道上 → 逐笔淹没在正常请求里、当场难以察觉。这在商户市场里不是假设,是必然会发生的。

相对护栏挡得住这种情况,且不需要你了解任何价格。建议 3~5 倍作为起点。

百分位低价池

策略语义
auto前 70%,至少保留 2 个候选。默认推荐
strict前 30%,至少 2 个。更省钱,候选更少
custom前 N%(10~100),至少 M 个。M = 0 表示明确不保底,前 N% 为空就失败
none不做百分比过滤
保底只放宽百分位,绝不放宽成本
「至少 M 个」的作用是:同一模型只有 3 个渠道时,「前 30%」只剩 1 个,它一抖动请求就失败。 保底把语义改成「取 max(前 N%, 最便宜的 M 个)」。它永远不会突破绝对单价上限, 也永远不会突破价格倍数护栏。

有序商家批次

字段 merchantBatches。与「加入路由」白名单的区别是有序: 白名单是一个集合,池内按打分排序;批次是有序的多个集合,批次 1 全部失败后才进批次 2

典型用法:批次 1 放自己长期验证过的商家,批次 2 放便宜但没那么熟的。 这比单一白名单表达力强得多,也比「固定商家」精确 —— 固定只是加权,批次是硬顺序。

软约束与硬约束

区分必须做对:把软约束做成硬的,你会频繁遇到「无可用渠道」;反过来则会拿到不想要的渠道还不知情。

类型语义包含
硬约束满足不了就拒绝执行并报错三道成本上限、只用认证商户只用原生协议渠道只用 / 排除指定渠道
软约束满足不了就降权,仍可能被选中固定商户偏好低延迟偏好高成功率

每次请求都会回传路由元数据,说明哪些约束生效、哪些渠道被降权、尝试过谁 —— 见 协议端点 · 路由元数据

两级合并规则

默认 ← 账号级 ← Key 级,但不是简单覆盖:

  • 收紧型字段取更严的一方:三道成本上限取更小值,requireVerifiedMerchant 取或,排除名单取并集,白名单取交集
  • 放宽型字段(预设、排序偏好、批次)由 Key 直接覆盖

理由:账号级设成「只用认证商户」通常出于合规或成本的硬要求,某个 Key 忘了设就把它放开, 是最容易出事又最难发现的一类配置错误。