
推理路由(Inference Router)是介于应用程序和大模型托管层之间的一种中间件。有了它,你就可以把不同的 LLM API 调用分发到最适合该任务的模型上,而不是一股脑全倒进同一个端点。很多 SaaS 后端在刚搭建时,默认都会留下一个“账单刺客”隐患:让单一的旗舰大模型处理所有请求。结果就是,无论是只需要 94 个输入 Token 的简单分类任务,还是需要 3411 个输出 Token 的复杂推理任务,都得按最难任务的单价来买单——这无异于让便宜的任务去反向补贴昂贵的任务。
DigitalOcean 推理路由是 2026 年 4 月推出的 Inference Engine(推理引擎)的一部分,目前处于公测阶段。
本教程将围绕一个 SaaS 支持后端,一步步搭建起包含三种任务策略的实用路由系统:低成本的分类(Classifier)路径、质量敏感的客户问答(Q&A)路径,以及深度推理(Reasoning)路径。学完本教程后,你将拥有一个可以直接通过标准 OpenAI 聊天补全端点调用的路由,能直接从响应头(Response Header)中读取单次请求的成本信号,并能为问答路径配置会话保持(Session Pinning),从而在多轮对话中保持 KV 缓存处于热启动状态。
本文核心要点
- 如果 SaaS 后端把所有请求都怼给同一个旗舰模型,那么本可以用 20B(200 亿)参数开源模型轻松搞定的分类任务,也得按旗舰模型的价格交税。根据真实运行测算,单次请求的费用最高能差出 36 倍。
- DigitalOcean 推理路由通过混合专家(MoE)分类器,把传进来的提示词与你配置的自然语言任务描述进行匹配。随后,匹配成功的任务会根据相应的选择策略,从该任务的模型池中挑出一个特定的模型。这里不存在顺次执行的硬编码规则。
- 你需要准备两套凭证,且它们必须属于同一个 DigitalOcean 团队:一套是用于创建和管理路由控制面的个人访问令牌(
$DIGITALOCEAN_TOKEN),另一套是以sk-do-开头的模型访问密钥($MODEL_ACCESS_KEY),用于推理调用。如果团队不匹配,即便这两个凭证各自有效,调用也会失败。 - 手动排序(Manual Ranking)不需要在创建请求体中填写
selection_policy字段。在models[]列表里的先后顺序就是它的排序规则,这一点已在 2026 年 6 月 16 日的实时 API 调用中得到验证。 - 在公测期间,路由功能本身是免费的。你只需要为您请求所调用的模型付费。每次调用路由只会增加不到一秒的微小路由开销。
准备工作
在开始本教程之前,你需要准备好:
- 一个 Tier 3 或更高等级的 DigitalOcean 账户。Claude Sonnet 4.6 和 GPT-5 属于商业模型,需要 Tier 3+ 的访问权限。Tier 1 和 Tier 2 账户只能使用DigitalOcean云平台中的开源模型,例如DeepSseek、Kimi、GLM等。如果需要提升账户等级,可联系卓普云的技术团队直接申请。
- 一个拥有 Inference API 写入权限的 DigitalOcean 个人访问令牌(PAT),保存为
$DIGITALOCEAN_TOKEN。该凭证仅用于控制面:创建和管理路由,别把它用在推理调用上。 - 一个从推理控制台获取的模型访问密钥(MAK),保存为
$MODEL_ACCESS_KEY。该凭证以sk-do-开头,专用于推理调用。 - PAT 和 MAK 必须属于同一个 DigitalOcean 团队。如果团队对不上,不管路由怎么配置都会调用失败。在管理多个 DO 账户时,这是最容易踩的坑。
- 本教程中的控制面调用需要用到
curl;调用示例需要用到 Python 以及openai库(安装命令:pip install openai)。 - 熟悉 OpenAI 聊天补全(Chat Completions)的 API 格式。
本教程中用到的模型标识(Model Slugs)包括:openai-gpt-oss-20b、llama3.3-70b-instruct、anthropic-claude-4.6-sonnet 和 openai-gpt-5。你可以去 DigitalOcean 英文文档中心的模型目录页面核对当前的可用模型标识。
什么是推理路由?
简单来说,推理路由就是一个中间件组件。它接收到 LLM API 请求后,会根据任务类型和配置的选择策略,把请求转发给最合适的模型。这把应用端的代码解放了,你不再需要自己写复杂的路由逻辑。你的应用程序只需要把所有请求统一发送到一个端点,并把模型参数指定为 "model": "router:<你的路由名称>",剩下的分发工作全由路由包办。
推理路由在 DigitalOcean Inference Engine 中的位置
Inference Engine(推理引擎把 Serverless(无服务器)推理、专用(Dedicated)推理和推理路由聚合在了一个统一的 API 界面下。而推理路由就像是一个总管,负责调度 Inference Engine 里的哪款模型去应答每一个传进来的请求。调用它时,直接对接推理端点(https://inference.do-ai.run/v1/chat/completions),格式完全沿用标准的 OpenAI 聊天补全标准。
无服务器推理 vs. 专用推理:路由怎么选,为什么?
无服务器推理跑在共享基础设施上,按请求计费,支持自动扩缩容(包括缩容至零)。专用推理则独占计算资源,延迟稳定,每个端点的容量是固定的。推理路由可以同时给这两者指路。如果你的业务非常看重独占容量和稳定的延迟 SLA,你可以利用“速度优化(Speed Optimization)”或“手动排序(Manual Ranking)”策略,把专用模型设为任务池里的第一选择。关于不同部署模式在容量和成本上的权衡,可以去参考我们在卓普云官网博客发布的《如何判断该使用无服务器推理、专用推理还是批处理推理?》。
推理路由是如何工作的
大伙儿要留意,这里的推理路由可不是死板的硬编码规则路由,它是一个语义路由。每一个传进来的提示词,都会先由一个 MoE(混合专家)分类器模型进行评估。这个分类器会把提示词拿去跟你创建路由时定义的自然语言 custom_task.description(任务描述)做匹配。一旦匹配到某个任务,该任务对应的选择策略就会从其模型池中挑出一个具体的模型。这里头没有先后顺序的规则堆叠,也不是谁先匹配到就用谁。关于推理路由器的 MoE 门控与智能分流机制,我们也做过深度解析并发布在了卓普云的官网博客中。
任务匹配与选择策略
任务匹配纯看语义:MoE 分类器会通读整个提示词,把它归入最贴切的任务描述中。因此,任务描述写得好不好,直接决定了路由认得准不准。在填写 custom_task.description 时,要写成大白话的任务定义,而不是简短的标签或分类名称。
路由目前支持四种选择策略:
| 策略名称 | API 表达方式 | 适用场景 |
|---|---|---|
| 成本效益 (Cost Efficiency) | "selection_policy": { "prefer": "cheapest" } | 多模型池;想要尽可能压低单次请求的花销 |
| 速度优化 (Speed Optimization) | "selection_policy": { "prefer": "fastest" } | 多模型 pool;想要首字延迟(TTFT)尽可能低 |
| 手动排序 (Manual Ranking) | 不填写 selection_policy 字段。models[] 列表里的先后顺序就是排序规则。 | 对质量极其敏感、需要雷打不动的模型偏好顺序 |
| 最优推荐 (Optimal) | "task_slug": "<preset>" | 仅适用于 DO 官方预设的任务类型;自定义任务无法使用 |
对于手动排序,在 API 传参时直接把 selection_policy 字段整个删掉就行。我们在 2026 年 6 月 16 日的实时创建调用中证实了这一点:API 返回时会把模型按原顺序吐回来,而那个顺序就是实际生效的路由策略。
三种路由流派:静态路由、语义路由与成本联动路由
在业界,大模型推理分发主要有三种思路:
静态路由根据请求的一些固定属性来分发,比如看你请求的是哪个 URL 路径、带了什么 Header 头,或者请求体里填了哪个字段。这种方式不需要分类器参与,几乎不增加延迟,但缺点是它看不懂提示词的具体内容。在静态路由眼里,用户发来的“账单咨询”和“系统报错”如果走同一个端点,长得就没有任何区别。这种方法只适合那些已经在应用层做好了业务分流,或者有明确指定模型参数的场景。
语义路由会在分发前去读提示词的内容,借此判断任务类型。DigitalOcean 推理路由走的就是这个流派,靠背后的 MoE 分类器来干活。虽然分类器会带来不到一秒的微小路由开销,但它能让你根据实打实的任务内容来做决策,而不是瞎猜。EMNLP 2024 的一项研究表明,基于提示词内容的路由分发可以让查询效率提升约 40%,成本降低 30%,输出质量甚至还能提高 10%(参考 Stripelis 等人的论文:《TensorOpera Router: 用于高效 LLM 推理的多模型路由器》)。
成本联动动态路由则是语义路由的升级版。它不仅看语义,还会结合实时的计费信号、模型的当前可用状态或质量评分,在运行时动态挑选模型,而不是死守静态配置。这种玩法实现和维护起来都更复杂,但如果你的后端跨越了多个云厂商,或者需要动态感知各家模型的调价,它会非常有用。
如果技术团队想在 DigitalOcean 之外自己搭一套,也有不少开源轮子。比如 vLLM Semantic Router,它利用信号驱动的语义分类在模型池间做分发;还有 llm-d-router,它能针对自托管的 Kubernetes 大模型服务集群,提供感知 KV 缓存和负载状态的智能路由。
从 API 调用到模型响应的请求全链路
当你的应用程序向 https://inference.do-ai.run/v1/chat/completions 发送请求,且指定 "model": "router:cost-governance-demo" 时,一路上会发生这些事:
-
推理路由把提示词递给底层的 MoE 分类器。
-
分类器拿提示词去跟你配置的
custom_task.description逐个比对,挑出最匹配的任务。 -
一旦匹配成功,该任务的“选择策略”就会从它的
models[]池子里挑出一个模型,把请求转发过去。 -
如果没匹配到任何任务,或者挑中的模型恰好挂了,请求就会溜进
fallback_models[](兜底模型池)。 -
最终响应以标准的 OpenAI 聊天补全格式返回,同时会多带一个
x-model-router-selected-route的响应头,告诉你刚才到底命中了哪个任务。

响应体里的 model 字段会老老实实交代最终是谁服务了这次请求。这两个字段一配合,你都不用去翻 Analyze 仪表盘,就能对每次请求的路由去向一清二楚。
推理路由能帮你解决多大的成本痛点
正如《无服务器推理中那些至关重要的指标》中所测得的那样,在整个模型目录里,单次回答完结的开销跨度能差出 230 倍左右。而这背后的推手几乎全看你选了什么模型,而不是各家云厂商的定价差。
“泛化税”就是指你让后端只用一个顶级旗舰模型处理大大小小所有任务时交的冤枉钱。以本教程实测的 Token 数量为例,一次普通的分类调用(输入 94 / 输出 80),如果走开源的 openai-gpt-oss-20b,单次成本只要 $0.00004070。如果把一模一样的请求送给 Claude Sonnet 4.6,得花 $0.00148200(直接贵了 36 倍);送给 GPT-5,得花 $0.00091750(贵了 22.5 倍)。随着你的业务流量滚雪球,这几十倍的溢价会无情地吞掉你的预算。
假设一个月有 70 万次分类请求。如果你把分类流量路由给 openai-gpt-oss-20b,每个月只要 $28.49;而如果写死成 Claude Sonnet 4.6,每个月就要烧掉 $1,037.40。下面我们要聊的路由架构,能让你一行应用代码都不用改,就把这笔省下来的真金白银放进兜里。
架构设计:三条路径,三档模型
本教程实现了一套三路径路由,完美贴合 SaaS 客服后端的任务复杂分布:
分类路径(Classifier path): 进来的客服工单要先归类:是财务账单、Bug 报错、使用向导还是账户问题?这类任务的特点是输入短、输出是固定的分类标签。我们把 openai-gpt-oss-20b 作为主模型,因为它在模型池里最便宜,而且完全够资历吐出正确的分类标签。llama3.3-70b-instruct 则作为退路。选择策略设为:prefer: cheapest。
客户问答路径(Customer Q&A path): 用户面对面的多轮对话,需要保证跨会话的回答质量非常稳定,且对特定业务领域的知识不能掉链子。这里让 anthropic-claude-4.6-sonnet 挑大梁,llama3.3-70b-instruct 做垫底。选择策略采用“手动排序”(即把 Sonnet 摆在第一位,不写 selection_policy 字段)。为什么不用 prefer: fastest(速度优先)?因为池子里最快的模型在某次运行中可能刚好是个“笨蛋模型”,而这条路径质量第一。手动排序能确保只要 Sonnet 没挂,就雷打不动地用它。
深度推理路径(Reasoning path): 面对复杂的跨步骤逻辑推理,哪怕 GPT-5 的请求单价高,由于任务本身的业务价值极大,这钱也花得值。这里顺便提个醒:GPT-5 的输入单价(每百万 $1.25)其实比 Claude Sonnet 4.6(每百万 $3.00)还要便宜。推理路径之所以贵,是因为它会疯狂产生大量的输出 Token(在实测中达到了 3,411 个,而问答只要 292 个)。在推理任务里,输出 Token 的数量才是决定账单厚度的决定性因素,单价反而是其次。
路由兜底(Router fallback): 如果有些奇葩提示词让 MoE 分类器懵圈了,匹配不到任何定义好的任务,就会被 llama3.3-70b-instruct 接住。这能防止未匹配的请求直接报错弹回,并能用极低的成本把任务交给一款很能打的开源模型去处理。

在为自己的后端配置任务档位前,记得先去统计一下真实的调用分布。如果你的业务里 80% 都是深度推理,那它的成本走势跟 80% 都是分类任务的业务是完全不同的。你可以先在 Playground(演练场)里用 Router Evaluation(路由评估)功能跑个质量评测,确认便宜的模型确实能交出合格的答卷,再放心把生产流量切过去。
配置推理路由
通过 API 创建路由
带上你的 PAT 凭证,向控制面端点发送一个 POST 请求。下面这个请求可以在单次调用中一口气把三条任务策略全部配齐:
curl -s -X POST "https://api.digitalocean.com/v2/gen-ai/models/routers" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "cost-governance-demo",
"description": "Three-path router for SaaS support: classify, Q-and-A, reasoning",
"policies": [
{
"custom_task": {
"name": "classify",
"description": "Classify a customer support message into exactly one of the following categories: billing, bug, how-to, or account. The message is a short text from a support ticket."
},
"models": ["openai-gpt-oss-20b", "llama3.3-70b-instruct"],
"selection_policy": { "prefer": "cheapest" }
},
{
"custom_task": {
"name": "customer-qa",
"description": "Answer a customer-facing question about the product, account settings, subscription plans, or service behavior. The question may be part of a multi-turn conversation with a user."
},
"models": ["anthropic-claude-4.6-sonnet", "llama3.3-70b-instruct"]
},
{
"custom_task": {
"name": "reasoning",
"description": "Perform complex multi-step reasoning, mathematical analysis, or architectural evaluation that requires tracing through multiple steps and producing a detailed explanation with intermediate conclusions."
},
"models": ["openai-gpt-5"]
}
],
"fallback_models": ["llama3.3-70b-instruct"]
}'
关于这个请求体,有三点需要注意:
第一,customer-qa 策略里确实没有写 selection_policy 字段,这不是漏掉了,而是故意为之。不写这个字段就会触发“手动排序”:路由会按列表里的先后顺序去撞模型。既然 Claude Sonnet 4.6 排在第一,它就会被首先调用。
第二,custom_task.description 里的文本是直接喂给 MoE 分类器模型当参考的。务必写成详细的任务定义,不要只丢一个模糊的展示标签。像“一般问题”这样含糊的描述很容易和各种提示词产生交集,会导致路由分发准确率大幅下滑。
第三,在这个请求里要塞入个人访问令牌($DIGITALOCEAN_TOKEN)。这时候还不需要用到大模型访问密钥($MODEL_ACCESS_KEY)。
Output
{
"model_router": {
"uuid": "11f16981-ed77-8bd0-aee4-4e013e2ddde4",
"name": "cost-governance-demo",
"description": "Three-path router for SaaS support: classify, Q-and-A, reasoning",
"regions": ["all"],
"config": {
"policies": [
{
"custom_task": {
"name": "classify",
"description": "Classify a customer support message into exactly one of the following categories: billing, bug, how-to, or account. The message is a short text from a support ticket."
},
"models": ["openai-gpt-oss-20b", "llama3.3-70b-instruct"],
"selection_policy": { "prefer": "cheapest" }
},
{
"custom_task": {
"name": "customer-qa",
"description": "Answer a customer-facing question about the product, account settings, subscription plans, or service behavior. The question may be part of a multi-turn conversation with a user."
},
"models": ["anthropic-claude-4.6-sonnet", "llama3.3-70b-instruct"]
},
{
"custom_task": {
"name": "reasoning",
"description": "Perform complex multi-step reasoning, mathematical analysis, or architectural evaluation that requires tracing through multiple steps and producing a detailed explanation with intermediate conclusions."
},
"models": ["openai-gpt-5"]
}
],
"fallback_models": ["llama3.3-70b-instruct"]
},
"created_at": "2026-06-16T12:50:18Z",
"updated_at": "2026-06-16T12:50:18Z"
}
}
拿到响应后,核对三件事:确认有了 uuid(把它存好,后续如果想用 API 修改或删掉路由会用到);确认 customer-qa 策略里没有 selection_policy 字段;确认 fallback_models 成功带上了 llama3.3-70b-instruct。如果你撞上了 HTTP 400 报错,提示 "model router name already exists",说明 cost-governance-demo 这个名字在你们团队里已经被占用了,换个名字就行。
通过控制面板创建路由
DigitalOcean 网页端控制台也提供可视化的创建界面。你可以直接前往 AI/ML > Inference > My Routers > Create Router 页面。在表单里,逐个填入每个任务策略的任务名称、任务描述、模型池以及选择策略就行。走可视化界面不需要折腾 curl,也不用 PAT 令牌。
在给问答路径配置“手动排序”策略时,把选择策略的下拉框留空即可。模型池列表里的上下顺序就自动代表了优先级。创建完成后,路由立刻就能通过名字直接被调用。
不管是通过 API 还是网页建的路由,以后如果想改,随时可以去 My Routers 菜单点击 Edit Router 进行调整,每个任务池最多支持塞进 3 款模型。
验证路由分发表现
为了卡一眼路由有没有顺利注册、能不能正常响应查询,我们可以用刚才创建成功时返回的 UUID 把配置捞出来:
curl -s "https://api.digitalocean.com/v2/gen-ai/models/routers/11f16981-ed77-8bd0-aee4-4e013e2ddde4" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN"
Output
{
"model_router": {
"name": "cost-governance-demo",
"config": {
"policies": [
{ "custom_task": { "name": "classify" }, "models": ["openai-gpt-oss-20b", "llama3.3-70b-instruct"], "selection_policy": { "prefer": "cheapest" } },
{ "custom_task": { "name": "customer-qa" }, "models": ["anthropic-claude-4.6-sonnet", "llama3.3-70b-instruct"] },
{ "custom_task": { "name": "reasoning" }, "models": ["openai-gpt-5"] }
],
"fallback_models": ["llama3.3-70b-instruct"]
}
}
}
只要返回 200 状态码并带上完整的配置信息,就说明路由已经在系统里挂上号了,随时待命。如果吃了 404 闭门羹,要么是 UUID 输错了,要么是你的 PAT 令牌跟创建路由的团队没对上。
在后端业务中调用路由
大伙儿要记牢,所有推理调用阶段都要用大模型访问密钥($MODEL_ACCESS_KEY),而不是 PAT。请求体里的模型字段固定填写为 "model": "router:<你的路由名称>"。
下面我们用 curl 展示三组请求,分别对应三条不同的任务路径。
分类路径示例:
curl -s "https://inference.do-ai.run/v1/chat/completions" \
-H "Authorization: Bearer $MODEL_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "router:cost-governance-demo",
"messages": [
{
"role": "user",
"content": "Classify this support message into one of: billing, bug, how-to, account. Message: I was charged twice this month."
}
]
}'
Output
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "openai-gpt-oss-20b",
"choices": [
{
"message": { "role": "assistant", "content": "billing" },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 94,
"completion_tokens": 80,
"total_tokens": 174
}
}
返回的 "model": "openai-gpt-oss-20b" 证实了 prefer: cheapest 确实成功挑中了更便宜的模型。这里的 Token 计数(输入 94 / 输出 80与我们 2026 年 6 月 16 日验证的真实运行数据完全吻合。可能有人会纳闷:为什么回一个单词,completion_tokens 却高达 80?这是因为 openai-gpt-oss-20b 是一款具备思维链能力的开源模型,它在吐出最终标签前,会先在内部生成一堆思考 Token,而这些也都会被算进输出 Token 里。最终你眼睛能看到的输出是 "billing",剩下的都是模型自己在台面下的思考过程。
客户问答路径示例:
curl -s "https://inference.do-ai.run/v1/chat/completions" \
-H "Authorization: Bearer $MODEL_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "router:cost-governance-demo",
"messages": [
{
"role": "user",
"content": "How do I reset my password if I no longer have access to my registered email?"
}
],
"max_completion_tokens": 512
}'
Output
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "anthropic-claude-4.6-sonnet",
"choices": [
{
"message": {
"role": "assistant",
"content": "To reset your password without access to your registered email, please contact our support team directly..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 24,
"completion_tokens": 292,
"total_tokens": 316
}
}
返回的 "model": "anthropic-claude-4.6-sonnet" 证实了手动排序策略稳稳地把请求送到了排在首位的模型。Token 计数(输入 24 / 输出 292)同样与 6 月 16 日的测算对得上。
深度推理路径示例:
curl -s "https://inference.do-ai.run/v1/chat/completions" \
-H "Authorization: Bearer $MODEL_ACCESS_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "router:cost-governance-demo",
"messages": [
{
"role": "user",
"content": "A service has three dependencies with 99.9%, 99.95%, and 99.99% uptime. Walk through the math for the combined availability, then explain how adding a redundant instance of the weakest dependency changes it."
}
],
"max_completion_tokens": 4096
}'
Output
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "openai-gpt-5",
"choices": [
{
"message": {
"role": "assistant",
"content": "Combined availability is calculated by multiplying the individual uptimes: 0.999 × 0.9995 × 0.9999 = 0.99840..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 53,
"completion_tokens": 3411,
"total_tokens": 3464
}
}
返回的 "model": "openai-gpt-5" 确认推理任务顺利命中,由 GPT-5 接单提供服务。Token 计数(输入 53 / 输出 3,411)完全符合 6 月 16 日的测试。这里需要特别提醒大家:我们在请求里把 max_completion_tokens 设成了 4096。在之前的测试中,如果面对同样的推理提示词把这个值限制在 1024,结果会返回 "content": null 且 "finish_reason": "length"。这意味着 GPT-5 把额度全部消耗在内部的思考步骤上了,根本没有多余的 Token 来吐出最终答案。所以,走推理路径时,记得把最低预算留够 4,096 个 Token,并根据预期的回答长度往上加。
GPT-5 配合推理路由走 /v1/chat/completions 端点非常省心,你完全不需要在代码里写任何特殊的适配逻辑,路由会在底层透明地搞定分发。不过需要注意,GPT-5 虽然能算对答案,但有时可能会拒绝在响应体里公开它的内部思考步骤。因此,千万不要让应用程序的业务逻辑强行去依赖思维链(Chain-of-Thought)的输出。
如果你习惯用 OpenAI 官方的 SDK,下面是针对分类路径的 Python 等效代码:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MODEL_ACCESS_KEY"],
base_url="https://inference.do-ai.run/v1/"
)
response = client.chat.completions.create(
model="router:cost-governance-demo",
messages=[
{
"role": "user",
"content": "Classify this support message into one of: billing, bug, how-to, account. Message: I was charged twice this month."
}
]
)
print(response.choices[0].message.content)
print(f"Served by: {response.model}")
Output
billing
Served by: openai-gpt-oss-20b
通过 response.model,你能直接透视是哪款大模型在为你打工。这就是单次请求的成本审计信号,不需要去后台翻仪表盘就能一眼看清。
读取单次请求的成本信号
响应头里的 x-model-router-selected-route 会明确标出命中了哪条任务策略,而 response.model 则指明了最终提供服务的模型。把这两个家伙组合在一起,你就拿到了单次请求的路由溯源凭证。
如果想在 Python 里读取这个响应头,可以借助 .with_raw_response 方法:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MODEL_ACCESS_KEY"],
base_url="https://inference.do-ai.run/v1/"
)
raw = client.chat.completions.with_raw_response.create(
model="router:cost-governance-demo",
messages=[
{
"role": "user",
"content": "Classify this support message into one of: billing, bug, how-to, account. Message: I was charged twice this month."
}
]
)
response = raw.parse()
matched_task = raw.headers.get("x-model-router-selected-route")
serving_model = response.model
usage = response.usage
print(f"Matched task: {matched_task}")
print(f"Served by: {serving_model}")
print(f"Tokens in/out: {usage.prompt_tokens} / {usage.completion_tokens}")
OutputMatched task: classify
Served by: openai-gpt-oss-20b
Tokens in/out: 94 / 80
x-model-router-selected-route: classify 这一结果证实了提示词(Prompt)成功匹配到了你设定的分类任务,而没有滑向兜底方案(Fallback)。如果这个 Header 返回的是 fallback 而不是某个具体的任务名称,则说明提示词没有对上任何你配置过的任务描述。这是判断“路由匹配失败”的核心信号,一旦出现,就会触发后面“可观测性(Observability)”章节中所提到的排查调试步骤。
多模型 API 成本治理
任务与成本结果的映射
这里我们基于 2026 年 6 月 16 日的实时运行 Token 数,结合 2026 年 5 月核实的单价,算出了每条路径的单次请求成本:
| 路径 (Path) | 所用模型 (Model) | Token 数 (输入/输出) | 单次请求成本 |
|---|---|---|---|
| 分类 (Classify) | openai-gpt-oss-20b | 94 / 80 | $0.00004070 |
| 客户问答 (Customer Q&A) | anthropic-claude-4.6-sonnet | 24 / 292 | $0.00445200 |
| 深度推理 (Reasoning) | openai-gpt-5 | 53 / 3,411 | $0.03417625 |
具体的成本精算公式(已验证):
- 分类任务: (94 × $0.05 + 80 × $0.45) / 1,000,000 = $0.00004070
- 问答任务: (24 × $3.00 + 292 × $15.00) / 1,000,000 = $0.00445200
- 推理任务: (53 × $1.25 + 3,411 × $10.00) / 1,000,000 = $0.03417625
注:所有价格后续都有可能变动。最新计费标准请查阅 DigitalOcean 官方定价 ,或直接咨询卓普云AI Droplet。
利用模型分级掌控推理开销
大家可以瞅一眼数据:深度推理路径的单次请求成本,足足是分类路径的 840 倍左右($0.03417625 对比 $0.00004070)。根据任务的复杂程度把请求分流到对应的档位上,才能让每一分钱都花在刀刃上,让平均开销和任务的核心价值成正比。
这里我们得把 GPT-5 的成本结构拆透:GPT-5 的输入 Token 单价(每百万 $1.25)其实比 Claude Sonnet 4.6(每百万 $3.00)还要便宜。之所以推理路径比问答路径贵这么多,纯粹是因为推理任务疯狂产生了近 12 倍的输出 Token(实测中是 3,411 对比 292),而 GPT-5 的输出单价高达每百万 $10.00。也就是说,推理路径的成本完全是被输出 Token 量给吃掉的。我们在 《无服务器推理中那些至关重要的指标》 基准测试中发现的 230 倍成本跨度也是这个大道理——推理模型在吐出最终答案前,会产生大量算作输出计费的“思考 Token”。
成本对比表:智能路由 vs. 全盘硬编码旗舰模型
我们假设一个月有 70 万次分类请求、25 万次问答请求和 5 万次推理请求,基于 2026 年 6 月 16 日实测的单次请求成本,对比结果如下:
| 配置方案 | 分类开销/月 | 问答开销/月 | 推理开销/月 | 月总开销 | 路由省了多少钱 |
|---|---|---|---|---|---|
| 智能路由(分级配置) | $28.49 | $1,113.00 | $1,708.81 | $2,850.30 | 基准线 |
| 全盘硬编码 Claude Sonnet 4.6 | $1,037.40 | $1,113.00 | $2,566.20 | $4,716.60 | 帮你省了 39.6% ($1,866.30) |
| 全盘硬编码 Claude Opus 4.7 | $1,729.00 | $1,855.00 | $4,277.00 | $7,861.00 | 帮你省了 63.7% ($5,010.70) |
| 全盘硬编码 GPT-5 | $642.25 | $737.50 | $1,708.81 | $3,088.56 | 帮你省了 7.7% ($238.26) |
比起全盘硬编码 Claude Sonnet 4.6,智能路由每个月能帮你砍掉 39.6% 的开销(在这个业务量下能省 $1,866.30);跟 Claude Opus 4.7 相比,更是直接省下 63.7%(狂省 $5,010.70)。即便跟 GPT-5 一比到底,路由也能省下 7.7%(省 $238.26),因为路由把问答路径分流给了 Sonnet(花销 $1,113.00),而如果全盘用 GPT-5 跑问答只需要 $737.50。也就是说,跟 GPT-5 对抗省下来的钱,几乎全是从分类路径上抠出来的。
当然,这 39.6% 和 63.7% 的省钱比例跟你的业务流量结构紧密相关。如果你的后端全是深度推理请求,省钱比例就会缩水。因为在推理路径上,路由池里只有单一模型,路由除了增加一丁点点延迟外,没法给你更便宜的替代品。路由真正的省钱威力,来自于把分类和问答这两个档位成功剥离了出来。
多模型编排模式
模式一:基于复杂度的路由机制
本教程搭建的三路径路由就是典型的“基于复杂度的路由”:我们根据输出所需的“智商复杂度”来切分任务,每个档位配对应体量的模型。分类路径用 20B 小模型,问答路径用顶尖聊天模型,推理路径用推理专用大模型。
如果你的后端任务彼此独立、且能通过提示词内容一眼看穿,那这个模式就太香了。比如你的系统同时要处理“文档摘要”、“实体提取”和“代码生成”这三种独立调用,你只需要定义三个任务策略,把各自的输出要求写进描述里,底层的 MoE 分类器就会妥妥地帮你分发。记得任务描述要多针对“输出格式”来写,如果只是写一堆彼此交织的话题领域,分类器容易犯糊涂。
模式二:高可用兜底与成本红线拦截
fallback_models 字段是专门用来对付那些“迷路提示词”的安全网。在我们上面建的路由里,llama3.3-70b-instruct 会接住所有分类器认不出来的野路子提示词。这同时也充当了成本的防火墙:未分类的请求会被发给开源的兜底模型,而不是悄悄跑去调用昂贵的商业旗舰模型,避免账单爆表。
此外,问答策略里的“手动排序”结构,本身就是第二层应用内兜底。如果 Claude Sonnet 4.6 临时宕机了,路由会先尝试切到同个池子里的 llama3.3-70b-instruct,实在不行才会走到全局的 fallback_models。这让问答路径具备了优雅降级的能力,不至于动不动就全盘崩溃。
如果你的业务有死命令,要求单次请求成本绝对不能超标,常用的套路是在调用路由之前的应用层中间件里,加一个预算拦截层。如果预估这次推理请求的成本要超标,应用层可以在接触路由前把请求降级改写为普通问答任务,或者直接拒绝。推理路由本身是不会强行帮你卡死单次消费上限的。
模式三:会话保持与缓存经济学
对于多轮问答(Q&A)会话,会话保持(Session Pinning)能让同一个会话里的后续请求,牢牢锁定在第一次提供服务的那个模型上。这能防止聊着聊着中途突然换模型,同时还能让该会话的上下文前缀保持在 KV 缓存(KV-cache) 的热启动状态,免去重复处理输入 Token 的冤枉钱。
想锁死会话很简单,只需要在每次请求时传一个固定的会话标识符给 X-Model-Affinity 请求头。第一通电话会正常走 MoE 分类器选模型,后续只要带上相同的会话 ID,路由就会直接免检分发给同一个模型,不再重跑分类器。你可以通过检查响应返回的 x-model-affinity 头,以及观察 response.model 是不是自始至终没变过,来验证会话保持有没有生效。
不过,OpenAI 官方的 Python SDK 原生并没有把这个 Header 暴露出来。你需要用 extra_headers 把它送过去,再用 .with_raw_response 把它捞回来:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MODEL_ACCESS_KEY"],
base_url="https://inference.do-ai.run/v1/"
)
session_id = "session-test-001" # 在生产环境里,每个用户的会话要用一个固定的标识符
raw = client.chat.completions.with_raw_response.create(
model="router:cost-governance-demo",
messages=[
{"role": "user", "content": "How do I update my billing address?"}
],
extra_headers={"X-Model-Affinity": session_id}
)
response = raw.parse()
affinity_echo = raw.headers.get("x-model-affinity")
print(f"Served by: {response.model}")
print(f"Affinity header echoed: {affinity_echo}")
print(f"Tokens: {response.usage.prompt_tokens} in / {response.usage.completion_tokens} out")
Output Served by: anthropic-claude-4.6-sonnet
Affinity header echoed: session-test-001
Tokens: 15 in / 245 out
响应里吐回的 x-model-affinity: session-test-001 说明路由已经乖乖收下了会话标识。当你发第二条带相同 session_id 的消息时,会拿到完全相同的 response.model,并且不带任何路由开销。如果没看到这个返回,说明 Header 头中途丢了,或者该端点对命中的模型不支持会话保持。
在 Anthropic 的模型上,提示词缓存(Prompt Caching) 能帮长对话或者带长前缀的会话省下大笔输入成本,因为命中缓存的输入单价只有标准价格的 10% 左右。至于 DO 上的 OpenAI 模型,只要提示词达到 1024 个 Token 以上,就会自动触发提示词缓存,直接享受输入 5 折优惠。不过,DO 上的开源模型目前还不支持提示词缓存。如果把会话路由到了不同的模型,缓存直接就清零了。所以说,会话保持和缓存经济学是绑定在一起的——想守住缓存,就必须用会话保持把模型锁死。
可观测性与排查调试
分析仪表盘 (The Analyze Dashboard)
你可以直接通过控制台的 AI/ML > Inference > Analyze 路径复盘推理路由的运转风向。在这里能看到整个路由流量的“模型命中率”和“兜底率”。具体指标含义可以去翻阅 功能参考文档,关于单次请求的成本和延迟信号,也有专门的 无服务器推理指标文档说明 供参考。

