DeepSeek 和 Claude 写代码到底选哪个?单文件、跨文件重构、bug 定位、agent 改多文件,一项一项实测给你看

先给结论,省得你翻到最后

写代码选 DeepSeek 还是 Claude,看你在做哪种活。批量写测试、写脚本、写中文注释、跑数据清洗,deepseek-v3.2-thinking(0.049 元/次)足够,一次请求的价格是 claude-sonnet-4-5-thinking(0.09 元/次)的 55%。改老仓库、动 TS 类型链路、让 agent 连着改十几个文件,claude-sonnet-4-5-thinking 更少翻车。想把 DeepSeek 系往上顶一档,deepseek-v4-pro-thinking 也是 0.09 元/次,跟 sonnet 同价,可以放在同一个备选位上轮换。高并发批量刷任务,deepseek-v4-flash-thinking 0.05 元/次更省。

测试方法先说清楚,不然后面全是空话。在一个 3.2 万行的 React + TypeScript 仓库里挑 12 个真实任务:6 个单文件改动、3 个跨文件重构、3 个 bug 定位。每个模型每个任务各跑 4 次,一共 96 次请求。记录四个数:一次过率(初版输出不改任何字符就能同时通过 tsc --noEmiteslint 和相关单测的比例)、返工轮数、漏改文件数、最终 diff 的增删行数。一次过率的算法就是「一次通过的次数 ÷ 总次数」,不掺水分。

预算低、重复活多,交 deepseek-v3.2-thinking

你该怎么做:把判定标准最机械的活全塞给它。生成 pytest 或 vitest 用例骨架、补中文注释、写正则草稿、把一坨 SQL 拆成多个 CTE、批量把 JS 文件转 TS。这类活对错一眼能看出来,跑废了也不心疼。一天 500 次是 24.5 元。

精确重构、大 TS 工程、agent 自动改多文件,交 claude-sonnet-4-5-thinking

你该怎么做:让它先只输出「改动清单加影响面」,你确认了再让它动手。改一个类型定义时,把 git grep 的结果一起贴进上下文,它就不容易漏改引用。在 Cline、RooCode、KiloCode 里连续改十几个文件,它中途跑偏的概率更低,diff 也更好 review。

小活别开 thinking

改个变量名、补一行日志、把 Tab 换成空格,开 thinking 只是把延迟和价格一起拉长。判断标准就一句:这活有没有第二种能干成的写法?没有就别开。

维度一:单文件函数级改动,写一个带 loading 和错误兜底的 React 组件

需求写死,看初版能不能直接跑

需求统一成这样:写一个 UserList 组件,请求 /api/users,要有骨架屏、错误兜底、空列表文案,组件卸载后不许再 setState。这些模型都写得出来,差别在收尾。Claude 系的初版通常已经把 AbortControllerfinally 里的 loading 收尾一起写上;DeepSeek 系偶尔会把 setLoading(false) 只写在成功分支,请求一抛错就永远转圈。这个 bug 本地测试很容易漏,上线后用户看到的是空白区域加转圈。

你该怎么做:把兜底条件在 prompt 里写死,别指望它猜。加上这句「请求失败要显示错误文案和重试按钮,loading 必须在 finally 里关闭,组件卸载要 abort」,两家的初版基本都能过,差距会缩到很小。

一次过率差多少

单文件这 6 个任务,claude-sonnet-4-5-thinking 的一次过率大约 5/6,deepseek-v3.2-thinking 大约 4/6,deepseek-v4-pro-thinking 卡在两者之间、贴近 sonnet。没一次过的那些,多半只差一两行,改一下就好,所以这个维度不能当成判决依据。

维度二:跨文件重构,改一个 TS 类型定义

谁不漏改引用

任务:把 interface Order 里的 amount: number 改成 amount: number | null,全仓库跟着改。这个改动会污染到格式化函数、校验函数、订单卡片组件,还有 3 处直接拿 amount 做算术的地方。实测下来,DeepSeek 系更容易只改「当前打开的那个文件」和它明显引用到的两层,第三层的 lib/format.ts 会被漏掉;Claude 系会主动去找所有用到该字段的位置,漏改率明显更低。

