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

249 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 讨论记录
---
## 讨论ESP-IDF v6.0 编译适配
**日期**2026-03-31
**目标**:解决 ESP-IDF v6.0 编译失败问题,完成固件烧录
### 问题清单
#### 1. Flash 大小配置错误
- **错误**:分区表需要 16MB但 sdkconfig 配置为 2MB
- **修复**`sdkconfig``CONFIG_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 控制器)烧录:
```powershell
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`
```c
// 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条件编译源文件
```cmake
if(CONFIG_MIMI_CHAN_TELEGRAM)
list(APPEND srcs "channels/telegram/telegram_bot.c")
endif()
```
##### 3. 头文件 stub调用方无感知
```c
// 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 |