Jetson + OpenClaw + 飞书机器人:构建一个让边缘设备成为 AI Agent 助手的远程交互系统

Jetson + OpenClaw + 飞书机器人:构建一个让边缘设备成为 AI Agent 助手的远程交互系统

1. 背景

最近我希望在 Jetson 上部署一个本地 Openclaw,并通过飞书机器人进行远程交互,从而让闲置的边缘设备秒变我的高级AI助手。整体目标很简单:

  • 在 Jetson 上运行 OpenClaw
  • 接入自己的模型 API(我使用的是阿里的Coding Plan)
  • 通过飞书群聊 @机器人 或者私聊机器人直接调用本地 Agent

最终希望实现这样的工作流:

Feishu Group ↓ Feishu Bot ↓ OpenClaw Gateway (Jetson) ↓ Agent ↓ LLM API ↓ 返回飞书消息 

这篇文章记录一下从源码部署 OpenClaw,到接通飞书机器人的完整过程,以及过程中踩到的几个关键坑。


2. 环境信息

本文使用环境如下:

Jetson 环境

uname -a # 输出 Linux agx229-desktop 5.10.216-tegra #1 SMP PREEMPT Tue Mar 4 01:35:16 PST 2025 aarch64 aarch64 aarch64 GNU/Linux lsb_release -a # 输出 Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal nvcc --version # 输出 Cuda compilation tools, release 11.4, V11.4.315 

说明

当前平台为:

  • Jetson ARM64
  • Ubuntu 20.04
  • CUDA 11.4

这点很重要,因为后续某些依赖在 ARM64 + Ubuntu 20.04 上会遇到额外兼容性问题。


3. 安装 Node.js 与 pnpm

OpenClaw 是一个 Node.js 项目,因此首先需要准备 Node 环境。

建议使用 Node 22。

# 安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # 重新加载 shell 配置 source ~/.bashrc # 如果使用 zsh source ~/.zshrc # 配置镜像加速下载(可选,建议中国用户使用) nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/ # 安装并使用 Node.js 20 nvm install 20 nvm use 20 # 设为默认版本 nvm alias default 20 # 配置 npm 镜像加速 npm config set registry https://registry.npmmirror.com # 验证安装 node --version npm --version

还需要安装 pnpm

npm install -g pnpm 

安装后检查:

pnpm -v 

4. 配置 pnpm 环境变量

这一步非常重要。

如果不配置 PNPM_HOME,后面可能出现这些问题:

  • pnpm link --global 报错
  • OpenClaw 自动构建 UI 时提示找不到 pnpm
  • 全局命令不可用

建议将下面内容加入 ~/.bashrc

# pnpm export PNPM_HOME="/home/agx229/.local/share/pnpm" case ":$PATH:" in *":$PNPM_HOME:"*) ;; *) export PATH="$PNPM_HOME:$PATH" ;; esac # pnpm end 

保存后执行:

source ~/.bashrc 

再验证:

echo $PNPM_HOME which pnpm 

5. 克隆 OpenClaw 源码

cd ~ git clone https://github.com/openclaw/openclaw.git cd openclaw 

6. 解决 Jetson 上 CMake 版本过低的问题

在 Jetson Ubuntu 20.04 上,系统自带的 CMake 往往版本较低。
而 OpenClaw 的某些依赖在编译时要求更高版本的 CMake。

我在安装过程中遇到的典型报错是:

CMake 3.19 or higher is required. You are running version 3.16.3 

因此需要手动升级 CMake。

安装新版 CMake

cd ~ wget https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6-linux-aarch64.sh chmod +x cmake-3.31.6-linux-aarch64.sh sudo ./cmake-3.31.6-linux-aarch64.sh --skip-license --prefix=/usr/local 

检查版本:

/usr/local/bin/cmake --version 

如果系统仍然找不到新版本,可临时加入 PATH:

export PATH=/usr/local/bin:$PATH hash -r cmake --version 

