|
@@ -3,13 +3,19 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
import { create } from "zustand";
|
|
import { create } from "zustand";
|
|
-import { generateRandomId } from '@/utils/index'
|
|
|
|
|
|
+import { generateUUID } from '@/utils/index'
|
|
|
|
+
|
|
|
|
+import { getMessageHistories as _getMessageHistories, appendMessages, type TGetMessageHistoriesParams, } from '@/service/bot'
|
|
|
|
+import { EChatRole, EContentType, TChatRole } from "@/types/bot";
|
|
|
|
+
|
|
|
|
|
|
-import { getMessageHistories as _getMessageHistories, type TGetMessageHistoriesParams, } from '@/service/bot'
|
|
|
|
|
|
|
|
export type TMessage = {
|
|
export type TMessage = {
|
|
- messageId: string;
|
|
|
|
|
|
+ msgUk: string;
|
|
content: string;
|
|
content: string;
|
|
|
|
+ role: TChatRole
|
|
|
|
+ isStreaming?: boolean
|
|
|
|
+ saveStatus: 0|1|2,
|
|
};
|
|
};
|
|
|
|
|
|
export type TRobotMessage = {
|
|
export type TRobotMessage = {
|
|
@@ -21,22 +27,25 @@ export type TRobotMessage = {
|
|
};
|
|
};
|
|
} & TMessage;
|
|
} & TMessage;
|
|
|
|
|
|
-type TRobotMessageWithOptionalId = Omit<TRobotMessage, "messageId"> & {
|
|
|
|
- messageId?: string; // 将 messageId 设置为可选
|
|
|
|
|
|
+type TRobotMessageWithOptionalId = Omit<TRobotMessage, "msgUk"> & {
|
|
|
|
+ msgUk?: string; // 将 messageId 设置为可选
|
|
reasoningContent?: string; // 添加 reasoningContent
|
|
reasoningContent?: string; // 添加 reasoningContent
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
-const INIT_CURRENT_ROBOT_MESSAGE_ID = ''
|
|
|
|
|
|
+const INIT_CURRENT_ROBOT_MSG_UK = ''
|
|
|
|
|
|
export interface TextChat {
|
|
export interface TextChat {
|
|
- currentRobotMessageId: string; // 当前正在说话的 AI 机器人 id, 可用于控制是否继续输出文本至当前 message 框内
|
|
|
|
|
|
+ currentRobotMsgUk: string; // 当前正在说话的 AI 机器人 id, 可用于控制是否继续输出文本至当前 message 框内
|
|
scrollTop: number; // 控制聊天内容变化后滚动至最底部
|
|
scrollTop: number; // 控制聊天内容变化后滚动至最底部
|
|
list: (TMessage | TRobotMessage)[];
|
|
list: (TMessage | TRobotMessage)[];
|
|
|
|
+ sessionId: string|null
|
|
|
|
+ // 显示聊天历史
|
|
|
|
+ setScrollTop: () => void
|
|
// 将机器人气泡框推入聊天框
|
|
// 将机器人气泡框推入聊天框
|
|
pushRobotMessage: (message: TRobotMessageWithOptionalId) => string;
|
|
pushRobotMessage: (message: TRobotMessageWithOptionalId) => string;
|
|
// 将自己发出的气泡框推入聊天框
|
|
// 将自己发出的气泡框推入聊天框
|
|
- pushMessage: (content: string) => string;
|
|
|
|
|
|
+ pushMessage: (content: string) => {msgUk: string, sessionId: string};
|
|
// 更新自己发出的气泡框
|
|
// 更新自己发出的气泡框
|
|
updateMessage: (content: string, messageId: string) => string;
|
|
updateMessage: (content: string, messageId: string) => string;
|
|
// 更新机器人汽泡框内的内容实现 gpt 的效果
|
|
// 更新机器人汽泡框内的内容实现 gpt 的效果
|
|
@@ -50,27 +59,29 @@ export interface TextChat {
|
|
}
|
|
}
|
|
|
|
|
|
// 新messageId 为 index 加 1
|
|
// 新messageId 为 index 加 1
|
|
-const generateMessageId = () => {
|
|
|
|
- return generateRandomId();
|
|
|
|
|
|
+const generateUk = () => {
|
|
|
|
+ return generateUUID();
|
|
}
|
|
}
|
|
|
|
|
|
export const useTextChat = create<TextChat>((set, get) => ({
|
|
export const useTextChat = create<TextChat>((set, get) => ({
|
|
- currentRobotMessageId: INIT_CURRENT_ROBOT_MESSAGE_ID,
|
|
|
|
|
|
+ currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK,
|
|
scrollTop: 9999,
|
|
scrollTop: 9999,
|
|
list: [],
|
|
list: [],
|
|
|
|
+ sessionId: null,
|
|
destroy: () => {
|
|
destroy: () => {
|
|
set({
|
|
set({
|
|
list: [],
|
|
list: [],
|
|
- currentRobotMessageId: INIT_CURRENT_ROBOT_MESSAGE_ID,
|
|
|
|
|
|
+ currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK,
|
|
scrollTop: 9999,
|
|
scrollTop: 9999,
|
|
|
|
+ sessionId: null,
|
|
});
|
|
});
|
|
},
|
|
},
|
|
pushRobotMessage: (message) => {
|
|
pushRobotMessage: (message) => {
|
|
- const messageId = generateMessageId()
|
|
|
|
|
|
+ const msgUk = generateUk()
|
|
set((state) => {
|
|
set((state) => {
|
|
return {
|
|
return {
|
|
- list: [...state.list, { ...message, messageId }],
|
|
|
|
- currentRobotMessageId: messageId,
|
|
|
|
|
|
+ list: [...state.list, { ...message, msgUk, role: EChatRole.Assistant }],
|
|
|
|
+ currentRobotMsgUk: msgUk,
|
|
scrollTop: state.scrollTop + 1,
|
|
scrollTop: state.scrollTop + 1,
|
|
};
|
|
};
|
|
});
|
|
});
|
|
@@ -81,13 +92,24 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
};
|
|
};
|
|
});
|
|
});
|
|
}, 100)
|
|
}, 100)
|
|
- return messageId
|
|
|
|
|
|
+ return msgUk
|
|
|
|
+ },
|
|
|
|
+ setScrollTop: ()=> {
|
|
|
|
+ set((state) => {
|
|
|
|
+ return {
|
|
|
|
+ scrollTop: state.scrollTop + 1,
|
|
|
|
+ };
|
|
|
|
+ });
|
|
},
|
|
},
|
|
pushMessage: (content: string) => {
|
|
pushMessage: (content: string) => {
|
|
- const messageId = generateMessageId()
|
|
|
|
|
|
+ const msgUk = generateUk();
|
|
|
|
+ const sessionId = generateUUID();
|
|
|
|
+ const newMessage:TMessage ={ msgUk, content: content, role: EChatRole.User, saveStatus: 0 }
|
|
|
|
+
|
|
set((state) => {
|
|
set((state) => {
|
|
return {
|
|
return {
|
|
- list: [...state.list, { messageId, content: content }],
|
|
|
|
|
|
+ sessionId,
|
|
|
|
+ list: [...state.list, newMessage],
|
|
scrollTop: state.scrollTop + 1,
|
|
scrollTop: state.scrollTop + 1,
|
|
};
|
|
};
|
|
});
|
|
});
|
|
@@ -98,24 +120,25 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
};
|
|
};
|
|
});
|
|
});
|
|
}, 100)
|
|
}, 100)
|
|
- return messageId
|
|
|
|
|
|
+
|
|
|
|
+ return {msgUk, sessionId}
|
|
},
|
|
},
|
|
- updateMessage: (content, messageId) => {
|
|
|
|
|
|
+ updateMessage: (content, msgUk) => {
|
|
set((state) => {
|
|
set((state) => {
|
|
const updatedList = state.list.map((message) => {
|
|
const updatedList = state.list.map((message) => {
|
|
- if (message.messageId === messageId) {
|
|
|
|
|
|
+ if (message.msgUk === msgUk) {
|
|
return { ...message, content: message.content + content }; // 更新 content
|
|
return { ...message, content: message.content + content }; // 更新 content
|
|
}
|
|
}
|
|
return message; // 返回未修改的 message
|
|
return message; // 返回未修改的 message
|
|
});
|
|
});
|
|
return { list: updatedList, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
return { list: updatedList, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
});
|
|
});
|
|
- return messageId
|
|
|
|
|
|
+ return msgUk
|
|
},
|
|
},
|
|
updateRobotMessage: (content) => {
|
|
updateRobotMessage: (content) => {
|
|
set((state) => {
|
|
set((state) => {
|
|
const updatedList = state.list.map((message) => {
|
|
const updatedList = state.list.map((message) => {
|
|
- if (message.messageId === state.currentRobotMessageId) {
|
|
|
|
|
|
+ if (message.msgUk === state.currentRobotMsgUk) {
|
|
return { ...message, content: message.content + content }; // 更新 content
|
|
return { ...message, content: message.content + content }; // 更新 content
|
|
}
|
|
}
|
|
return message; // 返回未修改的 message
|
|
return message; // 返回未修改的 message
|
|
@@ -125,15 +148,15 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
},
|
|
},
|
|
getCurrentRobotMessage: ()=> {
|
|
getCurrentRobotMessage: ()=> {
|
|
const state = get()
|
|
const state = get()
|
|
- const currentMessage = state.list.find((message)=> message.messageId === state.currentRobotMessageId) as TRobotMessage
|
|
|
|
|
|
+ const currentMessage = state.list.find((message)=> message.msgUk === state.currentRobotMsgUk) as TRobotMessage
|
|
return currentMessage
|
|
return currentMessage
|
|
},
|
|
},
|
|
- updateRobotReasoningMessage: (reasoningContent, messageId) => {
|
|
|
|
|
|
+ updateRobotReasoningMessage: (reasoningContent, msgUk) => {
|
|
set((state) => {
|
|
set((state) => {
|
|
- // 由于 currentRobotMessageId 可能发生变化, 所以需要传递 messageId
|
|
|
|
- // console.log(state.currentRobotMessageId, messageId)
|
|
|
|
|
|
+ // 由于 currentRobotMsgUk 可能发生变化, 所以需要传递 msgUk
|
|
|
|
+ // console.log(state.currentRobotMsgUk, msgUk)
|
|
const updatedList = state.list.map((message) => {
|
|
const updatedList = state.list.map((message) => {
|
|
- if (message.messageId === messageId) {
|
|
|
|
|
|
+ if (message.msgUk === msgUk) {
|
|
//@ts-ignore
|
|
//@ts-ignore
|
|
return { ...message, reasoningContent: message.reasoningContent + reasoningContent }; // 更新 reasoningContent
|
|
return { ...message, reasoningContent: message.reasoningContent + reasoningContent }; // 更新 reasoningContent
|
|
}
|
|
}
|
|
@@ -142,19 +165,19 @@ export const useTextChat = create<TextChat>((set, get) => ({
|
|
return { list: updatedList, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
return { list: updatedList, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
});
|
|
});
|
|
},
|
|
},
|
|
- deleteMessage: (messageId)=> {
|
|
|
|
|
|
+ deleteMessage: (msgUk)=> {
|
|
set((state) => {
|
|
set((state) => {
|
|
// 如果对话框是空的,则删除
|
|
// 如果对话框是空的,则删除
|
|
const filtered = state.list.filter((message) => {
|
|
const filtered = state.list.filter((message) => {
|
|
const isEmptyContent = message.content.length <= 0
|
|
const isEmptyContent = message.content.length <= 0
|
|
- return (message.messageId !== messageId && isEmptyContent)
|
|
|
|
|
|
+ return (message.msgUk !== msgUk && isEmptyContent)
|
|
});
|
|
});
|
|
return { list: filtered, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
return { list: filtered, scrollTop: state.scrollTop + 1 }; // 返回新的状态
|
|
});
|
|
});
|
|
},
|
|
},
|
|
// 停止当前机器人说话输出框输出
|
|
// 停止当前机器人说话输出框输出
|
|
stopCurrentRobotMessaging: ()=> {
|
|
stopCurrentRobotMessaging: ()=> {
|
|
- set({currentRobotMessageId: INIT_CURRENT_ROBOT_MESSAGE_ID})
|
|
|
|
|
|
+ set({currentRobotMsgUk: INIT_CURRENT_ROBOT_MSG_UK})
|
|
},
|
|
},
|
|
getMessageHistories: async (data: TGetMessageHistoriesParams) => {
|
|
getMessageHistories: async (data: TGetMessageHistoriesParams) => {
|
|
const response = await _getMessageHistories(data)
|
|
const response = await _getMessageHistories(data)
|