跳到主要内容
MimiClaw 基于 ESP32 扩展飞书与 GLM 集成方案详解 | 极客日志
C AI 算法
MimiClaw 基于 ESP32 扩展飞书与 GLM 集成方案详解 综述由AI生成 介绍基于 ESP32-S3 硬件的 MimiClaw 项目改造方案。该项目采用纯 C 语言实现,在保留原有功能基础上,新增飞书通信支持与智谱 AI GLM 模型接入。核心特性包括本地持久记忆、多平台消息处理(Telegram/飞书)、工具调用(搜索/定时任务)及双核架构优化。文章详细说明了硬件需求、软件环境配置、CLI 命令行操作、记忆系统存储结构以及飞书 WebSocket 集成流程,展示了如何在资源受限的微控制器上部署轻量级 AI Agent 应用。
清酒独酌 发布于 2026/4/6 更新于 2026/5/24 28 浏览MimiClaw 基于 ESP32 扩展飞书与 GLM 集成方案详解
本项目基于 GitHub 上的开源项目 MimiClaw 进行改造,新增飞书通信与 GLM 的导入,结合 xiaozhi-esp32 小智机器人完成基础控制的实验。
项目概述
基本信息
技术特点
✅ 纯 C 实现 - 没有 Linux,没有 Node.js,没有臃肿依赖
✅ 轻量级 - 运行在拇指大小的芯片上
✅ 易用性 - 通过 Telegram/飞书 发消息即可使用
✅ 持久记忆 - 跨重启不会遗忘
✅ 本地存储 - 所有数据存在本地 Flash
核心特性
1. 多平台支持
平台 状态 说明 Telegram ✅ 完整支持 原生支持 飞书 ✅ 新增支持 通过小智服务端集成
2. 多 LLM 提供商
Anthropic Claude 运行时切换 OpenAI GPT 运行时切换 智谱 AI GLM 运行时切换
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 或代理 国内需要代理
软件需求
安装步骤
git clone https://github.com/memovai/mimiclaw.git
cd mimiclaw
idf.py set-target esp32s3
cp main/mimi_secrets.h.example main/mimi_secrets.h
idf.py fullclean && idf.py build
ls /dev/cu.usb*
ls /dev/ttyACM*
idf.py -p PORT flash monitor
⚠️ 重要提示
✅ 使用标有 USB 的接口(原生 USB Serial/JTAG)
❌ 不要使用标有 COM 的接口(外部 UART 桥接)
插错接口会导致烧录/监控失败
配置说明
配置层次 优先级(从高到低):
1. 运行时配置(NVS Flash) - CLI 命令设置
2. 编译时配置(mimi_secrets.h)- 编译时默认值
配置文件
mimi_secrets.h(编译时配置)
#define MIMI_SECRET_WIFI_SSID "你的 WiFi 名"
#define MIMI_SECRET_WIFI_PASS "你的 WiFi 密码"
#define MIMI_SECRET_TG_TOKEN "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
#define MIMI_SECRET_FEISHU_APP_ID "cli_xxxxxxxxxxxxxx"
#define MIMI_SECRET_FEISHU_APP_SECRET "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define MIMI_SECRET_API_KEY "sk-ant-api03-xxxxx"
#define MIMI_SECRET_MODEL "claude-opus-4-5"
#define MIMI_SECRET_MODEL_PROVIDER "anthropic"
#define MIMI_SECRET_SEARCH_KEY "tvly-dev-xxxxx"
#define MIMI_SECRET_SEARCH_PROVIDER "tavily"
#define MIMI_SECRET_PROXY_HOST "192.168.1.83"
#define MIMI_SECRET_PROXY_PORT "7897"
#define MIMI_SECRET_PROXY_TYPE "http"
CLI 命令详解
配置命令(运行时修改) 命令 参数 说明 示例 wifi_setSSID 密码 wifi_set MySSID MyPassword- set_tg_tokenBot Token set_tg_token 123456:ABC...- set_api_keyAPI Key set_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 Key set_search_key BSA...- config_show- 查看所有配置(脱敏) - config_reset- 清除 NVS,恢复编译时默认值 -
调试命令(系统运维) 命令 说明 输出示例 wifi_statusWiFi 连接状态 Connected to MySSID, IP: 192.168.1.100heap_info剩余内存 Free heap: 245760 bytessession_list列出所有会话 Session 12345: 10 messagessession_clear删除会话 session_clear 12345memory_read查看记忆 显示 MEMORY.md 内容 memory_write写入记忆 memory_write "记住:我喜欢咖啡"heartbeat_trigger触发心跳 手动执行心跳检查 cron_start启动 cron 立即启动定时任务 restart重启设备 重启 ESP32
使用场景 mimi> wifi_set NewWiFi NewPassword
WiFi connecting...
WiFi connected!
IP: 192.168 .1 .100
mimi> set_model_provider openai
Provider switched to OpenAI
mimi> set_model gpt-4 o
Model set to gpt-4 o
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] - 已完成任务,忽略
空行或标题 - 忽略
使用场景
- [ ] 每周一提醒我准备周报
- [ ] 每天 9 点提醒我喝水
- [ ] 每月 1 号提醒我交房租
心跳服务每 30 分钟检查一次
发现未完成任务时,自动通知 AI
AI 会主动提醒用户
其他功能
1. WebSocket 网关 特性 说明 端口 18789 用途 局域网内 WebSocket 客户端连接 协议 WebSocket 消息格式 JSON
2. OTA 更新 特性 说明 方式 WiFi 远程刷固件 优势 无需 USB 连接 安全 HTTPS 传输,签名验证
新固件上传到服务器
↓
ESP32 检测到更新
↓
下载固件
↓
验证签名
↓
写入 Flash
↓
重启
3. 双核架构 核心 用途 优先级 Core 0 网络 I/O 高 Core 1 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 API HTTPS → 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 协议 ws: //127.0.0.1:28000/xiaozhi /v1/ ?c lient=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 LLM Anthropic、OpenAI、智谱 AI 搜索 Tavity、Brave Search API
适用场景
🏠 家庭助理 - 智能家居控制
💼 办公助理 - 日程管理、信息查询
🎓 学习助手 - 知识问答、笔记整理
🤖 开发助手 - 代码生成、技术问答
🎮 娱乐机器人 - 聊天、游戏互动
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online