@touchvue/chat 1.0.0-beta.41 → 1.0.0-beta.42
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/es/package.json.css +1 -1
- package/es/package.json.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +15 -3
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +8 -8
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/Screenshot.vue2.mjs +11 -2
- package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs +10 -7
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +22 -22
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs +145 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs +18 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +672 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs +55 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +155 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +352 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs +74 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +8 -7
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +33 -29
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +179 -1332
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs +15 -6
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +14 -14
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/a2aService.mjs +3 -2
- package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs +2 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/markdown.mjs +30 -12
- package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
- package/lib/package.json.css +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +15 -3
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
- package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
- package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js +8 -8
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/Screenshot.vue2.js +11 -2
- package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/UploadView.vue2.js +10 -7
- package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +22 -22
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js +147 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js +21 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +674 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js +57 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +157 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +354 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js +76 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +8 -7
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +49 -45
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +179 -1332
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js +15 -6
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +14 -14
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/utils/a2aService.js +3 -2
- package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js +2 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
- package/lib/packages/components/touchchat/utils/markdown.js +30 -12
- package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import { ref, nextTick } from 'vue';
|
|
2
|
+
import { FetchStream } from '../../../utils/fetchStream.mjs';
|
|
3
|
+
import { showToast } from '../../../utils/tools.mjs';
|
|
4
|
+
import { ThinkStatus } from './types.mjs';
|
|
5
|
+
|
|
6
|
+
function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, emit, afterSend, enqueueRender, renderContent, markdownToHtml, scrollToBottom, stop }) {
|
|
7
|
+
const fetchStream = ref(null);
|
|
8
|
+
const resultItem = ref(null);
|
|
9
|
+
const generateChatId = (prefix = "ai_") => {
|
|
10
|
+
return prefix + Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10);
|
|
11
|
+
};
|
|
12
|
+
const openSSE = (userContent, insertIndex, type) => {
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
14
|
+
try {
|
|
15
|
+
if (isUnmounting.value)
|
|
16
|
+
return;
|
|
17
|
+
isChating.value = true;
|
|
18
|
+
const currentAiMessage = chatList.value.find((item) => item.isChating);
|
|
19
|
+
if (currentAiMessage) {
|
|
20
|
+
currentAiMessage.isShowLike = true;
|
|
21
|
+
currentAiMessage.isShowCopy = true;
|
|
22
|
+
currentAiMessage.componentName = currentComponentName.value;
|
|
23
|
+
}
|
|
24
|
+
const chatId = (currentAiMessage == null ? void 0 : currentAiMessage.chatId) || generateChatId();
|
|
25
|
+
let aiContent = (currentAiMessage == null ? void 0 : currentAiMessage.content) || "";
|
|
26
|
+
let reasoningContent = (currentAiMessage == null ? void 0 : currentAiMessage.reasoningContent) || "";
|
|
27
|
+
let allAiContent = "";
|
|
28
|
+
if (!currentAiMessage) {
|
|
29
|
+
const chatItem = {
|
|
30
|
+
chatId,
|
|
31
|
+
user: "ai",
|
|
32
|
+
type: "text",
|
|
33
|
+
isChating: true,
|
|
34
|
+
content: "",
|
|
35
|
+
thinkContent: "",
|
|
36
|
+
reasoningContent: "",
|
|
37
|
+
thinkStatus: ThinkStatus.THINKING,
|
|
38
|
+
thinkStartTime: Date.now(),
|
|
39
|
+
isShowLike: true,
|
|
40
|
+
isShowCopy: true,
|
|
41
|
+
componentName: currentComponentName.value,
|
|
42
|
+
typeFlag: typeFlag.value
|
|
43
|
+
};
|
|
44
|
+
if (insertIndex !== void 0 && insertIndex <= chatList.value.length) {
|
|
45
|
+
chatList.value.splice(insertIndex, 0, chatItem);
|
|
46
|
+
} else {
|
|
47
|
+
chatList.value.push(chatItem);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
currIndex.value = insertIndex != null ? insertIndex : chatList.value.length - 1;
|
|
51
|
+
const BodyConfig = (_c = (_b = (_a = moduleInfo.value) == null ? void 0 : _a.config) == null ? void 0 : _b.body) == null ? void 0 : _c.call(_b);
|
|
52
|
+
const requestBody = ((_d = BodyConfig == null ? void 0 : BodyConfig.messages) == null ? void 0 : _d.length) ? { ...BodyConfig, messages: [...BodyConfig.messages], model: enableDeepThinking.value ? "deepseek-reasoner" : "deepseek-v3" } : {
|
|
53
|
+
model: enableDeepThinking.value ? "deepseek-reasoner" : "deepseek-v3",
|
|
54
|
+
messages: [{ role: "user", content: userContent }],
|
|
55
|
+
stream: true
|
|
56
|
+
};
|
|
57
|
+
if ((_e = BodyConfig == null ? void 0 : BodyConfig.messages) == null ? void 0 : _e.length) {
|
|
58
|
+
BodyConfig.messages[0].content = userContent;
|
|
59
|
+
}
|
|
60
|
+
const apiUrl = typeof ((_g = (_f = moduleInfo.value) == null ? void 0 : _f.config) == null ? void 0 : _g.action) === "function" ? moduleInfo.value.config.action() : ((_i = (_h = moduleInfo.value) == null ? void 0 : _h.config) == null ? void 0 : _i.action) || "https://api.apiyi.com/v1/chat/completions";
|
|
61
|
+
fetchStream.value = new FetchStream({
|
|
62
|
+
url: apiUrl,
|
|
63
|
+
requestInit: {
|
|
64
|
+
headers: ((_k = (_j = moduleInfo.value) == null ? void 0 : _j.config) == null ? void 0 : _k.headers) ? new Headers(moduleInfo.value.config.headers()) : new Headers({
|
|
65
|
+
"Content-Type": "application/json",
|
|
66
|
+
Authorization: "Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd"
|
|
67
|
+
}),
|
|
68
|
+
body: JSON.stringify(requestBody)
|
|
69
|
+
},
|
|
70
|
+
onmessage: (line) => {
|
|
71
|
+
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l, _m, _n, _o;
|
|
72
|
+
if (isUnmounting.value)
|
|
73
|
+
return;
|
|
74
|
+
let dataString = "";
|
|
75
|
+
if (line.length) {
|
|
76
|
+
if (line.includes("data:")) {
|
|
77
|
+
const match = line.match(/\{[\s\S]*\}/);
|
|
78
|
+
dataString = match ? match[0] : "";
|
|
79
|
+
} else if (line.startsWith("{") && line.endsWith("}")) {
|
|
80
|
+
dataString = line;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
dataString = dataString.trim();
|
|
84
|
+
const respoKeyConfig = (_b2 = (_a2 = moduleInfo.value) == null ? void 0 : _a2.config) == null ? void 0 : _b2.respoKey;
|
|
85
|
+
const respoKey = typeof respoKeyConfig === "function" ? respoKeyConfig() : respoKeyConfig;
|
|
86
|
+
const deepseekFlag = ((_c2 = moduleInfo.value) == null ? void 0 : _c2.name) === "deepseek-v3";
|
|
87
|
+
if (type === 1 && dataString) {
|
|
88
|
+
try {
|
|
89
|
+
const result = JSON.parse(dataString);
|
|
90
|
+
const newAiMessage = chatList.value[currIndex.value];
|
|
91
|
+
if (deepseekFlag || !moduleInfo.value) {
|
|
92
|
+
if ((_f2 = (_e2 = (_d2 = result == null ? void 0 : result.choices) == null ? void 0 : _d2[0]) == null ? void 0 : _e2.delta) == null ? void 0 : _f2.content) {
|
|
93
|
+
aiContent += result.choices[0].delta.content;
|
|
94
|
+
if ((newAiMessage == null ? void 0 : newAiMessage.thinkStatus) === ThinkStatus.THINKING) {
|
|
95
|
+
newAiMessage.thinkStatus = ThinkStatus.COMPLETED;
|
|
96
|
+
newAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now());
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if ((_i2 = (_h2 = (_g2 = result == null ? void 0 : result.choices) == null ? void 0 : _g2[0]) == null ? void 0 : _h2.delta) == null ? void 0 : _i2.reasoning_content) {
|
|
100
|
+
reasoningContent += result.choices[0].delta.reasoning_content;
|
|
101
|
+
if (!(newAiMessage == null ? void 0 : newAiMessage.thinkStatus)) {
|
|
102
|
+
newAiMessage.thinkStatus = ThinkStatus.THINKING;
|
|
103
|
+
newAiMessage.thinkStartTime = Date.now();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
} else if (respoKey) {
|
|
107
|
+
if (result && result[respoKey.content]) {
|
|
108
|
+
aiContent += result[respoKey.content];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (newAiMessage) {
|
|
112
|
+
newAiMessage.content = aiContent;
|
|
113
|
+
newAiMessage.reasoningContent = reasoningContent;
|
|
114
|
+
}
|
|
115
|
+
if (chatList.value.some((ele) => ele.chatId === chatId)) {
|
|
116
|
+
nextTick(() => {
|
|
117
|
+
const renderWithRetry = (retryCount = 0) => {
|
|
118
|
+
if (retryCount > 10) {
|
|
119
|
+
console.error("renderContent\u5931\u8D25\uFF1A\u65E0\u6CD5\u627E\u5230DOM\u5143\u7D20\uFF0CcurrIndex:", currIndex.value);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
renderContent(aiContent, "main", currIndex.value);
|
|
123
|
+
renderContent(reasoningContent, "reasoning", currIndex.value);
|
|
124
|
+
const currentMsg = chatList.value[currIndex.value];
|
|
125
|
+
if (currentMsg && (currentMsg.content !== aiContent || currentMsg.reasoningContent !== reasoningContent)) {
|
|
126
|
+
setTimeout(() => renderWithRetry(retryCount + 1), 50);
|
|
127
|
+
} else {
|
|
128
|
+
nextTick(() => {
|
|
129
|
+
scrollToBottom();
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
renderWithRetry();
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
} catch (e) {
|
|
137
|
+
console.error("\u89E3\u6790SSE\u6D88\u606F\u5931\u8D25:", e);
|
|
138
|
+
}
|
|
139
|
+
} else if (dataString && (dataString.startsWith("{") && dataString.endsWith("}") || !(respoKey == null ? void 0 : respoKey.content))) {
|
|
140
|
+
try {
|
|
141
|
+
const result = !(respoKey == null ? void 0 : respoKey.content) && moduleInfo.value ? dataString : JSON.parse(dataString);
|
|
142
|
+
const newAiMessage = chatList.value[currIndex.value];
|
|
143
|
+
if (deepseekFlag || !moduleInfo.value) {
|
|
144
|
+
if ((_l = (_k2 = (_j2 = result == null ? void 0 : result.choices) == null ? void 0 : _j2[0]) == null ? void 0 : _k2.delta) == null ? void 0 : _l.content) {
|
|
145
|
+
aiContent += result.choices[0].delta.content;
|
|
146
|
+
if ((newAiMessage == null ? void 0 : newAiMessage.thinkStatus) === ThinkStatus.THINKING) {
|
|
147
|
+
newAiMessage.thinkStatus = ThinkStatus.COMPLETED;
|
|
148
|
+
newAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now());
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if ((_o = (_n = (_m = result == null ? void 0 : result.choices) == null ? void 0 : _m[0]) == null ? void 0 : _n.delta) == null ? void 0 : _o.reasoning_content) {
|
|
152
|
+
reasoningContent += result.choices[0].delta.reasoning_content;
|
|
153
|
+
if (!(newAiMessage == null ? void 0 : newAiMessage.thinkStatus)) {
|
|
154
|
+
newAiMessage.thinkStatus = ThinkStatus.THINKING;
|
|
155
|
+
newAiMessage.thinkStartTime = Date.now();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
allAiContent = reasoningContent + aiContent;
|
|
159
|
+
} else if (respoKey) {
|
|
160
|
+
if (result && result[respoKey.content] && (result[respoKey.category] === respoKey.contentCategory || !result[respoKey.category])) {
|
|
161
|
+
aiContent += result[respoKey.content];
|
|
162
|
+
}
|
|
163
|
+
if (result && result[respoKey.category] === "done") {
|
|
164
|
+
resultItem.value = result;
|
|
165
|
+
}
|
|
166
|
+
if (result && result[respoKey.category] === "error") {
|
|
167
|
+
const errorMessage = respoKey.all && result[respoKey.all] ? result[respoKey.all] : "\u5F53\u524D\u7F51\u7EDC\u5F02\u5E38";
|
|
168
|
+
const currentAiMessage2 = chatList.value[currIndex.value];
|
|
169
|
+
if (currentAiMessage2.chatId) {
|
|
170
|
+
currentAiMessage2.content = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
|
|
171
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z" fill="#F93920"/>
|
|
172
|
+
</svg>${errorMessage}</div>`;
|
|
173
|
+
currentAiMessage2.isChating = false;
|
|
174
|
+
currentAiMessage2.componentName = "";
|
|
175
|
+
currentAiMessage2.isShowLike = false;
|
|
176
|
+
currentAiMessage2.isShowCopy = false;
|
|
177
|
+
currentAiMessage2.isError = true;
|
|
178
|
+
nextTick(() => {
|
|
179
|
+
emit("sendMessage", [...chatList.value]);
|
|
180
|
+
});
|
|
181
|
+
afterSend(result);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (aiContent || reasoningContent) {
|
|
185
|
+
allAiContent = aiContent + reasoningContent;
|
|
186
|
+
}
|
|
187
|
+
if (respoKey && respoKey.all && result && result[respoKey.all] && result[respoKey.category] === respoKey.allCategory) {
|
|
188
|
+
allAiContent = result[respoKey.all];
|
|
189
|
+
}
|
|
190
|
+
if (respoKey && result && typeof result === "string" && result !== "[DONE]") {
|
|
191
|
+
aiContent += result;
|
|
192
|
+
}
|
|
193
|
+
if (respoKey && result && typeof result === "string" && result === "[DONE]") {
|
|
194
|
+
const index = chatList.value.findIndex((ele) => ele.chatId === chatId);
|
|
195
|
+
if (index !== -1 && chatList.value[index]) {
|
|
196
|
+
isChating.value = false;
|
|
197
|
+
chatList.value[index].isChating = false;
|
|
198
|
+
emit("sendMessage", JSON.parse(JSON.stringify(chatList.value)));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (chatList.value.some((ele) => ele.chatId === chatId)) {
|
|
203
|
+
enqueueRender({
|
|
204
|
+
mainContent: aiContent,
|
|
205
|
+
thinkContent: "",
|
|
206
|
+
reasoningContent
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
} catch (error) {
|
|
210
|
+
console.error("\u89E3\u6790SSE\u6D88\u606F\u5931\u8D25:", error);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
ondone: () => {
|
|
215
|
+
nextTick(() => {
|
|
216
|
+
isChating.value = false;
|
|
217
|
+
if (isUnmounting.value || !isMounted.value)
|
|
218
|
+
return;
|
|
219
|
+
const index = chatList.value.findIndex((ele) => ele.chatId === chatId);
|
|
220
|
+
if (index !== -1 && chatList.value[index]) {
|
|
221
|
+
chatList.value[index].isChating = false;
|
|
222
|
+
chatList.value[index].componentName = currentComponentName.value;
|
|
223
|
+
chatList.value[index].html = markdownToHtml(allAiContent);
|
|
224
|
+
if (allAiContent) {
|
|
225
|
+
if (resultItem.value) {
|
|
226
|
+
resultItem.value.allAiContent = allAiContent;
|
|
227
|
+
afterSend(resultItem.value);
|
|
228
|
+
} else {
|
|
229
|
+
afterSend({ allAiContent });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const waitForRenderComplete = () => {
|
|
233
|
+
if (chatList.value.length > 0) {
|
|
234
|
+
emit("sendMessage", JSON.parse(JSON.stringify(chatList.value)));
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
waitForRenderComplete();
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
onabort: () => {
|
|
242
|
+
handleAbort();
|
|
243
|
+
},
|
|
244
|
+
onerror: (response) => {
|
|
245
|
+
handleError(response);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.error("OpenSSE\u9519\u8BEF:", error);
|
|
250
|
+
isChating.value = false;
|
|
251
|
+
chatList.value[currIndex.value].content = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
|
|
252
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z" fill="#F93920"/>
|
|
253
|
+
</svg>${"\u8BF7\u6C42\u5931\u8D25"}</div>`;
|
|
254
|
+
chatList.value[currIndex.value].isChating = false;
|
|
255
|
+
chatList.value[currIndex.value].isShowCopy = false;
|
|
256
|
+
chatList.value[currIndex.value].isShowLike = false;
|
|
257
|
+
showToast("\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5", "error", 3e3);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
const handleAbort = () => {
|
|
261
|
+
isChating.value = false;
|
|
262
|
+
if (isUnmounting.value)
|
|
263
|
+
return;
|
|
264
|
+
const currentAiMessage = chatList.value[currIndex.value];
|
|
265
|
+
stop(chatList.value[currIndex.value], currIndex.value);
|
|
266
|
+
const hasContent = currentAiMessage && (currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent);
|
|
267
|
+
if (currentAiMessage) {
|
|
268
|
+
if (currentAiMessage.thinkStatus === ThinkStatus.THINKING) {
|
|
269
|
+
currentAiMessage.thinkStatus = ThinkStatus.STOPPED;
|
|
270
|
+
currentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now());
|
|
271
|
+
}
|
|
272
|
+
if (!hasContent) {
|
|
273
|
+
const userMessageIndex = currIndex.value - 1;
|
|
274
|
+
if (userMessageIndex >= 0 && chatList.value[userMessageIndex].user === "u") {
|
|
275
|
+
chatList.value.splice(currIndex.value, 1);
|
|
276
|
+
chatList.value.splice(userMessageIndex, 1);
|
|
277
|
+
} else {
|
|
278
|
+
chatList.value.splice(currIndex.value, 1);
|
|
279
|
+
}
|
|
280
|
+
} else {
|
|
281
|
+
const updatedAiMessage = {
|
|
282
|
+
...currentAiMessage,
|
|
283
|
+
isChating: false,
|
|
284
|
+
content: currentAiMessage.content ? currentAiMessage.content + "..." : "",
|
|
285
|
+
thinkContent: currentAiMessage.thinkContent ? currentAiMessage.thinkContent + "..." : void 0,
|
|
286
|
+
reasoningContent: currentAiMessage.reasoningContent ? currentAiMessage.reasoningContent + "..." : void 0,
|
|
287
|
+
thinkStatus: currentAiMessage.thinkStatus,
|
|
288
|
+
stop: true
|
|
289
|
+
};
|
|
290
|
+
chatList.value.splice(currIndex.value, 1, updatedAiMessage);
|
|
291
|
+
nextTick(() => {
|
|
292
|
+
renderContent(updatedAiMessage.thinkContent || "", "thinking");
|
|
293
|
+
renderContent(updatedAiMessage.reasoningContent || "", "reasoning");
|
|
294
|
+
renderContent(updatedAiMessage.content || "", "main");
|
|
295
|
+
emit("sendMessage", [...chatList.value]);
|
|
296
|
+
});
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (chatList.value.length > 0) {
|
|
301
|
+
emit("sendMessage", [...chatList.value]);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
const handleError = (response) => {
|
|
305
|
+
if (isUnmounting.value)
|
|
306
|
+
return;
|
|
307
|
+
isChating.value = false;
|
|
308
|
+
let errorMessage = "\u672A\u77E5\u9519\u8BEF";
|
|
309
|
+
if (response instanceof Error) {
|
|
310
|
+
console.error("API\u8BF7\u6C42\u9519\u8BEF:", response);
|
|
311
|
+
errorMessage = response.message;
|
|
312
|
+
} else if (response instanceof Response) {
|
|
313
|
+
console.error("API\u8BF7\u6C42\u9519\u8BEF, \u54CD\u5E94\u72B6\u6001:", response.status, response.statusText);
|
|
314
|
+
errorMessage = `\u8BF7\u6C42\u5931\u8D25: ${response.status} ${response.statusText}`;
|
|
315
|
+
}
|
|
316
|
+
const currentAiMessage = chatList.value[currIndex.value];
|
|
317
|
+
if (currentAiMessage) {
|
|
318
|
+
currentAiMessage.content = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
|
|
319
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z" fill="#F93920"/>
|
|
320
|
+
</svg>${errorMessage}</div>`;
|
|
321
|
+
currentAiMessage.isChating = false;
|
|
322
|
+
currentAiMessage.componentName = "";
|
|
323
|
+
currentAiMessage.isShowLike = false;
|
|
324
|
+
currentAiMessage.isShowCopy = false;
|
|
325
|
+
currentAiMessage.isError = true;
|
|
326
|
+
nextTick(() => {
|
|
327
|
+
renderContent(currentAiMessage.content || "", "main");
|
|
328
|
+
emit("sendMessage", [...chatList.value]);
|
|
329
|
+
});
|
|
330
|
+
} else {
|
|
331
|
+
showToast(errorMessage, "error", 3e3);
|
|
332
|
+
emit("sendMessage", [...chatList.value]);
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
const cleanupSSE = () => {
|
|
336
|
+
if (fetchStream.value) {
|
|
337
|
+
fetchStream.value.abort();
|
|
338
|
+
fetchStream.value = null;
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
return {
|
|
342
|
+
fetchStream,
|
|
343
|
+
resultItem,
|
|
344
|
+
openSSE,
|
|
345
|
+
handleAbort,
|
|
346
|
+
handleError,
|
|
347
|
+
cleanupSSE
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export { useSSE };
|
|
352
|
+
//# sourceMappingURL=useSSE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSSE.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useSSE.ts"],"sourcesContent":["/**\n * SSE 流式请求逻辑 Composable\n */\n\nimport { ref, type Ref, nextTick } from 'vue'\nimport { FetchStream } from '../../../utils/fetchStream.ts'\nimport { showToast } from '../../../utils/tools.ts'\nimport { ThinkStatus, type ChatMessage, type ModuleItem, type ResultItem, type RenderData, type RespoKeyConfig } from './types'\n\nexport interface UseSSEOptions {\n\tchatList: Ref<ChatMessage[]>\n\tcurrIndex: Ref<number>\n\tisChating: Ref<boolean>\n\tisMounted: Ref<boolean>\n\tisUnmounting: Ref<boolean>\n\tinputValue: Ref<string>\n\tenableDeepThinking: Ref<boolean>\n\tcurrentComponentName: Ref<string>\n\ttypeFlag: Ref<string>\n\tmoduleInfo: Ref<ModuleItem>\n\temit: (event: string, ...args: any[]) => void\n\tafterSend: (result: object) => void\n\tenqueueRender: (data: RenderData) => void\n\trenderContent: (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number) => void\n\tmarkdownToHtml: (content: string) => string\n\tscrollToBottom: () => void\n\tstop: (item: ChatMessage, index: number) => void\n}\n\nexport function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, emit, afterSend, enqueueRender, renderContent, markdownToHtml, scrollToBottom, stop }: UseSSEOptions) {\n\tconst fetchStream = ref<InstanceType<typeof FetchStream> | null>(null)\n\tconst resultItem = ref<ResultItem | null>(null)\n\n\t// 生成聊天ID\n\tconst generateChatId = (prefix: string = 'ai_'): string => {\n\t\treturn prefix + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\n\t}\n\n\t// SSE 连接\n\tconst openSSE = (userContent: string, insertIndex?: number, type?: number): void => {\n\t\ttry {\n\t\t\tif (isUnmounting.value) return\n\t\t\tisChating.value = true\n\n\t\t\tconst currentAiMessage = chatList.value.find((item: any) => item.isChating)\n\t\t\tif (currentAiMessage) {\n\t\t\t\tcurrentAiMessage.isShowLike = true\n\t\t\t\tcurrentAiMessage.isShowCopy = true\n\t\t\t\tcurrentAiMessage.componentName = currentComponentName.value\n\t\t\t}\n\n\t\t\tconst chatId = currentAiMessage?.chatId || generateChatId()\n\t\t\tlet aiContent = currentAiMessage?.content || ''\n\t\t\tlet reasoningContent = currentAiMessage?.reasoningContent || ''\n\t\t\tlet allAiContent = ''\n\n\t\t\tif (!currentAiMessage) {\n\t\t\t\tconst chatItem: ChatMessage = {\n\t\t\t\t\tchatId: chatId,\n\t\t\t\t\tuser: 'ai',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tisChating: true,\n\t\t\t\t\tcontent: '',\n\t\t\t\t\tthinkContent: '',\n\t\t\t\t\treasoningContent: '',\n\t\t\t\t\tthinkStatus: ThinkStatus.THINKING,\n\t\t\t\t\tthinkStartTime: Date.now(),\n\t\t\t\t\tisShowLike: true,\n\t\t\t\t\tisShowCopy: true,\n\t\t\t\t\tcomponentName: currentComponentName.value,\n\t\t\t\t\ttypeFlag: typeFlag.value\n\t\t\t\t}\n\t\t\t\tif (insertIndex !== undefined && insertIndex <= chatList.value.length) {\n\t\t\t\t\tchatList.value.splice(insertIndex, 0, chatItem)\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.push(chatItem)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrIndex.value = insertIndex ?? chatList.value.length - 1\n\n\t\t\t// 构建请求配置\n\t\t\tconst BodyConfig = moduleInfo.value?.config?.body?.()\n\t\t\tconst requestBody = BodyConfig?.messages?.length\n\t\t\t\t? { ...BodyConfig, messages: [...BodyConfig.messages], model: enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3' }\n\t\t\t\t: {\n\t\t\t\t\t\tmodel: enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3',\n\t\t\t\t\t\tmessages: [{ role: 'user', content: userContent }],\n\t\t\t\t\t\tstream: true\n\t\t\t\t\t}\n\n\t\t\t// 更新消息内容\n\t\t\tif (BodyConfig?.messages?.length) {\n\t\t\t\tBodyConfig.messages[0].content = userContent\n\t\t\t}\n\t\t\tconst apiUrl = typeof moduleInfo.value?.config?.action === 'function' ? moduleInfo.value.config.action() : moduleInfo.value?.config?.action || 'https://api.apiyi.com/v1/chat/completions'\n\n\t\t\tfetchStream.value = new FetchStream({\n\t\t\t\turl: apiUrl,\n\t\t\t\trequestInit: {\n\t\t\t\t\theaders: moduleInfo.value?.config?.headers\n\t\t\t\t\t\t? new Headers(moduleInfo.value.config.headers() as Record<string, string>)\n\t\t\t\t\t\t: new Headers({\n\t\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\n\t\t\t\t\t\t\t} as Record<string, string>),\n\t\t\t\t\tbody: JSON.stringify(requestBody)\n\t\t\t\t},\n\t\t\t\tonmessage: (line: string) => {\n\t\t\t\t\tif (isUnmounting.value) return\n\t\t\t\t\tlet dataString = ''\n\t\t\t\t\tif (line.length) {\n\t\t\t\t\t\tif (line.includes('data:')) {\n\t\t\t\t\t\t\tconst match = line.match(/\\{[\\s\\S]*\\}/)\n\t\t\t\t\t\t\tdataString = match ? match[0] : ''\n\t\t\t\t\t\t} else if (line.startsWith('{') && line.endsWith('}')) {\n\t\t\t\t\t\t\tdataString = line\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdataString = dataString.trim()\n\t\t\t\t\tconst respoKeyConfig = moduleInfo.value?.config?.respoKey\n\t\t\t\t\tconst respoKey: RespoKeyConfig | undefined = typeof respoKeyConfig === 'function' ? respoKeyConfig() : respoKeyConfig\n\t\t\t\t\tconst deepseekFlag = moduleInfo.value?.name === 'deepseek-v3'\n\n\t\t\t\t\t// saveEdit 场景下 type === 1,直接渲染\n\t\t\t\t\tif (type === 1 && dataString) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = JSON.parse(dataString)\n\t\t\t\t\t\t\tconst newAiMessage = chatList.value[currIndex.value]\n\n\t\t\t\t\t\t\tif (deepseekFlag || !moduleInfo.value) {\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.content) {\n\t\t\t\t\t\t\t\t\taiContent += result.choices[0].delta.content\n\t\t\t\t\t\t\t\t\tif (newAiMessage?.thinkStatus === ThinkStatus.THINKING) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.COMPLETED\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now())\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.reasoning_content) {\n\t\t\t\t\t\t\t\t\treasoningContent += result.choices[0].delta.reasoning_content\n\t\t\t\t\t\t\t\t\tif (!newAiMessage?.thinkStatus) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.THINKING\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStartTime = Date.now()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (respoKey) {\n\t\t\t\t\t\t\t\tif (result && result[respoKey.content]) {\n\t\t\t\t\t\t\t\t\taiContent += result[respoKey.content]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// 更新消息内容到chatList\n\t\t\t\t\t\t\tif (newAiMessage) {\n\t\t\t\t\t\t\t\tnewAiMessage.content = aiContent\n\t\t\t\t\t\t\t\tnewAiMessage.reasoningContent = reasoningContent\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (chatList.value.some((ele: any) => ele.chatId === chatId)) {\n\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\t// 显式传递索引,确保渲染到正确位置\n\t\t\t\t\t\t\t\t\tconst renderWithRetry = (retryCount = 0) => {\n\t\t\t\t\t\t\t\t\t\tif (retryCount > 10) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.error('renderContent失败:无法找到DOM元素,currIndex:', currIndex.value)\n\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// 显式传递索引,确保渲染到正确位置\n\t\t\t\t\t\t\t\t\t\trenderContent(aiContent, 'main', currIndex.value)\n\t\t\t\t\t\t\t\t\t\trenderContent(reasoningContent, 'reasoning', currIndex.value)\n\n\t\t\t\t\t\t\t\t\t\t// 检查是否渲染成功(通过检查内容是否被设置)\n\t\t\t\t\t\t\t\t\t\tconst currentMsg = chatList.value[currIndex.value]\n\t\t\t\t\t\t\t\t\t\tif (currentMsg && (currentMsg.content !== aiContent || currentMsg.reasoningContent !== reasoningContent)) {\n\t\t\t\t\t\t\t\t\t\t\t// 如果没有成功,稍后重试\n\t\t\t\t\t\t\t\t\t\t\tsetTimeout(() => renderWithRetry(retryCount + 1), 50)\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\trenderWithRetry()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error('解析SSE消息失败:', e)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (dataString && ((dataString.startsWith('{') && dataString.endsWith('}')) || !respoKey?.content)) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = !respoKey?.content && moduleInfo.value ? dataString : JSON.parse(dataString)\n\t\t\t\t\t\t\tconst newAiMessage = chatList.value[currIndex.value]\n\n\t\t\t\t\t\t\t// deepseek\n\t\t\t\t\t\t\tif (deepseekFlag || !moduleInfo.value) {\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.content) {\n\t\t\t\t\t\t\t\t\taiContent += result.choices[0].delta.content\n\t\t\t\t\t\t\t\t\tif (newAiMessage?.thinkStatus === ThinkStatus.THINKING) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.COMPLETED\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkTime = Date.now() - (newAiMessage.thinkStartTime || Date.now())\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (result?.choices?.[0]?.delta?.reasoning_content) {\n\t\t\t\t\t\t\t\t\treasoningContent += result.choices[0].delta.reasoning_content\n\t\t\t\t\t\t\t\t\tif (!newAiMessage?.thinkStatus) {\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStatus = ThinkStatus.THINKING\n\t\t\t\t\t\t\t\t\t\tnewAiMessage.thinkStartTime = Date.now()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tallAiContent = reasoningContent + aiContent\n\t\t\t\t\t\t\t} else if (respoKey) {\n\t\t\t\t\t\t\t\tif (result && result[respoKey.content] && (result[respoKey.category] === respoKey.contentCategory || !result[respoKey.category])) {\n\t\t\t\t\t\t\t\t\taiContent += result[respoKey.content]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 匹配不规则的结束\n\t\t\t\t\t\t\t\tif (result && result[respoKey.category] === 'done') {\n\t\t\t\t\t\t\t\t\tresultItem.value = result\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 匹配不规则的错误提示\n\t\t\t\t\t\t\t\tif (result && result[respoKey.category] === 'error') {\n\t\t\t\t\t\t\t\t\tconst errorMessage = respoKey.all && result[respoKey.all] ? result[respoKey.all] : '当前网络异常'\n\t\t\t\t\t\t\t\t\tconst currentAiMessage = chatList.value[currIndex.value]\n\t\t\t\t\t\t\t\t\tif (currentAiMessage.chatId) {\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\n\t\t\t\t\t\t\t\t\t\t</svg>${errorMessage}</div>`\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isChating = false\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.componentName = ''\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isShowLike = false\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isShowCopy = false\n\t\t\t\t\t\t\t\t\t\tcurrentAiMessage.isError = true\n\n\t\t\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\t\tafterSend(result)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 后端无allAiContent完整信息 前端手动拼接\n\t\t\t\t\t\t\t\tif (aiContent || reasoningContent) {\n\t\t\t\t\t\t\t\t\tallAiContent = aiContent + reasoningContent\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (respoKey && respoKey.all && result && result[respoKey.all] && result[respoKey.category] === respoKey.allCategory) {\n\t\t\t\t\t\t\t\t\tallAiContent = result[respoKey.all]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 后端返回匹配不规则的流式输出\n\t\t\t\t\t\t\t\tif (respoKey && result && typeof result === 'string' && result !== '[DONE]') {\n\t\t\t\t\t\t\t\t\taiContent += result\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 后端返回匹配不规则的流式输出 结束\n\t\t\t\t\t\t\t\tif (respoKey && result && typeof result === 'string' && result === '[DONE]') {\n\t\t\t\t\t\t\t\t\tconst index = chatList.value.findIndex((ele: any) => ele.chatId === chatId)\n\t\t\t\t\t\t\t\t\tif (index !== -1 && chatList.value[index]) {\n\t\t\t\t\t\t\t\t\t\tisChating.value = false\n\t\t\t\t\t\t\t\t\t\tchatList.value[index].isChating = false\n\t\t\t\t\t\t\t\t\t\temit('sendMessage', JSON.parse(JSON.stringify(chatList.value)))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (chatList.value.some((ele: any) => ele.chatId === chatId)) {\n\t\t\t\t\t\t\t\tenqueueRender({\n\t\t\t\t\t\t\t\t\tmainContent: aiContent,\n\t\t\t\t\t\t\t\t\tthinkContent: '',\n\t\t\t\t\t\t\t\t\treasoningContent: reasoningContent\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// type === 1 的情况已经在上面单独处理,这里不再重复渲染\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('解析SSE消息失败:', error)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tondone: () => {\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tisChating.value = false\n\t\t\t\t\t\tif (isUnmounting.value || !isMounted.value) return\n\t\t\t\t\t\tconst index = chatList.value.findIndex((ele: any) => ele.chatId === chatId)\n\t\t\t\t\t\tif (index !== -1 && chatList.value[index]) {\n\t\t\t\t\t\t\tchatList.value[index].isChating = false\n\t\t\t\t\t\t\tchatList.value[index].componentName = currentComponentName.value\n\t\t\t\t\t\t\tchatList.value[index].html = markdownToHtml(allAiContent)\n\t\t\t\t\t\t\tif (allAiContent) {\n\t\t\t\t\t\t\t\tif (resultItem.value) {\n\t\t\t\t\t\t\t\t\tresultItem.value.allAiContent = allAiContent\n\t\t\t\t\t\t\t\t\tafterSend(resultItem.value)\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tafterSend({ allAiContent })\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst waitForRenderComplete = () => {\n\t\t\t\t\t\t\t\t// 这里假设需要检查渲染队列,通过回调检查\n\t\t\t\t\t\t\t\tif (chatList.value.length > 0) {\n\t\t\t\t\t\t\t\t\temit('sendMessage', JSON.parse(JSON.stringify(chatList.value)))\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twaitForRenderComplete()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tonabort: () => {\n\t\t\t\t\thandleAbort()\n\t\t\t\t},\n\t\t\t\tonerror: (response: Error | Response) => {\n\t\t\t\t\thandleError(response)\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tconsole.error('OpenSSE错误:', error)\n\t\t\tisChating.value = false\n\t\t\tchatList.value[currIndex.value].content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\n\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\n\t\t</svg>${'请求失败'}</div>`\n\t\t\tchatList.value[currIndex.value].isChating = false\n\t\t\tchatList.value[currIndex.value].isShowCopy = false\n\t\t\tchatList.value[currIndex.value].isShowLike = false\n\t\t\tshowToast('请求失败,请重试', 'error', 3000)\n\t\t}\n\t}\n\n\t// 处理请求中止\n\tconst handleAbort = (): void => {\n\t\tisChating.value = false\n\t\tif (isUnmounting.value) return\n\n\t\tconst currentAiMessage = chatList.value[currIndex.value]\n\t\tstop(chatList.value[currIndex.value], currIndex.value)\n\t\tconst hasContent = currentAiMessage && (currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent)\n\n\t\tif (currentAiMessage) {\n\t\t\tif (currentAiMessage.thinkStatus === ThinkStatus.THINKING) {\n\t\t\t\tcurrentAiMessage.thinkStatus = ThinkStatus.STOPPED\n\t\t\t\tcurrentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now())\n\t\t\t}\n\t\t\tif (!hasContent) {\n\t\t\t\tconst userMessageIndex = currIndex.value - 1\n\t\t\t\tif (userMessageIndex >= 0 && chatList.value[userMessageIndex].user === 'u') {\n\t\t\t\t\tchatList.value.splice(currIndex.value, 1)\n\t\t\t\t\tchatList.value.splice(userMessageIndex, 1)\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.splice(currIndex.value, 1)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst updatedAiMessage = {\n\t\t\t\t\t...currentAiMessage,\n\t\t\t\t\tisChating: false,\n\t\t\t\t\tcontent: currentAiMessage.content ? currentAiMessage.content + '...' : '',\n\t\t\t\t\tthinkContent: currentAiMessage.thinkContent ? currentAiMessage.thinkContent + '...' : undefined,\n\t\t\t\t\treasoningContent: currentAiMessage.reasoningContent ? currentAiMessage.reasoningContent + '...' : undefined,\n\t\t\t\t\tthinkStatus: currentAiMessage.thinkStatus as ThinkStatus,\n\t\t\t\t\tstop: true\n\t\t\t\t}\n\n\t\t\t\tchatList.value.splice(currIndex.value, 1, updatedAiMessage)\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trenderContent(updatedAiMessage.thinkContent || '', 'thinking')\n\t\t\t\t\trenderContent(updatedAiMessage.reasoningContent || '', 'reasoning')\n\t\t\t\t\trenderContent(updatedAiMessage.content || '', 'main')\n\t\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (chatList.value.length > 0) {\n\t\t\temit('sendMessage', [...chatList.value])\n\t\t}\n\t}\n\n\t// 处理请求错误\n\tconst handleError = (response: Error | Response): void => {\n\t\tif (isUnmounting.value) return\n\t\tisChating.value = false\n\n\t\tlet errorMessage = '未知错误'\n\t\tif (response instanceof Error) {\n\t\t\tconsole.error('API请求错误:', response)\n\t\t\terrorMessage = response.message\n\t\t} else if (response instanceof Response) {\n\t\t\tconsole.error('API请求错误, 响应状态:', response.status, response.statusText)\n\t\t\terrorMessage = `请求失败: ${response.status} ${response.statusText}`\n\t\t}\n\n\t\tconst currentAiMessage = chatList.value[currIndex.value]\n\t\tif (currentAiMessage) {\n\t\t\tcurrentAiMessage.content = `<div style=\"color: red; display: flex; align-items: center;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z\" fill=\"#F93920\"/>\n</svg>${errorMessage}</div>`\n\t\t\tcurrentAiMessage.isChating = false\n\t\t\tcurrentAiMessage.componentName = ''\n\t\t\tcurrentAiMessage.isShowLike = false\n\t\t\tcurrentAiMessage.isShowCopy = false\n\t\t\tcurrentAiMessage.isError = true\n\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(currentAiMessage.content || '', 'main')\n\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t})\n\t\t} else {\n\t\t\tshowToast(errorMessage, 'error', 3000)\n\t\t\temit('sendMessage', [...chatList.value])\n\t\t}\n\t}\n\n\t// 清理 SSE 连接\n\tconst cleanupSSE = () => {\n\t\tif (fetchStream.value) {\n\t\t\tfetchStream.value.abort()\n\t\t\tfetchStream.value = null\n\t\t}\n\t}\n\n\treturn {\n\t\tfetchStream,\n\t\tresultItem,\n\t\topenSSE,\n\t\thandleAbort,\n\t\thandleError,\n\t\tcleanupSSE\n\t}\n}\n"],"names":["_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","currentAiMessage"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ref, nextTick } from 'vue';
|
|
2
|
+
import { throttle } from '../../../../../../node_modules/.pnpm/throttle-debounce@5.0.2/node_modules/throttle-debounce/esm/index.mjs';
|
|
3
|
+
|
|
4
|
+
function useScroll({ chatContainer, isMounted, isUnmounting, bottom }) {
|
|
5
|
+
const scrollObserver = ref(null);
|
|
6
|
+
const scrollToBottom = () => {
|
|
7
|
+
if (!isMounted.value || isUnmounting.value || !chatContainer.value)
|
|
8
|
+
return;
|
|
9
|
+
nextTick(() => {
|
|
10
|
+
requestAnimationFrame(() => {
|
|
11
|
+
const chatContainerEl = chatContainer.value;
|
|
12
|
+
if (!chatContainerEl)
|
|
13
|
+
return;
|
|
14
|
+
const lastMessage = chatContainerEl.querySelector(".touchchat-dialog-content > *:last-child");
|
|
15
|
+
if (lastMessage) {
|
|
16
|
+
const { height: messageHeight } = lastMessage.getBoundingClientRect();
|
|
17
|
+
const containerHeight = chatContainerEl.clientHeight;
|
|
18
|
+
const messageBottom = lastMessage.offsetTop + lastMessage.offsetHeight;
|
|
19
|
+
if (messageHeight > containerHeight) {
|
|
20
|
+
chatContainerEl.scrollTop = lastMessage.offsetTop;
|
|
21
|
+
} else {
|
|
22
|
+
chatContainerEl.scrollTop = messageBottom - containerHeight;
|
|
23
|
+
}
|
|
24
|
+
if (scrollObserver.value) {
|
|
25
|
+
scrollObserver.value.disconnect();
|
|
26
|
+
}
|
|
27
|
+
scrollObserver.value = new MutationObserver(() => {
|
|
28
|
+
const updatedMessageBottom = lastMessage.offsetTop + lastMessage.offsetHeight;
|
|
29
|
+
chatContainerEl.scrollTop = Math.max(updatedMessageBottom - containerHeight, chatContainerEl.scrollTop);
|
|
30
|
+
});
|
|
31
|
+
scrollObserver.value.observe(lastMessage, {
|
|
32
|
+
childList: true,
|
|
33
|
+
subtree: true,
|
|
34
|
+
characterData: true,
|
|
35
|
+
attributes: true,
|
|
36
|
+
attributeFilter: ["style", "class"]
|
|
37
|
+
});
|
|
38
|
+
} else {
|
|
39
|
+
chatContainerEl.scrollTo({
|
|
40
|
+
top: chatContainerEl.scrollHeight,
|
|
41
|
+
behavior: "smooth"
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
const onScrollToBottom = () => {
|
|
48
|
+
bottom();
|
|
49
|
+
};
|
|
50
|
+
const throttledScrollToBottom = throttle(300, onScrollToBottom);
|
|
51
|
+
const handleScroll = () => {
|
|
52
|
+
if (!chatContainer.value)
|
|
53
|
+
return;
|
|
54
|
+
const { scrollTop, scrollHeight, clientHeight } = chatContainer.value;
|
|
55
|
+
if (scrollTop + clientHeight >= scrollHeight) {
|
|
56
|
+
throttledScrollToBottom();
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const cleanupScrollObserver = () => {
|
|
60
|
+
if (scrollObserver.value) {
|
|
61
|
+
scrollObserver.value.disconnect();
|
|
62
|
+
scrollObserver.value = null;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
scrollObserver,
|
|
67
|
+
scrollToBottom,
|
|
68
|
+
handleScroll,
|
|
69
|
+
cleanupScrollObserver
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { useScroll };
|
|
74
|
+
//# sourceMappingURL=useScroll.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScroll.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useScroll.ts"],"sourcesContent":["/**\n * 滚动相关逻辑 Composable\n */\n\nimport { ref, type Ref, nextTick } from 'vue'\nimport { throttle } from 'throttle-debounce'\n\nexport interface UseScrollOptions {\n\tchatContainer: Ref<HTMLElement | null>\n\tisMounted: Ref<boolean>\n\tisUnmounting: Ref<boolean>\n\tbottom: () => void\n}\n\nexport function useScroll({ chatContainer, isMounted, isUnmounting, bottom }: UseScrollOptions) {\n\t// 滚动观察者实例\n\tconst scrollObserver = ref<MutationObserver | null>(null)\n\n\t// 滚动到底部 - 优化版,支持实时滚动和内容变化监听\n\tconst scrollToBottom = () => {\n\t\tif (!isMounted.value || isUnmounting.value || !chatContainer.value) return\n\n\t\tnextTick(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst chatContainerEl = chatContainer.value\n\t\t\t\tif (!chatContainerEl) return\n\t\t\t\tconst lastMessage = chatContainerEl.querySelector('.touchchat-dialog-content > *:last-child') as HTMLElement | null\n\n\t\t\t\tif (lastMessage) {\n\t\t\t\t\t// 计算消息元素的完整高度(包含内边距和边框)\n\t\t\t\t\tconst { height: messageHeight } = lastMessage.getBoundingClientRect()\n\t\t\t\t\t// 计算容器可视区域高度\n\t\t\t\t\tconst containerHeight = chatContainerEl.clientHeight\n\t\t\t\t\t// 计算消息底部到容器顶部的距离\n\t\t\t\t\tconst messageBottom = lastMessage.offsetTop + lastMessage.offsetHeight\n\n\t\t\t\t\t// 如果消息高度超过容器高度,滚动到消息顶部;否则滚动到消息底部\n\t\t\t\t\tif (messageHeight > containerHeight) {\n\t\t\t\t\t\tchatContainerEl.scrollTop = lastMessage.offsetTop\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// 确保消息底部完全可见(处理可能的内边距/边框问题)\n\t\t\t\t\t\tchatContainerEl.scrollTop = messageBottom - containerHeight\n\t\t\t\t\t}\n\n\t\t\t\t\t// 增强内容变化监听(包括文本节点和子元素变化)\n\t\t\t\t\tif (scrollObserver.value) {\n\t\t\t\t\t\tscrollObserver.value.disconnect()\n\t\t\t\t\t}\n\t\t\t\t\tscrollObserver.value = new MutationObserver(() => {\n\t\t\t\t\t\t// 内容变化后重新计算并滚动\n\t\t\t\t\t\tconst updatedMessageBottom = lastMessage.offsetTop + lastMessage.offsetHeight\n\t\t\t\t\t\tchatContainerEl.scrollTop = Math.max(updatedMessageBottom - containerHeight, chatContainerEl.scrollTop)\n\t\t\t\t\t})\n\n\t\t\t\t\tscrollObserver.value.observe(lastMessage, {\n\t\t\t\t\t\tchildList: true,\n\t\t\t\t\t\tsubtree: true,\n\t\t\t\t\t\tcharacterData: true,\n\t\t\t\t\t\tattributes: true,\n\t\t\t\t\t\tattributeFilter: ['style', 'class']\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tchatContainerEl.scrollTo({\n\t\t\t\t\t\ttop: chatContainerEl.scrollHeight,\n\t\t\t\t\t\tbehavior: 'smooth'\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 滚动到底部触底回调\n\tconst onScrollToBottom = () => {\n\t\tbottom()\n\t}\n\n\t// 使用节流包装触底处理函数\n\tconst throttledScrollToBottom = throttle(300, onScrollToBottom)\n\n\t// 处理滚动事件\n\tconst handleScroll = () => {\n\t\tif (!chatContainer.value) return\n\n\t\tconst { scrollTop, scrollHeight, clientHeight } = chatContainer.value\n\t\t// 判断是否滚动到底部\n\t\tif (scrollTop + clientHeight >= scrollHeight) {\n\t\t\tthrottledScrollToBottom()\n\t\t}\n\t}\n\n\t// 清理滚动观察者\n\tconst cleanupScrollObserver = () => {\n\t\tif (scrollObserver.value) {\n\t\t\tscrollObserver.value.disconnect()\n\t\t\tscrollObserver.value = null\n\t\t}\n\t}\n\n\treturn {\n\t\tscrollObserver,\n\t\tscrollToBottom,\n\t\thandleScroll,\n\t\tcleanupScrollObserver\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -185,11 +185,12 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
185
185
|
uploadProgress: 0,
|
|
186
186
|
uploadSuccess: false,
|
|
187
187
|
uploadError: false,
|
|
188
|
-
fileSize:
|
|
188
|
+
fileSize: blob.size,
|
|
189
189
|
fileType: blob.type,
|
|
190
190
|
name: `pasted_image_${Date.now()}`,
|
|
191
191
|
id: Date.now().toString(),
|
|
192
|
-
base64
|
|
192
|
+
base64,
|
|
193
|
+
lastModified: Date.now()
|
|
193
194
|
};
|
|
194
195
|
fileList.value.push(imageInfo);
|
|
195
196
|
nextTick(() => {
|
|
@@ -329,7 +330,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
329
330
|
createElementVNode("div", { class: "touchchat-edit-input" }, [
|
|
330
331
|
createCommentVNode(" @keydown.enter.prevent "),
|
|
331
332
|
createElementVNode("textarea", {
|
|
332
|
-
value:
|
|
333
|
+
value: _ctx.inputValue,
|
|
333
334
|
placeholder: (_a = unref(placeholder)) != null ? _a : "\u8BF7\u8F93\u5165...",
|
|
334
335
|
onPaste: handlePaste,
|
|
335
336
|
onInput: handleInputChange,
|
|
@@ -357,7 +358,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
357
358
|
"button",
|
|
358
359
|
{
|
|
359
360
|
key: 0,
|
|
360
|
-
class: normalizeClass(["touchchat-edit-attach touchchat-edit-button", { "is-dis":
|
|
361
|
+
class: normalizeClass(["touchchat-edit-attach touchchat-edit-button", { "is-dis": _ctx.isChating }])
|
|
361
362
|
},
|
|
362
363
|
[
|
|
363
364
|
createElementVNode("div", { class: "touchchat-edit-attach-icon" }),
|
|
@@ -399,7 +400,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
399
400
|
"button",
|
|
400
401
|
{
|
|
401
402
|
key: 3,
|
|
402
|
-
class: normalizeClass(["touchchat-edit-think", { "is-on":
|
|
403
|
+
class: normalizeClass(["touchchat-edit-think", { "is-on": _ctx.enableDeepThinking, "is-dis": _ctx.isChating }]),
|
|
403
404
|
onClick: handleDeepThinkingClick
|
|
404
405
|
},
|
|
405
406
|
[
|
|
@@ -437,10 +438,10 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
437
438
|
)) : createCommentVNode("v-if", true),
|
|
438
439
|
renderSlot(_ctx.$slots, "editFn"),
|
|
439
440
|
createCommentVNode(" \u53D1\u9001\u6309\u94AE "),
|
|
440
|
-
!
|
|
441
|
+
!_ctx.isChating ? (openBlock(), createElementBlock("button", {
|
|
441
442
|
key: 3,
|
|
442
443
|
class: "touchchat-edit-send",
|
|
443
|
-
disabled: !
|
|
444
|
+
disabled: !_ctx.inputValue.trim() && !fileList.value.length,
|
|
444
445
|
onClick: handleSend
|
|
445
446
|
}, [
|
|
446
447
|
createElementVNode("div", { class: "touchchat-edit-send-icon" })
|