工具大全
亲手实测作者:Coocon2026年9月20日12 次阅读约 7 分钟阅读

拿 DeepSeek 当 Claude Code 后端:功能全通,但成本显示虚高 38 倍

DeepSeek 的 API 支持 Anthropic 格式,端点是 https://api.deepseek.com/anthropic。三个环境变量,Claude Code 就转去调 DeepSeek 了。

教你设这三个变量的文章有的是,讲什么会退化的几乎没有。而这才是唯一值得问的问题——Agent 编程工具不是聊天框,它的命脉在工具调用、多轮状态,以及屏幕上那些数字到底有没有意义。

所以我跑了一遍。Claude Code 2.1.270,macOS,独立配置目录不碰真实环境。下文 Claude Code 的跑测全部打向 deepseek-v4-prodeepseek-flash 出现在裸端点的映射测试和 Haiku 槽位里。

先给结论:功能没问题,成本显示有问题。 Claude Code 告诉我花了 $1.71,DeepSeek 实际扣了 ¥0.32。

背景:为什么有人要这么接

两个原因,方向还不太一样。

无聊的那个是价格。DeepSeek V4 Pro 的输入价是峰时 $1.32 / 1M token、谷时 $0.66,和 Claude 的百万单价不在一个档。而 Claude Code 每一轮都要重发一大坨系统提示词,这个比例会被放得很大。

有意思的那个是:Claude Code 目前是被广泛使用的 Agent 框架里最能打的一个,而框架恰恰是你没法轻易自己造的部分。保留框架、换掉底下的引擎,如果换得干净,价值很实在。

换得干不干净是个实证问题,所以有了下面的测量。

测了什么,以及故意没测什么

测了:连通性、模型名映射、本地工具矩阵、子代理派生、跨轮 prompt 缓存,以及按真实账户余额算的实际花费。

没测(以及为什么)

  • MCP 服务器。DeepSeek 的兼容性表里把 API 的 mcp_servers 字段标为 Ignored,但那个字段指的是 Anthropic 的服务端 MCP。Claude Code 的 MCP 走本地 stdio,根本不碰这个字段。测 API 字段证明不了你实际在用的东西,而认真测本地 MCP 够单开一篇。
  • 1M 长上下文行为。DeepSeek 标称 1M 上下文,Claude Code 报告该模型 contextWindow: 200000。到底谁说了算需要专门的填充实验,我不打算靠一个元数据字段猜。
  • 视觉。价格页写明 v4-pro 不支持 vision、flash 支持。我没测图片输入。

以下全部在同一台机器、2026-09-20 当天跑出,原始日志留存。

配置

起作用的就三个变量:

export ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"
export ANTHROPIC_AUTH_TOKEN="$DEEPSEEK_API_KEY"   # 不是 ANTHROPIC_API_KEY
unset ANTHROPIC_API_KEY
export ANTHROPIC_MODEL="deepseek-v4-pro"

要用 ANTHROPIC_AUTH_TOKEN 而不是 ANTHROPIC_API_KEY——两个都设 Claude Code 会弹冲突提示。我还把整个实验塞进一次性的 CLAUDE_CONFIG_DIR 和临时工作目录,保证碰不到真实项目:

export CLAUDE_CONFIG_DIR="$PWD/cc-config"

先建 ground truth:这个端点到底怎么行为

动 Claude Code 之前先打裸端点。映射层要是有意外,上面那层全是猜。

模型映射只认前缀——而且文档关于回落的说法是错的

传入的 model 实际返回的 model 耗时
claude-opus-5 deepseek-v4-pro 3.20s
claude-sonnet-5 deepseek-flash 1.03s
claude-haiku-4-5-20251001 deepseek-flash 1.32s
deepseek-v4-pro deepseek-v4-pro 1.97s
deepseek-flash deepseek-flash 1.44s
totally-made-up-model HTTP 400 0.38s

claude-opus* → v4-pro、claude-sonnet*/claude-haiku* → flash,和文档一致。

最后一行不一致。文档写的是:

When you pass an unsupported model name to DeepSeek's Anthropic API, the API backend will automatically map it to the deepseek-flash model.

实际不会,直接 400:

{"error":{"message":"The supported API model names are deepseek-flash, deepseek-v4-pro, but you passed totally-made-up-model.","type":"invalid_request_error"}}

所以真实规则是:claude-* 前缀会映射,其余必须是 DeepSeek 的精确模型名,否则 400。 如果你在脚本里动态选模型,别依赖文档说的那个回落。

裸端点模型映射实测:claude-* 前缀会映射,未知模型名返回 HTTP 400

v4-pro 默认就返回 thinking 块

max_tokens: 64 时回复看着是空的。其实不是,预算被推理吃了:

"content": [
  { "type": "thinking", "thinking": "We need answer user asks \"Say OK.\" ...", "signature": "4b525c96-..." },
  { "type": "text", "text": "OK" }
]

