【拥抱AI】详解MimiClaw上扩展飞书与GLM来改造xiaozhi-esp32的过程

【拥抱AI】详解MimiClaw上扩展飞书与GLM来改造xiaozhi-esp32的过程
本项目基于github上的开源项目MimiClaw进行改造,新增飞书通信与GLM的导入,结合xiaozhi-esp32小智机器人完成基础控制的实验。

在这里插入图片描述

📋 目录

  1. 项目概述
  2. 核心特性
  3. 工作原理
  4. 快速开始
  5. 配置说明
  6. CLI命令详解
  7. 记忆系统
  8. 工具系统
  9. 定时任务
  10. 心跳服务
  11. 其他功能
  12. 架构设计
  13. 飞书集成

项目概述

基本信息

项目说明
名称MimiClaw
硬件ESP32-S3 开发板(16MB Flash + 8MB PSRAM)
成本约 $5
功耗0.5W
运行时间24/7
许可证MIT
GitHub源项目memovai/mimiclaw
改造后的项目ZhiqiangHe/mimiclaw_esp32

技术特点

  • 纯 C 实现 - 没有 Linux,没有 Node.js,没有臃肿依赖
  • 轻量级 - 运行在拇指大小的芯片上
  • 易用性 - 通过 Telegram/飞书 发消息即可使用
  • 持久记忆 - 跨重启不会遗忘
  • 本地存储 - 所有数据存在本地 Flash

核心特性

1. 多平台支持

平台状态说明
Telegram✅ 完整支持原生支持
飞书✅ 新增支持通过小智服务端集成

2. 多 LLM 提供商

提供商模型切换方式
AnthropicClaude运行时切换
OpenAIGPT运行时切换
智谱AIGLM运行时切换

3. 工具调用

  • 🌐 网页搜索 - Brave Search API
  • 📅 定时任务 - AI 自主创建 cron 任务
  • 💾 记忆管理 - 读写长期记忆
  • 时间获取 - HTTP 获取当前时间

工作原理

消息处理流程

┌─────────────┐ │ 用户消息 │ │ (飞书/Telegram)│ └──────┬──────┘ │ ↓ ┌─────────────────────────────────┐ │ 消息接收层 │ │ - Telegram Bot API │ │ - 飞书 WebSocket (小智) │ └──────┬──────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ 消息路由层 │ │ - 统一消息格式 │ │ - 通道识别 │ └──────┬──────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ Agent 核心 (大脑) │ │ - 会话管理 │ │ - 上下文构建 │ │ - LLM 调用 │ │ - 工具编排 │ └──────┬──────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ 工具执行层 │ │ - 网页搜索 │ │ - 记忆读写 │ │ - 定时任务 │ └──────┬──────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ 回复生成层 │ │ - LLM 生成回复 │ │ - 格式化输出 │ └──────┬──────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ 消息发送层 │ │ - Telegram Bot API │ │ - 飞书 API (小智) │ └──────┬──────────────────────┘ │ ↓ ┌─────────────┐ │ 用户收到 │ └───────────┘ 

核心组件

Agent 核心(大脑)
会话管理 ├── 会话创建/切换 ├── 会话历史维护 └── 上下文窗口管理 LLM 调用层 ├── OpenAI 接口适配 ├── Anthropic Claude 接口适配 ├── 智谱AI 接口适配 ├── 模型选择与切换 └── API 密钥管理 工具调用编排 ├── 工具注册管理 ├── 工具参数解析 ├── 工具执行调度 └── 执行结果反馈 

快速开始

硬件需求

组件说明备注
ESP32-S3 开发板16MB Flash + 8MB PSRAM如小智 AI 开发板,约 ¥30
USB Type-C 数据线用于供电和烧录-
网络环境WiFi 或代理国内需要代理

软件需求

组件版本获取方式
ESP-IDFv5.5+官方文档
飞书 App ID/Secret-open.feishu.cn 获取

安装步骤

# 1. 克隆项目git clone https://github.com/memovai/mimiclaw.git cd mimiclaw # 2. 设置目标芯片 idf.py set-target esp32s3 # 3. 配置密钥(复制模板)cp main/mimi_secrets.h.example main/mimi_secrets.h # 4. 编辑配置文件# 编辑 main/mimi_secrets.h,填入你的密钥# 5. 编译 idf.py fullclean && idf.py build # 6. 烧录# 查找串口ls /dev/cu.usb* # macOSls /dev/ttyACM* # Linux# 烧录并监控 idf.py -p PORT flash monitor 

