balibabu
commited on
Commit
·
18a496b
1
Parent(s):
df67d7c
feat: Send message with uuid #2088 (#2149)
Browse files### What problem does this PR solve?
feat: Send message with uuid #2088
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- web/src/components/message-item/group-button.tsx +7 -2
- web/src/components/message-item/index.tsx +13 -6
- web/src/hooks/chat-hooks.ts +16 -9
- web/src/pages/chat/chat-container/index.tsx +1 -0
- web/src/pages/chat/hooks.ts +29 -17
- web/src/pages/chat/markdown-content/index.tsx +2 -2
- web/src/pages/chat/share/large.tsx +1 -0
- web/src/pages/chat/shared-hooks.ts +25 -18
- web/src/pages/flow/chat/box.tsx +1 -0
- web/src/pages/flow/chat/hooks.ts +26 -15
- web/src/utils/chat.ts +1 -1
web/src/components/message-item/group-button.tsx
CHANGED
|
@@ -77,11 +77,16 @@ export const AssistantGroupButton = ({
|
|
| 77 |
);
|
| 78 |
};
|
| 79 |
|
| 80 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
return (
|
| 82 |
<Radio.Group size="small">
|
| 83 |
<Radio.Button value="a">
|
| 84 |
-
<CopyToClipboard text=
|
| 85 |
</Radio.Button>
|
| 86 |
<Radio.Button value="b">
|
| 87 |
<SyncOutlined />
|
|
|
|
| 77 |
);
|
| 78 |
};
|
| 79 |
|
| 80 |
+
interface UserGroupButtonProps {
|
| 81 |
+
messageId: string;
|
| 82 |
+
content: string;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
export const UserGroupButton = ({ content }: UserGroupButtonProps) => {
|
| 86 |
return (
|
| 87 |
<Radio.Group size="small">
|
| 88 |
<Radio.Button value="a">
|
| 89 |
+
<CopyToClipboard text={content}></CopyToClipboard>
|
| 90 |
</Radio.Button>
|
| 91 |
<Radio.Button value="b">
|
| 92 |
<SyncOutlined />
|
web/src/components/message-item/index.tsx
CHANGED
|
@@ -30,6 +30,7 @@ interface IProps {
|
|
| 30 |
nickname?: string;
|
| 31 |
avatar?: string;
|
| 32 |
clickDocumentButton?: (documentId: string, chunk: IChunk) => void;
|
|
|
|
| 33 |
}
|
| 34 |
|
| 35 |
const MessageItem = ({
|
|
@@ -38,6 +39,7 @@ const MessageItem = ({
|
|
| 38 |
loading = false,
|
| 39 |
avatar = '',
|
| 40 |
clickDocumentButton,
|
|
|
|
| 41 |
}: IProps) => {
|
| 42 |
const isAssistant = item.role === MessageType.Assistant;
|
| 43 |
const isUser = item.role === MessageType.User;
|
|
@@ -112,13 +114,18 @@ const MessageItem = ({
|
|
| 112 |
<Flex vertical gap={8} flex={1}>
|
| 113 |
<Space>
|
| 114 |
{isAssistant ? (
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
|
|
|
|
|
|
| 120 |
) : (
|
| 121 |
-
<UserGroupButton
|
|
|
|
|
|
|
|
|
|
| 122 |
)}
|
| 123 |
|
| 124 |
{/* <b>{isAssistant ? '' : nickname}</b> */}
|
|
|
|
| 30 |
nickname?: string;
|
| 31 |
avatar?: string;
|
| 32 |
clickDocumentButton?: (documentId: string, chunk: IChunk) => void;
|
| 33 |
+
index: number;
|
| 34 |
}
|
| 35 |
|
| 36 |
const MessageItem = ({
|
|
|
|
| 39 |
loading = false,
|
| 40 |
avatar = '',
|
| 41 |
clickDocumentButton,
|
| 42 |
+
index,
|
| 43 |
}: IProps) => {
|
| 44 |
const isAssistant = item.role === MessageType.Assistant;
|
| 45 |
const isUser = item.role === MessageType.User;
|
|
|
|
| 114 |
<Flex vertical gap={8} flex={1}>
|
| 115 |
<Space>
|
| 116 |
{isAssistant ? (
|
| 117 |
+
index !== 0 && (
|
| 118 |
+
<AssistantGroupButton
|
| 119 |
+
messageId={item.id}
|
| 120 |
+
content={item.content}
|
| 121 |
+
prompt={item.prompt}
|
| 122 |
+
></AssistantGroupButton>
|
| 123 |
+
)
|
| 124 |
) : (
|
| 125 |
+
<UserGroupButton
|
| 126 |
+
content={item.content}
|
| 127 |
+
messageId={item.id}
|
| 128 |
+
></UserGroupButton>
|
| 129 |
)}
|
| 130 |
|
| 131 |
{/* <b>{isAssistant ? '' : nickname}</b> */}
|
web/src/hooks/chat-hooks.ts
CHANGED
|
@@ -14,9 +14,19 @@ import { buildMessageUuid, isConversationIdExist } from '@/utils/chat';
|
|
| 14 |
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
| 15 |
import { message } from 'antd';
|
| 16 |
import dayjs, { Dayjs } from 'dayjs';
|
|
|
|
| 17 |
import { useCallback, useMemo, useState } from 'react';
|
| 18 |
import { useSearchParams } from 'umi';
|
| 19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
//#region logic
|
| 21 |
|
| 22 |
export const useClickDialogCard = () => {
|
|
@@ -215,11 +225,7 @@ export const useFetchNextConversation = () => {
|
|
| 215 |
// }
|
| 216 |
const conversation = data?.data ?? {};
|
| 217 |
|
| 218 |
-
const messageList =
|
| 219 |
-
conversation?.message?.map((x: Message | IMessage) => ({
|
| 220 |
-
...x,
|
| 221 |
-
id: buildMessageUuid(x),
|
| 222 |
-
})) ?? [];
|
| 223 |
|
| 224 |
return { ...conversation, message: messageList };
|
| 225 |
}
|
|
@@ -294,7 +300,6 @@ export const useRemoveNextConversation = () => {
|
|
| 294 |
};
|
| 295 |
|
| 296 |
export const useDeleteMessage = () => {
|
| 297 |
-
// const queryClient = useQueryClient();
|
| 298 |
const { conversationId } = useGetChatSearchParams();
|
| 299 |
|
| 300 |
const {
|
|
@@ -308,9 +313,7 @@ export const useDeleteMessage = () => {
|
|
| 308 |
messageId,
|
| 309 |
conversationId,
|
| 310 |
});
|
| 311 |
-
|
| 312 |
-
// queryClient.invalidateQueries({ queryKey: ['fetchConversationList'] });
|
| 313 |
-
}
|
| 314 |
return data.retcode;
|
| 315 |
},
|
| 316 |
});
|
|
@@ -471,6 +474,10 @@ export const useFetchNextSharedConversation = () => {
|
|
| 471 |
conversationId,
|
| 472 |
);
|
| 473 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 474 |
return data;
|
| 475 |
},
|
| 476 |
});
|
|
|
|
| 14 |
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
| 15 |
import { message } from 'antd';
|
| 16 |
import dayjs, { Dayjs } from 'dayjs';
|
| 17 |
+
import { set } from 'lodash';
|
| 18 |
import { useCallback, useMemo, useState } from 'react';
|
| 19 |
import { useSearchParams } from 'umi';
|
| 20 |
|
| 21 |
+
const buildMessageListWithUuid = (messages?: Message[]) => {
|
| 22 |
+
return (
|
| 23 |
+
messages?.map((x: Message | IMessage) => ({
|
| 24 |
+
...x,
|
| 25 |
+
id: buildMessageUuid(x),
|
| 26 |
+
})) ?? []
|
| 27 |
+
);
|
| 28 |
+
};
|
| 29 |
+
|
| 30 |
//#region logic
|
| 31 |
|
| 32 |
export const useClickDialogCard = () => {
|
|
|
|
| 225 |
// }
|
| 226 |
const conversation = data?.data ?? {};
|
| 227 |
|
| 228 |
+
const messageList = buildMessageListWithUuid(conversation?.message);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
|
| 230 |
return { ...conversation, message: messageList };
|
| 231 |
}
|
|
|
|
| 300 |
};
|
| 301 |
|
| 302 |
export const useDeleteMessage = () => {
|
|
|
|
| 303 |
const { conversationId } = useGetChatSearchParams();
|
| 304 |
|
| 305 |
const {
|
|
|
|
| 313 |
messageId,
|
| 314 |
conversationId,
|
| 315 |
});
|
| 316 |
+
|
|
|
|
|
|
|
| 317 |
return data.retcode;
|
| 318 |
},
|
| 319 |
});
|
|
|
|
| 474 |
conversationId,
|
| 475 |
);
|
| 476 |
|
| 477 |
+
const messageList = buildMessageListWithUuid(data?.data?.message);
|
| 478 |
+
|
| 479 |
+
set(data, 'data.message', messageList);
|
| 480 |
+
|
| 481 |
return data;
|
| 482 |
},
|
| 483 |
});
|
web/src/pages/chat/chat-container/index.tsx
CHANGED
|
@@ -68,6 +68,7 @@ const ChatContainer = () => {
|
|
| 68 |
avatar={userInfo.avatar}
|
| 69 |
reference={buildMessageItemReference(conversation, message)}
|
| 70 |
clickDocumentButton={clickDocumentButton}
|
|
|
|
| 71 |
></MessageItem>
|
| 72 |
);
|
| 73 |
})}
|
|
|
|
| 68 |
avatar={userInfo.avatar}
|
| 69 |
reference={buildMessageItemReference(conversation, message)}
|
| 70 |
clickDocumentButton={clickDocumentButton}
|
| 71 |
+
index={i}
|
| 72 |
></MessageItem>
|
| 73 |
);
|
| 74 |
})}
|
web/src/pages/chat/hooks.ts
CHANGED
|
@@ -26,9 +26,9 @@ import {
|
|
| 26 |
} from '@/interfaces/database/chat';
|
| 27 |
import { IChunk } from '@/interfaces/database/knowledge';
|
| 28 |
import { getFileExtension } from '@/utils';
|
|
|
|
| 29 |
import { useMutationState } from '@tanstack/react-query';
|
| 30 |
import { get } from 'lodash';
|
| 31 |
-
import omit from 'lodash/omit';
|
| 32 |
import trim from 'lodash/trim';
|
| 33 |
import {
|
| 34 |
ChangeEventHandler,
|
|
@@ -252,23 +252,22 @@ export const useSelectCurrentConversation = () => {
|
|
| 252 |
const { data: dialog } = useFetchNextDialog();
|
| 253 |
const { conversationId, dialogId } = useGetChatSearchParams();
|
| 254 |
|
|
|
|
| 255 |
const addNewestConversation = useCallback(
|
| 256 |
-
(message:
|
| 257 |
setCurrentConversation((pre) => {
|
| 258 |
return {
|
| 259 |
...pre,
|
| 260 |
message: [
|
| 261 |
...pre.message,
|
| 262 |
{
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
doc_ids: message.doc_ids,
|
| 266 |
-
id: uuid(),
|
| 267 |
} as IMessage,
|
| 268 |
{
|
| 269 |
role: MessageType.Assistant,
|
| 270 |
content: answer,
|
| 271 |
-
id:
|
| 272 |
reference: {},
|
| 273 |
} as IMessage,
|
| 274 |
],
|
|
@@ -278,6 +277,7 @@ export const useSelectCurrentConversation = () => {
|
|
| 278 |
[],
|
| 279 |
);
|
| 280 |
|
|
|
|
| 281 |
const addNewestAnswer = useCallback((answer: IAnswer) => {
|
| 282 |
setCurrentConversation((pre) => {
|
| 283 |
const latestMessage = pre.message?.at(-1);
|
|
@@ -291,6 +291,11 @@ export const useSelectCurrentConversation = () => {
|
|
| 291 |
...latestMessage,
|
| 292 |
content: answer.answer,
|
| 293 |
reference: answer.reference,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 294 |
} as IMessage,
|
| 295 |
],
|
| 296 |
};
|
|
@@ -415,15 +420,13 @@ export const useSendMessage = (
|
|
| 415 |
const { send, answer, done, setDone } = useSendMessageWithSse();
|
| 416 |
|
| 417 |
const sendMessage = useCallback(
|
| 418 |
-
async (message:
|
| 419 |
const res = await send({
|
| 420 |
conversation_id: id ?? conversationId,
|
| 421 |
messages: [
|
| 422 |
-
...(conversation?.message ?? [])
|
| 423 |
{
|
| 424 |
-
|
| 425 |
-
role: MessageType.User,
|
| 426 |
-
content: message,
|
| 427 |
doc_ids: documentIds,
|
| 428 |
},
|
| 429 |
],
|
|
@@ -431,7 +434,7 @@ export const useSendMessage = (
|
|
| 431 |
|
| 432 |
if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) {
|
| 433 |
// cancel loading
|
| 434 |
-
setValue(message);
|
| 435 |
console.info('removeLatestMessage111');
|
| 436 |
removeLatestMessage();
|
| 437 |
} else {
|
|
@@ -456,11 +459,11 @@ export const useSendMessage = (
|
|
| 456 |
);
|
| 457 |
|
| 458 |
const handleSendMessage = useCallback(
|
| 459 |
-
async (message:
|
| 460 |
if (conversationId !== '') {
|
| 461 |
sendMessage(message, documentIds);
|
| 462 |
} else {
|
| 463 |
-
const data = await setConversation(message);
|
| 464 |
if (data.retcode === 0) {
|
| 465 |
const id = data.data.id;
|
| 466 |
sendMessage(message, documentIds, id);
|
|
@@ -487,11 +490,20 @@ export const useSendMessage = (
|
|
| 487 |
const handlePressEnter = useCallback(
|
| 488 |
(documentIds: string[]) => {
|
| 489 |
if (trim(value) === '') return;
|
|
|
|
| 490 |
|
| 491 |
-
addNewestConversation({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 492 |
if (done) {
|
| 493 |
setValue('');
|
| 494 |
-
handleSendMessage(
|
|
|
|
|
|
|
|
|
|
| 495 |
}
|
| 496 |
},
|
| 497 |
[addNewestConversation, handleSendMessage, done, setValue, value],
|
|
|
|
| 26 |
} from '@/interfaces/database/chat';
|
| 27 |
import { IChunk } from '@/interfaces/database/knowledge';
|
| 28 |
import { getFileExtension } from '@/utils';
|
| 29 |
+
import { buildMessageUuid } from '@/utils/chat';
|
| 30 |
import { useMutationState } from '@tanstack/react-query';
|
| 31 |
import { get } from 'lodash';
|
|
|
|
| 32 |
import trim from 'lodash/trim';
|
| 33 |
import {
|
| 34 |
ChangeEventHandler,
|
|
|
|
| 252 |
const { data: dialog } = useFetchNextDialog();
|
| 253 |
const { conversationId, dialogId } = useGetChatSearchParams();
|
| 254 |
|
| 255 |
+
// Show the entered message in the conversation immediately after sending the message
|
| 256 |
const addNewestConversation = useCallback(
|
| 257 |
+
(message: Message, answer: string = '') => {
|
| 258 |
setCurrentConversation((pre) => {
|
| 259 |
return {
|
| 260 |
...pre,
|
| 261 |
message: [
|
| 262 |
...pre.message,
|
| 263 |
{
|
| 264 |
+
...message,
|
| 265 |
+
id: buildMessageUuid(message),
|
|
|
|
|
|
|
| 266 |
} as IMessage,
|
| 267 |
{
|
| 268 |
role: MessageType.Assistant,
|
| 269 |
content: answer,
|
| 270 |
+
id: buildMessageUuid({ ...message, role: MessageType.Assistant }),
|
| 271 |
reference: {},
|
| 272 |
} as IMessage,
|
| 273 |
],
|
|
|
|
| 277 |
[],
|
| 278 |
);
|
| 279 |
|
| 280 |
+
// Add the streaming message to the last item in the message list
|
| 281 |
const addNewestAnswer = useCallback((answer: IAnswer) => {
|
| 282 |
setCurrentConversation((pre) => {
|
| 283 |
const latestMessage = pre.message?.at(-1);
|
|
|
|
| 291 |
...latestMessage,
|
| 292 |
content: answer.answer,
|
| 293 |
reference: answer.reference,
|
| 294 |
+
id: buildMessageUuid({
|
| 295 |
+
id: answer.id,
|
| 296 |
+
role: MessageType.Assistant,
|
| 297 |
+
}),
|
| 298 |
+
prompt: answer.prompt,
|
| 299 |
} as IMessage,
|
| 300 |
],
|
| 301 |
};
|
|
|
|
| 420 |
const { send, answer, done, setDone } = useSendMessageWithSse();
|
| 421 |
|
| 422 |
const sendMessage = useCallback(
|
| 423 |
+
async (message: Message, documentIds: string[], id?: string) => {
|
| 424 |
const res = await send({
|
| 425 |
conversation_id: id ?? conversationId,
|
| 426 |
messages: [
|
| 427 |
+
...(conversation?.message ?? []),
|
| 428 |
{
|
| 429 |
+
...message,
|
|
|
|
|
|
|
| 430 |
doc_ids: documentIds,
|
| 431 |
},
|
| 432 |
],
|
|
|
|
| 434 |
|
| 435 |
if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) {
|
| 436 |
// cancel loading
|
| 437 |
+
setValue(message.content);
|
| 438 |
console.info('removeLatestMessage111');
|
| 439 |
removeLatestMessage();
|
| 440 |
} else {
|
|
|
|
| 459 |
);
|
| 460 |
|
| 461 |
const handleSendMessage = useCallback(
|
| 462 |
+
async (message: Message, documentIds: string[]) => {
|
| 463 |
if (conversationId !== '') {
|
| 464 |
sendMessage(message, documentIds);
|
| 465 |
} else {
|
| 466 |
+
const data = await setConversation(message.content);
|
| 467 |
if (data.retcode === 0) {
|
| 468 |
const id = data.data.id;
|
| 469 |
sendMessage(message, documentIds, id);
|
|
|
|
| 490 |
const handlePressEnter = useCallback(
|
| 491 |
(documentIds: string[]) => {
|
| 492 |
if (trim(value) === '') return;
|
| 493 |
+
const id = uuid();
|
| 494 |
|
| 495 |
+
addNewestConversation({
|
| 496 |
+
content: value,
|
| 497 |
+
doc_ids: documentIds,
|
| 498 |
+
id,
|
| 499 |
+
role: MessageType.User,
|
| 500 |
+
});
|
| 501 |
if (done) {
|
| 502 |
setValue('');
|
| 503 |
+
handleSendMessage(
|
| 504 |
+
{ id, content: value.trim(), role: MessageType.User },
|
| 505 |
+
documentIds,
|
| 506 |
+
);
|
| 507 |
}
|
| 508 |
},
|
| 509 |
[addNewestConversation, handleSendMessage, done, setValue, value],
|
web/src/pages/chat/markdown-content/index.tsx
CHANGED
|
@@ -134,8 +134,8 @@ const MarkdownContent = ({
|
|
| 134 |
let replacedText = reactStringReplace(text, reg, (match, i) => {
|
| 135 |
const chunkIndex = getChunkIndex(match);
|
| 136 |
return (
|
| 137 |
-
<Popover content={getPopoverContent(chunkIndex)}>
|
| 138 |
-
<InfoCircleOutlined
|
| 139 |
</Popover>
|
| 140 |
);
|
| 141 |
});
|
|
|
|
| 134 |
let replacedText = reactStringReplace(text, reg, (match, i) => {
|
| 135 |
const chunkIndex = getChunkIndex(match);
|
| 136 |
return (
|
| 137 |
+
<Popover content={getPopoverContent(chunkIndex)} key={i}>
|
| 138 |
+
<InfoCircleOutlined className={styles.referenceIcon} />
|
| 139 |
</Popover>
|
| 140 |
);
|
| 141 |
});
|
web/src/pages/chat/share/large.tsx
CHANGED
|
@@ -58,6 +58,7 @@ const ChatContainer = () => {
|
|
| 58 |
sendLoading &&
|
| 59 |
conversation?.message.length - 1 === i
|
| 60 |
}
|
|
|
|
| 61 |
></MessageItem>
|
| 62 |
);
|
| 63 |
})}
|
|
|
|
| 58 |
sendLoading &&
|
| 59 |
conversation?.message.length - 1 === i
|
| 60 |
}
|
| 61 |
+
index={i}
|
| 62 |
></MessageItem>
|
| 63 |
);
|
| 64 |
})}
|
web/src/pages/chat/shared-hooks.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
| 6 |
import { useSendMessageWithSse } from '@/hooks/logic-hooks';
|
| 7 |
import { IAnswer, Message } from '@/interfaces/database/chat';
|
| 8 |
import api from '@/utils/api';
|
| 9 |
-
import
|
| 10 |
import trim from 'lodash/trim';
|
| 11 |
import {
|
| 12 |
Dispatch,
|
|
@@ -60,15 +60,13 @@ export const useSelectCurrentSharedConversation = (conversationId: string) => {
|
|
| 60 |
message: [
|
| 61 |
...(pre.message ?? []),
|
| 62 |
{
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
doc_ids: message.doc_ids,
|
| 66 |
-
id: uuid(),
|
| 67 |
} as IMessage,
|
| 68 |
{
|
| 69 |
role: MessageType.Assistant,
|
| 70 |
content: '',
|
| 71 |
-
id:
|
| 72 |
reference: {},
|
| 73 |
} as IMessage,
|
| 74 |
],
|
|
@@ -89,6 +87,11 @@ export const useSelectCurrentSharedConversation = (conversationId: string) => {
|
|
| 89 |
...latestMessage,
|
| 90 |
content: answer.answer,
|
| 91 |
reference: answer.reference,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
} as IMessage,
|
| 93 |
],
|
| 94 |
};
|
|
@@ -152,22 +155,16 @@ export const useSendSharedMessage = (
|
|
| 152 |
);
|
| 153 |
|
| 154 |
const sendMessage = useCallback(
|
| 155 |
-
async (message:
|
| 156 |
const res = await send({
|
| 157 |
conversation_id: id ?? conversationId,
|
| 158 |
quote: false,
|
| 159 |
-
messages: [
|
| 160 |
-
...(conversation?.message ?? []).map((x: IMessage) => omit(x, 'id')),
|
| 161 |
-
{
|
| 162 |
-
role: MessageType.User,
|
| 163 |
-
content: message,
|
| 164 |
-
},
|
| 165 |
-
],
|
| 166 |
});
|
| 167 |
|
| 168 |
if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) {
|
| 169 |
// cancel loading
|
| 170 |
-
setValue(message);
|
| 171 |
removeLatestMessage();
|
| 172 |
}
|
| 173 |
},
|
|
@@ -183,7 +180,7 @@ export const useSendSharedMessage = (
|
|
| 183 |
);
|
| 184 |
|
| 185 |
const handleSendMessage = useCallback(
|
| 186 |
-
async (message:
|
| 187 |
if (conversationId !== '') {
|
| 188 |
sendMessage(message);
|
| 189 |
} else {
|
|
@@ -206,10 +203,20 @@ export const useSendSharedMessage = (
|
|
| 206 |
const handlePressEnter = useCallback(
|
| 207 |
(documentIds: string[]) => {
|
| 208 |
if (trim(value) === '') return;
|
|
|
|
| 209 |
if (done) {
|
| 210 |
setValue('');
|
| 211 |
-
addNewestConversation({
|
| 212 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 213 |
}
|
| 214 |
},
|
| 215 |
[addNewestConversation, done, handleSendMessage, setValue, value],
|
|
|
|
| 6 |
import { useSendMessageWithSse } from '@/hooks/logic-hooks';
|
| 7 |
import { IAnswer, Message } from '@/interfaces/database/chat';
|
| 8 |
import api from '@/utils/api';
|
| 9 |
+
import { buildMessageUuid } from '@/utils/chat';
|
| 10 |
import trim from 'lodash/trim';
|
| 11 |
import {
|
| 12 |
Dispatch,
|
|
|
|
| 60 |
message: [
|
| 61 |
...(pre.message ?? []),
|
| 62 |
{
|
| 63 |
+
...message,
|
| 64 |
+
id: buildMessageUuid(message),
|
|
|
|
|
|
|
| 65 |
} as IMessage,
|
| 66 |
{
|
| 67 |
role: MessageType.Assistant,
|
| 68 |
content: '',
|
| 69 |
+
id: buildMessageUuid({ ...message, role: MessageType.Assistant }),
|
| 70 |
reference: {},
|
| 71 |
} as IMessage,
|
| 72 |
],
|
|
|
|
| 87 |
...latestMessage,
|
| 88 |
content: answer.answer,
|
| 89 |
reference: answer.reference,
|
| 90 |
+
id: buildMessageUuid({
|
| 91 |
+
id: answer.id,
|
| 92 |
+
role: MessageType.Assistant,
|
| 93 |
+
}),
|
| 94 |
+
prompt: answer.prompt,
|
| 95 |
} as IMessage,
|
| 96 |
],
|
| 97 |
};
|
|
|
|
| 155 |
);
|
| 156 |
|
| 157 |
const sendMessage = useCallback(
|
| 158 |
+
async (message: Message, id?: string) => {
|
| 159 |
const res = await send({
|
| 160 |
conversation_id: id ?? conversationId,
|
| 161 |
quote: false,
|
| 162 |
+
messages: [...(conversation?.message ?? []), message],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
});
|
| 164 |
|
| 165 |
if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) {
|
| 166 |
// cancel loading
|
| 167 |
+
setValue(message.content);
|
| 168 |
removeLatestMessage();
|
| 169 |
}
|
| 170 |
},
|
|
|
|
| 180 |
);
|
| 181 |
|
| 182 |
const handleSendMessage = useCallback(
|
| 183 |
+
async (message: Message) => {
|
| 184 |
if (conversationId !== '') {
|
| 185 |
sendMessage(message);
|
| 186 |
} else {
|
|
|
|
| 203 |
const handlePressEnter = useCallback(
|
| 204 |
(documentIds: string[]) => {
|
| 205 |
if (trim(value) === '') return;
|
| 206 |
+
const id = uuid();
|
| 207 |
if (done) {
|
| 208 |
setValue('');
|
| 209 |
+
addNewestConversation({
|
| 210 |
+
content: value,
|
| 211 |
+
doc_ids: documentIds,
|
| 212 |
+
id,
|
| 213 |
+
role: MessageType.User,
|
| 214 |
+
});
|
| 215 |
+
handleSendMessage({
|
| 216 |
+
content: value.trim(),
|
| 217 |
+
id,
|
| 218 |
+
role: MessageType.User,
|
| 219 |
+
});
|
| 220 |
}
|
| 221 |
},
|
| 222 |
[addNewestConversation, done, handleSendMessage, setValue, value],
|
web/src/pages/flow/chat/box.tsx
CHANGED
|
@@ -57,6 +57,7 @@ const FlowChatBox = () => {
|
|
| 57 |
message,
|
| 58 |
)}
|
| 59 |
clickDocumentButton={clickDocumentButton}
|
|
|
|
| 60 |
></MessageItem>
|
| 61 |
);
|
| 62 |
})}
|
|
|
|
| 57 |
message,
|
| 58 |
)}
|
| 59 |
clickDocumentButton={clickDocumentButton}
|
| 60 |
+
index={i}
|
| 61 |
></MessageItem>
|
| 62 |
);
|
| 63 |
})}
|
web/src/pages/flow/chat/hooks.ts
CHANGED
|
@@ -5,10 +5,12 @@ import {
|
|
| 5 |
useScrollToBottom,
|
| 6 |
useSendMessageWithSse,
|
| 7 |
} from '@/hooks/logic-hooks';
|
| 8 |
-
import { IAnswer } from '@/interfaces/database/chat';
|
| 9 |
import { IMessage } from '@/pages/chat/interface';
|
| 10 |
import api from '@/utils/api';
|
|
|
|
| 11 |
import { message } from 'antd';
|
|
|
|
| 12 |
import { useCallback, useEffect, useState } from 'react';
|
| 13 |
import { useParams } from 'umi';
|
| 14 |
import { v4 as uuid } from 'uuid';
|
|
@@ -27,19 +29,18 @@ export const useSelectCurrentMessages = () => {
|
|
| 27 |
const ref = useScrollToBottom(currentMessages);
|
| 28 |
|
| 29 |
const addNewestQuestion = useCallback(
|
| 30 |
-
(message:
|
| 31 |
setCurrentMessages((pre) => {
|
| 32 |
return [
|
| 33 |
...pre,
|
| 34 |
{
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
id: uuid(),
|
| 38 |
},
|
| 39 |
{
|
| 40 |
role: MessageType.Assistant,
|
| 41 |
content: answer,
|
| 42 |
-
id:
|
| 43 |
},
|
| 44 |
];
|
| 45 |
});
|
|
@@ -52,10 +53,13 @@ export const useSelectCurrentMessages = () => {
|
|
| 52 |
return [
|
| 53 |
...pre.slice(0, -1),
|
| 54 |
{
|
| 55 |
-
id: uuid(),
|
| 56 |
role: MessageType.Assistant,
|
| 57 |
content: answer.answer,
|
| 58 |
reference: answer.reference,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
},
|
| 60 |
];
|
| 61 |
});
|
|
@@ -88,7 +92,7 @@ export const useSelectCurrentMessages = () => {
|
|
| 88 |
};
|
| 89 |
|
| 90 |
export const useSendMessage = (
|
| 91 |
-
addNewestQuestion: (message:
|
| 92 |
removeLatestMessage: () => void,
|
| 93 |
addNewestAnswer: (answer: IAnswer) => void,
|
| 94 |
) => {
|
|
@@ -99,12 +103,13 @@ export const useSendMessage = (
|
|
| 99 |
const { send, answer, done } = useSendMessageWithSse(api.runCanvas);
|
| 100 |
|
| 101 |
const sendMessage = useCallback(
|
| 102 |
-
async (message:
|
| 103 |
const params: Record<string, unknown> = {
|
| 104 |
id: flowId,
|
| 105 |
};
|
| 106 |
-
if (message) {
|
| 107 |
-
params.message = message;
|
|
|
|
| 108 |
}
|
| 109 |
const res = await send(params);
|
| 110 |
|
|
@@ -112,7 +117,7 @@ export const useSendMessage = (
|
|
| 112 |
antMessage.error(res?.data?.retmsg);
|
| 113 |
|
| 114 |
// cancel loading
|
| 115 |
-
setValue(message);
|
| 116 |
removeLatestMessage();
|
| 117 |
} else {
|
| 118 |
refetch(); // pull the message list after sending the message successfully
|
|
@@ -122,7 +127,7 @@ export const useSendMessage = (
|
|
| 122 |
);
|
| 123 |
|
| 124 |
const handleSendMessage = useCallback(
|
| 125 |
-
async (message:
|
| 126 |
sendMessage(message);
|
| 127 |
},
|
| 128 |
[sendMessage],
|
|
@@ -135,11 +140,17 @@ export const useSendMessage = (
|
|
| 135 |
}, [answer, addNewestAnswer]);
|
| 136 |
|
| 137 |
const handlePressEnter = useCallback(() => {
|
|
|
|
|
|
|
| 138 |
if (done) {
|
| 139 |
setValue('');
|
| 140 |
-
handleSendMessage(value.trim());
|
| 141 |
}
|
| 142 |
-
addNewestQuestion(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
}, [addNewestQuestion, handleSendMessage, done, setValue, value]);
|
| 144 |
|
| 145 |
return {
|
|
|
|
| 5 |
useScrollToBottom,
|
| 6 |
useSendMessageWithSse,
|
| 7 |
} from '@/hooks/logic-hooks';
|
| 8 |
+
import { IAnswer, Message } from '@/interfaces/database/chat';
|
| 9 |
import { IMessage } from '@/pages/chat/interface';
|
| 10 |
import api from '@/utils/api';
|
| 11 |
+
import { buildMessageUuid } from '@/utils/chat';
|
| 12 |
import { message } from 'antd';
|
| 13 |
+
import trim from 'lodash/trim';
|
| 14 |
import { useCallback, useEffect, useState } from 'react';
|
| 15 |
import { useParams } from 'umi';
|
| 16 |
import { v4 as uuid } from 'uuid';
|
|
|
|
| 29 |
const ref = useScrollToBottom(currentMessages);
|
| 30 |
|
| 31 |
const addNewestQuestion = useCallback(
|
| 32 |
+
(message: Message, answer: string = '') => {
|
| 33 |
setCurrentMessages((pre) => {
|
| 34 |
return [
|
| 35 |
...pre,
|
| 36 |
{
|
| 37 |
+
...message,
|
| 38 |
+
id: buildMessageUuid(message),
|
|
|
|
| 39 |
},
|
| 40 |
{
|
| 41 |
role: MessageType.Assistant,
|
| 42 |
content: answer,
|
| 43 |
+
id: buildMessageUuid({ ...message, role: MessageType.Assistant }),
|
| 44 |
},
|
| 45 |
];
|
| 46 |
});
|
|
|
|
| 53 |
return [
|
| 54 |
...pre.slice(0, -1),
|
| 55 |
{
|
|
|
|
| 56 |
role: MessageType.Assistant,
|
| 57 |
content: answer.answer,
|
| 58 |
reference: answer.reference,
|
| 59 |
+
id: buildMessageUuid({
|
| 60 |
+
id: answer.id,
|
| 61 |
+
role: MessageType.Assistant,
|
| 62 |
+
}),
|
| 63 |
},
|
| 64 |
];
|
| 65 |
});
|
|
|
|
| 92 |
};
|
| 93 |
|
| 94 |
export const useSendMessage = (
|
| 95 |
+
addNewestQuestion: (message: Message, answer?: string) => void,
|
| 96 |
removeLatestMessage: () => void,
|
| 97 |
addNewestAnswer: (answer: IAnswer) => void,
|
| 98 |
) => {
|
|
|
|
| 103 |
const { send, answer, done } = useSendMessageWithSse(api.runCanvas);
|
| 104 |
|
| 105 |
const sendMessage = useCallback(
|
| 106 |
+
async (message: Message) => {
|
| 107 |
const params: Record<string, unknown> = {
|
| 108 |
id: flowId,
|
| 109 |
};
|
| 110 |
+
if (message.content) {
|
| 111 |
+
params.message = message.content;
|
| 112 |
+
params.message_id = message.id;
|
| 113 |
}
|
| 114 |
const res = await send(params);
|
| 115 |
|
|
|
|
| 117 |
antMessage.error(res?.data?.retmsg);
|
| 118 |
|
| 119 |
// cancel loading
|
| 120 |
+
setValue(message.content);
|
| 121 |
removeLatestMessage();
|
| 122 |
} else {
|
| 123 |
refetch(); // pull the message list after sending the message successfully
|
|
|
|
| 127 |
);
|
| 128 |
|
| 129 |
const handleSendMessage = useCallback(
|
| 130 |
+
async (message: Message) => {
|
| 131 |
sendMessage(message);
|
| 132 |
},
|
| 133 |
[sendMessage],
|
|
|
|
| 140 |
}, [answer, addNewestAnswer]);
|
| 141 |
|
| 142 |
const handlePressEnter = useCallback(() => {
|
| 143 |
+
if (trim(value) === '') return;
|
| 144 |
+
const id = uuid();
|
| 145 |
if (done) {
|
| 146 |
setValue('');
|
| 147 |
+
handleSendMessage({ id, content: value.trim(), role: MessageType.User });
|
| 148 |
}
|
| 149 |
+
addNewestQuestion({
|
| 150 |
+
content: value,
|
| 151 |
+
id,
|
| 152 |
+
role: MessageType.User,
|
| 153 |
+
});
|
| 154 |
}, [addNewestQuestion, handleSendMessage, done, setValue, value]);
|
| 155 |
|
| 156 |
return {
|
web/src/utils/chat.ts
CHANGED
|
@@ -7,7 +7,7 @@ export const isConversationIdExist = (conversationId: string) => {
|
|
| 7 |
return conversationId !== EmptyConversationId && conversationId !== '';
|
| 8 |
};
|
| 9 |
|
| 10 |
-
export const buildMessageUuid = (message: Message | IMessage) => {
|
| 11 |
if ('id' in message && message.id) {
|
| 12 |
return message.role === MessageType.User
|
| 13 |
? `${MessageType.User}_${message.id}`
|
|
|
|
| 7 |
return conversationId !== EmptyConversationId && conversationId !== '';
|
| 8 |
};
|
| 9 |
|
| 10 |
+
export const buildMessageUuid = (message: Partial<Message | IMessage>) => {
|
| 11 |
if ('id' in message && message.id) {
|
| 12 |
return message.role === MessageType.User
|
| 13 |
? `${MessageType.User}_${message.id}`
|