Claude Code 接入 DeepSeek API:配置、计费与错峰定时任务
不需要 Anthropic 账号,用 DeepSeek 的人民币余额驱动 Claude Code。按官方文档配好模型映射和密钥权限,再用 systemd 定时器在北京时间空闲时段跑无人值守任务,按半价计费。
Claude Code 接入 DeepSeek API:先说结论
Claude Code 接入 DeepSeek API,只要把几个环境变量指向 DeepSeek 的 Anthropic 兼容接口就能用。不需要 Anthropic 账号,也不需要海外信用卡。费用从你在 platform.deepseek.com 用人民币充值的余额里扣。
先把一件事说清楚:这样跑起来的是 DeepSeek 的模型,不是 Claude。你用的是 Claude Code 的界面和工具,比如读文件、改代码、执行命令。背后负责理解需求和写代码的是 deepseek-flash 或 deepseek-v4-pro。效果好坏由 DeepSeek 模型决定。
网上的 CSDN 教程大多讲到“能跑起来”就结束了。下面多做两件事。第一,把密钥放在 Agent 读不到的地方。第二,利用 VPS 一直开机的特点,用 systemd 定时器把耗时长的 claude -p 任务排在北京时间的空闲时段,按半价计费。如果你还在挑工具,可以先看 Claude Code、dsh 和 Omnigent 这几个编程 Agent 的对比。
配置依据:DeepSeek 官方文档,2026-10-01 读取
环境变量取自 DeepSeek API 文档的《接入 Agent 工具》页面。模型映射和字段支持取自《Anthropic API》页面。价格取自《模型 & 价格》页面。这三页都在 2026-10-01 读取。页面上没有标注更新日期,DeepSeek 修改页面时也不会通知你,所以动手之前请重新打开核对一遍。
Claude Code 固定在 @anthropic-ai/claude-code@2.1.286。这是 2026-10-01 npm 上的最新版本,要求 Node.js 22 或更高。Claude Code 发版很频繁,对环境变量的处理偶尔会变。固定版本之后,今天能用的配置,下个月读取它的还是同一个程序。
安装 Node.js 22 和指定版本的 Claude Code
Ubuntu 24.04 软件源里的 nodejs 是 18 版,低于 Claude Code 的要求。所以从 NodeSource 安装 22 版:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs jq
node --versionnode --version 应该输出以 v22. 开头的版本号。如果仍是 v18,说明 apt 还在用 Ubuntu 自己的源。检查 /etc/apt/sources.list.d/ 里有没有 NodeSource 的文件。
国内服务器访问 npm 官方源经常很慢,可以改用 npmmirror 镜像。注意要把 --registry 直接写在安装命令里。原因是 sudo npm 读取的是 root 用户的 npm 配置,你在普通用户下执行 npm config set registry 对它不起作用。
sudo npm install -g --registry=https://registry.npmmirror.com @anthropic-ai/claude-code@2.1.286
claude --version
command -v claudeclaude --version 的输出里应该有 2.1.286。command -v claude 打印的路径后面写 systemd 服务时要用,通常是 /usr/bin/claude。
创建 DeepSeek API Key
在 platform.deepseek.com 充值,然后在 API Keys 页面新建一个密钥。密钥只在创建时完整显示一次,要马上复制。建议给这台 VPS 单独建一个密钥。万一泄露,只删这一个,其他项目不受影响。按价格页的说明,扣费时先扣赠送余额,再扣充值余额。
把环境变量写进 ~/.claude/settings.json
DeepSeek 页面给的是一组 export 命令。export 只对当前 shell 有效。很多人为了省事把它写进 ~/.bashrc,结果密钥跟着 dotfiles 仓库进了 git。更稳的做法是写进 Claude Code 的用户配置文件 ~/.claude/settings.json 的 env 字段。Claude Code 启动时会把这些值加进自己的环境变量。
先建文件、收紧权限,再写内容。这样密钥从来不会出现在其他用户可读的文件里:
mkdir -p ~/.claude
touch ~/.claude/settings.json
chmod 600 ~/.claude/settings.json
ls -l ~/.claude/settings.jsonls -l 的权限一栏应该是 -rw-------。如果这个文件原来就有内容,只把下面的 env 和 permissions 合并进去,不要整个覆盖:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic",
"ANTHROPIC_AUTH_TOKEN": "sk-你的DeepSeek密钥",
"ANTHROPIC_MODEL": "deepseek-flash[1m]",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-flash[1m]",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-flash[1m]",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-flash",
"CLAUDE_CODE_SUBAGENT_MODEL": "deepseek-flash",
"CLAUDE_CODE_EFFORT_LEVEL": "max",
"DISABLE_AUTOUPDATER": "1",
"CLAUDE_CODE_SUBPROCESS_ENV_SCRUB": "1"
},
"permissions": {
"deny": ["Read(~/.claude/settings.json)"]
}
}env 里的前八项和 DeepSeek 页面完全一致。逐项说明:
ANTHROPIC_BASE_URL:Claude Code 不再访问 Anthropic 的服务器,改为把请求发到 DeepSeek 的 Anthropic 兼容接口。ANTHROPIC_AUTH_TOKEN:Claude Code 会在它前面加上Bearer,放进Authorization请求头。DeepSeek 靠这个请求头识别你的账户。- 几个
MODEL变量:Claude Code 内部用 opus、sonnet、haiku 这些别名选模型。这几行把别名全部换成 DeepSeek 的模型名。haiku 别名还被 Claude Code 用于后台的小任务,子 Agent 则读取CLAUDE_CODE_SUBAGENT_MODEL。 [1m]后缀:按 Claude Code 的模型配置文档,这个后缀告诉 Claude Code 该模型有 100 万 tokens 的上下文窗口,并且在发送请求前会去掉后缀。所以 DeepSeek 收到的模型名仍是deepseek-flash。DeepSeek 价格页标注两个模型的上下文长度都是 1M,两边一致。CLAUDE_CODE_EFFORT_LEVEL:DeepSeek 页面推荐设为max。
最后两项是额外加的。DISABLE_AUTOUPDATER=1 关闭启动时的自动更新检查,让版本真正停在 2.1.286。CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 和那条拒绝规则的作用,放在后面“密钥”一节解释。
然后进入一个项目目录启动 Claude Code:
cd ~/myproject
claude进入界面后输入 /status,模型一栏应该显示你配置的 DeepSeek 模型名。再随便问一句,比如“列出这个目录里的文件”。回答正常之后,到 DeepSeek 控制台的用量页面,应该能看到新增的 deepseek-flash 消耗。
如果报认证错误,先运行 env | grep ANTHROPIC,看 shell 里有没有残留的旧变量,比如以前接 Anthropic 时设置的 ANTHROPIC_API_KEY。以前用 Claude 订阅登录过的机器也可能留着旧的登录状态。两种认证方式各自怎么生效,见 Claude Code 订阅登录和 API Key 认证的区别。
选模型:opus 别名默认并不指向 deepseek-v4-pro
DeepSeek 的 Anthropic API 页面写着:请求里的 claude-opus 映射到 deepseek-v4-pro,按 V4 Pro 计价;sonnet 和 haiku 映射到 deepseek-flash。很多人看到这句,以为在 Claude Code 里输入 /model opus 就会切到 v4-pro。
按上面的配置,不会切换。原因是 Claude Code 在发出请求之前,已经用 ANTHROPIC_DEFAULT_OPUS_MODEL 的值替换了 opus 别名。DeepSeek 页面把这个值设成了 deepseek-flash[1m],所以请求里写的就是 deepseek-flash。DeepSeek 那条 claude-opus 映射根本没有机会生效。
想日常用 flash、遇到难题再切到 v4-pro,只需要改一行:
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1m]"之后在会话里输入 /model opus 就会使用 v4-pro,输入 /model sonnet 切回 flash。切换之后用 /status 确认,再到控制台看当天是否出现 deepseek-v4-pro 的用量。不要凭回答的风格猜测当前是哪个模型。
DeepSeek API 价格:2026-10-01 的快照
下面是 2026-10-01 从价格页抄下来的数字,单位是元每百万 tokens。DeepSeek 调过价,以后还会调。每次做预算之前,请重新读一遍价格页。
The data behind this chart
[
{
"label": "deepseek-flash \u9ad8\u5cf0",
"cache_hit_input": 0.04,
"cache_miss_input": 2,
"output": 8
},
{
"label": "deepseek-flash \u7a7a\u95f2",
"cache_hit_input": 0.02,
"cache_miss_input": 1,
"output": 4
},
{
"label": "deepseek-v4-pro \u9ad8\u5cf0",
"cache_hit_input": 0.3,
"cache_miss_input": 9,
"output": 27
},
{
"label": "deepseek-v4-pro \u7a7a\u95f2",
"cache_hit_input": 0.15,
"cache_miss_input": 4.5,
"output": 13.5
}
]缓存未命中时,deepseek-flash 在高峰时段的输入价是 2 元,输出价是 8 元。deepseek-v4-pro 在高峰时段的输入价是 9 元,输出价是 27 元。空闲时段的价格统一是高峰价的一半。
高峰时段的原文规则是:“北京时间周一至周五(不含中国法定节假日)9:00 - 12:00、14:00 - 18:00 为高峰时段;其余时段,包括周末及中国法定节假日全天均为空闲时段。”也就是说,工作日的凌晨、午休时间、傍晚以后,加上整个周末,都按半价计费。
模型选择比错峰更省钱
把一个假设的夜间任务代入价格算一下:一次任务读入 1000 万 tokens 输入,写出 50 万 tokens 输出。表里给出两种情况:输入的 80% 命中缓存,以及完全没有命中。这些是按上面的单价手算的示例,不是实测账单。
The data behind this chart
[
{
"label": "deepseek-flash \u9ad8\u5cf0",
"cny_80pct_cache_hit": 8.32,
"cny_no_cache_hit": 24
},
{
"label": "deepseek-flash \u7a7a\u95f2",
"cny_80pct_cache_hit": 4.16,
"cny_no_cache_hit": 12
},
{
"label": "deepseek-v4-pro \u9ad8\u5cf0",
"cny_80pct_cache_hit": 33.9,
"cny_no_cache_hit": 103.5
},
{
"label": "deepseek-v4-pro \u7a7a\u95f2",
"cny_80pct_cache_hit": 16.95,
"cny_no_cache_hit": 51.75
}
]按 80% 命中计算,flash 放到空闲时段约 4.16 元。v4-pro 即使放到空闲时段,也要 16.95 元,比 flash 在高峰时段的 8.32 元还贵。错峰最多省一半,换模型的差距是几倍。所以第一步是确认你的任务用 flash 能不能完成,第二步才是挑时间。
缓存命中率对账单的影响同样很大。同样是 flash 空闲时段,完全不命中要 12 元,接近 80% 命中时的三倍。这就引出下一个问题。
Claude Code 能拿到 DeepSeek 的缓存命中价吗?
这个问题文档没有给出答案,需要你自己验证。
先看两边已知的事实。Claude Code 会在请求里用 cache_control 标出哪些内容应该缓存,这是 Anthropic 接口的做法。DeepSeek 的 Anthropic API 页面写明 cache_control 被忽略。另一方面,DeepSeek 的上下文硬盘缓存“对所有用户默认开启”,按请求之间的公共前缀自动命中,不需要任何标记。
Claude Code 的请求结构很适合前缀缓存。每一轮都重新发送同样的系统提示词和同样的工具定义,后面再接上越来越长的对话历史,开头部分基本不变。如果 DeepSeek 的自动缓存也作用于 Anthropic 兼容接口,这些前缀应该能命中。但 DeepSeek 的缓存文档只描述了它自己的接口,没有说明 Anthropic 兼容接口是否适用,也没有说明命中的 tokens 会不会出现在 Anthropic 格式的 usage 字段里。
验证方法:在同一个项目里,用 JSON 输出连续跑两次同一个小任务,间隔十几秒,比较两次的 usage:
claude -p "用一句话总结 README.md" --output-format json | jq .usage如果第二次的 cache_read_input_tokens 明显大于零,说明命中情况被报告回来了。如果是零,或者没有这个字段,也不能直接断定没有命中,因为 DeepSeek 可能只在自己的账单里记录命中。这时以控制台的用量明细为准:如果明细把缓存命中和未命中分开列出,就看当天命中那一项有没有数字。在你确认之前,按“全部未命中”估算预算更安全。
顺带一提,JSON 输出里的 total_cost_usd 是 Claude Code 在本地估算的美元金额。Claude Code 文档自己也说明它可能和实际账单不同。它并不知道 DeepSeek 的人民币价格,所以不要拿它记账。
调休的周六算高峰还是空闲?
规则只写了“周一至周五(不含中国法定节假日)”和“包括周末”。调休补班的周六在法律上是工作日,但它不属于周一至周五。按字面理解,它属于“周末”,应该按空闲时段计费。可是页面没有直接讨论调休,DeepSeek 的计费系统也可能按工作日日历处理。
所以不要把大任务押在调休周六的白天。想知道答案,可以在调休周六上午 9:00 到 12:00 之间跑一个很小的任务,然后在控制台用量明细里看那一小时的单价。亲眼看到之前,把它当成未知。
反过来的情况规则写得很清楚:国庆、春节这类法定节假日落在周一到周五的日子,全天都是空闲时段。
DeepSeek 忽略的字段,哪些你真的会注意到
DeepSeek 的 Anthropic API 页面列了一长串被忽略或不支持的字段。大部分在 Claude Code 的日常使用中碰不到。下面按实际影响排序:
cache_control被忽略:影响账单,上一节已经讲过。mcp_servers被忽略:这个字段的作用是让 Anthropic 的服务器替你连接远程 MCP 服务器。Claude Code 自己在本机连接 MCP 服务器,再把它们的工具当作普通工具定义发出去,所以你在本地配置的 MCP 服务器照常可用。在服务器上配置这类工具的方法,见 在 VPS 上运行 MCP 服务器。- MCP 工具搜索默认关闭:这一条来自 Claude Code 本身。按 Claude Code 文档,
ANTHROPIC_BASE_URL指向非 Anthropic 的地址时,MCP 工具搜索默认关闭,所有 MCP 工具的定义会在每次请求里完整发送。工具越多,每一轮的输入 tokens 就越多。在 DeepSeek 上,少装几个 MCP 服务器就是直接省钱。 document内容类型不支持:在 Anthropic 接口里,PDF 通常以 document 内容块发送,所以让 Claude Code 直接读 PDF 很可能失败。先用pdftotext(在poppler-utils包里)把它转成文本,再交给 Agent。- 思考模式的
budget_tokens被忽略:思考功能本身可以用,但你无法用预算限制思考的长度。 citations、top_k、service_tier、container被忽略:Claude Code 的日常使用中察觉不到。
另外两点和字段无关,但同样会遇到。从 v2.1.196 起,ANTHROPIC_BASE_URL 指向第三方地址时 Claude Code 会禁用 Remote Control,所以不能用手机远程接管这个会话。DeepSeek 页面也没有列出联网搜索这类服务端工具,Claude Code 的 WebSearch 不要指望能用。
密钥放在哪里,Agent 才碰不到
~/.claude/settings.json 设成 600 之后,同一台机器上的其他用户读不到它。但 Claude Code 以你的用户身份运行,文件权限挡不住它自己的 Read 工具。所以配置里加了一条 Read(~/.claude/settings.json) 拒绝规则,Agent 用 Read 工具打开这个文件时会被拦下。
密钥还有第二条泄露路径:环境变量。Claude Code 文档写明,默认情况下 Bash 工具启动的子进程会继承完整的环境,包括 API 密钥。Agent 只要执行一次 env,ANTHROPIC_AUTH_TOKEN 就会出现在输出里,进入对话上下文,再被发送给模型。CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 让 Bash 子进程只保留一组安全的基础变量,这条路径就被切断了。
Bash 里的 cat 能不能被那条 Read 规则拦下,取决于 Claude Code 如何处理只读命令,不要依赖它。最稳的办法是不让无人值守的任务使用 Bash,下面的定时任务就是这样配置的。
还有一条规矩:密钥只能放在用户级配置里。项目目录下的 .claude/settings.json 通常会提交到 git,不要往里面写任何密钥。单独的系统用户、只读挂载这类更完整的隔离做法,见 在 VPS 上安全运行 Claude Code。
用 systemd 定时器在 DeepSeek 空闲时段跑 claude -p
VPS 一直开着,这是它比笔记本强的地方。批量补测试、跑代码审查这类耗时长的任务,可以交给 claude -p 无人值守执行,再用 systemd 定时器排在凌晨,稳定拿到半价。交互式的日常开发可以另外放进 tmux,见 在 VPS 上用 tmux 跑 Claude Code。
第一步:确认 VPS 的时区
timedatectl大多数 VPS 镜像的 Time zone 一行显示 Etc/UTC。北京时间是 UTC+8,没有夏令时。如果你在定时器里只写 02:30,systemd 会按服务器时区理解,也就是 UTC 02:30。它对应北京时间 10:30,正好落在高峰时段,价格翻倍。
不需要修改服务器时区,改了会影响日志时间和其他服务。直接在 OnCalendar 里写上时区就行,写法见第四步。
第二步:专用用户和只有 root 能读的 EnvironmentFile
夜间任务用一个单独的用户运行。它的家目录里没有 settings.json 密钥,密钥只放在一个 root 才能读的文件里:
sudo useradd -m -s /bin/bash claude-job
sudo install -m 600 -o root -g root /dev/null /etc/claude-deepseek.env
sudoedit /etc/claude-deepseek.env
sudo ls -l /etc/claude-deepseek.env文件内容和前面的 env 字段相同,只是换成 KEY=VALUE 格式:
ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
ANTHROPIC_AUTH_TOKEN=sk-你的DeepSeek密钥
ANTHROPIC_MODEL=deepseek-flash[1m]
ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-flash[1m]
ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-flash[1m]
ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-flash
CLAUDE_CODE_SUBAGENT_MODEL=deepseek-flash
CLAUDE_CODE_EFFORT_LEVEL=max
DISABLE_AUTOUPDATER=1
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1ls -l 应该显示 -rw------- 1 root root。这样能行,是因为 EnvironmentFile 由 systemd 以 root 身份读取,读完之后才切换到 User= 指定的用户启动程序。claude-job 本身不需要读这个文件的权限。可以这样确认:
sudo -u claude-job cat /etc/claude-deepseek.env应该得到 Permission denied。然后把项目检出到 claude-job 的家目录:
sudo -u claude-job git clone <你的仓库地址> /home/claude-job/myproject第三步:service 文件
新建 /etc/systemd/system/claude-nightly.service:
[Unit]
Description=Nightly Claude Code job on DeepSeek (off-peak)
[Service]
Type=oneshot
User=claude-job
WorkingDirectory=/home/claude-job/myproject
EnvironmentFile=/etc/claude-deepseek.env
ExecStart=/usr/bin/claude -p "阅读 TODO.md,完成第一项未完成的任务,最后说明改了哪些文件" --allowedTools "Read,Edit" --permission-mode dontAsk --permission-prompts none --output-format json
TimeoutStartSec=5h--allowedTools "Read,Edit" 配合 --permission-mode dontAsk,表示只自动放行读文件和改文件,其他需要确认的操作一律拒绝。Agent 不能执行 Bash,也就不能用 env 或 cat 碰到密钥。--permission-prompts none 告诉模型没有人会来批准请求,被拒绝后不要反复重试。这个参数需要 Claude Code v2.1.259 或更高,2.1.286 满足要求。
如果任务确实需要跑测试,只放行具体的命令,例如 --allowedTools "Read,Edit,Bash(npm test *)"。因为开启了 CLAUDE_CODE_SUBPROCESS_ENV_SCRUB,测试进程拿不到密钥。
Type=oneshot 的服务要等到程序退出才算启动完成,所以 TimeoutStartSec=5h 就是整个任务的时间上限。凌晨 02:30 开始,最晚 07:30 结束,离 9:00 的高峰还有余量。到时间后 systemd 发送 SIGTERM。按 Claude Code 文档,收到 SIGTERM 时它以退出码 143 结束,正在进行的那一轮不会完成。留余量的另一个原因是:DeepSeek 页面没有说明跨过 9:00 的请求按开始时间还是结束时间计费。
第四步:timer 文件,用北京时间写 OnCalendar
新建 /etc/systemd/system/claude-nightly.timer:
[Unit]
Description=Run claude-nightly in DeepSeek off-peak hours (Beijing time)
[Timer]
OnCalendar=*-*-* 02:30:00 Asia/Shanghai
[Install]
WantedBy=timers.targetOnCalendar 末尾的 Asia/Shanghai 让 systemd 按北京时间计算触发时刻,和服务器自己的时区无关。北京时间 02:30 在任何一天都属于空闲时段,所以每天都跑也不会碰到高峰价。
启用之前,先确认 systemd 的理解和你一致:
systemd-analyze calendar --iterations=3 '*-*-* 02:30:00 Asia/Shanghai'在 UTC 服务器上,输出的下一次触发时间换算成 UTC 应该是 18:30:00,日期是北京日期的前一天。北京时间 02:30 减去 8 小时,就是前一天 UTC 18:30。如果看到的是 02:30:00 UTC,说明时区没有写进去,或者拼错了。--iterations=3 会再列出后面两次触发时间,用来确认每天只触发一次。建议把这次的实际输出保存下来,以后修改定时器时拿来对照。
sudo systemctl daemon-reload
sudo systemctl enable --now claude-nightly.timer
systemctl list-timers claude-nightly.timerlist-timers 的 NEXT 列应该显示下一次触发时间,LEFT 列是距离现在还有多久。
注意这个 timer 故意没有写 Persistent=true。开启它之后,systemd 会记录上次运行时间,服务器在 02:30 关机的话,开机后会立刻补跑一次。如果你在上午 10:00 为了内核更新重启,补跑的任务就落在高峰时段。少跑一晚比按高峰价跑一次更便宜。
手动测试 service 时也要注意价格。sudo systemctl start claude-nightly.service 会立刻执行,在高峰时段测试就按高峰价计费。测试时把 prompt 换成很小的任务,或者在工作日 12:00 到 14:00 之间测。
第五步:第二天早上检查结果
systemctl status claude-nightly.service
journalctl -u claude-nightly.service -n 50 --no-pager
sudo -u claude-job git -C /home/claude-job/myproject diff --stat正常结束时,status 里能看到 code=exited, status=0/SUCCESS。如果日志里出现 Failed with result 'timeout',说明任务被 5 小时的上限终止了,应该把任务拆小。git diff --stat 列出 Agent 改了哪些文件,你审查之后再决定提交。失败通知、随机延迟这类更多的 timer 写法,见 在 VPS 上用 systemd service 和 timer 跑定时任务。
FAQ:常见问题
不注册 Anthropic 账号,真的能用 Claude Code 吗?
可以。把 ANTHROPIC_BASE_URL 设为 https://api.deepseek.com/anthropic,把 ANTHROPIC_AUTH_TOKEN 设为 DeepSeek 的 API Key,Claude Code 就会把所有请求发给 DeepSeek,费用从你在 platform.deepseek.com 的人民币余额里扣。要清楚的是,这时回答你的是 DeepSeek 的模型,不是 Claude。你得到的是 Claude Code 的界面和工具,模型能力由 DeepSeek 决定。
为什么输入 /model opus 之后用的还是 deepseek-flash?
因为 Claude Code 在发送请求之前,会用 ANTHROPIC_DEFAULT_OPUS_MODEL 的值替换 opus 别名。DeepSeek 官方配置把这个值设成了 deepseek-flash[1m],所以请求里的模型名已经是 deepseek-flash,DeepSeek 那条 claude-opus 映射到 deepseek-v4-pro 的规则不会生效。把 ANTHROPIC_DEFAULT_OPUS_MODEL 改成 deepseek-v4-pro[1m],再用 /status 和控制台用量确认。
我的 systemd 定时任务为什么在北京时间上午 10:30 运行?
因为 OnCalendar 里没有写时区,systemd 按服务器时区理解时间,而大多数 VPS 的时区是 UTC。UTC 02:30 就是北京时间 10:30,正好是 DeepSeek 的高峰时段。把这一行写成 OnCalendar=*-*-* 02:30:00 Asia/Shanghai,再用 systemd-analyze calendar 确认换算成 UTC 的触发时间是 18:30。
Claude Code 接 DeepSeek 时还能用 MCP 和读 PDF 吗?
本地配置的 MCP 服务器可以用。DeepSeek 忽略的 mcp_servers 字段只用于让 Anthropic 服务器代为连接远程 MCP,而 Claude Code 是在本机连接 MCP 服务器的。但 MCP 工具搜索在第三方接口上默认关闭,所有工具定义每次都会完整发送,输入 tokens 会变多。PDF 通常以 document 内容块发送,DeepSeek 不支持这种类型,所以先用 pdftotext 转成文本。
怎么确认 Claude Code 的请求命中了 DeepSeek 的缓存?
DeepSeek 文档没有说明 Anthropic 兼容接口是否享受自动缓存。可以自己测:用 claude -p "用一句话总结 README.md" --output-format json | jq .usage 连续跑两次,看第二次的 cache_read_input_tokens 是否大于零。如果为零或者没有这个字段,再到 DeepSeek 控制台的用量明细里核对命中情况。确认之前,按全部未命中做预算。