# 上游怎么选(实测) 钉选的目的只有一个:**让上游别乱切、把提示缓存吃满**。所以选上游的判据非常具体—— **它到底做不做前缀缓存**。做,钉上去省 20 倍;不做,钉上去等于每次都付全价,比不钉还糟。 下面的数据不是猜的,是 2026-10-20 在本机对网关实测的。 ## 测法 同一段固定长前缀(约 18k token)**连发 2 次**,请求体带 `providerOptions.gateway.only = [候选]`: - 第 2 次的 `usage.prompt_tokens_details.cached_tokens` > 0 ⇒ 该上游做了前缀缓存 - 命中率 = `cached / prompt`;0% ⇒ 完全不缓存 - 顺带记录第 2 次耗时 脚本:`_ab2.mjs`(临时文件,不入库;原理就是上面两句,自己写十行也行)。 ## 结果(模型 `cline-pass/deepseek-v4.1-flash-1017`) | 上游 | 缓存命中率 | 第 2 次耗时 | 评价 | |---|---|---|---| | **togetherai** | 99.6% | **0.74s** | ⭐ 最快且缓存好 | | **inference-net** | 99.8% | 0.93s | ⭐ 缓存最好之一、快 | | **wafer** | 99.8% | 1.04s | ⭐ 同上 | | **runinfra** | 98.9% | 1.03s | 快 | | **fireworks** | 99.3% | 1.10s | ⭐ 老牌稳定 | | **deepinfra** | 99.8% | 1.28s | ⭐ 缓存最好之一 | | **relace** | 98.4% | 1.61s | 可用 | | **pareto** | 99.6% | 1.90s | 可用(也是默认路由常驻上游) | | **deepseek** | 98.9% | 2.37s | ⭐ **第一方**,见下 | | **gmicloud** | 99.6% | 2.54s | 可用,偏慢 | | **novita** | 99.6% | 2.57s | 可用,偏慢 | | **alibaba** | 98.2% | 2.95s | 最慢 | | **parasail** | **0%** | 1.89s | ❌ 不缓存,别钉 | | **particle** | **0%** | 1.41s | ❌ 不缓存,别钉 | | **baseten** | 失败 | 0.86s | ❌ 该模型当前调不通 | | **azure** | 失败 | 0.81s | ❌ 该模型当前调不通 | | **morph** | 失败 | 0.83s | ❌ 该模型当前调不通 | ## 推荐 **默认钉 `deepseek`。** 理由不是它最快(它偏慢),而是: 1. **它是模型厂商第一方** —— 第三方转发普遍存在量化(fp8/int4)导致质量下降的可能, 这一点我无法从接口上验证,但第一方没有这个风险; 2. 缓存 98.9%,已经足够,**钉选的主要收益是「稳定」而不是「快」**; 3. 第一方不会突然从这个池子里消失。 **想要低延迟,换 `togetherai`(0.74s)或 `inference-net` / `wafer`(约 1s、缓存 99.8%)。** 把延迟从 2.4s 压到 0.8s 是实打实的体验差别,代价是接受第三方转发的质量不确定性。 **绝对不要钉 `parasail` / `particle`。** 它们不缓存 —— 钉上去之后每一次请求都按未命中计费, 缓存命中率会从 99% 掉到 0%,成本反而比不钉高出十几倍。 **不要钉 `baseten` / `azure` / `morph`**(至少现在):对 `-1017` 直接返回 `failed to invoke model`,钉上去的结果是「钉住·有漏」,请求全落在别处。 ## 其它模型 上游池不是一个模型通用的,实测: | 模型 | 可钉? | 池子大小 | |---|---|---| | `deepseek-v4.1-flash-1017` | ✔ | 16 | | `deepseek-v4-pro` | ✔ | 6(alibaba, azure, baseten, deepinfra, deepseek, novita) | | `deepseek-v4.1-flash` | ✘ | 单管道,无对象可钉 | | `glm-5.3` / `glm-5.3-flash` / `kimi-k3` | ✘ | 单管道 | **给 `v4-pro` 钉选时,上面 16 个的结论不适用** —— 它的 6 个候选里 `azure` / `baseten` 在上面这轮里是失败的,剩下 `alibaba` / `deepinfra` / `deepseek` / `novita` 才是有意义的选项。换模型一定要重新测。 ## 注意 - 数据是**单次采样**,延迟受当时负载影响,不要把它当 SLA;缓存率比延迟稳,优先信缓存率。 - 缓存命中需要**前缀完全一致**。真实对话里前缀会变(系统提示、历史消息都在变), 所以线上命中率通常低于这里的 99%,这是正常的,不是上游没缓存。 - 换上游后缓存要**从头预热**,刚切换的那几次命中率会低,别立刻判定「这个上游不行」。