DeepSeek 接 Anthropic:迁移屠夫

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 端点,请求体核心字段是 modelmessagessystemtoolstool_choice。响应侧关键是 content 数组里 type=tool_use 的块,以及 stop_reason=tool_use 标志位。Subagent 实现依赖 tools 里把另一个 agent 当函数调用。

国产各家表面都把这套端点抄了下来,差异在三个细节:

细节差异 影响
tool_useinput 字段是否支持嵌套 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_fileedit_file 这种 Anthropic 原生工具名,部分国产基座会去重(把同名工具当作一个),这就是 Subagent 路由失败的常见原因。改名或者在网关层标准化重写,我后面会贴一种处理方式。

五、生产路由策略与容灾

一个下午把流量接进来不难,难的是上线之后。三条生产经验,都是从这次实测踩出来的。

1. 基座分级,不要梭哈

现在的策略是把任务按 token 复杂度分三档:简单结构化输出(读文件、改字段)走 glm-5.2kimi-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.2qwen3.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 字段在网关层标准化,再下发给国产基座;反向响应再做一次字段名归一化。这种网关层方案在主流接入管理平台都有现成实现,不需要自己写协议翻译代码。

八、参考资料

  1. Anthropic Messages API 官方字段说明:Anthropic 文档

  2. Claude Code Skill / Subagent 协议说明:Claude Code 文档

  3. 各厂商 2026-07 公开报价:分别在各家官网价格页可查

  4. 本次实测基线接入入口:炻光 AI 接入管理平台文档

九、写在最后

三点经验:

  1. 协议兼容 ≠ Skill 兼容。Flash 档拉低的是"换 URL"的门槛,不是"12 个 Skill 跑通"的门槛。换 base_url 是 5 分钟的事,把 Skill 跑通是一个下午。

  2. 价格 8 倍差距不等于迁移价值 8 倍deepseek-r1 价格是 Sonnet 的 1/15,但 reasoning 模式污染 tool_use 的修复工时会把省钱吃回一半。先用 glm-5.2 / qwen3.7-max 这种"协议覆盖较完整"的国产基座过渡,等工具调用稳定了再考虑 R1。

  3. Subagent 嵌套是分水岭 。单层 Skill 国产基座基本都能扛,三层以上嵌套目前只有 claude-sonnet-4-6 稳。生产环境把 Subagent 单独走基线,工具调用走国产,把省钱和稳定性两件事分开做。如果你已经在用类似炻光 AI 接入管理平台这种统一网关,直接配 fallback 链就能落地,不用动客户端代码。

相关推荐
plainGeekDev2 小时前
如何设计一个 Loop:以登录模块为例
ai编程·claude
IT Panda3 小时前
【Harness Engineering】Skill 自进化 - SkillOpt
ai·agent·skill·harness·自进化·skillopt·skill自进化
Luhui Dev3 小时前
如何在 WorkBuddy 中使用大角几何:从 MCP 接入到 AI 几何作图
人工智能·数学·算法·agent·luhuidev
燐妤3 小时前
中老年智能健康管理项目
python·ai·pycharm·vue3·fastapi·项目开发·健康
全栈弄潮儿3 小时前
为什么 AI 生成的代码不能直接使用?如何对 AI 代码进行检查和验证?
chatgpt·openai·ai编程
文心快码BaiduComate3 小时前
文心快码能力扩展、记忆、代码可视化上线
人工智能·ai编程·vibecoding
VIP_CQCRE4 小时前
用 LobeChat 接入 Ace Data Cloud:一个 Token 解锁 GPT、Claude、Gemini 等 60+ 模型
ai·大模型·openai·lobechat·acedatacloud
谢泽浩4 小时前
通过 OmwAI 中转服务快速接入Codex
ai编程
安逸sgr4 小时前
RAG 检索到了正确内容,但模型回答仍然错误,可能是什么原因?
人工智能·ai·大模型·agent·智能体