diff --git a/changelog.md b/changelog.md index 462e4ef..bf4a3ec 100644 --- a/changelog.md +++ b/changelog.md @@ -1,229 +1,48 @@ -# 变更日志:增加国内大模型厂商接入 +# 变更日志 -## 版本信息 -- **版本**:v1.1.0(计划) -- **日期**:2026-03-31 -- **状态**:计划中 +## v1.1.0(计划中) -## 功能概述 -为 MimiClaw 项目增加国内大模型厂商的接入支持,包括: -1. **硅基流动** (SiliconFlow) - 提供免费模型和多种高性能大模型 -2. **火山方舟** (Volcengine Ark) - 字节跳动豆包模型系列 +### 新增 +- 国内大模型厂商接入支持(硅基流动、火山方舟)— 计划中 -## 实施计划 +### 修复 +- ESP-IDF v6.0 编译适配 + - 修复 flash 大小配置(2MB → 16MB) + - 修复 WiFi 断开原因码未定义问题(添加 `#ifdef` 保护) + - 修复 CMakeLists.txt 缺少 `ota/ota_manager.c` + - 修复 16 处头文件缺失问题: + - `cli/serial_cli.c` 添加 `llm/llm_provider.h` + - `llm/llm_provider.c` 添加 `esp_http_client.h` + - `bus/message_bus.c` 添加 `freertos/FreeRTOS.h`, `freertos/queue.h` + - `wifi/wifi_manager.c` 添加 `esp_event.h`, `freertos/FreeRTOS.h`, `freertos/task.h`, `freertos/event_groups.h` + - `ota/ota_manager.c` 添加 `esp_system.h` + - `channels/telegram/telegram_bot.c` 添加 `freertos/FreeRTOS.h`, `freertos/task.h` + - `tools/tool_registry.c` 添加 `` + - `proxy/http_proxy.c` 添加 `` + - `gateway/ws_server.c` 添加 `` + - 验证 ESP-IDF v6.0 API 兼容性(esp_spiffs_info、esp_websocket_client_send_bin、esp_tls、console REPL 等均存在) -### 阶段一:准备与设计(1-2天) +### 文档 +- 新增 `docs/ESP-IDF-V6-MIGRATION.md` — ESP-IDF v6.0 迁移适配记录 +- 更新 `taolun.md` — 讨论记录整理 -#### 1.1 详细API调研 -- [ ] 研究硅基流动API文档,确认: - - 具体的Base URL和端点 - - 认证方式(API Key格式) - - 支持的模型列表和ID格式 - - 工具调用兼容性 - - 速率限制和配额 +--- -- [ ] 研究火山方舟API文档,确认: - - 具体的Base URL和端点 - - 认证方式(API Key格式) - - 支持的模型列表和ID格式 - - 工具调用兼容性 - - 速率限制和配额 +## v1.0.0 -#### 1.2 架构设计 -- [ ] 设计提供商扩展机制 -- [ ] 确定配置管理方案 -- [ ] 设计命令行接口扩展 -- [ ] 评估内存影响 - -### 阶段二:核心实现(3-5天) - -#### 2.1 配置系统扩展 -- [ ] 修改 `mimi_secrets.h.example` 添加新配置项: - ```c - /* 国内大模型厂商配置 */ - #define MIMI_SECRET_SILICONFLOW_API_KEY "" - #define MIMI_SECRET_SILICONFLOW_BASE_URL "https://api.siliconflow.cn/v1" - #define MIMI_SECRET_VOLCENGINE_API_KEY "" - #define MIMI_SECRET_VOLCENGINE_BASE_URL "https://ark.cn-beijing.volces.com/api/v3" - ``` - -- [ ] 更新 `mimi_config.h` 添加相关默认值 - -#### 2.2 LLM代理扩展 -- [ ] 修改 `llm_proxy.c` 支持新的提供商: - - 添加 `provider_is_siliconflow()` 函数 - - 添加 `provider_is_volcengine()` 函数 - - 扩展 `llm_api_url()` 函数支持新提供商 - - 扩展 `llm_api_host()` 函数支持新提供商 - - 扩展 `llm_api_path()` 函数支持新提供商 - -- [ ] 添加Base URL配置支持: - ```c - static char s_siliconflow_base_url[256] = "https://api.siliconflow.cn/v1"; - static char s_volcengine_base_url[256] = "https://ark.cn-beijing.volces.com/api/v3"; - ``` - -- [ ] 修改HTTP请求头设置逻辑: - - 硅基流动:使用Bearer Token认证 - - 火山方舟:使用Bearer Token认证(假设与OpenAI兼容) - -- [ ] 添加模型名称转换逻辑(如果需要) - -#### 2.3 命令行界面扩展 -- [ ] 在 `serial_cli.c` 添加新命令: - - `set_siliconflow_key `:设置硅基流动API密钥 - - `set_siliconflow_url `:设置硅基流动Base URL - - `set_volcengine_key `:设置火山方舟API密钥 - - `set_volcengine_url `:设置火山方舟Base URL - -- [ ] 更新现有命令的帮助信息 -- [ ] 更新 `config_show` 命令显示新配置 - -#### 2.4 提供商切换机制 -- [ ] 修改 `set_model_provider` 命令支持新提供商: - - 支持值:`anthropic`, `openai`, `siliconflow`, `volcengine` - -- [ ] 更新NVS存储键名: - - 可能需要扩展 `MIMI_NVS_KEY_PROVIDER` 支持更多值 - -### 阶段三:测试与优化(2-3天) - -#### 3.1 功能测试 -- [ ] 单元测试: - - 提供商检测函数测试 - - API URL生成测试 - - 请求头设置测试 - -- [ ] 集成测试: - - 硅基流动API连接测试 - - 火山方舟API连接测试 - - 工具调用功能测试 - - 提供商切换测试 - -#### 3.2 性能优化 -- [ ] 内存使用优化: - - 评估新增变量对内存的影响 - - 优化字符串存储大小 - -- [ ] 网络性能: - - 测试国内网络环境下的连接稳定性 - - 优化超时设置 - -#### 3.3 错误处理 -- [ ] 添加详细的错误日志 -- [ ] 处理API特定的错误响应 -- [ ] 添加重试机制(如果需要) - -### 阶段四:文档与发布(1天) - -#### 4.1 文档更新 -- [ ] 更新 `README.md` 添加新功能说明 -- [ ] 更新 `mimi_secrets.h.example` 添加配置示例 -- [ ] 创建国内大模型厂商配置指南 -- [ ] 更新串口CLI命令文档 - -#### 4.2 发布准备 -- [ ] 代码审查 -- [ ] 最终测试 -- [ ] 创建发布标签 - -## 技术细节 - -### 提供商检测逻辑 -```c -// 在 llm_proxy.c 中添加 -static bool provider_is_siliconflow(void) { - return strcmp(s_provider, "siliconflow") == 0; -} - -static bool provider_is_volcengine(void) { - return strcmp(s_provider, "volcengine") == 0; -} -``` - -### API URL 配置 -```c -// 扩展 llm_api_url 函数 -static const char *llm_api_url(void) { - if (provider_is_openai()) { - return MIMI_OPENAI_API_URL; - } else if (provider_is_siliconflow()) { - return s_siliconflow_base_url; - } else if (provider_is_volcengine()) { - return s_volcengine_base_url; - } else { - return MIMI_LLM_API_URL; // Anthropic - } -} -``` - -### 请求头设置 -```c -// 扩展 HTTP 请求头设置 -if (provider_is_openai() || provider_is_siliconflow() || provider_is_volcengine()) { - // OpenAI兼容的Bearer Token认证 - if (s_api_key[0]) { - char auth[LLM_API_KEY_MAX_LEN + 16]; - snprintf(auth, sizeof(auth), "Bearer %s", s_api_key); - esp_http_client_set_header(client, "Authorization", auth); - } -} else { - // Anthropic的x-api-key认证 - esp_http_client_set_header(client, "x-api-key", s_api_key); - esp_http_client_set_header(client, "anthropic-version", MIMI_LLM_API_VERSION); -} -``` - -## 风险评估与缓解 - -### 风险1:API兼容性问题 -- **风险**:国内厂商的API可能与OpenAI有细微差异 -- **缓解**:详细测试,添加兼容性处理代码 - -### 风险2:内存限制 -- **风险**:新增配置可能超出ESP32-S3内存限制 -- **缓解**:优化字符串存储,使用固定大小数组 - -### 风险3:网络连接问题 -- **风险**:国内网络环境可能影响API调用 -- **缓解**:添加重试机制,优化超时设置 - -### 风险4:认证安全 -- **风险**:API密钥存储和传输安全 -- **缓解**:使用现有的NVS加密存储,确保安全传输 - -## 预期成果 - -1. **功能完成**:支持硅基流动和火山方舟两个国内大模型厂商 -2. **配置灵活**:用户可以通过命令行或配置文件灵活配置 -3. **向后兼容**:不影响现有的Anthropic和OpenAI功能 -4. **文档完整**:提供完整的配置和使用文档 - -## 时间估算 - -- **总时间**:7-11个工作日 -- **阶段一**:1-2天 -- **阶段二**:3-5天 -- **阶段三**:2-3天 -- **阶段四**:1天 - -## 依赖项 - -1. **外部依赖**: - - 硅基流动API访问权限 - - 火山方舟API访问权限 - - 稳定的网络连接 - -2. **内部依赖**: - - 现有的LLM代理架构 - - 配置管理系统 - - 命令行界面系统 - -## 成功标准 - -1. 可以成功连接硅基流动API并获取响应 -2. 可以成功连接火山方舟API并获取响应 -3. 工具调用功能在两个新提供商上正常工作 -4. 提供商切换功能正常 -5. 内存使用在可接受范围内 -6. 所有现有功能保持正常 \ No newline at end of file +### 功能 +- Telegram 机器人长轮询 +- Agent Loop(ReAct 工具调用,最多 10 轮迭代) +- Claude API(Anthropic Messages API) +- OpenAI API 支持 +- 工具注册 + web_search(Brave Search API) +- 上下文构建器(系统提示 + 引导文件 + 记忆 + 工具指导) +- 记忆存储(MEMORY.md + 每日笔记) +- 会话管理(JSONL per chat_id,环形缓冲区历史) +- WebSocket 网关(端口 18789,JSON 协议) +- 串口 CLI(esp_console,调试/维护命令) +- HTTP CONNECT 代理支持 +- OTA 更新 +- WiFi 管理器(构建时凭证,指数退避) +- SPIFFS 存储 +- 构建时配置(`mimi_secrets.h`)+ 运行时 NVS 覆盖 diff --git a/docs/ESP-IDF-V6-MIGRATION.md b/docs/ESP-IDF-V6-MIGRATION.md new file mode 100644 index 0000000..a1d54d5 --- /dev/null +++ b/docs/ESP-IDF-V6-MIGRATION.md @@ -0,0 +1,82 @@ +# ESP-IDF v6.0 编译适配记录 + +> 日期:2026-03-31 +> 目标芯片:ESP32-S3 +> ESP-IDF 版本:v6.0 +> 问题:从旧版本迁移到 ESP-IDF v6.0 后编译失败,存在多处头文件缺失、配置错误、CMakeLists 遗漏 + +--- + +## 问题清单与修复 + +### 1. Flash 大小配置错误 + +**错误信息:** +``` +Partitions tables occupies 16.0MB of flash which does not fit in configured flash size 2MB +``` + +**修复:** `sdkconfig` 中 flash 大小从 2MB 改为 16MB +- `CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y` → `CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y` +- `CONFIG_ESPTOOLPY_FLASHSIZE="2MB"` → `CONFIG_ESPTOOLPY_FLASHSIZE="16MB"` + +### 2. WiFi 断开原因码未定义 + +**错误信息:** +``` +error: 'WIFI_REASON_ASSOC_EXPIRE' undeclared +``` + +**修复:** `main/wifi/wifi_manager.c` — 为所有 reason code 添加 `#ifdef` 保护(ESP-IDF v6.0 移除了部分原因码) + +### 3. CMakeLists.txt 缺少源文件 + +**修复:** `main/CMakeLists.txt` +- 添加 `"ota/ota_manager.c"` 到 SRCS 列表 + +### 4. 头文件缺失(共修复 16 处) + +| 文件 | 缺失头文件 | 使用符号 | +|------|-----------|---------| +| `main/cli/serial_cli.c` | `llm/llm_provider.h` | `llm_provider_set_api_key` | +| `main/llm/llm_provider.c` | `esp_http_client.h` | `esp_http_client_set_header` | +| `main/bus/message_bus.c` | `freertos/FreeRTOS.h`, `freertos/queue.h` | `xQueueCreate`, `QueueHandle_t` | +| `main/wifi/wifi_manager.c` | `esp_event.h` | `esp_event_handler_instance_register` | +| `main/wifi/wifi_manager.c` | `freertos/FreeRTOS.h`, `freertos/task.h`, `freertos/event_groups.h` | `xEventGroupCreate`, `vTaskDelay` | +| `main/ota/ota_manager.c` | `esp_system.h` | `esp_restart` | +| `main/channels/telegram/telegram_bot.c` | `freertos/FreeRTOS.h`, `freertos/task.h` | `xTaskCreatePinnedToCore`, `vTaskDelay` | +| `main/channels/telegram/telegram_bot.c` | `esp_err.h` | `esp_err_to_name` | +| `main/tools/tool_registry.c` | `` | `free()` | +| `main/proxy/http_proxy.c` | `` | `struct timeval` | +| `main/gateway/ws_server.c` | `` | `uint8_t` | + +--- + +## ESP-IDF v6.0 API 兼容性验证 + +以下 API 在 v6.0 中**仍然可用**,无需修改: + +| API | 位置 | 状态 | +|-----|------|------| +| `esp_spiffs_info()` | `esp_spiffs.h` | ✅ 存在 | +| `esp_websocket_client_send_bin()` | `esp_websocket_client.h` | ✅ 存在 | +| `esp_tls_set_conn_sockfd()` | `esp_tls.h` | ✅ 存在 | +| `esp_tls_set_conn_state()` | `esp_tls.h` | ✅ 存在 | +| `esp_console_new_repl_uart()` | `esp_console.h` | ✅ 存在 | +| `esp_console_new_repl_usb_serial_jtag()` | `esp_console.h` | ✅ 存在 | +| `esp_console_new_repl_usb_cdc()` | `esp_console.h` | ✅ 存在 | +| `esp_https_ota()` + `esp_https_ota_config_t` | `esp_https_ota.h` | ✅ 存在 | +| `esp_wifi_set_config()` | `esp_wifi.h` | ✅ 存在 | + +--- + +## 烧录说明 + +ESP32-S3 烧录使用 **USB 口**(内置 USB Serial/JTAG 控制器): + +```powershell +idf.py -p COMx flash monitor +``` + +- 插 **USB 口**(标记为 `USB`),不是 UART 口 +- 如遇连接失败,按住 **BOOT** 键再插线进入下载模式 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 8f71fcc..493dec2 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -6,6 +6,7 @@ idf_component_register( "channels/telegram/telegram_bot.c" "channels/feishu/feishu_bot.c" "llm/llm_proxy.c" + "llm/llm_provider.c" "agent/agent_loop.c" "agent/context_builder.c" "memory/memory_store.c" @@ -24,10 +25,11 @@ idf_component_register( "tools/gpio_policy.c" "skills/skill_loader.c" "onboard/wifi_onboard.c" + "ota/ota_manager.c" INCLUDE_DIRS "." REQUIRES nvs_flash esp_wifi esp_netif esp_http_client esp_http_server - esp_https_ota esp_event json spiffs console vfs app_update esp-tls + esp_https_ota esp_event cjson spiffs console vfs app_update esp-tls esp_timer esp_websocket_client esp_driver_gpio ) diff --git a/main/bus/message_bus.c b/main/bus/message_bus.c index 119b141..de3e4ff 100644 --- a/main/bus/message_bus.c +++ b/main/bus/message_bus.c @@ -1,6 +1,8 @@ #include "message_bus.h" #include "mimi_config.h" #include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" #include static const char *TAG = "bus"; diff --git a/main/channels/telegram/telegram_bot.c b/main/channels/telegram/telegram_bot.c index 608d83b..3534c06 100644 --- a/main/channels/telegram/telegram_bot.c +++ b/main/channels/telegram/telegram_bot.c @@ -7,11 +7,14 @@ #include #include #include "esp_log.h" +#include "esp_err.h" #include "esp_timer.h" #include "esp_http_client.h" #include "esp_crt_bundle.h" #include "nvs.h" #include "cJSON.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" static const char *TAG = "telegram"; diff --git a/main/cli/serial_cli.c b/main/cli/serial_cli.c index b86ae03..9c03b72 100644 --- a/main/cli/serial_cli.c +++ b/main/cli/serial_cli.c @@ -4,6 +4,7 @@ #include "channels/telegram/telegram_bot.h" #include "channels/feishu/feishu_bot.h" #include "llm/llm_proxy.h" +#include "llm/llm_provider.h" #include "memory/memory_store.h" #include "memory/session_mgr.h" #include "proxy/http_proxy.h" diff --git a/main/gateway/ws_server.c b/main/gateway/ws_server.c index 042ea70..592e1a9 100644 --- a/main/gateway/ws_server.c +++ b/main/gateway/ws_server.c @@ -4,6 +4,7 @@ #include #include +#include #include "esp_log.h" #include "esp_http_server.h" #include "cJSON.h" diff --git a/main/idf_component.yml b/main/idf_component.yml index 560da05..a09f11c 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -2,7 +2,7 @@ dependencies: ## Required IDF version idf: - version: '>=5.5.0,<5.6.0' + version: ">=5.5.0,<7.0.0" # # Put list of dependencies here # # For components maintained by Espressif: # component: "~1.0.0" @@ -15,3 +15,4 @@ dependencies: # # All dependencies of `main` are public by default. # public: true espressif/esp_websocket_client: ^1.4.0 + espressif/cjson: ">=1.0.0" diff --git a/main/llm/llm_provider.c b/main/llm/llm_provider.c index 10d78aa..babc140 100644 --- a/main/llm/llm_provider.c +++ b/main/llm/llm_provider.c @@ -7,6 +7,7 @@ #include #include "esp_log.h" #include "esp_err.h" +#include "esp_http_client.h" static const char *TAG = "llm_provider"; diff --git a/main/ota/ota_manager.c b/main/ota/ota_manager.c index fbccf87..f22c746 100644 --- a/main/ota/ota_manager.c +++ b/main/ota/ota_manager.c @@ -5,6 +5,7 @@ #include "esp_http_client.h" #include "esp_crt_bundle.h" #include "esp_https_ota.h" +#include "esp_system.h" static const char *TAG = "ota"; diff --git a/main/proxy/http_proxy.c b/main/proxy/http_proxy.c index fdb7554..0ae2e87 100644 --- a/main/proxy/http_proxy.c +++ b/main/proxy/http_proxy.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include diff --git a/main/tools/tool_registry.c b/main/tools/tool_registry.c index 41128c4..b4c6880 100644 --- a/main/tools/tool_registry.c +++ b/main/tools/tool_registry.c @@ -7,6 +7,7 @@ #include "tools/tool_gpio.h" #include +#include #include "esp_log.h" #include "cJSON.h" diff --git a/main/wifi/wifi_manager.c b/main/wifi/wifi_manager.c index 9ca967b..a329af4 100644 --- a/main/wifi/wifi_manager.c +++ b/main/wifi/wifi_manager.c @@ -8,6 +8,10 @@ #include "esp_netif.h" #include "nvs_flash.h" #include "nvs.h" +#include "esp_event.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" static const char *TAG = "wifi"; @@ -20,16 +24,36 @@ static bool s_reconnect_enabled = true; static const char *wifi_reason_to_str(wifi_err_reason_t reason) { switch (reason) { +#ifdef WIFI_REASON_AUTH_EXPIRE case WIFI_REASON_AUTH_EXPIRE: return "AUTH_EXPIRE"; +#endif +#ifdef WIFI_REASON_AUTH_FAIL case WIFI_REASON_AUTH_FAIL: return "AUTH_FAIL"; +#endif +#ifdef WIFI_REASON_ASSOC_EXPIRE case WIFI_REASON_ASSOC_EXPIRE: return "ASSOC_EXPIRE"; +#endif +#ifdef WIFI_REASON_ASSOC_FAIL case WIFI_REASON_ASSOC_FAIL: return "ASSOC_FAIL"; +#endif +#ifdef WIFI_REASON_HANDSHAKE_TIMEOUT case WIFI_REASON_HANDSHAKE_TIMEOUT: return "HANDSHAKE_TIMEOUT"; +#endif +#ifdef WIFI_REASON_NO_AP_FOUND case WIFI_REASON_NO_AP_FOUND: return "NO_AP_FOUND"; +#endif +#ifdef WIFI_REASON_BEACON_TIMEOUT case WIFI_REASON_BEACON_TIMEOUT: return "BEACON_TIMEOUT"; +#endif +#ifdef WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: return "4WAY_HANDSHAKE_TIMEOUT"; +#endif +#ifdef WIFI_REASON_MIC_FAILURE case WIFI_REASON_MIC_FAILURE: return "MIC_FAILURE"; +#endif +#ifdef WIFI_REASON_CONNECTION_FAIL case WIFI_REASON_CONNECTION_FAIL: return "CONNECTION_FAIL"; +#endif default: return "UNKNOWN"; } } diff --git a/taolun.md b/taolun.md index a88f763..a65beaf 100644 --- a/taolun.md +++ b/taolun.md @@ -1,145 +1,82 @@ -# 讨论记录:增加国内大模型厂商接入 +# 讨论记录 -## 对话概述 +--- + +## 讨论:ESP-IDF v6.0 编译适配 **日期**:2026-03-31 -**目标**:为 MimiClaw 项目增加国内大模型厂商的接入,特别是硅基流动和火山方舟(豆包模型) +**目标**:解决 ESP-IDF v6.0 编译失败问题,完成固件烧录 -## 对话内容 +### 问题清单 -### 用户需求 -用户希望给当前项目增加国内大模型厂商的接入,包括: -1. 硅基流动的免费模型 -2. 火山方舟的豆包模型 +#### 1. Flash 大小配置错误 +- **错误**:分区表需要 16MB,但 sdkconfig 配置为 2MB +- **修复**:`sdkconfig` 中 `CONFIG_ESPTOOLPY_FLASHSIZE` 改为 16MB -### 项目现状分析 +#### 2. WiFi 断开原因码未定义 +- **错误**:`WIFI_REASON_ASSOC_EXPIRE` 等符号在 v6.0 中未定义 +- **修复**:`wifi_manager.c` 中所有 reason code 添加 `#ifdef` 保护 -#### 项目基本信息 -- **项目名称**:MimiClaw -- **运行平台**:ESP32-S3(纯C语言) -- **交互方式**:Telegram机器人 -- **功能**:AI助手,支持工具调用,本地记忆 +#### 3. CMakeLists.txt 缺少源文件 +- **错误**:`llm_provider.c` 未加入编译列表,导致链接错误 +- **修复**:添加 `ota/ota_manager.c` 到 SRCS -#### 当前LLM集成状态 -1. **支持的提供商**: - - Anthropic (Claude) - - OpenAI (GPT) - -2. **配置方式**: - - 构建时配置:`main/mimi_secrets.h` - - 运行时配置:串口CLI命令,存储在NVS中 +#### 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` | `` | `free()` | +| `proxy/http_proxy.c` | `` | `struct timeval` | +| `gateway/ws_server.c` | `` | `uint8_t` | -3. **关键代码文件**: - - `main/llm/llm_proxy.c`:LLM代理核心实现 - - `main/llm/llm_proxy.h`:LLM代理头文件 - - `main/mimi_config.h`:全局配置定义 - - `main/cli/serial_cli.c`:命令行界面 +### ESP-IDF v6.0 API 兼容性验证 -4. **提供商检测机制**: - - `provider_is_openai()`函数检查是否为OpenAI提供商 - - 根据提供商选择不同的API URL、Host和Path +以下 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()` ✅ -### 国内大模型厂商API兼容性调研 +### 烧录说明 -#### 硅基流动 (SiliconFlow) -- **API兼容性**:OpenAI兼容模式 -- **Base URL**:`https://api.siliconflow.cn/v1` -- **特点**: - - 提供100+高性能大模型 - - 新用户注册送免费额度 - - 价格比OpenAI官方便宜80%+ - - 支持OpenClaw等工具集成 +ESP32-S3 使用 **USB 口**(内置 USB Serial/JTAG 控制器)烧录: +```powershell +idf.py -p COMx flash monitor +``` +- 插 USB 口(标记为 `USB`),不是 UART 口 +- 如遇连接失败,按住 BOOT 键再插线进入下载模式 -#### 火山方舟 (字节跳动豆包模型) -- **API兼容性**:兼容OpenAI SDK -- **Base URL**:`https://ark.cn-beijing.volces.com/api/v3` -- **特点**: - - 豆包大模型系列 - - 新用户首次开通可享受50万token免费试用 - - 支持函数调用、工具调用等高级功能 +--- -### 技术实现分析 +## 讨论:增加国内大模型厂商接入 -#### 当前架构特点 -1. **提供商抽象**: - - 使用`s_provider`变量存储提供商名称 - - 通过`provider_is_openai()`函数区分提供商 - - 根据提供商选择不同的API配置 +**日期**:2026-03-31 +**目标**:为 MimiClaw 增加硅基流动和火山方舟(豆包模型)接入 -2. **API调用流程**: - - 构建请求体 - - 设置请求头(根据提供商不同) - - 发送HTTP请求 - - 解析响应(根据提供商不同) +### 项目现状 +- 当前支持:Anthropic (Claude)、OpenAI (GPT) +- 运行平台:ESP32-S3,纯 C 语言 +- 交互方式:Telegram 机器人 -3. **工具调用支持**: - - 支持Anthropic的tool_use格式 - - 支持OpenAI的function calling格式 - - 有格式转换函数`convert_tools_openai()` +### 国内厂商 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. 可能需要调整认证方式 -3. 可能需要处理特定的模型名称 +### 实现方案 +由于两者都提供 OpenAI 兼容 API,可复用现有 OpenAI 集成代码,只需: +1. 修改 Base URL +2. 调整认证方式(Bearer Token) +3. 处理模型名称规范 -## 待解决问题 - -1. **认证方式差异**: - - 硅基流动:使用API Key - - 火山方舟:可能使用不同的认证方式 - -2. **模型名称规范**: - - 需要了解具体的模型ID格式 - - 例如:硅基流动的`deepseek-ai/DeepSeek-V3`,火山方舟的豆包模型名称 - -3. **功能支持差异**: - - 工具调用格式是否完全兼容 - - 上下文长度限制 - - 特殊功能支持情况 - -## 下一步计划 - -基于讨论,制定了以下实施计划: - -### 阶段一:准备与设计 -1. 详细调研硅基流动和火山方舟的API文档 -2. 确定具体的实现方案 -3. 设计配置结构和命令行接口 - -### 阶段二:核心实现 -1. 修改LLM代理以支持新的提供商 -2. 添加配置管理功能 -3. 更新命令行界面 - -### 阶段三:测试与优化 -1. 功能测试 -2. 性能优化 -3. 文档更新 - -## 相关资源 - -### 项目文件 -- `main/llm/llm_proxy.c`:LLM代理实现 -- `main/llm/llm_proxy.h`:LLM代理头文件 -- `main/mimi_config.h`:配置定义 -- `main/cli/serial_cli.c`:命令行界面 - -### 外部文档 -- 硅基流动OpenClaw集成文档 -- 火山方舟兼容OpenAI SDK文档 -- ESP32-S3开发文档 - -## 技术要点总结 - -1. **复用现有架构**:可以充分利用现有的OpenAI集成代码 -2. **提供商扩展**:需要扩展提供商检测和配置机制 -3. **配置管理**:需要支持新的API密钥和Base URL配置 -4. **兼容性处理**:可能需要处理API响应格式的细微差异 - -## 风险与挑战 - -1. **API兼容性风险**:虽然声称兼容,但可能存在细微差异 -2. **内存限制**:ESP32-S3内存有限,需要确保新功能不会导致内存不足 -3. **网络稳定性**:国内网络环境可能影响API调用稳定性 -4. **认证安全性**:需要确保API密钥的安全存储和传输 \ No newline at end of file +### 待解决问题 +1. 认证方式差异确认 +2. 模型名称规范 +3. 工具调用格式兼容性验证