⚠️ 重要提示

USB 接口选择

  • ✅ 使用标有 USB 的接口(原生 USB Serial/JTAG)
  • ❌ 不要使用标有 COM 的接口(外部 UART 桥接)
  • 插错接口会导致烧录/监控失败

配置说明

配置层次

优先级(从高到低): 1. 运行时配置(NVS Flash) - CLI 命令设置 2. 编译时配置(mimi_secrets.h)- 编译时默认值 

配置文件

mimi_secrets.h(编译时配置)
/* WiFi 配置 */#defineMIMI_SECRET_WIFI_SSID"你的WiFi名"#defineMIMI_SECRET_WIFI_PASS"你的WiFi密码"/* Telegram Bot */#defineMIMI_SECRET_TG_TOKEN"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"/* 飞书机器人 */#defineMIMI_SECRET_FEISHU_APP_ID"cli_xxxxxxxxxxxxxx"#defineMIMI_SECRET_FEISHU_APP_SECRET"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/* LLM 配置 */#defineMIMI_SECRET_API_KEY"sk-ant-api03-xxxxx"#defineMIMI_SECRET_MODEL"claude-opus-4-5"#defineMIMI_SECRET_MODEL_PROVIDER"anthropic"// "anthropic" | "openai" | "zhipu"/* 搜索 API(可选) */#defineMIMI_SECRET_SEARCH_KEY"tvly-dev-xxxxx"#defineMIMI_SECRET_SEARCH_PROVIDER"tavily"/* 代理配置(国内用户) */#defineMIMI_SECRET_PROXY_HOST"192.168.1.83"#defineMIMI_SECRET_PROXY_PORT"7897"#defineMIMI_SECRET_PROXY_TYPE"http"// "http" | "socks5"

CLI 命令详解

配置命令(运行时修改)

命令参数说明示例
wifi_setSSID 密码wifi_set MySSID MyPassword
set_tg_tokenBot Tokenset_tg_token 123456:ABC...
set_api_keyAPI Keyset_api_key sk-ant-api03-...
set_model_provider提供商set_model_provider openai
set_model模型名set_model gpt-4o
set_proxy主机 端口set_proxy 192.168.1.83 7897
clear_proxy-清除代理
set_search_keyAPI Keyset_search_key BSA...
config_show-查看所有配置(脱敏)
config_reset-清除 NVS,恢复编译时默认值

调试命令(系统运维)

命令说明输出示例
wifi_statusWiFi 连接状态Connected to MySSID, IP: 192.168.1.100
heap_info剩余内存Free heap: 245760 bytes
session_list列出所有会话Session 12345: 10 messages
session_clear删除会话session_clear 12345
memory_read查看记忆显示 MEMORY.md 内容
memory_write写入记忆memory_write "记住:我喜欢咖啡"
heartbeat_trigger触发心跳手动执行心跳检查
cron_start启动 cron立即启动定时任务
restart重启设备重启 ESP32

使用场景

场景 1:更换 WiFi

mimi> wifi_set NewWiFi NewPassword WiFi connecting... WiFi connected! IP: 192.168.1.100 

场景 2:切换 LLM 提供商

mimi> set_model_provider openai Provider switched to OpenAI mimi> set_model gpt-4o Model set to gpt-4o 

场景 3:配置代理

mimi> set_proxy 192.168.1.83 7897 Proxy configured: 192.168.1.83:7897 mimi> wifi_status Connected to MySSID via proxy 

记忆系统

存储结构

文件位置说明
SOUL.md/spiffs/config/机器人人设
USER.md/spiffs/config/用户信息
MEMORY.md/spiffs/memory/长期记忆
HEARTBEAT.md/spiffs/待办清单
cron.json/spiffs/定时任务
tg_12345.jsonl/spiffs/sessions/聊天记录

文件内容示例

SOUL.md(机器人人设)
I am MimiClaw, a personal AI assistant running on an ESP32-S3 microcontroller. Personality: - Helpful and friendly - Concise and to the point - Curious and eager to learn Values: - Accuracy over speed - User privacy and safety - Transparency in actions 
USER.md(用户信息)
# User Profile - Name: 张三 - Language: Chinese - Timezone: Asia/Shanghai 
MEMORY.md(长期记忆)
# Long-term Memory - 用户喜欢喝咖啡 - 用户的工作时间是 9:00-18:00 - 用户有一个 5 岁的孩子 

