fix(BingAI): show censored message, fix toneStyle UI bug (#644)

* fix(frontend/BingAI): prevent Settings from not showing on new conversation, also prevent showing toneStyle change without jailbreak

* fix(Input/index.jsx): fix typo in comment, change "also prevents toneStyle change without jailbreak" to "also prevents showing toneStyle change without jailbreak"

* fix(BingAI): show message despite censor trigger
This commit is contained in:
Danny Avila 2023-07-14 10:57:24 -04:00 committed by GitHub
parent 1a5144be76
commit 1a21eb5bae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 100 additions and 48 deletions

View file

@ -108,32 +108,33 @@ const ask = async ({
if (preSendRequest) sendMessage(res, { message: userMessage, created: true }); if (preSendRequest) sendMessage(res, { message: userMessage, created: true });
let lastSavedTimestamp = 0;
const { onProgress: progressCallback, getPartialText } = createOnProgress({
onProgress: ({ text }) => {
const currentTimestamp = Date.now();
if (currentTimestamp - lastSavedTimestamp > 500) {
lastSavedTimestamp = currentTimestamp;
saveMessage({
messageId: responseMessageId,
sender: endpointOption?.jailbreak ? 'Sydney' : 'BingAI',
conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
text: text,
unfinished: true,
cancelled: false,
error: false,
});
}
},
});
const abortController = new AbortController();
let bingConversationId = null;
if (!isNewConversation) {
const convo = await getConvo(req.user.id, conversationId);
bingConversationId = convo.bingConversationId;
}
try { try {
let lastSavedTimestamp = 0;
const { onProgress: progressCallback } = createOnProgress({
onProgress: ({ text }) => {
const currentTimestamp = Date.now();
if (currentTimestamp - lastSavedTimestamp > 500) {
lastSavedTimestamp = currentTimestamp;
saveMessage({
messageId: responseMessageId,
sender: endpointOption?.jailbreak ? 'Sydney' : 'BingAI',
conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
text: text,
unfinished: true,
cancelled: false,
error: false,
});
}
},
});
const abortController = new AbortController();
let bingConversationId = null;
if (!isNewConversation) {
const convo = await getConvo(req.user.id, conversationId);
bingConversationId = convo.bingConversationId;
}
let response = await askBing({ let response = await askBing({
text, text,
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
@ -160,6 +161,13 @@ const ask = async ({
response.text = response.text =
response.response || response.details.spokenText || '**Bing refused to answer.**'; response.response || response.details.spokenText || '**Bing refused to answer.**';
const partialText = getPartialText();
let unfinished = false;
if (partialText?.length > response.text.length) {
response.text = partialText;
unfinished = true;
}
let responseMessage = { let responseMessage = {
conversationId, conversationId,
bingConversationId: newConversationId, bingConversationId: newConversationId,
@ -171,7 +179,7 @@ const ask = async ({
suggestions: suggestions:
response.details.suggestedResponses && response.details.suggestedResponses &&
response.details.suggestedResponses.map((s) => s.text), response.details.suggestedResponses.map((s) => s.text),
unfinished: false, unfinished,
cancelled: false, cancelled: false,
error: false, error: false,
}; };
@ -179,7 +187,11 @@ const ask = async ({
await saveMessage(responseMessage); await saveMessage(responseMessage);
responseMessage.messageId = newResponseMessageId; responseMessage.messageId = newResponseMessageId;
let conversationUpdate = { conversationId, bingConversationId: newConversationId, endpoint: 'bingAI' }; let conversationUpdate = {
conversationId,
bingConversationId: newConversationId,
endpoint: 'bingAI',
};
if (endpointOption?.jailbreak) { if (endpointOption?.jailbreak) {
conversationUpdate.jailbreak = true; conversationUpdate.jailbreak = true;
@ -224,19 +236,45 @@ const ask = async ({
}); });
} }
} catch (error) { } catch (error) {
console.log(error); console.error(error);
const errorMessage = { const partialText = getPartialText();
messageId: responseMessageId, if (partialText?.length > 2) {
sender: endpointOption?.jailbreak ? 'Sydney' : 'BingAI', const responseMessage = {
conversationId, messageId: responseMessageId,
parentMessageId: overrideParentMessageId || userMessageId, sender: endpointOption?.jailbreak ? 'Sydney' : 'BingAI',
unfinished: false, conversationId,
cancelled: false, parentMessageId: overrideParentMessageId || userMessageId,
error: true, text: partialText,
text: error.message, model: endpointOption.modelOptions.model,
}; unfinished: true,
await saveMessage(errorMessage); cancelled: false,
handleError(res, errorMessage); error: false,
};
saveMessage(responseMessage);
return {
title: await getConvoTitle(req.user.id, conversationId),
final: true,
conversation: await getConvo(req.user.id, conversationId),
requestMessage: userMessage,
responseMessage: responseMessage,
};
} else {
console.log(error);
const errorMessage = {
messageId: responseMessageId,
sender: endpointOption?.jailbreak ? 'Sydney' : 'BingAI',
conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
unfinished: false,
cancelled: false,
error: true,
text: error.message,
};
await saveMessage(errorMessage);
handleError(res, errorMessage);
}
} }
}; };

View file

@ -4,7 +4,7 @@ const router = express.Router();
// const askOpenAI = require('./askOpenAI'); // const askOpenAI = require('./askOpenAI');
const openAI = require('./openAI'); const openAI = require('./openAI');
const google = require('./google'); const google = require('./google');
const askBingAI = require('./askBingAI'); const bingAI = require('./bingAI');
const gptPlugins = require('./gptPlugins'); const gptPlugins = require('./gptPlugins');
const askChatGPTBrowser = require('./askChatGPTBrowser'); const askChatGPTBrowser = require('./askChatGPTBrowser');
const anthropic = require('./anthropic'); const anthropic = require('./anthropic');
@ -12,7 +12,7 @@ const anthropic = require('./anthropic');
// router.use('/azureOpenAI', askAzureOpenAI); // router.use('/azureOpenAI', askAzureOpenAI);
router.use(['/azureOpenAI', '/openAI'], openAI); router.use(['/azureOpenAI', '/openAI'], openAI);
router.use('/google', google); router.use('/google', google);
router.use('/bingAI', askBingAI); router.use('/bingAI', bingAI);
router.use('/chatGPTBrowser', askChatGPTBrowser); router.use('/chatGPTBrowser', askChatGPTBrowser);
router.use('/gptPlugins', gptPlugins); router.use('/gptPlugins', gptPlugins);
router.use('/anthropic', anthropic); router.use('/anthropic', anthropic);

View file

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { Settings2 } from 'lucide-react'; import { Settings2 } from 'lucide-react';
export default function AdjustButton({ onClick }) { export default function AdjustToneButton({ onClick }) {
const clickHandler = (e) => { const clickHandler = (e) => {
e.preventDefault(); e.preventDefault();
onClick(); onClick();

View file

@ -11,7 +11,7 @@ import NewConversationMenu from './NewConversationMenu';
import AdjustToneButton from './AdjustToneButton'; import AdjustToneButton from './AdjustToneButton';
import Footer from './Footer'; import Footer from './Footer';
import TextareaAutosize from 'react-textarea-autosize'; import TextareaAutosize from 'react-textarea-autosize';
import { useMessageHandler } from '../../utils/handleSubmit'; import { useMessageHandler } from '~/utils/handleSubmit';
import store from '~/store'; import store from '~/store';
@ -36,8 +36,20 @@ export default function TextChat({ isSearchView = false }) {
// auto focus to input, when enter a conversation. // auto focus to input, when enter a conversation.
useEffect(() => { useEffect(() => {
if (conversation?.conversationId !== 'search') inputRef.current?.focus(); const { conversationId } = conversation || {};
}, [conversation?.conversationId]); if (!conversationId) {
return;
}
// Prevents Settings from not showing on new conversation, also prevents showing toneStyle change without jailbreak
if (conversationId === 'new' || !conversation?.jailbreak) {
setShowBingToneSetting(false);
}
if (conversationId !== 'search') {
inputRef.current?.focus();
}
}, [conversation]);
useEffect(() => { useEffect(() => {
const timeoutId = setTimeout(() => { const timeoutId = setTimeout(() => {
@ -146,7 +158,7 @@ export default function TextChat({ isSearchView = false }) {
> >
<NewConversationMenu /> <NewConversationMenu />
<TextareaAutosize <TextareaAutosize
// set test id for e2e testing // set test id for e2e testing
data-testid="text-input" data-testid="text-input"
tabIndex="0" tabIndex="0"
autoFocus autoFocus

View file

@ -209,7 +209,9 @@ export default function Message({
{!isSubmitting && unfinished ? ( {!isSubmitting && unfinished ? (
<div className="flex flex min-h-[20px] flex-grow flex-col items-start gap-2 gap-4 text-red-500"> <div className="flex flex min-h-[20px] flex-grow flex-col items-start gap-2 gap-4 text-red-500">
<div className="rounded-md border border-blue-400 bg-blue-500/10 px-3 py-2 text-sm text-gray-600 dark:text-gray-100"> <div className="rounded-md border border-blue-400 bg-blue-500/10 px-3 py-2 text-sm text-gray-600 dark:text-gray-100">
{'This is an unfinished message. The AI may still be generating a response or it was aborted. Refresh or visit later to see more updates.'} {
'This is an unfinished message. The AI may still be generating a response, it was aborted, or a censor was triggered. Refresh or visit later to see more updates.'
}
</div> </div>
</div> </div>
) : null} ) : null}