Finalize desktop pet feature set and GitHub export
This commit is contained in:
@@ -32,12 +32,16 @@
|
||||
- 删除用户导入角色
|
||||
- 本地一次性/重复提醒、提醒列表、取消提醒和到点通知
|
||||
- 内置/用户提醒音效切换、导入、删除和试听
|
||||
- 天气查询、默认城市、公网 IP 定位兜底和多候选提示
|
||||
- 本地文件操作安全入口:读取文本、列目录、复制、备份、重命名
|
||||
- 联网模式:输入框开关、OpenAI/Gemini 原生联网、DeepSeek/Custom 不支持提示
|
||||
- 本地应用启动:登记应用、开始菜单 / App Paths 发现、手选 `.exe` 和二次确认
|
||||
- Windows 打包脚本和 Inno Setup 安装器脚本
|
||||
- Release exe 双击不弹控制台窗口
|
||||
|
||||
项目已经从早期 MVP 进入到“可扩展桌面应用原型”阶段,可以开始规划工具能力扩展。
|
||||
|
||||
但是,在正式加入定时提醒、天气、本地文件操作、联网搜索之前,建议先做一轮结构收口。
|
||||
但是,在正式加入定时提醒、天气、本地文件操作、联网模式之前,建议先做一轮结构收口。
|
||||
|
||||
---
|
||||
|
||||
@@ -98,7 +102,7 @@ loadCharacterPackage() 重新构建动画状态并从 idle 状态开始播放
|
||||
```text
|
||||
提醒解析
|
||||
天气查询
|
||||
联网搜索
|
||||
联网模式
|
||||
本地文件读写
|
||||
AI 工具调度
|
||||
复杂业务状态管理
|
||||
@@ -126,7 +130,8 @@ ToolCommandDispatcher
|
||||
定时提醒
|
||||
天气查询
|
||||
本地文件操作
|
||||
联网搜索
|
||||
联网模式
|
||||
本地应用启动
|
||||
普通 AI 对话
|
||||
```
|
||||
|
||||
@@ -165,7 +170,7 @@ enum class UserIntentType
|
||||
Reminder,
|
||||
Weather,
|
||||
FileOperation,
|
||||
Search
|
||||
LaunchApp
|
||||
};
|
||||
```
|
||||
|
||||
@@ -178,7 +183,7 @@ IntentRouter 判断意图
|
||||
↓
|
||||
CommandDispatcher 分发
|
||||
↓
|
||||
ReminderManager / WeatherManager / FileOperationManager / WebSearchManager / ConversationManager
|
||||
ReminderManager / WeatherManager / FileOperationManager / WebChatManager / AppLaunchManager / ConversationManager
|
||||
```
|
||||
|
||||
第一版意图识别不需要复杂,规则优先即可。
|
||||
@@ -192,7 +197,7 @@ ReminderManager / WeatherManager / FileOperationManager / WebSearchManager / Con
|
||||
推荐:
|
||||
|
||||
```text
|
||||
Reminder > FileOperation > Weather > Search > Chat
|
||||
Reminder > FileOperation > Weather > LaunchApp > Chat/WebChat
|
||||
```
|
||||
|
||||
原因:
|
||||
@@ -205,7 +210,7 @@ Reminder > FileOperation > Weather > Search > Chat
|
||||
可能是文件操作,而不是单纯天气查询。
|
||||
|
||||
“搜索一下明天天气”
|
||||
可能是搜索请求,但如果已有 WeatherTool,应优先走天气工具。
|
||||
新版不再作为独立搜索工具处理;如果已有 WeatherTool,应优先走天气工具,否则按普通聊天或输入框联网开关进入 Chat/WebChat。
|
||||
```
|
||||
|
||||
---
|
||||
@@ -229,7 +234,7 @@ set(CMAKE_AUTOMOC ON)
|
||||
|
||||
当前阶段选择方案 B:继续保持 `CMAKE_AUTOMOC OFF`,新增意图分发模块使用普通 C++ 类和同步返回值,不引入 `Q_OBJECT`。
|
||||
|
||||
后续如果 Reminder / Weather / Search 等模块需要大量跨对象异步信号,再单独评估是否切换到方案 A。
|
||||
后续如果 Reminder / Weather / WebChat 等模块需要大量跨对象异步信号,再单独评估是否切换到方案 A。
|
||||
|
||||
---
|
||||
|
||||
@@ -253,7 +258,7 @@ set(CMAKE_AUTOMOC ON)
|
||||
天气 API 请求说明
|
||||
IP 定位隐私说明
|
||||
本地文件操作权限说明
|
||||
联网搜索来源和隐私说明
|
||||
联网模式来源和隐私说明
|
||||
```
|
||||
|
||||
---
|
||||
@@ -292,7 +297,7 @@ IP 定位隐私说明
|
||||
阶段 1:定时提醒
|
||||
阶段 2:天气查询
|
||||
阶段 3:本地文件操作
|
||||
阶段 4:联网搜索
|
||||
阶段 4:联网模式
|
||||
阶段 5:语音对话 / 更复杂 Agent 能力
|
||||
```
|
||||
|
||||
@@ -301,7 +306,7 @@ IP 定位隐私说明
|
||||
```text
|
||||
1. 天气查询
|
||||
2. 本地文件操作安全边界
|
||||
3. 联网搜索
|
||||
3. 联网模式
|
||||
```
|
||||
|
||||
---
|
||||
@@ -330,7 +335,7 @@ src/assistant/CommandDispatcher.cpp
|
||||
- 定时提醒
|
||||
- 天气查询
|
||||
- 本地文件操作
|
||||
- 联网搜索
|
||||
- 联网模式
|
||||
```
|
||||
|
||||
第一版可以使用规则判断,不依赖 AI。
|
||||
@@ -634,9 +639,35 @@ Windows 托盘通知后端不可用:记录日志,不补气泡,不进入可
|
||||
|
||||
# 6. 阶段 2:天气查询功能
|
||||
|
||||
当前天气查询 v1 已进入实现阶段:
|
||||
|
||||
- 已新增独立 `src/weather/` 模块
|
||||
- 已支持 Open-Meteo 市级城市优先的基础地理编码和基础天气查询
|
||||
- 已支持设置页默认城市
|
||||
- 已支持默认城市为空时通过公网 IP 定位兜底
|
||||
- 已支持当前/今天、明天、后天和未来 1-3 天模板回复
|
||||
- 已支持读取前 5 个地理编码候选;多候选时仍查首项,并在回复中提示同名城市风险和其他候选
|
||||
- 已支持设置页测试默认城市;测试只展示匹配结果,不自动保存配置
|
||||
- 已通过 `CommandDispatcher` 将 Weather 意图接入聊天入口
|
||||
- 已保持 `PetWindow` 只负责 UI 展示,不承载天气解析或网络逻辑
|
||||
|
||||
v1 明确暂不支持:
|
||||
|
||||
- AI 润色天气回复
|
||||
- 空气质量
|
||||
- 天气预警
|
||||
- 天气提醒联动
|
||||
- 多天气源切换
|
||||
- 小时级精细降雨判断
|
||||
- 穿衣指数
|
||||
|
||||
默认城市为空且启用公网 IP 定位时,会请求 ipapi.co 判断城市;回复必须说明“根据公网 IP 判断城市”。设置页默认城市和公网 IP 定位都属于非用户明确城市来源,回复必须说明来源。
|
||||
|
||||
当前 v1 推荐填写市级城市名;区县、乡镇、街道不保证精确识别,可能无法匹配或被匹配到上级/同名城市。同名城市当前使用天气源返回的第一个结果,并在回复或测试结果中提示其他候选。后续优先补可交互候选选择、区县级定位和国内天气源增强。
|
||||
|
||||
## 6.1 功能定位
|
||||
|
||||
天气是独立工具能力,不放进联网搜索。
|
||||
天气是独立工具能力,不放进联网模式。
|
||||
|
||||
正确流程:
|
||||
|
||||
@@ -654,9 +685,9 @@ AI 根据结构化数据自然语言回复
|
||||
|
||||
不要让 AI 自己搜索天气,也不要让 AI 自己拼 URL。
|
||||
|
||||
## 6.2 为什么不用联网搜索做天气
|
||||
## 6.2 为什么不用联网模式做天气
|
||||
|
||||
搜索天气有几个问题:
|
||||
用联网模式查询天气有几个问题:
|
||||
|
||||
```text
|
||||
结果格式不稳定
|
||||
@@ -706,10 +737,10 @@ src/weather/
|
||||
├── WeatherConfig.h
|
||||
├── WeatherStore.h
|
||||
├── WeatherStore.cpp
|
||||
├── WeatherProvider.h
|
||||
├── WeatherProvider.cpp
|
||||
├── OpenMeteoWeatherProvider.h
|
||||
├── OpenMeteoWeatherProvider.cpp
|
||||
├── WeatherParser.h
|
||||
├── WeatherParser.cpp
|
||||
├── WeatherSummaryFormatter.h
|
||||
├── WeatherSummaryFormatter.cpp
|
||||
├── WeatherManager.h
|
||||
└── WeatherManager.cpp
|
||||
```
|
||||
@@ -836,6 +867,8 @@ VPN / 代理会导致定位错误
|
||||
|
||||
## 6.10 AI 回复上下文
|
||||
|
||||
当前 v1 采用模板优先,不依赖 AI 润色;本节作为 v1.1 预留方向。
|
||||
|
||||
程序应把结构化天气数据交给 AI:
|
||||
|
||||
```text
|
||||
@@ -872,6 +905,27 @@ VPN / 代理会导致定位错误
|
||||
|
||||
本地文件操作是高风险功能,必须后置,不能早于提醒和天气。
|
||||
|
||||
当前本地文件操作 v1 已进入实现阶段:
|
||||
|
||||
- 已新增独立 `src/fileops/` 模块
|
||||
- 已通过 `CommandDispatcher` 将 FileOperation 意图接入聊天入口
|
||||
- 已支持读取用户主动选择的常见文本文件
|
||||
- 已支持列出用户主动选择的文件夹
|
||||
- 已支持复制文件、创建备份、重命名文件
|
||||
- 写操作会展示操作计划并二次确认
|
||||
- 聊天文本不会直接变成本地路径,所有路径必须由用户通过文件选择框选择
|
||||
- 已拒绝删除、覆盖、移动、执行脚本、运行命令和系统目录访问
|
||||
- 已拒绝符号链接路径,降低路径逃逸风险
|
||||
|
||||
v1 明确暂不支持:
|
||||
|
||||
- zip 打包
|
||||
- 删除文件
|
||||
- 覆盖文件
|
||||
- 移动文件
|
||||
- 执行脚本或命令
|
||||
- 修改源码
|
||||
|
||||
目标是让桌宠能辅助用户处理本地文件,例如:
|
||||
|
||||
```text
|
||||
@@ -930,8 +984,6 @@ AI 自己决定访问系统目录
|
||||
```text
|
||||
src/fileops/
|
||||
├── FileOperationTypes.h
|
||||
├── FileOperationPlanner.h
|
||||
├── FileOperationPlanner.cpp
|
||||
├── FileOperationManager.h
|
||||
├── FileOperationManager.cpp
|
||||
├── FileSandbox.h
|
||||
@@ -953,6 +1005,8 @@ src/fileops/
|
||||
重命名文件,需确认
|
||||
```
|
||||
|
||||
当前 v1 中 zip 打包延期,因为 Qt 公共 API 没有稳定内置写 zip 能力;不为此引入重依赖。后续如果要补 zip,优先选择明确许可和可维护的压缩库。
|
||||
|
||||
暂不做:
|
||||
|
||||
```text
|
||||
@@ -978,82 +1032,95 @@ D:/xxx/b.txt
|
||||
是否继续?
|
||||
```
|
||||
|
||||
---
|
||||
## 7.7 应用启动独立模块
|
||||
|
||||
# 8. 阶段 4:联网搜索功能
|
||||
|
||||
## 8.1 功能定位
|
||||
|
||||
联网搜索后置,不要现在优先做。
|
||||
|
||||
联网搜索是通用增强能力:
|
||||
当前已新增独立 `src/launcher/` 模块,不放进 `src/fileops/`:
|
||||
|
||||
```text
|
||||
查询最新信息
|
||||
查官网
|
||||
查报错
|
||||
查新闻
|
||||
查版本
|
||||
查文档
|
||||
src/launcher/
|
||||
├── AppLaunchTypes.h
|
||||
├── AppLaunchStore.h
|
||||
├── AppLaunchStore.cpp
|
||||
├── AppDiscovery.h
|
||||
├── AppDiscovery.cpp
|
||||
├── AppLaunchManager.h
|
||||
└── AppLaunchManager.cpp
|
||||
```
|
||||
|
||||
## 8.2 不要给每家模型各自配置搜索
|
||||
|
||||
不建议:
|
||||
应用启动支持:
|
||||
|
||||
```text
|
||||
OpenAIProvider 自己一套搜索
|
||||
GeminiProvider 自己一套搜索
|
||||
DeepSeekProvider 自己一套搜索
|
||||
CustomProvider 自己一套搜索
|
||||
打开 Codex
|
||||
启动酷狗音乐
|
||||
帮我打开 VSCode
|
||||
```
|
||||
|
||||
推荐:
|
||||
解析和发现顺序:
|
||||
|
||||
```text
|
||||
WebSearchManager 独立负责搜索
|
||||
LLMProvider 只负责回答
|
||||
ConversationManager / CommandDispatcher 负责把搜索结果注入给 AI
|
||||
用户在设置页登记的应用别名
|
||||
↓
|
||||
Windows 开始菜单快捷方式
|
||||
↓
|
||||
Windows App Paths 注册表
|
||||
↓
|
||||
未知应用时由用户手动选择 .exe
|
||||
```
|
||||
|
||||
## 8.3 建议目录
|
||||
启动安全边界:
|
||||
|
||||
```text
|
||||
src/search/
|
||||
├── SearchTypes.h
|
||||
├── SearchProvider.h
|
||||
├── SearXNGSearchProvider.h
|
||||
├── SearXNGSearchProvider.cpp
|
||||
├── WebSearchManager.h
|
||||
└── WebSearchManager.cpp
|
||||
启动前始终二次确认
|
||||
只允许 .exe 或开始菜单 .lnk
|
||||
不执行 .bat / .cmd / .ps1 / .vbs / .js / .msi
|
||||
不执行聊天文本里的命令
|
||||
不拼接聊天文本参数
|
||||
不以管理员权限启动
|
||||
```
|
||||
|
||||
第一版只做:
|
||||
配置保存到:
|
||||
|
||||
```text
|
||||
SearXNG + 自定义 Base URL
|
||||
QStandardPaths::AppConfigLocation/launcher_config.json
|
||||
```
|
||||
|
||||
后续再加:
|
||||
损坏时备份为:
|
||||
|
||||
```text
|
||||
Tavily
|
||||
Brave Search
|
||||
CustomSearchProvider
|
||||
```
|
||||
|
||||
## 8.4 安全边界
|
||||
|
||||
```text
|
||||
不要让 AI 自己生成任意 URL 给程序访问
|
||||
不要做网页全文抓取第一版
|
||||
不要默认每次都联网
|
||||
不要把用户隐私查询写日志
|
||||
搜索结果要显示来源
|
||||
launcher_config.broken.yyyyMMdd-HHmmss.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 8. 阶段 4:联网模式
|
||||
|
||||
联网能力已从旧“搜索引擎聚合器”重做为 Web 端 AI 对话式联网模式。
|
||||
|
||||
当前已落地:
|
||||
|
||||
- 已删除旧 `src/search/` 模块,不再维护 Google/百度/360/搜狗页面解析、SearXNG 旧配置、多源聚合和旧 `search_config.json` 兼容。
|
||||
- 已新增独立 `src/web/` 模块:`WebConfig`、`WebStore`、`WebCapabilityDetector`、`WebChatManager` 和 Web citation 类型。
|
||||
- 输入框新增“联网”开关;开关开启后,普通聊天进入 WebChat 流程。
|
||||
- 支持 OpenAI 官方 Provider 的 Responses API Web Search。
|
||||
- 支持 Google Gemini Provider 的 Google Search grounding。
|
||||
- DeepSeek 官方 API 当前不提供托管联网搜索工具,显示“不支持原生联网”。
|
||||
- Custom / 第三方 OpenAI-Compatible 默认无法确认联网能力,不发送未知联网参数,不做旧搜索页抓取。
|
||||
- 设置页改为“联网模式”:显示当前能力状态、开关记忆、默认开关、Provider 模式、超时、来源展示和测试联网模式。
|
||||
- 旧 `search_config.json` 已废弃;新版使用 `web_config.json`,损坏时备份为 `web_config.broken.yyyyMMdd-HHmmss.json`。
|
||||
|
||||
边界:
|
||||
|
||||
- 不再默认每次联网,模型可判断稳定常识无需联网。
|
||||
- 不做搜索结果页 HTML 解析,避免登录、帮助、反馈、验证码页面污染答案。
|
||||
- 不实现 Tavily / Brave / Bing Search API、自建搜索后端、网页全文抓取或长期缓存。
|
||||
- 天气仍是独立工具能力,不放进联网模式。
|
||||
|
||||
后续可选:
|
||||
|
||||
- 更多 AI Provider 原生联网适配。
|
||||
- 结构化搜索 API 或自建联网后端,用于不支持原生联网的模型。
|
||||
- 更强的引用 UI、证据片段摘录和来源可点击展示。
|
||||
|
||||
# 9. 建议最终开发顺序
|
||||
|
||||
## 9.1 第一步:收口架构
|
||||
@@ -1076,33 +1143,30 @@ CustomSearchProvider
|
||||
## 9.3 第三步:天气查询
|
||||
|
||||
```text
|
||||
1. WeatherTypes
|
||||
2. WeatherConfig / WeatherStore
|
||||
3. OpenMeteoWeatherProvider
|
||||
4. WeatherManager
|
||||
5. IntentRouter 天气识别
|
||||
6. AI 回复 / 模板兜底
|
||||
当前已落地天气 v1:WeatherTypes、WeatherConfig / WeatherStore、WeatherParser、WeatherManager、模板回复、设置页默认城市、公网 IP 定位兜底和 Weather 意图接入。
|
||||
当前已落地天气 v1.2 / v1.3:多候选城市提示和设置页默认城市测试。后续可继续补可交互候选选择、区县级定位、国内天气源增强、AI 润色、空气质量、天气预警、多天气源切换、小时级降雨判断和天气提醒联动。
|
||||
```
|
||||
|
||||
## 9.4 第四步:本地文件操作
|
||||
|
||||
```text
|
||||
1. FileSandbox
|
||||
2. FileOperationTypes
|
||||
3. FileOperationPlanner
|
||||
4. FileOperationManager
|
||||
5. 用户确认 UI
|
||||
6. 备份机制
|
||||
当前已落地 FileSandbox、FileOperationTypes、FileOperationManager、FileBackupManager 和用户确认 UI。
|
||||
v1 支持读取文本、列出文件夹、复制、备份、重命名。
|
||||
v1 不支持 zip、删除、覆盖、移动、脚本/命令执行和系统目录访问。
|
||||
```
|
||||
|
||||
## 9.5 第五步:联网搜索
|
||||
## 9.5 第五步:联网模式
|
||||
|
||||
```text
|
||||
1. SearchTypes
|
||||
2. SearchProvider
|
||||
3. SearXNGSearchProvider
|
||||
4. WebSearchManager
|
||||
5. 来源展示
|
||||
当前已落地 WebConfig、WebStore、WebCapabilityDetector、WebChatManager 和输入框联网开关。新版支持 OpenAI/Gemini 原生联网;DeepSeek/Custom 明确提示不支持或无法确认;旧搜索聚合与 SearXNG 旧配置已废弃。
|
||||
```
|
||||
|
||||
## 9.6 第六步:应用启动
|
||||
|
||||
```text
|
||||
当前已落地 AppLaunchStore、AppDiscovery、AppLaunchManager 和设置页应用登记。
|
||||
v1 支持已登记应用、开始菜单快捷方式、App Paths 注册表和用户确认手选 .exe。
|
||||
v1 不支持脚本、聊天参数、命令执行、管理员权限和跨平台应用发现。
|
||||
```
|
||||
|
||||
---
|
||||
@@ -1112,17 +1176,17 @@ CustomSearchProvider
|
||||
下面这段可以直接作为后续任务总说明:
|
||||
|
||||
```text
|
||||
当前不要急着直接实现提醒、天气、文件操作或联网搜索。
|
||||
当前不要急着直接实现提醒、天气、文件操作或联网模式。
|
||||
|
||||
请先审查当前 QtDesktopPet 项目结构,并完成以下准备工作:
|
||||
|
||||
1. 角色切换在设置保存后已确认立即生效,后续只需保留回归检查。
|
||||
2. 新增 IntentRouter / CommandDispatcher,使用户输入先经过统一意图分发。
|
||||
3. 意图类型包括 Chat、Reminder、Weather、FileOperation、Search。
|
||||
4. 意图优先级为 Reminder > FileOperation > Weather > Search > Chat。
|
||||
3. 意图类型包括 Chat、Reminder、Weather、FileOperation、LaunchApp;联网模式由输入框开关决定,不再是独立 Search 意图。
|
||||
4. 意图优先级为 Reminder > FileOperation > Weather > LaunchApp > Chat/WebChat。
|
||||
5. 普通聊天继续走现有 AI 对话流程。
|
||||
6. 新功能不得继续直接塞进 PetWindow。
|
||||
7. 后续 Reminder、Weather、FileOperation、Search 均应作为独立模块接入。
|
||||
7. 后续 Reminder、Weather、FileOperation、LaunchApp、WebChat 均应作为独立模块接入。
|
||||
8. 当前阶段保持 CMAKE_AUTOMOC OFF,后续模块不要使用 Q_OBJECT;确需 Qt 信号槽时再单独评估。
|
||||
9. 保持现有隐私策略:API Key、Authorization、完整用户消息、完整错误响应不得写入日志。
|
||||
10. 保持现有文件安全策略:路径校验、危险操作确认、修改前备份。
|
||||
@@ -1137,7 +1201,7 @@ CustomSearchProvider
|
||||
建议先做:
|
||||
|
||||
```text
|
||||
结构收口 → IntentRouter / CommandDispatcher → 定时提醒 → 天气 → 本地文件操作 → 联网搜索
|
||||
结构收口 → IntentRouter / CommandDispatcher → 定时提醒 → 天气 → 本地文件操作 → 联网模式
|
||||
```
|
||||
|
||||
其中:
|
||||
@@ -1146,5 +1210,5 @@ CustomSearchProvider
|
||||
定时提醒:已作为第一个工具能力落地
|
||||
天气:建议第二个落地
|
||||
本地文件操作:风险较高,第三个落地
|
||||
联网搜索:通用能力,最后落地
|
||||
联网模式:通用 AI 对话增强,最后落地
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user