BUG OpenRouter 提供程序: 同一 Bun 成功获取时,工作程序获取失败
作者: intellectualpeaceful创建于 2026年9月15日更新于 2026年9月16日
环境
- Claude-mem: 13.24.23
- Bun: 1.4.2
- 操作系统: macOS
- 提供商:
openrouter(自定义的 OpenAI 兼容端点,不是 openrouter.ai) - 基础 URL:
http://192.168.178.166:11434/v1(远程 Ollama 实例) - 模型:
llama3.1:8b
问题
工作进程的 OpenRouter 提供程序在尝试连接到本地托管的 OpenAI 兼容端点 (Ollama) 时总是立即且一致地失败,出现以下错误信息:
OpenRouter 网络错误: 是否在 URL 或端口中有打错?
这是 Bun 在 fetch() 拒绝时提示的 t.cause.message,没有收到任何 HTTP 响应(参见 y4 在 worker-service.cjs 中 e===void 0 分支)。失败发生在 150-400 毫秒内,远远快于配置的 CLAUDE_MEM_LLM_TIMEOUT_MS=300000。它在整个 npx Claude-mem restart(新 PID,相同的配置,相同的立即失败)中保持相同。
与完全相同的端点相比,什么都能正常工作
| 测试 | 结果 |
|---|---|
通过 curl 发出 GET /v1/models |
200 |
通过 curl 发出 POST /v1/chat/completions |
200 |
独立的 Bun 脚本,纯粹的 fetch() |
200 |
以分离后台进程的方式运行 Bun 脚本(使用 spawn(..., {detached:true, stdio:'ignore'}),将 PPID 重新定位为 1,与工作进程在 setsid 不可用时的实际启动模式相匹配) |
200 |
捆绑的请求路径的字面复制 — 逐字复制 tbe(URL 构建器), rbe(头), g$t(体), nbe(400 重试包装器), fetchChatCompletion 和 aR(外部重试/AbortController 包装器),并使用 ~/.Claude-mem/settings.json 中的实际值运行独立的工作进程外部的脚本 |
200,有效的 JSON 响应,在调用时 AbortSignal aborted=false |
只有实际运行的工作进程才会失败。上述复制在与工作进程同时运行时,针对相同的端点,在工作进程在日志中失败的同时运行。
什么被排除为原因
- DNS/ IPv4 与 IPv6 解析差异
- Bun 版本不匹配(已验证工作进程和测试中的
Bun.version相同) - 代理/环境变量(
HTTP_PROXY,HTTPS_PROXY,NO_PROXY,NODE_TLS_REJECT_UNAUTHORIZED— 都未设置,并且 grep 确认这些变量在 OpenRouter 代码路径上都没有被读取) - 全局 fetch/http/https 覆盖,自定义分发器/代理(
undici,setGlobalDispatcher,ProxyAgent,new Agent(— 在提供程序的实际代码路径中没有匹配) - 请求负载/头/大小(使用实际头和 122KB 的实际负载,独立运行时成功)
- 并发性(6 个同时独立请求,都成功)
- AbortSignal 重复使用/已被中止状态(在实际调用时确认
aborted=false) - 超时(
CLAUDE_MEM_LLM_TIMEOUT_MS=300000; 实际失败发生在 150-400 毫秒内) - 工作进程的旧状态(新的 PID,重新启动,失败与之前相同)
相关代码路径(worker-service.cjs, 13.24.23)
- URL 构建器:
tbe(t) - 头:
rbe(t,e) - 体:
g$t(t) - fetch 调用点:
fetchChatCompletion(...),使用全局fetch - 重试包装器: …
内容来源: thedotmack/claude-mem