一、原问题与场景claude --continue为什么直接甩出 Session not found这篇文章只解决一件事你在终端敲下claude --continue想接着昨天那段没写完的调试继续聊结果等来的不是上下文而是Error: No previous session found换成claude --resume又提示Session ID abc123 does not exist or has been corrupted再翻日志还有第三种更难受的写法——Session file corrupted: invalid JSON in ~/.claude/sessions/2024-01-15/session-abc123.json。Claude Code 的会话恢复不是“存在云端账号里”的逻辑而是实实在在落在本地磁盘上的 JSON 文件。默认路径是~/.claude/sessions/YYYY-MM-DD/session-id.json按日期分目录一次会话一个文件。--continue做的事情很朴素按时间找最近一个会话文件读出来反序列化把消息历史灌回上下文。--resume则是先列一个可选列表让你手动挑。所以恢复失败几乎不可能是“模型不认你”而是文件这一环出了问题文件没了、文件坏了、文件读不了、文件格式对不上当前版本。最常见的触发场景有这么几类。第一类是手动清理过~/.claude/sessions/或者用了系统清理工具把旧目录一起扫掉了。第二类是写到一半断电、容器被杀、进程被kill -9JSON 只写了一部分尾部少一个大括号。第三类是多台机器之间拷配置只拷了settings.json却没拷 sessions 目录。第四类是长期不清理单个会话文件涨到几十兆甚至更大加载时直接超时或解析失败。第五类是同机上装了多个 Claude Code 版本一个用 npm 全局装、一个用 npx 临时跑新旧格式互不认。这里需要先把一件事说清楚本篇的处理顺序是“先把网络与鉴权这一层确认没问题再回头查会话文件”。因为当 Base URL 或 Key 配错时Claude Code 会在启动阶段就异常退出退出时不一定来得及把会话落盘于是你看到的报错是Session not found真正的原因却在上游请求失败。TaoToken 在这条链路里只提供 Key 和 Base URL它不负责修复你本地的 session 文件也不替代--resume的选择逻辑它能做的是让模型请求这一段先稳定下来避免你在排查会话文件时被鉴权问题反复干扰。先把这段路走通再去看~/.claude/sessions/里的东西排查效率会高很多。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。补充一句关于“退出方式”的细节/exit正常退出会触发一次完整写入而直接关终端窗口、SSH 断线、Docker 容器被docker stop打断写入很可能只完成一半。如果你想复现这个问题最省事的办法就是开一个会话随便聊几句然后强行终止进程再去跑claude --continue大概率能看到Session file corrupted。二、TaoToken 前置先拿 Key把 Claude Code 的请求接出去在动手删session-*.json之前先做一次网络与鉴权的“减法排查”。思路很简单把 Claude Code 的模型请求指向一个可控、稳定的入口确认请求本身是通的、返回是正常的这样后面所有报错就都能收敛到本地文件层面。第一步打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 创建账号并在控制台生成一个 API Key。这个 Key 就是后面要填进ANTHROPIC_AUTH_TOKEN的值本文里统一用YOUR_API_KEY占位你替换成自己的真实 Key 即可。Key 只在生成时完整显示一次建议直接存进密码管理器不要贴进仓库、不要写进会提交的settings.json。第二步准备两个值Base URL 固定为https://taotoken.net/api注意两点——不要在后面拼/v1也不要带任何查询参数或 UTM 后缀。很多Session not found的现场实际上是 Base URL 被写成了https://taotoken.net/api/v1或从浏览器地址栏复制时带上了?utm_source...请求打到错误路径上返回 404Claude Code 启动阶段就挂了。第三步明确责任边界。TaoToken 提供的是 Key 和 Base URL负责模型请求的转发与鉴权~/.claude/sessions/里的 JSON 完整性、目录权限、磁盘空间、版本兼容性全部是你本地需要自己处理的部分。把这两件事分开看排查就不会互相甩锅。这里也顺便回应一个高频疑问--continue失败、--resume也失败是不是该换服务不是。会话恢复读的是磁盘文件跟模型服务没有直接关系。但如果你连一次新的、干净的会话都开不起来那就先修配置配置通了再谈恢复。三、可复制配置settings.json 里的 ANTHROPIC_* 怎么写Claude Code 读取环境变量的优先级大致是进程环境变量优先其次是用户级~/.claude/settings.json中的env段。推荐用settings.json管理好处是开新终端不需要重新 source也不会污染全局 shell 环境。配置文件路径~/.claude/settings.json。如果文件不存在就新建内容如下把YOUR_API_KEY和模型 ID 换成你自己的{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: 你的模型ID, ANTHROPIC_SMALL_FAST_MODEL: 你的轻量模型ID } }几个关键点ANTHROPIC_BASE_URL的值就是https://taotoken.net/api结尾没有斜杠、没有/v1。有些版本的 Claude Code 会自己在后面拼路径你多加一层就会 404。ANTHROPIC_AUTH_TOKEN是 bearer token 形式部分旧版本或某些包装脚本读的是ANTHROPIC_API_KEY。如果你填了ANTHROPIC_AUTH_TOKEN仍然报 401可以把两个都写上或者按你本地版本的文档取其一。两个都写时保持一致的值别写混。ANTHROPIC_MODEL和ANTHROPIC_SMALL_FAST_MODEL填你在控制台能看到、且有权限调用的模型 ID。不确定就先只写ANTHROPIC_MODEL跑通后再补小模型。settings.json是 JSON 格式不许有注释、不许有尾逗号。写完自己校验一下python3 -m json.tool ~/.claude/settings.json /dev/null echo settings ok如果你更习惯用环境变量临时跑一次可以这样export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_MODEL你的模型ID写进~/.zshrc或~/.bashrc也行但要小心和settings.json里的值打架。排查阶段建议只保留一处改完打开一个新终端确认echo $ANTHROPIC_BASE_URL的输出符合预期。想确认 Key 状态、额度、可用模型可以在控制台里核对https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。完整的接入参数说明在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。四、验证请求与会话文件json.tool 加 --resume 双确认配置改完不要直接去救老会话先用一个干净的新会话验证链路。启动 Claude Code随便发一句最短的指令比如让它只回复ok。如果返回正常说明 Base URL 和 Key 这一层通了如果这里就报 401、403、404 或者连接超时先回上一节改配置别往下走。链路通了之后再去看会话文件到底长什么样。先列出最近的会话ls -lt ~/.claude/sessions/ | head -20 ls -lt ~/.claude/sessions/$(date %F)/ 2/dev/null | head路径规则是~/.claude/sessions/YYYY-MM-DD/session-id.json日期是会话创建那天不是今天。如果你在跨天的时候恢复得去前一天的目录里找。接着验证 JSON 是否完整。这是整个排查里最有信息量的一步python3 -m json.tool ~/.claude/sessions/2024-01-15/session-abc123.json /dev/null echo JSON OK如果这条命令抛Expecting property name enclosed in double quotes、Expecting , delimiter、Unterminated string之类的错误那Session file corrupted就坐实了——文件确实坏了跟模型服务没关系。如果它安静地打印JSON OK说明文件本身能解析问题更可能在版本兼容或者索引逻辑上。第三步用--resume看列表claude --resume正常情况下会列出一批可选会话包含时间、ID、摘要之类的信息。注意观察两点最近那个失败的会话是否出现在列表里列表里的时间戳是否和你记忆中的一致。如果--resume能列出会话但选进去后上下文是空的那就是文件能解析但内容被截断属于“半坏”状态。第四步养成用文件兜底的习惯。别把所有上下文都押在会话历史上。在会话里让 Claude Code 输出一份摘要或者用/recap生成当前进度概览然后把它写进项目里的docs/目录mkdir -p docs # 在会话中执行 /recap把输出整理后写入 # docs/session-recap-2024-01-15.md下次开新会话时直接引用这个文件把docs/session-recap-2024-01-15.md的内容贴进去或者让 Claude Code 读取它。这样即使~/.claude/sessions/被清空你的关键决策、待办、接口约定依然在版本控制里恢复成本从“重讲一遍”降到“读一个文件”。这一步和 TaoToken 无关但它是这套排障流程里性价比最高的一环。五、本篇常见错排查从 session-.json 到磁盘权限逐条过下面按“出现频率从高到低”的顺序把你可能踩的坑列一遍。每条都给一个可执行的判断动作不要凭感觉猜。第一会话文件被清理。表现是--continue报No previous session found--resume列表为空或只剩很早的记录。判断方法就是ls -la ~/.claude/sessions/。如果是被清理工具或脚本删的检查一下有没有配置定时任务或 IDE 的清理规则。这种情况没有修复余地只能开新会话用docs/里的摘要补上下文。第二JSON 被截断或损坏。表现是Session file corrupted。用python3 -m json.tool 文件验证。如果错误位置在文件末尾附近通常是写入中断导致的。极短的文件、尾部缺}或]的可以尝试手动补全后再校验一次但绝大多数情况下硬补 JSON 比重开一轮会话更费时间。确认无法修复后删掉坏文件再用claude --resume挑一个更早的、能加载的会话。第三HOME 目录或路径不对。表现是明明有会话文件--continue却说找不到。先echo $HOME确认当前用户目录再对比你ls的目录是不是同一个。有些环境用软链接把~/.claude指到别的盘Claude Code 解析路径时可能落在真实路径上。用readlink -f ~/.claude/sessions看一下最终指向。第四权限和属主问题。表现是文件在JSON 也合法但加载时报读取失败。用ls -l看属主如果文件属于 root 或另一个用户改成当前用户sudo chown -R $(whoami) ~/.claude/sessions/ chmod -R urw ~/.claude/sessions/第五磁盘空间不足。表现是会话能开但退出后文件没落盘下次--continue找不到。用df -h ~看剩余空间写入失败时 Claude Code 不一定会在终端里明确告诉你。腾出空间后重新开一个会话验证一次。第六版本混用导致格式不兼容。表现是旧会话文件能解析 JSON但新版读进去报错或者恢复后上下文残缺。检查你是不是同时存在全局安装和npx临时调用两个版本which -a claude claude --version npm ls -g --depth0 | grep claude统一到一个版本再试恢复。如果老会话确实无法被新版本解析别再折腾格式转换改用docs/摘要续接。第七Docker 场景下会话丢失。容器退出后~/.claude/sessions/随容器一起没了。判断方式是docker run里有没有挂 volume。持久化写法类似docker run -v claude-sessions:/root/.claude/sessions ...第八多终端窗口同时使用。每个终端是独立会话--continue恢复的是“最近退出的那个”未必是你想要的那个。想确认的话用--resume看清列表再选别盲敲--continue。第九恢复后上下文不完整。用/context看当前上下文占用与内容发现明显缺失时用/compact重新压缩整理如果连内容都不对直接放弃这个会话从docs/里的摘要重建。第十把服务问题和文件问题混在一起。401、403、连接超时属于请求链路去查ANTHROPIC_BASE_URL和 KeyNo previous session found、Session file corrupted、Session not found属于本地文件去查 sessions 目录。两类问题的日志位置和修复动作完全不同分开定位能省下一大半时间。六、继续排查 --continue 恢复失败把 Key 和会话文件两条线都收住回到最初的报错。claude --continue报Session not found本质是“最近会话文件不可用”--resume报Session ID does not exist本质是“指定 ID 的文件不在或读不了”Session file corrupted则直接告诉你 JSON 结构已经坏了。这三条都不需要换模型服务但前提是你得先确认请求这一层没有把进程搞崩否则你会一直在错误的方向上删文件。所以收尾动作按这个顺序做一遍先在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 生成并保存 Key再把~/.claude/settings.json里的ANTHROPIC_BASE_URL写成https://taotoken.net/api不带/v1不带 UTMANTHROPIC_AUTH_TOKEN填YOUR_API_KEY然后用python3 -m json.tool校验一次settings.json开新会话发一条最短请求确认返回正常。Key 的生成与查看入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 参数细节以 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 为准。请求这条线通了之后再回到~/.claude/sessions/YYYY-MM-DD/session-id.json用python3 -m json.tool判完整性用claude --resume判可选项用chown和df -h判权限与空间用claude --version判版本是否混用。能救的会话救回来救不回来的删干净别让一个坏文件反复污染索引。最后把习惯改掉重要讨论不要只活在会话历史里。每告一段落就让 Claude Code 用/recap出摘要落到docs/下按日期命名任务清单写进TODO.md接口约定和架构决策写进docs/architecture-decisions.md。这样即便下一次--continue仍然失败你损失的也只是一个能重建的上下文而不是一整天的工作进度。