Clawdbot(Moltbot)源码部署全实测:从环境搭建到 WebChat 验证,避坑指南收好

Clawdbot(Moltbot)源码部署全实测:从环境搭建到 WebChat 验证,避坑指南收好

一、为啥折腾 Clawdbot?

最近刷技术圈总刷到 Clawdbot(后来也叫 Moltbot),说是能搭私人 AI 助手,支持 WhatsApp、Telegram 这些常用通道,还能跑在自己设备上,不用依赖第三方服务 —— 想着拉下来测试一下功能,顺便研究一下其源码的实现。
于是拉上 GitHub 仓库https://github.com/openclaw/openclaw,打算从源码部署试试,过程里踩了不少坑,干脆整理成记录,给同样想折腾的朋友避避坑。

二、源码部署前的准备:Windows 环境优先选 WSL2

一开始想直接用 Windows CMD 部署,结果装依赖时各种报错,查仓库文档才发现 Windows 推荐用 WSL2(Ubuntu/Debian 镜像就行),后续操作全在 WSL2 里完成:

  1. 启用 WSL2:先在 Windows 功能里勾 “适用于 Linux 的 Windows 子系统” 和 “虚拟机平台”,重启后装 Ubuntu 22.04(微软应用商店直接搜)
  2. 配置 WSL2:打开 Ubuntu 终端,先更系统源(换阿里源,不然后续装包巨慢),再 sudo apt update && sudo apt upgrade -y
  3. 装 Git:sudo apt install git,验证 git --version,避免后续拉仓库出错

我没有执行这一步,导致后面构建项目报错,后面有其他的解决方案。

三、Node.js 安装:别踩 “版本不够” 的坑

仓库文档说要 Node≥22,这里使用nvm管理环境,并切换到node最新版本。

在这里插入图片描述


注意:不要用22以下的,在pnpm install会报错。

四、拉取源码 & 装依赖

1、安装依赖

git clone https://github.com/openclaw/openclaw.git cd openclaw pnpm install 

在安装依赖时候会报错:

在这里插入图片描述


问题分析
node-llama-cpp 的 postinstall 脚本失败,错误码 3221225477 通常表示:
访问冲突或权限问题或Windows 上缺少必要的构建工具

node-llama-cpp 是可选依赖,仅用于本地嵌入。如果使用远程嵌入(如 OpenAI),可忽略该错误。项目会回退到远程嵌入。故注释掉 package.json 里面的 node-llama-cpp的依赖,重新进行 pnpm install

在这里插入图片描述

2、构建项目

前面安装依赖没问题之后,先构建ui

pnpm ui:build 
在这里插入图片描述


构建项目

pnpm build 
在这里插入图片描述


这是由于OpenClaw 在 Windows 上推荐使用 WSL2。在原生 Windows 上构建需要 bash。检查是否有 Git Bash 可用,或创建一个 Node.js 版本的构建脚本:
此处在项目的/script 目录下创建一个 nodejs版本的构建脚本 bundle-a2ui.mjs,代码如下:

