Claude Code + DeepSeek 配置经验总结
> 踩坑无数后终于配通,记录如下,避免后人重蹈覆辙。
最终配置
三层文件
1. ~/.local/bin/claude-ds — 启动脚本(核心)
#!/usr/bin/env bash
exec env \
ANTHROPIC_API_KEY=sk-xxx \
ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic \
ANTHROPIC_MODEL=deepseek-v4-pro \
ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-v4-pro \
ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro \
ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash \
ANTHROPIC_DEFAULT_FABLE_MODEL=deepseek-v4-pro \
CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-pro \
CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000 \
CLAUDE_CODE_MAX_OUTPUT_TOKENS=32000 \
ENABLE_TOOL_SEARCH=false \
claude --settings '{"ultracode":true}' "$@"
2. ~/.config/claude-deepseek.env — 环境变量默认值
export ANTHROPIC_API_KEY=sk-xxx
export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
export ANTHROPIC_MODEL=deepseek-v4-pro
export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-v4-pro
export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro
export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash
export ANTHROPIC_DEFAULT_FABLE_MODEL=deepseek-v4-pro
export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-pro
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000
export CLAUDE_CODE_MAX_OUTPUT_TOKENS=32000
3. ~/.claude/settings.json — 持久化设置
{
"env": {
"ANTHROPIC_MODEL": "deepseek-v4-pro",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-v4-flash",
"ANTHROPIC_DEFAULT_FABLE_MODEL": "deepseek-v4-pro",
"CLAUDE_CODE_SUBAGENT_MODEL": "deepseek-v4-pro",
"CLAUDE_CODE_MAX_CONTEXT_TOKENS": "1000000",
"CLAUDE_CODE_MAX_OUTPUT_TOKENS": "32000"
},
"model": "deepseek-v4-pro",
"theme": "dark",
"statusLine": {
"type": "command",
"command": "bash /home/haitaoz/.claude/statusline-context.sh"
}
}
核心踩坑记录
坑1:[1M] 后缀对第三方模型无效
错误认知:模型名加 [1M] 后缀就能获得 1M 上下文。
真相:Claude Code 源码中 [1m] 路径有 firstParty 门控:
if (t?.includes("context-1m-2025-08-07") && MV(e)) return 1e6; // firstParty 门控
第三方 API(DeepSeek、GLM 等)走这条路径直接返回 null,后缀是摆设。
正确做法:设置环境变量 CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000,源码逻辑:
let n = CLAUDE_CODE_MAX_CONTEXT_TOKENS;
if (n > 0 && !modelName.startsWith("claude-")) return n; // 非 claude 模型用它
效果对比:
| 维度 | [1M] 后缀(无效) |
CLAUDE_CODE_MAX_CONTEXT_TOKENS(有效) |
|---|---|---|
| 上下文窗口 | 200,000(默认回退) | 1,000,000 |
| 压缩阈值 | ~167K | ~967K |
坑2:ultracode ≠ effort level
错误认知:ultracode 是最高的 effort level,和 low/medium/high/xhigh/max 一样可以在任何配置文件中设置。
真相:ultracode 是会话级多 Agent 编排模式,不是普通的 effort level。两者的机制完全不同:
| 配置方式 | low/medium/high/xhigh/max | ultracode |
|---|---|---|
effortLevel in settings.json |
✅ | ❌ 静默忽略 |
CLAUDE_CODE_EFFORT_LEVEL env var |
✅ | ❌ 不支持 |
--effort CLI 参数 |
✅ | ❌ 不报错但无效 |
/effort 交互命令 |
✅ | ✅ 会话级 |
--settings '{"ultracode":true}' |
— | ✅ 唯一持久化方式 |
坑3:--effort ultracode 不报错但不生效
测试过程:
$ claude --effort ultracode --print "OK" # 无警告,正常运行
$ claude --effort invalid_value --print "OK" # 警告: Unknown value
第一条命令不报错,容易让人以为 ultracode 已通过 CLI 生效。但实际上静默回退到默认值。第二条才暴露真相——它只校验是否在已知列表中,ultracode 恰好被接受但不做任何事。
坑4:CLAUDE_EFFORT vs CLAUDE_CODE_EFFORT_LEVEL
CLAUDE_CODE_EFFORT_LEVEL:官方环境变量,用户可设置CLAUDE_EFFORT:Claude Code 内部变量,启动后由程序自动生成
CLAUDE_EFFORT,它会在启动时被 Claude Code 覆盖。只设置 CLAUDE_CODE_EFFORT_LEVEL。
坑5:settings.json 的 effortLevel: "max" 有已知 bug
文档记录的 bug(issue #65651):"effortLevel": "max" 在 settings.json 中会被静默降级为 high。
effortLevel 字段,改用 env 块:
{
"env": {
"CLAUDE_CODE_EFFORT_LEVEL": "max"
}
}
坑6:多个 effort 设置会互相覆盖
优先级链(高→低):
CLAUDE_CODE_EFFORT_LEVEL env var > settings.json effortLevel > 默认值
如果 env var 设了 max,即使 --settings '{"ultracode":true}' 也可能被覆盖。需要 ultracode 时,必须把所有其他地方(env、settings.json)的 effort 设置全部删干净,只留 --settings '{"ultracode":true}'。
配置清单(复制即用)
| 文件 | 路径 | 关键内容 |
|---|---|---|
| 启动脚本 | ~/.local/bin/claude-ds |
exec env + --settings '{"ultracode":true}' |
| 环境变量 | ~/.config/claude-deepseek.env |
不设任何 EFFORT 变量 |
| 持久化设置 | ~/.claude/settings.json |
不设 effortLevel,不设 EFFORT env |
# 确保可执行
chmod +x ~/.local/bin/claude-ds
# 确保 ~/.local/bin 在 PATH 中
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# 启动
claude-ds