Files
mimiclaw/taolun.md
titor 6983a1f1ba feat: 添加编译时模块开关配置
通过 sdkconfig.defaults 选择性启用/禁用模块,减少固件体积:

新增模块开关:
- CONFIG_MIMI_CHAN_TELEGRAM (默认 n)
- CONFIG_MIMI_CHAN_FEISHU (默认 y)
- CONFIG_MIMI_TOOL_WEB_SEARCH (默认 y)
- CONFIG_MIMI_TOOL_GPIO (默认 n)
- CONFIG_MIMI_WS_SERVER (默认 y)
- CONFIG_MIMI_WIFI_ONBOARD (默认 y)
- CONFIG_MIMI_OTA (默认 n)

技术实现:
- CMakeLists.txt 条件编译源文件
- 头文件使用 static inline stub
- CLI 命令和工具注册也支持条件编译

消除 Telegram 未配置时的 5 秒轮询警告日志
2026-04-03 20:15:26 +08:00

8.2 KiB
Raw Blame History

讨论记录


讨论ESP-IDF v6.0 编译适配

日期2026-03-31
目标:解决 ESP-IDF v6.0 编译失败问题,完成固件烧录

问题清单

1. Flash 大小配置错误

  • 错误:分区表需要 16MB但 sdkconfig 配置为 2MB
  • 修复sdkconfigCONFIG_ESPTOOLPY_FLASHSIZE 改为 16MB

2. WiFi 断开原因码未定义

  • 错误WIFI_REASON_ASSOC_EXPIRE 等符号在 v6.0 中未定义
  • 修复wifi_manager.c 中所有 reason code 添加 #ifdef 保护

3. CMakeLists.txt 缺少源文件

  • 错误llm_provider.c 未加入编译列表,导致链接错误
  • 修复:添加 ota/ota_manager.c 到 SRCS

4. 头文件缺失(共 16 处)

文件 缺失头文件 原因
cli/serial_cli.c llm/llm_provider.h llm_provider_set_api_key
llm/llm_provider.c esp_http_client.h esp_http_client_set_header
bus/message_bus.c freertos/FreeRTOS.h, freertos/queue.h xQueueCreate, QueueHandle_t
wifi/wifi_manager.c esp_event.h esp_event_handler_instance_register
wifi/wifi_manager.c freertos/FreeRTOS.h, freertos/task.h, freertos/event_groups.h xEventGroupCreate, vTaskDelay
ota/ota_manager.c esp_system.h esp_restart
channels/telegram/telegram_bot.c freertos/FreeRTOS.h, freertos/task.h xTaskCreatePinnedToCore, vTaskDelay
tools/tool_registry.c <stdlib.h> free()
proxy/http_proxy.c <sys/time.h> struct timeval
gateway/ws_server.c <stdint.h> uint8_t

ESP-IDF v6.0 API 兼容性验证

以下 API 在 v6.0 中仍然存在,无需修改:

  • esp_spiffs_info()
  • esp_websocket_client_send_bin()
  • esp_tls_set_conn_sockfd() / esp_tls_set_conn_state()
  • esp_console_new_repl_uart() / esp_console_new_repl_usb_serial_jtag()
  • esp_https_ota() + esp_https_ota_config_t
  • esp_wifi_set_config()

烧录说明

ESP32-S3 使用 USB 口(内置 USB Serial/JTAG 控制器)烧录:

idf.py -p COMx flash monitor
  • 插 USB 口(标记为 USB),不是 UART 口
  • 如遇连接失败,按住 BOOT 键再插线进入下载模式

讨论:增加国内大模型厂商接入

日期2026-03-31
目标:为 MimiClaw 增加硅基流动和火山方舟(豆包模型)接入

项目现状

  • 当前支持Anthropic (Claude)、OpenAI (GPT)
  • 运行平台ESP32-S3纯 C 语言
  • 交互方式Telegram 机器人

国内厂商 API 兼容性

  • 硅基流动OpenAI 兼容Base URL https://api.siliconflow.cn/v1
  • 火山方舟OpenAI 兼容Base URL https://ark.cn-beijing.volces.com/api/v3

实现方案

由于两者都提供 OpenAI 兼容 API可复用现有 OpenAI 集成代码,只需:

  1. 修改 Base URL
  2. 调整认证方式Bearer Token
  3. 处理模型名称规范

待解决问题

  1. 认证方式差异确认
  2. 模型名称规范
  3. 工具调用格式兼容性验证

讨论:时区设置功能

日期2026-04-01
目标:为 MimiClaw 添加可配置的时区支持,默认改为中国时区

背景

  • 原默认时区为 PST8PDT,M3.2.0,M11.1.0(太平洋时间)
  • 需要支持用户自定义时区特别是中国用户UTC+8
  • 交互方式从 Telegram 改为飞书

实现方案

存储方式

  • NVS 存储:使用 system_config namespacekey 为 timezone
  • Build-time 默认值MIMI_TIMEZONE 改为 "CST-8"
  • 优先级NVS 值 > Build-time 值

CLI 命令