#!/usr/bin/env nodeimport{ createHash }from"node:crypto";import{ promises as fs }from"node:fs";import path from"node:path";import{ fileURLToPath }from"node:url";import{ spawn }from"node:child_process";import{ promisify }from"node:util";const spawnAsync =promisify(spawn);const __filename =fileURLToPath(import.meta.url);const __dirname = path.dirname(__filename);constROOT_DIR= path.resolve(__dirname,"..");constHASH_FILE= path.join(ROOT_DIR,"src/canvas-host/a2ui/.bundle.hash");constOUTPUT_FILE= path.join(ROOT_DIR,"src/canvas-host/a2ui/a2ui.bundle.js");constA2UI_RENDERER_DIR= path.join(ROOT_DIR,"vendor/a2ui/renderers/lit");constA2UI_APP_DIR= path.join(ROOT_DIR,"apps/shared/OpenClawKit/Tools/CanvasA2UI");asyncfunctioncheckDirExists(dir){try{const stat =await fs.stat(dir);return stat.isDirectory();}catch{returnfalse;}}asyncfunctionwalk(entryPath, files =[]){const st =await fs.stat(entryPath);if(st.isDirectory()){const entries =await fs.readdir(entryPath);for(const entry of entries){awaitwalk(path.join(entryPath, entry), files);}return files;} files.push(entryPath);return files;}functionnormalize(p){return p.split(path.sep).join("/");}asyncfunctioncomputeHash(){const inputPaths =[ path.join(ROOT_DIR,"package.json"), path.join(ROOT_DIR,"pnpm-lock.yaml"),A2UI_RENDERER_DIR,A2UI_APP_DIR,];const files =[];for(const inputPath of inputPaths){try{const stat =await fs.stat(inputPath);if(stat.isDirectory()|| stat.isFile()){awaitwalk(inputPath, files);}}catch{// Path doesn't exist, skip}} files.sort((a, b)=>normalize(a).localeCompare(normalize(b)));const hash =createHash("sha256");for(const filePath of files){const rel =normalize(path.relative(ROOT_DIR, filePath)); hash.update(rel); hash.update("\0");const content =await fs.readFile(filePath); hash.update(content); hash.update("\0");}return hash.digest("hex");}asyncfunctionrunCommand(command, args, options ={}){returnnewPromise((resolve, reject)=>{const proc =spawn(command, args,{...options,stdio:"inherit",shell:false,}); proc.on("close",(code)=>{if(code ===0){resolve();}else{reject(newError(`Command failed with exit code ${code}`));}}); proc.on("error", reject);});}asyncfunctionmain(){try{// Docker builds exclude vendor/apps via .dockerignore.// In that environment we must keep the prebuilt bundle.if(!(awaitcheckDirExists(A2UI_RENDERER_DIR))||!(awaitcheckDirExists(A2UI_APP_DIR))){ console.log("A2UI sources missing; keeping prebuilt bundle."); process.exit(0);}const currentHash =awaitcomputeHash();let shouldBuild =true;try{const previousHash =await fs.readFile(HASH_FILE,"utf-8");const outputExists =await fs .access(OUTPUT_FILE).then(()=>true).catch(()=>false);if(previousHash.trim()=== currentHash && outputExists){ console.log("A2UI bundle up to date; skipping."); shouldBuild =false;}}catch{// Hash file doesn't exist, need to build}if(shouldBuild){ console.log("Building A2UI bundle...");awaitrunCommand("pnpm",["-s","exec","tsc","-p", path.join(A2UI_RENDERER_DIR,"tsconfig.json")]);awaitrunCommand("pnpm",["-s","exec","rolldown","-c", path.join(A2UI_APP_DIR,"rolldown.config.mjs")]);await fs.writeFile(HASH_FILE, currentHash,"utf-8"); console.log("A2UI bundle built successfully.");}}catch(error){ console.error("A2UI bundling failed. Re-run with: pnpm canvas:a2ui:bundle"); console.error("If this persists, verify pnpm deps and try again."); console.error(error); process.exit(1);}}main();

重新构建项目 pnpm build

在这里插入图片描述


构建完成。

六、配置 OpenClaw

直接跑向导 pnpm openclaw onboard --install-daemon

在这里插入图片描述


进来这个提示,先按照yes和quickstart方式快速配置

在这里插入图片描述


**配置模型:**这里选择智谱AI

在这里插入图片描述


配置api-key

在这里插入图片描述


配置channel
支持接入不同的app,这里没有不支持微信等国内的生态,暂时先跳过,使用webchat测试。

在这里插入图片描述


配置skills

在这里插入图片描述



可选的内置skills很多,注意,这里按空格选中,选好之后,按回车保存。
但选择对应的skills后,很多需要配置对应的key才能使用,这个需要提前在对应的网站申请key。

在这里插入图片描述


配置Hooks:
先跳过,暂时不用。

在这里插入图片描述


启动Gateway service
保存好上面配置后,会自动启动网关服务。

在这里插入图片描述


在这里插入图片描述


同时ui应用也会启动,至此配置完成

七、发送消息没有响应

第一次启动配置完后,发现发送消息并没有得到响应,控制台也没有报错。

在这里插入图片描述


后来发现是我的GLM4.7 限额了。这时候可以直接修改 openclaw.json配置文件进行修改配置。

在这里插入图片描述


改为flash模型

在这里插入图片描述


后续所有和openclaw agent相关的配置都可以通过修改该文件,不需要重复进入向导配置。

注意:修改后记得重启 gateway service ,否则不生效。
pnpm openclaw gateway restart --allow-unconfigured

在这里插入图片描述


可使用 openclaw status查看网关启动状态

在这里插入图片描述

八、常用命令

  1. 查看状态:openclaw status(快速看 Gateway 和通道是否在线)
  2. 发送测试消息:openclaw message send --to 自己的手机号(带国家码,比如 + 86138xxxxxxx) --message “测试 Clawdbot”,能收到消息说明通道没问题
  3. 重置会话:openclaw agent --reset(对话卡顿时用)
  4. 检查问题:openclaw doctor(神器!会提示配置和环境的问题,比如 DM 策略风险、依赖缺失)
  5. 更新版本:openclaw update --channel stable(新手别更 dev 通道,不稳定)

九、WebChat 测试

由于没有接入其他channel,这里直接用原生的ui webchat进行测试。

测试调用工具读取文件的能力

在这里插入图片描述

测试其 Computer Use的能力

直接写入文件到系统。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


可见其调用工具,Computer use能力还是比较强的

Read more

Cloudflare 防 CC/机器人攻击完整解决方案:用 WAF 托管质询 + “已知自动程序=true” 稳定解决 WordPress CPU/内存 100%