记忆操作

写入记忆

mimi> memory_write "记住:用户生日是 5月20日" Memory written to MEMORY.md 

读取记忆

mimi> memory_read # Long-term Memory - 用户生日是 5月20日 - 用户喜欢喝咖啡 

工具系统

工具列表

工具名功能API
web_search网页搜索Brave Search API
get_current_time获取当前时间HTTP API
cron_add创建定时任务内部 cron
cron_list列出任务内部 cron
cron_remove删除任务内部 cron

工具调用流程

用户消息 ↓ Agent 解析意图 ↓ 判断是否需要工具 ↓ 调用工具(如 web_search) ↓ 工具执行并返回结果 ↓ Agent 整合结果 ↓ 生成回复 ↓ 发送给用户 

工具示例

网页搜索

用户:今天北京天气怎么样? ↓ Agent 调用 web_search("北京天气") ↓ 返回:北京今天晴,气温 15-25℃ ↓ Agent 生成回复:北京今天天气不错,晴,气温在 15 到 25 度之间。 

定时任务

用户:每天早上 8 点提醒我喝水 ↓ Agent 调用 cron_add("0 8 * * *", "提醒用户喝水") ↓ 任务保存到 cron.json ↓ 每天 8 点自动触发 

定时任务

Cron 表达式

* * * * * * │ │ │ │ │ │ │ │ │ │ └───── 星期几 (0-6, 0=周日) │ │ │ └─────── 月份 (1-12) │ │ └───────── 日期 (1-31) │ └─────────── 小时 (0-23) └───────────── 分钟 (0-59) 

常用示例

表达式说明
0 8 * * *每天 8:00
0 */6 * * *每 6 小时
0 9 * * 1-5工作日 9:00
*/30 * * * *每 30 分钟
0 0 1 * *每月 1 号 0:00

Cron 命令

命令说明
cron_add创建定时或一次性任务
cron_list列出所有任务
cron_remove按任务 ID 删除

心跳服务

工作原理

每 30 分钟 ↓ 读取 HEARTBEAT.md ↓ 检查待办事项 ↓ 发现未完成任务 ↓ 注入到 Agent 循环 ↓ AI 自动处理 

HEARTBEAT.md 格式

# 待办清单 - [ ] 回复客户邮件 - [ ] 准备周报 - [x] 已完成:购买咖啡豆 

规则

  • - [ ] - 未完成任务,会触发 AI 处理
  • - [x] - 已完成任务,忽略
  • 空行或标题 - 忽略

使用场景

场景:定期提醒

# HEARTBEAT.md - [ ] 每周一提醒我准备周报 - [ ] 每天 9 点提醒我喝水 - [ ] 每月 1 号提醒我交房租 

效果

  • 心跳服务每 30 分钟检查一次
  • 发现未完成任务时,自动通知 AI
  • AI 会主动提醒用户

其他功能

1. WebSocket 网关

特性说明
端口18789
用途局域网内 WebSocket 客户端连接
协议WebSocket
消息格式JSON

使用场景

  • Web 界面控制
  • 第三方应用集成
  • 调试和监控

2. OTA 更新

特性说明
方式WiFi 远程刷固件
优势无需 USB 连接
安全HTTPS 传输,签名验证

更新流程

新固件上传到服务器 ↓ ESP32 检测到更新 ↓ 下载固件 ↓ 验证签名 ↓ 写入 Flash ↓ 重启 

3. 双核架构

核心用途优先级
Core 0网络 I/O
Core 1AI 处理

优势

  • 网络和 AI 处理并行
  • 提高响应速度
  • 避免阻塞

4. HTTP 代理

特性说明
协议HTTP CONNECT 隧道
类型HTTP / SOCKS5
用途适配受限网络

架构设计

模块树状图