必要时可以加入 ~/.bashrc


7. 安装依赖并编译 OpenClaw

在项目目录执行:

cd ~/openclaw pnpm install pnpm build 

如果安装过程中出现原生模块编译问题,优先检查:

  • CMake 版本
  • build-essential 是否安装
  • pnpm 是否在 PATH 中

8. 配置模型 API

OpenClaw 通过 ~/.openclaw/openclaw.json 进行配置。

如果目录不存在,先创建:

mkdir -p ~/.openclaw nano ~/.openclaw/openclaw.json 

我使用阿里的Coding Plan,个人体验觉得挺不错的,速度快,模型也多,非广告!这部分配置教程可以参考阿里官方的教程
大模型服务平台百炼控制台


9. 配置 Gateway Token

这是本文里一个非常关键的坑。

OpenClaw 的架构不是“CLI 直接调用模型”,而是:

CLI / TUI / Logs ↓ Gateway ↓ Agent ↓ Model 

所以 CLI 其实是 Gateway 的客户端
既然是客户端连接服务端,就涉及认证。

为什么要加 token

如果只配置服务端 token,而没有配置客户端 token,就会出现:

unauthorized: gateway token mismatch 

因此需要让 gateway 服务端客户端连接配置 使用同一个 token。

通过 ~/.openclaw/openclaw.json 进行知道如下,推荐配置如下:

{ "gateway": { "mode": "local", "auth": { "mode": "token", "token": "Yours Token" }, "remote": { "token": "Yours Token" } } } 

解释

  • gateway.auth.token:Gateway 服务端认证 token
  • gateway.remote.token:CLI / TUI / logs 等客户端连接 Gateway 时使用的 token

这两个必须一致。


10. 启动 Gateway 服务

先安装 gateway service:

openclaw gateway install 

然后启动:

systemctl --user start openclaw-gateway.service 

检查状态:

openclaw gateway status 

正常情况下会看到类似输出:

Runtime: running RPC probe: ok Listening: 127.0.0.1:18789 

如果配置修改过,需要重启:

systemctl --user restart openclaw-gateway.service 

12. 验证 TUI 是否可用

如果配置正确,可以直接运行:

openclaw tui 

若成功,界面会显示已连接,并能直接与模型对话。

如果出现 token mismatch,基本就是 auth.tokenremote.token 不一致。


13. 配置飞书机器人

第一步:创建飞书应用

进入飞书开放平台https://open.feishu.cn/?lang=zh-CN,创建一个企业自建应用。

第二步:启用机器人能力

在应用后台启用机器人。

第二步:配置权限

在左侧目录树选择“开发配置 > 权限管理”,单击“批量导入/导出权限”按钮。

加入如下内容:

{ "scopes": { "tenant": [ "contact:contact.base:readonly", "docx:document:readonly", "im:chat:read", "im:chat:update", "im:message.group_at_msg:readonly", "im:message.p2p_msg:readonly", "im:message.pins:read", "im:message.pins:write_only", "im:message.reactions:read", "im:message.reactions:write_only", "im:message:readonly", "im:message:recall", "im:message:send_as_bot", "im:message:send_multi_users", "im:message:send_sys_msg", "im:message:update", "im:resource", "application:application:self_manage", "cardkit:card:write", "cardkit:card:read" ], "user": [ "contact:user.employee_id:readonly", "offline_access","base:app:copy", "base:field:create", "base:field:delete", "base:field:read", "base:field:update", "base:record:create", "base:record:delete", "base:record:retrieve", "base:record:update", "base:table:create", "base:table:delete", "base:table:read", "base:table:update", "base:view:read", "base:view:write_only", "base:app:create", "base:app:update", "base:app:read", "board:whiteboard:node:create", "board:whiteboard:node:read", "calendar:calendar:read", "calendar:calendar.event:create", "calendar:calendar.event:delete", "calendar:calendar.event:read", "calendar:calendar.event:reply", "calendar:calendar.event:update", "calendar:calendar.free_busy:read", "contact:contact.base:readonly", "contact:user.base:readonly", "contact:user:search", "docs:document.comment:create", "docs:document.comment:read", "docs:document.comment:update", "docs:document.media:download", "docs:document:copy", "docx:document:create", "docx:document:readonly", "docx:document:write_only", "drive:drive.metadata:readonly", "drive:file:download", "drive:file:upload", "im:chat.members:read", "im:chat:read", "im:message", "im:message.group_msg:get_as_user", "im:message.p2p_msg:get_as_user", "im:message.send_as_user", "im:message:readonly", "search:docs:read", "search:message", "space:document:delete", "space:document:move", "space:document:retrieve", "task:comment:read", "task:comment:write", "task:task:read", "task:task:write", "task:task:writeonly", "task:tasklist:read", "task:tasklist:write", "wiki:node:copy", "wiki:node:create", "wiki:node:move", "wiki:node:read", "wiki:node:retrieve", "wiki:space:read", "wiki:space:retrieve", "wiki:space:write_only" ] } }