Cloudflare 通用防护目标(只用 Cloudflare,适配所有服务器) 该方案只在 Cloudflare 侧完成,不依赖服务器类型、面板或 root 权限,目标是: 1. 不长期依赖 Under Attack(仅作为应急开关) 2. 通过 WAF 规则把高频机器人/CC 流量挡在边缘 3. 重点保护 WordPress 高风险入口(wp-login、admin-ajax、xmlrpc) 4. 通过事件数据持续迭代规则,保持长期稳定 一、Cloudflare 基础前置(必须) 1. DNS 全部走代理(橙云) * 网站主域名、www 以及对外访问的记录,全部开启 Proxied(橙云) * 不保留任何灰云直连源站记录,避免绕过

By Ne0inhk

Qwen2.5-0.5B校园应用案例:智能导览机器人搭建指南

Qwen2.5-0.5B校园应用案例:智能导览机器人搭建指南 1. 为什么校园需要一个“会说话”的导览机器人? 你有没有在新生报到日,看到一群学生举着手机地图在教学楼之间来回穿梭?有没有见过访客站在校史馆门口,对着展板皱眉却找不到讲解入口?传统导览方式——纸质手册、固定语音播报、人工讲解员——要么信息滞后,要么人力成本高,要么体验单向枯燥。 而今天要聊的这个小家伙,不占地方、不用排班、不会累,还能边走边聊。它不是科幻电影里的金属躯壳,而是一台装在平板或自助终端里的AI对话系统,核心就是 Qwen2.5-0.5B-Instruct 这个模型。别被“0.5B”吓到——它只有5亿参数,比动辄几十亿的大模型轻巧得多,却专为中文校园场景打磨过:能听懂“图书馆怎么去”“计算机学院在几号楼”“校训石在哪拍照最好”,也能接住“帮我写一段迎新广播稿”“生成一份社团招新问卷”这类轻量创作需求。 最关键的是,它跑在普通CPU上就能流畅工作。这意味着你不需要采购显卡服务器,一台旧笔记本、

By Ne0inhk
小米 “养龙虾”:手机 Agent 落地,智能家居十年困局被撬开

小米 “养龙虾”:手机 Agent 落地,智能家居十年困局被撬开

3月6日,小米正式推出国内首个手机端类 OpenClaw Agent 应用 ——Xiaomi miclaw,开启小范围邀请封测。这款被行业与网友戏称为小米 “开养龙虾” 的新品,绝非大模型浪潮下又一款语音助手的常规升级,而是基于自研 MiMo 大模型、具备系统级权限、全场景上下文理解能力的端侧智能体。 作为深耕智能家居领域的行业媒体,《智哪儿》始终认为:智能家居行业过去十年的迭代,始终没能跳出 “被动执行” 的底层困局。而 miclaw 的落地,不止是小米在端侧 AI 赛道的关键落子,更是为整个智能家居行业的底层逻辑重构,提供了可落地的参考范本。需要清醒认知的是,目前该产品仍处于小范围封测阶段,复杂场景执行成功率、端侧功耗表现、第三方生态适配进度等核心体验,仍有待大规模用户实测验证。本文将结合具象场景、量化数据与多维度视角,客观拆解 miclaw 的突破价值、现实挑战,以及它对智能家居行业的长期影响。 01 复盘行业困局:智能家居十年 始终困在 “被动执行”

By Ne0inhk
《机器人实践开发①:Foxglove 开发环境完整搭建指南(含常见坑位) 》

《机器人实践开发①:Foxglove 开发环境完整搭建指南(含常见坑位) 》

导语: 在机器人项目中,调试工具往往比算法本身更耗时间。Foxglove 作为新一代机器人可视化平台,提供了强大的话题订阅、视频显示、3D 展示和日志分析能力。本篇从零开始,手把手带你完成 Foxglove 的环境搭建,包含依赖安装、连接配置以及常见踩坑点。 《机器人实践开发》系列文章索引 《机器人实践开发①:Foxglove 开发环境完整搭建指南(含常见坑位)》 《机器人实践开发②:Foxglove 嵌入式移植 + CMake 集成》 《机器人实践开发③:Foxglove可视化机器人的眼睛-视频》 《机器人实践开发④:Foxglove可视化机器人的耳朵-声音》 《机器人实践开发⑤:Foxglove可视化机器人的3D显示》 《机器人实践开发⑥:Foxglove可视化机器人传感器数据》 《机器人实践开发⑦:Foxglove可视化机器人的日志显示》 《机器人实践开发⑧:Foxglove可视化机器人的地图显示》 《机器人实践开发⑨:Foxglove可视化机器人的MyBag 数据回放》 foxglove 官网 Foxglove 是一个专为机器人团队打造的平台,用于收

By Ne0inhk