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

ICML 2024|DoRA :Weight-Decomposed Low-Rank Adaptation权重分解低秩适应

ICML 2024|DoRA :Weight-Decomposed Low-Rank Adaptation权重分解低秩适应

文章目录 * 基本信息 * 0 论文摘要(Abstract) * 实验背景 * 方法设计 * 实验结果 * 核心贡献 * 1 引言(Introduction) * DoRA 核心操作图 * 2 相关工作(Related Works) * 3 LoRA与FT的模式分析( Pattern Analysis of LoRA and FT) * LoRA数学原理与核心公式 * 3.2 权重分解分析 * 4 方法(Method) * 4.2 DoRA的梯度分析 * 4.3 训练开销的降低 * 5 实验(Experiments) * 5.1 常识推理 * 1. 模型与PEFT方法的性能差异 * 2. DoRA方法的优势 * 3.

自制缩小版 R2-D2 机器人、DIY 工业级紫外线表面探伤流水线、自调平旋转激光水平仪|DF 创客周刊(第 158 期)

自制缩小版 R2-D2 机器人、DIY 工业级紫外线表面探伤流水线、自调平旋转激光水平仪|DF 创客周刊(第 158 期)

社区公众号记录每周值得分享的创客相关内容,每周五发布~ 周刊首发于DF创客社区,欢迎投稿或推荐相关内容。 投稿邮箱:[email protected] 自制一个缩小版 R2-D2 机器人 这是一款海外创客 Tejas Shah 打造的 40%比例 3D 打印 R2-D2 机器人。 相比市面上的成品玩具,这台 R2-D2 不仅外观更精致,功能也更强大。 它的外壳和头部全部通过 3D 打印制作,并经过多次打磨与上色,表面光滑、细节丰富。 R2-D2 的“大脑”采用了树莓派 Pico W 和 Arduino Nano 双主控设计,可控制多路 LED 灯、舵机和机械臂,实现头部旋转、探测器和机械臂的动作。 底部配备了 3D

【FPGA+DSP系列】——MATLAB simulink仿真三相桥式全控整流电路

【FPGA+DSP系列】——MATLAB simulink仿真三相桥式全控整流电路

【FPGA+DSP系列】——MATLAB simulink仿真三相桥式全控整流电路 * 一、理论分析 * 二、matlab simulink实验 * 1.仿真实验 * 2.波形分析 * 总结 一、理论分析 直接上电路图,相比于单相桥式整流的区别,首先是输入变成了3相电压,这个的优势就在于三相相位差都是120°,相比于之前的单相每个周期只有两个触发信号,也只能有2个触发信号,而三相的存在会产生很多换相点,在这些点位生成触发信号会进而提高整流效果以及整流脉冲数,脉波数越多越好,越多就说明纹波越小,越趋近于直线。 导通流程: 先ab相导通,然后ac相,然后bc相,然后ba相,这个是什么决定的呢?为什么要这样导通,其实有迹可循,当我把Uab/Uac…Uca/Ucb所有的波形放到一起,你就知道为什么要这样触发,为什么是这个顺序了: 这是我将所有的波形放到一个示波器中进行观看, 其中通道顺序与颜色的对应关系如下,这样我们就能标记哪个是哪个了。 通过这个顺序,我们就可以在换相点进行触发,进而完成六脉冲的输出,同时从这个图可以得出我们的导通顺序,ab ac

EgoPoseFormer v2:解决 AR/VR 场景中的第一视角人体动捕问题

目录 一、前言 二、EgoPoseFormer v2 核心内容总结 1. 研究背景与挑战 2. EPFv2 的核心创新 3. 实验结果 4. 应用价值 三、DeepSeek是不是发布过关于图像识别顺序的因果时间注意力机制?         3.1 它们各自是怎么实现的,技术上有没有底层的联系和区别? 1.DeepSeek的“视觉因果流” (空间逻辑重排) 2.Meta EPFv2的“因果时间注意力” (时间逻辑依赖) 3.底层联系与核心区别 4.总结 四、EPFv2和DeepSeek OCR2和SAM2跟踪的区别和联系         4.1 EPFv2和DeepSeek OCR2和SAM2跟踪的区别和联系是什么?         4.2 技术上的相似性 🧩 不同的应用方式:从“基础模块”到“特定智能”