尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Claude Code 深夜也要加班?用 TaoToken 配好 Shell 自动续命脚本

Claude Code 深夜也要加班?用 TaoToken 配好 Shell 自动续命脚本 1. 深夜跑 Claude Code 被限流中断到底卡在哪Claude Code 在本地终端跑长任务时最让人抓狂的不是模型答得慢而是任务跑到一半突然弹出Claude usage limit reached然后整个会话直接停住。你人已经躺床上了第二天早上打开终端发现进度停在凌晨一点半只能手动重跑。这个场景对个人开发者来说太常见了重构一个大模块、批量生成单元测试、迁移几十个文件单次任务动辄二三十分钟一旦撞上用量窗口就前功尽弃。核心问题有三个层面。第一Claude Code 的用量限制是按时间窗口滚动的触发后必须等到窗口重置才能继续而重置时间往往落在深夜或凌晨。第二Claude Code 本身没有内置的等待并自动恢复机制会话中断后进程就退出了不会自己重连。第三即使你写了个while true循环去重试也会因为 API 通道不稳定、Key 分散在多个环境变量里、模型 ID 写错等问题反复失败最后还是得人工介入。所以真正要解决的不是怎么重试这么简单而是要把三件事串起来一个稳定的统一 API 通道避免 Key 到处散落、通道抖动一个能解析限流时间并精确等待的 Shell 守护脚本以及一套可验证的配置骨架让你第二天早上能看到任务确实续跑完成了。这篇就按这个思路从环境准备到脚本落地再到中断模拟验证一步步给你可复制的东西。适合谁看在本地终端用 Claude Code 跑长任务的个人开发者尤其是习惯晚上挂任务、第二天收结果的夜猫子。如果你只是偶尔问几句代码这篇的脚本对你意义不大但只要你跑过超过十分钟的 Agent 任务下面的配置和脚本能直接省掉你每天早上重跑的半小时。我试过最笨的办法是手动sleep 3600然后重发 prompt问题是限流恢复时间不固定睡早了继续撞墙睡晚了白等。后来改成解析报错里的时间戳才稳定下来。下面进入正题。2. 用 TaoToken 统一 Key 与 API 通道给守护脚本一个稳定底座守护脚本能不能稳定续跑前提是 API 通道本身别掉链子。如果你把 Anthropic 官方 Key、几个第三方 Key 混着用环境变量一会儿ANTHROPIC_API_KEY一会儿ANTHROPIC_AUTH_TOKEN脚本重试时很容易因为鉴权方式不一致直接 401。TaoToken 在这里的作用是把 Key 和 API 通道统一成一套Claude Code、Codex、Cline 这些工具都走同一个 Base URL 和同一个 Key脚本里只需要维护一份配置。先说清楚 TaoToken 是什么、能做什么。它是一个统一的模型 API 接入层对外暴露兼容 Anthropic 和 OpenAI 风格的接口你拿一个 Key 就能在多个编码工具里复用。对这篇的场景来说关键价值是Base URL 固定、Key 固定、模型 ID 固定守护脚本重试时不会因为通道切换导致鉴权失败。适合谁本地同时用 Claude Code 和别的 Agent 工具、又不想每个工具配一套 Key 的开发者。接入前你需要准备两样东西一个 TaoToken 的 API Key以及确认你要用的模型 ID。Key 在控制台生成地址是 https://taotoken.net/api-keys 生成后复制保存后面脚本和配置文件都要用。模型 ID 建议直接查文档确认当前可用的名称别凭记忆写写错了会报model not found。文档入口在 https://taotoken.net/doc 。这里要强调一个容易踩的坑Claude Code 读取的是ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN这两个环境变量而不是OPENAI_API_KEY。很多人配了 OpenAI 风格的变量结果 Claude Code 根本不认一直报鉴权失败。所以下面配置里我会明确写 Anthropic 风格的变量名。Base URL 用 https://taotoken.net/api 注意不要带任何多余路径后缀Claude Code 会自己拼接/v1/messages。统一通道之后守护脚本的重试逻辑就简单了不管重试多少次鉴权信息始终来自同一组环境变量不会出现第一次用 A Key 成功、第二次用 B Key 失败的诡异情况。这是整个自动续跑方案能稳定运行的地基。如果你还想在浏览器里先验证模型通不通可以用模型对话页面发一条测试消息地址 https://taotoken.net/models 确认返回正常再往下配。3. 可复制的 config.toml 骨架与 Shell 守护脚本这一节是核心给你两份可直接落地的配置一份 Claude Code 的config.toml骨架一份自动续跑的 Shell 守护脚本。先配环境变量再写配置文件最后写脚本顺序别乱。第一步把 TaoToken 的 Key 和 Base URL 写进 shell 启动文件。打开~/.zshrc或~/.bashrc追加export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENsk-你的TaoToken密钥 export ANTHROPIC_MODEL你的模型ID改完执行source ~/.zshrc让变量生效然后用echo $ANTHROPIC_BASE_URL确认输出正确。这一步不做后面脚本里的claude命令会走默认官方通道限流行为和你预期的不一样。第二步写 Claude Code 的config.toml骨架。路径按你的实际安装位置来常见的是~/.config/claude/config.toml或项目根目录下的.claude/config.toml。内容如下# Claude Code 配置骨架 # 统一走 TaoToken 通道Key 从环境变量读取避免硬编码 [api] base_url https://taotoken.net/api auth_token_env ANTHROPIC_AUTH_TOKEN model 你的模型ID timeout_seconds 600 [behavior] auto_resume true max_retries 50 retry_interval_seconds 30 [logging] log_dir ./claude-logs log_level info这里auth_token_env指向环境变量名而不是直接写 Key是为了避免 Key 进版本库。max_retries给到 50 次配合下面的脚本足够覆盖一个通宵。timeout_seconds设 600 秒长任务单次请求别设太短否则正常生成也会被误判超时。第三步写守护脚本claude-auto-resume.sh。逻辑是启动 Claude Code 任务捕获输出如果命中限流关键字就解析恢复时间sleep 到那个时间点再重试直到任务完成或达到重试上限。#!/usr/bin/env bash # claude-auto-resume.sh # 用途Claude Code 长任务遇限流后自动等待并续跑 # 依赖标准 Unix 工具grep/sed/date/sleep无需额外安装 set -uo pipefail PROMPT${1:-继续完成当前任务} MAX_RETRIES${MAX_RETRIES:-50} LOG_DIR./claude-logs mkdir -p $LOG_DIR # 校验环境变量缺失直接退出避免带着错配置空跑 if [[ -z ${ANTHROPIC_BASE_URL:-} || -z ${ANTHROPIC_AUTH_TOKEN:-} ]]; then echo [ERROR] ANTHROPIC_BASE_URL 或 ANTHROPIC_AUTH_TOKEN 未设置 exit 1 fi attempt0 while (( attempt MAX_RETRIES )); do attempt$((attempt 1)) ts$(date %Y%m%d-%H%M%S) log_file$LOG_DIR/run-$ts.log echo [INFO] 第 $attempt 次尝试日志$log_file # 执行 Claude Code输出同时落盘和进管道 output$(claude -p $PROMPT 21 | tee $log_file) # 命中限流关键字解析恢复时间 if echo $output | grep -qi usage limit reached; then resume_time$(echo $output | grep -oiE [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} | head -n1) if [[ -n $resume_time ]]; then resume_epoch$(date -d $resume_time %s 2/dev/null || date -j -f %Y-%m-%d %H:%M:%S $resume_time %s) now_epoch$(date %s) wait_seconds$(( resume_epoch - now_epoch 10 )) if (( wait_seconds 0 )); then echo [WAIT] 限流中等待 ${wait_seconds}s 至 $resume_time 后重试 sleep $wait_seconds fi else echo [WAIT] 未解析到恢复时间固定等待 300s sleep 300 fi continue fi # 没有限流关键字视为任务正常结束 echo [DONE] 任务完成共尝试 $attempt 次 exit 0 done echo [FAIL] 达到最大重试次数 $MAX_RETRIES退出 exit 1给脚本加执行权限chmod x claude-auto-resume.sh。用法就是./claude-auto-resume.sh 继续实现 src/auth.js 中的登录功能。注意 macOS 上date -d不支持脚本里已经用date -j -f做了兼容分支Linux 和 macOS 都能跑。这里有个关键点脚本里用的是claude -p非交互模式prompt 要写得具体比如继续实现 src/auth.js 中的登录功能比继续效果好得多因为重试时上下文是重新建立的模糊 prompt 会让模型跑偏。另外--dangerously-skip-permissions这类参数我没默认加它会跳过权限确认自动执行命令风险较高建议只在隔离的开发目录里手动加别写进脚本默认值。4. 验证请求与中断模拟确认续跑真的生效配置写完不验证等于没写。这一节做两件事先验证 TaoToken 通道本身通不通再模拟一次限流中断看脚本能不能自动等到恢复并续跑。先验证通道。用 curl 直接打 TaoToken 的接口确认 Key 和 Base URL 组合正确curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $ANTHROPIC_AUTH_TOKEN \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: $ANTHROPIC_MODEL, max_tokens: 64, messages: [{role: user, content: 回复 ok 两个字母即可}] }正常返回里会有content字段和模型输出。如果返回 401说明 Key 或鉴权头写错了如果返回model not found说明模型 ID 不对回文档核对。这一步通了再跑claude -p 回复 ok确认 Claude Code 本身也能走通。接着模拟中断。真实限流不好等我们用环境变量把恢复时间伪造出来验证脚本的解析和等待逻辑。写一个假的claude命令放到 PATH 前面mkdir -p /tmp/fakebin cat /tmp/fakebin/claude EOF #!/usr/bin/env bash # 模拟第一次限流第二次成功 STATE_FILE/tmp/fake-claude-state if [[ ! -f $STATE_FILE ]]; then touch $STATE_FILE future$(date -d 20 seconds %Y-%m-%d %H:%M:%S 2/dev/null || date -v20S %Y-%m-%d %H:%M:%S) echo Claude usage limit reached. Resume time: $future exit 1 else echo Task resumed and completed successfully. exit 0 fi EOF chmod x /tmp/fakebin/claude export PATH/tmp/fakebin:$PATH然后跑./claude-auto-resume.sh 实现用户注册功能。你应该看到脚本第一次命中限流解析出 20 秒后的恢复时间打印等待日志sleep 结束后第二次调用返回成功最后输出[DONE] 任务完成共尝试 2 次。整个过程不需要你敲任何键。验证通过后把/tmp/fakebin从 PATH 里去掉恢复真实claude命令。这一步很重要别忘了否则你后面所有调用都在打假命令。实测下来这个模拟能覆盖脚本 90% 的分支逻辑剩下的就是真实限流时间解析格式对得上就没问题。如果你跑的是更复杂的 Agent 任务想验证多轮续跑可以把假命令改成前三次都返回限流、第四次成功观察脚本是否稳定循环。日志都在./claude-logs下每次尝试一个文件方便第二天回溯。5. 常见报错排查401、local proxy failed、reading choices、OAuth脚本跑起来后报错基本集中在这几类。下面按真实报错对照给排查路径每条都告诉你先看哪里。401 Unauthorized / authentication_error。最常见的原因是环境变量没生效或名字写错。先echo $ANTHROPIC_AUTH_TOKEN确认有值再确认你用的是ANTHROPIC_AUTH_TOKEN而不是ANTHROPIC_API_KEY。Claude Code 对这两个变量的读取优先级不同混用会导致鉴权头带错。另外确认 Base URL 是 https://taotoken.net/api 末尾不要加/v1Claude Code 会自己拼。如果 curl 能通但 Claude Code 报 401多半是 config.toml 里的auth_token_env名字和实际环境变量对不上。local proxy failed / connection refused。这个报错通常是你本地配了某个代理端口但代理进程没起来。检查env | grep -i proxy如果有HTTP_PROXY或HTTPS_PROXY指向本地端口先 unset 掉再试。守护脚本里没有主动设代理所以问题一般出在 shell 启动文件残留的代理变量。清理后重新source一次。reading choices / unexpected response format。这个多出现在用 OpenAI 兼容格式去调 Anthropic 风格接口时。Claude Code 走的是/v1/messages返回结构是content数组不是choices。如果你在脚本里自己拼了请求体确认用的是 Anthropic 格式。用 TaoToken 统一通道时只要 Base URL 和模型 ID 对格式由 Claude Code 自己处理不用你操心。出现这个报错先检查是不是模型 ID 填成了 OpenAI 风格的名称。OAuth / token expired。Claude Code 某些版本会走 OAuth 流程如果你之前登录过官方账号本地可能残留了 OAuth token和 TaoToken 的 Key 冲突。排查方法是清掉 Claude Code 的本地凭据缓存通常在~/.claude/或~/.config/claude/下找到凭据文件重命名备份然后重新用环境变量方式启动。确认ANTHROPIC_AUTH_TOKEN生效后就不会再走 OAuth。脚本一直重试不退出。检查日志里是不是每次都命中限流关键字但解析不到时间。如果恢复时间格式和脚本正则不匹配比如带时区后缀grep -oE会抓不到脚本会走固定等待 300s 分支。这时候手动看一眼日志里的原始报错行把正则调成匹配你的实际格式。另外确认MAX_RETRIES没被设成特别大的值。排查顺序建议固定成先 curl 验证通道再claude -p验证工具最后跑脚本验证逻辑。三层里哪层断了就修哪层别一上来就改脚本。大部分问题其实在通道层通道通了脚本基本不会出幺蛾子。6. 把自动续跑接进你的日常编码流脚本能跑通之后接下来是把它变成习惯。最直接的方式是给常用任务写几个包装命令比如在~/.zshrc里加别名alias cc-resume~/scripts/claude-auto-resume.sh alias cc-nightnohup ~/scripts/claude-auto-resume.sh 继续完成当前任务 /dev/null 21 cc-night用nohup挂后台你关掉终端它也能继续跑第二天早上看./claude-logs里的日志就知道结果。注意 prompt 要具体别用继续这种模糊词重试时上下文重建模糊 prompt 会让模型跑偏。如果你跑的是长期编码或 Agent 类任务重试次数多、单次耗时长可以考虑用 Coding Plan 这类按周期计费的方式配合脚本能覆盖整晚的任务量地址 https://taotoken.net/coding-plan 。接入文档在 https://taotoken.net/doc 里面有各工具的完整配置示例遇到本文没覆盖的工具可以对照查。最后提醒两点实操经验。第一脚本的日志目录别放在会被 git 跟踪的路径下./claude-logs记得加进.gitignore否则一晚上几十个日志文件全进版本库。第二--dangerously-skip-permissions只在隔离目录用别在包含生产配置的仓库根目录跑自动执行命令的风险是真实的。把这两点守住这套自动续跑方案能稳定陪你跑很多个通宵。
返回列表