按 DeepSeek 价格页,两个模型的思考模式都默认开启。如果你在这个端点上自己写轻客户端,max_tokens 要把推理算进去,否则会做出一个「短回答返回空」的 bug。(Claude Code 处理得正确,这条坑的是自建集成。)

/v1/models 404,但无害

GET /v1/models?limit=1000  -> HTTP 404
GET /v1/models             -> HTTP 404

Claude Code 启动时会探一次,404 照样往下走。纯噪声。

工具矩阵:全部正常

这部分本来最可能出事,结果没出。每一行是一次在临时目录里的 claude -p,而且我核验的是磁盘上的副作用,不是模型自称成功。

用例 轮数 输入 缓存读 输出 耗时 返回 副作用核验
读文件 2 34,186 34,176 107 8.7s hello from lab
写文件 2 34,265 34,176 131 9.0s DONE written.txt = WRITTEN_OK
跑 Bash 2 34,171 34,176 93 6.8s BASH_OK
Glob 2 34,284 34,432 454 10.3s 两个文件名
原地 Edit 3 34,474 68,480 272 8.7s EDITED probe.txt hellogoodbye

子代理也能用。要求用 Agent 工具后确实派生了,抓 stream 能看到真实调用链:

t9b  实际调用的工具: ['Agent', 'Bash']

工具矩阵全通,Write/Edit 的副作用经 cat 文件核验

prompt 缓存是生效的。 首次(冷)调用 cache_read_input_tokens: 0,之后每次都从缓存读约 34K。我一开始把这个冷启动的 0 误读成「缓存没用上」——并不是。如果你只看第一个请求,会得出和我一样的错误结论。

注意那张表里的常数:每一轮还没等你打字就有约 34,000 个输入 token。那是 Claude Code 的系统提示词加工具定义。这也是为什么缓存命中价比输入标价更重要。

重点:成本显示虚高 38 倍

Claude Code 会打印花费。接 DeepSeek 时,这个数是假的。

我跑了十次相同调用,前后测真实账户余额,不从价目表推算:

数值
Claude Code 报告(10 次合计) $1.7097
DeepSeek 余额(前) ¥37.58
DeepSeek 余额(后) ¥37.26
实际花费 ¥0.32 ≈ $0.045
虚高 38 倍

这个假数从哪来?有一次冷调用报告 $0.171215,对应 34,098 输入 + 29 输出。反推单价:

34,098 × $5/1M  +  29 × $25/1M  =  $0.171215   ← 完全吻合

Claude Code 在按每百万 $5 / $25 给 DeepSeek 的 token 计费,那是 Claude Sonnet 的价目。 它甚至在 JSON 里标了自己不确定("costBasis": "unknown"),然后照样打印一个信心十足的金额。

两个实际后果:

  1. /cost 和 JSON 里的 total_cost_usd 在这里不能用。 任何建立在它们之上的东西——预算告警、按任务记账、「这活划不划算」的判断——都会错一个数量级以上。
  2. 要真实数字就用 DeepSeek 自己的 GET /user/balance。注意:它按人民币只给到两位小数,单次调用低于它的分辨率,得攒到差值可测再读。我按 ¥7.1/$ 换算;38 倍这个比例对汇率取值不敏感。

10 次调用:Claude Code 报告 $1.7097,DeepSeek 余额实扣 ¥0.32

一个诚实的边界:¥0.01 精度的余额差、十次样本,是个粗糙仪器。方向和数量级是可靠的,「38 倍」请当约 40 倍看,别当四位有效数字。

那个不该赖 DeepSeek 的失败

WebFetch 每次都失败:

is_error=True  Unable to verify if domain example.com is safe to fetch.
This may be due to network restrictions or enterprise security policies blocking claude.ai.

模型随后悄悄退回 Bash + curl,照样拿到了正确答案——这种静默降级恰恰是最该抓出来的。

我的第一个假设是 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1(DeepSeek 自家接入指南推荐设的那个)挡住了域名安全校验。这个假设是错的。 对照实验:

DISABLE_NONESSENTIAL_TRAFFIC 代理 WebFetch
A 1 ❌ 失败
B 不设 ❌ 失败
C 1 The page title is "Example Domain"

跟这个变量无关。域名安全校验要回连 Anthropic 的基础设施,而中国大陆不挂代理访问不到 claude.ai。同一天早些时候,我在一个用真实 Anthropic 凭据的会话里遇到过一模一样的报错。

所以:如果你在国内,换到 DeepSeek 后 WebFetch 坏了,别赖 DeepSeek,换之前它就是坏的。挂代理即可。

A/B/C 三组对照:与 DISABLE_NONESSENTIAL_TRAFFIC 无关,挂代理即通

专门写这一段,是因为这是这个题目下最容易发表出来的一条假结论,我差点就写了。

可以无视的噪声

每次调用 stderr 都会有这么一行:

[claude-code:unrecognized_model] {"model":"deepseek-v4-pro","query_source":"sdk"}

