天工智能体 Android 客户端 — 版本升级落地方案
基于两轮功能完整性评估(源码扫描 + 竞品对标)编制
评估日期: 2026-06-27 | 当前版本: v1.0.0 (Build 1)
一、版本规划总览
二、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 验收标准
三、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 验收标准
四、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 人天 |
七、里程碑与交付节奏
八、风险与依赖
| # |
风险 |
影响 |
应对措施 |
| 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 发布后