mimiclaw/ │ ├── 🎯 核心应用层 │ ├── 📍 入口与初始化 │ │ ├── app_main() - 程序入口 │ │ ├── 系统初始化 - WiFi、NVS、SPIFFS │ │ └── 任务调度 - FreeRTOS 任务创建 │ │ │ ├── 🤖 Agent 核心 (核心大脑) │ │ ├── 会话管理 │ │ ├── LLM 调用层 │ │ ├── 工具调用编排 │ │ └── 消息处理循环 │ │ │ └── 🛠️ 工具模块 │ ├── 内置工具 │ └── 自定义工具扩展点 │ ├── 📡 通信层 │ ├── 📱 Telegram 客户端 │ ├── 📱 飞书客户端 │ └── 🌐 网络基础层 │ ├── 💾 存储与记忆层 │ ├── 📝 长期记忆 │ ├── ⚙️ 配置管理 │ └── 💾 会话持久化 │ ├── 🖥️ 用户交互层 │ ├── ⌨️ 串口 CLI │ └── 💬 消息路由 │ ├── 🏗️ 系统服务层 │ ├── ⏰ 定时任务 │ ├── 📊 系统监控 │ └── 🔄 电源管理 │ └── 📁 数据文件 ├── 📄 spiffs_data/ └── 🔧 配置模板 

核心模块详解

1. Agent 核心
子模块功能关键 API
会话管理维护多轮对话上下文session_create(), session_switch()
LLM 调用层与 OpenAI/Claude/智谱通信llm_call(), llm_set_provider()
工具编排解析 Function Calling 并执行工具tool_register(), tool_execute()
消息循环主事件循环agent_feed_message()
2. 通信层
子模块功能关键流程
Bot API 封装调用 Telegram/飞书 Bot APIHTTPS → JSON → 消息对象
消息转换协议适配Telegram/飞书格式 ↔ 内部格式
连接管理保持在线轮询 / WebSocket
3. 存储与记忆层
子模块功能存储位置
长期记忆MEMORY.md 管理SPIFFS 文件系统
配置管理NVS 键值存储Flash NVS 分区
会话持久化会话历史保存RAM + Flash 缓存
4. 串口 CLI
命令类型示例命令功能
配置命令wifi_set, set_api_key修改运行时配置
调试命令heap_info, session_list查看系统状态
管理命令restart, memory_write系统管理

飞书集成

集成架构

┌─────────────┐ │ 飞书用户 │ └──────┬──────┘ │ ↓ ┌─────────────────────────────────┐ │ 飞书开放平台 │ │ - 消息事件订阅 │ │ - Bot API │ └──────┬──────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ 小智服务端 │ │ - 飞书 SDK 集成 │ │ - WebSocket 服务 │ │ - 消息转发 │ └──────┬──────────────────────┘ │ WebSocket ↓ ┌─────────────────────────────────┐ │ ESP32 (MimiClaw) │ │ - WebSocket 客户端 │ │ - Agent 核心 │ │ - 消息处理 │ └─────────────────────────────────┘ 

消息处理流程

1. 飞书消息接收
飞书 SDK (WebSocket) ↓ 收到消息事件 ↓ lark.JSON.marshal(data) ↓ 转换为字典 ↓ self._message_handler(event_dict) ↓ 传递给集成层 
2. 飞书集成处理
_handle_feishu_message(event_dict) ↓ 提取消息内容 ↓ 遍历所有连接的客户端 ↓ self.forwarder.forward_to_client(message, client_handler) ↓ 转发消息 
3. 消息转换
forward_to_client(message, client_handler) ↓ self.converter.feishu_to_client(feishu_message) ↓ 检查是否是飞书事件消息 ↓ 提取 message、sender 等信息 ↓ 解析消息内容(content 字段是 JSON 字符串) ↓ 转换为内部格式 ↓ 发送到 Agent 

WebSocket 协议

连接 URI

ws://127.0.0.1:28000/xiaozhi/v1/?client=mimiclaw 

消息格式

{"type":"message","content":"用户消息内容","chat_id":"oc_xxxxxxxxx","sender_id":"ou_xxxxxxxxx"}

事件类型

类型说明
hello握手消息
welcome欢迎消息
message用户消息
responseAI 回复
ping心跳检测
pong心跳响应

优势对比

特性直接接入飞书 API通过小智服务端
HTTPS 请求复杂度
Token 管理需要自己实现服务端处理
事件订阅需要 Webhook服务端处理
ESP32 资源占用
维护成本

总结

项目亮点

轻量级 - 纯 C 实现,无臃肿依赖
多平台 - 支持 Telegram 和飞书
多 LLM - 支持 Anthropic、OpenAI、智谱AI
工具调用 - ReAct Agent 模式
持久记忆 - 本地存储,跨重启不丢失
定时任务 - AI 自主创建和管理
心跳服务 - 主动型助理
OTA 更新 - 远程固件升级
双核架构 - 网络和 AI 并行处理

