@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.
- package/README.md +43 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +1809 -3425
- package/dist/index.umd.js +3 -2
- package/dist/packages/api/ai.d.ts +12 -7
- package/dist/packages/api/mock.d.ts +16 -0
- package/dist/packages/common/audio/recorder.d.ts +13 -4
- package/dist/packages/common/audio/transcript-sanitize.d.ts +16 -0
- package/dist/packages/common/audio/voice-manager.d.ts +5 -15
- package/dist/packages/components/AiChat/src/components/plugins/markdown.d.ts +2 -2
- package/dist/packages/components/AiChat/src/composables/useChatDeps.d.ts +6 -0
- package/dist/packages/components/AiChat/src/custom-ui/actions/postMessage.d.ts +12 -0
- package/dist/packages/components/AiChat/src/custom-ui/components/button.d.ts +9 -0
- package/dist/packages/components/AiChat/src/custom-ui/components/list.d.ts +8 -0
- package/dist/packages/components/AiChat/src/custom-ui/events.d.ts +27 -0
- package/dist/packages/components/AiChat/src/custom-ui/index.d.ts +7 -0
- package/dist/packages/components/AiChat/src/custom-ui/parse.d.ts +11 -0
- package/dist/packages/components/AiChat/src/custom-ui/registry.d.ts +8 -0
- package/dist/packages/components/AiChat/src/custom-ui/render.d.ts +18 -0
- package/dist/packages/components/AiChat/src/custom-ui/types.d.ts +84 -0
- package/dist/packages/components/AiChat/src/index.vue.d.ts +87 -4
- package/dist/packages/components/AiChat/src/transform/index.d.ts +14 -1
- package/dist/packages/components/AiChatPlain/index.d.ts +3 -0
- package/dist/packages/components/AiChatPlain/src/index.vue.d.ts +213 -0
- package/dist/packages/components/components.d.ts +1 -0
- package/dist/scripts/ai/README.md +8 -1
- package/dist/scripts/ai/whisper.worker.js +104 -13
- package/dist/style.css +2 -2
- package/package.json +1 -1
- 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;
|
|
@@ -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
|
|
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
|
|
208
|
-
let
|
|
269
|
+
function getAudioStats(audio) {
|
|
270
|
+
let peak = 0;
|
|
271
|
+
let sumSq = 0;
|
|
209
272
|
for (let i = 0; i < audio.length; i++) {
|
|
210
|
-
const
|
|
211
|
-
|
|
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
|
|
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 =
|
|
235
|
-
if (peak < 0.
|
|
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.
|
|
247
|
-
const gain = Math.min(
|
|
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
|
-
|
|
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