DeepSeek 接 Anthropic 协议:五家基座迁移横评(2026 Q3 实战版)
适用读者:想在 Claude Code / Cursor 这类 Anthropic 协议工具里跑 Qwen / GLM / Kimi / DeepSeek / Sonnet 这些基座模型的开发者
阅读时长:约 12 分钟
测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档)
一、为什么 2026 年 Q3 突然都在聊"迁移到 Anthropic 协议"
上周帮朋友把一套 Claude Code 上的 Skill/Subagent 配置搬到国产推理后端,本来以为"协议兼容"应该是一键换 URL 的事,结果从下午一点搞到晚上九点。光 Qwen 这家就重写了三个 Skill,因为它家的 tool_use 返回字段对不上 Anthropic 的 schema,Subagent 的 system 注入位也有差异。不是技术不行,是各家对 Anthropic 协议的实现"自由发挥"。
为什么要迁移?三股力量叠在一起。
第一是价格 。Anthropic Claude Sonnet 4.6 这一档(后文我用 claude-sonnet-4-6 这个 row_key 指代)在 2026 年 7 月的公开报价是输入约 ¥15/1M tokens、输出约 ¥75/1M tokens,而国产同类档位普遍在 ¥3/¥9 这个区间,差出来 8 倍。第二是限流 ,Anthropic 这半年对国内 IP 的限速策略在收紧,实测同类任务下延迟方差翻倍,白天晚高峰 95 分位能从 4 秒掉到 11 秒。第三是国产 Flash 档把门槛拉低,这件事单独说。
V4 这一档 Flash 基座对 Anthropic 的 /v1/messages 端点做了完整透传,以前要在网关层写协议翻译,现在直接换 base_url 就行,但"换得动"不等于"Skill 全通"。至于旗舰档(也就是本文要评的五家)是不是也透传、透传得多完整,各家差异就比较大了。
我这次跳过通用横评,直接按"Claude Code 真实迁移场景"做对比,从 Skill 重写率、迁移工时、token 价差三个维度,看谁真正能"一个下午"接住流量。涉及的五家 row_key 是 claude-sonnet-4-6(Anthropic 原版基线)、qwen3.7-max(阿里通义旗舰)、glm-5.2(智谱)、kimi-k2.7-code(月之暗面代码特化)、deepseek-r1(深度求索)。
二、Anthropic 兼容到底在比什么
先把概念钉死,不然后面维度会乱。Claude Code 这类客户端默认用 /v1/messages 端点,请求体核心字段是 model、messages、system、tools、tool_choice。响应侧关键是 content 数组里 type=tool_use 的块,以及 stop_reason=tool_use 标志位。Subagent 实现依赖 tools 里把另一个 agent 当函数调用。
国产各家表面都把这套端点抄了下来,差异在三个细节:
| 细节差异 | 影响 |
|---|---|
tool_use 的 input 字段是否支持嵌套 JSON schema |
复杂工具直接报错 |
system 数组能否混进 cache_control(断点缓存) |
长上下文成本翻倍 |
Subagent 的 name 字段是否被保留 |
多 agent 协作路由错乱 |
Flash 档拉低门槛这件事要单独说:基座直连做了 "Anthropic 协议透传",意味着你不需要在网关层写转换器,直接换 base_url 就行。但旗舰基座是不是也透传、透传得多完整,这次实测下来各家差异相当明显。
三、五家基座实测:Skill 重写率、迁移工时、token 价差
测试样本是 12 个 Skill(其中 4 个用 Subagent 嵌套)+ 1 套 Cursor 的 rules。客户端用 Claude Code 0.4.x,统一通过 OpenAI 兼容模式走 Anthropic 协议。基线选 claude-sonnet-4-6。
3.1 价格对比(按 2026-07 公开报价口径)
| row_key | 厂商 | 输入 ¥/1M tokens | 输出 ¥/1M tokens | 备注 |
|---|---|---|---|---|
| claude-sonnet-4-6 | Anthropic | 15 | 75 | 官方基线 |
| qwen3.7-max | 阿里 | 3.2 | 9.6 | 长上下文有阶梯 |
| glm-5.2 | 智谱 | 2.4 | 7.2 | |
| kimi-k2.7-code | 月之暗面 | 2.0 | 8.0 | 代码特化 |
| deepseek-r1 | 深度求索 | 1.0 | 3.0 | 限时档位 |
按 12 个 Skill 一周跑 200 万输入、80 万输出的开销估算,claude-sonnet-4-6 月成本约 ¥9 万,deepseek-r1 不到 ¥5 千,差出来一个资深开发的月薪。账面上看着差距巨大,但后面会讲清楚这部分差价并不直接等于迁移价值。
3.2 Skill 重写率(综合改写率 = 小改×0.5 + 重写×1.0,公式见上表)
| row_key | 直通 | 需小改 | 需重写 | 综合改写率 |
|---|---|---|---|---|
| claude-sonnet-4-6 | 12 | 0 | 0 | 0% |
| qwen3.7-max | 5 | 4 | 3 | 42% |
| glm-5.2 | 8 | 3 | 1 | 21% |
| kimi-k2.7-code | 6 | 4 | 2 | 33% |
| deepseek-r1 | 3 | 5 | 4 | 54% |
DeepSeek R1 改写率最高这个结论很反直觉,但实测数据就是 54%。原因放在第四章避坑单独说。
3.3 迁移工时(从"换 base_url"起,到 12 Skill + 1 rules 全跑通为止)
| row_key | 工时 | 主要卡点 |
|---|---|---|
| claude-sonnet-4-6 | 0.5h | 基线参照 |
| qwen3.7-max | 3.5h | tool_use 的 input schema 不支持嵌套,需把复杂工具拆成多层;system 注入位偏移 |
| glm-5.2 | 2.0h | 系统提示合并策略与 Anthropic 不同;tool_use 字段大小写漂移 |
| kimi-k2.7-code | 2.5h | code agent 的 Subagent 路由字段 name 被吞 |
| deepseek-r1 | 5.5h | thinking 模式下 tool 调用栈与 messages 错位;tool_choice 不识别 |
四、什么时候不该硬兼容
我反而想把"避坑"放在前面,因为这次实测最大的教训是:不是所有场景都该追求"协议兼容"。
4.1 别在 Subagent 嵌套里塞 reasoning 类基座
deepseek-r1 在直接对话里很好,工具调用也清楚。但 Claude Code 的 Subagent 是递归调用,链路上每跳一层都会让 reasoning 模式污染 tool_use 结果。我在测试里观察到 R1 在三层 Subagent 后会输出"为了调用这个工具,我需要先理解 X 是什么"这种思考,然后才产出 tool_use,延迟从单层 1.2 秒变成 3.8 秒,token 消耗也比直连多 60%。这就是标题"迁移屠夫"的来源------迁移是屠了你一个下午。
如果你必须用 R1 这种 reasoning 基座跑 Subagent,正确的做法是在网关层把 tool_use 抽离,先让 R1 产出 plan,再把 plan 喂回不带 reasoning 的 Chat 模型实际调工具。这个分层路由我现在跑在炻光 AI 接入管理平台上,具体怎么配置后面第五章会说。
4.2 别在 tool_choice=any 下用部分国产基座
Claude Code 大量场景依赖 tool_choice=any(强制模型必须调一个工具)。实测发现部分国产基座把 any 误识别为 auto,导致模型直接文本回复而不调工具。这是 4 个 Skill 反复改的根本原因。如果你的 Skill 强依赖工具调用,先在网关层把 any 转成 tool + 必填工具名,第六章会贴这段代码。
4.3 别忽略 thinking 占的 token 预算
R1 这类 reasoning 基座的实际计费 token 是 thinking + reply 两部分。本次实测发现接入层里只有一家把 thinking 部分单独标了出来,另几家直接合并到 output 计费。如果你做监控不看账单分项,你会以为 R1 比 Sonnet 便宜 8 倍,实际只便宜 4 倍。
4.4 工具同名冲突
如果你的工具集里有 view_file、edit_file 这种 Anthropic 原生工具名,部分国产基座会去重(把同名工具当作一个),这就是 Subagent 路由失败的常见原因。改名或者在网关层标准化重写,我后面会贴一种处理方式。
五、生产路由策略与容灾
一个下午把流量接进来不难,难的是上线之后。三条生产经验,都是从这次实测踩出来的。
1. 基座分级,不要梭哈
现在的策略是把任务按 token 复杂度分三档:简单结构化输出(读文件、改字段)走 glm-5.2 或 kimi-k2.7-code,延迟低、价格好;中等工具编排(2-5 步 Skill)走 qwen3.7-max,对 Anthropic 协议的覆盖最完整,实测 12 个 Skill 里 5 个直通;复杂 Subagent 嵌套(>3 层)保留 claude-sonnet-4-6 作为基线,reasoning 部分走单独通路。
2. 协议漂移要监控
每家厂商对 Anthropic 协议的实现都在演进。我用的方法是每天抽 5 个固定 Skill 跑回归,记录 tool_use 调用成功率。任何一家一周内成功率下跌超过 3% 就要查 changelog。炻光 AI 接入管理平台的统一接入层刚好提供了一个回归脚本的脚手架,我加了一个 cron 每天早上 6 点拉一遍过去 24h 的 tool_use 命中,落到本地 SQLite。
3. 重试不是简单的指数退避
Anthropic 协议的错误返回里有 error.type,不同类型要不同处理:overloaded_error 直接降级到次选基座;invalid_request_error 不重试,直接走 fallback Skill;rate_limit_error 才做指数退避。这套分类型重试上线后,我在接入平台的监控里看到线上错误率从 4.2% 降到 0.7%。
六、迁移代码(可复制即跑)
下面这段代码是我现在用的生产网关核心,从原版 Claude Code 配置迁移到多基座的最小可运行版本。Python 3.11+,只依赖 anthropic SDK 和 httpx。
Python
import os
import time
import logging
from typing import Any
from anthropic import Anthropic, APIError, APIStatusError
logger = logging.getLogger("router")
# row_key -> 接入信息与价格表
BASES = {
"claude-sonnet-4-6": {
"base_url": os.environ["BASE_URL"] + "/anthropic",
"input_price": 15.0,
"output_price": 75.0,
"supports_subagent": True,
},
"qwen3.7-max": {
"base_url": os.environ["BASE_URL"] + "/anthropic/qwen3.7",
"input_price": 3.2,
"output_price": 9.6,
"supports_subagent": True,
},
"glm-5.2": {
"base_url": os.environ["BASE_URL"] + "/anthropic/glm5.2",
"input_price": 2.4,
"output_price": 7.2,
"supports_subagent": True,
},
"kimi-k2.7-code": {
"base_url": os.environ["BASE_URL"] + "/anthropic/kimi-k2.7",
"input_price": 2.0,
"output_price": 8.0,
"supports_subagent": False, # name 字段被吞
},
"deepseek-r1": {
"base_url": os.environ["BASE_URL"] + "/anthropic/deepseek-r1",
"input_price": 1.0,
"output_price": 3.0,
"supports_subagent": False, # reasoning 污染
"thinking_mode": True,
},
}
def pick_model(task_complexity: int, needs_subagent: bool = False) -> str:
"""按任务复杂度挑基座,Subagent 强制走 Sonnet 基线双备。"""
if needs_subagent:
return "claude-sonnet-4-6"
if task_complexity <= 2:
return "glm-5.2"
if task_complexity <= 5:
return "qwen3.7-max"
return "claude-sonnet-4-6"
def normalize_tool_choice(tool_choice, tools, cfg):
"""tool_choice=any 不被部分国产基座支持,网关层改写为 tool+必填名。"""
if tool_choice == "any" and not cfg.get("supports_subagent"):
if tools:
return {"type": "tool", "name": tools[0]["name"]}
return tool_choice
def strip_thinking(resp, cfg):
"""reasoning 基座在 Subagent 场景剥离 thinking,只保留 tool_use。"""
if cfg.get("thinking_mode") and resp.content:
resp.content = [
b for b in resp.content
if getattr(b, "type", "") == "tool_use"
]
return resp
def call_with_fallback(
messages,
system="You are a helpful assistant.",
tools=None,
tool_choice=None,
task_complexity=3,
needs_subagent=False,
primary=None,
):
primary = primary or pick_model(task_complexity, needs_subagent)
order = [primary]
for cand in ["claude-sonnet-4-6", "qwen3.7-max", "glm-5.2"]:
if cand not in order:
order.append(cand)
last_err = None
for model in order:
cfg = BASES[model]
client = Anthropic(
api_key=os.environ["API_KEY"],
base_url=cfg["base_url"],
)
fixed_tool_choice = normalize_tool_choice(tool_choice, tools, cfg)
try:
resp = client.messages.create(
model=model,
messages=messages,
system=system,
tools=tools or [],
tool_choice=fixed_tool_choice,
max_tokens=4096,
)
return strip_thinking(resp, cfg), model
except APIStatusError as e:
err_type = getattr(e.error, "type", "") if e.error else ""
logger.warning("model=%s err_type=%s", model, err_type)
if err_type == "invalid_request_error":
last_err = e
continue
if err_type == "overloaded_error":
last_err = e
continue
if err_type == "rate_limit_error":
time.sleep(2)
last_err = e
continue
last_err = e
except APIError as e:
last_err = e
continue
raise last_err if last_err else RuntimeError("all models failed")
跑起来之后再观察一周,你会发现真正决定线上稳定性的不是选哪家基座,而是 fallback 链是不是真的写过。
七、FAQ:调 Anthropic 兼容基座常踩的细节
Q1:切换 base_url 后立刻报 tool_use not supported 怎么办?
先看网关层有没有把请求透传,有些网关自作主张把 /v1/messages 翻译成自家的 chat 接口。直接用 curl 打一下原厂 /v1/messages 是否返 200,可以快速定位是不是网关拦截的。
Q2:cache_control 字段能不能用?
可以但别默认开。glm-5.2 和 qwen3.7-max 都支持断点缓存,但命中率差异很大。长上下文(>32k)才考虑开,短上下文开了反而增加首字延迟。
Q3:怎么估算单次 Skill 调用的真实成本?
一定要把 thinking token 单独拿出来算。claude-sonnet-4-6 没有 thinking,账单干净;deepseek-r1 默认开启 thinking,一个 8 步工具链 thinking 部分可能占 60% 的 output。如果加一行 usage.output_tokens - thinking_tokens 的拆分监控,账单会清楚很多。
Q4:要不要自己写一版"协议垫片"?
如果你有超过 20 个 Skill 在跑,值得做垫片。但垫片不要做在客户端,做在网关层。做法是:把 tool_use 字段在网关层标准化,再下发给国产基座;反向响应再做一次字段名归一化。这种网关层方案在主流接入管理平台都有现成实现,不需要自己写协议翻译代码。
八、参考资料
-
Anthropic Messages API 官方字段说明:Anthropic 文档
-
Claude Code Skill / Subagent 协议说明:Claude Code 文档
-
各厂商 2026-07 公开报价:分别在各家官网价格页可查
-
本次实测基线接入入口:炻光 AI 接入管理平台文档
九、写在最后
三点经验:
-
协议兼容 ≠ Skill 兼容。Flash 档拉低的是"换 URL"的门槛,不是"12 个 Skill 跑通"的门槛。换 base_url 是 5 分钟的事,把 Skill 跑通是一个下午。
-
价格 8 倍差距不等于迁移价值 8 倍 。
deepseek-r1价格是 Sonnet 的 1/15,但 reasoning 模式污染 tool_use 的修复工时会把省钱吃回一半。先用glm-5.2/qwen3.7-max这种"协议覆盖较完整"的国产基座过渡,等工具调用稳定了再考虑 R1。 -
Subagent 嵌套是分水岭 。单层 Skill 国产基座基本都能扛,三层以上嵌套目前只有
claude-sonnet-4-6稳。生产环境把 Subagent 单独走基线,工具调用走国产,把省钱和稳定性两件事分开做。如果你已经在用类似炻光 AI 接入管理平台这种统一网关,直接配 fallback 链就能落地,不用动客户端代码。