欢迎光临
我们一直在努力

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

本项目基于github上的开源项目MimiClaw进行改造,新增飞书通信与GLM的导入,结合xiaozhi-esp32小智机器人完成基础控制的实验。


在这里插入图片描述

📋 目录

  • 项目概述
  • 核心特性
  • 工作原理
  • 快速开始
  • 配置说明
  • CLI命令详解
  • 记忆系统
  • 工具系统
  • 定时任务
  • 心跳服务
  • 其他功能
  • 架构设计
  • 飞书集成

  • 项目概述

    基本信息

    项目说明
    名称 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 提供商

    提供商模型切换方式
    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 或代理 国内需要代理

    软件需求

    组件版本获取方式
    ESP-IDF v5.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* # macOS
    ls /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 配置 */
    #define MIMI_SECRET_WIFI_SSID "你的WiFi名"
    #define MIMI_SECRET_WIFI_PASS "你的WiFi密码"

    /* Telegram Bot */
    #define MIMI_SECRET_TG_TOKEN "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"

    /* 飞书机器人 */
    #define MIMI_SECRET_FEISHU_APP_ID "cli_xxxxxxxxxxxxxx"
    #define MIMI_SECRET_FEISHU_APP_SECRET "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    /* LLM 配置 */
    #define MIMI_SECRET_API_KEY "sk-ant-api03-xxxxx"
    #define MIMI_SECRET_MODEL "claude-opus-4-5"
    #define MIMI_SECRET_MODEL_PROVIDER "anthropic" // "anthropic" | "openai" | "zhipu"

    /* 搜索 API(可选) */
    #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" // "http" | "socks5"

    CLI 命令详解

    配置命令(运行时修改)

    命令参数说明示例
    wifi_set SSID 密码 wifi_set MySSID MyPassword
    set_tg_token Bot Token set_tg_token 123456:ABC…
    set_api_key API 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_key API Key set_search_key BSA…
    config_show 查看所有配置(脱敏)
    config_reset 清除 NVS,恢复编译时默认值

    调试命令(系统运维)

    命令说明输出示例
    wifi_status WiFi 连接状态 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 1 AI 处理

    优势:

    • 网络和 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 协议

    连接 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 用户消息
    response AI 回复
    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

    适用场景

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

    附录

    相关链接

    • MimiClaw原项目主页: memovai/mimiclaw
    • 飞书集成项目: ZhiqiangHe/mimiclaw_esp32
    • ESP-IDF 文档: docs.espressif.com
    • 飞书开放平台: open.feishu.cn

    开发者资源

    • 架构文档: docs/ARCHITECTURE.md
    • TODO 列表: docs/TODO.md
    • 贡献指南: docs/CONTRIBUTE.md

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

    赞(0)
    未经允许不得转载:171主机测评 » 【拥抱AI】详解MimiClaw上扩展飞书与GLM来改造xiaozhi-esp32的过程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址