LLM API 的锁定实际长什么样
LLM 集成里的锁定很少以合同条款出现——它以代码出现。直接对着一家供应商的 SDK 写,它的请求形状、流式格式、工具调用 schema 和错误码会穿进整个应用。以后换第二家意味着整段重写,而不只是改一个配置值。
一层路由会让这更好或更糟,取决于它站在什么上面。如果这层发明自己的专有请求格式,你只是把锁定上移一层——现在你依赖路由器的方言而不是供应商的。如果它实现的是*标准*方言,你写的代码天生可移植。
站在标准上,而不是专有层
AnyRouter 实现已经存在的请求形状,而不是发明新的:OpenAI 的 Chat Completions、Anthropic 的 Messages,以及较新的 OpenAI Responses API,都在同一个端点上。代码库已经会说的那种 SDK 原样继续工作。
| 方言 | 端点 | 用途 |
|---|---|---|
| OpenAI chat | /api/v1/chat/completions | OpenAI chat SDK 的即插替换 |
| Anthropic messages | /api/v1/messages | Claude 客户端的即插替换 |
| OpenAI Responses | /api/v1/responses | 较新的 OpenAI Responses 表面 |
| Embeddings | /api/v1/embeddings | OpenAI 风格的向量嵌入 |
因为这些是公开标准而不是自家格式,打 AnyRouter 的同一份客户端代码也能打源 API——你的集成没有任何 AnyRouter 专有部分。
两行切进去,两行切回来
把现成的 OpenAI 客户端指到 AnyRouter,只改 base URL 和 key——别的不动:
from openai import OpenAI
client = OpenAI(
base_url="https://anyrouter.dev/api/v1", # was https://api.openai.com/v1
api_key="sk-ar-v1-...",
)
resp = client.chat.completions.create(
model="openai/gpt-5.5",
messages=[{"role": "user", "content": "Hello"}],
)反过来是同一两行的反方向。这种对称才是锁定的真正测试:离开的 diff 和进来一样只要两行,你就从未被锁住。
选模型变成一个配置值
模型 id 是覆盖 28+ 家供应商 170+ 模型的 provider/model 字符串,所以换模型是改字符串,不是重新接入新 SDK、新鉴权方案和新的错误处理路径。今天 anthropic/claude-opus-4-8,明天 google/gemini-2.5-pro——同一客户端、同一把 key、同一个端点。

自己握着 key,出口也开着
最深的锁定是一份你走不掉的账单关系。$0 加价 BYOK 避开它:挂上你自己的供应商 key,AnyRouter 上面不加一分——没有按请求费、没有附加费,你只付给供应商。底层供应商关系仍是你的,没有被中间化。
- 只用标准方言 — Chat Completions、Messages、Responses、Embeddings — 没有专有请求格式可依赖。
- 模型 id 是配置值(
provider/model),不是 SDK 集成。 - $0 加价 BYOK 让供应商账单关系仍是你的。
- 同一份客户端代码指向源供应商也能跑——切出去和切进来一样便宜。
在标准 API 表面上路由——没有专有方言,没有锁定。
免费拿一把 key