NVIDIA开源Switchyard,用Rust实现跨OpenAI/Anthropic API的请求路由与格式转换,支持Claude Code和Codex CLI直接对接vLLM、NIM、Ollama。
运行编码 Agent 的团队总会遇到同样的墙:Claude Code 讲的是 Anthropic Messages API,Codex CLI 讲的是 OpenAI,而团队真正想用的模型却跑在 vLLM、NVIDIA NIM 或 Ollama 后面。改造 Agent 本身不现实,翻译层只能另找地方安放。
Switchyard 是 NVIDIA 给出的答案:一条 Rust 代理和库,用于在 providers 之间路由 LLM 流量、在 OpenAI 和 Anthropic 格式之间做翻译、记录运维指标,并暴露类型化、可组合的路由算法。它以 Apache 2.0 协议发布,文档见 docs.nvidia.com/nemo/switchyard。
可以部署吗?可以,但仅供评估。二进制从 crates.io 安装,启动器从 PyPI 安装,可自托管到任意位置,但 NVIDIA 将 Switchyard 标注为 pre-alpha 和实验性质,警告其不适用于生产,并预期在 v1.0 之前 API 和算法会有重大变化。
客户端保留自己的原生 API。Switchyard 将入站请求解码为 provider 中立的 Rust 类型,运行路由算法选择后端,将请求重新编码为该后端自己的 wire 格式,发起调用,再将响应(包括流式事件)翻译回客户端期望的形状。
服务端接受三种入站格式:OpenAI Chat Completions、OpenAI Responses 和 Anthropic Messages。三者任意一种都可以寻址任意路由,每个配置好的 LLM 客户端选择自己的一种上游格式。这种解耦正是重点:Agent 的 API 和后端的 API 不再需要匹配。
启动器路径面向编码 Agent。用 uv tool install --python 3.12 "nemo-switchyard[cli]" 安装发布的工具,然后运行 switchyard launch claude、switchyard launch codex 或 switchyard launch openclaw,目标是打包好的部署或你自己的 TOML 文件。
服务端路径用 cargo install --locked switchyard-server 安装独立代理,用 --dry-run 验证配置,然后在指定的主机和端口上启动服务。
库路径使用 switchyard-lib,它将路由算法嵌入 Rust 应用而不自行管理 HTTP 栈。它从不直接调用模型;算法只决定使用哪个目标,并将所有模型调用回传给调用方。
一条路由是一个客户端可见的模型 ID 加上背后的算法。服务端支持以下路由类型:
passthrough 将每个请求发送到一个目标。
random 使用可选的相对权重将流量拆分到多个目标,支持可选的种子以复现选择序列。这是 A/B 测试和成本实验的路径。
llm_classifier 调用一个分类器目标获取能力裁决,然后路由到弱目标或强目标。base_threshold 是必填的;min_confidence、capability_elevated_floor 和 session_affinity 用于调优,分类器无法判断的任何请求都会回退到强目标。将 mode = "escalation" 设置为每个回合先在弱层级运行,再由分类器决定是否在强层级重新运行。
stage_router 对最近回合的工具结果和 Agent 进度信号打分,以选择有能力的或高效的目标,在大多数回合中避免额外的分类器调用。
Strong、weak、capable 和 efficient 是路由内的角色,而非模型的固定属性。同一个上游模型可以在不同路由中承担不同角色。
GET /metrics 从服务端的进程级 OpenTelemetry provider 返回 Prometheus text 格式。指标族涵盖请求数、错误数、模型调用延迟、完整回合延迟、prompt token、completion token、缓存命中、缓存创建和 reasoning token,以及按结果和状态码分类的上游 HTTP 调用次数。tier 标签携带 strong 或 weak 以区分分类器决策,且分类器调用不计入这些指标族。
更有意思的指标是 switchyard_routing_overhead_ms,它报告算法运行时间减去服务该请求的调用时间。分类器调用不做扣除,因此 LLM-classifier 路由在此处报告其分类时间,而 passthrough 和 random 报出的是选取目标的亚毫秒级成本。桶的起始值为 0.1 ms。另外,--routing-log-file 追加每条完成响应的 JSON 记录,GET /v1/routing/session-stats 从该日志返回每个会话的调用数和 token 总计。
TOML 部署分为三层:llm_clients 定义 base URL、wire format、凭证环境变量和重试策略;targets 将一个上游模型 ID 绑定到一个客户端;routes 暴露一个客户端可见的模型 ID 及其算法。密钥绝不能放在文件里,因为 api_key_env 只指定一个环境变量名称。max_retries 默认为 2,适用于传输失败、超时、HTTP 408/429 和 5xx 响应。
Switchyard 是一个 Apache-2.0 的 Rust 代理和库,用于路由和翻译 LLM 流量。
它在 OpenAI Chat、OpenAI Responses 和 Anthropic Messages 之间双向桥接,包括流式响应。
提供四种路由类型:passthrough、random、LLM-classifier 和信号驱动的 stage router。
Prometheus 指标将路由开销与模型调用延迟隔离开,按模型和 tier 分别统计。
它目前为 pre-alpha,明确不适用于生产,请将其作为评估工具使用。
去看看 GitHub Repo 和 Documentation。另外,别忘了在 Twitter 上关注我们,并加入我们 15 万+ 的 ML SubReddit,订阅我们的 Newsletter。等一下!你用 telegram 吗?现在也可以加入我们了。
需要与我们合作来推广你的 GitHub Repo 或 Hugging Face Page 或产品发布或网络研讨会等?请联系我们
Michal Sutter 是一位数据科学专业人士,拥有帕多瓦大学数据科学硕士学位。凭借在统计分析、机器学习和数据工程方面的坚实基础,Michal 擅长将复杂数据集转化为可操作的洞察。