diff --git a/client/src/components/Main/TextChat.jsx b/client/src/components/Main/TextChat.jsx index 8f1276fce6..c4fd6a8f23 100644 --- a/client/src/components/Main/TextChat.jsx +++ b/client/src/components/Main/TextChat.jsx @@ -1,18 +1,17 @@ import React, { useEffect, useRef, useState } from 'react'; import { SSE } from '~/utils/sse'; -import axios from 'axios'; import SubmitButton from './SubmitButton'; import Regenerate from './Regenerate'; import ModelMenu from '../Models/ModelMenu'; import Footer from './Footer'; import TextareaAutosize from 'react-textarea-autosize'; -import handleSubmit from '~/utils/handleSubmit'; +import createPayload from '~/utils/createPayload'; +import resetConvo from '~/utils/resetConvo'; import { useSelector, useDispatch } from 'react-redux'; import { setConversation, setError, refreshConversation } from '~/store/convoSlice'; import { setMessages } from '~/store/messageSlice'; import { setSubmitState, setSubmission } from '~/store/submitSlice'; import { setText } from '~/store/textSlice'; -import manualSWR from '~/utils/fetchers'; export default function TextChat({ messages }) { const [errorMessage, setErrorMessage] = useState(''); @@ -25,7 +24,6 @@ export default function TextChat({ messages }) { useSelector((state) => state.submit); const { text } = useSelector((state) => state.text); const { error } = convo; - const genTitle = manualSWR(`/api/convos/gen_title`, 'post'); // auto focus to input, when enter a conversation. useEffect(() => { @@ -157,8 +155,12 @@ export default function TextChat({ messages }) { const fakeMessageId = crypto.randomUUID(); const isCustomModel = model === 'chatgptCustom' || !initial[model]; const message = text.trim(); - const currentMsg = { sender: 'User', text: message, current: true, isCreatedByUser: true, parentMessageId: convo.parentMessageId || '00000000-0000-0000-0000-000000000000', messageId: fakeMessageId }; const sender = model === 'chatgptCustom' ? chatGptLabel : model; + let parentMessageId = convo.parentMessageId || '00000000-0000-0000-0000-000000000000'; + if (resetConvo(messages, sender)) { + parentMessageId = '00000000-0000-0000-0000-000000000000'; + } + const currentMsg = { sender: 'User', text: message, current: true, isCreatedByUser: true, parentMessageId , messageId: fakeMessageId }; const initialResponse = { sender, text: '', parentMessageId: fakeMessageId, submitting: true }; dispatch(setSubmitState(true)); @@ -184,38 +186,6 @@ export default function TextChat({ messages }) { dispatch(setSubmission(submission)); }; - const createPayload = ({ convo, message }) => { - const endpoint = `/api/ask`; - let payload = { ...message }; - const { model } = message - - if (!payload.conversationId) - if (convo?.conversationId && convo?.parentMessageId) { - payload = { - ...payload, - conversationId: convo.conversationId, - parentMessageId: convo.parentMessageId || '00000000-0000-0000-0000-000000000000' - }; - } - - const isBing = model === 'bingai' || model === 'sydney'; - if (isBing && convo?.conversationId) { - payload = { - ...payload, - jailbreakConversationId: convo.jailbreakConversationId, - conversationId: convo.conversationId, - conversationSignature: convo.conversationSignature, - clientId: convo.clientId, - invocationId: convo.invocationId - }; - } - - let server = endpoint; - server = model === 'bingai' ? server + '/bing' : server; - server = model === 'sydney' ? server + '/sydney' : server; - return { server, payload }; - }; - useEffect(() => { if (Object.keys(submission).length === 0) { return; diff --git a/client/src/components/Models/ModelMenu.jsx b/client/src/components/Models/ModelMenu.jsx index 05bafc676b..7fc819209d 100644 --- a/client/src/components/Models/ModelMenu.jsx +++ b/client/src/components/Models/ModelMenu.jsx @@ -64,6 +64,9 @@ export default function ModelMenu() { }, [model]); const onChange = (value, custom = false) => { + // Set new conversation + dispatch(setNewConvo()); + dispatch(setSubmission({})); // if (custom) { // mutate(); // } @@ -89,9 +92,7 @@ export default function ModelMenu() { dispatch(setCustomModel(null)); } - // Set new conversation - dispatch(setNewConvo()); - dispatch(setSubmission({})); + }; const onOpenChange = (open) => { diff --git a/client/src/utils/createPayload.js b/client/src/utils/createPayload.js new file mode 100644 index 0000000000..fd195e43e1 --- /dev/null +++ b/client/src/utils/createPayload.js @@ -0,0 +1,31 @@ +export default function createPayload({ convo, message }) { + const endpoint = `/api/ask`; + let payload = { ...message }; + const { model } = message; + + if (!payload.conversationId) + if (convo?.conversationId && convo?.parentMessageId) { + payload = { + ...payload, + conversationId: convo.conversationId, + parentMessageId: convo.parentMessageId || '00000000-0000-0000-0000-000000000000' + }; + } + + const isBing = model === 'bingai' || model === 'sydney'; + if (isBing && convo?.conversationId) { + payload = { + ...payload, + jailbreakConversationId: convo.jailbreakConversationId, + conversationId: convo.conversationId, + conversationSignature: convo.conversationSignature, + clientId: convo.clientId, + invocationId: convo.invocationId + }; + } + + let server = endpoint; + server = model === 'bingai' ? server + '/bing' : server; + server = model === 'sydney' ? server + '/sydney' : server; + return { server, payload }; +}; diff --git a/client/src/utils/resetConvo.js b/client/src/utils/resetConvo.js new file mode 100644 index 0000000000..8ce01fda57 --- /dev/null +++ b/client/src/utils/resetConvo.js @@ -0,0 +1,22 @@ +export default function resetConvo(messages, sender) { + if (messages.length === 0) { + return false; + } + let modelMessages = messages.filter((message) => !message.isCreatedByUser); + let lastModel = modelMessages[modelMessages.length - 1].sender; + if (lastModel !== sender) { + console.log( + 'Model change! Reseting convo. Original messages: ', + messages, + 'filtered messages: ', + modelMessages, + 'last model: ', + lastModel, + 'sender: ', + sender + ); + return true; + } + + return false; +}