Commit 76b3421b4eee810f6d3946c9bd714cf86ffc170f
1 parent
ae6f7002
docs(lifelog): HANDOFF 写清「15min 自动 ≠ 10min 会话间隔」+ 同步纪要现状
- §六 加最易混淆点:纪要 WorkManager periodic 每 15min(Android 硬下限, 改间隔须 UPDATE 策略)自动扫已结束会话;UI「会话间隔 10min」是切分规则, 与跑纪要频率无关。附 502 并发坑的解法(AtomicBoolean + 7min 预算 + 不 retry)。 - 文件清单:SummaryScheduler/Worker 描述同步(互斥/预算/15min)+ 补 SummaryProgress。 - 纪要后端接线改为「UI 可选 2B/4B/Hermes,经 ChatConfig 解析」。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Showing
1 changed file
with
6 additions
and
3 deletions
lifelog-recorder/HANDOFF.md
| @@ -46,8 +46,9 @@ app/src/main/kotlin/com/lemon/lifelog/ | @@ -46,8 +46,9 @@ app/src/main/kotlin/com/lemon/lifelog/ | ||
| 46 | │ ├── ChatConfig.kt — 聊天端点配置(本地 8080/2b/4b 存 SharedPreferences;Hermes 走 BuildConfig) | 46 | │ ├── ChatConfig.kt — 聊天端点配置(本地 8080/2b/4b 存 SharedPreferences;Hermes 走 BuildConfig) |
| 47 | │ └── ChatClient.kt — OpenAI 兼容流式客户端(本地目标传 enable_thinking=false) | 47 | │ └── ChatClient.kt — OpenAI 兼容流式客户端(本地目标传 enable_thinking=false) |
| 48 | ├── summary/ | 48 | ├── summary/ |
| 49 | -│ ├── SummaryWorker.kt — ★ 会话级纪要:按时间间隔切会话 → 本地 llama-swap 2B | ||
| 50 | -│ └── SummaryScheduler.kt — WorkManager periodic + enqueueUniqueWork(KEEP) 去重 | 49 | +│ ├── SummaryWorker.kt — ★ 会话级纪要:切会话 → 选定后端(ChatConfig) 出纪要;AtomicBoolean 并发互斥 + 7min 单轮预算 + 不 retry |
| 50 | +│ ├── SummaryProgress.kt — worker→UI 实时进度 singleton(纪要 tab 的 console) | ||
| 51 | +│ └── SummaryScheduler.kt — WorkManager periodic 每 15min(UPDATE 策略) + 手动 enqueueUniqueWork | ||
| 51 | ├── service/ | 52 | ├── service/ |
| 52 | │ ├── RecorderService.kt — 前台服务,pipeline 主体 ←★ 改 ASR 流程改这里 | 53 | │ ├── RecorderService.kt — 前台服务,pipeline 主体 ←★ 改 ASR 流程改这里 |
| 53 | │ ├── RecorderState.kt — StateFlow 把服务状态推到 UI | 54 | │ ├── RecorderState.kt — StateFlow 把服务状态推到 UI |
| @@ -243,7 +244,9 @@ skills: | @@ -243,7 +244,9 @@ skills: | ||
| 243 | ~/start-llama.sh — launcher(起 llama-swap),被 Magisk service.d 调用 | 244 | ~/start-llama.sh — launcher(起 llama-swap),被 Magisk service.d 调用 |
| 244 | ``` | 245 | ``` |
| 245 | 246 | ||
| 246 | -- **App 接线**:`ChatConfig` 本地默认 `8080`/`2b`/`4b`(SharedPreferences 可改);`keys.properties` = `8642`(对话的 Hermes 选项 → Kimi);`SummaryWorker.LLM_BASE_URL/LLM_MODEL` = `8080`/`2b`(纪要,已解耦 keys.properties)。 | 247 | +- **App 接线**:`ChatConfig` 本地默认 `8080`/`2b`/`4b`(SharedPreferences 可改);`keys.properties` = `8642`(对话的 Hermes 选项 → Kimi)。纪要后端 UI 可选(2B/4B/Hermes),存 `prefs[summary_backend]`,worker 经 `ChatConfig.targetById` 解析端点(与对话共用配置)。 |
| 248 | +- **⚠️「15min 自动」≠「10min 会话间隔」**(最易混):纪要由 WorkManager periodic **每 15min**(Android periodic 硬下限,做不到更短;改间隔必须用 `ExistingPeriodicWorkPolicy.UPDATE`,KEEP 不覆盖旧排程)自动跑一次,扫**已结束**的会话。UI 里「会话间隔 10min」是**切分规则**——多长静音算另一场,跟跑纪要频率毫无关系。要比 15min 更勤只能换 AlarmManager 精确闹钟。 | ||
| 249 | +- **502 坑**:periodic + 手动 + retry 并发打同一个 llama-server 上游 → llama-swap `context canceled` → 502。已用 worker 内 `AtomicBoolean` 互斥 + 7min 单轮预算 + 不 `Result.retry()` 解决(见 SummaryWorker)。 | ||
| 247 | - **Qwen3.5 默认开思考**:纪要 + 本地对话都要传 `chat_template_kwargs:{enable_thinking:false}` 否则 token 被 `<think>` 吞、流式开头吐字面 `"null"`(org.json.optString 坑,ChatClient.parseDelta 已用 `isNull` 防)。 | 250 | - **Qwen3.5 默认开思考**:纪要 + 本地对话都要传 `chat_template_kwargs:{enable_thinking:false}` 否则 token 被 `<think>` 吞、流式开头吐字面 `"null"`(org.json.optString 坑,ChatClient.parseDelta 已用 `isNull` 防)。 |
| 248 | - **G3 实测**(Q4,热降频):2B ~12 t/s 生成 / 65 prefill(一篇纪要 ~48s);4B ~4 / 24(~2.6min)。 | 251 | - **G3 实测**(Q4,热降频):2B ~12 t/s 生成 / 65 prefill(一篇纪要 ~48s);4B ~4 / 24(~2.6min)。 |
| 249 | - 启动器手测:`su -G 3003 10302 -c 'bash ~/start-llama.sh'`,再 `curl 127.0.0.1:8080/v1/models`。 | 252 | - 启动器手测:`su -G 3003 10302 -c 'bash ~/start-llama.sh'`,再 `curl 127.0.0.1:8080/v1/models`。 |