在弹窗中确认权限无误后,单击“申请开通”按钮,完成操作。

第三步:发布应用

到此就可以回来Jetson去连接我们的飞书机器人了

第四步:配置 Feishu Channel

运行:

openclaw channels add 

选择:

Feishu / Lark 

然后输入:

  • App ID
  • App Secret

具体过程可以选项可以参考我的

到此就基本完成了openclaw与飞书机器人的连接了,但是要实现聊天还得再继续配置。

第五步:重启Gateway

openclaw gateway restart

第六步:配置事件与回调

选择:

使用长连接接收事件 

然后添加事件:

im.message.receive_v1 

这是机器人接收消息所必需的事件。

继续配置回调

添加回调

第七步:发布应用版本

这一步非常关键。(这里参考第三步)

很多时候飞书应用配置改了但机器人无效,就是因为没有发布版本

进入:

版本管理与发布 

创建版本并发布。

第八步:配置私聊飞书机器人

在飞书APP中找到开发者小助手

之后给机器人发送任何信息

将Pairing code复制然后在Jetson终端输入

openclaw pairing approve feishu NHMC7CRG

到此,基本就实现了在飞书中直接召唤我们边缘设备干活了,回到飞书,与我们小助手聊天即可。


14. 常见坑总结

坑 1:Jetson 上 CMake 版本过低

会导致依赖编译失败。

坑 2:没有配置 pnpm PATH

会导致全局命令或 UI 构建异常。

坑 3:误以为需要单独安装 Feishu 插件

源码版已经内置,不需要重复安装。

坑 4:没有配置 gateway.remote.token

会导致 CLI 连接 Gateway 时出现 token mismatch。

坑 5:App ID / App Secret 使用了旧应用凭证

这是我这次飞书始终接不通的根因。

坑 6:飞书应用修改后未发布版本

会导致机器人看似配置好了,但实际不生效。


15. 最终效果

完成上述配置后,可以实现:

  • 在 Jetson 上运行 OpenClaw Gateway
  • 接入自己的模型 API
  • 在飞书群中 @机器人
  • 机器人调用本地 Agent 并返回回复

这为后续扩展提供了很好的基础,例如:

  • 远程查询 Jetson 状态
  • 执行自动化任务
  • 调用机器人系统接口
  • 通过飞书统一管理实验设备

16. 总结

这次在 Jetson 上部署 OpenClaw 并接入飞书机器人的过程,整体并不算复杂,但有几个坑非常容易卡住:

  • ARM 平台的依赖编译问题
  • pnpm 环境变量问题
  • Gateway token 机制

只要把这些关键点处理好,OpenClaw + 飞书这套链路其实是很顺的。

如果你也想在 Jetson 上搭一个可远程交互的本地 Agent,这套方案很值得尝试。


预告一下,下一期我将更新一下好用的Skills,让我们边缘设备更好的给我们干活!