技术栈

层级技术
硬件ESP32-S3 (Xtensa LX7)
固件ESP-IDF v5.5+
语言C (FreeRTOS)
通信WiFi、HTTP、WebSocket
存储SPIFFS、NVS
LLMAnthropic、OpenAI、智谱AI
搜索Tavity、Brave Search API

适用场景

  • 🏠 家庭助理 - 智能家居控制
  • 💼 办公助理 - 日程管理、信息查询
  • 🎓 学习助手 - 知识问答、笔记整理
  • 🤖 开发助手 - 代码生成、技术问答
  • 🎮 娱乐机器人 - 聊天、游戏互动

附录

相关链接

开发者资源


文档版本: 1.0
最后更新: 2026-03-05

Read more

openclaw 对接完飞书群机器人配置踩坑记:消息不回、Gateway 断开问题排查

openclaw 对接完飞书群机器人配置踩坑记:消息不回、Gateway 断开问题排查

前言 用 OpenClaw 配飞书机器人,踩了两个坑:群消息不回、Gateway 总是断开。排查了好一阵子,总算搞定了,记录一下希望能帮到遇到同样问题的朋友。 发现问题 飞书消息不回复 在飞书群里 @ 了机器人,完全没反应。一开始以为是网络不好或者机器人没上线,但状态显示明明是连接着的,这就奇怪了。 Gateway 频繁断开 每次改完配置跑 openclaw gateway restart,或者根本什么都没干,Gateway 说断就断。再想启动就报错,必须跑一遍 openclaw doctor --fix 重新安装才能用。太影响使用了。 查看原因 飞书机器人 ID 搞错了 翻日志看到这么一句: receive events or callbacks through persistent connection only available in

前端虚拟列表深度拆解

虚拟列表是为了解决什么问题 真实项目中的痛点: 想象一个后台系统:用户列表:10 万条;订单列表:20 万条;日志列表:百万级;表格里还有:多列、复杂 DOM、hover、操作按钮、状态标签 直接 map 渲染: data.map(item => <Row key={item.id} />) 会遇到:首次渲染卡死、滚动严重掉帧、内存暴涨和浏览器直接崩 根因只有一个:DOM 太多,浏览器不是怕 JS,浏览器最怕的是成千上万个 DOM 节点 总的来说虚拟列表就是只渲染可视区域内的列表项,而其余的用占位高度“假装存在” 虚拟列表的核心思想 我总结主要要理解这四点: 1.可视区域(

Selenium Web 自动化测试脚本总结

Selenium Web 自动化测试脚本总结

Selenium Web 自动化测试脚本总结 Web 自动化的本质,是模拟人在浏览器里的操作行为:打开浏览器、访问页面、定位元素、输入/点击、做断言验证。Selenium 之所以常用,是因为它把这些动作抽象成了一套稳定的 API,再配合浏览器驱动(WebDriver)就能把“测试步骤”变成“可重复执行的脚本”。 下面按“工程上最常遇到的问题链路”来讲:先跑通 → 再定位稳 → 再等待稳 → 再窗口/弹窗/上传/截图/参数全覆盖。测试概念相关内容会简要收束在文末。 1)先搞清三件套:Selenium + 浏览器驱动 + 浏览器怎么协作 来看 Web 自动化落地需要的三件套: * 浏览器:最终执行动作的地方 * 浏览器驱动(WebDriver):把自动化指令翻译成浏览器能理解的操作 * Selenium 脚本:你写的

Webots R2023b 完整安装配置教程

Webots R2023b 完整安装配置教程 声明:本教程由豆包、ChatGPT等AI工具协助完成。 本教程讲解如何安装 Python3、包管理器 Micromamba、必要依赖包(如 opencv-python),以及 Webots 仿真软件,并完成 Micromamba Python 环境与 MATLAB 地址的配置,适用于 Windows、macOS 双系统。 一、前置说明 1. 适用场景:需要使用 Webots 进行仿真开发,同时依赖 Python 进行脚本编写、OpenCV 进行图像处理,通过 Micromamba 管理 Python 环境,并关联 MATLAB 路径用于联合开发。 2. 版本约定(兼容性最优): * Python: