1. 为什么 Windows 用户跑 OpenClaw 总卡在 exec 和 tool 调用
如果你在 Windows 上直接装 OpenClaw,大概率会遇到两个让人抓狂的问题:一是exec执行任务时提示找不到路径或者权限被拒,二是tool调用直接返回失败,日志里一堆看不懂的报错。我一开始也以为是模型不行,换了好几个模型才发现,根子其实在运行环境上。
OpenClaw 这类 Agent 框架对文件系统路径、进程权限、网络回环地址的要求比较严格,而 Windows 原生的路径分隔符和权限模型跟 Linux 差异很大。WSL2 的好处就在这里:它给你一个几乎完整的 Linux 内核,同时又能直接访问 Windows 的显卡资源。把 Ollama 装在 Windows 侧吃 GPU,把 OpenClaw 装在 WSL2 里跑逻辑,两边通过localhost通信,这套组合实测下来是最稳的。
这篇内容适合谁:手上有一台带独显的 Windows 笔记本或台式机,想用本地模型跑 OpenClaw,并且希望exec能真正执行命令、tool能真正调用成功的同学。我会从 WSL2 安装到 D 盘开始,一路给到可复制的openclaw.json配置骨架,最后用一次 exec 任务和一次 tool 调用做实际验证。全程不需要任何特殊网络手段,Ollama 和 OpenClaw 都是本地跑。
核心检索词先摆出来:OpenClaw 本地部署、Ollama 本地模型、WSL2 环境、exec 执行任务、tool 调用失败排查。下面按顺序来。
2. 前置准备:WSL2 装到 D 盘 + Ollama 装在 Windows
2.1 WSL2 安装到 D 盘(避免 C 盘爆掉)
WSL2 默认会把虚拟磁盘放在 C 盘用户目录下,Ubuntu 加上模型缓存很容易吃掉几十 GB。用--location参数可以直接指定安装位置。以管理员身份打开 PowerShell,执行:
wsl --install -d Ubuntu --location D:\WSL\Ubuntu系统会自动下载 Ubuntu 镜像并把虚拟磁盘存到 D 盘指定目录。装完后去D:\WSL\Ubuntu下看一眼,如果存在ext4.vhdx文件,说明安装成功。这一步很关键,后面 OpenClaw 的工作目录和模型缓存都会落在这个盘上,C 盘空间能省下来。
2.2 .wslconfig 资源限制配置
WSL2 默认会吃掉大量内存,尤其是你还要在 Windows 侧跑 Ollama 占显存的时候。在 Windows 用户文件夹下(一般是C:\Users\你的用户名\)创建或编辑.wslconfig:
[wsl2] memory=4GB swap=2G processors=4 [experimental] networkingMode=mirrored dnsTunneling=true firewall=true autoProxy=true这里networkingMode=mirrored是重点。开启镜像网络后,WSL2 里的127.0.0.1和 Windows 侧的127.0.0.1是互通的,Ollama 监听在 Windows 的 11434 端口,WSL2 里直接用http://127.0.0.1:11434就能访问,不需要去查什么虚拟网卡 IP。很多人 exec 和 tool 调用失败,就是因为网络模式没开镜像,WSL2 里访问不到 Windows 的 Ollama 服务。
改完.wslconfig后,在 PowerShell 里执行wsl --shutdown再重新进入,配置才生效。
2.3 Ollama 装在 Windows 侧
Ollama 直接装在 Windows 下,这样能吃到 NVIDIA 显卡。我这边是 RTX 4050 Laptop 6G 显存,装的是 Ollama 0.18.2。装完后确认服务在跑:
ollama list然后拉一个带扩窗的模型。注意qwen2.5:latest-32k这种带后缀的是社区扩窗版本,上下文能到 128000,但显存占用也大。6G 显存建议先用 32k 版本试:
ollama pull qwen2.5:latest-32k拉完后测试 Ollama 的 OpenAI 兼容接口是否正常:
curl http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"qwen2.5:latest-32k","messages":[{"role":"user","content":"Hello!"}]}'如果返回一段 JSON 且里面有choices字段,说明 Ollama 侧没问题。这一步在 Windows PowerShell 里跑就行,不用进 WSL2。
3. OpenClaw 配置文件骨架:Ollama 对接参数怎么写
3.1 安装 OpenClaw 到 WSL2
进入 WSL2 的 Ubuntu,先确认 Node 环境。OpenClaw 的 skills 安装依赖 npm,所以 Node 版本别太低:
node -v npm -v然后按官方方式安装 OpenClaw。装完后跑一次openclaw doctor做环境自检,它会告诉你哪些依赖缺失。我这边用的是 v2026.03.18 版本,WSL2 分配了 4 核 4G 内存。
3.2 openclaw.json 的 models.providers 段
配置文件一般在~/.openclaw/openclaw.json。核心是把 Ollama 作为一个 provider 接进来,baseUrl指向http://127.0.0.1:11434/v1,api字段用openai-completions,这样 OpenClaw 会用 OpenAI 兼容协议去调 Ollama:
{ "models": { "providers": { "ollama": { "baseUrl": "http://127.0.0.1:11434/v1", "apiKey": "ollama", "api": "openai-completions", "models": [ { "id": "qwen2.5:latest-32k", "name": "Alibaba Qwen2.5:latest-32k (Ollama)", "reasoning": false, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 128000, "maxTokens": 8192 } ] } } } }contextWindow的值要和模型实际扩窗大小对齐。值越大,启动同一个模型占用的内存越多,6G 显存如果吃紧,可以调成 65536 甚至更小。maxTokens是单次生成上限,8192 够用。
3.3 agents.defaults 与 tools.profile
agents.defaults.model.primary指定默认模型,格式是provider/modelId:
{ "agents": { "defaults": { "model": { "primary": "ollama/qwen2.5:latest-32k", "fallbacks": [] }, "workspace": "/home/tj/.openclaw/workspace", "compaction": { "mode": "safeguard", "reserveTokensFloor": 128000 }, "maxConcurrent": 4 } }, "tools": { "profile": "full" } }tools.profile设成full才能让 exec 和 tool 调用全部放开。如果你只想给 coding 场景用,可以设成coding,再用alsoAllow额外放行搜索类工具。
关于上下文窗口压缩:agents.defaults.compaction.reserveTokensFloor的值要小于模型上下文窗口的 80%,越大越能支持多轮对话。128000 的窗口配 128000 的 reserve 其实偏激进,实际用下来如果对话轮次多,可以适当降到 100000 左右留点余量。
3.4 gateway 段与本地回环
gateway 负责 OpenClaw 的本地服务端口和鉴权:
{ "gateway": { "port": 18789, "mode": "local", "bind": "loopback", "controlUi": { "allowedOrigins": [ "http://localhost:18789", "http://127.0.0.1:18789" ], "allowInsecureAuth": true, "dangerouslyDisableDeviceAuth": true }, "auth": { "mode": "token", "token": "你的本地token" } } }bind设成loopback表示只监听本地,不对外暴露。dangerouslyDisableDeviceAuth在纯本地开发时可以开,省去设备认证的麻烦,但如果你这台机器有其他人用,建议关掉。
4. 验证请求:一次 exec 任务 + 一次 tool 调用
4.1 启动 gateway
配置写好后,在 WSL2 里启动:
openclaw gateway --port 18789看到监听日志后,浏览器打开http://127.0.0.1:18789/chat,进入聊天界面。
4.2 exec 任务验证
在聊天框里输入一个明确的 exec 指令,比如:
执行 ls -la /home/tj/.openclaw/workspace如果模型能正确调用 exec 工具并返回目录列表,说明 exec 链路通了。这里有个坑:如果模型找不着本机目录的准确位置,会反复问你路径,或者干脆执行失败。我实测qwen2.5:latest-32k在这一点上不太稳定,经常找不着目录,导致 exec 无法正常执行本机操作。根本原因是模型能力不够,换成carstenuhlig/omnicoder-9b:latest或gag0/qwen35-opus-distil:27b后问题解决。
4.3 tool 调用验证
tool 调用用一个联网搜索插件来验证。先安装:
openclaw plugins install @ollama/openclaw-web-search装完确认状态:
openclaw plugins list输出里如果有@ollama/openclaw-web-search且状态是loaded,就说明插件激活了。如果显示disabled,执行:
openclaw plugins enable @ollama/openclaw-web-search然后在聊天里输入:
搜索一下 OpenClaw 的最新版本号如果模型能调用 web-search 工具并返回搜索结果,tool 调用链路就通了。
4.4 能干活的模型配置案例
如果你发现默认模型 exec 和 tool 调用都不稳,直接换成下面这套配置。显存超过 32G 用 27b,没有 32G 用 9b:
ollama launch openclaw --model carstenuhlig/omnicoder-9b:latest对应的openclaw.json关键段:
{ "models": { "mode": "merge", "providers": { "ollama": { "baseUrl": "http://127.0.0.1:11434", "apiKey": "OLLAMA_API_KEY", "api": "ollama", "models": [ { "id": "carstenuhlig/omnicoder-9b:latest", "name": "carstenuhlig/omnicoder-9b:latest", "reasoning": false, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 262144, "maxTokens": 8192 } ] } } }, "agents": { "defaults": { "model": { "primary": "ollama/carstenuhlig/omnicoder-9b:latest" }, "workspace": "/home/tj/.openclaw/workspace" } }, "tools": { "profile": "coding", "alsoAllow": ["ollama_web_search", "ollama_web_fetch"] } }注意这里api字段用的是ollama而不是openai-completions,两种协议 OpenClaw 都支持,ollama原生协议在某些工具调用场景下更稳。
5. 本篇常见错排查
5.1 exec 报「找不到路径」或「权限被拒」
先确认 WSL2 里的工作目录存在且当前用户有写权限:
ls -ld /home/tj/.openclaw/workspace如果目录不存在,手动建一个。权限问题一般是 WSL2 默认用户和目录 owner 不一致,用chown修一下。另一个常见原因是.wslconfig里没开networkingMode=mirrored,导致 OpenClaw 访问 Ollama 时超时,表现上像是 exec 卡住,实际是模型请求没发出去。
5.2 tool 调用返回「plugin not loaded」
先跑openclaw plugins list看插件状态。如果是disabled,用openclaw plugins enable激活。如果列表里根本没有这个插件,说明安装没成功,重新执行openclaw plugins install @ollama/openclaw-web-search。安装时确保终端有足够权限,Windows 侧右键 PowerShell 选「以管理员身份运行」,WSL2 里如果提示权限不足,命令前加sudo。
5.3 模型能聊天但一调用工具就胡言乱语
这是模型能力问题,不是配置问题。qwen2.5:latest-32k在纯对话上没问题,但工具调用和 exec 路径识别需要更强的指令遵循能力。换carstenuhlig/omnicoder-9b:latest或gag0/qwen35-opus-distil:27b后,exec 和 tool 调用成功率明显提升。如果显存不够跑 9b,至少也要用 7b 以上的 coder 类模型。
5.4 上下文窗口设太大导致 OOM
contextWindow和reserveTokensFloor设得越大,启动时占用的内存越多。6G 显存跑 128000 窗口的模型,如果同时开多个并发,很容易 OOM。把contextWindow降到 65536,reserveTokensFloor降到 50000 左右,能明显缓解。maxConcurrent也建议从 4 降到 2。
5.5 WSL2 里 curl Ollama 超时
在 WSL2 里执行:
curl http://127.0.0.1:11434/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"qwen2.5:latest-32k","messages":[{"role":"user","content":"Hello!"}]}'如果超时,先确认 Windows 侧 Ollama 服务在跑,再确认.wslconfig里networkingMode=mirrored已生效。改完.wslconfig必须wsl --shutdown重启才生效,很多人忘了这步,以为配置没写对。
6. 本地跑通之后,什么时候该接云端模型
本地 Ollama + WSL2 这套组合的优势是数据不出本机、零调用成本,适合日常调试和隐私敏感场景。但本地模型在复杂工具调用、长上下文推理上还是有天花板,尤其是 exec 需要精确路径识别的时候,小模型容易翻车。
如果你发现本地模型在 coding 和 Agent 场景下不够用,可以把 OpenClaw 的 provider 切到云端。TaoToken 提供了 OpenAI 兼容的接入方式,配置思路和上面接 Ollama 一样,只是把baseUrl和apiKey换掉。API 地址是https://taotoken.net/api,接入文档在 TaoToken 接入文档 里有完整的参数说明。
具体操作上,先去 TaoToken API Keys 页面 生成一个 key,然后在openclaw.json的models.providers里加一个 provider,baseUrl填https://taotoken.net/api,api用openai-completions。想先验证模型对话效果,可以直接在 模型对话页面 试几个 prompt,确认响应质量后再写进配置。
如果你主要是长期跑 coding 和 Agent 任务,本地模型频繁 OOM 或者 exec 不稳定,可以考虑 Coding Plan,按用量走比本地硬扛显存更省心。配置入口在 TaoToken 控制台,生成 key 后回到 OpenClaw 的openclaw.json里替换 provider 段即可,其他 agents 和 tools 配置不用动。
本地和云端不是二选一,你可以把本地 Ollama 作为 fallback,云端作为 primary,在agents.defaults.model.fallbacks里配好顺序,OpenClaw 会自动切换。这样既保留了本地零成本的优势,又能在复杂任务上兜底。