diff --git a/docs/superpowers/plans/2026-05-08-multi-llm-plan.md b/docs/superpowers/plans/2026-05-08-multi-llm-plan.md new file mode 100644 index 0000000..c3dd552 --- /dev/null +++ b/docs/superpowers/plans/2026-05-08-multi-llm-plan.md @@ -0,0 +1,461 @@ +# 多模型并行调用功能实现计划 + +**Goal:** 支持同时配置3个LLM模型,主页面同时显示3个结果框,发送时并行调用所有已配置的模型 + +**Architecture:** 配置页面同时显示3组模型配置;主页结果显示区改为水平布局3个卡片;发送时并行调用所有模型 + +**Tech Stack:** Kotlin, Android, OkHttp, Coroutine, SharedPreferences + +--- + +## 任务1: 修改 SecondActivity.kt 数据结构 + +**Files:** +- Modify: `flomo-ai/app/src/main/java/com/example/flomo_ai/SecondActivity.kt` + +- [ ] **Step 1: 修改 LLMConfig 类,添加 enabled 字段** + +在第650行 `data class LLMConfig` 中添加: +```kotlin +data class LLMConfig( + val name: String, + val baseUrl: String, + val apiKey: String, + val model: String, + val enabled: Boolean = true // 新增:是否启用 +) +``` + +- [ ] **Step 2: 修改 SettingsData 类** + +在第663行 `data class SettingsData` 中,将 `llmConfigs` 类型改为固定3个元素的列表: +```kotlin +data class SettingsData( + val llmConfigs: List, + val selectedLlmIndex: Int?, + val headerConfigs: List?, + val promptConfigs: List?, + val buttonConfigs: List?, + val noteApiConfig: NoteApiConfig?, + val llmConfig: LLMConfig? = null +) +``` + +- [ ] **Step 3: 提交** + +```bash +git add flomo-ai/app/src/main/java/com/example/flomo_ai/SecondActivity.kt +git commit -m "feat: add enabled field to LLMConfig" +``` + +--- + +## 任务2: 修改 activity_second.xml 布局 + +**Files:** +- Modify: `flomo-ai/app/src/main/res/layout/activity_second.xml` + +- [ ] **Step 1: 将现有卡片内容包装为可复用的 LinearLayout** + +保留第一组配置,作为模板。新增2组相同的结构。 + +每组配置需要唯一ID: +- 第一组: etModelName1, etBaseUrl1, etApiKey1, btnToggleApiKey1, etModel1, btnTestConnection1, tvTestStatus1 +- 第二组: etModelName2, etBaseUrl2, etApiKey2, btnToggleApiKey2, etModel2, btnTestConnection2, tvTestStatus2 +- 第三组: etModelName3, etBaseUrl3, etApiKey3, btnToggleApiKey3, etModel3, btnTestConnection3, tvTestStatus3 + +布局结构: +```xml + + + + + + + + + + + + + + + + + +``` + +- [ ] **Step 2: 提交** + +```bash +git add flomo-ai/app/src/main/res/layout/activity_second.xml +git commit -m "feat: add 3 model config cards layout" +``` + +--- + +## 任务3: 修改 SecondActivity.kt 逻辑 + +**Files:** +- Modify: `flomo-ai/app/src/main/java/com/example/flomo_ai/SecondActivity.kt:152-700` + +- [ ] **Step 1: 添加3组视图引用** + +在第46行后添加3组EditText和Button引用: +```kotlin +private lateinit var etBaseUrl1: EditText +private lateinit var etApiKey1: EditText +private lateinit var etModel1: EditText +private lateinit var etModelName1: EditText +private lateinit var btnTestConnection1: Button +private lateinit var tvTestStatus1: TextView + +private lateinit var etBaseUrl2: EditText +private lateinit var etApiKey2: EditText +private lateinit var etModel2: EditText +private lateinit var etModelName2: EditText +private lateinit var btnTestConnection2: Button +private lateinit var tvTestStatus2: TextView + +private lateinit var etBaseUrl3: EditText +private lateinit var etApiKey3: EditText +private lateinit var etModel3: EditText +private lateinit var etModelName3: EditText +private lateinit var btnTestConnection3: Button +private lateinit var tvTestStatus3: TextView +``` + +- [ ] **Step 2: 修改 initViews() 方法,初始化所有视图** + +```kotlin +etBaseUrl1 = findViewById(R.id.etBaseUrl1) +// ... 其他第一组视图 +etBaseUrl2 = findViewById(R.id.etBaseUrl2) +// ... 其他第二组视图 +etBaseUrl3 = findViewById(R.id.etBaseUrl3) +// ... 其他第三组视图 +``` + +- [ ] **Step 3: 修改 loadConfigurations() 方法,加载3个配置** + +从 SharedPreferences 加载3个配置,填充到对应视图。如果配置不足3个,补齐空配置。 + +- [ ] **Step 4: 修改 saveConfigurations() 方法,保存3个配置** + +从3个视图组读取数据,保存为包含3个元素的列表。 + +- [ ] **Step 5: 添加3个独立的测试方法** + +```kotlin +private fun testConnection1() { testConnection(etBaseUrl1, etApiKey1, etModel1, tvTestStatus1, btnTestConnection1) } +private fun testConnection2() { testConnection(etBaseUrl2, etApiKey2, etModel2, tvTestStatus2, btnTestConnection2) } +private fun testConnection3() { testConnection(etBaseUrl3, etApiKey3, etModel3, tvTestStatus3, btnTestConnection3) } +``` + +- [ ] **Step 6: 设置3个测试按钮的点击事件** + +```kotlin +btnTestConnection1.setOnClickListener { testConnection1() } +btnTestConnection2.setOnClickListener { testConnection2() } +btnTestConnection3.setOnClickListener { testConnection3() } +``` + +- [ ] **Step 7: 提交** + +```bash +git add flomo-ai/app/src/main/java/com/example/flomo_ai/SecondActivity.kt +git commit -m "feat: support 3 model configs with individual test" +``` + +--- + +## 任务4: 修改 activity_main.xml 布局 + +**Files:** +- Modify: `flomo-ai/app/src/main/res/layout/activity_main.xml` + +- [ ] **Step 1: 修改结果显示区为水平布局** + +将原来的单个结果卡片改为水平 ScrollView + LinearLayout,包含3个结果卡片。 + +```xml + + + + + + + + + + + + + + + + + + + +``` + +- [ ] **Step 2: 创建 result_card.xml 布局** + +创建 `flomo-ai/app/src/main/res/layout/result_card.xml`: +```xml + + + + + + + + + + + +