codecamp

Ollama OpenClaw

OpenClaw 是一个跑在自己设备上的个人 AI 助手。它的核心价值是把 WhatsApp、Telegram、Slack、Discord、iMessage 这些聊天软件接到 AI 代理上——你在手机上发消息,后端是你本地的模型。

版本基线 v0.40.12,官方 docs.ollama.com/integrations/openclaw。曾用名 Clawdbot,ollama launch clawdbot 仍作为别名可用。

一、一条命令完成安装

ollama launch openclaw

Ollama 会自动处理五件事:

  1. 安装:未安装则提示通过 npm 安装 OpenClaw
  2. 安全提示:首次启动会说明工具访问权限的风险
  3. 选模型:从选择器挑本地或云端模型
  4. 初始化:配置 provider、安装 gateway 守护进程、设为默认模型,并启用 OpenClaw 内置的 Ollama 联网搜索
  5. 启动 gateway:后台运行,同时打开 OpenClaw 的 TUI 界面

二、上下文窗口是硬要求

OpenClaw 处理的是持续对话 + 多工具调用,建议上下文至少 64k tokens。

本地模型默认往往只有 4k,直接跑会表现为「记不住前面几轮」「工具调用失败」。调大方式:

## 检查当前加载上下文
ollama ps

## 启动服务时设默认上下文
OLLAMA_CONTEXT_LENGTH=65536 ollama serve

详见 6.1 Ollama 上下文长度。

三、联网搜索

OpenClaw 自带一个 Ollama web_search provider,让本地或云端部署都能通过配置的 Ollama 主机联网搜索。

通过 ollama launch openclaw 启动时自动启用。要手动配置:

openclaw configure --section web

本地模型使用联网搜索需要先 ollama signin。

四、不启动也改配置

只想换模型、不想拉起 gateway 和 TUI:

ollama launch openclaw --config

直接指定模型:

ollama launch openclaw --model kimi-k2.5:cloud

gateway 已经在跑时会自动重启以加载新模型。

五、无交互(headless)模式

适合 Docker、CI/CD、脚本场景:

ollama launch openclaw --model kimi-k2.5:cloud --yes

--yes 的作用是:自动拉取模型、跳过所有选择器。必须同时指定 --model,否则会报错。

六、连接聊天软件

openclaw configure --section channels

可选 WhatsApp、Telegram、Slack、Discord、iMessage。配置完成后,就能从任意设备通过这些软件和自己的本地模型对话。

这是 OpenClaw 相比普通编码代理最有价值的部分——模型和算力留在自己机器上,交互入口在你日常用的聊天软件里。

七、停止 gateway

openclaw gateway stop

常见问题

现象 原因 处理
对话经常「忘记」前文 上下文太小 调到 64k 以上
联网搜索不可用 未登录 ollama signin
--yes 报错 没带 --model 补上 --model <模型名>
换模型不生效 gateway 未重启 重启 gateway,或用 --model 重新 launch
消息平台收不到回复 gateway 未运行 openclaw gateway stop 后再 launch 一次

动手试

先做无交互的最小验证,确认模型链路通:

## ① 拉一个支持工具的模型
ollama pull qwen3

## ② 用 headless 模式启动
ollama launch openclaw --model qwen3 --yes

能正常起 TUI 并回话,再进 openclaw configure --section channels 接聊天软件。

Ollama Claude Desktop
Ollama Hermes Agent
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Ollama Cloud

Ollama CLI 命令行参考

Ollama Modelfile 参考

Ollama 上下文长度

Ollama 导入自定义模型

Ollama 常见问题

Ollama 硬件支持

Ollama 故障排查

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }