Browse Source

fix: After sending the message for the first time, the returned content is not streamed out #2067 #1832 (#2191)

### What problem does this PR solve?

fix: After sending the message for the first time, the returned content
is not streamed out #2067 #1832

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
tags/v0.11.0
balibabu 1 year ago
parent
commit
c04686d426
No account linked to committer's email address
2 changed files with 13 additions and 127 deletions
  1. 2
    0
      web/src/hooks/logic-hooks.ts
  2. 11
    127
      web/src/pages/chat/hooks.ts

+ 2
- 0
web/src/hooks/logic-hooks.ts View File

} }
console.info('done?'); console.info('done?');
setDone(true); setDone(true);
setAnswer({} as IAnswer);
return { data: await res, response }; return { data: await res, response };
} catch (e) { } catch (e) {
setDone(true); setDone(true);
setAnswer({} as IAnswer);
console.warn(e); console.warn(e);
} }
}, },

+ 11
- 127
web/src/pages/chat/hooks.ts View File

}; };
}; };


export const useSendMessage = (
conversation: IClientConversation,
addNewestConversation: (message: Message, answer?: string) => void,
removeLatestMessage: () => void,
addNewestAnswer: (answer: IAnswer) => void,
removeMessagesAfterCurrentMessage: (messageId: string) => void,
) => {
const { setConversation } = useSetConversation();
const { conversationId } = useGetChatSearchParams();
const { handleInputChange, value, setValue } = useHandleMessageInputChange();

const { handleClickConversation } = useClickConversationCard();
const { send, answer, done, setDone } = useSendMessageWithSse();

const sendMessage = useCallback(
async ({
message,
currentConversationId,
messages,
}: {
message: Message;
currentConversationId?: string;
messages?: Message[];
}) => {
const res = await send({
conversation_id: currentConversationId ?? conversationId,
messages: [...(messages ?? conversation?.message ?? []), message],
});

if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) {
// cancel loading
setValue(message.content);
console.info('removeLatestMessage111');
removeLatestMessage();
} else {
if (currentConversationId) {
console.info('111');
// new conversation
handleClickConversation(currentConversationId);
} else {
console.info('222');
// fetchConversation(conversationId);
}
}
},
[
conversation?.message,
conversationId,
handleClickConversation,
removeLatestMessage,
setValue,
send,
],
);

const handleSendMessage = useCallback(
async (message: Message) => {
if (conversationId !== '') {
sendMessage({ message });
} else {
const data = await setConversation(message.content);
if (data.retcode === 0) {
const id = data.data.id;
sendMessage({ message, currentConversationId: id });
}
}
},
[conversationId, setConversation, sendMessage],
);

const { regenerateMessage } = useRegenerateMessage({
removeMessagesAfterCurrentMessage,
sendMessage,
messages: conversation.message,
});

useEffect(() => {
// #1289
if (answer.answer && answer?.conversationId === conversationId) {
addNewestAnswer(answer);
}
}, [answer, addNewestAnswer, conversationId]);

useEffect(() => {
// #1289 switch to another conversion window when the last conversion answer doesn't finish.
if (conversationId) {
setDone(true);
}
}, [setDone, conversationId]);

const handlePressEnter = useCallback(
(documentIds: string[]) => {
if (trim(value) === '') return;
const id = uuid();

addNewestConversation({
content: value,
doc_ids: documentIds,
id,
role: MessageType.User,
});
if (done) {
setValue('');
handleSendMessage({
id,
content: value.trim(),
role: MessageType.User,
doc_ids: documentIds,
});
}
},
[addNewestConversation, handleSendMessage, done, setValue, value],
);

return {
handlePressEnter,
handleInputChange,
value,
setValue,
regenerateMessage,
loading: !done,
};
};

export const useSendNextMessage = () => { export const useSendNextMessage = () => {
const { setConversation } = useSetConversation(); const { setConversation } = useSetConversation();
const { conversationId } = useGetChatSearchParams(); const { conversationId } = useGetChatSearchParams();
const data = await setConversation(message.content); const data = await setConversation(message.content);
if (data.retcode === 0) { if (data.retcode === 0) {
const id = data.data.id; const id = data.data.id;
sendMessage({ message, currentConversationId: id });
sendMessage({
message,
currentConversationId: id,
messages: data.data.message,
});
} }
} }
}, },


useEffect(() => { useEffect(() => {
// #1289 // #1289
if (answer.answer && answer?.conversationId === conversationId) {
if (
answer.answer &&
!done &&
(answer?.conversationId === conversationId || conversationId === '')
) {
addNewestAnswer(answer); addNewestAnswer(answer);
} }
}, [answer, addNewestAnswer, conversationId]);
}, [answer, addNewestAnswer, conversationId, done]);


useEffect(() => { useEffect(() => {
// #1289 switch to another conversion window when the last conversion answer doesn't finish. // #1289 switch to another conversion window when the last conversion answer doesn't finish.

Loading…
Cancel
Save