介绍
推理路由器是位于您的应用与模型服务层之间的中间件,它会根据任务将每个 LLM API 调用路由到合适的模型,而不是把所有请求发送到同一个端点。它解决的问题是大多数 SaaS 后端默认会产生的计费工件:当单一前沿模型处理所有请求时,简单的分类调用(94 输入 token)和复杂的推理调用(3,411 输出 token)都会按较难任务的费率计费。于是廉价任务以错误的方向补贴了昂贵任务。
DigitalOcean 推理路由器是于 2026 年 4 月推出的 推理引擎 组件之一,目前处于公开预览阶段。
本教程将在 SaaS 支持后端构建一个具有三种任务策略的可工作路由器:低成本分类路径、对质量敏感的客户问答路径以及推理路径。完成后,您将拥有一个可通过标准 OpenAI 聊天补全端点调用的路由器,能够从响应头读取每请求的成本信号,以及一种用于问答路径的会话固定模式,以在多轮对话中保持 KV 缓存 的温度。
要点
- 采用单一前沿模型统一处理所有请求的 SaaS 后端,在分类调用上仍需支付前沿模型的费率,而实际上一个 200 亿参数的开源模型同样能够胜任,根据已确认的实际运行,其每请求成本最高可达前者的 36 倍。
- DigitalOcean 推理路由器使用混合专家(MoE)分类器,将每条传入的提示与您配置的自然语言任务描述进行匹配。匹配到的任务会根据选择策略从该任务的模型池中挑选出具体模型,整个过程不采用有序规则评估。
- 需要两套独立的凭据,且它们必须属于同一个 DigitalOcean 团队:用于创建和管理路由器的控制平面个人访问令牌(
$DIGITALOCEAN_TOKEN),以及用于推理调用且前缀为sk-do-的模型访问密钥($MODEL_ACCESS_KEY)。即使两个凭据各自有效,团队不匹配也会导致调用失败。
selection_policy 字段;models[] 中的列表顺序即为排名表达式,这一点已通过 2026 年 6 月 16 日的实时 API 调用得到确认。
先决条件
在按照本教程操作之前,您需要:
- DigitalOcean 账户需为 第 3 层或更高。Claude Sonnet 4.6 和 GPT-5 是需要第 3 层+ 访问权限的商业模型。第 1 层和第 2 层账户仅限于使用开源模型。检查您的层级和限制.
- 具有写入 Inference API 权限的 DigitalOcean 个人访问令牌(PAT),存储为
$DIGITALOCEAN_TOKEN。此凭据仅用于控制平面:创建和管理路由器。请勿将其用于推理调用。 - 从推理控制台获取的模型访问密钥(MAK),存储为
$MODEL_ACCESS_KEY。该凭据带有sk-do-前缀,专用于推理调用。 - PAT 和 MAK 必须属于同一个 DigitalOcean 团队。团队不匹配会导致调用失败,无论路由器如何配置。这是在多个 DO 账户之间工作时最常见的配置错误。
- 本教程中的控制平面调用使用
curl;调用示例则使用带有openai包的 Python(pip install openai)。 - 熟悉 OpenAI 聊天补全 API 格式。
本教程中使用的模型 slug 包含 openai-gpt-oss-20b、llama3.3-70b-instruct、anthropic-claude-4.6-sonnet 和 openai-gpt-5。请在 模型目录 中核实当前可用性。
什么是推理路由器?
推理路由器是一种中间件组件,负责接收 LLM API 请求,并根据任务类型和已配置的选择策略,把每个请求分派给合适的模型——你的应用代码中无需编写任何路由逻辑。应用只需将所有请求发送到同一个端点,并在请求中指定 "model": "router:,分发工作完全由路由器负责。
推理路由器如何融入 DigitalOcean 推理引擎
推理引擎将无服务器推理、专用推理和推理路由器整合在统一的 API 之下。路由器所处的层级,决定了推理引擎内部由哪个模型来处理每个传入请求。它通过推理端点(https://inference.do-ai.run/v1/chat/completions)接受调用,采用标准的 OpenAI chat completions 格式。推理路由器操作指南完整记录了创建和管理路由器所需的全部参数;可用模型列表则列出了当前的模型标识(slug)以及各层级可访问的模型。
无服务器推理与专用推理:哪些请求会被路由,为什么
无服务器推理运行在共享基础设施上,按请求计费,支持自动扩缩容(包括缩容至零)。专用推理则运行在预留的计算资源上,延迟可预期,每个端点的容量固定。这两类部署,推理路由器都能调度。对于需要保障容量和稳定延迟 SLA 的工作负载,可以选择 Speed Optimization 或 Manual Ranking 选择策略,把专用模型指定为任务池中的首选。关于各部署类型在容量与成本上的取舍,请参阅无服务器推理、专用推理与批量推理的对比。
推理路由如何工作
推理路由器是一个语义路由器,而不是基于规则的调度器。每个传入的提示都会由 MoE 分类器模型进行评估,该模型会将其与您在创建路由器时定义的自然语言 custom_task.description 字段进行匹配。匹配到的任务的选择策略随后会从该任务的模型池中挑选出一个特定模型。不存在有序评估,也不存在“首个匹配任务胜出”的行为。
任务匹配与选择策略
任务匹配是语义的:MoE 分类器读取完整的提示并将其与最接近的任务描述匹配。您的任务描述质量决定匹配准确性。将 custom_task.description 的值写为描述性任务定义,而不是标签或类别名称。
路由器支持四种选择策略:
| 策略 | API 表达式 | 使用时机 |
|---|---|---|
| 成本效率 | "selection_policy": { "prefer": "cheapest" } |
多模型池;最小化每请求的开支 |
| 速度优化 | "selection_policy": { "prefer": "fastest" } |
多模型池;最小化首个 token 的延迟 |
| 手动排名 | 无 selection_policy 字段。models[] 中的列表顺序即为排名表达式。 |
需要确定性模型偏好的质量敏感路径 |
| 最优 | "task_slug": " |
仅限 DO 预设任务类型;自定义任务不可用 |
对于手动排名,完全省略 selection_policy 字段是正确的 API 表达式。这通过 2026 年 6 月 16 日的一次实时创建调用得到确认:API 会按照列表顺序回显模型,而该顺序即为策略。
路由方法:静态、语义和基于成本
三种不同的方法描述了推理路由器如何调度请求:
静态路由根据请求的固定属性进行分发,例如 URL 路径、某个头部值或请求字段。它不需要分类器,且仅增加微小的延迟,但无法根据提示内容进行自适应。发送到同一端点的计费问题和错误报告在静态路由器的视角下看来完全相同。当工作负载已经通过应用程序逻辑或显式模型参数进行分段时,可采用此方法。
语义路由在分发前会评估提示的内容以确定任务类型。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[]。x-model-router-selected-route 响应头,用于标识匹配的任务。
响应体中的 model 字段显示了哪个模型处理了该请求。这两个字段共同提供了按请求的路由归属,无需打开 Analyze 仪表盘。
此解决的成本问题
在 无服务器推理中重要的指标 的基准测试中,单个完成答案的成本在模型目录中大约波动 230 倍,这几乎完全由模型选择驱动,而非提供商定价差异。
泛化税是指后端为所有任务使用单一前沿模型时您需要支付的费用。在本教程的实时运行中确认的令牌数下,单次分类调用(94 in / 80 out)在 openai-gpt-oss-20b 上的成本为 $0.00004070。发送到 Claude Sonnet 4.6 的同一调用成本为 $0.00148200,溢价 36 倍。发送到 GPT-5 的成本为 $0.00091750,溢价 22.5 倍。这些倍数适用于您流量中的每个分类请求。
每月 700,000 次分类请求,将分类流量路由到 openai-gpt-oss-20b 与硬编码使用 Claude Sonnet 4.6 的成本差异为每月 $28.49 与 $1,037.40。下面的路由架构在不修改任何应用程序代码的情况下捕获了这一节省。
架构:三条路径,三个模型层级
本教程实现了一个三路径路由器,反映了 SaaS 支持后端的任务复杂度结构。
分类器路径。 传入的支持工单首先被分类为以下类别:计费、故障、操作指南或账户。这是一个短输入、类别输出任务。 openai-gpt-oss-20b 是主要模型,因为它是池中最便宜的选项,并且在此任务类型上能产生正确的类别标签。 llama3.3-70b-instruct 是后备模型。 选择策略:prefer: cheapest。
客户问答路径。 多轮、面向用户的问题需要在会话间保持一致的质量,并在特定领域内容上表现可靠。 anthropic-claude-4.6-sonnet 是主要模型,llama3.3-70b-instruct 是后备模型。 选择策略:手动排名(Sonnet 列在第一位,selection_policy 字段被省略)。 手动排名优于 prefer: fastest 的原因是,池中最快的模型在任何一次运行中可能是较弱的,而此路径对质量敏感。 手动排名提供确定的 Sonnet 行为(除非不可用)。
推理路径。 复杂的多步推理任务证明了 GPT-5 的每请求成本是合理的,因为任务价值很高。 请注意,GPT-5 的输入速率($1.25/百万)低于 Claude Sonnet 4.6 的($3.00/百万)。 推理路径的成本更高,因为它生成了大量更多的输出令牌(在确认的实际运行中为 3,411 个,而问答路径为 292 个),并且输出令牌在推理路径上的成本占主导,与标头速率无关。
路由器后备。 llama3.3-70b-instruct 捕获 MoE 分类器未匹配到任何已配置任务的提示。 这可以防止未匹配的请求返回错误,并将它们路由到低成本的强大开源模型。

在为自己的后端配置任务层级之前,请测量实际的调用分布。 如果后端有 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 字段。这是正确且故意的。省略该字段会启用手动排名:Router 会按照列表顺序尝试模型。Claude Sonnet 4.6 被放在列表首位,因而会被首先尝试。
custom_task.description 的值是 MoE 分类器模型的输入。请将它们编写为任务定义,而不是显示标签。诸如“一般问题”这样的模糊描述会与大多数传入提示重叠,导致路由准确性下降。
PAT($DIGITALOCEAN_TOKEN)应填入此请求。MAK($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 > 推理 > 我的路由器 > 创建路由器 提供可视化路由器创建流程。对于每个任务策略,您需要在表单字段中指定任务名称、任务描述、模型池和选择策略。控制面板不需要使用 curl 或个人访问令牌(PAT)。
对于 Q&A 路径上的手动排名策略,请保持选择策略下拉框未设置。池列表中的模型顺序决定排名。创建后,路由器即可通过名称直接调用。
无论是通过 API 还是控制台创建的路由器,之后都可以在 “我的路由器” 菜单中使用 “编辑路由器” 进行编辑,每个任务池最多可包含 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 属于与创建路由器的团队不同的团队。
从后端调用路由器
所有推理调用使用 MAK($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 选择了低成本模型。令牌数量为 94 in / 80 out 与 2026 年 6 月 16 日验证的实际运行结果一致。该 completion_tokens: 80 单词回答的令牌数量为 80 是预期的:openai-gpt-oss-20b 是一种会在输出可见标签之前将内部推理标记计为完成标记的推理式开放模型。答案 "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" 确认 Manual Ranking 将请求发送到了首列模型。Token 数量 24 in / 292 out 与 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 处理。令牌数 53 in / 3,411 out 与 6 月 16 日验证运行的一致。此处的 max_completion_tokens 设置为 4096。在确认的实时测试中,将此推理提示的值设为 1024 时返回了 "content": null 以及 "finish_reason": "length":GPT-5 在内部推理步骤上耗尽了全部预算,可见答案没有剩余的令牌。在任何推理路径上设置最低 4,096 个令牌的预算,并根据预期输出长度适当增加。
GPT-5 通过 Inference Router 在 /v1/chat/completions 上运行,您这端无需进行特殊处理。Router 透明地管理调度。然而,GPT-5 可能会给出正确答案,但在响应体中选择不公开内部推理步骤。请不要编写依赖于思维链输出存在的应用逻辑。
使用 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}")
Outputbilling
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 确认提示匹配了分类器任务,而不是回退。如果此头返回 fallback 而非命名任务,则提示未匹配任何已配置的任务描述。这是路由不匹配的主要信号,并触发可观察性部分中的调试步骤。
多模型 API 成本治理
将任务映射到成本结果
每个路径的每请求成本,使用 2026 年 6 月 16 日实时运行的令牌数量以及在 2026 年 5 月验证的价格:
| 路径 | 模型 | 令牌(输入/输出) | 每请求成本 |
|---|---|---|---|
| 分类 | openai-gpt-oss-20b |
94 / 80 | $0.00004070 |
| 客户问答 | anthropic-claude-4.6-sonnet |
24 / 292 | $0.00445200 |
| 推理 | 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
所有价格可能会变动。当前价格位于 https://docs.digitalocean.com/products/inference/details/pricing/。
使用模型层级控制推理支出
推理路径每请求的成本大约是分类器路径的 840 倍($0.03417625 与 $0.00004070)。根据任务复杂度将请求路由到适当的层级,使平均成本与任务价值成比例。
理解 GPT-5 的成本结构非常重要:GPT-5 的输入费率(每百万 tokens 1.25 美元)低于 Claude Sonnet 4.6(每百万 tokens 3.00 美元)。推理路径的成本高于问答路径,因为推理产生的输出 token 数量大约是问答的 12 倍(实时运行中分别为 3,411 与 292),而 GPT-5 的输出费率(每百万 tokens 10.00 美元)适用于这些 token。推理路径的成本主要由输出 token 量决定。这一点与 Metrics that Matter with Serverless Inference 基准测试中记录的 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% 的节省会随流量组合而变化。如果后端中推理流量占请求的比例更大,则会看到更小的节省百分比,这是因为推理路径上的路由决策是单模型池:路由器在此路径上只增加了开销,而未提供更便宜的替代方案。节省来源于分类和问答层的分离。
多模型编排模式
模式 1:基于复杂度的路由
本教程构建的三路路由器采用基于复杂度的路由:任务按照所需输出的认知复杂度进行划分,每层使用与该任务规模匹配的模型。分类器路径使用 20B 参数模型,问答路径使用前沿聊天模型,推理路径使用经过推理优化的模型。
此模式适用于任务类型明显且可通过提示内容区分的后端。如果您的后端将文档摘要、实体抽取和代码生成作为不同的调用类型处理,则定义三个任务策略,其描述应反映这些输出类型,MoE 分类器将据此进行路由。请保持每个任务描述针对其输出格式具体化,因为当任务描述描述的是不同的输出类型而非重叠的主题时,分类器的表现更佳。
模式 2:可用性和成本防护的回退
The fallback_models field provides a safety net for unmatched prompts. In the router created above, llama3.3-70b-instruct catches any prompt the classifier does not match to a named task. This also serves as a cost guardrail: unclassified requests route to the open-source fallback rather than silently hitting a commercial frontier model.
Q&A 政策的 Manual Ranking 结构在政策内部提供了第二层回退机制。如果 Claude Sonnet 4.6 不可用,Router 会在进入全局 fallback_models 数组之前回退到 llama3.3-70b-instruct。这使得 Q&A 路径能够在不发生完全中断的情况下实现平滑降级。
对于需要严格按请求成本上限的后端,一种模式是在调用路由器之前在应用中间件中添加预算检查层。如果推理请求的估计成本超过阈值,应用会将请求重新框架为 Q&A 任务或在其到达路由器之前直接拒绝。路由器本身不强制执行按请求的花费限制。
模式 3:会话固定和缓存经济学
对于多轮 Q&A 会话,会话固定会将会话中的后续请求保持在服务首个请求的同一模型上。这可以防止会话中途切换模型,并保持该会话前缀的 KV‑cache 温热,从而减少冗余的输入令牌处理。
要固定会话,请在会话中的每个请求上携带一个稳定的会话标识符的 X-Model-Affinity 头。第一次请求会正常通过 MoE 分类器进行路由。具有相同会话 ID 的后续请求将由同一模型直接服务,而无需重新运行分类器。您可以通过读取响应中回显的 x-model-affinity 头并确认 response.model 在各次调用之间保持一致来验证固定。
OpenAI Python SDK 原生不提供此头。使用 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" # use a stable identifier per user session in production
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")
OutputServed by: anthropic-claude-4.6-sonnet
Affinity header echoed: session-test-001
Tokens: 15 in / 245 out
x-model-affinity: session-test-001 在响应中被回显,表明 Router 已接受会话标识符。使用相同的 session_id 发送第二个请求将返回相同的 response.model 值,且不会产生路由开销。如果回显缺失,则表明该头被丢弃,或该端点不支持对匹配模型的亲和性。
在 Anthropic 模型上使用提示缓存,对于具有长重复前缀的会话可以显著降低输入成本,因为缓存读取的费用大约是标准输入价格的 10%。在 DO 上的 OpenAI 模型,自动提示缓存适用于 1,024 个标记或更多的提示,输入价格可享受 50% 折扣。DO 上的开源模型尚不支持提示缓存。将会话路由到不同的模型会重置缓存,因此会话固定和缓存经济性是耦合的:固定是保持缓存激活的机制。
可观测性和调试
分析仪表板
Inference Router 的 Analyze 仪表板可在 AI/ML > 推理 > 分析 处访问。它展示了您路由器流量中的模型匹配率和回退率。功能参考 文档列出了可用的指标。无服务器推理指标参考 涵盖了每请求的成本和延迟信号。

模型匹配率是匹配命名任务策略的请求所占的百分比。低于 90% 的比率通常意味着任务描述过于泛化或存在显著重叠。回退率是未匹配任何任务并转至 fallback_models 的请求所占的百分比。较高的回退率表示传入的提示在您的任务配置中未得到体现。
Playground 的 Router 评估选项卡提供基于完整性、正确性、使用的标记数和延迟的 LLM-as-a-Judge 评分。使用它来确认,在将流量路由到实际环境之前,分类器路径上的更便宜模型路由不会相对于单模型基线降低输出质量。
验证任务匹配质量
要检查某个提示词是否会路由到预期的任务,可以发送该提示词,然后查看 x-model-router-selected-route:
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}")
OutputMatched task: classify
classify 是账单投诉的预期匹配。如果头部返回 customer-qa 或 fallback 而不是,classify 和 customer-qa 的任务描述重叠太多。分类器匹配了 Q&A 描述而不是 classify 描述,或者根本没有找到匹配。使 classify 描述更具体地针对类别输出,Q&A 描述更具体地针对散文答案输出,然后使用相同的提示重新测试。
常见错误配置
任务描述过于泛泛。 像 “回答有关产品的问题” 这样的描述与支持后端中的几乎所有提示重叠。编写能够反映特定输出类型的描述:“回答客户面向的关于账户设置、订阅计划或账单历史的问题,其中响应需要检索或解释特定于账户的信息。” 对输出格式的具体化有助于分类器可靠地区分任务。
任务描述重叠。 如果 classify 和 customer-qa 的描述在语义上相似,分类器会在它们之间不一致地路由不明确的提示。classify 产生一个类别标签;customer-qa 产生一段散文答案。在描述中描述这些不同的输出类型,而不仅仅是主题领域。
缺少 fallback_models。 没有 fallback_models 的路由器会对未匹配的提示返回错误。请配置至少一个后备模型,最好是每请求成本低的功能强大的开源模型。
池大小超出限制。 每个任务池最多可容纳 3 个模型。Router 将拒绝超过此限制的创建或编辑请求。请参阅 限制和配额 以了解当前的限制。
比较推理路由方法
基于规则的路由
基于规则的路由根据结构属性分派请求:URL 路径、一个头部值、一个 JSON 字段,或者model 参数自身的值。它不需要分类器,不会因内容评估而增加延迟,并且完全确定性。其局限性在于无法适应提示内容。将路由逻辑烘焙到 URL 路径中的请求,在提示内容变化时无法改变行为,因为分派决策是在读取提示之前就做出的。
当工作负载已经通过应用逻辑分段时,基于规则的路由是正确的起点,例如为不同任务类型提供独立的端点,或由客户端显式传递的任务参数。
语义路由
语义路由在分派前评估提示内容以确定任务类型。DigitalOcean 推理路由器通过其 MoE 分类器实现语义路由。该分类器为每个请求增加微小的亚秒级路由开销,但它使得分派决策能够基于实际任务内容而非代理信号,这意味着路由对应用是透明的,并且在任务模式演变时不需要进行更改。
EMNLP 2024 对 TensorOpera 路由器的研究表明,基于提示内容的路由相比相似成本下的单模型部署,可以实现查询效率提升 40%、成本降低 30%、质量提升 10%(Stripelis 等人,TensorOpera 路由器:用于高效 LLM 推理的多模型路由器)。
成本感知动态路由
成本感知动态路由通过实时信号扩展语义路由:实时定价、当前模型延迟测量,或来自持续评估管道的每模型质量分数。路由器在调用时基于当前条件选择最优模型,而非静态配置。这更具灵活性,但实施和运营的复杂性显著增加。
对于在多个提供商上大规模运行的团队,当定价变化或模型可用性变化时,成本感知动态路由可以弥补语义路由所遗漏的节省。对于大多数单一提供商的 SaaS 后端,语义路由配合经过良好调整的任务描述即可在运营复杂度大幅降低的情况下获得大部分成本收益。
决策表:选择正确的策略
| 工作负载 | 推荐策略 | 原因 |
|---|---|---|
| 已按端点或请求字段分段的任务 | 基于规则 | 无分类器开销;完全确定性 |
| 通过单一端点处理的混合复杂度任务 | 语义(DO Inference Router) | 按提示分发;无需更改应用代码 |
| 多提供商、高容量、对价格敏感的后端 | 成本感知动态 | 适应实时定价和可用性变化 |
| 单模型工作负载,没有显著的任务变化 | 无路由器 | 路由器增加开销而没有路由收益 |
| 需要可审计模型选择的合规环境 | 基于规则或无路由器 | 语义路由是概率性的,不能完全解释 |
何时使用此模式以及何时不使用
使用推理路由器的情况:
您的后端处理的请求具有不同的任务复杂度层级,这些层级在模型需求上有显著差异。如果 70% 的请求是分类调用,10% 是复杂推理任务,那么这种后端非常合适。成本节约与廉价任务流量的比例成正比,路由器能够捕获这些节约而无需修改应用代码。
您的后端运行着包含多个不同复杂度级别的顺序模型调用的代理管道。管道中的每个调用根据其提示内容独立进行路由,而会话固定确保多轮代理会话停留在同一模型上以保持缓存一致性。要深入了解代理工作负载模式,请参阅 推理路由和模型任务匹配。
您希望在应用层不使用路由逻辑的情况下实现成本治理。路由器负责分发;您的应用看到的是一个单一端点和一致的响应格式。
不要使用推理路由器的情况:
您的工作负载在任务复杂度上是均匀的。如果后端每个请求都需要相同的模型,则路由没有任何好处,而亚秒级的开销只会增加延迟,却没有成本节约。
您处于需要对每个请求进行确定性、可审计的模型选择的合规或审计环境中。语义路由是概率性的:分类准确率虽高但不保证,且派发的模型取决于提示内容,仅凭请求本身无法完全解释。
您所需的模型不在 DigitalOcean 目录中。Inference Router 仅将请求路由到 推理引擎 中可用的模型。对于跨多个提供者的工作负载,自托管语义路由或成本感知动态路由是合适的架构。
在决定采用何种路由架构之前,您需要进行无服务器与专用推理之间的盈亏平衡分析。请参阅 专用与无服务器推理在规模上的对比 以了解容量和成本的交叉点。推理路由的数据隐私影响在 数据隐私文档 中有说明。
故障排除
尽管各个凭据均有效,调用仍会因身份验证错误而失败。
MAK($MODEL_ACCESS_KEY)和 PAT($DIGITALOCEAN_TOKEN)属于不同的 DigitalOcean 团队。两者必须属于同一个团队,否则无论路由配置如何,调用都会失败。在本教程的预草稿验证运行中,所有早期探测失败均由此不匹配导致,而非任何 Router 或 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;同样的提示词在 max_completion_tokens: 4096 下则顺利完成。凡是推理路径,token 上限至少要设为 4,096;如果你的提示词需要输出更长的详细内容,还应继续调高。
创建路由器的调用返回 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 模式逐条测试提示词,确认它们各自会匹配到哪个任务。
清理资源
要删除本教程中创建的路由器,请使用创建响应中返回的 UUID 发送 DELETE 请求:
curl -s -X DELETE \
"https://api.digitalocean.com/v2/gen-ai/models/routers/" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN"
在公开预览期间,Router 是免费的,因此保持其运行不会产生计费影响。在您不再需要它时删除它,以在 Router 达到 GA 定价之前保持路由器列表的整洁。
常见问题
什么是 DigitalOcean 推理路由器?
推理路由器是一个中间件组件,它接收 LLM API 请求,并根据任务类型和配置的选择策略将每个请求导向合适的模型。它位于客户端应用程序和模型服务层之间,能够在不修改应用程序代码的情况下实现动态模型选择。DigitalOcean 推理路由器使用语义 MoE 分类器将每个提示与您在创建路由器时定义的自然语言任务描述进行匹配。
DigitalOcean 推理路由器与标准 API 网关有何不同?
标准 API 网关负责身份验证、速率限制以及将请求转发到固定后端。DigitalOcean 推理路由器添加了语义任务匹配:MoE 分类器读取每个传入的提示,将其与您配置的任务描述进行匹配,并将其分派到相应的模型池。该池上的选择策略随后根据成本、速度或显式排名选择特定模型,而无需在您的应用程序代码中添加任何路由逻辑。
推理路由器能否降低 LLM API 成本?
是的。通过将简单任务路由到更小、成本更低的模型,并将前沿模型保留用于高复杂度任务,Router 能够降低混合工作负载中每个请求的平均成本。在每月 700,000 次分类请求、250,000 次问答请求和 50,000 次推理请求的流量分配下,路由配置的成本为 2,850.30 美元,而 Claude Sonnet 4.6 基线的成本为 4,716.60 美元,降幅达 39.6%。均匀复杂度的工作负载节省甚微;在分类或摘要请求占比较高的后端中,能够看到显著的成本降低。
DigitalOcean 推理路由器支持哪些任务匹配和选择策略?
Router 支持四种选择策略:成本效率(prefer: cheapest)、速度优化(prefer: fastest)、手动排名(按您列出的顺序尝试模型,无需 selection_policy 字段)以及最优(仅限 DO 预设的任务类型,不可用于自定义任务)。任务匹配基于语义:MoE 分类器会将每个传入的提示与您在创建路由器时提供的自然语言 custom_task.description 字段进行匹配。不存在有序规则评估。请参阅 推理路由器使用指南 以获取当前完整的支持参数列表。
在路由上下文中,无服务器推理与专用推理有何区别?
无服务器推理在共享基础设施上运行,采用按请求计费和自动扩缩,包括缩容至零。专用推理在预留计算资源上运行,具有可预测的延迟和固定容量。DigitalOcean 推理路由器将请求路由到无服务器和专用推理后端。通过速度优化或手动排名选择策略,专用模型可用于需要保证容量和一致延迟 SLA 的工作负载。请参阅 推理文档 以了解每种部署类型的当前配置选项。
推理路由器是否支持 Agentic 工作负载?
是的。DigitalOcean 将推理路由器设计为 2026 年 4 月推理引擎发布的一部分,专门用于支持 Agentic 工作负载的扩缩。Agentic 工作负载通常涉及多个顺序的模型调用,复杂度各不相同,从而受益于按请求将其路由到合适规模的模型层级。使用 X-Model-Affinity 会话固定,使多轮 Agent 会话保持在同一模型上,以保持 KV 缓存的一致性。
如何调试与预期不匹配的路由器配置?
打开 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": "router:。响应遵循标准 OpenAI 聊天补全格式,并额外包含 x-model-router-selected-route 头,指示匹配的任务策略。请访问 推理路由器使用指南 以确认当前的兼容性详情。
GPT-5 是否能通过聊天补全端点在推理路由器上工作?
已确认。尽管在 OpenAI 平台直接调用 GPT-5 需要使用 Responses API,但 DigitalOcean 推理路由器会透明地通过 /v1/chat/completions 提供 GPT-5 服务。客户端应用无需进行特殊处理。GPT-5 可能会正确回答,但会拒绝暴露内部推理步骤;请勿编写依赖于响应体中存在思维链输出的应用逻辑。
在路由器策略中使用 Claude 或 GPT-5 需要哪种账户等级?
来自 Anthropic 和 OpenAI 的商业模型需要 Tier 3 或更高等级的 DigitalOcean 账户。Tier 1 和 Tier 2 账户仅可使用开源模型。在配置包含 Claude 或 GPT-5 模型标识的路由器任务策略之前,请在 DO 控制台中确认您的等级。
结论
本教程为 SaaS 支持后端构建了一个三路径的 Inference Router,使用成本效率、手动排名和单模型选择配置任务策略,通过 OpenAI 兼容的 chat completions 端点调用每条路径,并从响应头和 model 字段读取每请求的费用信号。月度费用对比表明,相较于 Claude Sonnet 4.6 基线可节省 39.6%,相较于 Claude Opus 4.7 可节省 63.7%,流量分配为每月 70 万次分类、25 万次问答和 5 万次推理请求。2026 年 6 月 16 日的实际运行确认的每请求费用为:分类路径 $0.00004070,问答路径 $0.00445200,推理路径 $0.03417625。
有了此路由,您无需修改应用代码,即可在模型选择层管控 LLM 推理费用,在每次响应中读取已派发的模型和匹配的任务以进行每请求费用归因,并在问答路径上使用会话固定(session pinning)以在多轮对话中保持 KV‑cache 温热。为新任务类型添加覆盖仅需新增一条带有清晰描述的任务策略;应用端点保持不变。
想要深入了解在配置模型层级之前如何选择需要在推理栈中测量的指标,请参阅 无服务器推理中重要的指标。对于需要在固定容量下获得可预测延迟 SLA,而非依赖无服务器自动伸缩的工作负载,请参阅 专用与无服务器推理在规模上的对比。想要了解如何使用 Inference Router 构建成本感知的 AI 支持 API 的姊妹篇教程,请参阅 带 Inference Router 的成本感知 AI 支持 API。撰写本文时,Inference Router 处于公开预览阶段;如需了解 GA 状态,请查看 Inference Engine 产品页面。