balibabu
commited on
Commit
·
d6d922d
1
Parent(s):
b67985b
feat: Stream the greetings of the agent dialogue #3355 (#3490)
Browse files### What problem does this PR solve?
feat: Stream the greetings of the agent dialogue #3355
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- web/src/pages/flow/chat/hooks.ts +15 -162
- web/src/pages/flow/hooks.tsx +2 -14
web/src/pages/flow/chat/hooks.ts
CHANGED
@@ -2,104 +2,25 @@ import { MessageType } from '@/constants/chat';
|
|
2 |
import { useFetchFlow } from '@/hooks/flow-hooks';
|
3 |
import {
|
4 |
useHandleMessageInputChange,
|
5 |
-
useScrollToBottom,
|
6 |
useSelectDerivedMessages,
|
7 |
useSendMessageWithSse,
|
8 |
} from '@/hooks/logic-hooks';
|
9 |
-
import {
|
10 |
-
import { IMessage } from '@/pages/chat/interface';
|
11 |
import api from '@/utils/api';
|
12 |
-
import { buildMessageUuid } from '@/utils/chat';
|
13 |
import { message } from 'antd';
|
14 |
import trim from 'lodash/trim';
|
15 |
-
import { useCallback, useEffect
|
16 |
import { useParams } from 'umi';
|
17 |
import { v4 as uuid } from 'uuid';
|
18 |
import { receiveMessageError } from '../utils';
|
19 |
|
20 |
const antMessage = message;
|
21 |
|
22 |
-
export const useSelectCurrentMessages = () => {
|
23 |
-
const { id: id } = useParams();
|
24 |
-
const [currentMessages, setCurrentMessages] = useState<IMessage[]>([]);
|
25 |
-
|
26 |
-
const { data: flowDetail, loading } = useFetchFlow();
|
27 |
-
const messages = flowDetail.dsl.messages;
|
28 |
-
const reference = flowDetail.dsl.reference;
|
29 |
-
|
30 |
-
const ref = useScrollToBottom(currentMessages);
|
31 |
-
|
32 |
-
const addNewestQuestion = useCallback(
|
33 |
-
(message: Message, answer: string = '') => {
|
34 |
-
setCurrentMessages((pre) => {
|
35 |
-
return [
|
36 |
-
...pre,
|
37 |
-
{
|
38 |
-
...message,
|
39 |
-
id: buildMessageUuid(message),
|
40 |
-
},
|
41 |
-
{
|
42 |
-
role: MessageType.Assistant,
|
43 |
-
content: answer,
|
44 |
-
id: buildMessageUuid({ ...message, role: MessageType.Assistant }),
|
45 |
-
},
|
46 |
-
];
|
47 |
-
});
|
48 |
-
},
|
49 |
-
[],
|
50 |
-
);
|
51 |
-
|
52 |
-
const addNewestAnswer = useCallback((answer: IAnswer) => {
|
53 |
-
setCurrentMessages((pre) => {
|
54 |
-
return [
|
55 |
-
...pre.slice(0, -1),
|
56 |
-
{
|
57 |
-
role: MessageType.Assistant,
|
58 |
-
content: answer.answer,
|
59 |
-
reference: answer.reference,
|
60 |
-
id: buildMessageUuid({
|
61 |
-
id: answer.id,
|
62 |
-
role: MessageType.Assistant,
|
63 |
-
}),
|
64 |
-
},
|
65 |
-
];
|
66 |
-
});
|
67 |
-
}, []);
|
68 |
-
|
69 |
-
const removeLatestMessage = useCallback(() => {
|
70 |
-
setCurrentMessages((pre) => {
|
71 |
-
const nextMessages = pre?.slice(0, -2) ?? [];
|
72 |
-
return nextMessages;
|
73 |
-
return [...pre, ...nextMessages];
|
74 |
-
});
|
75 |
-
}, []);
|
76 |
-
|
77 |
-
useEffect(() => {
|
78 |
-
if (id) {
|
79 |
-
const nextMessages = messages.map((x) => ({ ...x, id: uuid() }));
|
80 |
-
setCurrentMessages(nextMessages);
|
81 |
-
}
|
82 |
-
}, [messages, id]);
|
83 |
-
|
84 |
-
return {
|
85 |
-
currentMessages,
|
86 |
-
reference,
|
87 |
-
addNewestQuestion,
|
88 |
-
removeLatestMessage,
|
89 |
-
addNewestAnswer,
|
90 |
-
ref,
|
91 |
-
loading,
|
92 |
-
};
|
93 |
-
};
|
94 |
-
|
95 |
export const useSelectNextMessages = () => {
|
96 |
-
const { id: id } = useParams();
|
97 |
const { data: flowDetail, loading } = useFetchFlow();
|
98 |
-
const messages = flowDetail.dsl.messages;
|
99 |
const reference = flowDetail.dsl.reference;
|
100 |
const {
|
101 |
derivedMessages,
|
102 |
-
setDerivedMessages,
|
103 |
ref,
|
104 |
addNewestQuestion,
|
105 |
addNewestAnswer,
|
@@ -108,13 +29,6 @@ export const useSelectNextMessages = () => {
|
|
108 |
removeMessagesAfterCurrentMessage,
|
109 |
} = useSelectDerivedMessages();
|
110 |
|
111 |
-
useEffect(() => {
|
112 |
-
if (id) {
|
113 |
-
const nextMessages = messages.map((x) => ({ ...x, id: uuid() }));
|
114 |
-
setDerivedMessages(nextMessages);
|
115 |
-
}
|
116 |
-
}, [messages, id, setDerivedMessages]);
|
117 |
-
|
118 |
return {
|
119 |
reference,
|
120 |
loading,
|
@@ -128,76 +42,6 @@ export const useSelectNextMessages = () => {
|
|
128 |
};
|
129 |
};
|
130 |
|
131 |
-
export const useSendMessage = (
|
132 |
-
addNewestQuestion: (message: Message, answer?: string) => void,
|
133 |
-
removeLatestMessage: () => void,
|
134 |
-
addNewestAnswer: (answer: IAnswer) => void,
|
135 |
-
) => {
|
136 |
-
const { id: flowId } = useParams();
|
137 |
-
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
|
138 |
-
const { refetch } = useFetchFlow();
|
139 |
-
|
140 |
-
const { send, answer, done } = useSendMessageWithSse(api.runCanvas);
|
141 |
-
|
142 |
-
const sendMessage = useCallback(
|
143 |
-
async (message: Message) => {
|
144 |
-
const params: Record<string, unknown> = {
|
145 |
-
id: flowId,
|
146 |
-
};
|
147 |
-
if (message.content) {
|
148 |
-
params.message = message.content;
|
149 |
-
params.message_id = message.id;
|
150 |
-
}
|
151 |
-
const res = await send(params);
|
152 |
-
|
153 |
-
if (receiveMessageError(res)) {
|
154 |
-
antMessage.error(res?.data?.message);
|
155 |
-
|
156 |
-
// cancel loading
|
157 |
-
setValue(message.content);
|
158 |
-
removeLatestMessage();
|
159 |
-
} else {
|
160 |
-
refetch(); // pull the message list after sending the message successfully
|
161 |
-
}
|
162 |
-
},
|
163 |
-
[flowId, removeLatestMessage, setValue, send, refetch],
|
164 |
-
);
|
165 |
-
|
166 |
-
const handleSendMessage = useCallback(
|
167 |
-
async (message: Message) => {
|
168 |
-
sendMessage(message);
|
169 |
-
},
|
170 |
-
[sendMessage],
|
171 |
-
);
|
172 |
-
|
173 |
-
useEffect(() => {
|
174 |
-
if (answer.answer) {
|
175 |
-
addNewestAnswer(answer);
|
176 |
-
}
|
177 |
-
}, [answer, addNewestAnswer]);
|
178 |
-
|
179 |
-
const handlePressEnter = useCallback(() => {
|
180 |
-
if (trim(value) === '') return;
|
181 |
-
const id = uuid();
|
182 |
-
if (done) {
|
183 |
-
setValue('');
|
184 |
-
handleSendMessage({ id, content: value.trim(), role: MessageType.User });
|
185 |
-
}
|
186 |
-
addNewestQuestion({
|
187 |
-
content: value,
|
188 |
-
id,
|
189 |
-
role: MessageType.User,
|
190 |
-
});
|
191 |
-
}, [addNewestQuestion, handleSendMessage, done, setValue, value]);
|
192 |
-
|
193 |
-
return {
|
194 |
-
handlePressEnter,
|
195 |
-
handleInputChange,
|
196 |
-
value,
|
197 |
-
loading: !done,
|
198 |
-
};
|
199 |
-
};
|
200 |
-
|
201 |
export const useSendNextMessage = () => {
|
202 |
const {
|
203 |
reference,
|
@@ -211,7 +55,6 @@ export const useSendNextMessage = () => {
|
|
211 |
} = useSelectNextMessages();
|
212 |
const { id: flowId } = useParams();
|
213 |
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
|
214 |
-
const { refetch } = useFetchFlow();
|
215 |
|
216 |
const { send, answer, done } = useSendMessageWithSse(api.runCanvas);
|
217 |
|
@@ -232,11 +75,9 @@ export const useSendNextMessage = () => {
|
|
232 |
// cancel loading
|
233 |
setValue(message.content);
|
234 |
removeLatestMessage();
|
235 |
-
} else {
|
236 |
-
refetch(); // pull the message list after sending the message successfully
|
237 |
}
|
238 |
},
|
239 |
-
[flowId, removeLatestMessage, setValue, send
|
240 |
);
|
241 |
|
242 |
const handleSendMessage = useCallback(
|
@@ -266,6 +107,18 @@ export const useSendNextMessage = () => {
|
|
266 |
});
|
267 |
}, [addNewestQuestion, handleSendMessage, done, setValue, value]);
|
268 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
269 |
return {
|
270 |
handlePressEnter,
|
271 |
handleInputChange,
|
|
|
2 |
import { useFetchFlow } from '@/hooks/flow-hooks';
|
3 |
import {
|
4 |
useHandleMessageInputChange,
|
|
|
5 |
useSelectDerivedMessages,
|
6 |
useSendMessageWithSse,
|
7 |
} from '@/hooks/logic-hooks';
|
8 |
+
import { Message } from '@/interfaces/database/chat';
|
|
|
9 |
import api from '@/utils/api';
|
|
|
10 |
import { message } from 'antd';
|
11 |
import trim from 'lodash/trim';
|
12 |
+
import { useCallback, useEffect } from 'react';
|
13 |
import { useParams } from 'umi';
|
14 |
import { v4 as uuid } from 'uuid';
|
15 |
import { receiveMessageError } from '../utils';
|
16 |
|
17 |
const antMessage = message;
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
export const useSelectNextMessages = () => {
|
|
|
20 |
const { data: flowDetail, loading } = useFetchFlow();
|
|
|
21 |
const reference = flowDetail.dsl.reference;
|
22 |
const {
|
23 |
derivedMessages,
|
|
|
24 |
ref,
|
25 |
addNewestQuestion,
|
26 |
addNewestAnswer,
|
|
|
29 |
removeMessagesAfterCurrentMessage,
|
30 |
} = useSelectDerivedMessages();
|
31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
return {
|
33 |
reference,
|
34 |
loading,
|
|
|
42 |
};
|
43 |
};
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
export const useSendNextMessage = () => {
|
46 |
const {
|
47 |
reference,
|
|
|
55 |
} = useSelectNextMessages();
|
56 |
const { id: flowId } = useParams();
|
57 |
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
|
|
|
58 |
|
59 |
const { send, answer, done } = useSendMessageWithSse(api.runCanvas);
|
60 |
|
|
|
75 |
// cancel loading
|
76 |
setValue(message.content);
|
77 |
removeLatestMessage();
|
|
|
|
|
78 |
}
|
79 |
},
|
80 |
+
[flowId, removeLatestMessage, setValue, send],
|
81 |
);
|
82 |
|
83 |
const handleSendMessage = useCallback(
|
|
|
107 |
});
|
108 |
}, [addNewestQuestion, handleSendMessage, done, setValue, value]);
|
109 |
|
110 |
+
const fetchPrologue = useCallback(async () => {
|
111 |
+
// fetch prologue
|
112 |
+
const sendRet = await send({ id: flowId });
|
113 |
+
if (receiveMessageError(sendRet)) {
|
114 |
+
message.error(sendRet?.data?.message);
|
115 |
+
}
|
116 |
+
}, [flowId, send]);
|
117 |
+
|
118 |
+
useEffect(() => {
|
119 |
+
fetchPrologue();
|
120 |
+
}, [fetchPrologue]);
|
121 |
+
|
122 |
return {
|
123 |
handlePressEnter,
|
124 |
handleInputChange,
|
web/src/pages/flow/hooks.tsx
CHANGED
@@ -16,9 +16,8 @@ import {
|
|
16 |
ModelVariableType,
|
17 |
settledModelVariableMap,
|
18 |
} from '@/constants/knowledge';
|
19 |
-
import { useFetchModelId
|
20 |
import { Variable } from '@/interfaces/database/chat';
|
21 |
-
import api from '@/utils/api';
|
22 |
import { useDebounceEffect } from 'ahooks';
|
23 |
import { FormInstance, message } from 'antd';
|
24 |
import { DefaultOptionType } from 'antd/es/select';
|
@@ -78,7 +77,6 @@ import {
|
|
78 |
generateNodeNamesWithIncreasingIndex,
|
79 |
generateSwitchHandleText,
|
80 |
getNodeDragHandle,
|
81 |
-
receiveMessageError,
|
82 |
replaceIdWithText,
|
83 |
} from './utils';
|
84 |
|
@@ -448,11 +446,8 @@ export const useGetBeginNodeDataQuery = () => {
|
|
448 |
};
|
449 |
|
450 |
export const useSaveGraphBeforeOpeningDebugDrawer = (show: () => void) => {
|
451 |
-
const { id } = useParams();
|
452 |
const { saveGraph, loading } = useSaveGraph();
|
453 |
const { resetFlow } = useResetFlow();
|
454 |
-
const { refetch } = useFetchFlow();
|
455 |
-
const { send } = useSendMessageWithSse(api.runCanvas);
|
456 |
|
457 |
const handleRun = useCallback(
|
458 |
async (nextNodes?: Node[]) => {
|
@@ -463,17 +458,10 @@ export const useSaveGraphBeforeOpeningDebugDrawer = (show: () => void) => {
|
|
463 |
// After resetting, all previous messages will be cleared.
|
464 |
if (resetRet?.code === 0) {
|
465 |
show();
|
466 |
-
// fetch prologue
|
467 |
-
const sendRet = await send({ id });
|
468 |
-
if (receiveMessageError(sendRet)) {
|
469 |
-
message.error(sendRet?.data?.message);
|
470 |
-
} else {
|
471 |
-
refetch();
|
472 |
-
}
|
473 |
}
|
474 |
}
|
475 |
},
|
476 |
-
[saveGraph, resetFlow,
|
477 |
);
|
478 |
|
479 |
return { handleRun, loading };
|
|
|
16 |
ModelVariableType,
|
17 |
settledModelVariableMap,
|
18 |
} from '@/constants/knowledge';
|
19 |
+
import { useFetchModelId } from '@/hooks/logic-hooks';
|
20 |
import { Variable } from '@/interfaces/database/chat';
|
|
|
21 |
import { useDebounceEffect } from 'ahooks';
|
22 |
import { FormInstance, message } from 'antd';
|
23 |
import { DefaultOptionType } from 'antd/es/select';
|
|
|
77 |
generateNodeNamesWithIncreasingIndex,
|
78 |
generateSwitchHandleText,
|
79 |
getNodeDragHandle,
|
|
|
80 |
replaceIdWithText,
|
81 |
} from './utils';
|
82 |
|
|
|
446 |
};
|
447 |
|
448 |
export const useSaveGraphBeforeOpeningDebugDrawer = (show: () => void) => {
|
|
|
449 |
const { saveGraph, loading } = useSaveGraph();
|
450 |
const { resetFlow } = useResetFlow();
|
|
|
|
|
451 |
|
452 |
const handleRun = useCallback(
|
453 |
async (nextNodes?: Node[]) => {
|
|
|
458 |
// After resetting, all previous messages will be cleared.
|
459 |
if (resetRet?.code === 0) {
|
460 |
show();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
461 |
}
|
462 |
}
|
463 |
},
|
464 |
+
[saveGraph, resetFlow, show],
|
465 |
);
|
466 |
|
467 |
return { handleRun, loading };
|