@szjy/ai-coms 0.1.10 → 0.1.13

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.
Files changed (30) hide show
  1. package/README.md +43 -1
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.mjs +1809 -3425
  4. package/dist/index.umd.js +3 -2
  5. package/dist/packages/api/ai.d.ts +12 -7
  6. package/dist/packages/api/mock.d.ts +16 -0
  7. package/dist/packages/common/audio/recorder.d.ts +13 -4
  8. package/dist/packages/common/audio/transcript-sanitize.d.ts +16 -0
  9. package/dist/packages/common/audio/voice-manager.d.ts +5 -15
  10. package/dist/packages/components/AiChat/src/components/plugins/markdown.d.ts +2 -2
  11. package/dist/packages/components/AiChat/src/composables/useChatDeps.d.ts +6 -0
  12. package/dist/packages/components/AiChat/src/custom-ui/actions/postMessage.d.ts +12 -0
  13. package/dist/packages/components/AiChat/src/custom-ui/components/button.d.ts +9 -0
  14. package/dist/packages/components/AiChat/src/custom-ui/components/list.d.ts +8 -0
  15. package/dist/packages/components/AiChat/src/custom-ui/events.d.ts +27 -0
  16. package/dist/packages/components/AiChat/src/custom-ui/index.d.ts +7 -0
  17. package/dist/packages/components/AiChat/src/custom-ui/parse.d.ts +11 -0
  18. package/dist/packages/components/AiChat/src/custom-ui/registry.d.ts +8 -0
  19. package/dist/packages/components/AiChat/src/custom-ui/render.d.ts +18 -0
  20. package/dist/packages/components/AiChat/src/custom-ui/types.d.ts +84 -0
  21. package/dist/packages/components/AiChat/src/index.vue.d.ts +87 -4
  22. package/dist/packages/components/AiChat/src/transform/index.d.ts +14 -1
  23. package/dist/packages/components/AiChatPlain/index.d.ts +3 -0
  24. package/dist/packages/components/AiChatPlain/src/index.vue.d.ts +213 -0
  25. package/dist/packages/components/components.d.ts +1 -0
  26. package/dist/scripts/ai/README.md +8 -1
  27. package/dist/scripts/ai/whisper.worker.js +104 -13
  28. package/dist/style.css +2 -2
  29. package/package.json +1 -1
  30. package/dist/packages/common/audio/zh-simplified.d.ts +0 -8
@@ -0,0 +1,213 @@
1
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
2
+ token: {
3
+ type: StringConstructor;
4
+ default: string;
5
+ };
6
+ identifier: {
7
+ type: StringConstructor;
8
+ default: string;
9
+ };
10
+ baseUrl: {
11
+ type: StringConstructor;
12
+ default: string;
13
+ };
14
+ title: {
15
+ type: StringConstructor;
16
+ default: string;
17
+ };
18
+ /**
19
+ * 大模型名称,对应 LLMTypes 中的 modelName
20
+ * 例如: 'szjy' | 'spark' | 'dify-openai' | 'siliconflow' 等
21
+ * 默认使用 'szjy'
22
+ */
23
+ llmName: {
24
+ type: StringConstructor;
25
+ default: string;
26
+ };
27
+ /**
28
+ * 消息后处理回调函数
29
+ * 在 AI 消息渲染完成后调用,可用于自定义处理渲染后的内容
30
+ * @param container - 消息容器的 DOM 元素
31
+ * @param textContent - 消息的文本内容
32
+ */
33
+ messagePostRender: {
34
+ type: FunctionConstructor;
35
+ default: null;
36
+ };
37
+ /**
38
+ * 额外配置参数,用于扩展供应商 API 调用
39
+ * 例如:{ projectId: 'xxx' } 供 Dify 等供应商使用
40
+ */
41
+ extraConfig: {
42
+ type: ObjectConstructor;
43
+ default: () => {};
44
+ };
45
+ /**
46
+ * 语音识别模型静态资源基础路径,默认为 '/sounds/'
47
+ */
48
+ soundBaseUrl: {
49
+ type: StringConstructor;
50
+ default: string;
51
+ };
52
+ /**
53
+ * Whisper Worker 脚本地址。不传则自动探测库产物与 /scripts/ai/whisper.worker.js
54
+ */
55
+ workerUrl: {
56
+ type: StringConstructor;
57
+ default: string;
58
+ };
59
+ /**
60
+ * 是否显示麦克风语音输入入口,默认关闭
61
+ */
62
+ enableVoiceInput: {
63
+ type: BooleanConstructor;
64
+ default: boolean;
65
+ };
66
+ /**
67
+ * 是否显示上传音频/视频识别入口,默认关闭
68
+ */
69
+ enableVoiceUpload: {
70
+ type: BooleanConstructor;
71
+ default: boolean;
72
+ };
73
+ /**
74
+ * szjy-ui fence 自定义 UI 配置,透传给动作处理器。
75
+ * 例如:{ postMessage: { target: () => sandboxIframe.contentWindow, targetOrigin: 'http://...' } }
76
+ */
77
+ customUi: {
78
+ type: ObjectConstructor;
79
+ default: null;
80
+ };
81
+ /**
82
+ * szjy-ui 动作拦截钩子:(action, params, triggerEl) => false 可阻止内置动作执行
83
+ */
84
+ uiActionHandler: {
85
+ type: FunctionConstructor;
86
+ default: null;
87
+ };
88
+ /**
89
+ * Mock 响应内容:llmName 为 standard(模拟数据模型)时不请求真实后端,
90
+ * 将该内容流式输出,用于联调 szjy-ui fence / postMessage 动作
91
+ */
92
+ mockResponse: {
93
+ type: StringConstructor;
94
+ default: string;
95
+ };
96
+ }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
97
+ submit: (...args: any[]) => void;
98
+ "ui-action": (...args: any[]) => void;
99
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
100
+ token: {
101
+ type: StringConstructor;
102
+ default: string;
103
+ };
104
+ identifier: {
105
+ type: StringConstructor;
106
+ default: string;
107
+ };
108
+ baseUrl: {
109
+ type: StringConstructor;
110
+ default: string;
111
+ };
112
+ title: {
113
+ type: StringConstructor;
114
+ default: string;
115
+ };
116
+ /**
117
+ * 大模型名称,对应 LLMTypes 中的 modelName
118
+ * 例如: 'szjy' | 'spark' | 'dify-openai' | 'siliconflow' 等
119
+ * 默认使用 'szjy'
120
+ */
121
+ llmName: {
122
+ type: StringConstructor;
123
+ default: string;
124
+ };
125
+ /**
126
+ * 消息后处理回调函数
127
+ * 在 AI 消息渲染完成后调用,可用于自定义处理渲染后的内容
128
+ * @param container - 消息容器的 DOM 元素
129
+ * @param textContent - 消息的文本内容
130
+ */
131
+ messagePostRender: {
132
+ type: FunctionConstructor;
133
+ default: null;
134
+ };
135
+ /**
136
+ * 额外配置参数,用于扩展供应商 API 调用
137
+ * 例如:{ projectId: 'xxx' } 供 Dify 等供应商使用
138
+ */
139
+ extraConfig: {
140
+ type: ObjectConstructor;
141
+ default: () => {};
142
+ };
143
+ /**
144
+ * 语音识别模型静态资源基础路径,默认为 '/sounds/'
145
+ */
146
+ soundBaseUrl: {
147
+ type: StringConstructor;
148
+ default: string;
149
+ };
150
+ /**
151
+ * Whisper Worker 脚本地址。不传则自动探测库产物与 /scripts/ai/whisper.worker.js
152
+ */
153
+ workerUrl: {
154
+ type: StringConstructor;
155
+ default: string;
156
+ };
157
+ /**
158
+ * 是否显示麦克风语音输入入口,默认关闭
159
+ */
160
+ enableVoiceInput: {
161
+ type: BooleanConstructor;
162
+ default: boolean;
163
+ };
164
+ /**
165
+ * 是否显示上传音频/视频识别入口,默认关闭
166
+ */
167
+ enableVoiceUpload: {
168
+ type: BooleanConstructor;
169
+ default: boolean;
170
+ };
171
+ /**
172
+ * szjy-ui fence 自定义 UI 配置,透传给动作处理器。
173
+ * 例如:{ postMessage: { target: () => sandboxIframe.contentWindow, targetOrigin: 'http://...' } }
174
+ */
175
+ customUi: {
176
+ type: ObjectConstructor;
177
+ default: null;
178
+ };
179
+ /**
180
+ * szjy-ui 动作拦截钩子:(action, params, triggerEl) => false 可阻止内置动作执行
181
+ */
182
+ uiActionHandler: {
183
+ type: FunctionConstructor;
184
+ default: null;
185
+ };
186
+ /**
187
+ * Mock 响应内容:llmName 为 standard(模拟数据模型)时不请求真实后端,
188
+ * 将该内容流式输出,用于联调 szjy-ui fence / postMessage 动作
189
+ */
190
+ mockResponse: {
191
+ type: StringConstructor;
192
+ default: string;
193
+ };
194
+ }>> & Readonly<{
195
+ onSubmit?: ((...args: any[]) => any) | undefined;
196
+ "onUi-action"?: ((...args: any[]) => any) | undefined;
197
+ }>, {
198
+ title: string;
199
+ baseUrl: string;
200
+ token: string;
201
+ identifier: string;
202
+ llmName: string;
203
+ messagePostRender: Function;
204
+ extraConfig: Record<string, any>;
205
+ soundBaseUrl: string;
206
+ workerUrl: string;
207
+ enableVoiceInput: boolean;
208
+ enableVoiceUpload: boolean;
209
+ customUi: Record<string, any>;
210
+ uiActionHandler: Function;
211
+ mockResponse: string;
212
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
213
+ export default _default;
@@ -1 +1,2 @@
1
1
  export * from './AiChat/index';
2
+ export * from './AiChatPlain/index';
@@ -6,9 +6,16 @@
6
6
  | :--- | ---: | :--- | :--- |
7
7
  | `whisper.worker.js` | ~10 KB | 可以 | 改 `whisper.worker.ts` 协议时 |
8
8
  | `transformers.runtime.js` | ~56 MB | 否 | 升级 `@huggingface/transformers` |
9
+ | `ort-wasm-simd-threaded.jsep.mjs` | ~45 KB | 否 | 随 onnxruntime-web 升级 |
10
+ | `ort-wasm-simd-threaded.jsep.wasm` | ~21 MB | 否 | 随 onnxruntime-web 升级 |
9
11
 
10
- 日常改识别协议只提交 / 重拷 `whisper.worker.js`。大运行时请加入宿主 `.gitignore`:
12
+ 日常改识别协议只提交 / 重拷 `whisper.worker.js`。大运行时与 ORT WASM 请加入宿主 `.gitignore`:
11
13
 
12
14
  ```
13
15
  public/scripts/ai/transformers.runtime.js
16
+ public/scripts/ai/ort-wasm*
17
+ public/scripts/ai/*.wasm
14
18
  ```
19
+
20
+ `pnpm build:voice` / `pnpm dev` 会从 `node_modules/onnxruntime-web/dist` 自动同步 `ort-wasm*` 到本目录。缺这些文件时控制台会出现:
21
+ `no available backend found ... ort-wasm-simd-threaded.jsep.mjs`。
@@ -35,6 +35,51 @@ async function clearVoiceModelCache(dirName = DEFAULT_CACHE_DIR) {
35
35
  }
36
36
  return cleared;
37
37
  }
