
1. Ubuntu 20.04 上 Claude Code 与 DeepSeek 的安装场景拆解如果你在 Ubuntu 20.04 上已经跑着 Codex又想额外装一个 Claude Code 来接入 DeepSeek最怕的就是两套环境互相打架Node 版本被顶掉、npm 全局包冲突、Codex 的启动路径被改。这篇就按这个真实场景来把 Claude Code 的安装、DeepSeek 的接入、以及把 endpoint 统一改到 TaoToken 通道这几件事一次讲清楚。先说清楚几个概念方便你对号入座。Claude Code 是 Anthropic 出的命令行编码助手它默认走 Anthropic 的接口协议但协议本身是可以通过环境变量改写的所以你能把它指向 DeepSeek 的 Anthropic 兼容端点也能指向 TaoToken 这类统一通道。DeepSeek 在这里扮演的是「模型提供方」它提供了deepseek-v4-pro、deepseek-v4-flash这类模型 ID。TaoToken 则是一个统一接入层把不同模型的 endpoint 收敛成一个 Base URL你换模型时只改 Model ID不用来回改地址。适合谁看已经在 Ubuntu 20.04 上用 NVM 管 Node、装过 Codex CLI、现在想加一个 Claude Code 但不想动现有环境的开发者。如果你是从零开始这篇同样能跟做只是我会额外提醒你 Node 版本和 PATH 的坑。我试过在一台 Node v22.22.2、Codex 0.145.0 的机器上操作Claude Code 用官方原生安装脚本装到~/.local/bin和 NVM 里的 Codex 完全隔离。这个隔离很关键因为 npm 全局安装很容易把codex的软链覆盖掉而原生安装脚本只往用户目录写文件不碰 npm 的 prefix。核心检索词先摆出来Ubuntu 20.04 安装 Claude Code、Claude Code 接入 DeepSeek、Claude Code settings 配置、ANTHROPIC_BASE_URL 修改、TaoToken 统一通道。这几个词贯穿全文你搜任意一个都应该能落到这篇。环境依赖这块Ubuntu 20.04 自带的 curl 和 bash 就够用不需要额外装编译工具。Node 版本建议 18 以上我用的是 v22.22.2。你可以先确认一下node --version # v22.22.2 codex --version # codex-cli 0.145.0 command -v codex # /home/hjx/.nvm/versions/node/v22.22.2/bin/codex看到 Codex 在 NVM 的 bin 目录下说明它是 npm 全局装的。这时候如果你用npm install -g anthropic-ai/claude-codenpm 会往同一个 prefix 写虽然不一定会覆盖 codex但 PATH 顺序一变就容易出问题。所以下面我走官方原生安装绕开 npm。还有一个容易忽略的点Ubuntu 20.04 的~/.local/bin默认可能不在 PATH 里。装完 Claude Code 后如果直接敲claude提示 command not found不是装失败是 PATH 没配。这个坑我在第 5 节会专门讲怎么排查。2. TaoToken 前置准备与 API Key 获取在动手改配置之前先把「钥匙」和「通道」准备好。这一步不做后面 settings 里填什么都是空的。TaoToken 的定位是一个统一模型接入通道你可以把它理解成一个「总机」Claude Code 只管往这个总机拨号总机再根据你指定的 Model ID 转到对应的模型。这样做的好处是你以后想从 DeepSeek 换到别的模型只改一个 Model IDBase URL 不用动。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置里填干净的就行。获取 API Key 的路径进控制台找到 API Keys 页面新建一个 Key。生成后完整复制格式一般是一串以特定前缀开头的字符串。这里有个安全习惯要养成Key 不要提交到 GitHub不要写进项目代码最好放在权限 600 的配置文件里用环境变量注入。后面我会用chmod 600把配置文件锁死。如果你还没决定用哪个模型可以先在模型对话页面试一下确认通道通不通再去配 Claude Code。模型对话入口https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想长期跑编码和 Agent 任务的话Coding Plan 更划算入口https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。API Keys 管理页https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。这里要强调一个业务边界TaoToken 是合规的统一接入通道不是灰色中转也不替代你的编辑器。它只负责把请求转发到模型你的代码、项目文件始终在本地。Claude Code 负责的是「在终端里帮你读写代码」TaoToken 负责的是「把请求送到模型」两者职责分开。Key 拿到后先别急着写进 Claude Code 的配置。我建议先单独验证一次通道是否可用用 curl 打一个最小请求export TAOTOKEN_KEY你的Key curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_KEY | head -c 500如果返回里有模型列表说明 Key 和通道都正常。这一步能帮你把「Key 错」和「Claude Code 配置错」两类问题提前分开省得后面 401 的时候来回猜。另外提醒一句DeepSeek 官方的 Anthropic 兼容端点是https://api.deepseek.com/anthropic而 TaoToken 的通道是https://taotoken.net/api。这两个地址在配置里的写法不同前者直接填后者要确认路径拼接规则。下面第 3 节我会给出两套可复制的配置你按需选。3. 可复制的 settings 与 env 配置片段这一节是全文的核心所有片段都能直接复制。Claude Code 读取配置的方式有两种一种是环境变量一种是 settings 文件。环境变量优先级高适合做「启动时注入」settings 文件适合做「持久化默认值」。我建议两者结合用 env 文件存敏感信息用启动脚本注入。先建配置目录权限收紧mkdir -p ~/.config/claude-deepseek chmod 700 ~/.config/claude-deepseek然后隐藏输入 Key避免它出现在 shell history 里read -rsp 请输入 API Key: DEEPSEEK_KEY echo echo Key 长度${#DEEPSEEK_KEY} echo Key 前缀${DEEPSEEK_KEY:0:3}*** echo Key 后缀***${DEEPSEEK_KEY: -4}确认长度和前后缀对得上再写入 env 文件。下面这套是走 DeepSeek 官方端点的版本{ printf export ANTHROPIC_BASE_URL%q\n https://api.deepseek.com/anthropic printf export ANTHROPIC_AUTH_TOKEN%q\n $DEEPSEEK_KEY printf export ANTHROPIC_MODEL%q\n deepseek-v4-pro[1m] printf export ANTHROPIC_DEFAULT_OPUS_MODEL%q\n deepseek-v4-pro[1m] printf export ANTHROPIC_DEFAULT_SONNET_MODEL%q\n deepseek-v4-pro[1m] printf export ANTHROPIC_DEFAULT_HAIKU_MODEL%q\n deepseek-v4-flash printf export CLAUDE_CODE_SUBAGENT_MODEL%q\n deepseek-v4-flash printf export CLAUDE_CODE_EFFORT_LEVEL%q\n max } ~/.config/claude-deepseek/env chmod 600 ~/.config/claude-deepseek/env unset DEEPSEEK_KEY如果你要把 endpoint 改到 TaoToken 统一通道只改第一行和 Model ID{ printf export ANTHROPIC_BASE_URL%q\n https://taotoken.net/api printf export ANTHROPIC_AUTH_TOKEN%q\n $TAOTOKEN_KEY printf export ANTHROPIC_MODEL%q\n deepseek-v4-pro[1m] printf export ANTHROPIC_DEFAULT_OPUS_MODEL%q\n deepseek-v4-pro[1m] printf export ANTHROPIC_DEFAULT_SONNET_MODEL%q\n deepseek-v4-pro[1m] printf export ANTHROPIC_DEFAULT_HAIKU_MODEL%q\n deepseek-v4-flash printf export CLAUDE_CODE_SUBAGENT_MODEL%q\n deepseek-v4-flash printf export CLAUDE_CODE_EFFORT_LEVEL%q\n max } ~/.config/claude-deepseek/env chmod 600 ~/.config/claude-deepseek/env注意ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY的区别前者是自定义 token后者是 Anthropic 官方 key。用第三方通道时统一用ANTHROPIC_AUTH_TOKEN并且启动前要把ANTHROPIC_API_KEYunset 掉否则可能被优先读取导致鉴权失败。如果你更习惯用 settings 文件Claude Code 也支持~/.claude/settings.json。下面是一个 JSON 片段路径和字段名按官方约定写{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: 你的Key, ANTHROPIC_MODEL: deepseek-v4-pro[1m], ANTHROPIC_DEFAULT_OPUS_MODEL: deepseek-v4-pro[1m], ANTHROPIC_DEFAULT_SONNET_MODEL: deepseek-v4-pro[1m], ANTHROPIC_DEFAULT_HAIKU_MODEL: deepseek-v4-flash, CLAUDE_CODE_SUBAGENT_MODEL: deepseek-v4-flash, CLAUDE_CODE_EFFORT_LEVEL: max } }settings.json 里直接写 Key 有个风险文件权限如果没锁同机器其他用户可能读到。所以要么chmod 600 ~/.claude/settings.json要么干脆用 env 文件方案settings 里只放非敏感字段。我个人的做法是敏感信息全走 envsettings 只留模型和 effort 这类可公开的。三件套对照表方便你检查有没有漏配置项作用DeepSeek 官方TaoToken 通道Base URL请求发往哪里https://api.deepseek.com/anthropichttps://taotoken.net/apiAPI Key鉴权凭证DeepSeek 平台生成TaoToken 控制台生成Model ID用哪个模型deepseek-v4-pro[1m]deepseek-v4-pro[1m]Base URL、Key、Model ID 这三件套缺一不可任何一项写错都会在验证阶段报错。下面第 4 节就来做一次真实请求验证。4. 验证请求与成功结果确认配置写完先别急着进项目。用一条最小请求确认链路通不通这是最省时间的做法。先创建独立启动命令避免污染全局环境cat ~/.local/bin/claude-deepseek EOF #!/usr/bin/env bash set -euo pipefail CONFIG_FILE$HOME/.config/claude-deepseek/env CLAUDE_BIN$HOME/.local/bin/claude if [[ ! -x $CLAUDE_BIN ]]; then echo 未找到 Claude Code$CLAUDE_BIN 2 exit 1 fi if [[ ! -f $CONFIG_FILE ]]; then echo 未找到配置$CONFIG_FILE 2 exit 1 fi unset ANTHROPIC_API_KEY unset ANTHROPIC_AUTH_TOKEN unset ANTHROPIC_BASE_URL unset ANTHROPIC_MODEL unset ANTHROPIC_DEFAULT_OPUS_MODEL unset ANTHROPIC_DEFAULT_SONNET_MODEL unset ANTHROPIC_DEFAULT_HAIKU_MODEL unset CLAUDE_CODE_SUBAGENT_MODEL unset CLAUDE_CODE_EFFORT_LEVEL source $CONFIG_FILE exec $CLAUDE_BIN $ EOF chmod 700 ~/.local/bin/claude-deepseek hash -r command -v claude-deepseek正常应该输出/home/你的用户名/.local/bin/claude-deepseek。如果输出为空说明~/.local/bin不在 PATH执行echo export PATH$HOME/.local/bin:$PATH ~/.bashrc source ~/.bashrc然后跑验证请求claude-deepseek -p 请只回复DEEPSEEK_OK成功时终端会输出DEEPSEEK_OK。看到这行字说明 Base URL、Key、Model ID 三件套全部生效Claude Code 已经能通过你配置的通道拿到模型回复。如果你想更直观地确认走的是哪个 endpoint可以在启动脚本里临时加一行调试输出或者用env命令看注入后的变量bash -c source ~/.config/claude-deepseek/env; echo $ANTHROPIC_BASE_URL; echo ${ANTHROPIC_AUTH_TOKEN:0:3}***输出应该是你配置的 Base URL 和 Key 前缀。这一步能帮你确认「配置有没有被正确 source」。再验证一次 Codex 没被影响command -v codex codex --version npm config get prefix我的输出是/home/hjx/.nvm/versions/node/v22.22.2/bin/codex codex-cli 0.145.0 /home/hjx/.nvm/versions/node/v22.22.2三行都对得上说明 Claude Code 和 DeepSeek 配置没有动 Codex、Node.js 或 npm 环境。这就是原生安装 独立启动脚本的价值两套工具各走各的 PATH互不干扰。进项目目录正常使用cd ~/你的项目目录 claude-deepseek原来的 Codex 照常用codex启动。两个命令两条链路互不影响。5. 常见报错排查401、local proxy failed、reading choices这一节按真实报错来你遇到哪个查哪个。401 Authentication Fails / Your api key is invalid这是最高频的报错。先明确一点401 通常是 Key 本身的问题不是网络问题也不是通道问题。排查顺序如下。第一步检查配置里的 Key 长度和前后缀bash -c source $HOME/.config/claude-deepseek/env echo Key 长度${#ANTHROPIC_AUTH_TOKEN} echo Key 前缀${ANTHROPIC_AUTH_TOKEN:0:3}*** echo Key 后缀***${ANTHROPIC_AUTH_TOKEN: -4} 如果长度明显偏短或者前缀不对基本就是输入时带进了多余字符。我第一次输入时Key 前面误多了echo变成了echosk-xxxx正确应该是sk-xxxx。这种错误肉眼很难发现用长度和前后缀一比对就露馅了。重新隐藏输入正确 Key覆盖配置文件再测一次。第二步确认没有残留的ANTHROPIC_API_KEY。启动脚本里已经 unset 了但如果你手动source过别的配置可能又注入了。用env | grep ANTHROPIC看一眼有冲突的就 unset。第三步确认 Base URL 拼写。DeepSeek 官方是https://api.deepseek.com/anthropicTaoToken 是https://taotoken.net/api。少一个斜杠、多一个路径都可能 404 或 401。local proxy failed / connection refused这个报错说明请求根本没发出去卡在本地网络层。常见原因是环境里残留了HTTP_PROXY、HTTPS_PROXY这类变量指向了一个不存在的本地端口。检查env | grep -i proxy如果有输出且指向127.0.0.1:某端口而那个端口没有服务在跑就会报 local proxy failed。处理方式是 unset 掉这些变量或者在启动脚本里显式清空unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy注意这里说的是清理本地无效代理变量不是让你去配什么网络工具。企业内网环境下如果有合法的出网代理按公司规范配置即可本文不涉及。reading choices / unexpected end of JSON这个报错通常出现在流式响应解析阶段意思是客户端在等choices字段但拿到的响应体不完整或格式不对。可能原因有三个一是 Model ID 写错了通道返回了错误结构二是 Base URL 指向的端点不支持 Anthropic 协议三是响应被中间层截断。排查方法先用 curl 直接打一次看原始返回curl -s https://taotoken.net/api/v1/messages \ -H Authorization: Bearer $TAOTOKEN_KEY \ -H Content-Type: application/json \ -d {model:deepseek-v4-pro[1m],max_tokens:32,messages:[{role:user,content:hi}]} | head -c 800如果 curl 返回正常 JSON但 Claude Code 报 reading choices那问题在 Claude Code 的协议适配层检查ANTHROPIC_BASE_URL是否指向了 Anthropic 兼容端点。如果 curl 本身就报错那就是 Key 或 Model ID 的问题。OAuth 相关报错如果你之前登录过 Anthropic 官方账号本地可能缓存了 OAuth token。Claude Code 启动时会优先读缓存导致它不走你配的ANTHROPIC_AUTH_TOKEN。处理方式是清掉官方登录态或者在启动脚本里确保ANTHROPIC_API_KEY和 OAuth 缓存都不生效。检查~/.claude目录下有没有凭据文件必要时备份后移除。Codex auth.json 冲突如果你同时用 Codex注意~/.codex/auth.json是 Codex 自己的鉴权文件和 Claude Code 无关。不要把它复制到 Claude Code 的配置目录也不要用同一个 Key。两者各管各的混用会导致一边鉴权失败。排障时记住一个原则先 curl 验证通道再验证 Claude Code 配置最后验证启动脚本。三层分开测问题定位快很多。接入文档在 https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 遇到协议细节可以对照看。6. 长期使用与通道切换建议配置跑通只是开始长期用下来有几个习惯能帮你少踩坑。第一把「通道切换」做成可逆操作。你现在 env 文件里写的是某一个 Base URL想换通道时不要手改而是准备多个 env 文件比如env.deepseek、env.taotoken启动脚本里用变量决定 source 哪个。这样切换只改一个软链或一个环境变量不会把配好的 Key 弄丢。第二Key 轮换要方便。TaoToken 控制台可以随时新建和吊销 Key建议每隔一段时间换一次。换的时候只改 env 文件里的ANTHROPIC_AUTH_TOKEN其他字段不动改完chmod 600再测一次claude-deepseek -p 请只回复OK。第三模型 ID 别写死在代码里。Claude Code 的ANTHROPIC_MODEL和几个DEFAULT_*_MODEL都是环境变量你可以按任务类型切换重推理用deepseek-v4-pro[1m]轻量补全用deepseek-v4-flash。CLAUDE_CODE_SUBAGENT_MODEL控制子代理用哪个模型跑 Agent 任务时把它设成 flash 能省不少额度。第四长期编码和 Agent 场景建议走 Coding Plan入口在 https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它的计费方式更适合高频调用比按次计费可控。模型对话入口在 https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 临时验证模型效果时用。API Keys 管理在 https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档在 https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。第五Claude Code 的 settings 文件路径是~/.claude/settings.json如果你用 JSON 方案记得每次改完做一次语法校验JSON 少个逗号就会静默失效。用python3 -m json.tool ~/.claude/settings.json能快速验证。最后说一个实际经验Claude Code 和 Codex 共存时最容易出问题的不是安装而是 PATH 顺序。NVM 的 shim 目录和~/.local/bin谁在前决定了你敲claude时命中哪个。用command -v确认实际路径比猜靠谱。把启动脚本写成绝对路径调用就绕开了 PATH 顺序问题这也是我在第 4 节用exec $CLAUDE_BIN的原因。到这一步你的 Ubuntu 20.04 上应该同时跑着 Codex 和 Claude Code DeepSeek 两条链路互不干扰通道可切换Key 可轮换。后面想加新模型只改 Model ID 就行。