Files
aiagent/android/版本升级落地方案.md

251 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 天工智能体 Android 客户端 — 版本升级落地方案
> 基于两轮功能完整性评估(源码扫描 + 竞品对标)编制
> 评估日期: 2026-06-27 | 当前版本: v1.0.0 (Build 1)
---
## 一、版本规划总览
```
v1.0.0 ──→ v1.1.0 ──→ v1.2.0 ──→ v2.0.0
(当前) (紧急修复) (体验对齐) (能力突破)
v1.1.0: 修复阻塞缺陷 + 补齐对话核心交互 (预计 3-5 人天)
v1.2.0: 竞品体验对齐 + 通知推送完善 (预计 5-8 人天)
v2.0.0: 智能体管理闭环 + 离线能力 + 安全加固 (预计 8-12 人天)
```
---
## 二、v1.1.0 — 紧急修复版
### 目标:消除 P0 阻塞缺陷,补齐对话核心三大交互
### 2.1 后端必须配合的修复
| # | 问题 | 当前状态 | 修复方案 | 负责端 | 工时 |
|---|------|---------|---------|--------|------|
| 1 | `POST /api/v1/feedback` 返回 404 | 用户赞/踩操作必定失败,UI 乐观更新后回滚提示"反馈提交失败" | 后端新增 POST handler,接收 `FeedbackRequest`,写入 feedback 表 | 后端 | 0.5d |
| 2 | `POST /api/v1/fcm/register` 接口验证 | FCM 令牌注册 API 存在但未端到端验证 | 确认接口正常,支持 token 注册/注销 | 后端 | 0.5d |
### 2.2 Android 端修复清单
#### P0 — 阻塞性缺陷
| # | 功能 | 当前状态 | 修复方案 | 涉及文件 | 工时 |
|---|------|---------|---------|---------|------|
| 1 | **通知列表页** | API 存在但无 UI 页面,NavGraph 无对应路由 | 新增 `NotificationsScreen` + `NotificationsViewModel`,注册路由 `Routes.NOTIFICATIONS`,支持已读/未读标记 | `NavGraph.kt`、新建 `NotificationsScreen.kt`、`NotificationsViewModel.kt` | 1d |
| 2 | **FCM 推送集成** | `FcmTokenManager.initialize()` 是空操作,Firebase 依赖和 `google-services.json` 未添加 | 添加 Firebase deps → 放置 `google-services.json` → 取消 `FcmTokenManager` 中的注释代码 → 在 `TiangongApp.onCreate()` 调用 `initialize()` | `build.gradle.kts`、`FcmTokenManager.kt`、`TiangongApp.kt` | 1d |
#### P1 — 对话核心交互补齐
| # | 功能 | 当前状态 | 修复方案 | 涉及文件 | 工时 |
|---|------|---------|---------|---------|------|
| 3 | **停止生成** | 发送消息后无法中途停止 | 在 `ChatViewModel` 中暴露 `stopGeneration()` 方法(cancel SSE job),流式文本旁添加停止按钮 | `ChatViewModel.kt`、`ChatScreen.kt` | 0.5d |
| 4 | **消息重发** | 发送失败后无重试入口 | UI 在失败消息旁显示重试按钮,调用已有的 `sendMessage` 逻辑重新发起 | `ChatScreen.kt`、`ChatViewModel.kt` | 0.5d |
| 5 | **Think 推理可视化** | `SseEvent.Think` 事件被完全忽略(`ChatViewModel.kt:318` 空处理) | 新增 `ThinkTrace` 可折叠组件,接收迭代号和推理内容,折叠状态下显示"思考中…",展开显示完整推理链 | 新建 `ThinkTrace.kt`、修改 `ChatViewModel.kt:318`、`ChatScreen.kt` | 1d |
### 2.3 v1.1.0 代码质量修复(附带)
| # | 位置 | 问题 | 修复 |
|---|------|------|------|
| Q1 | `AppModule.kt:81` | `runBlocking` 阻塞主线程读取 DataStore | 改用动态 BaseUrl 拦截器,避免 DI 阶段同步等待 |
| Q2 | `AgentListScreen.kt:65` | `uiState.error!!` 空安全风险 | 改用 `?.let { }` 安全调用 |
| Q3 | `SettingsScreen.kt:141` | 用户名硬编码 "admin" | 从 `GET /api/v1/auth/me` 获取真实用户名 |
### 2.4 v1.1.0 验收标准
- [ ] 赞/踩反馈能成功提交到后端并持久化
- [ ] 通知列表页可展示通知、标记已读
- [ ] FCM 推送能收到后台推送并跳转
- [ ] 流式生成过程中可点击停止
- [ ] 失败消息可重发
- [ ] Think 推理过程以卡片形式展示
- [ ] 编译 0 error,安装到测试机正常运行
---
## 三、v1.2.0 — 体验对齐版
### 目标:对齐 ChatGPT/Claude 核心交互体验,完善通知体系
### 3.1 对话增强
| # | 功能 | 竞品对标 | 修复方案 | 工时 |
|---|------|---------|---------|------|
| 1 | **编辑已发送消息** | ChatGPT / Claude 均支持 | 长按用户消息弹出菜单 → 点击编辑 → 进入编辑模式 → 重新发送编辑后的内容 | 1d |
| 2 | **重新生成回复** | ChatGPT / Claude 均支持 Regenerate | 最后一条助手消息旁添加"重新生成"按钮,复用 `sendMessage` 使用上一条用户消息文本 | 0.5d |
| 3 | **工具调用审批** | Claude 有工具权限确认弹窗 | 收到 `SseEvent.ToolCall` 时弹出审批对话框展示工具名和输入参数,用户确认后才允许执行(需后端支持 `tool_approval` 事件类型或 SSE 双向通信改造) | 2d |
| 4 | **对话重命名** | ChatGPT / Claude 均支持长按重命名 | `ConversationListScreen` 长按弹出菜单 → 重命名对话框 → 更新 Room 和 API | 0.5d |
| 5 | **对话搜索** | ChatGPT / Claude 均支持历史搜索 | 在 `ConversationListScreen` 顶部添加搜索栏,调用 `GET /api/v1/conversations?search=`(如后端支持)或本地 Room 全文搜索 | 1d |
### 3.2 通知体系完善
| # | 功能 | 修复方案 | 工时 |
|---|------|---------|------|
| 6 | 通知免打扰时段 | 设置页新增通知偏好(开启/关闭/免打扰时段),存储到 DataStore | 0.5d |
| 7 | 通知点击跳转 | FCM 通知点击 → 解析 deep link → 跳转对应对话 | 0.5d |
| 8 | 通知分组 | 按类型分组(系统通知/对话通知),Android 通知渠道适配 | 0.5d |
### 3.3 UI/UX 打磨
| # | 功能 | 修复方案 | 工时 |
|---|------|---------|------|
| 9 | **暗色主题 Markdown 适配** | `MarkdownRenderer.kt:68` 硬编码文字颜色改为从 Compose 主题动态获取 | 0.5d |
| 10 | 服务器地址动态更新 | 替换 `runBlocking` 方案,使用 OkHttp 动态 BaseUrl 拦截器,修改服务器地址后无需重启 | 1d |
| 11 | 离线网络提示 | 新增 `NetworkMonitor` 工具类(ConnectivityManager + Flow),离线时在 ChatScreen 顶部展示横幅 | 0.5d |
| 12 | 骨架屏优化 | `SkeletonChat` 增加更多变化(工具卡片骨架、流式文本骨架) | 0.5d |
| 13 | **底部快捷操作栏** | `ChatScreen` 底部输入区重构:语音按钮/附件按钮/停止生成按钮横向排列于输入框上方,停止按钮仅在流式生成时显示 | 0.5d |
| 14 | **左侧抽屉导航** | 实现 `ModalNavigationDrawer`,抽屉内容:当前智能体信息 + 历史对话列表(最近 10 条)+ 设置入口 + 退出登录。点击对话直接跳转,无需进入独立历史页面。参考 ChatGPT Android 交互模式 | 1d |
### 3.4 v1.2.0 验收标准
- [ ] 可编辑已发送的用户消息
- [ ] 可重新生成最后一条助手回复
- [ ] 工具调用前弹出审批确认
- [ ] 对话可重命名、搜索
- [ ] 暗色主题下 Markdown 文字清晰可见
- [ ] 修改服务器地址无需重启
- [ ] 离线时显示网络提示横幅
- [ ] 流式生成时输入框上方显示停止按钮
- [ ] 左侧抽屉可滑出,展示历史对话和设置入口
---
## 四、v2.0.0 — 能力突破版
### 目标:智能体管理闭环 + 安全加固 + 离线能力
### 4.1 智能体管理
| # | 功能 | 竞品对标 | 修复方案 | 工时 |
|---|------|---------|---------|------|
| 1 | **智能体详情页** | ChatGPT GPT 详情页 | 新增 `AgentDetailScreen`,展示工作流配置、预算配置、版本信息、工具列表 | 2d |
| 2 | **智能体创建/编辑** | ChatGPT GPT Builder | 新增 `AgentEditScreen`(表单:名称/描述/系统提示词/模型参数/工具选择),调用后端 CRUD API | 3d |
| 3 | **智能体部署/停止** | — | AgentListItem 添加操作菜单(启动/停止/删除),调用后端部署 API | 1d |
| 4 | 模型参数调节 | 高级设置 | 在智能体详情页或 ChatScreen 中暴露 temperature/max_iterations 参数调整 | 1d |
### 4.2 安全加固
| # | 功能 | 修复方案 | 工时 |
|---|------|---------|------|
| 5 | **生物识别锁** | 集成 `BiometricPrompt`(指纹/面部),App 进入后台超过 1 分钟 → 回到前台需验证 | 1d |
| 6 | **登录渐进锁定** | `LoginViewModel` 添加失败计数:5次失败 → 30秒冷却,10次 → 5分钟锁定 | 0.5d |
| 7 | SSL Certificate Pinning | OkHttp 添加 CertificatePinner,防止中间人攻击 | 0.5d |
### 4.3 离线与数据
| # | 功能 | 修复方案 | 工时 |
|---|------|---------|------|
| 8 | **离线消息缓存** | 启动时从 Room 读取最近对话列表展示,网络恢复后增量同步。实现 offline-first 读取策略 | 2d |
| 9 | **数据导出** | 设置页新增"导出对话数据"按钮 → 生成 JSON/ZIP → 系统分享 Sheet | 1d |
| 10 | **缓存清理** | 设置页新增"清除缓存"按钮 → 清空 Room DB + DataStore(保留 token) | 0.5d |
### 4.4 多模态扩展
| # | 功能 | 修复方案 | 工时 |
|---|------|---------|------|
| 11 | 文件上传 (PDF/DOCX等) | 扩展上传逻辑支持非图片文件,显示文件类型图标 | 1d |
| 12 | 拍照输入 | 添加相机 intent,拍照后自动压缩上传 | 0.5d |
### 4.5 v2.0.0 验收标准
- [ ] 可查看智能体详情(工作流/预算/工具)
- [ ] 可创建和编辑智能体
- [ ] 生物识别锁正常工作
- [ ] 连续登录失败触发冷却时间
- [ ] 离线时能查看历史对话
- [ ] 支持数据导出和缓存清理
---
## 五、代码质量修复路线图
<!-- 附带修复,分配到各个版本中 -->
| # | 位置 | 问题 | 修复版本 | 工时 |
|---|------|------|---------|------|
| Q1 | `AppModule.kt:81` | `runBlocking` 阻塞主线程 | v1.2.0 (动态 URL 拦截器) | 1d |
| Q2 | `AgentListScreen.kt:65` | `uiState.error!!` NPE 风险 | v1.1.0 | 0.1d |
| Q3 | `MarkdownRenderer.kt:68` | 硬编码文字颜色 | v1.2.0 | 0.5d |
| Q4 | `SseClient.kt:108,134,193` | 每次重连创建新 CoroutineScope | v1.1.0 (统一用 viewModel 管理) | 0.3d |
| Q5 | `ChatViewModel.kt:151,161` | 静默吞异常 | v1.1.0 (添加日志) | 0.1d |
| Q6 | `ChatViewModel.kt:318` | Think 事件空实现 | v1.1.0 (ThinkTrace 组件) | 1d |
| Q7 | `VoiceInputButton.kt:132,149` | 录音错误无提示 | v1.1.0 (Toast 提示) | 0.1d |
| Q8 | `SettingsScreen.kt:141` | 用户名硬编码 | v1.1.0 (API 获取) | 0.2d |
| Q9 | `SettingsScreen.kt:217` | 服务器变更需重启 | v1.2.0 (动态 URL) | 1d |
---
## 六、工时汇总
| 版本 | 范围 | 前端工时 | 后端工时 | 合计 |
|------|------|---------|---------|------|
| v1.1.0 | 紧急修复 (3新增 + 6修复 + 附带质量) | 5.8 人天 | 1 人天 | **6.8 人天** |
| v1.2.0 | 体验对齐 (5对话增强 + 3通知 + 6UI打磨) | 10 人天 | 1 人天 | **11 人天** |
| v2.0.0 | 能力突破 (4智能体 + 3安全 + 3离线 + 2多模态) | 13 人天 | 2 人天 | **15 人天** |
| **总计** | | **28.8 人天** | **4 人天** | **32.8 人天** |
---
## 七、里程碑与交付节奏
```
Week 1 ──────── Week 2 ──────── Week 3-4 ────── Week 5-6
v1.1.0 开发 v1.2.0 开发 v1.2.0 收尾 v2.0.0 开发
├─ 反馈API ├─ 编辑/重生成 ├─ 测试/修bug ├─ 智能体管理
├─ 通知列表 ├─ 工具审批 ├─ 灰度发布 ├─ 离线缓存
├─ FCM集成 ├─ 暗色主题 │ ├─ 安全加固
├─ 停止/重发 ├─ 动态URL │ ├─ 文件上传
├─ ThinkTrace ├─ 离线提示 │ └─ 测试发布
└─ 代码质量 ├─ 对话管理 │
├─ 快捷操作栏 │
└─ 抽屉导航 │
↓ ↓ ↓ ↓
v1.1.0 v1.2.0 v1.2.1 v2.0.0
(第1周末) (第3周末) (第4周) (第6周末)
```
---
## 八、风险与依赖
| # | 风险 | 影响 | 应对措施 |
|---|------|------|---------|
| 1 | 后端反馈接口未及时上线 | v1.1.0 阻塞 | 提前与后端对齐,确认 feedback 表结构和路由 |
| 2 | `google-services.json` 获取困难 | FCM 推送延期 | 提前向 Firebase 项目管理员申请 |
| 3 | 工具审批需后端 SSE 协议改造 | v1.2.0 延期 | 先实现 UI 端准备,后端改造可降级为"仅展示审批结果" |
| 4 | 智能体 CRUD API 后端未实现 | v2.0.0 范围缩减 | 与后端确认 API 开发排期,必要时 v2.0 先做只读详情 |
---
## 九、附录:两次评估发现汇总对照
### 第一次评估(API 测试 + 编译验证)
| 类别 | 发现 | 状态 |
|------|------|------|
| API | 16/19 端点正常工作 | 已确认 |
| API | `POST /api/v1/feedback` → 404 | v1.1.0 修复 |
| 编译 | `TokenDataStore.clearAll()` Boolean? 类型错误 | 已修复 |
| 编译 | `AuthInterceptor.performReLogin()` 挂起函数调用错误 | 已修复 |
| 编译 | `AgentListViewModel.debounce()` 缺少 FlowPreview | 已修复 |
| 编译 | BUILD SUCCESSFUL, 0 errors | 通过 |
### 第二次评估(源码扫描 + 竞品对标)
| 类别 | 数量 |
|------|------|
| 已实现功能 | 22 项 |
| P0 阻塞缺陷 | 3 项 |
| P1 严重缺失 | 7 项 |
| P2 一般缺失 | 8 项 |
| 代码质量问题 | 9 项 |
| 竞品覆盖度 vs ChatGPT | 62% |
---
> 文档版本: v1.0 | 编制: 基于 Claude Code 源码分析 | 下次评审: v1.1.0 发布后