--- summary: "修复了 OpenClaw 中常见的 Ollama 故障" read_when: - "未检测到 Ollama,或没有可用模型" - "您遇到连接被拒绝、输出乱码或超时" - "WSL2 设置反复重新启动" title: "Ollama 故障排除" sidebarTitle: "故障排查" --- ## 故障排查 在 WSL2 和 NVIDIA/CUDA 上,官方 Ollama Linux 安装程序使用 `Restart=always` 创建 `ollama.service` systemd 单元。如果该服务在 WSL2 启动期间自动启动并加载 GPU- 支持的模型,则 Ollama 可以在加载时固定主机内存; Hyper-V内存回收不能总是回收这些页面,因此Windows可以终止WSL2 VM,systemd重新启动Ollama,并且循环重复。 证据:在WSL2启动后,WSL2 reboots/terminations、`app.slice`或`ollama.service`中出现高CPU,以及来自systemd而不是Linux的SIGTERM OOM 杀手。 当 OpenClaw 检测到 WSL2、已启用 `ollama.service` 且 `Restart=always`,并且存在可见的 CUDA 标记时,会记录启动警告。 缓解方法: ```bash sudo systemctl disable ollama ``` 在 Windows 端,将以下内容添加到 `%USERPROFILE%\.wslconfig`,然后运行 `wsl --shutdown`: ```ini [experimental] autoMemoryReclaim=disabled ``` 或者缩短 keep-alive / 仅在需要时手动启动 Ollama: ```bash export OLLAMA_KEEP_ALIVE=5m ollama serve ``` 参见 [ollama/ollama#11317](https://github.com/ollama/ollama/issues/11317)。 确认 Ollama 正在运行并且位于代理的模型范围内。对于环境本地主机发现,设置 `OLLAMA_API_KEY`(或身份验证配置文件)。无论是否列出模型,都会发现显式自托管端点: ```bash ollama serve curl http://localhost:11434/api/tags ``` 在本地拉取该模型,或在 `models.providers.ollama` 中显式定义它: ```bash ollama list # See what's installed ollama pull gemma4 ollama pull gpt-oss:20b ollama pull llama3.3 # Or another model ``` ```bash # Check if Ollama is running ps aux | grep ollama # Or restart Ollama ollama serve ``` 请在运行 Gateway 的同一台机器和运行时中进行验证: ```bash openclaw gateway status --deep curl http://ollama-host:11434/api/tags ``` 常见原因: - `baseUrl` 指向 `localhost`,但 Gateway 运行在 Docker 中或另一台主机上。 - URL 使用 `/v1`,选择 OpenAI- 兼容行为而不是本机 Ollama。 - 远程主机需要防火墙或 LAN 绑定设置调整。 - 模型在你笔记本电脑的守护进程上,但不在远程主机上。 通常提供程序处于 OpenAI- 兼容模式,或者模型无法处理工具模式。更喜欢本机模式: ```json5 { models: { providers: { ollama: { baseUrl: "http://ollama-host:11434", api: "ollama", }, }, }, } ``` 如果某个小型本地模型仍然在工具 schema 上失败,请在该模型条目上设置 `compat.supportsTools: false` 并重新测试。 当回复包含命名可用工具的结构化工具调用尝试(包括包装的 XML、ReAct、`Action`/`Action Input` 和旧版 `[TOOL_CALL]` 块)时,OpenClaw 会要求模型一次在恢复安全时本地调用该工具。早期的副作用可以阻止重试。重复的文本呼叫明显失败,而不是报告成功。该守卫永远不会执行文本呼叫;实质性答案中的示例仍然是文本。原始回复和更正继续保留在会话历史记录中。 在未设置 `tools.toolSearch` 的情况下,使用本机本地 Ollama 的嵌入式运行会直接公开策略批准的 `web_search`、`web_fetch`、`memory_search` 和 `memory_get`。其他可选工具仍然被推迟。显式工具搜索设置保留其配置的行为。直接暴露不会启用被拒绝的工具、启用内存或配置网络搜索提供商。 OpenClaw 在同一工具和参数连续三次出现相同故障(包括重复的未知工具 ID)后停止。此保护始终处于活动状态;不需要启用 `tools.loopDetection`。 Ollama 0.40 的通用解析器可能会将聊天模板标记误认为是广告工具名称。工具搜索跨提供商使用无冲突的 `dispatch_action` 名称,在指令、请求和新会话历史记录中具有相同的名称。它不再需要 `openclaw_tool_call` 线路别名。仍然冲突的直接公开名称(例如 `ls`、`name` 和 `function`)保留仅传输别名,例如 `openclaw_ls`。执行和会话历史记录保留这些工具的原始名称。 这些剩余的别名覆盖本机 Ollama 和 Ollama 插件识别的 OpenAI- 兼容聊天完成路由。其他提供商不变。具有不同标记的自定义 Ollama 模板可能需要单独诊断。 检查记录的错误中的参数。如果模型重复发明工具名称或无法使用公开的模式,请切换到具有本机工具调用的模型并开始新一轮。更改的错误和成功的重试会重置计数。参见[工具环检测](/tools/loop-detection)。 较长的非语言符号运行的托管 Kimi/GLM 响应被视为失败的提供程序调用而不是成功的回复,因此正常的 retry/fallback/error 处理将接管,而不是将损坏的文本保留到会话中。 如果再次出现,请捕获模型名称、当前会话文件以及运行是否使用 `Cloud + Local` 还是 Ollama Cloud,然后尝试新的会话和后备模型: ```bash openclaw infer model run --model ollama/kimi-k2.6:cloud --prompt "Reply with exactly: ok" --json openclaw models set ollama/gemma4 ``` 大型本地模型首次加载可能需要很长时间。将超时时间限定到 Ollama 提供方,并可选地在轮次之间保持模型加载: ```json5 { models: { providers: { ollama: { timeoutSeconds: 300, models: [ { id: "gemma4:26b", name: "gemma4:26b", params: { keep_alive: "15m" }, }, ], }, }, }, } ``` 如果主机本身接受连接很慢,`timeoutSeconds` 也会为该提供方延长受保护的连接超时时间。 许多模型宣传的上下文超出了您的硬件可以舒适运行的范围。本机请求转发有效的 `contextTokens`,除非 `params.num_ctx` 覆盖它。限制 OpenClaw 的预算和 Ollama 的请求上下文,以实现可预测的第一个令牌延迟: ```json5 { models: { providers: { ollama: { maxTokens: 8192, models: [ { id: "qwen3.5:9b", name: "qwen3.5:9b", contextTokens: 32768, params: { num_ctx: 32768, thinking: false }, }, ], }, }, }, } ``` 如果 OpenClaw 发送过多提示,请降低模型条目的 `contextTokens`。如果 Ollama 的运行时上下文对于机器来说太大,则降低 `params.num_ctx`。如果发电运行时间过长,则降低 `maxTokens`。 如果 `curl` 至 Ollama 工作但代理程序中止,请尝试 [llmman](/providers/llmman) 作为本地服务器。 更多帮助:[故障排除](/help/troubleshooting)和[FAQ](/help/faq)。