你该怎么做:这不是模型智商问题,是上下文问题。把 git grep -n "order.amount" 的输出贴进去,DeepSeek 的漏改率会立刻掉下来。省这一步,就得靠 tsc --noEmit 帮你兜底。

谁会顺手把 any 也改掉

重构途中遇到 const data: any = await res.json(),Claude 系有较大概率顺手补一个 OrderResponse 类型并删掉 any;DeepSeek 系更倾向按你说的做,你不提它就绕开。你该怎么做:明确要求「只改类型和它的引用,不要动别的」;想让它顺带收拾 any,就把这条单列出来。

维度三:bug 定位,谁给的是可验证的假设,谁在编

把真实报错原文贴进去

报错原文:TypeError: Cannot read properties of undefined (reading 'map'),配套的是这么一段:

- const list = res.data.items;
+ const list = res.data?.items;
  return list.map((it) => it.id);

这种半吊子可选链在真实仓库里到处都是。给模型的任务是:找出根因,说清是哪一行、什么条件下触发、怎么验证。

谁在编,谁给可验证的假设

deepseek-v3.2-thinking 碰上这种报错,反应往往是「res.data 可能是 undefined,加个可选链就行」——它顺着你给的错误方向往下圆。claude-sonnet-4-5-thinking 更常做的是反问和排除:先指出 ?. 只保护了 res.dataitems 本身照样可能是 undefined;再让你打一行 console.log(Object.keys(res.data)) 去确认上游字段名到底是不是 items,因为后端分页返回里常见的是 listrecords

真正能验证的假设长这样:触发条件是 res.data.items 为 undefined,验证方式是打一行 console.log(typeof res.data.items),拿到 undefined 就去核对上游字段名。只说「加个兜底就行了」的回答,等于让你把 bug 藏起来。

你该怎么喂上下文

贴报错的时候一并给三样东西:完整栈的前 15 行(含文件名和行号)、报错那个函数的完整代码、这个接口返回的真实 JSON 样本(关键字段脱敏)。只贴一行来自论坛的报错,两边都会开始编。

维度四:单元测试生成,谁的测试真能跑

谁的测试不是空断言

任务:给 calculateDiscount(price, coupon, userLevel) 写 vitest 用例,覆盖边界和异常。DeepSeek 系产出量大、覆盖广,但常见 expect(result).toBeDefined() 这种什么都没验的断言,还会出现 expect(fn).toHaveBeenCalled() 却压根没 mock 的情况,跑起来直接报 is not a function。Claude 系写得更少更准,边界值(0、负数、null、超上限)通常都点到。

你该怎么做:强制要求「每条 expect 必须断言具体值,禁止用 toBeDefined 和 toBeTruthy 兜底」,再让它跑一遍 npx vitest run,把失败用例修到全绿。加上这两句,DeepSeek 写出的测试可用率能上一个台阶。

pytest 场景的差别

Python 侧情况类似,但 DeepSeek 对 pytest 的 fixture 和 pytest.raises 更熟,一次写对的概率更高;Claude 系偶尔给你一个真去调外部接口的测试,到你机器上跑不起来。写活的草稿交给 deepseek-v3.2-thinking,配上「mock 掉所有网络调用」这条硬要求就够了。

维度五:精确性任务,SQL 和正则谁一次写对

SQL:给了需求别越界

需求:查出最近 30 天每个用户的订单总额,只算 status = 'paid',按金额倒序取前 50。DeepSeek 通常一次给对 WHERE created_at >= NOW() - INTERVAL '30 days' GROUP BY user_id ORDER BY total DESC LIMIT 50,但它爱顺手 JOIN users,把你没要的 emailphone 也选出来。Claude 更守边界,你写什么它给什么。

你该怎么做:需求里补一句「不要 join 别的表、只返回 user_id 和 total、不要加我没要的字段」,这一句能省掉大量 review 时间。

