#4092·claude-mem

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 响应(参见 y4worker-service.cjse===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 重试包装器), fetchChatCompletionaR(外部重试/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