38
+ const PURE_HALLUCINATION = [
39
+ /^(谢谢(观看|收看)?|感謝觀看|感谢观看)[。.!!]*$/u,
40
+ /^(thank you( for watching)?|thanks for watching)[。.!!]*$/i,
41
+ /^(字幕(by|志愿者|組|组)?|subscribe|订阅|訂閱)[。.!!]*$/iu,
42
+ /^(请不吝点赞|請不吝點贊).*$/u,
43
+ /^(三十分|三十秒|三十分钟|三十分鐘)[。.!!]*$/u
44
+ ];
45
+ function collapseRepeatedPhrases(text) {
46
+ if (!text) return "";
47
+ let s = text.replace(/[ \t]+/g, " ").replace(/([一-龥])\s+(?=[一-龥])/g, "$1").trim();
48
+ if (!s) return "";
49
+ let prev = "";
50
+ let guard = 0;
51
+ while (s !== prev && guard++ < 12) {
52
+ prev = s;
53
+ for (let len = 12; len >= 2; len--) {
54
+ const re = new RegExp(`(.{${len}})\\1+`, "g");
55
+ s = s.replace(re, "$1");
56
+ }
57
+ s = s.replace(/(.)\1{3,}/g, "$1$1");
58
+ }
59
+ return s.trim();
60
+ }
61
+ function isPureHallucination(text) {
62
+ const t = text.trim();
63
+ if (!t) return true;
64
+ return PURE_HALLUCINATION.some((re) => re.test(t));
65
+ }
66
+ function clampTranscriptToAudio(text, durationSec) {
67
+ if (!text) return "";
68
+ const maxChars = Math.max(16, Math.round(Math.max(0, durationSec) * 8) + 12);
69
+ if (text.length <= maxChars) return text;
70
+ return text.slice(0, maxChars).trim();
71
+ }
72
+ function sanitizeTranscript(text, durationSec = 0) {
73
+ let cleaned = collapseRepeatedPhrases(text || "");
74
+ if (!cleaned) return "";
75
+ if (isPureHallucination(cleaned)) return "";
76
+ if (durationSec > 0) {
77
+ cleaned = clampTranscriptToAudio(cleaned, durationSec);
78
+ cleaned = collapseRepeatedPhrases(cleaned);
79
+ if (isPureHallucination(cleaned)) return "";
80
+ }
81
+ return cleaned;
82
+ }
38
83
  if (env?.backends?.onnx?.wasm) {
39
84
  env.backends.onnx.wasm.wasmPaths = new URL(
40
85
  /* @vite-ignore */
@@ -46,6 +91,7 @@ let asrPipeline = null;
46
91
  let isInitializing = false;
47
92
  let transcribeQueue = [];
48
93
  let transcribeRunning = false;
94
+ const cancelledTaskIds = /* @__PURE__ */ new Set();
49
95
  const originalFetch = self.fetch.bind(self);
50
96
  self.fetch = async (input, init) => {
51
97
  const response = await originalFetch(input, init);
@@ -71,6 +117,16 @@ self.addEventListener("message", async (e) => {
71
117
  case "TRANSCRIBE":
72
118
  await enqueueTranscribe(data);
73
119
  break;
120
+ case "CANCEL":
121
+ if (typeof data?.taskId === "number") {
122
+ cancelledTaskIds.add(data.taskId);
123
+ if (cancelledTaskIds.size > 24) {
124
+ const first = cancelledTaskIds.values().next().value;
125
+ if (typeof first === "number") cancelledTaskIds.delete(first);
126
+ }
127
+ transcribeQueue = transcribeQueue.filter((item) => item?.taskId !== data.taskId);
128
+ }
129
+ break;
74
130
  case "CLEAR_CACHE":
75
131
  try {
76
132
  await clearVoiceModelCache();
@@ -195,22 +251,31 @@ async function initPipeline(config) {
195
251
  }
196
252
  }
197
253
  async function enqueueTranscribe(data) {
254
+ if (typeof data?.taskId === "number" && cancelledTaskIds.has(data.taskId)) {
255
+ return;
256
+ }
198
257
  transcribeQueue.push(data);
199
258
  if (transcribeRunning) return;
200
259
  transcribeRunning = true;
201
260
  while (transcribeQueue.length) {
202
261
  const next = transcribeQueue.shift();
262
+ if (typeof next?.taskId === "number" && cancelledTaskIds.has(next.taskId)) {
263
+ continue;
264
+ }
203
265
  await transcribeAudio(next);
204
266
  }
205
267
  transcribeRunning = false;
206
268
  }
207
- function getPeakAmplitude(audio) {
208
- let maxVal = 0;
269
+ function getAudioStats(audio) {
270
+ let peak = 0;
271
+ let sumSq = 0;
209
272
  for (let i = 0; i < audio.length; i++) {
210
- const abs = Math.abs(audio[i]);
211
- if (abs > maxVal) maxVal = abs;
273
+ const sample = audio[i];
274
+ const abs = Math.abs(sample);
275
+ if (abs > peak) peak = abs;
276
+ sumSq += sample * sample;
212
277
  }
213
- return maxVal;
278
+ return { peak, rms: Math.sqrt(sumSq / Math.max(1, audio.length)) };
214
279
  }
215
280
  async function transcribeAudio(data) {
216
281
  if (!asrPipeline) {
@@ -227,33 +292,52 @@ async function transcribeAudio(data) {
227
292
  language = "chinese",
228
293
  task = "transcribe",
229
294
  chunkIndex = 0,
230
- isFinal = true
295
+ isFinal = true,
296
+ mode = "append",
297
+ nativeChunking = false
231
298
  } = data;
299
+ if (typeof taskId === "number" && cancelledTaskIds.has(taskId)) {
300
+ return;
301
+ }
232
302
  try {
233
303
  self.postMessage({ type: "TRANSCRIBING", taskId, chunkIndex });
234
- const peak = getPeakAmplitude(audio);
235
- if (peak < 0.012) {
304
+ const { peak, rms } = getAudioStats(audio);
305
+ if (peak < 0.018 || rms < 45e-4) {
236
306
  self.postMessage({
237
307
  type: "RESULT",
238
308
  taskId,
239
309
  chunkIndex,
240
310
  isFinal,
241
311
  silent: true,
312
+ mode,
242
313
  text: ""
243
314
  });
244
315
  return;
245
316
  }
246
- if (peak > 0 && peak < 0.4) {
247
- const gain = Math.min(3, 0.8 / peak);
317
+ if (peak > 0 && peak < 0.35) {
318
+ const gain = Math.min(1.8, 0.45 / peak);
248
319
  for (let i = 0; i < audio.length; i++) {
249
320
  audio[i] = Math.max(-1, Math.min(1, audio[i] * gain));
250
321
  }
251
322
  }
323
+ const durationSec = audio.length / 16e3;
324
+ const windowSec = Math.min(30, Math.max(0.5, durationSec));
325
+ const maxNewTokens = Math.max(24, Math.min(400, Math.round(windowSec * 12) + 16));
252
326
  let streamedText = "";
253
327
  const generateOptions = {
254
328
  language: language || "chinese",
255
- task: task || "transcribe"
329
+ task: task || "transcribe",
330
+ return_timestamps: false,
331
+ do_sample: false,
332
+ temperature: 0,
333
+ repetition_penalty: 1.12,
334
+ no_repeat_ngram_size: 3,
335
+ max_new_tokens: maxNewTokens
256
336
  };
337
+ if (nativeChunking || audio.length > 16e3 * 30) {
338
+ generateOptions.chunk_length_s = 30;
339
+ generateOptions.stride_length_s = 5;
340
+ }
257
341
  try {
258
342
  const tokenizer = asrPipeline.tokenizer;
259
343
  if (tokenizer) {
@@ -261,13 +345,14 @@ async function transcribeAudio(data) {
261
345
  skip_prompt: true,
262
346
  callback_function: (piece) => {
263
347
  if (!piece) return;
348
+ if (typeof taskId === "number" && cancelledTaskIds.has(taskId)) return;
264
349
  streamedText += piece;
265
350
  self.postMessage({
266
351
  type: "PARTIAL",
267
352
  taskId,
268
353
  chunkIndex,
269
354
  delta: piece,
270
- text: streamedText
355
+ text: sanitizeTranscript(streamedText, durationSec)
271
356
  });
272
357
  }
273
358
  });
@@ -276,12 +361,18 @@ async function transcribeAudio(data) {
276
361
  console.warn("[Whisper Worker] 创建文本流失败,回退为整段输出:", streamErr);
277
362
  }
278
363
  const result = await asrPipeline(audio, generateOptions);
279
- const text = (typeof result === "string" ? result : result?.text ?? streamedText ?? "").trim();
364
+ if (typeof taskId === "number" && cancelledTaskIds.has(taskId)) {
365
+ return;
366
+ }
367
+ const raw = (typeof result === "string" ? result : result?.text ?? streamedText ?? "").trim();
368
+ const text = sanitizeTranscript(raw, durationSec);
280
369
  self.postMessage({
281
370
  type: "RESULT",
282
371
  taskId,
283
372
  chunkIndex,
284
373
  isFinal,
374
+ silent: !text,
375
+ mode,
285
376
  text
286
377
  });
287
378
  } catch (err) {
package/dist/style.css CHANGED
@@ -1,4 +1,4 @@
1
- .svg-icon-wrapper[data-v-490b11c1]{position:relative;overflow:hidden;vertical-align:middle}.svg-icon[data-v-490b11c1]{width:1em;height:1em;fill:currentColor;vertical-align:middle;display:inline-block}.ai-copy-btn-wrapper{cursor:pointer;width:74px;height:24px;border-radius:12px;box-sizing:border-box;padding:10px 14px;border:1px solid #D9D9D9;display:flex;align-items:center;justify-content:center;font-size:12px;color:#666;line-height:20px;text-align:justify;margin-top:6px}.ai-copy-btn-wrapper .copy-text{margin-left:4px}.markdown-wrapper{line-height:1.2}.markdown-wrapper h1{font-size:2em}.markdown-wrapper h2{font-size:1.5em}.markdown-wrapper h3{font-size:1.25em}.markdown-wrapper h4{font-size:1em}.markdown-wrapper h5{font-size:.875em}.markdown-wrapper h6{font-size:.85em}.markdown-wrapper h1,.markdown-wrapper h2,.markdown-wrapper h3,.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{margin:0 auto;line-height:1.25}.markdown-wrapper ul,.markdown-wrapper ol{padding-left:1.5em;line-height:.8}.markdown-wrapper ul,.markdown-wrapper li,.markdown-wrapper ol{list-style-position:outside;white-space:normal}.markdown-wrapper ul{list-style-type:disc}.markdown-wrapper ol{list-style-type:decimal}.markdown-wrapper li{line-height:1.5}.markdown-wrapper ol ol,.markdown-wrapper ul ul{padding-left:20px}.markdown-wrapper hr{margin:16px 0}.markdown-wrapper a{color:#536fec;font-weight:bolder;text-decoration:underline;padding:0 3px}.markdown-wrapper p{line-height:1.4}.markdown-wrapper p>code{--at-apply: "bg-#e5e5e5";--at-apply: whitespace-pre mx-4px px-6px py-3px rounded-5px}.markdown-wrapper p img{display:inline-block}.markdown-wrapper li>p{line-height:2}.markdown-wrapper strong{font-weight:700}.markdown-wrapper blockquote{padding:10px;margin:20px 0;border-left:5px solid #ccc;background-color:#f9f9f9;color:#555}.markdown-wrapper blockquote>p{margin:0}.ai-panel{margin-right:20px;width:400px;height:804px;background:#fff;border-radius:8px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;overflow:hidden;background-image:url(/images/ai-panel-bg.png);background-size:100% auto;background-position:top;background-repeat:no-repeat;position:relative;transition:all .3s ease}.ai-panel :deep(.el-input-group__append){box-sizing:border-box}.ai-panel.drawer-mode{position:fixed;right:0;top:0;bottom:0;height:100vh;margin:0;border-radius:0;z-index:2000}.ai-panel .panel-header{padding:20px;background:transparent}.ai-panel .panel-header .header-actions{display:flex;justify-content:space-between;gap:12px;align-items:center}.ai-panel .panel-header .header-actions .header-title{font-family:PingFangSC,PingFang SC;font-weight:700;font-size:16px;color:#333;line-height:24px;text-align:left;font-style:normal}.ai-panel .panel-header .header-actions .action-icons{display:flex;gap:12px}.ai-panel .panel-header .header-actions .action-icon{font-size:20px;color:#666;cursor:pointer}.ai-panel .panel-header .header-actions .action-icon:hover{color:#333}.ai-panel .body-content{flex:1;overflow:hidden;padding:20px;display:flex;flex-direction:column}.ai-panel .body-content .welcome-content .title{display:flex;flex-direction:column;align-items:center;margin-bottom:8px}.ai-panel .body-content .welcome-content .title .panel-icon{width:64px;height:64px;margin-bottom:16px}.ai-panel .body-content .welcome-content .title .title-text{margin:0;font-size:24px;color:#333;font-weight:500}.ai-panel .body-content .welcome-content .subtitle{text-align:center;font-size:28px;color:#333;line-height:36px;letter-spacing:2px;margin-bottom:20px}.ai-panel .body-content .welcome-content .subtitle .highlight{margin-left:2px;background:linear-gradient(270deg,#e236ffcc,#0a84ff);-webkit-background-clip:text;color:transparent;font-weight:bolder}.ai-panel .body-content .quick-questions .question-item{padding:12px 16px;background:#f5f7fa;border-radius:8px;margin-bottom:12px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:all .3s}.ai-panel .body-content .quick-questions .question-item:hover{background:#e8f4ff;transform:translate(4px)}.ai-panel .body-content .quick-questions .question-item span{font-size:14px;color:#333}.ai-panel .body-content .quick-questions .question-item .el-icon{color:#666}.ai-panel .body-content .chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;height:100%;display:flex;flex-direction:column}.ai-panel .body-content .chat-messages::-webkit-scrollbar{width:0;background:transparent}.ai-panel .body-content .chat-messages{scrollbar-width:none;-ms-overflow-style:none}.ai-panel .body-content .chat-messages .message-item{display:flex;align-items:flex-start;margin-bottom:20px;gap:12px}.ai-panel .body-content .chat-messages .message-item .message-avatar{width:40px;height:40px;border-radius:20px;flex-shrink:0}.ai-panel .body-content .chat-messages .message-item .user-avatar{background:#0a84ff;color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}.ai-panel .body-content .chat-messages .message-item .message-content{padding:12px 16px;border-radius:2px;max-width:70%;word-break:break-word}.ai-panel .body-content .chat-messages .message-item.ai-message .message-content{background:#f5f7fa}.ai-panel .body-content .chat-messages .message-item.user-message{flex-direction:row-reverse}.ai-panel .body-content .chat-messages .message-item.user-message .message-content{background:#f1f2f3;border-radius:4px 4px 0;color:#333;font-size:14px}.ai-panel .panel-footer{padding:24px;background:#fff;position:relative}.ai-panel .panel-footer .loading-icon{position:absolute;top:-13px}.ai-panel .panel-footer .voice-progress-banner{margin-bottom:12px;padding:10px 14px;background:linear-gradient(135deg,#f0f7ff,#e6f4ff);border:1px solid #bae0ff;border-radius:8px;display:flex;flex-direction:column;gap:6px}.ai-panel .panel-footer .voice-progress-banner .progress-info{display:flex;align-items:center;gap:8px;font-size:13px;color:#0958d9}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-icon{font-size:14px}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-text{flex:1;font-weight:500}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-percent{font-weight:700;font-family:monospace}.ai-panel .panel-footer .voice-progress-banner .progress-track{height:6px;background:#d9d9d9;border-radius:3px;overflow:hidden}.ai-panel .panel-footer .voice-progress-banner .progress-track .progress-bar{height:100%;background:linear-gradient(90deg,#1677ff,#4096ff);border-radius:3px;transition:width .2s ease}.ai-panel .panel-footer .voice-recording-panel{min-height:44px;padding:8px 14px;background:linear-gradient(135deg,#f6ffed,#e6f7ff);border:1px solid #91caff;border-radius:6px;display:flex;flex-direction:column;gap:8px;box-shadow:0 2px 8px #1677ff14}.ai-panel .panel-footer .voice-recording-panel .recording-main{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:28px}.ai-panel .panel-footer .voice-recording-panel .live-transcript{width:100%;max-height:72px;overflow-y:auto;padding:6px 8px;background:#ffffffc7;border-radius:4px;font-size:13px;line-height:1.55;color:#1677ff;word-break:break-all}.ai-panel .panel-footer .voice-recording-panel .live-transcript.empty{color:#8c8c8c}.ai-panel .panel-footer .voice-recording-panel .live-transcript .caret{display:inline-block;margin-left:1px;font-weight:400;color:#1677ff;animation:caret-blink 1s step-end infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse{width:10px;height:10px;border-radius:50%;background:#ff4d4f;box-shadow:0 0 #ff4d4f66;animation:pulse 1.5s infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse.transcribing{background:#1890ff;box-shadow:0 0 #1890ff66}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-time{font-family:monospace;font-weight:700;font-size:13px;color:#ff4d4f}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-hint{font-size:13px;color:#333}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves{display:flex;align-items:center;gap:3px;height:30px;margin-left:4px}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves .wave{width:3px;background:#1890ff;border-radius:2px;transition:height .08s ease}.ai-panel .panel-footer .voice-recording-panel .recording-actions{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn{color:#8c8c8c;border-color:#d9d9d9}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-finish-btn{background:#1677ff;border-color:#1677ff;padding:6px 14px;font-weight:500}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn{color:#666;border-color:#d9d9d9;background:#fff;font-size:12px;padding:4px 10px;height:28px;transition:all .2s}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-playback-bar{margin-bottom:8px;height:36px;padding:0 12px;background:#f0f7ff;border:1px solid #bae0ff;border-radius:6px;display:flex;align-items:center;justify-content:space-between;transition:all .2s ease}.ai-panel .panel-footer .voice-playback-bar .playback-main{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon{width:22px;height:22px;border-radius:50%;background:#1677ff;color:#fff;display:flex;align-items:center;justify-content:center;transition:transform .15s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon:hover{transform:scale(1.1)}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-title{font-size:13px;color:#1677ff;font-weight:500}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-time{font-size:12px;color:#8c8c8c;font-family:monospace}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves{display:flex;align-items:flex-end;gap:2px;height:14px;margin-left:4px}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar{width:2px;background:#1677ff;border-radius:1px;animation:soundWave .8s ease-in-out infinite alternate}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(1){height:6px;animation-delay:0s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(2){height:12px;animation-delay:.2s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(3){height:8px;animation-delay:.4s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(4){height:14px;animation-delay:.1s}.ai-panel .panel-footer .voice-playback-bar .playback-close{cursor:pointer;color:#8c8c8c;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.ai-panel .panel-footer .voice-playback-bar .playback-close:hover{color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .input-box .el-input-group{height:40px;border-radius:4px}.ai-panel .panel-footer .input-box :deep(.el-input__wrapper){box-shadow:none}.ai-panel .panel-footer .input-box :deep(.el-input-group__append){box-shadow:none;background:transparent;padding:8px 12px}.ai-panel .panel-footer .input-box .input-actions-box{display:flex;align-items:center;gap:12px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim{color:#1677ff}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim svg{animation:mic-breathe 1.2s ease-in-out infinite;transform-origin:center}.ai-panel .panel-footer .input-box .input-actions-box .send-icon-box{display:flex;align-items:center;justify-content:center;cursor:pointer}.ai-panel .panel-footer .input-box .el-input-group__append{background-color:transparent}@keyframes soundWave{0%{height:3px}to{height:14px}}@keyframes pulse{0%{box-shadow:0 0 #ff4d4fb3}70%{box-shadow:0 0 0 8px #ff4d4f00}to{box-shadow:0 0 #ff4d4f00}}@keyframes caret-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes mic-breathe{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.22);opacity:.72}}/*!
1
+ @charset "UTF-8";.svg-icon-wrapper[data-v-490b11c1]{position:relative;overflow:hidden;vertical-align:middle}.svg-icon[data-v-490b11c1]{width:1em;height:1em;fill:currentColor;vertical-align:middle;display:inline-block}.ai-copy-btn-wrapper{cursor:pointer;width:74px;height:24px;border-radius:12px;box-sizing:border-box;padding:10px 14px;border:1px solid #D9D9D9;display:flex;align-items:center;justify-content:center;font-size:12px;color:#666;line-height:20px;text-align:justify;margin-top:6px}.ai-copy-btn-wrapper .copy-text{margin-left:4px}.ai-thinking-block{margin-bottom:10px;border:1px solid #E8E8E8;border-radius:6px;background:#fafafa;overflow:hidden}.ai-thinking-block .thinking-header{display:flex;align-items:center;gap:6px;padding:7px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#666;transition:background-color .2s ease}.ai-thinking-block .thinking-header:hover{background-color:#f0f7ff;color:#1677ff}.ai-thinking-block .thinking-header:hover .thinking-toggle-hint{color:#1677ff}.ai-thinking-block .thinking-header .thinking-arrow{flex-shrink:0;transition:transform .2s ease}.ai-thinking-block .thinking-header .thinking-title{flex:1;text-align:left;font-weight:500;line-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ai-thinking-block .thinking-header .thinking-toggle-hint{flex-shrink:0;color:#999}.ai-thinking-block.is-expanded .thinking-arrow{transform:rotate(90deg)}.ai-thinking-block.is-streaming{border-color:#bae0ff;background:linear-gradient(135deg,#f0f7ff,#e6f4ff)}.ai-thinking-block.is-streaming .thinking-header .thinking-title{color:#1677ff;animation:thinking-breathe 1.2s ease-in-out infinite}.ai-thinking-block .thinking-body{max-height:280px;overflow-y:auto;padding:8px 12px 10px;border-top:1px dashed #E8E8E8;font-size:13px;color:#8c8c8c;line-height:1.6;word-break:break-word}.ai-thinking-block .thinking-body p{margin:0 0 4px}.ai-thinking-block .thinking-body p:last-child{margin-bottom:0}@keyframes thinking-breathe{0%,to{opacity:1}50%{opacity:.55}}.markdown-wrapper{font-size:14px;line-height:1.75;color:#333;word-break:break-word}.markdown-wrapper p{margin:0 0 10px}.markdown-wrapper p:last-child{margin-bottom:0}.markdown-wrapper h1,.markdown-wrapper h2,.markdown-wrapper h3,.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{margin:14px 0 10px;font-weight:600;line-height:1.4}.markdown-wrapper h1:first-child,.markdown-wrapper h2:first-child,.markdown-wrapper h3:first-child,.markdown-wrapper h4:first-child,.markdown-wrapper h5:first-child,.markdown-wrapper h6:first-child{margin-top:0}.markdown-wrapper h1{font-size:18px}.markdown-wrapper h2{font-size:17px}.markdown-wrapper h3{font-size:16px}.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{font-size:15px}.markdown-wrapper ul,.markdown-wrapper ol{margin:0 0 10px;padding-left:1.5em}.markdown-wrapper ul:last-child,.markdown-wrapper ol:last-child{margin-bottom:0}.markdown-wrapper li{margin:4px 0;line-height:1.7}.markdown-wrapper li>p{margin:0;line-height:1.7}.markdown-wrapper hr{margin:14px 0;border:none;border-top:1px solid #e8e8e8}.markdown-wrapper a{color:#536fec;font-weight:bolder;text-decoration:underline;padding:0 3px}.markdown-wrapper strong{font-weight:600}.markdown-wrapper code{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.markdown-wrapper p>code,.markdown-wrapper li>code,.markdown-wrapper td>code{background:#536fec14;color:#4761c6;padding:2px 6px;border-radius:4px;font-size:12.5px;white-space:pre-wrap}.markdown-wrapper pre.md-code-block{margin:0 0 10px;padding:12px 14px;background:#f6f8fa;border:1px solid #e8ecf2;border-radius:8px;overflow:auto;max-height:380px;font-size:12.5px;line-height:1.6}.markdown-wrapper pre.md-code-block:last-child{margin-bottom:0}.markdown-wrapper pre.md-code-block code{display:block;padding:0;background:transparent;color:#333;white-space:pre;font-size:inherit;line-height:inherit}.markdown-wrapper blockquote{padding:10px 14px;margin:10px 0;border-left:4px solid #c9d4f0;background-color:#f7f9fd;border-radius:0 6px 6px 0;color:#555}.markdown-wrapper blockquote>p{margin:0}.markdown-wrapper table{width:100%;margin:10px 0;border-collapse:collapse;font-size:13px}.markdown-wrapper table th,.markdown-wrapper table td{border:1px solid #e0e6ef;padding:6px 10px;text-align:left}.markdown-wrapper table th{background:#f2f5fa;font-weight:600}.markdown-wrapper table tr:nth-child(2n) td{background:#fafbfd}.markdown-wrapper img{display:inline-block;max-width:100%}.szjy-ui{margin:10px 0;font-size:14px}.szjy-ui:last-child{margin-bottom:0}.szjy-ui-list__title{font-weight:600;font-size:13.5px;color:#333;margin-bottom:8px;line-height:20px}.szjy-ui-list__items{display:flex;flex-direction:column;align-items:stretch}.szjy-ui-list__item{display:block}.szjy-ui-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;width:100%;padding:7px 14px;border-radius:6px;border:1px solid #dcdfe6;background:#fff;color:#606266;font-size:13.5px;line-height:20px;font-family:inherit;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease,opacity .15s ease}.szjy-ui-btn:hover:not(:disabled),.szjy-ui-btn:focus-visible:not(:disabled){border-color:#536fec;color:#536fec;outline:none}.szjy-ui-btn:disabled{cursor:not-allowed;opacity:.55}.szjy-ui-btn--small{padding:4px 10px;font-size:12.5px}.szjy-ui-btn--large{padding:10px 16px;font-size:14.5px}.szjy-ui-btn--primary{background:#409eff;border-color:#409eff;color:#fff}.szjy-ui-btn--primary:hover:not(:disabled),.szjy-ui-btn--primary:focus-visible:not(:disabled){background:#66b1ff;border-color:#66b1ff;color:#fff}.szjy-ui-btn--success{background:#67c23a;border-color:#67c23a;color:#fff}.szjy-ui-btn--success:hover:not(:disabled){background:#85ce61;border-color:#85ce61;color:#fff}.szjy-ui-btn--warning{background:#e6a23c;border-color:#e6a23c;color:#fff}.szjy-ui-btn--warning:hover:not(:disabled){background:#ebb563;border-color:#ebb563;color:#fff}.szjy-ui-btn--danger{background:#f56c6c;border-color:#f56c6c;color:#fff}.szjy-ui-btn--danger:hover:not(:disabled){background:#f78989;border-color:#f78989;color:#fff}.szjy-ui-btn--info{background:#909399;border-color:#909399;color:#fff}.szjy-ui-btn--info:hover:not(:disabled){background:#a6a9ad;border-color:#a6a9ad;color:#fff}.szjy-ui-btn--text{border-color:transparent;background:transparent;color:#536fec;padding-left:6px;padding-right:6px}.szjy-ui-btn--text:hover:not(:disabled){color:#7a8cf5;background:#536fec0f}.szjy-ui-btn__status{font-size:12px;line-height:18px;color:inherit;opacity:.85;text-align:left;word-break:break-all}.szjy-ui-btn__status:empty{display:none}.szjy-ui-btn.is-loading .szjy-ui-btn__status{opacity:.65}.szjy-ui-btn.is-success{border-color:#b3e19d}.szjy-ui-btn.is-success .szjy-ui-btn__status{color:#5daf34;opacity:1}.szjy-ui-btn.is-success.szjy-ui-btn--primary .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--success .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--warning .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--danger .szjy-ui-btn__status,.szjy-ui-btn.is-success.szjy-ui-btn--info .szjy-ui-btn__status{color:#f3f9ee}.szjy-ui-btn.is-error{border-color:#fbc4c4}.szjy-ui-btn.is-error .szjy-ui-btn__status{color:#f56c6c;opacity:1}.szjy-ui-btn.is-error.szjy-ui-btn--primary .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--success .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--warning .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--danger .szjy-ui-btn__status,.szjy-ui-btn.is-error.szjy-ui-btn--info .szjy-ui-btn__status{color:#fde2e2}.szjy-ui-btn.is-retrying .szjy-ui-btn__status{color:#b88230;opacity:1}/*!
2
2
  Theme: Default
3
3
  Description: Original highlight.js style
4
4
  Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
@@ -6,4 +6,4 @@
6
6
  Website: https://highlightjs.org/
7
7
  License: see project LICENSE
8
8
  Touched: 2021
9
- */pre code.hljs[data-v-0c5630f1]{display:block;overflow-x:auto;padding:1em}code.hljs[data-v-0c5630f1]{padding:3px 5px}.hljs[data-v-0c5630f1]{background:#f3f3f3;color:#444}.hljs-comment[data-v-0c5630f1]{color:#697070}.hljs-punctuation[data-v-0c5630f1],.hljs-tag[data-v-0c5630f1]{color:#444a}.hljs-tag .hljs-attr[data-v-0c5630f1],.hljs-tag .hljs-name[data-v-0c5630f1]{color:#444}.hljs-attribute[data-v-0c5630f1],.hljs-doctag[data-v-0c5630f1],.hljs-keyword[data-v-0c5630f1],.hljs-meta .hljs-keyword[data-v-0c5630f1],.hljs-name[data-v-0c5630f1],.hljs-selector-tag[data-v-0c5630f1]{font-weight:700}.hljs-deletion[data-v-0c5630f1],.hljs-number[data-v-0c5630f1],.hljs-quote[data-v-0c5630f1],.hljs-selector-class[data-v-0c5630f1],.hljs-selector-id[data-v-0c5630f1],.hljs-string[data-v-0c5630f1],.hljs-template-tag[data-v-0c5630f1],.hljs-type[data-v-0c5630f1]{color:#800}.hljs-section[data-v-0c5630f1],.hljs-title[data-v-0c5630f1]{color:#800;font-weight:700}.hljs-link[data-v-0c5630f1],.hljs-operator[data-v-0c5630f1],.hljs-regexp[data-v-0c5630f1],.hljs-selector-attr[data-v-0c5630f1],.hljs-selector-pseudo[data-v-0c5630f1],.hljs-symbol[data-v-0c5630f1],.hljs-template-variable[data-v-0c5630f1],.hljs-variable[data-v-0c5630f1]{color:#ab5656}.hljs-literal[data-v-0c5630f1]{color:#695}.hljs-addition[data-v-0c5630f1],.hljs-built_in[data-v-0c5630f1],.hljs-bullet[data-v-0c5630f1],.hljs-code[data-v-0c5630f1]{color:#397300}.hljs-meta[data-v-0c5630f1]{color:#1f7199}.hljs-meta .hljs-string[data-v-0c5630f1]{color:#38a}.hljs-emphasis[data-v-0c5630f1]{font-style:italic}.hljs-strong[data-v-0c5630f1]{font-weight:700}.ai-assistant{box-sizing:border-box;position:fixed;right:20px;bottom:40px;z-index:1000;display:flex;align-items:flex-end}.ai-assistant div{box-sizing:border-box}.ai-assistant .ai-icon{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;cursor:pointer;width:44px;padding:6px;transition:all .3s;height:114px;background-color:#fff;box-shadow:0 4px 16px 4px #00000008,0 2px 8px #0000000d,0 0 4px -2px #00000014;border-radius:22px;border:1px solid transparent;background-image:linear-gradient(#fff,#fff),linear-gradient(180deg,#60fffc,#0a84ff);background-origin:border-box;background-clip:padding-box,border-box}.ai-assistant .ai-icon:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000026}.ai-assistant .ai-icon img{width:32px;height:32px;margin-bottom:6px}.ai-assistant .ai-icon .ai-icon-text{display:inline-block;width:20px;font-size:16px;line-height:18px;font-weight:700;color:#333}.ai-assistant .ai-icon:hover .close-icon{display:flex}.ai-assistant .ai-icon .close-icon{display:none;position:absolute;top:-6px;right:-6px;width:16px;height:16px;background:#fff;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000001a;color:#666;cursor:pointer;z-index:1}.ai-assistant .ai-icon .close-icon:hover{color:#333;background:#f5f5f5}
9
+ */pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.slide-enter-active,.slide-leave-active{transition:transform .3s ease}.slide-enter-from,.slide-leave-to{transform:translate(30px)}.ai-panel{margin-right:20px;width:400px;height:804px;background:#fff;border-radius:8px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;overflow:hidden;background-image:url(/images/ai-panel-bg.png);background-size:100% auto;background-position:top;background-repeat:no-repeat;position:relative;transition:all .3s ease}.ai-panel :deep(.el-input-group__append){box-sizing:border-box}.ai-panel.drawer-mode{position:fixed;right:0;top:0;bottom:0;height:100vh;margin:0;border-radius:0;z-index:2000}.ai-panel.embedded-mode{width:100%;height:100%;margin:0;box-shadow:none;border-radius:0}.ai-panel .panel-header{padding:20px;background:transparent}.ai-panel .panel-header .header-actions{display:flex;justify-content:space-between;gap:12px;align-items:center}.ai-panel .panel-header .header-actions .header-title{font-family:PingFangSC,PingFang SC;font-weight:700;font-size:16px;color:#333;line-height:24px;text-align:left;font-style:normal}.ai-panel .panel-header .header-actions .action-icons{display:flex;gap:12px}.ai-panel .panel-header .header-actions .action-icon{font-size:20px;color:#666;cursor:pointer}.ai-panel .panel-header .header-actions .action-icon:hover{color:#333}.ai-panel .body-content{flex:1;overflow:hidden;padding:20px;display:flex;flex-direction:column}.ai-panel .body-content .welcome-content .title{display:flex;flex-direction:column;align-items:center;margin-bottom:8px}.ai-panel .body-content .welcome-content .title .panel-icon{width:64px;height:64px;margin-bottom:16px}.ai-panel .body-content .welcome-content .title .title-text{margin:0;font-size:24px;color:#333;font-weight:500}.ai-panel .body-content .welcome-content .subtitle{text-align:center;font-size:28px;color:#333;line-height:36px;letter-spacing:2px;margin-bottom:20px}.ai-panel .body-content .welcome-content .subtitle .highlight{margin-left:2px;background:linear-gradient(270deg,#e236ffcc,#0a84ff);-webkit-background-clip:text;color:transparent;font-weight:bolder}.ai-panel .body-content .quick-questions .question-item{padding:12px 16px;background:#f5f7fa;border-radius:8px;margin-bottom:12px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:all .3s}.ai-panel .body-content .quick-questions .question-item:hover{background:#e8f4ff;transform:translate(4px)}.ai-panel .body-content .quick-questions .question-item span{font-size:14px;color:#333}.ai-panel .body-content .quick-questions .question-item .el-icon{color:#666}.ai-panel .body-content .chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;height:100%;display:flex;flex-direction:column}.ai-panel .body-content .chat-messages::-webkit-scrollbar{width:0;background:transparent}.ai-panel .body-content .chat-messages{scrollbar-width:none;-ms-overflow-style:none}.ai-panel .body-content .chat-messages .message-item{display:flex;align-items:flex-start;margin-bottom:20px;gap:12px}.ai-panel .body-content .chat-messages .message-item .message-avatar{width:40px;height:40px;border-radius:20px;flex-shrink:0}.ai-panel .body-content .chat-messages .message-item .user-avatar{background:#0a84ff;color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}.ai-panel .body-content .chat-messages .message-item .message-content{padding:12px 16px;border-radius:2px;max-width:70%;word-break:break-word}.ai-panel .body-content .chat-messages .message-item.ai-message .message-content{background:#f5f7fa;font-size:14px}.ai-panel .body-content .chat-messages .message-item.user-message{flex-direction:row-reverse}.ai-panel .body-content .chat-messages .message-item.user-message .message-content{background:#f1f2f3;border-radius:4px 4px 0;color:#333;font-size:14px}.ai-panel .panel-footer{padding:24px;background:#fff;position:relative}.ai-panel .panel-footer .loading-icon{position:absolute;top:-13px}.ai-panel .panel-footer .voice-progress-banner{margin-bottom:12px;padding:10px 14px;background:linear-gradient(135deg,#f0f7ff,#e6f4ff);border:1px solid #bae0ff;border-radius:8px;display:flex;flex-direction:column;gap:6px}.ai-panel .panel-footer .voice-progress-banner .progress-info{display:flex;align-items:center;gap:8px;font-size:13px;color:#0958d9}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-icon{font-size:14px}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-text{flex:1;font-weight:500}.ai-panel .panel-footer .voice-progress-banner .progress-info .progress-percent{font-weight:700;font-family:monospace}.ai-panel .panel-footer .voice-progress-banner .progress-track{height:6px;background:#d9d9d9;border-radius:3px;overflow:hidden}.ai-panel .panel-footer .voice-progress-banner .progress-track .progress-bar{height:100%;background:linear-gradient(90deg,#1677ff,#4096ff);border-radius:3px;transition:width .2s ease}.ai-panel .panel-footer .voice-recording-panel{min-height:44px;padding:8px 14px;background:linear-gradient(135deg,#f6ffed,#e6f7ff);border:1px solid #91caff;border-radius:6px;display:flex;flex-direction:column;gap:8px;box-shadow:0 2px 8px #1677ff14}.ai-panel .panel-footer .voice-recording-panel .recording-main{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:28px}.ai-panel .panel-footer .voice-recording-panel .live-transcript{width:100%;max-height:72px;overflow-y:auto;padding:6px 8px;background:#ffffffc7;border-radius:4px;font-size:13px;line-height:1.55;color:#1677ff;word-break:break-all}.ai-panel .panel-footer .voice-recording-panel .live-transcript.empty{color:#8c8c8c}.ai-panel .panel-footer .voice-recording-panel .live-transcript .caret{display:inline-block;margin-left:1px;font-weight:400;color:#1677ff;animation:caret-blink 1s step-end infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse{width:10px;height:10px;border-radius:50%;background:#ff4d4f;box-shadow:0 0 #ff4d4f66;animation:pulse 1.5s infinite}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-pulse.transcribing{background:#1890ff;box-shadow:0 0 #1890ff66}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-time{font-family:monospace;font-weight:700;font-size:13px;color:#ff4d4f}.ai-panel .panel-footer .voice-recording-panel .recording-status .recording-hint{font-size:13px;color:#333}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves{display:flex;align-items:center;gap:3px;height:30px;margin-left:4px}.ai-panel .panel-footer .voice-recording-panel .recording-status .volume-waves .wave{width:3px;background:#1890ff;border-radius:2px;transition:height .08s ease}.ai-panel .panel-footer .voice-recording-panel .recording-actions{display:flex;align-items:center;gap:8px}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn{color:#8c8c8c;border-color:#d9d9d9}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-finish-btn{background:#1677ff;border-color:#1677ff;padding:6px 14px;font-weight:500}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn{color:#666;border-color:#d9d9d9;background:#fff;font-size:12px;padding:4px 10px;height:28px;transition:all .2s}.ai-panel .panel-footer .voice-recording-panel .recording-actions .voice-cancel-transcribe-btn:hover{color:#ff4d4f;border-color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .voice-playback-bar{margin-bottom:8px;height:36px;padding:0 12px;background:#f0f7ff;border:1px solid #bae0ff;border-radius:6px;display:flex;align-items:center;justify-content:space-between;transition:all .2s ease}.ai-panel .panel-footer .voice-playback-bar .playback-main{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon{width:22px;height:22px;border-radius:50%;background:#1677ff;color:#fff;display:flex;align-items:center;justify-content:center;transition:transform .15s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-play-icon:hover{transform:scale(1.1)}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-title{font-size:13px;color:#1677ff;font-weight:500}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-time{font-size:12px;color:#8c8c8c;font-family:monospace}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves{display:flex;align-items:flex-end;gap:2px;height:14px;margin-left:4px}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar{width:2px;background:#1677ff;border-radius:1px;animation:soundWave .8s ease-in-out infinite alternate}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(1){height:6px;animation-delay:0s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(2){height:12px;animation-delay:.2s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(3){height:8px;animation-delay:.4s}.ai-panel .panel-footer .voice-playback-bar .playback-main .playback-waves .wave-bar:nth-child(4){height:14px;animation-delay:.1s}.ai-panel .panel-footer .voice-playback-bar .playback-close{cursor:pointer;color:#8c8c8c;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.ai-panel .panel-footer .voice-playback-bar .playback-close:hover{color:#ff4d4f;background:#fff1f0}.ai-panel .panel-footer .input-box .el-input-group{height:40px;border-radius:4px}.ai-panel .panel-footer .input-box :deep(.el-input__wrapper){box-shadow:none}.ai-panel .panel-footer .input-box :deep(.el-input-group__append){box-shadow:none;background:transparent;padding:8px 12px}.ai-panel .panel-footer .input-box .input-actions-box{display:flex;align-items:center;gap:12px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-upload-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn{display:flex;align-items:center;justify-content:center;cursor:pointer;color:#666;transition:all .2s;padding:4px;border-radius:4px}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn:hover{color:#1677ff;background:#f0f7ff;transform:scale(1.08)}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim{color:#1677ff}.ai-panel .panel-footer .input-box .input-actions-box .voice-mic-btn.loading-anim svg{animation:mic-breathe 1.2s ease-in-out infinite;transform-origin:center}.ai-panel .panel-footer .input-box .input-actions-box .send-icon-box{display:flex;align-items:center;justify-content:center;cursor:pointer}.ai-panel .panel-footer .input-box .el-input-group__append{background-color:transparent}@keyframes soundWave{0%{height:3px}to{height:14px}}@keyframes pulse{0%{box-shadow:0 0 #ff4d4fb3}70%{box-shadow:0 0 0 8px #ff4d4f00}to{box-shadow:0 0 #ff4d4f00}}@keyframes caret-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes mic-breathe{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.22);opacity:.72}}.ai-assistant{box-sizing:border-box;position:fixed;right:20px;bottom:40px;z-index:1000;display:flex;align-items:flex-end}.ai-assistant div{box-sizing:border-box}.ai-assistant .ai-icon{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;cursor:pointer;width:44px;padding:6px;transition:all .3s;height:114px;background-color:#fff;box-shadow:0 4px 16px 4px #00000008,0 2px 8px #0000000d,0 0 4px -2px #00000014;border-radius:22px;border:1px solid transparent;background-image:linear-gradient(#fff,#fff),linear-gradient(180deg,#60fffc,#0a84ff);background-origin:border-box;background-clip:padding-box,border-box}.ai-assistant .ai-icon:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000026}.ai-assistant .ai-icon img{width:32px;height:32px;margin-bottom:6px}.ai-assistant .ai-icon .ai-icon-text{display:inline-block;width:20px;font-size:16px;line-height:18px;font-weight:700;color:#333}.ai-assistant .ai-icon:hover .close-icon{display:flex}.ai-assistant .ai-icon .close-icon{display:none;position:absolute;top:-6px;right:-6px;width:16px;height:16px;background:#fff;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000001a;color:#666;cursor:pointer;z-index:1}.ai-assistant .ai-icon .close-icon:hover{color:#333;background:#f5f5f5}.ai-chat-plain{box-sizing:border-box;position:relative;width:100%;height:100%}.ai-chat-plain div{box-sizing:border-box}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@szjy/ai-coms",
3
- "version": "0.1.10",
3
+ "version": "0.1.13",
4
4
  "description": "vue3 ai component",
5
5
  "main": "dist/index.umd.js",
6
6
  "module": "dist/index.mjs",
@@ -1,8 +0,0 @@
1
- /**
2
- * Whisper 中文转写默认偏台湾繁体,出字前转为大陆简体。
3
- * 先替换常见词组,再按单字对照表转换。
4
- */
5
- /**
6
- * 将繁体中文转为简体中文。非中文内容原样返回。
7
- */
8
- export declare function toSimplifiedChinese(input: string): string;