Skip to main content
本地模型可以运行,但它们对硬件、上下文长度和提示注入防御提出了更高要求:小型模型或经过激进量化的模型会截断上下文,并跳过提供方侧的安全过滤。本页介绍更高端的本地栈和自定义的 OpenAI 兼容服务器。若想以最少的摩擦开始,请先使用 LM StudioOllamaopenclaw onboard 对于那些应仅在选定模型需要时才启动的本地服务器,请参阅 本地模型服务

硬件门槛

建议配备2 台以上满配的 Mac Studio或同等规格的 GPU 设备(约 3 万美元以上),以便获得更舒适的 agent 循环体验。单块 24 GB GPU 只能以更高延迟处理较轻量的提示。始终运行你能够承载的最大 / 全尺寸变体——较小或高度量化的检查点会提高提示注入风险(见 安全)。

选择后端

当后端支持 api: "openai-responses" 时,请使用它(LM Studio 支持)。否则使用 api: "openai-completions"。如果自定义 provider 配置了 baseUrl 但省略了 api,OpenClaw 默认使用 openai-completions
WSL2 + Ollama + NVIDIA/CUDA: 官方的 Ollama Linux 安装程序会启用一个带有 Restart=always 的 systemd 服务。在 WSL2 GPU 环境下,自动启动可能会在开机时重新加载上一个模型并锁定主机内存,从而导致 VM 反复重启。请参见 WSL2 crash loop

LM Studio + 大型本地模型(Responses API)

