十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Switchyard提供商中立IR设计哲学:为什么路由算法从不触碰任何供应商SDK

Switchyard提供商中立IR设计哲学:为什么路由算法从不触碰任何供应商SDK Switchyard提供商中立IR设计哲学为什么路由算法从不触碰任何供应商SDK【免费下载链接】SwitchyardSwitchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible model selection, benchmarking, and cost/performance optimization.项目地址: https://gitcode.com/GitHub_Trending/switch/SwitchyardSwitchyard 是一个 LLM 流量路由代理它能把每次大模型调用分发给最能胜任且最便宜的模型同时完整保留 OpenAI 与 Anthropic 的原生 API 兼容性。实现这一目标的核心设计是一套提供商中立的中间表示Provider-Neutral IR所有路由算法只操作自己定义的中立类型从始至终不依赖任何一家供应商的 SDK。本文带你从架构视角拆解这套设计看看它如何把适配 N 家供应商、M 种路由策略的复杂度从 N×M 降到 NM。痛点直接依赖供应商 SDK 有多麻烦如果你的路由逻辑直接调用 OpenAI SDK 和 Anthropic SDK会遇到三类问题翻译爆炸客户端有 2 种 API 格式、上游有 3 种格式请求和流式响应各需要 2×3 种互转每新增一家供应商就多一倍胶水代码逻辑耦合分类器、升级策略等算法一旦 import 了某个 SDK就很难复用、很难单元测试供应商锁定换一家模型商路由核心代码就要跟着改。Switchyard 的答案很简单算法层只认识自己定义的类型供应商格式在边界处统一转换。三步请求生命周期解码 → 路由 → 编码整个链路在 docs/architecture.md 中被描述为五步其中与 IR 直接相关的是三步Normalize解码把入站的 OpenAI Chat、OpenAI Responses 或 Anthropic Messages 请求解码为提供商中立类型Route路由算法只消费中立类型做决策发布路由结论Encode编码按目标模型上游声明的format重新编码请求响应再逆向翻译回客户端格式。关键点在于格式是显式声明的不是探测出来的。每个 LLM client 必须写明formatopenai_chat、openai_responses或anthropic_messagesSwitchyard 不会自动猜测上游协议。这让系统行为完全可预期。IR 的定义者switchyard-protocol crateIR 本身由 crates/protocol/ 独立 crate 承载它的定位写得很克制This crate defines contracts; it does not route, translate, or perform network calls. —— crates/protocol/README.md即只定义契约不路由、不翻译、不发起网络调用。它把一次对话完整建模为一组中立类型领域代表类型对话LlmRequest、Message、InstructionBlock、ContentBlock工具ToolDefinition、ToolChoice、ToolCall、ToolResult响应AggLlmResponse、Usage、StopReason流式LlmResponseStream、ProviderStreamEvent信封Request、Response、Metadata其中 crates/protocol/src/llm.rs 定义的内容块尤其值得注意Text、Reasoning含供应商签名、Image、ToolCall、Refusal等变体把各家 API 的差异统一进了一个枚举——Role甚至同时容纳了 OpenAI 的developer角色。这样算法读取用户说了什么、工具返回了什么时与供应商彻底解耦。翻译层switchyard-translation 的纯 Rust承诺IR 与各家线格式之间的转换由 crates/switchyard-translation/ 完成其 README 明确承诺通过switchyard-protocol的中立类型进行翻译不依赖供应商 SDK、HTTP 服务器、Python 或 FFI 绑定。转换代码按格式分目录组织每种格式各有请求、缓冲响应、流式三类编解码器crates/switchyard-translation/src/codecs/openai_chat/crates/switchyard-translation/src/codecs/anthropic/crates/switchyard-translation/src/codecs/responses/这正是 NM 复杂度的来源新增一家供应商只需补一组编解码器所有算法零改动。算法层只认 IR不认模型商路由算法实现在 crates/libsy/ 中其依赖清单见 crates/libsy/Cargo.toml里没有任何供应商 SDK——只有switchyard-protocol、serde、tokio 等基础设施。算法与外部的交互被压缩成一条Step 流定义于 crates/libsy/src/core/algorithm.rs算法输出Step::CallModel附上按偏好排序的模型 ID 列表由宿主你的网关或 switchyard-server负责真正发起 HTTP 调用传输、重试、凭据全部归宿主所有结果以Done步骤带回最终选择。分类结果同样是中立的算法只选择efficient高效或capable强大这类角色而非具体模型 ID。角色与真实模型的映射由宿主在每次请求时注入——同一个上游模型可以在不同路由中扮演不同角色。这就是为什么文档里反复强调capable 和 efficient 是算法内的角色不是模型的固定属性见 docs/core_concepts.md。这套设计带来的实际收益NM 而非 N×M格式转换集中在 translation 层算法与供应商互不感知可嵌入任意网关pip install nemo-switchyard或 Rust 依赖switchyard-libsy后路由算法可直接跑进你自己的 harness网络层一行不用改可测试算法单元测试只需构造中立类型无需 mock 任何供应商 API客户端零改造Claude Code、Codex CLI 等继续使用原生 APIswitchyard-translation在幕后处理跨格式翻译。快速上手三种使用路径如果你只想先跑起来README.md 提供了三条路径路径适合谁入口文档NeMo Relay 插件已有 Relay 部署的团队crates/switchyard-nemo-relay-plugin/README.md嵌入库自有网关/测试框架可运行示例 examples/libsy.py独立代理没有网关、直接代理客户端crates/switchyard-server/README.md独立代理模式下写一份 routes.toml 声明 LLM client、target 与路由算法switchyard-server启动后同时暴露/v1/chat/completions、/v1/messages、/v1/responses三个端点——同一个路由 ID三种原生格式都能进。小结Switchyard 的提供商中立 IR 设计可以概括为一句话供应商格式只在边界存在算法世界只有中立类型。switchyard-protocol定义契约、switchyard-translation负责换装、switchyard-libsy专注决策三个 crate 各司其职。想深入更多细节可以继续阅读 docs/routing_algorithms/overview.md 与 docs/reference/rust_api.md。【免费下载链接】SwitchyardSwitchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible model selection, benchmarking, and cost/performance optimization.项目地址: https://gitcode.com/GitHub_Trending/switch/Switchyard创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表