Claude Code 模型列表报错排障实录

date
May 26, 2026
slug
tlive-claude-code-model-list-crs-fix
status
Published
summary
Claude Code CLI 所有模型报 not found,排查发现是 .zshrc 环境变量劫持了认证路径,顺带修复了 CRS Docker 的过时模型列表。
tags
Claude Code
CRS
Docker
tlive
排障
type
Post
URL
一次看似简单的 "model not found" 错误,背后藏着环境变量污染、缓存过期、Docker 镜像硬编码三层坑。

背景

最近在折腾 tlive(github.com/y49/tlive)——一个把 Claude Code CLI 接入 Telegram / 飞书的开源桥接工具。tlive 的核心思路:用 PTY 包装 Claude Code 进程,通过 WebSocket 把终端画面实时推送到浏览器或 IM 平台,实现「躺在沙发上给 AI 批权限」的快乐。
在配置 tlive 的过程中,我发现 Claude Code CLI 突然用不了了——所有模型都报 "model not found"。排障过程踩了三个坑,记录下来供参考。

症状

在 Claude Code CLI(v2.1.138)里切换模型,所有模型都报错:
/model claude-opus-4-7"Model not found"
/model claude-sonnet-4-6"Model not found"
/model opus               → 设置成功,但发消息报错
连 Sonnet 4.6 这种基础模型都用不了,说明不是「新模型 CLI 不认识」的问题。

排障过程

第一层:缓存?❌

最先怀疑 ~/.claude/cache/gateway-models.json。这个文件缓存了上次从 API 拉到的模型列表。发现缓存是 12 天前的,确实没有新模型。备份删除后重启——还是报错。缓存不是根因。

第二层:CLI 版本太旧?❌

终端右下角有 "Update available" 的提示。但 Sonnet 4.6 是个早就存在的模型,不可能当前版本不认识。排除版本问题。

第三层:环境变量劫持!✅ 真正根因

关键发现:claude -p "say hi" --model claude-sonnet-4-6 竟然能正常工作!
-p(print 模式)可以,交互模式不行?说明两种模式走了不同的认证路径。检查 shell 环境变量:
grep -i "ANTHROPIC" ~/.zshrc

# 输出:
export ANTHROPIC_BASE_URL="http://<YOUR_RELAY_IP>:3000/api/v1"
export ANTHROPIC_API_KEY="<YOUR_CRS_KEY>"
破案了!这两行是之前调试 Claude Relay Service (CRS) 时加的。ANTHROPIC_API_KEY 环境变量一旦存在,Claude Code 就会自动切换到 API Key 模式,把请求发到 ANTHROPIC_BASE_URL 指定的 CRS relay。而 CRS 的模型列表里没有新模型,所以全部报 not found。

Claude Code 的认证优先级

修复很简单:
# 注释掉 .zshrc 里这两行
#export ANTHROPIC_BASE_URL="..."
#export ANTHROPIC_API_KEY="..."

# 当前终端立即生效
unset ANTHROPIC_BASE_URL ANTHROPIC_API_KEY
重启 Claude Code,一切正常。

后续:修复 CRS 模型列表

虽然根因是环境变量,但 CRS 的模型列表确实过时了。CRS 的 /api/v1/models 端点返回的模型列表来自代码里的 modelService.js,是一个硬编码的静态列表。CRS 作为 proxy 实际能转发任何模型请求,但 models 端点的列表过时会导致下游客户端的前端校验失败。

修复步骤

  • 从容器拷出 modelService.js
  • 补全新模型(claude-opus-4-6/4-7、claude-sonnet-4-6、gpt-5.5、o3 等)
  • 在 docker-compose.yml 挂载修改后的文件
  • 重启容器
  • 验证:46 个模型全部到位 ✅
# docker-compose.yml 新增挂载
volumes:
  - ./app.js:/app/src/app.js
  - ./modelService.js:/app/src/services/modelService.js  # 新增

# 重建
docker compose up -d

# 验证
curl -s http://localhost:3000/api/v1/models \
  -H "x-api-key: <YOUR_KEY>" | python3 -c "
import json,sys
for m in json.load(sys.stdin)['data']:
    if any(k in m['id'] for k in ['opus-4-7','sonnet-4-6','5.5']):
        print(m['id'])"

教训总结

核心教训:当你同时使用 Claude Code CLI(OAuth 订阅)和自建 API Relay 时,务必确保 shell 环境变量不会意外污染 CLI 的认证路径。ANTHROPIC_API_KEY 的存在会静默切换认证模式,没有任何明显提示。

写于 2026-05-26,基于 Claude Code v2.1.138 + CRS 的实际排障经历。
参考:tlive - 把 Claude Code 接入 TG/飞书的开源工具 (github.com/y49/tlive)

© Ying Bun 2021 - 2026