2023-03-06 10:15:07 -05:00
|
|
|
import { SSE } from './sse';
|
2023-03-17 01:49:09 +08:00
|
|
|
import resetConvo from './resetConvo';
|
|
|
|
|
import { useSelector, useDispatch } from 'react-redux';
|
|
|
|
|
import { setNewConvo } from '~/store/convoSlice';
|
|
|
|
|
import { setMessages } from '~/store/messageSlice';
|
|
|
|
|
import { setSubmitState, setSubmission } from '~/store/submitSlice';
|
|
|
|
|
import { setText } from '~/store/textSlice';
|
2023-03-18 00:29:43 +08:00
|
|
|
import { setError } from '~/store/convoSlice';
|
2023-03-17 01:49:09 +08:00
|
|
|
|
|
|
|
|
const useMessageHandler = () => {
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const convo = useSelector((state) => state.convo);
|
|
|
|
|
const { initial } = useSelector((state) => state.models);
|
|
|
|
|
const { messages } = useSelector((state) => state.messages);
|
|
|
|
|
const { model, chatGptLabel, promptPrefix, isSubmitting } = useSelector((state) => state.submit);
|
|
|
|
|
const { text } = useSelector((state) => state.text);
|
|
|
|
|
const { latestMessage, error } = convo;
|
|
|
|
|
|
|
|
|
|
const ask = ({ text, parentMessageId=null, conversationId=null, messageId=null}, { isRegenerate=false }={}) => {
|
|
|
|
|
if (error) {
|
|
|
|
|
dispatch(setError(false));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!!isSubmitting || text === '') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// this is not a real messageId, it is used as placeholder before real messageId returned
|
|
|
|
|
text = text.trim();
|
|
|
|
|
const fakeMessageId = crypto.randomUUID();
|
|
|
|
|
const isCustomModel = model === 'chatgptCustom' || !initial[model];
|
|
|
|
|
const sender = model === 'chatgptCustom' ? chatGptLabel : model;
|
|
|
|
|
parentMessageId = parentMessageId || latestMessage?.messageId || '00000000-0000-0000-0000-000000000000';
|
|
|
|
|
let currentMessages = messages;
|
|
|
|
|
if (resetConvo(currentMessages, sender)) {
|
|
|
|
|
parentMessageId = '00000000-0000-0000-0000-000000000000';
|
|
|
|
|
conversationId = null;
|
|
|
|
|
dispatch(setNewConvo());
|
|
|
|
|
currentMessages = [];
|
|
|
|
|
}
|
|
|
|
|
const currentMsg = { sender: 'User', text, current: true, isCreatedByUser: true, parentMessageId, conversationId, messageId: fakeMessageId };
|
|
|
|
|
const initialResponse = { sender, text: '', parentMessageId: isRegenerate?messageId:fakeMessageId, messageId: (isRegenerate?messageId:fakeMessageId) + '_', submitting: true };
|
|
|
|
|
|
|
|
|
|
dispatch(setSubmitState(true));
|
|
|
|
|
if (isRegenerate) {
|
|
|
|
|
dispatch(setMessages([...currentMessages, initialResponse]));
|
|
|
|
|
} else {
|
|
|
|
|
dispatch(setMessages([...currentMessages, currentMsg, initialResponse]));
|
|
|
|
|
}
|
|
|
|
|
dispatch(setText(''));
|
|
|
|
|
|
|
|
|
|
const submission = {
|
|
|
|
|
convo,
|
|
|
|
|
isCustomModel,
|
|
|
|
|
message: {
|
|
|
|
|
...currentMsg,
|
|
|
|
|
model,
|
|
|
|
|
chatGptLabel,
|
|
|
|
|
promptPrefix,
|
|
|
|
|
overrideParentMessageId: isRegenerate?messageId:null
|
|
|
|
|
},
|
|
|
|
|
messages: currentMessages,
|
|
|
|
|
isRegenerate,
|
|
|
|
|
initialResponse,
|
|
|
|
|
sender,
|
|
|
|
|
};
|
|
|
|
|
console.log('User Input:', text);
|
|
|
|
|
dispatch(setSubmission(submission));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const regenerate = ({ parentMessageId }) => {
|
|
|
|
|
const parentMessage = messages?.find(element => element.messageId == parentMessageId);
|
|
|
|
|
|
|
|
|
|
if (parentMessage && parentMessage.isCreatedByUser)
|
|
|
|
|
ask({ ...parentMessage }, { isRegenerate: true })
|
|
|
|
|
else
|
|
|
|
|
console.error('Failed to regenerate the message: parentMessage not found or not created by user.', message);
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-17 03:13:42 +08:00
|
|
|
const stopGenerating = () => {
|
|
|
|
|
dispatch(setSubmission({}));
|
|
|
|
|
}
|
2023-03-17 01:49:09 +08:00
|
|
|
|
2023-03-17 03:13:42 +08:00
|
|
|
return { ask, regenerate, stopGenerating }
|
2023-03-17 01:49:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export { useMessageHandler };
|
2023-02-06 21:17:46 -05:00
|
|
|
|
2023-02-08 00:02:29 -05:00
|
|
|
export default function handleSubmit({
|
2023-02-13 21:15:28 -05:00
|
|
|
model,
|
2023-02-08 00:02:29 -05:00
|
|
|
text,
|
|
|
|
|
convo,
|
|
|
|
|
messageHandler,
|
|
|
|
|
convoHandler,
|
2023-03-03 15:52:06 -05:00
|
|
|
errorHandler,
|
|
|
|
|
chatGptLabel,
|
|
|
|
|
promptPrefix
|
2023-02-08 00:02:29 -05:00
|
|
|
}) {
|
2023-03-10 21:06:13 +08:00
|
|
|
const endpoint = `/api/ask`;
|
2023-03-03 15:52:06 -05:00
|
|
|
let payload = { model, text, chatGptLabel, promptPrefix };
|
2023-02-06 21:17:46 -05:00
|
|
|
if (convo.conversationId && convo.parentMessageId) {
|
|
|
|
|
payload = {
|
|
|
|
|
...payload,
|
|
|
|
|
conversationId: convo.conversationId,
|
|
|
|
|
parentMessageId: convo.parentMessageId
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-08 21:06:58 -05:00
|
|
|
const isBing = model === 'bingai' || model === 'sydney';
|
|
|
|
|
if (isBing && convo.conversationId) {
|
|
|
|
|
|
2023-02-20 21:52:08 -05:00
|
|
|
payload = {
|
|
|
|
|
...payload,
|
2023-03-08 21:06:58 -05:00
|
|
|
jailbreakConversationId: convo.jailbreakConversationId,
|
2023-02-20 21:52:08 -05:00
|
|
|
conversationId: convo.conversationId,
|
|
|
|
|
conversationSignature: convo.conversationSignature,
|
|
|
|
|
clientId: convo.clientId,
|
|
|
|
|
invocationId: convo.invocationId,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-08 21:06:58 -05:00
|
|
|
let server = endpoint;
|
|
|
|
|
server = model === 'bingai' ? server + '/bing' : server;
|
|
|
|
|
server = model === 'sydney' ? server + '/sydney' : server;
|
|
|
|
|
|
2023-02-15 12:29:56 -05:00
|
|
|
const events = new SSE(server, {
|
2023-02-06 21:17:46 -05:00
|
|
|
payload: JSON.stringify(payload),
|
|
|
|
|
headers: { 'Content-Type': 'application/json' }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
events.onopen = function () {
|
|
|
|
|
console.log('connection is opened');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
events.onmessage = function (e) {
|
|
|
|
|
const data = JSON.parse(e.data);
|
2023-02-23 16:32:08 -05:00
|
|
|
let text = data.text || data.response;
|
2023-02-21 21:30:56 -05:00
|
|
|
if (data.message) {
|
2023-03-11 18:39:46 -05:00
|
|
|
messageHandler(text, events);
|
2023-02-25 09:06:26 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data.final) {
|
2023-02-06 21:17:46 -05:00
|
|
|
convoHandler(data);
|
2023-02-25 09:06:26 -05:00
|
|
|
console.log('final', data);
|
2023-02-06 21:17:46 -05:00
|
|
|
} else {
|
2023-02-25 10:16:21 -05:00
|
|
|
// console.log('dataStream', data);
|
2023-02-06 21:17:46 -05:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
events.onerror = function (e) {
|
2023-02-08 09:15:47 -05:00
|
|
|
console.log('error in opening conn.');
|
2023-02-06 21:17:46 -05:00
|
|
|
events.close();
|
2023-02-08 00:02:29 -05:00
|
|
|
errorHandler(e);
|
2023-02-06 21:17:46 -05:00
|
|
|
};
|
|
|
|
|
|
2023-03-11 21:42:08 -05:00
|
|
|
events.addEventListener('stop', () => {
|
|
|
|
|
// Close the SSE stream
|
|
|
|
|
console.log('stop event received');
|
|
|
|
|
events.close();
|
|
|
|
|
});
|
|
|
|
|
|
2023-02-06 21:17:46 -05:00
|
|
|
events.stream();
|
2023-02-21 21:30:56 -05:00
|
|
|
}
|