AI 接入 V0.1

This commit is contained in:
2026-09-23 17:23:59 +08:00
parent a83cda63f5
commit 34bc2e04b0
9 changed files with 1018 additions and 116 deletions
+8
View File
@@ -29,6 +29,14 @@
- 统计**不再是顶层 Tab**,从记账首页右上角图标进(`BillStatisticsPage`)。
- `pages/bill/bill_home_page.dart` 和 `bill_statistics_page.dart` 都是被 push 进来的,所以顶部自绘了返回箭头,底部留白也按 `Navigator.canPop()` 判断(有导航栏时留 90,没有时留 24)。
### AI 助手(2026-09-23 阶段 B)
- 链路:`lib/api/ai_api.dart`(SSE 客户端)→ `lib/providers/ai_provider.dart`(`assistantProvider` + `chatSessionsProvider` + `aiStatusProvider`)→ `lib/pages/assistant/assistant_page.dart`(真对话页)。
- **SSE 是手动解析的**:dio 没有内置 SSE 支持,用 `ResponseType.stream` 拿字节流,再 `cast<List<int>>().transform(utf8.decoder).transform(LineSplitter())` 按 `event:` / `data:` / 空行切。`cast` 不能省 —— dio 给的是 `Stream<Uint8List>`,Dart 泛型不允许它直接喂给 `StreamTransformer<List<int>, String>`。
- **`sessionId` 传 null 开新会话**,后端在 `done` 事件里才把新 ID 返回,`AssistantNotifier.send` 必须把它记下来,否则下一条消息又会开一个新会话。
- 历史会话存后端(`chat_session` / `chat_message` 两张表),App 只发 `sessionId + content`。**工具调用的中间过程不入库**,所以 App 不用理解 tool 消息格式。
- 助手气泡用 `MarkdownBody` 渲染(回答里常有列表/代码块),用户气泡用 `SelectableText`。
- 后端未配 key 时不报错:`/api/ai/status` 返回 `enabled:false`,`/chat` 推一个 error 事件,页面顶部显示红色提示条。
## 设计规范(配色)
- 品牌主色:`#C8956E`(驼色/焦糖色),在 `app.dart` 中作为 `ColorScheme.fromSeed` 的 seedColor。
- 深棕文字色:`#5D4037`;辅助文字:`#8D6E63`;页面底色:`#F8F8F8`。