正则:一次写对的概率

需求:匹配形如 2026-03-14 08:30:00 的时间戳,严格限定月份是 01 到 12。DeepSeek 一次写对的概率更高,也更愿意解释每个分组在干什么;Claude 系偶尔给你一个用 \d{2} 糊弄过去的版本,能匹配到 99 月。这类纯符号推理的活,DeepSeek 系性价比突出。你该怎么做:让它把「能匹配」和「不该匹配」的正例反例各列 5 条,你拿去跑一遍就完成验收。

维度六:800 行以上大文件,加上 agent 连续改十几个文件

800 行以上改一个函数,谁更稳

把 800 行以上的文件整份贴进去,让它只改其中一个函数。两家的表现都会下降,但下降方式不同:DeepSeek 系更容易在返回时把没改动的大段代码「重写一遍」,顺手丢掉几个边界判断;Claude 系更倾向用局部替换的方式给 diff。

你该怎么做:永远不要让它整份重写大文件。要求它「只输出需要替换的那个函数,从函数声明到它的结束大括号,其他代码一个字都不要输出」,然后你在编辑器里手动替换。

agent 场景:十几个文件连着改

在 Cline、RooCode、KiloCode 里跑同一串任务(改类型、改引用、跑测试、修失败用例),盯三项指标:中途跑偏次数、误删代码次数、最终 diff 行数。Claude 系跑偏和误删明显更少,diff 通常更小;DeepSeek 系偶尔会「顺手优化」掉一段它觉得没用的代码,review 时得盯紧删除行。

你该怎么防它乱删

三件事:开工前 git commit,让每一步改动都能单独回滚;prompt 里写明「禁止删除任何现有函数,禁止改变公开 API 签名」;每完成 3 到 5 个文件就让它停下来,你看一眼 git diff --stat。这三条对两家都有效,对 DeepSeek 尤其必要。

diff 越小越省钱吗

不省请求钱,省你 review 的时间。按次计费下 diff 大小不影响单价,但 diff 越大你审得越久,返工还要再花一次请求。一条硬规矩:单个任务让 agent 改超过 6 个文件,就拆成两轮跑。

thinking 模式:两家的钱各花在哪

都是「想得越久越贵」,但贵法不同

-thinking 系模型在返回正文前先生成推理过程,这段推理照样进上下文,所以延迟和请求体都比非 thinking 大。小鱼API 的按次计费把价格固定在 0.049 到 0.25 元这个区间,选之前先看清单价。

模型单价(元/次)适合开 thinking 的活
deepseek-v3.2-thinking0.049写测试、写脚本、正则、中文注释
deepseek-v4-flash-thinking0.05高并发、批量格式转换
deepseek-v4-pro-thinking0.09DeepSeek 系里的疑难重构
claude-sonnet-4-5-thinking0.09跨文件重构、bug 根因、agent 多文件
claude-opus-4-5-thinking0.12架构决策、难缠的线上事故
claude-opus-4-7-thinking0.25前面几档都试过还不行时才上

哪些活不该开

判断标准再土一点:扫一眼就知道怎么改的活别开 thinking;得拿纸画两分钟才想明白的活,开。

成本算账:同一天跑 500 次代码任务

按次计费意味着什么

小鱼API 的按次计费规则是「一次请求固定价,输入长度不影响价格」。这句话对「贴大文件让 AI 改」的用法是个大便宜:把 2000 行代码塞进上下文,deepseek-v3.2-thinking 还是 0.049 元一次,claude-sonnet-4-5-thinking 还是 0.09 元一次,不会因为 token 变多就涨价。按 token 计费的玩法在这种场景里价格可能翻好几倍,按次不会。

模型单价(元/次)500 次总价(元)
deepseek-v3.2-thinking0.04924.5
deepseek-v4-pro-thinking0.0945
claude-sonnet-4-5-thinking0.0945
claude-opus-4-5-thinking0.1260
claude-opus-4-7-thinking0.25125

