Prism · 棱镜
调度规则全部公开,包括对我们不利的那些
自动调度天生让人怀疑「是不是偷偷给我用了便宜货」。营销话术谁都会写,规则细节写不出来就是没做。所以这一页写得像技术文档。
四层,从完全手动到完全托管
四层共享同一套调度链路记录。任何一次请求,不管走的哪一层,都能回放出「为什么选了这个模型」。
| 层 | 做什么 | 适合谁 |
|---|---|---|
| 指定模型 | 填一个具体模型 ID,Prism 完全不介入。 | 已经知道自己要什么的人。 |
| Prism auto | 我们维护并持续调优的默认策略,装完就生效。 | 不想配置的人。新账户默认就是它。 |
| 自定义组合 | 你自己写规则,存成一个名字,当模型调用。 | 任务分布有明显规律、想精细控成本的人。 |
| 灾备切换 | 上面三层之下的兜底。模型不可用时转到同能力组的灾备模型。 | 所有人。默认开启,可关;灾备对象在同一能力组内自动选,目前不能自己指定。 |
自己调一遍试试
四组权重各自可调,拖动任何一条其余会自动归一化。这里用的是 /models 页公开的真实系数,不是演示数字。
倍数是权重与系数的加权结果,你可以自己拿 /models 页的系数验算。真实分布由控制台按你的实际用量每月复算一次。
难度是怎么判断的
分类器在请求进上游之前跑完,延迟预算低于 15 毫秒。它必须是本地小模型或规则打分——为了省钱先调一次大模型,逻辑不成立。
| 信号 | 说明什么 |
|---|---|
| 输入 token 数 | 长上下文通常意味着更复杂的任务。 |
| 是否带工具定义 | 带 tools 的请求多半是 agent 场景,容错空间小。 |
| 对话轮次深度 | 多轮累积的任务通常比单轮更难。 |
| 代码块数量与行数 | 区分「问个语法」和「改一个模块」。 |
| 意图关键词 | 重构、设计、调试、翻译、格式化的难度差别很大。 |
| 会话内历史难度 | **还没生效。** 打分函数里留了这一项,而没有任何一处把「前几轮有多难」传进去,所以它当前恒为零——见「重试即升级」那条待定项。列在这里是因为这一页承诺公开全部信号,包括还没接上的那个。 |
| 请求头显式指定 | 你可以用 X-AGIPlan-Difficulty 直接覆盖自动判断。 |
初版是纯规则加权打分。上线后用真实数据训练一个小分类器,把「分类器判低但用户重试了」作为负样本——这类反馈比人工标注准得多。
三条硬约束,不是可调项
降本不能降能力,否则你第一周就走了。下面三条写死在代码里,任何组合、任何策略都绕不过去。
- 01
宁可路由高,不可路由低
难度落在阈值边界附近时一律向上取整。误判的代价不对称:多花点钱远好过输出变差,而输出变差你未必当场发现。
- 02
能力约束优先于成本比较
请求声明了工具调用、视觉或最小上下文长度时,不满足的模型直接被排除,根本不参与成本比较。便宜但做不了的模型不是选项。
- 03
合规不是优化项
未取得大陆备案的模型不向大陆用户提供。这一条在准入阶段就把路线排除掉,不因为「没有别的选择」而放宽,也不因为你自定义的组合里写了它而放行。
灾备与计费
上游不可用是常态,不是意外。默认开启,只在同能力组内切换,失败的尝试不计费。
5xx、限流、超时、凭据失效
首 token 超时默认 60 秒,可用请求头 x-agiplan-first-byte-timeout-ms 调整,取值夹在 5–60 秒之间。这只对流式请求生效:非流式的上游要生成完才开始回,只受 10 分钟总时长限制。返回内容被截断且非你本意的情况只记录不自动重试——自动重试会重复计费。
只在同能力组内换
只在同一能力组内换模型,保证输出质量不变。跨组降级我们不提供——写成配置项也不行。组合里可以把灾备关掉(failover.enabled = false),那就是「宁可失败也不换」。
失败并告诉你,不偷偷降级
同组确实没有可用模型时,默认返回 503 并附完整的尝试记录,而不是悄悄给你一个更弱的模型。
失败不计费,成功按实际线路计价
只对最终成功返回的那一次计量:换线试过的那几次一个字都不进你的账单。切到哪条线就按那条线的售价计费,账单上能看到实际服务的模型。一个例外要说清楚:流已经开始之后上游断了,已经产出的那部分照常计费——那些 token 是真的生成了,和你自己按中断是同一个道理。
"failover": { "enabled": true, // 默认 true "scope": "same_tier" // 目前只支持 same_tier;自定义灾备顺序还没做 }
调度溯源
这不是附加功能,是「智能调度」这个卖点能成立的前提。每个请求都留一条链路记录,保留 30 天,可导出。
- 0ms鉴权ap_live_…f3c2 · 5× Pro
- 3ms配额预扣 11.742 CU(输入 14,200 + max_tokens 8,192 的最坏情况),三窗口余量充足
- 11msPrism难度 0.82 · tools=3 tokens_in=14,200 code_blocks=2
- 12ms路由规则 #1 命中 → 前沿推理组 · model-a
- 14ms响应model-a 限流
- 210ms灾备切换转同能力灾备模型 model-b · 按 model-b 计价
- 224ms流式首 token 890ms
- 8.42s结算in 14,200 / out 2,130 → 实扣 4.970 CU,退回预扣差额 6.772 CU
链路记录只含元数据,不含请求正文——和零留存是同一套架构。记录里只出现模型标识,不会出现任何供给来源标识。
X-AGIPlan-Trace
成功的响应都带追踪号,同时带 X-AGIPlan-Model-Actual 标明实际调用的模型。你可以在自己的日志里存下来。被拒的响应没有追踪号——那次没有落成用量记录,查不到;503 时链路在响应体的 `attempts` 里。
用量明细逐条展开
每一行都能展开成完整的时间线。发生过灾备的记录有独立标记,一眼能筛出来。
GET /v1/traces/{id}
用你自己的密钥就能拉,返回结构化 JSON。想接进自己的可观测系统也可以。
把 trace_id 发给我们
客服后台按追踪号一键定位,不用你复述发生了什么。
组合配置示例
auto、组合、自定义模型现在是同一套规则语言:规则自上而下匹配,命中第一条即生效;未命中走 default(写成 null 则拒绝)。配置完成后命名保存,在代码中像普通模型一样调用。
{ "name": "my-coding-model", "pools": { "strong": { "tier": "frontier" }, "domestic": { "tier": "domestic" }, "mid": { "tier": "balanced" }, "cheap": { "tier": "fast" } }, "rules": [ { "id": "hard", "when": { "difficulty": { "gte": 0.75 } }, "use": "strong" }, { "id": "zh_long", "when": { "lang": "zh", "tokens_in": { "gt": 8000 } }, "use": "domestic" }, { "id": "medium", "when": { "difficulty": { "gte": 0.35, "lt": 0.75 } }, "use": "mid" }, { "id": "simple", "when": { "difficulty": { "lt": 0.35 } }, "use": "cheap" } ], "default": "mid", "constraints": { "require_tools": true, // 不支持工具调用的模型直接排除 "min_context": 128000, "max_cu_per_request": 500 // 单次超过就拒绝,防止一条请求打穿额度 }, "failover": { "enabled": true, "scope": "same_tier" } }