1. Windows 下 Openclaw 启动报 Cannot find module 的真实场景
Openclaw 是一个跑在本地的智能体工具,能读取你机器上的文件、执行命令、串联任务,适合想把日常操作交给 Agent 处理的人。它通过 npm 全局安装,入口文件是openclaw.mjs,运行时依赖node_modules目录下的模块解析。问题就出在这里:Windows 下 npm 全局目录和 Openclaw 的模块查找路径一旦对不上,启动瞬间就会抛出Error: Cannot find module。
我遇到的那次报错长这样:
Error: Cannot find module 'C:\Users\41414\AppData\Roaming\npm\node_modules\openclaw\openclaw.mjs'顺着路径去看,openclaw文件夹还在,但里面openclaw.mjs、skills、docs、dist全没了,只剩一个空壳。奇怪的是本地记忆文件、历史任务都还在,说明数据没丢,丢的是程序本体。这类情况多半发生在版本更新中途关机、npm 缓存损坏、或者全局路径被改过之后。
这个报错的核心不是 Openclaw 坏了,而是 Node 在启动时按config.toml或命令行指定的路径去找模块,结果那个路径下没有对应文件。排查方向就两条:一是确认 npm 全局node_modules的真实位置,二是确认 Openclaw 配置里引用的路径和它一致。下面按这个思路一步步来,最后用 TaoToken 统一通道跑一次调用,验证模块解析确实恢复。
2. 前置准备:确认 npm 全局路径与 TaoToken 通道
在动手修之前,先把两个基础信息拿到手:npm 全局目录到底在哪,以及调用模型时走哪条通道。Windows 上 npm 的全局路径经常和默认认知不一致,尤其是装过 nvm、改过 prefix、或者用管理员权限装过包之后。
先查 npm 全局根目录:
npm root -g典型输出是C:\Users\你的用户名\AppData\Roaming\npm\node_modules。如果这个路径和你报错里的路径不一致,那问题基本就定位了——Openclaw 在找一个不存在的目录。
再查 npm 的 prefix 配置:
npm config get prefix正常应该输出C:\Users\你的用户名\AppData\Roaming\npm。如果输出的是别的盘符或路径,说明 prefix 被改过,全局包实际装到了别处,而 Openclaw 的启动脚本还指向老路径。
接着确认 Openclaw 是否真的装在全局目录下:
npm ls -g openclaw dir "C:\Users\你的用户名\AppData\Roaming\npm\node_modules\openclaw"如果dir列出的内容里没有openclaw.mjs,那就是文件缺失,需要重装。如果有,但报错仍指向别的路径,那就是配置路径写错了。
模型调用这块,我用 TaoToken 做统一入口,一个 Key 走通对话和编码场景,省得在多个平台之间来回切。它的 API 地址是https://taotoken.net/api,控制台在https://taotoken.net/console,Key 在https://taotoken.net/api-keys生成。先把 Key 拿到,后面验证请求要用。
注意:TaoToken 是合规的 API 聚合通道,不要把它和任何网络代理工具混为一谈,它只负责模型请求转发。
3. 可复制配置:config.toml 骨架与 npm 路径校验
Openclaw 的配置核心是config.toml,它决定了模块从哪加载、模型请求发往哪里。Windows 下这个文件通常在C:\Users\你的用户名\.openclaw\config.toml,也可能在项目目录下。先确认它在哪:
dir "C:\Users\你的用户名\.openclaw"找到后,用下面的骨架替换或补全。注意module_path必须和npm root -g的输出完全一致,这是修复Cannot find module的关键。
# Openclaw 配置骨架 - Windows [core] # 指向 npm 全局 node_modules,必须与 npm root -g 输出一致 module_path = "C:\\Users\\你的用户名\\AppData\\Roaming\\npm\\node_modules" # Openclaw 主入口,重装后确认此文件存在 entry = "openclaw/openclaw.mjs" # 日志级别,排查阶段用 debug log_level = "debug" [model] # TaoToken 统一 API 通道 base_url = "https://taotoken.net/api" api_key = "sk-你的TaoToken密钥" # 模型 ID 按控制台实际可用的填 model_id = "claude-sonnet-4-20250514" timeout = 60 [paths] # 记忆与任务数据目录,重装不影响这里 data_dir = "C:\\Users\\你的用户名\\.openclaw\\data" skills_dir = "C:\\Users\\你的用户名\\.openclaw\\skills"几个要点说明。module_path用双反斜杠转义,TOML 里单反斜杠会被当转义符。entry是相对module_path的路径,重装后要确认openclaw.mjs真的在openclaw子目录下。api_key从 TaoToken 控制台复制,别写错前缀。
配置写完后,校验 npm 路径是否和配置一致:
npm root -g type "C:\Users\你的用户名\.openclaw\config.toml" | findstr module_path两条命令的输出路径必须一模一样。如果不一样,改config.toml里的module_path,而不是去改 npm 配置,避免影响其他全局包。
如果确认文件缺失,执行重装。重装不会动data_dir和skills_dir,记忆和任务都保留:
npm uninstall -g openclaw npm cache clean --force npm install -g openclaw装完再dir一次确认openclaw.mjs回来了:
dir "C:\Users\你的用户名\AppData\Roaming\npm\node_modules\openclaw"看到openclaw.mjs、dist、skills都在,模块缺失问题就解决了一半。剩下的是验证模型通道能通。
4. 验证请求:用 TaoToken 跑通一次调用确认模块解析恢复
配置和重装都做完后,别急着开正式任务,先用一条最小请求验证。这一步同时确认两件事:Openclaw 能正常加载模块,以及 TaoToken 通道能返回结果。
先单独测 TaoToken 的 API 是否可达,用 curl 发一条对话请求:
curl https://taotoken.net/api/v1/chat/completions ^ -H "Content-Type: application/json" ^ -H "Authorization: Bearer sk-你的TaoToken密钥" ^ -d "{\"model\":\"claude-sonnet-4-20250514\",\"messages\":[{\"role\":\"user\",\"content\":\"ping\"}],\"max_tokens\":16}"Windows 的 cmd 用^换行,PowerShell 用反引号。返回里能看到choices数组和内容,说明 Key 和通道都正常。如果返回 401,是 Key 问题;如果返回连接错误,检查base_url有没有写错。
通道通了之后,启动 Openclaw 并让它加载一次模型:
openclaw --config "C:\Users\你的用户名\.openclaw\config.toml" --debug启动日志里重点看两行:一行是模块加载路径,应该显示module_path指向的目录;另一行是模型初始化,应该显示base_url为 TaoToken 地址。如果启动不再抛Cannot find module,并且日志里出现模型就绪,说明模块解析恢复正常。
再跑一个实际任务验证端到端:
openclaw run "读取当前目录下的 README.md 并总结三句话"如果 Openclaw 能读到文件、调用模型、返回总结,整条链路就通了。这一步同时验证了模块加载、配置解析、API 通道三件事,比单纯看启动日志更可靠。
实测下来,重装后第一次启动会稍慢,因为要重建缓存,第二次就正常了。如果第一次启动仍报模块缺失,回到第 3 节重新核对module_path。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
修Cannot find module的过程中,容易连带踩到几个别的报错。这里按真实报错对照排查,避免修好一个又卡在下一个。
401 Unauthorized:TaoToken 返回 401,说明 Key 无效或没带上。检查config.toml里api_key是否以sk-开头、有没有多余空格。重新到https://taotoken.net/api-keys生成一个再试。注意 Key 只在生成时显示一次,复制时别漏字符。
local proxy failed:这个报错通常和系统代理设置有关,不是 TaoToken 的问题。检查环境变量HTTP_PROXY、HTTPS_PROXY是否指向了一个不可用的地址。临时清掉再试:
set HTTP_PROXY= set HTTPS_PROXY=如果清了就正常,说明是本地代理配置干扰了请求,保持清空或改成正确的直连设置。
reading choices 报错:类似Cannot read properties of undefined (reading 'choices'),说明 API 返回结构里没有choices字段。常见原因是model_id填错,或者base_url少了/v1。TaoToken 的对话接口是https://taotoken.net/api/v1/chat/completions,base_url填https://taotoken.net/api,由客户端补/v1。如果客户端不补,就手动写全。
OAuth 相关报错:如果 Openclaw 某些功能走 OAuth 授权,报OAuth token expired或invalid_grant,需要重新授权。这类和模块缺失无关,但会混在启动日志里让人误判。先确认模块加载那行没报错,再单独处理 OAuth。
排查顺序建议固定:先看模块路径对不对,再看 Key 和 base_url,最后看模型 ID。三件套(Base URL + Key + Model ID)任何一个错都会导致请求失败,但报错信息不同。对照下面这张表快速定位:
| 报错关键词 | 大概率原因 | 处理 |
|---|---|---|
| Cannot find module | module_path 与 npm root -g 不一致 | 改 config.toml 或重装 |
| 401 | Key 无效或缺失 | 重新生成 Key |
| local proxy failed | 本地代理环境变量干扰 | 清空 HTTP_PROXY |
| reading choices | model_id 或 base_url 错误 | 核对三件套 |
| OAuth | 授权过期 | 重新授权 |
6. 后续调用与通道选择
模块解析修好、通道验证通过之后,日常使用就顺了。如果你只是偶尔跑一次对话验证,用模型对话页面最省事,打开https://taotoken.net/models直接选模型发消息,不用配本地环境。如果要把 Openclaw 长期挂在本地跑编码任务或 Agent 流程,建议用 Coding Plan,额度更稳,适合高频调用,入口在https://taotoken.net/coding-plan。
接入文档在https://taotoken.net/doc,里面有各客户端的配置示例,遇到 base_url 或 model_id 不确定时翻一下。Key 管理统一在https://taotoken.net/api-keys,建议给 Openclaw 单独建一个 Key,方便排查和轮换。
最后提醒一句:重装 Openclaw 前先确认data_dir和skills_dir的位置,只要这两个目录不动,记忆和任务就不会丢。我那次丢的只是程序文件,数据完好,重装后直接接着用。把config.toml里的module_path和npm root -g对齐,这个Cannot find module基本不会再出现。