另外几家 500 次的总价:deepseek-v4-flash-thinking 0.05 元/次,是 25 元;kimi-k2.5kimi-k2.6 0.09 元/次,是 45 元;gpt-5.4-pro-thinking 0.15 元/次,是 75 元;gpt-5.5 0.2 元/次,是 100 元。

省下来的钱该怎么花

claude-opus-4-7-thinking 一天 125 元,换成 deepseek-v3.2-thinking 是 24.5 元,省下 100 元。这 100 元正确的花法不是存着,是买「双模型交叉验证」:让 deepseek-v3.2-thinking 写初稿,再让 claude-sonnet-4-5-thinking 只做审阅。一天 500 次写作加 500 次审阅也就 24.5 加 45 等于 69.5 元,比单跑 500 次 opus 便宜一半,产出往往还更稳,因为两个不同家族的模型盲区不一样。

两段可直接上手的东西

用 OpenAI 兼容接口跑 A/B 跑分

下面这段脚本读一份任务清单,分别打 deepseek-v3.2-thinkingclaude-sonnet-4-5-thinking,记录耗时、返回长度和可疑标志,再把对比表和总成本打出来。把 YOUR_API_KEY 换成你自己的令牌就能跑。

import json, time, requests

BASE = "https://xyuapi.top/v1"
KEY = "YOUR_API_KEY"
MODELS = [("deepseek-v3.2-thinking", 0.049), ("claude-sonnet-4-5-thinking", 0.09)]

# tasks.json 形如 [{"id": "t1", "prompt": "...", "must_contain": ["useEffect"]}]
tasks = json.load(open("tasks.json", encoding="utf-8"))

SUSPECT = ["作为AI", "无法访问", "抱歉,我", "TODO: 请补充"]

def call(model, prompt):
    t0 = time.time()
    r = requests.post(
        BASE + "/chat/completions",
        headers={"Authorization": "Bearer " + KEY},
        json={"model": model, "messages": [{"role": "user", "content": prompt}]},
        timeout=180,
    )
    r.raise_for_status()
    text = r.json()["choices"][0]["message"]["content"]
    return text, round(time.time() - t0, 1)

rows, total = [], 0.0
for model, price in MODELS:
    for t in tasks:
        text, secs = call(model, t["prompt"])
        flags = [f for f in SUSPECT if f in text]
        flags += [k for k in t.get("must_contain", []) if k not in text]
        total += price
        rows.append({"model": model, "task": t["id"], "sec": secs,
                     "len": len(text), "flag": len(flags)})

print("%-30s%-8s%-8s%-8s%s" % ("model", "task", "sec", "len", "flag"))
for r in rows:
    print("%-30s%-8s%-8s%-8s%d" % (r["model"], r["task"], r["sec"], r["len"], r["flag"]))
print("\ntotal requests: %d, cost: %.2f CNY" % (len(rows), total))

跑完盯两件事:可疑标志少不等于答得对,要配 must_contain 里的关键片段一起判断;耗时差异在高并发下会被放大,别只看单价。

Cline 和 RooCode 里填自定义地址

这两个客户端都支持自定义 OpenAI 兼容地址。在设置里选 OpenAI Compatible,把 https://xyuapi.top/v1 填进 Base URL,模型名照抄,Key 填你自己的令牌。

{
  "apiProvider": "openai",
  "openAiBaseUrl": "https://xyuapi.top/v1",
  "openAiApiKey": "sk-你的令牌",
  "openAiModelId": "claude-sonnet-4-5-thinking",
  "openAiHeaders": {},
  "requestTimeoutMs": 180000
}

模型名一定按文档里的全名写。写成 claude-sonnet-4-5 少个 -thinking 后缀,客户端会直接给你 404 model not found。改完地址先跑一次「列出模型」,确认能拉到列表,再让 agent 动你的仓库。

相关阅读

🚀 想要立即使用?来小鱼API体验全系列AI模型

查看全部产品

支持Gemini / Claude / GPT / Grok / DeepSeek · 国内直连 · 支付宝/微信