set_timezone <TZ>      # 例如: set_timezone CST-8 或 set_timezone Asia/Shanghai
timezone_show          # 显示当前时区配置和本地时间

LLM 工具

  • 新增 set_timezone 工具LLM 可通过对话设置时区
  • 支持 POSIX 格式(CST-8)和城市名(Asia/Shanghai
  • 内置 18 个城市名映射表

改动文件

文件 操作
main/mimi_config.h 默认时区改为 CST-8,添加 MIMI_NVS_KEY_TIMEZONE
main/tools/tool_set_timezone.h 新建
main/tools/tool_set_timezone.c 新建
main/tools/tool_registry.c include 新头文件 + 注册工具
main/cli/serial_cli.c 添加 set_timezone / timezone_show 命令
main/CMakeLists.txt 添加 tool_set_timezone.c 到 SRCS

支持的时区格式

  • POSIX: CST-8, JST-9, EST5EDT,M3.2.0,M11.1.0, UTC0
  • 城市名: Asia/Shanghai, Asia/Tokyo, America/New_York 等 18 个预设

讨论:编译时模块开关(模块化配置)

日期2026-04-03
分支feature/module-config
目标:通过编译时配置选择性禁用不需要的模块,减少固件体积,消除未配置模块的警告日志

问题背景

  1. Task Watchdog 超时ESP32-S3 运行一天后触发看门狗超时,怀疑是设计问题
  2. Telegram 警告日志:用户使用飞书但未配置 Telegram控制台每 5 秒打印 "No bot token configured"
  3. 代码冗余Telegram、OpenAI 接口等未使用的模块仍然编译进固件

用户需求

用户希望:

  1. 通过编译选项禁用不需要的模块(如 Telegram
  2. 从源码层面直接过滤不用的组件,减少代码体积
  3. 禁用模块后不触发警告日志

实现方案

方案选择:编译时条件编译(方案 02

优点

  • 直接减少 Flash 占用
  • 零 RAM 占用,不创建任务
  • 从源头消除警告日志
  • 实现简单

缺点

  • 切换模块需要重新编译

技术实现

1. 配置文件:sdkconfig.defaults
// Channel Modules
CONFIG_MIMI_CHAN_TELEGRAM=n      // 默认禁用
CONFIG_MIMI_CHAN_FEISHU=y        // 默认启用

// Tool Modules
CONFIG_MIMI_TOOL_WEB_SEARCH=y
CONFIG_MIMI_TOOL_GPIO=n

// Optional Modules
CONFIG_MIMI_WS_SERVER=y
CONFIG_MIMI_WIFI_ONBOARD=y
CONFIG_MIMI_OTA=n
2. CMakeLists.txt条件编译源文件
if(CONFIG_MIMI_CHAN_TELEGRAM)
    list(APPEND srcs "channels/telegram/telegram_bot.c")
endif()
3. 头文件 stub调用方无感知
// telegram_bot.h
#ifdef CONFIG_MIMI_CHAN_TELEGRAM
esp_err_t telegram_bot_init(void);
esp_err_t telegram_bot_start(void);
#else
static inline esp_err_t telegram_bot_init(void) { return ESP_OK; }
static inline esp_err_t telegram_bot_start(void) { return ESP_OK; }
#endif

修改文件清单

文件 修改内容
sdkconfig.defaults 添加模块开关配置
main/CMakeLists.txt 条件编译源文件
main/channels/telegram/telegram_bot.h 添加 stub
main/channels/feishu/feishu_bot.h 添加 stub
main/gateway/ws_server.h 添加 stub
main/onboard/wifi_onboard.h 添加 stub
main/ota/ota_manager.h 添加 stub
main/tools/tool_web_search.h 添加 stub
main/tools/tool_gpio.h 添加 stub
main/tools/tool_registry.c 条件注册工具
main/cli/serial_cli.c 条件注册 CLI 命令
main/mimi.c 条件调用模块
AGENTS.md 更新文档

模块依赖关系

  • Channel 模块telegram、feishu

    • mimi.c 调用init/start
    • outbound_dispatch_task 调用send
    • CLI 命令也需要条件编译
  • Tool 模块web_search、gpio

    • tool_registry.c 调用(注册 + 执行)
    • CLI 命令也需要条件编译
  • 可选模块ws_server、wifi_onboard、ota

    • mimi.c 调用
    • wifi_onboard 禁用时需特殊处理(不能进入 captive portal

注意事项

  1. OTA 模块:目前未初始化,但已编译
  2. 工具描述中的渠道提示cron_add 工具描述中提到 telegram可保留只是描述不影响功能
  3. get_time 工具:使用 telegram.org 代理获取时间(技术原因,不属于 telegram_bot 模块)

预期效果

禁用项 效果
Telegram 不编译 telegram_bot.c无 5 秒警告,节省约 15KB+ Flash
GPIO 不编译 tool_gpio.c无 gpio_* 工具,节省约 5KB Flash
WebSocket 不编译 ws_server.c节省约 10KB Flash
WiFi Onboard 不能进入 captive portal 模式,需其他方式配置 WiFi