适配ESP-IDF v6.0编译 补充项目相关文档 * 修复16处头文件缺失、flash配置错误、WiFi断开原因码兼容问题 * 新增ESP-IDF v6.0迁移适配文档 * 更新变更日志,补充v1.0.0功能清单及v1.1.0版本规划 * 整理讨论记录,新增v6.0适配及国内大模型接入内容
This commit is contained in:
263
changelog.md
263
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` 添加 `<stdlib.h>`
|
||||
- `proxy/http_proxy.c` 添加 `<sys/time.h>`
|
||||
- `gateway/ws_server.c` 添加 `<stdint.h>`
|
||||
- 验证 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 <key>`:设置硅基流动API密钥
|
||||
- `set_siliconflow_url <url>`:设置硅基流动Base URL
|
||||
- `set_volcengine_key <key>`:设置火山方舟API密钥
|
||||
- `set_volcengine_url <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. 所有现有功能保持正常
|
||||
### 功能
|
||||
- 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 覆盖
|
||||
|
||||
82
docs/ESP-IDF-V6-MIGRATION.md
Normal file
82
docs/ESP-IDF-V6-MIGRATION.md
Normal file
@@ -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` | `<stdlib.h>` | `free()` |
|
||||
| `main/proxy/http_proxy.c` | `<sys/time.h>` | `struct timeval` |
|
||||
| `main/gateway/ws_server.c` | `<stdint.h>` | `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** 键再插线进入下载模式
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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 <string.h>
|
||||
|
||||
static const char *TAG = "bus";
|
||||
|
||||
@@ -7,11 +7,14 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#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";
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include "esp_log.h"
|
||||
#include "esp_http_server.h"
|
||||
#include "cJSON.h"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <stdio.h>
|
||||
#include "esp_log.h"
|
||||
#include "esp_err.h"
|
||||
#include "esp_http_client.h"
|
||||
|
||||
static const char *TAG = "llm_provider";
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "tools/tool_gpio.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "esp_log.h"
|
||||
#include "cJSON.h"
|
||||
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
189
taolun.md
189
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` | `<stdlib.h>` | `free()` |
|
||||
| `proxy/http_proxy.c` | `<sys/time.h>` | `struct timeval` |
|
||||
| `gateway/ws_server.c` | `<stdint.h>` | `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密钥的安全存储和传输
|
||||
### 待解决问题
|
||||
1. 认证方式差异确认
|
||||
2. 模型名称规范
|
||||
3. 工具调用格式兼容性验证
|
||||
|
||||
Reference in New Issue
Block a user