- 模型命中率(Model match rate): 指的是成功对上你自定义任务策略的请求比例。如果这个比例低于 90%,多半是因为你的任务描述写得太宽泛,或者几个任务之间严重撞车了。
- 兜底率(Fallback rate): 指的是啥任务都没对上、直接滑进
fallback_models的请求比例。如果兜底率居高不下,说明你配置的任务类型根本没覆盖到用户真实的提示词花样。
此外,Playground(演练场)里的 Router Evaluation(路由评估) 标签页还提供了“大模型裁判(LLM-as-a-Judge)”功能,能直接给回答的“完整度(Completeness)”、“正确度(Correctness)”、“Token 消耗量”和“延迟”打分。在把流量切到生产环境前,强烈建议先用它做个比对,确保分类路径换了便宜模型后,输出质量没有被原本的单模型方案甩开。
验证任务匹配质量
如果你想测试某个特定的提示词到底会被发往哪个任务,可以直接把它发过去,然后当场盘查 x-model-router-selected-route 这个 Header 头:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MODEL_ACCESS_KEY"],
base_url="https://inference.do-ai.run/v1/"
)
raw = client.chat.completions.with_raw_response.create(
model="router:cost-governance-demo",
messages=[{"role": "user", "content": "My invoice shows a duplicate charge"}]
)
matched_task = raw.headers.get("x-model-router-selected-route")
print(f"Matched task: {matched_task}")
Output Matched task: classify
对于一句关于账单 duplicate charge(重复计费)的抱怨,命中 classify 完全符合预期。如果这个 Header 给你吐回了 customer-qa 或者 fallback,说明 classify 和 customer-qa 的任务描述严重撞衫了。分类器要么是把分类任务误认成了问答,要么就是彻底懵圈直接摆烂了。这时候你需要把 classify 的描述修改得更倾向于“输出分类标签”,把 customer-qa 的描述修改得更倾向于“输出大白话解答”,然后用同样的提示词再测一次。
几个高频踩坑点
任务描述写得太和稀泥。 比如写一句“回答关于产品的问题”,这几乎能撞上客服后端的每一个请求。描述一定要写出具体的输出特性,比如:“针对账户设置、订阅计划或历史账单回答客户提问,回答时需要检索或解释账户特定的信息。”对输出格式写得越具体,分类器认得就越准。
任务描述彼此撞车。 如果 classify 和 customer-qa 在语义上高度相似,分类器在面对模糊的提示词时就会左右摇摆、乱分一气。记住,Classify 吐的是分类标签,customer-qa 吐的是散文式解答。在写描述时,要把这些输出形式上的差异表达出来,而不仅仅是罗列业务话题。
忘了配 fallback_models。 如果路由没写兜底模型,一旦碰到对不不上号的提示词,会直接简单粗暴地报错弹回。不管怎样,至少配一个兜底模型,最好是单次成本极低的实力派开源大模型。
模型池塞得太满。 每个任务的模型池最多只能放 3 款模型。一旦超标,路由在创建或修改时就会直接拒绝你。具体限制可以去参考官方的 限额与配额文档。
几种推理路由流派的大比拼
规则路由 (Rule-Based Routing)
规则路由纯看请求的硬性结构来分发,比如看 URL 路径、Header 头、JSON 里的某个字段,或者直接看你指定的模型参数。它不需要分类器介入,完全不增加内容评估的延迟,而且结果是 100% 确定的。但软肋也很明显:它完全看不懂提示词的内容。如果分发决策在读到提示词之前就已经做下了,那么哪怕提示词里面的风向变了,绑定在特定 URL 路径上的路由逻辑也只能一杠子走到底。
如果你的业务在应用层就已经把任务划分得井井有条(比如不同任务走不同的 Endpoint,或者客户端会主动传一个明确的任务参数),那直接上规则路由是最稳妥的起点。
语义路由 (Semantic Routing)
语义路由会在分发前去读提示词的内容,借此判断任务类型。DigitalOcean 推理路由走的就是这个流派,靠背后的 MoE 分类器来干活。虽然分类器会带来不到一秒的微小路由开销,但它能让你根据实打实的任务内容来做决策,而不是瞎猜。这让路由对应用层保持完全透明,即便以后的任务模式变了,应用端代码也完全不用动。
EMNLP 2024 关于 TensorOpera Router 的研究表明,基于提示词内容的路由分发在类似成本下,比起单模型部署,能让查询效率提升 40%,成本砍掉 30%,输出质量还能顺带提高 10%。
成本联动动态路由 (Cost-Aware Dynamic Routing)
成本联动动态路由在语义路由的基础上更进一步,引入了各种实时信号:比如实时的计费变动、模型当前的延迟表现,或是来自持续评估流水线的模型质量评分。路由在被调用的那一刻,会根据当下的蛛丝马迹挑出最优解,而不是死守静态配置。这玩法灵活上天,但实现和运维的复杂度也同样高得吓人。
对于跨越多个云厂商、流量大到惊人的巨头团队来说,一旦某家调价或者模型局部不可用,动态路由能帮你把语义路由漏掉的羊毛全薅回来。但对于绝大多数驻扎在单一云厂商身上的 SaaS 后端而言,语义路由配合调校得当的任务描述,就已经能吃下绝大部分的成本红利了,而且运维复杂度要低得多。
决策避坑指南:如何挑选最适合你的策略
| 工作负载 | 建议采用的策略 | 选用理由 |
|---|---|---|
| 任务已经通过端点或请求字段做好了分流 | 规则路由 (Rule-based) | 零分类器开销;结果 100% 确定 |
| 各种复杂度的任务全揉在一个端点里进包 | 语义路由 (以 DO 推理路由为代表) | 逐条提示词智能分发;应用端代码一行不用改 |
| 跨多家供应商、体量极大、对价格极度敏感的后端 | 成本联动动态路由 | 动态适应实时计费变动与模型可用性 |
| 业务复杂度高度单一,任务没有任何差异化 | 不使用任何路由 | 路由只会白白增加延迟,带不来任何省钱效益 |
| 处于严格的合规审计环境中,要求每次选模型都白纸黑字可追溯 | 规则路由 或 不使用路由 | 语义路由是概率性的,分发结果无法做到完全可解释 |
什么时候该用路由,什么时候千万别用?
在以下场景中,推理路由是你的绝佳帮手:
- 你的后端请求在任务复杂度上存在断层,且不同档次对大模型的能力要求大不相同。比如你的流量里 70% 都是简单的分类,10% 是复杂的硬核推理,这就太适合用路由了。低成本流量占比越高,省钱威力越大,而且路由能在不改应用代码的情况下帮你把这笔钱抠出来。
- 你的后端跑的是 Agent(智能体)流水线,中间需要串联多次不同复杂度的大模型调用。流水线里的每一次呼叫都会根据提示词内容独立分发,再配合会话保持(Session Pinning),还能让多轮 Agent 会话稳在同一个模型上,死守缓存收益。想深度围观智能体任务模式的同学,可以移步卓普云官网博客阅读 《推理路由与模型任务匹配》。
- 你想做成本治理,但不想在应用程序里堆砌恶心的路由分发逻辑。分发让路由去扛,你的应用面对的永远是一个干净的端点和雷打不动的响应格式。
但在以下场景中,请直接劝退推理路由:
- 你的业务任务复杂度铁板一块。如果每一次请求都必须动用同一款模型,路由根本没有施展空间,不到一秒的微小路由 overhead 反而会平白拉长你的响应延迟。
- 你身处严格的合规或审计漩涡中,要求每一次模型挑选都必须是确定、可审计的。语义路由本质上是概率性的:虽然分类准确率极高,但谁也没法打包票保证 100% 不看走眼,而且分发结果很难单从请求本身做出绝对完美的合规解释。
- 你垂涎的模型压根不在 DigitalOcean 的模型目录里。推理路由只能在 Inference Engine 模型库 内部可用的模型之间拉皮条。如果你的业务非要跨厂商调度,自托管一套开源语义路由或动态路由才是正解。
- 在决定用哪种架构前,你想先算算 无服务器推理和专用推理之间的损益平衡点。
常见报错与排查排毒
调用直接被鉴权报错弹回,但我的两个凭证明明各自都是好使的。
- 病因: 你的 MAK(
$MODEL_ACCESS_KEY)和 PAT($DIGITALOCEAN_TOKEN)悄悄跨了团队(Team)。这两个凭证必须属于同个 DigitalOcean 团队,否则不管路由怎么配都会直接吃闭门羹。在本教程的前期验证中,几乎所有早期的探针失败都是这个坑引起的,跟路由本身或者 GPT-5 没有任何关系。赶紧去 DO 控制台核对一下团队归属,在正确的团队下重新生成凭证并配好环境变量再试。
调用商业模型(Claude 或 GPT-5)时提示权限错误。
- 病因: 你的账户还没升到 Tier 3。Claude Sonnet 4.6 和 GPT-5 必须要 Tier 3 或更高的账户等级才能解锁。Tier 1 和 Tier 2 只能在开源大模型里打转。赶紧去检查你的账户等级并升个级。如果暂时升不了,记得把路由的模型池换成纯开源模型的组合。
推理路径返回 "content": null 且 "finish_reason": "length"。
- 病因: 你的
max_completion_tokens预算给得太小家子气了。GPT-5 这类推理大模型在吐出你肉眼可见的答案前,要在后台烧掉大量的 Token 跑内部思考。在本教程的实测中,把推理提示词的max_completion_tokens设成 1024 就会直接报content: null。把预算大方地加到 4096 后,瞬间顺利跑通。记住,走推理路径,最低给够 4,096 个 Token 预算,如果预期输出的细节比较长,还要继续往上加。
创建路由时返回 HTTP 400 报错,提示 "model router name already exists"。
- 病因: 名字在你们团队里被占用了。完整报错一般长这样:
"id": "invalid_argument" 且 "message": "rpc error: code = InvalidArgument desc = model router name already exists"。给新路由换个响亮的新名字吧。
x-model-router-selected-route 怎么老是返回 fallback?
- 病因: 没有任何任务描述对得上发进来的提示词。常见原因包括:任务描述写得太像假大空的口水话、各任务描述大面积撞车,或者你压根没在配置里涵盖这类提示词场景。去 Analyze 仪表盘瞅瞅 fallback 利率的走势,把每个任务描述修改得更精准、更具差异化。可以参考前面“读取单次请求的成本信号”章节里的
.with_raw_response套路,针对个别提示词进行定点微调,放流量前核对清楚。
资源清理
如果你玩腻了,想把本教程建的路由删掉,带上你的 PAT 令牌发一个 DELETE 请求,把 UUID 挂在屁股后面就行:
curl -s -X DELETE \
"https://api.digitalocean.com/v2/gen-ai/models/routers/<你的路由UUID>" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN"
鉴于公测期间路由功能完全免费,挂在那儿也不会产生额外的账单开销。不过,在路由正式跨入 GA(商业化计费)阶段前,顺手删掉不需要的实验路由,能让你的控制台列表清爽很多。
FAQ
什么是 DigitalOcean 推理路由?
推理路由是一个中间件组件,负责接收 LLM API 请求,并根据任务类型和配置的选择策略,把请求分发给最合适的模型。它驻扎在客户端应用和大模型托管层之间,让你无需动用应用层代码就能实现模型的动态调度。DigitalOcean 推理路由内嵌了一个语义 MoE 分类器,能把你发去的提示词与你创建路由时写下的自然语言任务描述进行智能匹配。
DigitalOcean 推理路由跟传统的 API 网关有什么区别?
传统的 API 网关干的主要是鉴权、限流以及把请求死板地转发给固定后端的活儿。而 DigitalOcean 推理路由在此基础上,注入了语义任务匹配灵魂:内嵌的 MoE 分类器会通读传进来的提示词,把它跟你配的任务描述做比对,再派发到对应的模型池里。随后,池子里的选择策略会根据成本、速度或手动排序挑出具体模型,全程不需要应用层代码操心半点路由逻辑。
推理路由真的能帮我省下大模型 API 的开销吗?
真的能,而且可能省不少。 路由的核心奥义就是把简单的任务分流给便宜的小模型,把旗舰大模型留给真正复杂的硬核任务,从而在混合业务场景下拉低单次请求的平均成本。在每月 70 万次分类、25 万次问答和 5 万次推理的真实流量结构下,走路由分级的总花费是 $2,850.30,而硬编码 Claude Sonnet 4.6 的总花费是 $4,716.60——路由直接帮你砍掉了 39.6% 的开销。不过,如果你的任务复杂度高度整齐划一,省钱效果微乎其微;而如果分类、实体提取或摘要这类请求满天飞,路由能帮你省到大笑。
DigitalOcean 推理路由支持哪些 task-matching 和选择策略?
路由目前支持四种选择策略:成本效益(prefer: cheapest)、速度优化(prefer: fastest)、手动排序(模型按你列出的列表顺序顺次尝试,不需要写 selection_policy 字段)以及最优推荐(仅支持 DO 官方预设的任务类型,自定义任务无法染指)。任务匹配完全基于语义:内嵌的 MoE 分类器会拿提示词去跟你创建路由时填写的 custom_task.description 逐一做语义对齐。这里头没有任何顺次堆叠的死板规则。
在路由上下文里,无服务器推理和专用推理有什么分别?
无服务器推理跑在共享资源池上,按请求次数结账,支持自动扩缩容(甚至能缩容到零,不拉屎不占坑)。专用推理则直接为你包下专享算力,延迟稳如老狗,容量固定。DigitalOcean 推理路由非常全能,既能指挥无无服务器度专用推理后端。通过配合“速度优化”或“手动排序”策略,你可以把专用模型绑在特定的质量敏感路径上,稳稳吃下独占容量和稳定延迟的 SLA 承诺。
推理路由支持智能体 (Agentic) 业务场景吗?
支持,没问题。 DigitalOcean 推出 2026 年 4 月的 Inference Engine 时,就把推理路由作为其核心模块,专门用来应对智能体(Agentic)业务规模化上量的问题。智能体任务通常包含一连串串联的、复杂度高低不等的模型调用,这正好能发挥“逐条提示词智能分流到对应模型分级”的威力。此外,你还可以用 X-Model-Affinity 请求头做会话保持,让多轮 Agent 会话牢牢锁定在同个模型上,死守 KV 缓存(KV-cache)的收益。
如果推理路由配置没按预期匹配上,我该怎么排查调试?
赶紧打开 Analyze 仪表盘,瞧一眼模型命中率和兜底率。如果兜底率高得离谱,说明路由根本认不出进来的提示词,多半是因为你的 custom_task.description 描述写得太宽泛、太和稀泥,或者几个任务之间严重撞车了。把每个任务描述修改得更精准、更具差异化,然后通过盘查个别提示词返回的 x-model-router-selected-route 响应头来反复测试。另外,千万记得核对一下:调用时传的 MODEL_ACCESS_KEY 凭证必须和创建路由时的 PAT 属于同个 DO 团队;如果团队跨了,管你路由配得多完美,都会直接吃闭门羹。
DigitalOcean 推理路由兼容 OpenAI 的 API 格式吗?
完全兼容。 路由是通过兼容 OpenAI 的端点来调用的,地址是 https://inference.do-ai.run/v1/chat/completions。在请求体里把 model 参数指定为 "model": "router:<你的路由名称>" 就行。返回的响应严格遵循 OpenAI 的标准聊天补全格式,只是多附带了一个 x-model-router-selected-route 响应头,用来告诉你这次到底对上了哪个任务策略。
GPT-5 能通过推理路由以 Chat Completions 的形式正常工作吗?
完全可以,实测通过。 虽然 GPT-5 在 OpenAI 官方平台上直接调用时被强行要求走 Responses API,但在 DigitalOcean 推理路由这里,它被完美封装在普通的 /v1/chat/completions 接口下了。客户端应用不需要做任何特殊魔改。不过需要注意,GPT-5 有时候可能会直接吐出正确答案,却拒绝暴露内部的思维链(chain-of-thought)步骤;因此,千万别把你的应用逻辑写成死等响应体里必须包含思维链输出。
在推理路由策略里使用 Claude 或 GPT-5 需要什么账户级别?
想要调用 Anthropic 和 OpenAI 的商业大模型,你的 DigitalOcean 账户 必须升到 Tier 3 或更高。Tier 1 和 Tier 2 会被无情卡死在纯开源模型的圈子里。所以在路由的任务策略里配置 Claude 或 GPT-5 的模型标识(Slug)之前,先去 DO 控制台核对一下你的账户等级。
总结
在本教程中,我们成功为一套 SaaS 客服后端搭建了一个包含三条路径的推理路由(Inference Router)。我们配置了基于成本效益、手动排序以及单模型挑选的任务策略,通过兼容 OpenAI 的聊天补全端点成功跑通了每条路径,并顺理成章地从响应头和模型字段中读取到了单次请求的成本信号。从月度成本比对来看,在每月 70 万次分类、25 万次问答和 5 万次推理的流量结构下,智能路由比起全盘硬编码 Claude Sonnet 4.6 能帮你省下 39.6% 的开销,对比 Claude Opus 4.7 更是狂省 63.7%。根据 2026 年 6 月 16 日实测的运行数据,每条路径的单次请求成本分别为:分类路径 $0.00004070,问答路径 $0.00445200,推理路径 $0.03417625。
有了这套路由系统坐镇,你就能直接在模型挑选层把 LLM 推理开销治理得明明白白,应用层代码一行都不用动。每次请求返回时,你都能清清楚楚地看到派发给了哪个模型、对上了哪个任务,以便做单次请求的成本归因。同时,你还能在问答路径上利用会话保持把模型锁死,牢牢守住多轮对话的 KV 缓存收益。以后要是想增加对新任务类型的覆盖,你只需要新建一个任务策略并写好描述就齐活了,应用的接入端点雷打不动。
相关产品与选型



