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 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 { IAnswer, Message } from '@/interfaces/database/chat';
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, useState } from 'react';
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, refetch],
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, useSendMessageWithSse } from '@/hooks/logic-hooks';
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, send, id, refetch, show],
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 };