简体中文 | 繁體中文(中國台灣) | 繁體中文(中國香港) | 繁體中文(中國澳門) | English
TChat的作者是大陆人,交流最好用简体中文,如果不会使用那就用翻译,谢谢
- 多服务商支持(OpenAI、Anthropic Claude、Google Gemini)
- 自定义 API Key 和端点配置
- 模型选择和从 API 拉取模型列表
- 手动输入模型支持
- 侧边栏聊天记录导航
- 流式聊天回复
- Material 3 UI 搭配 Jetpack Compose
- 知识库(RAG)功能
- MCP(Model Context Protocol)工具服务器支持
- 深度研究(Deep Research)功能
- 配置导出/导入(文件、二维码、加密)
- 聊天文件夹管理(嵌套、智能分组)
- 助手群聊(多助手协作对话)
-
语音朗读(TTS)功能
- 支持将 AI 回复内容朗读出来
- 支持选择不同的 TTS 引擎
- TTS 引擎选项采用卡片式设计
- 使用
synthesizeToFile()实现更稳定的语音合成
-
Cloudflare R2 云备份
- 支持将数据备份到 Cloudflare R2 云存储
- 大文件采用流式上传,优化内存占用
- 完整的备份/恢复功能
-
API Key 轮询功能
- 支持配置多个 API Key 轮询使用
- 原子操作实现,解决多对话时的竞态问题
- 自动切换失效的 API Key
-
Skills 功能
- 新增 Skills 系统支持
-
侧边栏优化
- 搜索框美化并实现真正的搜索功能
- 聊天记录显示样式优化(更圆润的设计)
- 设置页面图标统一使用 Lucide 图标库
功能:将文本内容转换为语音朗读
实现:
TtsService语音合成服务- 使用
synthesizeToFile()替代speak()提高稳定性 - 支持多种 TTS 引擎选择
- 卡片式引擎选择 UI
功能:云端数据备份与恢复
实现:
- R2 云存储 API 集成
- 流式上传支持大文件
- 完整的备份/恢复流程
功能:多 API Key 负载均衡
实现:
- 原子操作保证线程安全
- 解决多对话并发时的竞态条件
- 自动故障转移
功能:快速搜索聊天记录
实现:
- 搜索框 UI 美化
- 实时搜索过滤
- 聊天记录卡片圆角优化
| 模块 | 文件 | 说明 |
|---|---|---|
| app | TtsService.kt | TTS 语音合成服务 |
| app | TtsSettingsScreen.kt | TTS 设置页面 |
| app | R2BackupService.kt | R2 云备份服务 |
| app | R2BackupScreen.kt | 云备份设置页面 |
| app | ApiKeyRotationManager.kt | API Key 轮询管理 |
| app | ChatDrawer.kt | 侧边栏搜索功能 |
| app | SettingsScreen.kt | 设置页面图标更新 |
-
Token 统计增强
- 按提供商分别统计 Token 使用量
- 显示每个提供商的输入/输出 Token 和调用次数
- Token 记录控制功能:
- 开始:启用 Token 记录
- 暂停:暂停记录(保留已有数据)
- 关闭:完全关闭记录功能
- 清空:清空所有统计数据(带确认对话框)
-
配置导出/导入系统
- 供应商配置批量导出/导入(支持多选、文件、二维码)
- 单个供应商模型列表导出/导入
- API配置导出/导入(包含密钥,强制加密)
- 知识库完整导出(原始文件+向量数据+配置)
- AES-256-CBC 加密保护
- 二维码分享支持(可选加密)
- 批量文件导入(自动防止ID冲突)
-
聊天文件夹系统
- 无限层级嵌套文件夹
- 文件夹图标和颜色自定义
- 拖拽排序支持
- 智能自动分组:
- 按时间分组(今天/昨天/本周/本月/更早)
- 按模型分组(根据使用的AI模型)
- 按助手分组(根据关联的助手)
- 文件夹树状展示(支持展开/折叠)
- 聊天快速分配到文件夹
-
助手群聊功能
- 多个助手在同一聊天中协作对话
- 4种消息路由策略:
- 自然模式:基于话语权智能选择
- 轮流模式:按成员优先级顺序发言
- 随机模式:随机选择助手回复
- 手动模式:用户手动选择发言者
- 成员配置(优先级、话语权、启用/禁用)
- 自动模式支持(助手自动连续对话)
- 群聊统计信息
功能:完整的配置备份和迁移方案
实现:
ExportDataModels.kt定义导出数据结构EncryptionUtils.ktAES-256-CBC加密QRCodeUtils.kt二维码生成/解析ExportImportManager.kt统一管理器ExportImportScreen.ktMaterial 3 UI界面
安全特性:
- PBKDF2 密钥派生(10000次迭代)
- API密钥强制加密导出
- 二维码支持加密/非加密模式
功能:组织和管理聊天记录
实现:
ChatFolder.kt文件夹数据模型ChatFolderEntity.kt数据库实体ChatFolderDao.kt数据访问层ChatFolderRepository.kt业务逻辑层ChatFolderManagementScreen.kt文件夹管理UI
核心算法:
- 文件夹树构建算法(递归)
- 循环引用检测(移动文件夹时)
- 智能分组算法(时间/模型/助手)
功能:多助手协作对话
实现:
GroupChat.kt群聊数据模型GroupChatEntity.kt+GroupMemberEntity.kt数据库实体GroupChatDao.kt数据访问层GroupChatRepository.kt业务逻辑层GroupChatScreen.kt群聊UI界面
消息路由策略:
- LIST模式:按优先级顺序轮流发言
- POOLED模式:随机选择成员
- NATURAL模式:基于话语权加权随机选择
- MANUAL模式:用户手动选择发言者
修改:
- 数据库版本 14 → 15
- 新增4个实体表:
chat_folders聊天文件夹chat_folder_relations聊天-文件夹关联group_chats群聊group_members群聊成员
- 完整的外键约束和索引优化
| 模块 | 文件 | 说明 |
|---|---|---|
| app/util | ExportDataModels.kt | 导出数据模型定义 |
| app/util | EncryptionUtils.kt | AES-256-CBC加密工具 |
| app/util | QRCodeUtils.kt | 二维码生成/解析工具 |
| app/util | ExportImportManager.kt | 导出导入统一管理器 |
| app/ui/settings | ExportImportScreen.kt | 导出导入UI界面 |
| app/ui/folder | ChatFolderManagementScreen.kt | 文件夹管理UI |
| app/ui/groupchat | GroupChatScreen.kt | 群聊UI界面 |
| data/model | ChatFolder.kt | 文件夹数据模型 |
| data/model | GroupChat.kt | 群聊数据模型 |
| data/database/entity | ChatFolderEntity.kt | 文件夹数据库实体 |
| data/database/entity | GroupChatEntity.kt | 群聊数据库实体 |
| data/database/dao | ChatFolderDao.kt | 文件夹DAO |
| data/database/dao | GroupChatDao.kt | 群聊DAO |
| data/repository | ChatFolderRepository.kt | 文件夹Repository接口 |
| data/repository | GroupChatRepository.kt | 群聊Repository接口 |
| data/repository/impl | ChatFolderRepositoryImpl.kt | 文件夹Repository实现 |
| data/repository/impl | GroupChatRepositoryImpl.kt | 群聊Repository实现 |
| data/database | AppDatabase.kt | 数据库版本15迁移 |
同步平板和手机模式的设置图标 同步平板模式和手机模式的设置图标
修改内容
在 SettingsScreen.kt 的平板模式 SettingsListContent 函数中,添加了两个缺失的图标定义:
- 助手群聊 (group_chat): - 使用 Lucide.Users 图标 - 与手机模式保持一致
- 正则表达式 (regex_rules): - 使用 Icons.Default.BugReport 图标 - 与手机模式保持一致
当前图标映射
| 设置项 | 图标 | 类型 |
|---|---|---|
| 助手 | Icons.Default.Person | Material |
| 助手群聊 | Lucide.Users | Lucide ✨ |
| 服务商 | Icons.Default.Settings | Material |
| 知识库 | Lucide.BookOpen | Lucide ✨ |
| MCP 服务器 | Icons.Default.Cloud | Material |
| 深度研究 | Icons.Default.Search | Material |
| 正则表达式 | Icons.Default.BugReport | Material ✨ |
| 使用统计 | Icons.Default.BarChart | Material |
| 日志查看 | Lucide.ScrollText | Lucide ✨ |
| 网络日志 | Icons.Default.Cloud | Material |
| 关于 | Icons.Default.Info | Material |
现在平板模式和手机模式在设置页面中显示的图标完全一致了!
-
软件内更新支持
- 应用内检查更新、下载和安装
- 横屏平板模式下菜单栏正常使用
-
正则表达式功能
- 根据社区建议新增正则表达式支持
-
服务商页面列布局选择
- 支持一列、二列、三列显示模式切换
-
网络请求查看功能
- 新增网络请求调试/查看入口
-
本地工具 - Sleep 工具
- AI 可调用 sleep 工具暂停一段时间后发送通知
-
修复 thinking 标签解析问题
- 解决部分模型(如 Kimi-K2-Thinking)返回的
<thinking>标签无法正常解析的问题
- 解决部分模型(如 Kimi-K2-Thinking)返回的
-
修复工具调用问题
- 解决工具调用过程中的若干问题
-
优化本地文件系统工具描述
- 修复 LLM 不知道系统是 Android 导致文件存储路径错误的问题
- 改进本地工具-文件系统对于 LLM 的描述
-
深度研究(Deep Research)功能
- 通过多轮搜索和 AI 分析,自动生成详细的研究报告
- 迭代式深度研究,支持配置搜索广度(1-10)和深度(1-5)
- 实时显示研究进度,包括查询生成、搜索、结果处理等步骤
- 自动提取关键信息(Learnings)并生成引用来源
- 研究报告支持 Markdown 格式,包含编号引用
-
搜索 API 支持
- 支持 Tavily 搜索 API(推荐,支持高级搜索模式)
- 支持 Firecrawl 搜索 API
- 可配置自定义 API Base URL
-
深度研究 AI 配置
- 支持使用独立的 AI 配置进行研究
- 可选择不同的 AI 提供商(OpenAI、Anthropic、Gemini)
- 支持自定义 API Key、Base URL 和模型名称
- 关闭独立配置时使用默认服务商
-
深度研究参数配置
- 搜索广度:每层生成的搜索查询数量
- 搜索深度:递归研究的层数
- 输出语言:支持中文和英文
- 搜索语言:可与输出语言不同
-
历史记录管理
- 自动保存研究历史
- 查看历史研究报告和来源
- 支持删除单条或清空全部历史
-
研究进度可视化
- 树状结构展示研究节点
- 实时显示每个节点的状态(生成查询/搜索中/处理中/完成/错误)
- 显示每个节点发现的信息数量
-
助手参数增强
- 新增 Top-p 参数调节,支持开关控制和滑块调节(0.0~1.0)
- 上下文消息数量改为 RadioButton 选择:
- 不限制(默认):保留所有历史消息
- 限制数量:滑块快速调节(1~200)+ 输入框手动填写任意值
-
UI/UX 改进
- RadioButton 选项支持点击整行文字选择,使用 Material You
selectable交互 - 消息数量输入框从边框样式改为下划线样式(Material You TextField)
- 输入框文字居中显示,视觉更和谐
- 修复设置页面多级导航动画方向:从详情页返回列表页时正确使用返回动画(从左滑入)
- RadioButton 选项支持点击整行文字选择,使用 Material You
-
平板适配
- 设置页面支持平板 List-Detail 双栏布局
- 屏幕宽度 ≥ 840dp 时自动切换为左右分栏模式
- 左侧显示设置列表,右侧显示详情内容
- 选中项高亮显示,支持快速切换
- 新增搜索功能,可快速过滤设置项
功能:实现迭代式深度研究算法
实现:
DeepResearchService核心研究服务- 递归深度优先搜索策略
- 并发控制(Semaphore)限制同时请求数
- 流式返回研究进度(ResearchStep)
功能:封装搜索 API 调用
实现:
WebSearchService搜索服务接口TavilySearchServiceTavily API 实现FirecrawlSearchServiceFirecrawl API 实现- 支持搜索结果内容提取
功能:研究历史持久化
实现:
DeepResearchHistoryEntity数据库实体DeepResearchHistoryDao数据访问对象DeepResearchHistoryRepository仓库实现- 支持按时间排序、搜索、删除
功能:管理研究过程状态
实现:
DeepResearchManager状态管理器ResearchState研究状态(空闲/研究中/生成报告/完成/错误)ResearchNode研究节点(查询、状态、结果)NodeStatus节点状态枚举
新增:
SearchQuery搜索查询(关键词、研究目标、节点ID)WebSearchResult网络搜索结果Learning学习成果(URL、标题、关键信息)ProcessedSearchResult处理后的结果(学习成果、后续问题)DeepResearchConfig研究配置DeepResearchResult研究结果ResearchStep研究进度步骤(sealed class)
| 模块 | 文件 | 修改 |
|---|---|---|
| data | DeepResearchModels.kt | 深度研究数据模型定义 |
| data | DeepResearchService.kt | 深度研究核心服务 |
| data | WebSearchService.kt | 网络搜索服务接口和实现 |
| data | DeepResearchManager.kt | 研究状态管理器 |
| data | DeepResearchRepository.kt | 研究配置 Repository |
| data | DeepResearchHistoryEntity.kt | 历史记录数据库实体 |
| data | DeepResearchHistoryDao.kt | 历史记录 DAO |
| data | DeepResearchHistoryRepository.kt | 历史记录 Repository |
| data | AppDatabase.kt | 添加深度研究历史表 |
| data | build.gradle.kts | 添加 Gson 依赖 |
| app | DeepResearchViewModel.kt | 深度研究 ViewModel |
| app | DeepResearchScreen.kt | 深度研究页面 |
| app | SettingsManager.kt | 添加深度研究设置 |
| app | AppSettings.kt | 添加 DeepResearchSettings |
-
聊天界面优化
- 禁用 Markdown 链接自动解析,
[名字](链接)格式显示为纯文本 - 顶部标题栏显示当前助手名称,副标题显示
服务商 > 模型 - AI 头像移至消息上方,头像旁显示模型名称
- 工具选择弹窗优化:已授权时隐藏权限状态,只在未授权时显示
- 禁用 Markdown 链接自动解析,
-
使用统计功能
- 设置页面新增"使用统计"入口
- 显示上行 Token(输入)总计
- 显示下行 Token(输出)总计
- 显示总调用次数
- 按模型分类显示调用次数
-
MCP(Model Context Protocol)工具服务器支持
- 支持连接外部 MCP 服务器,扩展 AI 工具能力
- 支持 SSE 和 Streamable HTTP 两种传输协议
- 服务器管理:添加/编辑/删除/启用/禁用
- 连接测试功能,显示可用工具数量
- 自定义请求头和超时配置
-
MCP 服务器管理页面
- 设置页面新增"MCP 服务器"入口
- 卡片式服务器列表,显示名称、描述、URL
- 一键测试连接状态
- 支持批量管理多个 MCP 服务器
-
助手 MCP 工具配置
- 助手详情页新增"MCP工具"标签页
- 为每个助手独立选择启用的 MCP 服务器
- MCP 工具与本地工具、知识库工具协同工作
-
聊天集成
- AI 可自动调用已启用的 MCP 服务器工具
- 工具调用结果实时显示
- 支持多轮工具调用
功能:改进聊天消息显示布局
实现:
- 移除
LinkifyPlugin,禁用链接自动解析 - TopAppBar 添加副标题显示
服务商 > 模型 - AI 消息布局改为垂直结构:头像+模型名称在上,内容在下
功能:统计 Token 使用量和模型调用次数
实现:
MessageEntity添加modelName字段MessageDao添加统计查询方法UsageStatsScreen使用统计页面- 数据库版本 9 → 10 迁移
功能:支持 MCP 协议的 SSE 客户端
实现:
McpClient接口定义连接、工具列表、工具调用操作McpSseClient实现 SSE 传输协议- JSON-RPC 2.0 消息格式
- 支持 session 管理
功能:MCP 服务器配置持久化
实现:
McpServerEntity数据库实体McpServerDao数据访问对象McpServerRepository仓库接口和实现- 数据库版本 8 → 9 迁移
功能:将 MCP 工具转换为本地 Tool 对象
实现:
McpToolService工具转换服务- 工具缓存机制,避免重复请求
- 自动处理工具调用和结果返回
修改:
Assistant添加mcpServerIds字段AssistantEntity添加mcpServerIds字段- 支持为每个助手配置不同的 MCP 服务器
| 模块 | 文件 | 修改 |
|---|---|---|
| feature-chat | MarkdownText.kt | 移除 LinkifyPlugin |
| feature-chat | MessageItem.kt | AI 头像移至上方,显示模型名称 |
| feature-chat | MessageList.kt | 传递 modelName 参数 |
| feature-chat | ChatScreen.kt | 传递 modelName 到 ViewModel |
| feature-chat | ChatViewModel.kt | setTools 支持 modelName |
| data | MessageEntity.kt | 添加 modelName 字段 |
| data | MessageDao.kt | 添加统计查询方法 |
| data | Message.kt | 添加 modelName 字段 |
| data | ChatRepository.kt | ChatConfig 添加 modelName |
| data | ChatRepositoryImpl.kt | 保存消息时记录模型名称 |
| data | AppDatabase.kt | 版本 10,modelName 迁移 |
| data | McpServer.kt | MCP 服务器模型定义 |
| data | McpServerEntity.kt | MCP 服务器数据库实体 |
| data | McpServerDao.kt | MCP 服务器 DAO |
| data | McpClient.kt | MCP 客户端接口 |
| data | McpSseClient.kt | SSE 客户端实现 |
| data | McpClientFactory.kt | 客户端工厂 |
| data | McpServerRepository.kt | Repository 接口 |
| data | McpServerRepositoryImpl.kt | Repository 实现 |
| data | McpToolService.kt | MCP 工具服务 |
| data | Assistant.kt | 添加 mcpServerIds 字段 |
| data | AssistantEntity.kt | 添加 mcpServerIds 字段 |
| data | AssistantRepositoryImpl.kt | 更新转换逻辑 |
| data | AppDatabase.kt | 版本 9,MCP 表迁移 |
| data | build.gradle.kts | 添加 OkHttp SSE 依赖 |
| app | McpViewModel.kt | MCP 管理 ViewModel |
| app | McpScreen.kt | MCP 服务器管理页面 |
| app | SettingsScreen.kt | 添加 MCP 设置入口 |
| app | AssistantDetailScreen.kt | 添加 MCP 工具标签页 |
| app | AssistantDetailViewModel.kt | 添加 MCP 服务器支持 |
| app | MainActivity.kt | 集成 MCP 工具到聊天,添加副标题 |
| app | UsageStatsScreen.kt | 使用统计页面(新增) |
| app | SettingsScreen.kt | 添加使用统计入口 |
| feature-chat | ToolSelectorSheet.kt | 已授权时隐藏权限状态显示 |
-
知识库(RAG)功能
- 支持创建和管理多个知识库
- 内容导入支持:文本笔记、URL网页抓取、文件上传(TXT/MD)
- 向量嵌入生成与相似度检索
- 支持 OpenAI 和 Gemini 的 Embedding API
-
知识库管理
- 创建/编辑/删除知识库
- 选择 Embedding 服务商和模型
- 批量处理待处理条目
- 处理状态显示(待处理/处理中/已完成/失败)
-
知识条目管理
- Tab 切换查看(全部/文件/笔记/URL)
- 添加/编辑/删除条目
- 单独处理或批量处理
- 语义搜索功能
-
设置入口
- 设置页面新增"知识库"入口
- 位于"通用"分组下
-
工具调用参数保存
- 保存完整的工具调用参数(JSON 格式)
- 记录工具执行耗时(毫秒级)
- 持久化存储到数据库,重载对话可查看历史调用
-
工具调用 UI 改进
- 全新的工具调用卡片设计
- 显示工具名称、参数摘要、执行时间
- 点击展开查看完整的输入参数和执行结果
- 格式化 JSON 显示,更易读
- 成功/失败状态图标区分
-
错误处理优化
- 安全处理无参数工具调用
- 兼容旧版本损坏数据,提供友好提示
- JSON 解析失败时显示友好错误信息
功能:支持 OpenAI 和 Gemini 的向量嵌入 API
实现:
EmbeddingProvider接口定义嵌入操作OpenAIEmbeddingProvider调用/embeddings端点GeminiEmbeddingProvider调用embedContent端点- 支持批量嵌入处理
功能:完整的知识库数据管理
实现:
KnowledgeRepository接口和实现KnowledgeService处理内容加载、分块、向量化- 文档加载器:
TextLoader、UrlLoader、FileLoader - 数据库版本 6 → 7 迁移,添加 status/errorMessage 字段
功能:基于余弦相似度的语义搜索
实现:
- 文本分块(按段落,支持重叠)
- 向量存储为 JSON 格式
- 余弦相似度计算
- Top-K 结果返回,支持阈值过滤
修改:
- 新增
arguments字段存储工具调用参数 - 新增
executionTimeMs字段记录执行耗时 - JSON 序列化/反序列化支持新字段
问题:Gemini 等 API 返回无参数工具调用时,arguments 为空字符串导致解析失败
修复:
- 执行前检查
toolCall.arguments.ifBlank { "{}" } - 确保空参数被转换为有效的空 JSON 对象
功能:检测并处理之前保存的损坏数据
实现:
- 加载时检测 "End of input at character 0" 错误
- 对损坏数据显示友好提示
- 自动修正空参数字段
| 模块 | 文件 | 修改 |
|---|---|---|
| network | EmbeddingProvider.kt | Embedding 接口定义 |
| network | OpenAIEmbeddingProvider.kt | OpenAI Embedding 实现 |
| network | GeminiEmbeddingProvider.kt | Gemini Embedding 实现 |
| network | EmbeddingProviderFactory.kt | Embedding 工厂类 |
| data | KnowledgeItemEntity.kt | 添加 status/errorMessage 字段 |
| data | KnowledgeRepository.kt | 知识库 Repository 接口 |
| data | KnowledgeRepositoryImpl.kt | Repository 实现 |
| data | KnowledgeService.kt | 知识库核心服务 |
| data | DocumentLoader.kt | 文档加载器接口 |
| data | TextLoader.kt | 文本加载器 |
| data | UrlLoader.kt | URL 网页加载器 |
| data | FileLoader.kt | 文件加载器 |
| data | AppDatabase.kt | 版本 7,status 字段迁移 |
| data | Message.kt | ToolResultData 添加 arguments、executionTimeMs 字段 |
| data | ChatRepositoryImpl.kt | 工具执行记录参数和耗时,旧数据兼容处理 |
| app | KnowledgeViewModel.kt | 知识库 ViewModel |
| app | KnowledgeScreen.kt | 知识库列表页面 |
| app | KnowledgeDetailScreen.kt | 知识库详情页面 |
| app | SettingsScreen.kt | 添加知识库入口 |
| feature-chat | MessageItem.kt | 新工具卡片 UI,安全 JSON 解析 |
-
服务商多模型管理
- 服务商配置支持从 API 拉取模型列表
- 拉取后弹窗选择要保存的模型(支持多选)
- 已保存模型可单独删除
- 支持手动添加自定义模型
-
聊天页面模型选择
- 在聊天页面输入框上方工具栏选择模型
- 使用 Lucide Icon 显示模型类型图标
- OpenAI → ✨ Sparkles
- Claude → 🤖 Bot
- Gemini → 🧠 BrainCircuit
-
二维码分享优化
- 使用 ModalBottomSheet 样式替代弹窗
- 支持选择是否包含模型列表
- 显示预计数据大小
- 二维码卡片显示服务商名称和端点
-
Material You 界面重构
- 服务商列表页使用 ElevatedCard 卡片设计
- 服务商编辑页使用卡片分组布局
- 使用 FAB 浮动按钮替代底部固定按钮
- 删除"设为当前使用"按钮(简化操作)
-
本地工具调用功能
- 支持 AI 调用本地工具完成任务
- 三大提供商全支持:OpenAI、Anthropic Claude、Google Gemini 均可使用工具
- 聊天工具栏添加工具开关按钮
- 工具执行结果可展开查看详情
- 支持的工具:
read_file- 读取文件内容write_file- 写入文件内容list_directory- 列出目录文件delete_file- 删除文件create_directory- 创建目录web_fetch- 网页内容抓取get_system_info- 获取设备信息
功能:AI 可以连续调用多个工具完成复杂任务
实现:
- 发送消息时携带工具定义给 AI
- AI 返回工具调用请求时自动执行
- 执行结果发送回 AI 继续对话
- 最多支持 10 轮工具调用,避免无限循环
功能:在聊天界面显示工具执行详情
实现:
- 每个工具调用显示为独立的可点击卡片
- 显示"调用 xxx",点击可展开查看详细执行结果
- 成功使用主题色,失败使用错误色
修改:
- MessageEntity 添加
toolCallId、toolName、toolCallsJson、toolResultsJson字段 - 数据库版本 5 → 6 迁移
问题:get_system_info 等无参数工具在某些 API(如 Anthropic)中无法被调用
原因:无参数工具的 parameters 返回 null,但 Anthropic 等 API 要求必须有有效的 input_schema
修复:无参数工具改为返回空对象 InputSchema.Obj(emptyMap(), emptyList())
| 模块 | 文件 | 修改 |
|---|---|---|
| network | AIProvider.kt | 添加工具调用相关数据类 |
| network | OpenAIProvider.kt | 支持 Function Calling |
| network | AnthropicProvider.kt | 支持 Tool Use(工具调用) |
| network | GeminiProvider.kt | 支持 Function Calling |
| data | Tool.kt | 工具定义和执行接口 |
| data | LocalTools.kt | 本地工具实现 |
| data | Message.kt | 添加 ToolCallData、ToolResultData |
| data | MessageEntity.kt | 添加工具相关字段 |
| data | ChatRepository.kt | 添加 ChatConfig 配置 |
| data | ChatRepositoryImpl.kt | 工具调用循环实现 |
| data | AppDatabase.kt | 版本 6,工具字段迁移 |
| feature-chat | ChatScreen.kt | 工具开关按钮 |
| feature-chat | MessageItem.kt | 工具结果展示 UI |
| app | MainActivity.kt | LocalTools 集成 |
- 流式信息输出
- 输出内容 Token 上行/下行/TPS(每秒 Token 数)/首字延时 显示
- 持久化数据存储(支持 API 提供商配置和本地对话的持久化存储)
- 多对话数据接收优化
- 优化对话页面显示,支持在对话页面直接选择模型
- 支持单个提供商配置多个模型
问题:之前切换聊天会取消正在进行的 AI 流式响应
解决方案:Application 级别 Scope + MessageSender 单例
- MessageSender 单例管理所有聊天的发送任务
- 使用
Map<chatId, Job>独立管理每个聊天 - 切换聊天只取消数据库订阅,不取消发送任务
问题:数据库没有保存 Token 统计信息
修复:
- MessageEntity 添加
inputTokens、outputTokens、tokensPerSecond、firstTokenLatency - 数据库版本 1 → 2 迁移
功能:用户可以让 AI 重新生成回复,新旧回复作为变体共存
实现:
- 用户消息下方显示 🔄 刷新按钮
- 点击后 AI 重新生成回复
- 新回复作为变体添加,不覆盖旧回复
功能:当 AI 消息有多个变体时,可以切换查看
实现:
- AI 消息下方显示
< 1/3 >变体选择器 - 点击
<>循环切换不同版本 - 变体以 JSON 格式存储在数据库
问题:某些 API 返回 usage 时提前退出导致内容为空
修复:
- 先处理内容(choices),再保存 usage
- 等待
[DONE]标记再发送 Done - 避免 usage 导致提前退出
| 模块 | 文件 | 修改 |
|---|---|---|
| data | Message.kt | 添加 MessageVariant、变体字段 |
| data | MessageEntity.kt | 添加统计和变体字段 |
| data | AppDatabase.kt | 版本 3,两次迁移 |
| data | MessageDao.kt | 变体更新方法 |
| data | ChatRepository.kt | regenerateMessage、selectVariant 接口 |
| data | ChatRepositoryImpl.kt | 重新生成、变体选择实现 |
| data | MessageSender.kt | Application Scope 单例 |
| feature-chat | ChatViewModel.kt | 重新生成、变体选择方法 |
| feature-chat | MessageItem.kt | 刷新按钮、变体选择器 UI |
| feature-chat | MessageList.kt | 传递回调 |
| feature-chat | ChatScreen.kt | 连接回调 |
| network | OpenAIProvider.kt | 修复流式响应 |
| app | MainActivity.kt | MessageSender 初始化 |
- 多服务商支持
- Open AI
- Anthropic Claude
- Gemini 灵活的服务商配置
- 自定义 API Key
- 自定义 API 端点(支持第三方代理)
- 从 API 自动拉取可用模型列表
- 手动输入自定义模型名称
- 多服务商配置管理,一键切换
- 聊天功能
- 非流式回复,实时显示 AI 响应
- 多会话管理
- 侧边栏聊天记录导航
- 新建/删除/切换对话
- 流式信息输出
- 输出内容TPS/token速度/tokens数量显示
- 持久化数据存储(目前仅支持API提供商的服务持久化存储)
- 深度研究 - https://github.com/dzhng/deep-research
- 深度研究 WEB UI - https://github.com/AnotiaWang/deep-research-web-ui
- 谁谓宋远:提供 深度研究 功能的建议
- ↗↘:提供 本地工具 - SLEEP 设计的建议
