[Bug] Claude Code heterogeneous agent fails with “spawn EINVAL” on Windows (npm install)

这个报错通常出现在 Windows 桌面版 LobeHub 中调用 claude-code 异构代理时,SDK 路径直接把 npm 生成的 claude.cmd 交给 child_process.spawn ,Node.js 在 Windows 上无法直接 spawn .cmd ,从而抛出 spaw

快速结论:这个报错通常出现在 Windows 桌面版 LobeHub 中调用 claude-code 异构代理时,SDK 路径直接把 npm 生成的 claude.cmd 交给 child_process.spawn,Node.js 在 Windows 上无法直接 spawn .cmd,从而抛出 spawn EINVAL。优先排查的是调用 claude-code 时实际传入的 commandPath 是否为 .cmd shim,以及是否走了 sendPromptWithClaudeSdk 这条路径。

适用环境:OS:Windows 11 (x64);LobeHub:2.2.14;Claude Code:2.1.235(npm 全局安装);Node.js:v24.14.1。

最快修复方案:暂无确认的一步修复方案。Issue 中给出的修复方向是:在 Windows 上把 commandPath 交给 Claude Agent SDK 之前,先复用 CLI 路径已有的 shim 解包逻辑(类似 resolveCliSpawnPlan),把 claude.cmd 解析为实际的 node.execlaude.exe,而不是直接把 .cmd 传给 SDK。该方案属于代码修复方向,尚未在 Issue 中标记为已验证。

注意事项:代码库刻意保留 PATH 顺序,不优先选择 .exe,以规避此前 #17376 涉及的 PATH 顺序问题,因此“优先使用 claude.exe”的做法可能与既有设计冲突。另外,通过 lh CLI 的 spawnLhHeteroExec 路径本身是正常的,问题只出在 SDK 直连 spawn 这条路径上。

问题场景

用户在 Windows 桌面版 LobeHub(LobeHub 2.2.14)中配置并调用 claude-code 异构代理(heterogeneous agent),触发 sendPromptWithClaudeSdk 流程时失败,返回 “SDK error”,且没有任何结果返回。该问题与通过 lh CLI 调用的路径形成对比:spawnLhHeteroExec 路径可以正常工作,只有直接走 Claude Agent SDK 的路径会失败。

复现步骤(来自 Issue):在 Windows 上执行 npm install -g @anthropic-ai/claude-code,在 LobeHub 中添加一个 claude-code heterogeneous agent,然后调用该 agent,即可触发 spawn EINVAL

报错原文

Starting Claude Code SDK session: {
  commandPath: 'C:\Users\<user>\AppData\Roaming\npm\claude.cmd'
}
[error] Claude SDK session error: Error: spawn EINVAL
    at ChildProcess.spawn (node:internal/child_process)
    at WT.spawnLocalProcess (.../sdk-MJfKLhQi.js)

原因分析

最可能的原因:HeterogeneousAgentCtr 通过 sendPromptWithClaudeSdk 直接把 claude.cmd(npm 生成的批处理 shim)作为 commandPath 传给 @anthropic-ai/claude-agent-sdkpathToClaudeCodeExecutable,SDK 内部对该路径直接调用 child_process.spawn。自 Node 18.20.2 / 20.12.2 针对 CVE-2024-27980 的修复之后,Node.js 在 Windows 上不能直接 spawn .cmd 文件,必须使用 shell: truecmd.exe /c,否则抛出 EINVAL

对比之下,lh hetero exec 路径之所以正常,是因为它使用了 resolveCliSpawnPlan:在 Windows 上读取 .cmd shim 的内容,解析出其中的 node.exe 与脚本路径,然后直接 spawn node.exe <script>,完全不经过 cmd.exe,也不把 .cmd 传给 spawn。SDK 路径缺少这层 shim 解包,因此失败。

值得注意的是,检测阶段本身是通过 resolveCliSpawnPlan 验证可运行的,但在 Windows 上最终确认的 commandPath 仍是来自 whereclaude.cmd,因为代码把 .cmd.exe 都列入 WINDOWS_RUNNABLE_EXTS,并且刻意保留 PATH 顺序,不优先选择 .exe(以避免较早的 npm claude.cmd 被另一个工具自带的较晚 claude.exe 抢占,参见 #17376)。虽然 npm 包内实际还附带了原生二进制 node_modules/@anthropic-ai/claude-code/bin/claude.exe,但 SDK 的查找逻辑仍会选择 claude.cmd

环境排查

  • 操作系统确认:是否为 Windows 11 (x64) 或其它 Windows 版本,Windows 是此问题的触发前提。
  • Node.js 版本确认:Issue 中为 v24.14.1;需注意 Node 18.20.2 / 20.12.2 之后的版本均包含 CVE-2024-27980 修复,行为一致。
  • LobeHub 版本确认:Issue 中为 2.2.14。
  • Claude Code 安装方式与版本确认:通过 npm install -g @anthropic-ai/claude-code 全局安装,版本 2.1.235,确认 claude.cmd 位于 %AppData%\Roaming\npm\ 下。
  • 确认调用路径:问题发生在 sendPromptWithClaudeSdk(SDK 直连 spawn),而 spawnLhHeteroExec(lh CLI)路径可正常工作,可用于对照定位。
  • 确认同目录下是否存在 @anthropic-ai/claude-code/bin/claude.exe 原生二进制。

解决步骤

  1. 先在 Windows 上确认复现路径:通过 LobeHub 桌面端调用 claude-code heterogeneous agent,复现 spawn EINVAL;再用 lh hetero exec 调用同一代理,确认 CLI 路径正常,从而确认问题位于 SDK 路径。
  2. 确认日志中的 commandPath 是否以 .cmd 结尾(例如 C:\Users\<user>\AppData\Roaming\npm\claude.cmd),排除其它路径或权限问题。
  3. 在代码层面,于 Windows 上构造 ClaudeAgentSdkSession 之前,先对 commandPath 执行与 CLI spawn 路径一致的 shim 解包,例如调用 resolveCliSpawnPlan(commandPath, []),并取 plan.command 作为传给 SDK 的路径(即 node.exe 或真实 .exe,而非 .cmd shim)。
  4. 避免采用“优先选择 .exe”的替代方案:Issue 指出该方式会引入 PATH 顺序问题,与既有 #17376 的设计冲突,因此 shim 解包方案更符合现有 Windows 处理逻辑。
  5. 如果上述代码修复暂不可用,可优先尝试的可替代思路是:确保 claude-code 的调用走 lh hetero exec 路径,该路径在 Issue 中已被确认可正常工作;但需注意这是作者侧的行为差异,不代表官方推荐配置。

验证方法

修复后,在 Windows 桌面版 LobeHub 中重新调用 claude-code heterogeneous agent,观察日志中传给 Claude Agent SDK 的 commandPath 不再是 .cmd shim,而是解包后的 node.exe 或原生 claude.exe 路径;此前出现的 [error] Claude SDK session error: Error: spawn EINVAL 不再出现,且代理能正常返回结果。同时可对比 lh hetero exec 路径,确认两条路径行为一致。

参考来源

lobehub/lobe-chat #18493

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23670

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注