ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Claude Code 报错 Unable to connect to API (ECONNRESET):从 VSCode 到 Bun 的排查与修复

Claude Code 报错 Unable to connect to API (ECONNRESET):从 VSCode 到 Bun 的排查与修复 1. Claude Code 在 VSCode 里报 ECONNRESET 到底卡在哪如果你正在用 Claude Code 写代码某天打开 VSCode 突然看到终端里刷出Unable to connect to API (ECONNRESET) · Retrying in 14s · attempt 10/10然后所有对话都发不出去那这篇就是写给你的。ECONNRESET 的意思是 TCP 连接被对端直接重置了——不是超时不是 DNS 解析失败而是连接建立之后被 RST 掉。放到 Claude Code 的场景里它通常发生在流式请求阶段请求头发出去了服务端也开始回数据了但中途连接被掐断客户端只能重试重试十次全挂会话就废了。这个报错最容易骗人的地方在于你curl一下 API 地址是通的浏览器能打开官网甚至换个终端跑claude -p hello偶尔还能成功。于是你会怀疑是网络问题、是 Key 过期、是余额不足。但实测下来Claude Code 从某个版本开始把运行时从纯 JS 换成了 Bun 编译的原生二进制TLS 指纹和 HTTP 协议栈行为都变了某些 CDN 边缘节点会对这种流量做间歇性 RST。也就是说服务端健康、本地网络健康但两端就是握不上手。这篇面向的是在 VSCode 里通过 Bun 运行时跑 Claude Code、并且被 ECONNRESET 反复打断的开发者。我会把排查路径拆成可复制的步骤先确认是不是运行时/版本问题再配好统一的 API 通道和环境变量最后用 curl 和日志把连通性验证到位。全程命令可以直接抄配置骨架也能直接改。2. 先把 API 通道统一到 TaoToken在动 Claude Code 的配置之前我建议先把 API 入口统一掉。原因很简单ECONNRESET 这类问题一旦牵扯到多个 base_url、多个 Key、多个环境变量你根本分不清是哪个环节断的。TaoToken 提供统一的 Key 和 API 通道Claude Code、Coding Plan、模型对话都走同一个入口排查时变量就少了一大半。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。你需要在控制台里创建一个 API Key然后把它写进 Claude Code 的配置。注意 API 地址不要加 UTM 参数只有官网链接才带。具体要拿的东西有两个一个是 API Key在控制台的 API Keys 页面生成另一个是确认你的接入方式Claude Code 走的是 Anthropic 兼容协议所以 base_url 要指向 TaoToken 的 API 入口。如果你后面还要跑长期编码任务或者 Agent可以顺带看一下 Coding Plan它和按量调用是两条线配置方式不同。这一步的核心目的不是注册而是把后面所有排查都收敛到一个通道上。你只有一个 base_url、一个 Key出问题时就能确定是客户端配置还是链路本身。3. 可复制的 settings.json 与 config.toml 骨架Claude Code 的配置分两层一层是 VSCode 扩展读的settings.json一层是 CLI 自己读的config.toml或者环境变量。很多人只改了其中一层结果 VSCode 里跑的还是旧配置。下面两个骨架你可以直接复制改。先看 VSCode 的settings.json路径一般在用户目录的.vscode或者工作区的.vscode/settings.json{ claude-code.environmentVariables: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoTokenKey, DISABLE_AUTOUPDATER: 1, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1 }, claude-code.autoUpdates: false, terminal.integrated.env.windows: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoTokenKey } }这里有几个点值得说清楚。DISABLE_AUTOUPDATER1是关键因为 Claude Code 的自动升级会在你不知情的时候把运行时换掉ECONNRESET 往往就是升级后才出现的。autoUpdates: false只挡 CLI 的更新检查挡不住 VSCode 扩展内嵌二进制的强制同步所以环境变量必须加上。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC是关掉遥测等非必要请求减少干扰。再看 CLI 侧的config.toml路径通常在~/.claude/config.tomlWindows 是%USERPROFILE%\.claude\config.toml[api] base_url https://taotoken.net/api api_key sk-你的TaoTokenKey timeout_ms 60000 max_retries 3 [network] stream true keep_alive true http2 false [updater] auto_update falsehttp2 false这一行是我踩过坑之后加的。Bun 运行时的 HTTP/2 实现在某些 CDN 节点上会触发连接重置强制走 HTTP/1.1 流式反而更稳。keep_alive true让连接复用减少反复握手被 RST 的概率。timeout_ms给到 60 秒避免大请求还没返回就被判超时。如果你用的是环境变量方式而不是 toml等价写法是export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的TaoTokenKey export DISABLE_AUTOUPDATER1 export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC1Windows PowerShell 里用[Environment]::SetEnvironmentVariable(DISABLE_AUTOUPDATER,1,User)设成用户级这样 VSCode 重启后依然生效。4. 用 curl 与日志验证连通性配置改完别急着开对话先用 curl 把链路验证一遍。这一步能区分是 API 通道不通还是是 Claude Code 客户端的问题。先测基础连通和鉴权curl -sS -o /dev/null -w http_code%{http_code} time_total%{time_total}\n \ -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoTokenKey \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-20250514,max_tokens:32,messages:[{role:user,content:ping}]}正常应该返回http_code200time_total在几百毫秒到一两秒之间。如果这里就 ECONNRESET那问题在链路或 Key不在 Claude Code。再测流式因为 ECONNRESET 主要发生在流式阶段curl -sS -N \ -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoTokenKey \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-20250514,max_tokens:128,stream:true,messages:[{role:user,content:数到十}]}-N关闭缓冲你能看到 SSE 事件一行行打出来。如果流式能稳定输出到结束说明通道没问题ECONNRESET 就是客户端运行时导致的。接着看 Claude Code 自己的日志。开 debug 模式跑一次claude --debug -p hello 21 | tee claude-debug.log在日志里搜ECONNRESET、Stream connection error、is_running_with_bun。如果看到is_running_with_buntrue并且堆栈来源是~BUN/root/src/entrypoints/cli.js那就确认了你跑的是 Bun 编译版问题出在运行时。这时候可以对比一下版本claude --version cat ~/.claude/.last-update-result.json如果版本号是最近自动升级上来的而升级时间和你开始报错的时间吻合基本可以锁定是版本/运行时变更引起的。解决办法是回滚到上一个稳定版本并用DISABLE_AUTOUPDATER1锁住npm install -g anthropic-ai/claude-code2.1.220 --ignore-scriptsWindows 上还需要单独装平台包并手动替换二进制npm install -g anthropic-ai/claude-code-win32-x642.1.220 --ignore-scripts然后把 win32-x64 包里的claude.exe复制到 wrapper 的bin/目录以及 VSCode 扩展的resources/native-binary/目录保证全局和扩展用的是同一个版本。替换前先结束残留进程Get-Process -Name claude | Stop-Process -Force验证阶段跑一次流式压力测试连续发 8 次请求看是否全部成功for i in $(seq 1 8); do curl -sS -o /dev/null -w run$i code%{http_code}\n \ -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoTokenKey \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-20250514,max_tokens:64,stream:true,messages:[{role:user,content:test}]} done8/8 全 200 且没有中途断开才算真正修好。5. 本篇常见错排查错误一只改了 settings.json没改 config.toml。VSCode 扩展和 CLI 读的是两套配置扩展启动时可能用内嵌二进制覆盖全局版本。表现是终端里claude正常但 VSCode 里还是 ECONNRESET。解决是把两处 base_url、Key、DISABLE_AUTOUPDATER 都对齐。错误二以为 autoUpdates:false 就够了。这个设置只影响 CLI 的更新检查VSCode 扩展内嵌的二进制不受它控制。必须用DISABLE_AUTOUPDATER1环境变量并且手动替换扩展目录里的claude.exe。错误三curl 通了就以为客户端没问题。curl 用的是系统 TLS 栈Claude Code 用的是 Bun 的 TLS 栈两者指纹不同。curl 通只能证明服务端和网络健康不能证明客户端运行时没问题。必须用claude --debug复现。错误四忽略 HTTP/2 的影响。Bun 的 HTTP/2 在部分 CDN 节点上会触发 RST。在 config.toml 里设http2 false强制 HTTP/1.1 流式能显著降低 ECONNRESET 概率。错误五Key 或 base_url 写错但报错一样。如果 base_url 少了/api或者 Key 带了多余空格也可能表现为连接异常。用第 4 节的 curl 命令先验证 Key 和地址再排查运行时。错误六没关遥测导致噪音。Anthropic 官方遥测端点在部分网络下不可达会产生额外连接错误干扰日志判断。设CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC1关掉。6. 把通道和 Key 固定下来排查到这一步你会发现 ECONNRESET 的根因往往不在 API 本身而在客户端运行时的版本漂移和配置分层。把 API 通道统一到 TaoToken 之后你只需要维护一个 base_url 和一个 Key出问题时用 curl 一测就能定位是链路还是客户端。如果你还在配 Key 和接入地址直接去 API Keys 页面生成接入文档里有 Anthropic 兼容协议的完整字段说明。想先验证模型能不能正常对话用模型对话页面发一条消息最快。如果你是要长期跑编码任务或者 AgentCoding Plan 的通道和按量调用是分开的配置前先确认自己走哪条线。最后留一个我实测有效的习惯每次 VSCode 更新或者 Claude Code 提示升级之后先跑一遍第 4 节的流式 curl再开对话。这样能在 ECONNRESET 出现之前就发现运行时被换掉了。
返回列表