xiaoyuan-assistant 0.5.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,388 @@
1
+ # CHANGELOG
2
+
3
+ ## 0.5.38
4
+ - 移除 npm 包内置的“收到指令,请您稍等”MP3 文件,不再占用发布包体积。
5
+ - 改为浏览器 IndexedDB 按 TTS voice 缓存前置提示音。
6
+ - 同一个 voice 第一次没有本地缓存时,第一次正常调用合我意 TTS;播放后异步缓存音频。
7
+ - 后续同 voice 的“收到指令,请您稍等”直接读取本地缓存,不再请求网络。
8
+ - 切换 voice 后按新的 voice 独立查缓存,避免 voice 切换时复用旧音色。
9
+ - 本地缓存失败或第三方 TTS 不可用时自动回退浏览器原生 TTS。
10
+ - 移除 postinstall 下载 MP3 的逻辑。
11
+
12
+ # Changelog
13
+
14
+ ## 0.4.7
15
+ - Planner / Executor / Analyzer 三阶段优化。
16
+ - 普通执行一次 Planner AI,不做深度思考。
17
+ - 分析任务只有在前置页面操作全部完成后才请求第二次 AI。
18
+ - `data-ai-function + data-ai-param + data-ai-description` 作为固定 DOM 协议。
19
+ - 同名 Function 的参数按当前 DOM 精确定位。
20
+ - DOM 能力清单聚合,减少大屏 DOM 上下文体积。
21
+ - 规划阶段不发送完整数据 schema;分析阶段只发送相关数据源。
22
+ - TTS 改为非阻塞队列,不再阻塞命令执行。
23
+ - Planner 请求 8 秒超时,分析请求 45 秒超时。
24
+ - 清理示例中的真实 API Key,统一使用占位符。
25
+
26
+ ### v0.4.8
27
+ - 优化 Planner AI:执行指令仅发送精简的 Function/DOM 能力清单,不再发送完整 DataSource schema。
28
+ - 执行类请求固定关闭 thinking,`max_tokens` 下调至 260,减少规划阶段输出成本与延迟。
29
+ - Planner 与 Analyzer 均使用 JSON Object 响应格式,减少结构化 JSON 解析失败。
30
+ - Planner 增加明确的超时边界(15 秒),避免过短超时导致正常模型请求被误判失败。
31
+ - 仅当用户指令出现明确的分析/研判/趋势等语义时,Planner 才携带 DataSource 元信息;纯操作指令不携带数据源上下文。
32
+ - 分析阶段仍单独调用第二次 AI,并开启 thinking;仅分析真正需要的数据源。
33
+ - 保持 data-ai-function + data-ai-param + data-ai-description 精确执行协议不变。
34
+
35
+ ## 0.4.9 - 2026-09-14
36
+ - Planner 改为流式 NDJSON 步骤输出。
37
+ - 模型生成第一步后立即进入执行队列,不等待完整规划结束。
38
+ - 增加 Planner manifest 短期缓存,减少 DOM 扫描。
39
+ - 只有包含分析意图时才携带数据源描述。
40
+ - 执行步骤保持按顺序等待页面 DOM 后继续。
41
+ - 分析阶段 thinking budget 降为 4096,保留深度分析能力同时降低延迟。
42
+
43
+
44
+ ## 0.5.0 - 2026-09-14
45
+ - 取消 AI 请求超时限制:Planner 与 Analyzer 不再因为 SDK 内置计时器提前终止。
46
+ - 取消默认总执行时间上限;只有页面 DOM 等待仍保留单步等待保护。
47
+ - 大幅精简 Planner 提示词,只保留“人话 → Function/参数/数据分析步骤”的必要规则。
48
+ - Planner 继续关闭 thinking,Analyzer 继续使用推理模式。
49
+ - 保持 Planner → 串行 Executor → Analyzer 的业务流程不变。
50
+
51
+
52
+ ## 0.5.1 - 2026-09-14
53
+ - 新增“意图路由”设计:第一次 AI 只负责判断 action / analysis / chat,并把用户人话转换为真实 Function/DataSource。
54
+ - 纯点击/切换/操作类指令只调用一次轻量 AI,随后由 JavaScript/DOM 直接执行。
55
+ - 数据分析类指令保持两阶段:先完成前置 action,再读取实时数据,最后调用分析 AI。
56
+ - 进一步精简 Planner 提示词和输出长度,降低普通指令解析延迟。
57
+
58
+ ## v0.5.2
59
+ - 纯页面操作优先走本地 JS,不再请求 AI。
60
+ - 新增本地自然语言指令解析:根据 `data-ai-function`、`data-ai-description`、`data-ai-param` 将用户人话拆成多个 action,并按原顺序执行。
61
+ - 多指令本地解析失败或出现分析意图时,才进入 AI Planner。
62
+ - AI 继续负责复杂分析和含糊意图,不改变数据分析链路。
63
+ - 保持多步动作逐条执行、页面切换后等待下一步 DOM 的机制。
64
+
65
+
66
+ ## v0.5.3
67
+
68
+ - 调整播报策略:收到指令后仅播报“收到指令,请您稍等”,执行过程中不再语音播报“正在切换/接下来/正在分析”等中间过程。
69
+ - 每个操作完成后直接播报具体完成结果,例如“已切换到物联监测页面”。
70
+ - 分析开始阶段不再进行中途语音播报,分析完成后直接播报最终分析结果。
71
+ - 字幕仍保留等待状态,但不展示内部 Function / 方法名。
72
+
73
+ ## v0.5.4 - 本地工作流拆分:动作直接执行、分析步骤延后调用 AI
74
+
75
+ - 一句话先由本地 JS 按“然后/并且/再/以及”等连接词拆成独立步骤。
76
+ - 页面操作步骤依据 `data-ai-function + data-ai-param + data-ai-description` 直接执行,不调用 Planner AI。
77
+ - 分析步骤依据 DataSource 名称、描述、字段 schema 在本地选择相关数据源,随后调用一次 Analyzer AI。
78
+ - 支持“切换到集成监管,并且切换2023年数据,然后分析一下土壤数据信息”的三步流程:①菜单,②年份,③土壤数据分析。
79
+ - 前置 action 全部完成后才读取最新数据,避免分析旧页面或旧年份数据。
80
+ - 分析步骤不再额外播报“已分析当前数据”,直接播报最终分析结果。
81
+
82
+
83
+ ## v0.5.5 - 本地 JS 指令拆分与严格执行
84
+
85
+ - 连续自然语言优先由本地 JS 拆分为最小步骤,不再因为是多步指令就直接调用 Planner AI。
86
+ - `action` 指令使用 `data-ai-function + data-ai-param + data-ai-description` 本地匹配,匹配后直接执行。
87
+ - `analysis` 指令本地选择数据源,只有实际进入分析步骤时才调用 Analyzer AI。
88
+ - 混合指令严格按原顺序执行:前面的 DOM 操作完成并等待页面渲染后,才读取后续数据并进入分析。
89
+ - 只有本地无法确定的步骤才回退 Planner AI,避免不必要的模型请求。
90
+ - 修复“切换菜单 + 切换年份 + 分析土壤”这类混合指令被整句直接交给 AI、导致超时或只执行第一步的问题。
91
+
92
+
93
+ ## v0.5.6
94
+
95
+ - 非 AI 操作增加就绪重试:首次立即查找,失败后每 5 秒重试一次,最多额外重试 2 次。
96
+ - 每个多步指令独立执行;每一步都按同样的 DOM/数据就绪重试策略处理。
97
+ - 数据源读取增加两次 5 秒重试;两轮仍无数据时不阻塞后续步骤。
98
+ - AI 分析步骤开始前增加字幕和语音:‘正在分析***,请稍等。’。
99
+
100
+
101
+ ## v0.5.7 - 2026-09-14
102
+ - 多步指令之间增加固定 5 秒间隔:前一步完成后,不立即执行下一步,先等待 5 秒,给路由、Vue 渲染和业务数据请求留出稳定时间。
103
+ - 每个步骤继续独立执行就绪检查:DOM/数据首次检查后,如未就绪,等待 3 秒重试,最多额外重试 2 次。
104
+ - 数据未就绪不会立即阻塞整个队列;当前步骤完成后才进入下一步骤。
105
+ - 单步指令不增加额外 5 秒前置等待;仅多步任务的后续步骤有 5 秒间隔。
106
+
107
+
108
+ ## v0.5.8 - 多步执行稳定性修复
109
+
110
+ - 多步骤之间固定保留 5 秒缓冲,给路由、接口和组件渲染留出时间。
111
+ - 每一步先立即查找目标 DOM;如果未出现,每 3 秒重试一次,最多 2 次,避免第一个页面操作后第二步永远卡住。
112
+ - 不再让单步 DOM 等待本身先阻塞 5 秒。
113
+ - 对年份等明确语义,在前一页面还未销毁/后一页面尚未挂载时,也可以先生成 `changeYear` + 年份参数,真正执行时等待目标 DOM。
114
+ - 小园的播报回调不再阻塞命令队列,语音播放不会卡住后续页面操作。
115
+
116
+ ## v0.5.9 - 连续无连接词指令拆分修复
117
+
118
+ - 修复连续自然语言没有“然后/并且”等连接词时无法正确拆分的问题。
119
+ - 支持类似 `切换到物联监测切换到集成监管时间切换到2024` 的连续指令,按页面已声明的 `data-ai-function + data-ai-param` 能力锚点拆成 3 个独立步骤。
120
+ - 年份即使尚未渲染到当前 DOM,也可先识别为 `changeYear + 年份`,真正执行时再等待目标 DOM。
121
+ - 保持原有执行顺序、5 秒步骤间隔以及每一步 3 秒 + 3 秒重试策略。
122
+
123
+
124
+ ## v0.5.10
125
+ - 修复连续无连接词自然语言的本地拆分:按 `data-ai-param` 能力锚点切分相邻操作。
126
+ - 支持 `切换到A切换到B时间切换到2024` 这类粘连指令。
127
+ - 保留最后一个动作后的独立数据查看/分析语句。
128
+ - `查看/看一下/查询 + 土壤/墒情/数据` 等语句可识别为分析步骤。
129
+ - 普通操作仍不调用 AI;只有分析步骤进入 AI 分析。
130
+
131
+ ## v0.5.11
132
+
133
+ - 修复“查看/查询/获取土壤墒情数据”未进入数据分析流程的问题。
134
+ - “查看一下土壤墒情数据”这类自然语言现在会自动要求加载 DataSource 清单。
135
+ - 非“分析”字样但明确指向业务数据的信息请求,也会进入分析数据流程。
136
+ - 保持普通页面操作本地 JS 执行,不额外调用 AI;只有获取业务数据并需要解释时才进入分析 AI。
137
+
138
+ ## v0.5.12
139
+ - 修复小园面板 SVG 图标在部分大屏全局 CSS 下不可见的问题,强制恢复图标 display/opacity/stroke。
140
+ - 修复语音识别:手动聆听前主动申请麦克风权限,并在单次聆听期间暂停全局唤醒监听,避免两个 SpeechRecognition 实例抢占麦克风。
141
+ - 语音识别错误按 `no-speech / not-allowed / audio-capture / network` 分类提示,避免连续泛化报错。
142
+ - 语音识别获得最终结果后快速 stop,减少说完后等待时间。
143
+ - “你好小园”唤醒后自动暂停唤醒监听并进入一次性命令聆听,完成后恢复全局唤醒。
144
+ - 修复唤醒后 TTS 与语音识别抢占麦克风的问题:唤醒后不立即播放欢迎语,直接进入命令聆听。
145
+
146
+ ## v0.5.13 - 内置页面导航能力
147
+ - 新增内置 `refreshPage`:刷新当前大屏页面。
148
+ - 新增内置 `goBack`:返回浏览历史中的上一个页面。
149
+ - 新增内置 `goForward`:前往浏览历史中的下一个页面。
150
+ - 新增内置 `openDataCenter`:保留当前路径和已有查询参数,追加 `console` 查询参数后重新进入页面,用于打开当前大屏对应的数据中台。
151
+ - 新增内置 `scrollPageTop` / `scrollPageBottom`:滚动到页面顶部或底部,作为通用大屏操作补充。
152
+ - 内置能力直接注册到 Function Registry,AI 识别到对应 Function 后无需 DOM 查找即可执行。
153
+ - 内置 Function 同样进入 AI 能力描述清单,模型可以根据 description 理解用户自然语言并选择对应方法。
154
+
155
+ ## v0.5.14
156
+
157
+ - 修复内置页面操作的本地自然语言识别。
158
+ - 新增“返回上一个页面 / 后退 / 返回上一页”等 `goBack` 别名。
159
+ - 新增“前进 / 下一页”等 `goForward` 别名。
160
+ - 新增刷新页面、打开数据中台、滚动到顶部/底部等内置能力的自然语言别名。
161
+ - 内置方法优先由 JS 本地识别并直接执行,不需要调用 AI。
162
+
163
+
164
+
165
+ ## v0.5.15
166
+ - 本地可识别页面操作继续由 JS 直接执行,不调用 AI。
167
+ - 增加轻量 Chat 模式:用户问“你是谁”“讲个笑话”等闲聊时,不走 Planner。
168
+ - 天气类问题:注册了天气/气象数据源时读取实时数据再分析;没有数据源时不编造实时天气。
169
+ - Chat 模式使用短提示词、关闭深度思考、低输出上限。
170
+
171
+ ## v0.5.16
172
+
173
+ - 路由逻辑优化:本地 JS 无法识别为页面指令或数据分析时,直接进入 Chat AI,不再先调用 Planner AI。
174
+ - 普通问题(如“Vue3 生命周期是什么?”、“讲个笑话”)只发起一次 Chat 请求。
175
+ - 本地可识别的页面操作继续零 Planner 调用,直接执行 `data-ai-function + data-ai-param`。
176
+ - 本地可识别的数据分析仍按现有流程获取实时数据后调用 Analyzer AI。
177
+ - 混合输入场景中,先执行本地可识别步骤,剩余自然语言直接交给 Chat AI,不再二次 Planner。
178
+
179
+ ## v0.5.17
180
+ - 新指令提交时立即中断上一条 TTS 播报,清空旧播报队列。
181
+ - 新指令建立独立 session,旧指令异步执行完成后不再抢占新指令的字幕、结果或语音播报。
182
+ - 允许用户在上一条任务仍处理时继续提交文字新指令;新指令拥有最新播报优先级。
183
+ - 保留原有业务执行逻辑,不主动取消已经开始的页面操作,只停止旧任务的语音/结果展示。
184
+
185
+
186
+ ## v0.5.18
187
+
188
+ - 新增 FreeTTS 第三方 TTS Provider。
189
+ - 默认推荐中文女声 `zh-CN-XiaoxiaoNeural`。
190
+ - 支持 `rate / pitch / outputFormat` 配置。
191
+ - 保留浏览器 SpeechSynthesis 作为失败/未配置时的自动兜底。
192
+ - 新问题到来时可停止当前 FreeTTS 音频,避免旧问题继续播报。
193
+
194
+
195
+ ## v0.5.19
196
+ - 修复 FreeTTS 浏览器播放失败:增加 Web Audio 解锁机制,避免异步 TTS 完成后 HTMLAudioElement 被 Chrome/Edge autoplay 策略拦截。
197
+ - FreeTTS 播放优先走 AudioContext + decodeAudioData,再回退到 Audio 元素。
198
+ - 增加 FreeTTS file_id 缓存有效期控制,避免过期 file_id 导致播放失败。
199
+ - 增加 TTS 解锁入口,在打开小园、点击麦克风、点击发送、开始处理指令时提前解锁。
200
+ - 保留浏览器兼容回退。
201
+
202
+
203
+ ## v0.5.20
204
+
205
+ - FreeTTS 增加 Vite dev server 内置轻量代理 `xiaoyuanVitePlugin()`。
206
+ - 浏览器不再直接访问 `https://freetts.org/api/v1/tts`,避免 FreeTTS REST API 的 CORS 预检失败。
207
+ - 代理在 Vite 服务端完成 FreeTTS `POST /api/v1/tts`、`file_id` 获取和 `/api/audio/{file_id}` 下载,并一次性向浏览器返回 mp3。
208
+ - FreeTTS Provider 在浏览器环境默认使用同源 `/__xiaoyuan/freetts/`;仍可通过 `tts.proxyUrl` 自定义。
209
+ - 保留原有 Web Audio、HTMLAudio fallback、TTS 打断与队列机制。
210
+
211
+
212
+ ## v0.5.21
213
+
214
+ - 处理 FreeTTS 免费版结尾的 `Generated with FreeTTS.org` 语音水印。
215
+ - FreeTTS 每次生成同时提供 SRT 时间轴;小园代理读取 SRT 最后一条真实用户文本的结束时间,只保留用户文本对应的 MP3,并额外保留约 120ms 尾音。
216
+ - 裁剪在 Node/Vite 代理侧使用本机 `ffmpeg` 完成,不在浏览器里处理 MP3。
217
+ - 如果 SRT 获取失败或服务器没有 `ffmpeg`,自动回退原始音频,不影响 TTS 正常播放。
218
+ - Vite 开发代理和生产环境示例代理均增加同样的 watermark 裁剪逻辑。
219
+ - `tts` 不需要增加新配置,默认开启;可通过 `xiaoyuanVitePlugin({ trimWatermark: false })` 关闭。
220
+
221
+ ## v0.5.22
222
+
223
+ - TTS Provider 从 FreeTTS 替换为合我意 TTS。
224
+ - 新增 `HewoyiTTSProvider`,调用 `GET https://api.hewoyi.com/api/ai/audio/speech`。
225
+ - TTS 参数同步为 `apiKey / apiUrl / voice / format / speed / model / type`,默认 `voice=zh-CN-XiaoyiNeural`、`format=mp3`、`type=speech`。
226
+ - 浏览器环境默认通过同源 `/__xiaoyuan/hewoyi-tts` 访问,避免第三方接口 CORS 问题。
227
+ - Vite 代理自动转发合我意 TTS 请求;生产环境示例改为 Node/Express 同源代理。
228
+ - 移除 FreeTTS 的 `file_id / SRT / ffmpeg` 播放链路,TTS 不再依赖 ffmpeg。
229
+ - 保留 Web Audio 优先播放、HTMLAudio fallback、语音打断和新任务优先播报机制。
230
+
231
+
232
+
233
+ ## v0.5.23
234
+
235
+ - 修复合我意 TTS 实际未打到上游接口的问题:确认浏览器端请求必须经过 `xiaoyuanVitePlugin()` 同源代理。
236
+ - 增加 `[小园 TTS]` 与 `[小园 TTS Proxy]` 调试日志,能直接看到是否发起请求、代理响应状态、音频大小。
237
+ - 合我意接口文档当前标注返回 `application/json`,代理增加递归识别音频 URL / Base64 的兼容处理。
238
+ - 若 JSON 中返回外部音频地址,由 Vite 服务端二次下载,浏览器端不再直接跨域请求该地址。
239
+ - 未发现音频地址时保留原 JSON 返回,并由前端给出明确错误,而不是静默失败。
240
+
241
+
242
+ ## v0.5.24
243
+
244
+ - 移除合我意 TTS 对 `xiaoyuanVitePlugin()` 的依赖。
245
+ - 浏览器直接调用 `tts.apiUrl`,默认 `https://api.hewoyi.com/api/ai/audio/speech`。
246
+ - 不再使用默认的 `/__xiaoyuan/hewoyi-tts` 代理地址。
247
+ - 宿主项目无需在 `vite.config.js` 中导入或注册 `xiaoyuanVitePlugin()`。
248
+ - 保留合我意 GET 参数:`key / text / voice / format / speed / model / type`。
249
+ - 保留 JSON 音频地址、Base64、直接音频响应以及 Web Audio / HTMLAudio 播放兼容。
250
+ - 保留 TTS 新指令打断、队列与调试日志。
251
+
252
+
253
+ ## v0.5.26
254
+ - 修复合我意 TTS 接口实际返回 HTML `<audio><source src="...">` 时,小园误按 JSON 解析导致无法播放的问题。
255
+ - 自动从 `source[src]` / `audio[src]` 提取接口返回的真实音频地址。
256
+ - 优先直接使用接口返回的音频 URL 创建 `Audio` 播放,不再强制 `fetch + WebAudio`,避免二次跨域导致音频无法播放。
257
+ - HTML 实体 `&amp;` 等会自动还原为真实 URL 参数。
258
+ - 保留 JSON / 直接音频 Blob 的兼容处理。
259
+
260
+ ## v0.5.26:TTS 前置门禁
261
+ - 将“收到指令,请您稍等。”改为严格的前置 TTS。
262
+ - 每次用户输入后,先请求合我意 speech 接口,并等待真实音频播放完成。
263
+ - TTS 未返回音频、播放失败或 Provider 未配置时,直接终止本次后续流程,不调用 `manager.run`、AI、DOM Function 或数据分析。
264
+ - 新增 `SpeechService.speak(text, { providerOnly: true })`,前置播报不再回退到浏览器 `speechSynthesis`,确保执行前一定走已配置的 TTS。
265
+ - 后续步骤的结果播报继续使用原有 TTS 队列与打断机制。
266
+
267
+
268
+ ## v0.5.27
269
+ - 调整前置 TTS 门禁:不再等待整段音频播放结束。
270
+ - 只要第三方 TTS 已成功返回音频并且浏览器已开始播放,立即放行后续 `manager.run / AI / DOM / 数据分析` 流程。
271
+ - 音频播放仍由小园持续持有,后续步骤不会主动中断当前 TTS;只有新指令到来时才会按照原有规则打断上一条语音。
272
+ - TTS 请求失败或播放未能启动时,仍阻止后续业务执行。
273
+
274
+ ## v0.5.28:TTS 真正开始播放后再执行步骤
275
+ - 修复上一版 `audio.play()` Promise 提前 resolve 导致“语音尚未真正播报,页面指令已经执行”的问题。
276
+ - HTMLAudio 播放门禁改为监听 `playing` 事件;只有媒体真正进入播放状态后才向上层 resolve。
277
+ - `XiaoyuanManager` 的 `onBeforeStep` 改为 `await`,支持异步 TTS 门禁。
278
+ - 第 1 步沿用用户输入后的前置 TTS;从第 2 个拆分指令开始,每个步骤执行前重新请求一次 TTS。
279
+ - 每个步骤严格遵循:TTS 请求成功 → 音频真正开始播放 → 立即执行当前 Function / DOM / 分析步骤。
280
+ - 不等待整段音频播放完成;音频进入 `playing` 后立即放行后续业务。
281
+
282
+ cat >> /mnt/data/xiaoyuan-v528-inspect/XIAOYUAN-BUSINESS-FLOW.md <<'EOF'\n\n## v0.5.29 分步 TTS 门禁流程\n\n多指令现在严格按“播报 -> 执行 -> 间隔 -> 下一步”顺序运行:\n\n1. 用户输入整句指令。\n2. 小园先请求一次 `收到指令,请您稍等。` TTS,音频真正开始播放后才进入工作流。\n3. 工作流解析出多个 step;每个 step 执行前,先生成该 step 对应的结果播报文案。\n4. 当前 step 的 TTS 请求成功且音频真正进入 `playing` 后,立即执行该 step。\n5. 当前 step 执行完成后等待 3 秒,再进入下一 step。\n6. 下一 step 重复步骤 3-5。\n\n示例:\n\n`切换到物联监测,切换2025年`\n\n执行顺序:\n\n`收到指令,请您稍等。` -> playing -> 第一步 `已切换到物联监测菜单。` -> playing -> 执行菜单切换 -> 完成 -> 等待 3 秒 -> 第二步 `已切换到2025年。` -> playing -> 执行年份切换。\n\n这样可以避免“下一条菜单已经执行完,但对应播报还没有开始”的竞态问题。\nEOF
283
+ # zip
284
+ cd /mnt/data/xiaoyuan-v528-inspect && zip -qr /mnt/data/xiaoyuan-assistant-siliconflow-v0.5.29.zip .
285
+ ls -lh /mnt/data/xiaoyuan-assistant-siliconflow-v0.5.29.zip
286
+
287
+ ## v0.5.30
288
+ - 聊天消息增加打字机效果:小园回复在消息列表中逐字/逐段显示,用户消息保持即时显示。
289
+ - TTS 增加浏览器原生 SpeechSynthesis 自动兼容:第三方 TTS 请求失败、音频解析失败或无法播放时,自动回退浏览器自带 TTS。
290
+ - 浏览器原生 TTS 以 utterance `onstart` 作为“真正开始播报”的放行节点,继续满足“开始播放后立即执行后续方法、不等待播报完成”的执行门禁。
291
+ - 保持多步骤指令的逐步 TTS 门禁、3 秒步骤间隔和新指令打断机制。
292
+
293
+
294
+ ## v0.5.31:修复聊天打字机效果
295
+ - 修复 Vue 3 `ref([])` 场景下,消息对象 `push` 后直接修改原始对象导致 `displayText` 不触发响应式更新的问题。
296
+ - 现在每次打字机 tick 都通过 `messages.value[index]` 修改 Proxy 对象,确保聊天区域实时刷新。
297
+ - 用户消息继续立即显示;小园回复逐字显示,不等待 TTS。
298
+ - 保留 v0.5.30 的第三方 TTS 优先、失败后浏览器原生 TTS 兜底机制。
299
+
300
+ ## v0.5.32:固定“收到指令,请您稍等。”本地化
301
+ - 新增 `scripts/cache-received-tts.mjs`:安装 NPM 包时只下载一次“收到指令,请您稍等。”对应的合我意音频,并写入 `src/assets/received-command.mp3`。
302
+ - 前置固定提示音优先使用随包本地 MP3,不再在每次收到新指令时调用 speech 接口。
303
+ - 本地 MP3 播放失败时,才回退到原有网络 TTS,再由 `SpeechService` 兼容浏览器原生 `speechSynthesis`。
304
+ - 保留后续每一步动态结果 TTS 的原有网络请求逻辑。
305
+ - 本地缓存脚本下载失败不会阻塞安装;这种情况下固定提示音继续走原来的网络 TTS / 浏览器 TTS 兼容链路。
306
+
307
+
308
+ ## v0.5.33
309
+ - 修复连续指令中“2025年”年份锚点未包含“年”导致分析步骤被错误解析为“年,分析一下土壤数据”。年份锚点现在整体参与拆分。
310
+ - 分析步骤播报文案增加前缀清洗,避免“正在分析年……”这类错误语音。
311
+
312
+
313
+ ## v0.5.34
314
+ - 优化多指令分析语句拆分:识别“分析一下/查看一下/查询一下”等前置口语动词并从 analysis instruction 中剥离,避免生成“正在分析分析一下土壤数据”。
315
+ - 保留“切换2025年”作为完整年份 action,不污染后续分析片段。
316
+ - 分析 TTS 文案统一按分析主题生成,如“正在分析土壤数据,请稍等。”。
317
+
318
+
319
+ ## v0.5.35
320
+ - 优化多步骤工作流时序:AI 分析结果播报必须完整播放结束后,才允许进入下一步指令。
321
+ - 新增 `waitForEnd` TTS 能力:普通操作仍在音频 `playing` 时立即执行;AI 分析结果等待 `onended` 后再继续,避免“分析结果还在播报就执行下一步”。
322
+ - 分析提示“正在分析……请稍等”不再阻塞数据获取和 AI 分析,提示播报与分析并行,降低等待体感。
323
+ - 多数据源改为并行获取,减少分析前的数据等待时间。
324
+ - AI 分析完成后,TTS 播报作为下一步指令的门禁;浏览器原生 TTS 兼容链路同样支持完整播报等待。
325
+
326
+ - 性能优化:普通 DOM/Function 执行后的固定等待由 8 秒降为 200ms;步骤之间仍保留 3 秒业务间隔,页面元素缺失时仍按 3 秒重试机制处理。
327
+
328
+
329
+ ## v0.5.36
330
+
331
+ - “收到指令,请您稍等。”改为始终优先使用本地 MP3,不再为这条固定提示语发起网络 TTS 请求。
332
+ - 预加载并复用本地 Audio 实例,降低首播偶发不出声的问题。
333
+ - 本地音频播放失败时自动降级为浏览器原生 speechSynthesis,不再回退到网络 TTS。
334
+ - 保留普通动态播报使用合我意 TTS。
335
+
336
+ ## v0.5.37
337
+ - 修复多条语音指令场景下“收到指令,请您稍等”本地提示音偶发不播放的问题。
338
+ - 在用户点击/启动语音识别阶段预解锁并预解码本地 MP3 为 AudioBuffer,识别结果返回后直接 start 播放,不依赖新的用户手势。
339
+ - 文本提交、手动语音、唤醒语音均提前 await `unlockTTS()`。
340
+ - 前置提示音完全不访问网络;本地 AudioBuffer 失败时才回退浏览器原生 speechSynthesis。
341
+
342
+
343
+ ## v0.5.39
344
+
345
+ - 将真实的 `收到指令,请您稍等。` MP3 作为 NPM 包静态资源内置,voice 固定为 `zh-CN-XiaoyiNeural`。
346
+ - 当前 voice 命中包内置音频时,首次打开浏览器也无需请求合我意 TTS。
347
+ - 前置提示音本地解析顺序调整为:NPM 包内置音频 → IndexedDB → 合我意 TTS → 浏览器原生 TTS 兜底。
348
+ - 非内置 voice 仍保持按 voice 使用 IndexedDB 缓存,voice 切换后不会复用其他 voice 的提示音。
349
+
350
+ ## v0.5.40
351
+ - 修复本地“收到指令,请您稍等”音频偶尔没有真正出声的问题。
352
+ - 本地前置提示音不再优先走 WebAudio `AudioBufferSourceNode` 后立即 resolve;改为优先使用 HTMLAudioElement,并监听 `playing`。
353
+ - `playing` 后增加极短启动保持时间,确保浏览器完成首个音频帧输出,再放行后续指令流程,避免下一条 TTS 的 `stop()` 抢先切断本地提示音。
354
+ - 动态 TTS 仍保持原有快速播放/门禁策略,不影响整体流程速度。
355
+
356
+
357
+ ## v0.5.41
358
+
359
+ - 修复多步骤指令中“收到指令,请您稍等”本地 TTS 被后续步骤 TTS 的 `stop()` 提前打断的问题。
360
+ - “收到指令,请您稍等”使用独立 Audio 通道;新步骤 TTS 不会停止该提示音。
361
+ - 只有新的整条用户指令触发全局打断时,才会停止前置提示音。
362
+ - 本地提示音仍保持“真正触发 `playing` 后立即放行后续流程”,不等待播放结束。
363
+
364
+
365
+ ## v0.5.42
366
+ - 多指令执行增加异常隔离:单步 hook/TTS 异常不再直接击穿整个工作流。
367
+ - TTS 前置播报与步骤播报增加快速重试,失败时继续使用浏览器原生 TTS 兜底。
368
+ - 分析流程移除重复的“正在分析”TTS 请求,减少语音竞争和额外延迟。
369
+ - FreeTTS/合我意 HTTP 请求增加超时控制,防止网络卡死拖住整个工作流。
370
+ - AI 分析失败转为步骤失败结果,不再产生未捕获异常;保持后续流程可控。
371
+ - 页面渲染等待进一步缩短到 120ms,优先保证响应速度。
372
+
373
+ ## v0.5.43
374
+ - “收到指令,请您稍等”改为完全异步提示通道,不再阻塞 manager.run。
375
+ - 固定前置提示使用独立本地 Audio 通道,普通 TTS stop 不会主动打断。
376
+ - 本地音频加载失败时不阻塞后续业务流程。
377
+ - 首次无本地缓存时,后台请求并缓存,不等待网络 TTS 完成。
378
+
379
+ ## v0.5.44
380
+ - 新增 `closeDataCenter` 内置指令。
381
+ - “关闭数据中台 / 退出数据中台”会从当前 URL 删除 `console` 参数,然后重新加载当前页面。
382
+ - 保持 `openDataCenter`:为当前 URL 增加 `console` 参数后重新加载。
383
+
384
+ ## v0.5.45
385
+
386
+ - 新增内置 `zh-CN-XiaoxiaoNeural` 本地‘收到指令,请您稍等’MP3。
387
+ - 与 `zh-CN-XiaoyiNeural` 一样优先使用包内静态音频,不请求网络 TTS。
388
+ - voice 切换时按 voice 分别匹配内置本地音频与 IndexedDB 缓存。
package/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # 小园 v0.5.1
2
+
3
+ 本版本以“性能优先 + 先规划、后执行、分析再调用 AI”为核心。
4
+
5
+ ## 最终执行架构
6
+
7
+ 用户自然语言 → Planner AI(仅一次、不开启 thinking) → steps 队列 → 逐步执行 → 需要分析时才读取实时数据并调用第二次 AI。
8
+
9
+ ### 1. Planner AI
10
+ 只负责把人话转换为真实 Function / DataSource:
11
+
12
+ ```json
13
+ {
14
+ "type": "workflow",
15
+ "steps": [
16
+ {
17
+ "type": "action",
18
+ "function": "handleMenuClick",
19
+ "params": { "value": "集成监管" }
20
+ },
21
+ {
22
+ "type": "action",
23
+ "function": "changeYear",
24
+ "params": { "value": "2023" }
25
+ },
26
+ {
27
+ "type": "analysis",
28
+ "dataRequests": [
29
+ { "name": "soilData", "params": {} }
30
+ ],
31
+ "instruction": "分析当前土壤数据信息"
32
+ }
33
+ ]
34
+ }
35
+ ```
36
+
37
+ 普通执行请求不开启 thinking,使用较小输出上限;分析步骤完成前面的页面操作后,才读取最新数据并开启 thinking。
38
+
39
+ ## 页面 DOM 约定
40
+
41
+ ```vue
42
+ <div
43
+ data-ai-function="changeYear"
44
+ :data-ai-param="year"
45
+ data-ai-description="切换当前大屏时间年份"
46
+ @click="changeYear(year)"
47
+ >
48
+ {{ year }}
49
+ </div>
50
+ ```
51
+
52
+ - `data-ai-function`:AI 要调用的能力名称。
53
+ - `data-ai-description`:告诉 AI 这个能力是什么、什么时候调用。
54
+ - `data-ai-param`:具体目标实例,例如 `2023`。
55
+
56
+ SDK 直接用 `data-ai-function + data-ai-param` 精确定位,不遍历页面可见文字猜测。页面切换后如果目标 DOM 尚未出现,SDK 会等待它出现。
57
+
58
+ ## 数据注册
59
+
60
+ ```js
61
+ xiaoyuan.registerData({
62
+ name: 'soilData',
63
+ description: '当前页面墒情监测数据,用于分析土壤水分、温度和养分情况',
64
+ schema: {
65
+ depth: { type: 'number', description: '土壤深度,cm' },
66
+ humidity: { type: 'number', description: '土壤湿度,%' },
67
+ temperature: { type: 'number', description: '土壤温度,℃' }
68
+ },
69
+ get: () => tableData.value
70
+ })
71
+ ```
72
+
73
+ ## 业务处理规则
74
+
75
+ 小园采用“先路由、后执行/分析”的方式:
76
+
77
+ ```text
78
+ 用户自然语言
79
+
80
+ 第一次快速 AI:判断 action / analysis / chat,并提取 Function + 参数
81
+
82
+ 如果是 action → 立即由 JavaScript 执行 data-ai-function,不再调用第二次 AI
83
+
84
+ 如果是 analysis → 先执行前置 action,拿到最新数据后再调用第二次 AI 深度分析
85
+ ```
86
+
87
+ 这保证页面点击类操作只需要一次轻量 AI 请求,真正需要数据分析时才进入第二次推理。
88
+
89
+ ## 安装配置
90
+
91
+ ```js
92
+ app.use(Xiaoyuan, {
93
+ model: 'THUDM/GLM-Z1-9B-0414',
94
+ aiUrl: 'https://api.siliconflow.cn/v1/chat/completions',
95
+ apiKey: '你的 SiliconFlow API Key',
96
+ wakeWord: '你好小园',
97
+ enableWakeWord: true,
98
+ enableTTS: true
99
+ })
100
+ ```
101
+
102
+ 除模型、请求地址和 API Key 外,thinking、token、超时、执行队列等策略由 SDK 内部自动管理。
103
+
104
+ ## v0.4.7 性能优化
105
+
106
+ - 一句话只进行一次快速 Planner AI 请求。
107
+ - Planner 不开启 thinking,默认较小输出长度。
108
+ - DOM 能力按 `data-ai-function` 聚合,多个相同参数不重复发送完整节点。
109
+ - Planner 阶段不发送完整数据 schema,只发送 DataSource 名称与描述。
110
+ - 分析阶段只发送本次实际请求的数据源及其 schema。
111
+ - 页面操作按 steps 顺序执行;后续步骤只排队,不提前执行。
112
+ - TTS 不阻塞业务执行,采用本地语音队列;用户可以立刻开始下一步页面操作。
113
+ - 每步 DOM 等待有上限,AI 请求也有超时,避免长时间假死。
114
+ - 分析任务单独调用第二次 AI,并开启 thinking。
115
+
116
+
117
+ ## v0.5.1 性能/流程优化
118
+
119
+ - 第一阶段 AI 明确承担“意图路由”:只判断 action / analysis / chat,并提取真实 Function 与参数。
120
+ - 纯页面操作只调用一次轻量 Planner AI,解析完成后直接由 JavaScript/DOM 执行,不再调用第二次 AI。
121
+ - 数据分析请求先完成前置页面操作,再读取最新数据,最后才调用第二次 AI。
122
+ - 精简 Planner 提示词和输出上限,减少请求上下文与生成长度。
123
+ - 保留 `data-ai-function + data-ai-param + data-ai-description` 协议。
124
+
125
+
126
+ ### v0.5.7 关键执行策略
127
+ - 多步任务:第一步立即执行,后续每一步间隔 5 秒。
128
+ - 每一步的 DOM / 数据就绪检查失败后,分别等待 3 秒进行两次重试。
129
+
130
+ ## 内置通用方法
131
+
132
+ 小园已经内置以下通用页面能力,业务项目无需额外注册:
133
+
134
+ | Function | 作用 |
135
+ | --- | --- |
136
+ | `refreshPage` | 刷新当前页面 |
137
+ | `goBack` | 返回上一个历史页面 |
138
+ | `goForward` | 前往下一个历史页面 |
139
+ | `openDataCenter` | 当前地址追加 `console` 参数并重新加载 |
140
+ | `closeDataCenter` | 当前地址移除 `console` 参数并重新加载 |
141
+ | `scrollPageTop` | 滚动到页面顶部 |
142
+ | `scrollPageBottom` | 滚动到页面底部 |
143
+
144
+ AI 会根据 Function description 理解用户说法,例如:
145
+
146
+ - “刷新一下页面” → `refreshPage`
147
+ - “返回刚才那个页面” → `goBack`
148
+ - “进入数据中台” → `openDataCenter`
149
+ - “关闭数据中台” / “退出数据中台” → `closeDataCenter`
150
+
151
+ 业务 Function 仍然推荐使用 `data-ai-function + data-ai-param + data-ai-description`。
152
+ ## v0.5.14 内置方法自然语言
153
+
154
+ 以下内置能力优先由本地 JS 直接识别:
155
+
156
+ - 返回上一个页面 / 返回上一页 / 后退 → `goBack`
157
+ - 前进 / 下一页 / 前往下一个页面 → `goForward`
158
+ - 刷新页面 / 重新加载 → `refreshPage`
159
+ - 打开数据中台 / 进入数据中台 → `openDataCenter`
160
+ - 关闭数据中台 / 退出数据中台 → `closeDataCenter`
161
+ - 返回顶部 → `scrollPageTop`
162
+ - 滚动到底部 → `scrollPageBottom`
163
+
164
+
165
+
166
+ ### v0.5.15
167
+ 页面操作走本地 JS;数据分析走数据读取 + Analyzer AI;普通闲聊走轻量 Chat AI;实时天气优先使用注册的数据源。
168
+
169
+
170
+
171
+ #### v0.5.22 合我意 TTS
172
+
173
+ 小园 TTS 已从 FreeTTS 替换为合我意 TTS。接口使用 `GET https://api.hewoyi.com/api/ai/audio/speech`,支持 `text / voice / format / speed / model / type` 参数;当前默认中文女声为 `zh-CN-XiaoyiNeural`。官方接口文档标注该接口为 GET、返回 `application/json`,语音合成类型为 `type=speech`。
174
+
175
+ 示例:
176
+
177
+ ```js
178
+ app.use(Xiaoyuan, {
179
+ model: 'THUDM/GLM-Z1-9B-0414',
180
+ aiUrl: 'https://api.siliconflow.cn/v1/chat/completions',
181
+ apiKey: 'YOUR_SILICONFLOW_KEY',
182
+ tts: {
183
+ provider: 'hewoyi',
184
+ apiKey: 'YOUR_HEWOYI_TTS_KEY',
185
+ apiUrl: 'https://api.hewoyi.com/api/ai/audio/speech',
186
+ voice: 'zh-CN-XiaoyiNeural',
187
+ format: 'mp3',
188
+ speed: '',
189
+ model: '',
190
+ type: 'speech'
191
+ }
192
+ })
193
+ ```
194
+
195
+ 浏览器直接请求配置中的 `apiUrl`,默认就是 `https://api.hewoyi.com/api/ai/audio/speech`。当前该接口可直接由浏览器调用时,不再需要 Vite Proxy,也不需要在宿主项目增加任何小园 Vite 插件。
196
+
197
+ 小园会兼容合我意返回的 JSON 音频地址/音频字段;如果上游直接返回音频,也会直接播放。Web Audio 失败时自动回退 HTMLAudioElement。
198
+
199
+
200
+ ## v0.5.24 TTS 直连修复
201
+
202
+ 合我意 TTS 改为浏览器直接请求配置的 `apiUrl`,不再依赖 `xiaoyuanVitePlugin()`。启动后控制台会出现 `[小园 TTS]` 的请求、响应与播放日志。若目标部署环境的浏览器策略允许该接口跨域,则不需要任何额外代理。
203
+
204
+
205
+ ### v0.5.26 TTS 返回格式
206
+ 合我意 speech 接口可能直接返回 HTML audio 标签。小园会自动提取 `<source src>` 中的真实音频地址并直接播放,因此无需用户侧增加 Vite 插件或代理配置。
207
+
208
+
209
+ ## v0.5.36
210
+
211
+ - “收到指令,请您稍等。”改为始终优先使用本地 MP3,不再为这条固定提示语发起网络 TTS 请求。
212
+ - 预加载并复用本地 Audio 实例,降低首播偶发不出声的问题。
213
+ - 本地音频播放失败时自动降级为浏览器原生 speechSynthesis,不再回退到网络 TTS。
214
+ - 保留普通动态播报使用合我意 TTS。
215
+
216
+ ### 前置提示音缓存
217
+ `收到指令,请您稍等。`按 `voice` 独立缓存到浏览器 IndexedDB。首次没有对应 voice 缓存时调用合我意 TTS,首次播放成功后异步落盘;之后相同 voice 不再走网络。切换 voice 会使用对应 voice 的独立缓存。
218
+
219
+
220
+ ### v0.5.42 稳定性优化
221
+ 多指令场景增加异常隔离、TTS 快速重试、TTS 请求超时和分析提示去重;普通步骤继续按“playing 后立即执行”,AI 分析结果继续等待整段语音播放完成。
222
+
223
+
224
+ ### v0.5.43
225
+ “收到指令,请您稍等”现在是独立异步提示音,不阻塞后续菜单、Function、数据分析和 AI 流程;当前 voice 有本地音频时直接播放,无缓存时后台请求并缓存。
226
+
227
+ ### v0.5.45 本地前置 TTS
228
+
229
+ 包内已内置 `zh-CN-XiaoxiaoNeural` 的“收到指令,请您稍等”MP3。使用该 voice 时首次打开即可直接播放本地资源,无需网络请求。