Read more

Llama-3.2-3B部署优化:ollama部署本地大模型+FlashAttention加速实测

Llama-3.2-3B部署优化:ollama部署本地大模型+FlashAttention加速实测 想在自己的电脑上跑一个聪明又好用的AI助手吗?今天,我们就来手把手教你,如何用最简单的方法,把Meta最新推出的Llama-3.2-3B模型部署到本地,并且通过一个叫FlashAttention的“加速神器”,让它跑得更快、更流畅。 你可能听说过ChatGPT,但那些在线服务要么收费,要么有网络限制。而Llama-3.2-3B是一个3B参数的开源模型,虽然个头比动辄几百B的“巨无霸”小,但在聊天、写作、总结等日常任务上表现非常出色,关键是它能在普通的个人电脑上流畅运行。我们将使用一个叫Ollama的工具来部署它,这比传统的复杂安装过程简单了十倍不止。 更棒的是,我们还会实测一个关键的加速技术——FlashAttention。简单来说,它能让模型在生成文字时,更高效地利用你的电脑硬件(尤其是显卡),从而显著提升推理速度。这篇文章,就是一份从零开始的完整指南,让你不仅能成功部署,还能体验到优化后的“飞一般”的感觉。 1. 准备工作:认识我们的工具和模型 在开始动手之前,我们先花几

开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)

开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)

一、前言     本篇文章将使用LLaMA-Factory去高效微调(命令和界面方式)QWen2.5系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。     QWen2系列模型微调: 开源模型应用落地-qwen2-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(八)https://charles.blog.ZEEKLOG.net/article/details/141391066 二、术语介绍 2.1. LoRA微调   &nb

知网 vs 维普 vs 万方:三大平台AIGC检测对比

知网 vs 维普 vs 万方:三大平台AIGC检测对比

知网 vs 维普 vs 万方:三大平台AIGC检测对比 TL;DR:知网最严格(准确率98.6%),维普对句式工整度敏感,万方相对宽松但在升级。同一篇论文在三个平台的AI率可能相差10-20%。选降AI工具时要考虑学校用的平台:知网用比话降AI效果最好,维普和万方用嘎嘎降AI性价比最高。 很多同学不知道的是,知网、维普、万方的AIGC检测算法完全不同。我见过一篇论文在知网显示AI率35%,在维普只有20%,在万方更是只有15%。所以在处理论文AI率之前,一定要先搞清楚学校用的是哪个平台。今天就详细对比一下三大平台的检测特点和应对策略。 三大平台检测特点 知网AIGC检测:最严格 知网用的是AIGC检测算法3.0版本,官方号称准确率高达98.6%,是目前最严格的平台。知网主要识别以下特征:句式模板化(比如「首先…其次…最后」这种套路)、高频词汇堆砌、逻辑结构固化、表达模式过于规整。换句话说,知网对「逻辑惯性」和「表达模式」

智创 AI 新视界 -- AIGC 背后的深度学习魔法:从原理到实践

智创 AI 新视界 -- AIGC 背后的深度学习魔法:从原理到实践

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实用的内容知识,还可以毫无拘束地畅所欲言,尽情分享自己独特的见解。我真诚地期待着你们的到来,愿我们能在这片小小的天地里共同成长,共同进步。💖💖💖 本博客的精华专栏: 1. 大数据新视界专栏系列:聚焦大数据,展技术应用,推动进步拓展新视野。 2. Java 大厂面试专栏系列:提供大厂面试的相关技巧和经验,助力求职。 3. Python 魅力之旅:探索数据与智能的奥秘专栏系列:走进 Python 的精彩天地,感受数据处理与智能应用的独特魅力。 4. Java 性能优化传奇之旅:铸就编程巅峰之路:如一把神奇钥匙,深度开启 JVM 等关键领域之门。丰富案例似璀璨繁星,引领你踏上编程巅峰的壮丽征程。 5. Java 虚拟机(