这是当前最好的本地技术栈。在 LM Studio 中加载一个大型模型(完整尺寸的 Qwen、DeepSeek 或 Llama 构建版本),启用本地服务器(默认 http://127.0.0.1:1234),并使用 Responses API 将推理与最终文本分离。
设置清单:
  • 安装 LM Studio: https://lmstudio.ai
  • 下载可用的最大模型构建版本(避免 “small”/高度量化变体),启动服务器,确认 http://127.0.0.1:1234/v1/models 列出了该模型。
  • my-local-model 替换为 LM Studio 中显示的实际模型 ID。
  • 保持模型处于加载状态;冷启动会增加启动延迟。
  • 如果你的 LM Studio 构建版本不同,请调整 contextWindow/maxTokens
  • 对于 WhatsApp,请坚持使用 Responses API,这样只会发送最终文本。
  • 保持 models.mode: "merge",这样托管模型仍可作为回退方案使用。

混合配置:托管主模型,本地回退

如果要优先本地并带有托管安全网,请交换 primary/fallbacks 的顺序,并保持相同的 providers 块以及 models.mode: "merge"

区域托管 / 数据路由

OpenRouter 上也提供托管的 MiniMax/Kimi/GLM 变体,并带有按区域固定的端点(例如,美国托管)。选择区域变体可以让流量留在你指定的司法辖区内,同时保留 models.mode: "merge" 以便使用 Anthropic/OpenAI 回退。仅本地仍然是最强的隐私方案;当你需要提供商功能但又想控制数据流向时,托管区域路由是中间方案。

其他 OpenAI 兼容的本地代理

MLX (mlx_lm.server)、vLLM、SGLang、LiteLLM、OAI-proxy,或任何自定义网关,只要暴露了 OpenAI 风格的 /v1/chat/completions 端点都可以使用。除非后端明确文档说明支持 /v1/responses,否则请使用 openai-completions
自定义/本地提供方条目会信任其精确配置的 baseUrl 源用于受保护的模型请求,包括回环地址、局域网、tailnet 和私有 DNS 主机。元数据/链路本地来源始终会被阻止,不管怎样都是如此。对其他私有来源的请求仍然需要 models.providers.<id>.request.allowPrivateNetwork: true;将信任标志设为 false 可选择不启用精确来源信任。 models.providers.<id>.models[].id 是提供方本地的——不要包含提供方前缀。对于使用 mlx_lm.server --model mlx-community/Qwen3-30B-A3B-6bit 启动的 MLX 服务器:
  • models.providers.mlx.models[].id: "mlx-community/Qwen3-30B-A3B-6bit"
  • agents.defaults.model.primary: "mlx/mlx-community/Qwen3-30B-A3B-6bit"
在本地或代理的视觉模型上设置 input: ["text", "image"],这样图像附件就会注入到代理轮次中。交互式自定义提供方引导会推断常见视觉模型 ID,并且只询问未知名称;非交互式引导会使用相同的推断,并通过 --custom-image-input / --custom-text-input 来覆盖它。 对于较慢的本地/远程模型服务器,在提高 agents.defaults.timeoutSeconds 之前,先使用 models.providers.<id>.timeoutSeconds。提供方超时仅覆盖模型 HTTP 请求的连接、响应头、正文流式传输,以及总的受保护抓取中止——如果代理/运行超时更低,也需要一并提高,因为提供方超时不能延长整个运行时间。
对于自定义 OpenAI 兼容提供方,当 baseUrl 解析到回环地址、私有局域网、.local 或裸主机名时,允许使用像 apiKey: "ollama-local" 这样的非密钥本地标记——OpenClaw 会将其视为有效的本地凭据,而不是报告缺少密钥。对于任何接受公共主机名的提供方,请使用真实值。
本地/代理 /v1 后端的行为说明:
  • OpenClaw 将这些视为代理式 OpenAI 兼容路由,而不是原生 OpenAI 端点。
  • 仅适用于原生 OpenAI 的请求塑形不适用:没有 service_tier,没有 Responses 的 store,没有 OpenAI reasoning 兼容有效载荷塑形,没有提示缓存提示。
  • 不会在自定义代理 URL 上注入隐藏的 OpenClaw 归因头(originatorversionUser-Agent)。
Compat declarations are only for the custom endpoint described by this provider row. Catalog-known routes use provider-owned capabilities instead; see the custom-provider capability guide. Compat overrides for stricter OpenAI-compatible backends:
  • 仅字符串内容:某些服务器只接受字符串形式的 messages[].content,不接受结构化的 content-part 数组。请设置 models.providers.<provider>.models[].compat.requiresStringContent: true
  • 严格消息键:如果服务器拒绝除 role/content 之外包含更多字段的消息条目,请设置 compat.strictMessageKeys: true
  • 方括号工具文本:某些本地模型会输出独立的方括号工具请求文本,例如 [tool_name],后跟 JSON 和 [END_TOOL_REQUEST]。只有当名称与该轮已注册工具完全匹配时,OpenClaw 才会将其提升为真正的工具调用;否则它会保持为隐藏的、不受支持的文本。
  • 非结构化的工具调用样式文本:如果模型输出看起来像工具调用的 JSON/XML/ReAct 风格文本,但并不是结构化调用,OpenClaw 会将其保留为文本,并在可用时记录一条警告,包含运行 ID、提供方/模型、检测到的模式和工具名。这是提供方/模型不兼容,而不是一次完成的工具运行。
  • 强制使用工具:如果工具以助手文本的形式出现(原始 JSON/XML/ReAct,或空的 tool_calls 数组),请先确认服务器的 chat template/parser 支持工具调用。如果解析器只有在强制使用工具时才正常工作,可按模型覆盖默认代理值 tool_choice: "auto"
    仅在每个正常轮次都应该调用工具的场景下使用。将 local/my-local-model 替换为 openclaw models list 中的精确引用,或者通过 CLI 设置:
  • 额外的 reasoning 努力级别:如果自定义 OpenAI 兼容模型支持超出内置配置文件的 OpenAI reasoning efforts,请在模型的兼容块中声明它们。添加 "xhigh" 会使该模型引用在 /think xhigh、会话选择器、Gateway 验证和 llm-task 验证中可见:

更小或更严格的后端

如果模型能正常加载,但完整的 agent 轮次表现异常,请自上而下排查:先确认传输层,然后缩小范围。
  1. 确认本地模型有响应 - 不使用工具,也不带 agent 上下文:
  2. 确认 Gateway 路由 - 只发送提示词,跳过 transcript、AGENTS 引导、context-engine 组装、工具以及捆绑的 MCP servers,但仍会测试 Gateway 路由、认证和 provider 选择:
  3. 如果前两项都通过,但真实的 agent 轮次因工具调用格式错误或提示词过大而失败,请尝试精简模式:将 agents.defaults.experimental.localModelLean: true。它会移除重量级的浏览器、cron、消息、媒体生成、语音和 PDF 工具,除非显式需要;同时会在保持 exec 直接可见的前提下,通过结构化的 Tool Search 控制来默认收起更大的工具目录。详见 Experimental Features -> Local model lean mode,以及如何确认它已开启。
  4. 作为最后手段,完全禁用工具:为该模型设置 models.providers.<provider>.models[].compat.supportsTools: false,这样 agent 就不会再进行工具调用。
  5. 再往后,瓶颈就在上游了。 如果在 lean mode 和 supportsTools: false 之后,后端仍然只在更大的 OpenClaw 运行中失败,那么剩下的问题通常是模型或服务器本身——上下文窗口、GPU 内存、kv-cache 驱逐,或者后端 bug——而不是 OpenClaw 的传输层。

故障排查

  • 网关无法连接到代理? curl http://127.0.0.1:1234/v1/models.
  • LM Studio 模型已卸载? 重新加载;冷启动是常见的“卡住”原因。
  • 本地服务器显示 terminatedECONNRESET,或在对话中途关闭流? OpenClaw 会在诊断信息中记录低基数的 model.call.error.failureKind,以及 OpenClaw 进程的 RSS/heap 快照。对于 LM Studio/Ollama 的内存压力,请将该时间戳与服务器日志或 macOS 崩溃/jetsam 日志进行匹配,以确认模型服务器是否被杀死。
  • 上下文错误? OpenClaw 会根据检测到的模型窗口(或在 agents.defaults.contextTokens 降低它时的上限窗口)推导上下文窗口预检阈值:低于 20% 时警告,并设有 8k 下限;低于 10% 时硬阻断,并设有 4k 下限(会按有效上下文窗口进行封顶,因此过大的模型元数据不会拒绝有效的用户上限)。降低 contextWindow 或提高服务器/模型的上下文限制。
  • messages[].content ... expected a string 在该模型条目上添加 compat.requiresStringContent: true
  • validation.keys,或“message entries only allow role and content”? 在该模型条目上添加 compat.strictMessageKeys: true
  • 直接调用 /v1/chat/completions 可用,但 openclaw infer model run --local 在 Gemma 或其他本地模型上失败? 首先检查 provider URL、model ref、auth 标记和服务器日志——model run 会完全跳过 agent tools。如果 model run 成功但更大的 agent turn 失败,请通过 localModelLeancompat.supportsTools: false 减少工具面。
  • 工具调用显示为原始 JSON/XML/ReAct 文本,或者 provider 返回空的 tool_calls 数组? 不要添加一个会盲目把 assistant 文本转换为工具执行的代理——先修复服务器的 chat template/parser。如果模型只有在强制使用工具时才可用,请在上方添加 params.extra_body.tool_choice: "required" 覆盖,并且只将该模型条目用于每一轮都预期会发生工具调用的会话。
  • 安全性:本地模型会跳过 provider 侧过滤。保持 agent 范围窄并开启 compaction,以限制 prompt injection 的影响范围。

相关