Claude Code 不认识这个模型名,但它照样正常工作。脚本里解析 stderr 的话把它过滤掉。

结论

适合拿来干:工具调用占大头、单 token 成本敏感的机械活——重构、铺测试、翻日志,那些你用 Opus 会心疼的事。工具层是真的扎实,我的矩阵里没有一条静默产生了错误副作用。

不适合:任何需要成本显示是真的场景,或者你要依赖 Claude Code 报告的上下文窗口与模型真实值一致的场景。这两个现在都是错的。

接上之后立刻要改的一件事:别看 /cost 了。写两行脚本读 DeepSeek 的余额端点。

踩坑速查

  1. 文档说的未知模型回落不存在——非 claude-* 且不是精确 DeepSeek 模型名的,返回 HTTP 400,不会静默换成 flash。
  2. thinking 块会吃掉 max_tokens——预算给小了会得到看似空的回复。影响自建客户端,不影响 Claude Code。
  3. 冷启动的缓存读是 0——别因为第一个请求就断定缓存没生效。
  4. total_cost_usd 是拿 Sonnet 价目套 DeepSeek token——虚高约 38 倍,对照真实账单测得。
  5. 国内的 WebFetch 失败是代理问题不是 DeepSeek 问题——写成兼容性缺陷之前先做对照组。
  6. /v1/models 的 404 和 stderr 的 unrecognized_model 都无害——别去追。

2026-09-20 实测,Claude Code 2.1.270,macOS/Apple Silicon,对象为 deepseek-v4-pro(DeepSeek-V4-Pro-0813)与 deepseek-flash(DeepSeek-V4.1-Flash)。价格数字同日读自 DeepSeek 官方价格页;花费经 GET /user/balance 前后对照测得。

相关文章

DeepSeek 标称 1M、Claude Code 只认 200K:两个都测了,真正卡住你的是第三个数

DeepSeek 标称 1M 上下文,而 Claude Code 接上去之后对同一个模型报告 contextWindow 200000。我把两边都测了。DeepSeek 的真实上限是 1,048,576——字面的 2 的 20 次方,不是一百万整——而且这个额度**含**你的 max_tokens 输出预算,用一组对照实验坐实。针插在第 0 位、上下文 1,039,744 token 时仍被准确捞出。Claude Code 则在远低于此处就本地拒绝,25 毫秒、零 API 调用,而且它卡的**根本不是 token**:闸门在约 48 万字符。喂高熵文本,478,000 字符顺利通过、真实 token 高达 309,567——比它刚刚自称的 20 万窗口还多 55%。而日常使用里这三个数你一个都碰不到,因为 Bash 输出超过整 30,000 字符就压根不进上下文。

claude-code长上下文+5
hands-on2026年9月20日6 min
6

服务、端口、证书全正常,VPN 却断了 4 小时:Tailscale 接管 DNS 后把翻墙机的解析清空了

一台跑 sing-box(VLESS-REALITY + Hysteria2)的洛杉矶 VPS,装上 Tailscale 第二天 VPN 全断。systemctl、端口、证书全部正常,根因藏在 /etc/resolv.conf:Tailscale 默认接管 DNS,tailnet 后台没配全局 nameserver,dhclient 续租时 resolv.conf 被读成空文件,tailscaled 从此对所有公网域名回 SERVFAIL,REALITY 握手连 www.apple.com 都解析不了。本文给出完整时间线、每一步的证据命令、三种修法,以及让 AI 助手(Claude Code)以后不再踩这个坑该写进 CLAUDE.md 的几条规则。

claude-code故障排查+8
pitfalls2026年9月17日5 min
71

CLAUDE.md 不是 README:给 Claude Code 写规则的 5 条硬规矩

很多人把 README 或架构文档整个贴进 CLAUDE.md,结果 Claude Code 该守的规矩不守、不该改的文件乱改。原因是 CLAUDE.md 不是文档,是每一轮对话都常驻上下文的指令。本文给 5 条硬规矩:只写代码里推不出来的东西、越短越管用、硬规则交给 hooks 不靠文字、按层级拆文件、被纠正后当场回写。附一份可直接抄的骨架。

claude-code提示词+4
developer2026年9月12日4 min
170

Claude Code 报错 temporarily unavailable, so auto mode cannot determine the safety of bash 怎么解决

Claude Code auto 模式(自动批准权限模式)弹出「temporarily unavailable, so auto mode cannot determine the safety of bash」?先说结论:不是你的命令危险,是安全判定器(一次额外的模型调用)暂时联不上。本文给出四步处理、模型名×工具名×原因的完整变体速查、Shift+Tab 六种权限模式速查(plan / manual / acceptEdits / dontAsk / auto / bypassPermissions,实测自 v2.1.263),以及「auto 是什么模型」「bash denied by auto mode 是不是同一个问题」这些常见困惑的答案。

llmclaude-code+5
pitfalls2026年9月4日7 min
642