From 9623fe2e9ffd62dfb37ae81aa591a42c819f5a10 Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Fri, 7 Apr 2023 23:13:13 +0800 Subject: [PATCH 1/4] clean code with newConversationId in askbingai Revert "Merge pull request #167 from danny-avila/fix-sydney" This reverts commit 15999bda95fb48d22ba28f51084f06b1c88614ce, reversing changes made to e1c6517b8fb2792fd88408f4f8f450b207f3eaa6. --- api/server/routes/ask/askBingAI.js | 93 +++++++++++++++--------------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/api/server/routes/ask/askBingAI.js b/api/server/routes/ask/askBingAI.js index 9f18fd9d01..527bfe9e59 100644 --- a/api/server/routes/ask/askBingAI.js +++ b/api/server/routes/ask/askBingAI.js @@ -35,21 +35,21 @@ router.post('/', async (req, res) => { let endpointOption = {}; if (req.body?.jailbreak) endpointOption = { - jailbreak: req.body?.jailbreak || false, - jailbreakConversationId: req.body?.jailbreakConversationId || null, - systemMessage: req.body?.systemMessage || null, - context: req.body?.context || null, - toneStyle: req.body?.toneStyle || 'fast' + jailbreak: req.body?.jailbreak ?? false, + jailbreakConversationId: req.body?.jailbreakConversationId ?? null, + systemMessage: req.body?.systemMessage ?? null, + context: req.body?.context ?? null, + toneStyle: req.body?.toneStyle ?? 'fast' }; else endpointOption = { - jailbreak: req.body?.jailbreak || false, - systemMessage: req.body?.systemMessage || null, - context: req.body?.context || null, - conversationSignature: req.body?.conversationSignature || null, - clientId: req.body?.clientId || null, - invocationId: req.body?.invocationId || null, - toneStyle: req.body?.toneStyle || 'fast' + jailbreak: req.body?.jailbreak ?? false, + systemMessage: req.body?.systemMessage ?? null, + context: req.body?.context ?? null, + conversationSignature: req.body?.conversationSignature ?? null, + clientId: req.body?.clientId ?? null, + invocationId: req.body?.invocationId ?? null, + toneStyle: req.body?.toneStyle ?? 'fast' }; console.log('ask log', { @@ -122,31 +122,23 @@ const ask = async ({ console.log('BING RESPONSE', response); + const newConversationId = endpointOption?.jailbreak + ? response.jailbreakConversationId + : response.conversationId || conversationId; + const newUserMassageId = response.parentMessageId || response.details.requestId || userMessageId; + const newResponseMessageId = response.messageId || response.details.messageId; + // STEP1 generate response message response.text = response.response || response.details.spokenText || '**Bing refused to answer.**'; let responseMessage = { + conversationId: newConversationId, + messageId: newResponseMessageId, + parentMessageId: overrideParentMessageId || newUserMassageId, + sender: endpointOption?.jailbreak ? 'Sydney' : 'BingAI', text: await handleText(response, true), - suggestions: - response.details.suggestedResponses && response.details.suggestedResponses.map(s => s.text), - jailbreak: endpointOption?.jailbreak + suggestions: response.details.suggestedResponses && response.details.suggestedResponses.map(s => s.text) }; - // // response.text = await handleText(response, true); - // response.suggestions = - // response.details.suggestedResponses && response.details.suggestedResponses.map(s => s.text); - - if (endpointOption?.jailbreak) { - responseMessage.conversationId = response.jailbreakConversationId; - responseMessage.messageId = response.messageId || response.details.messageId; - responseMessage.parentMessageId = overrideParentMessageId || response.parentMessageId || userMessageId; - responseMessage.sender = 'Sydney'; - } else { - responseMessage.conversationId = response.conversationId; - responseMessage.messageId = response.messageId || response.details.messageId; - responseMessage.parentMessageId = - overrideParentMessageId || response.parentMessageId || response.details.requestId || userMessageId; - responseMessage.sender = 'BingAI'; - } await saveMessage(responseMessage); @@ -159,14 +151,22 @@ const ask = async ({ // Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId, // but in this situation, don't change the conversationId, but create new convo. - let conversationUpdate = { conversationId, endpoint: 'bingAI' }; - if (conversationId != responseMessage.conversationId && isNewConversation) - conversationUpdate = { - ...conversationUpdate, - conversationId: conversationId, - newConversationId: responseMessage.conversationId || conversationId - }; - conversationId = responseMessage.conversationId || conversationId; + let conversationUpdate = { conversationId: newConversationId, endpoint: 'bingAI' }; + if (conversationId != newConversationId) + if (isNewConversation) { + // change the conversationId to new one + conversationUpdate = { + ...conversationUpdate, + conversationId: conversationId, + newConversationId: newConversationId + }; + } else { + // create new conversation + conversationUpdate = { + ...conversationUpdate, + ...endpointOption + }; + } if (endpointOption?.jailbreak) { conversationUpdate.jailbreak = true; @@ -179,17 +179,16 @@ const ask = async ({ } await saveConvo(req?.session?.user?.username, conversationUpdate); + conversationId = newConversationId; // STEP3 update the user message - userMessage.conversationId = conversationId; - userMessage.messageId = responseMessage.parentMessageId; + userMessage.conversationId = newConversationId; + userMessage.messageId = newUserMassageId; // If response has parentMessageId, the fake userMessage.messageId should be updated to the real one. - if (!overrideParentMessageId) { - const oldUserMessageId = userMessageId; - await saveMessage({ ...userMessage, messageId: oldUserMessageId, newMessageId: userMessage.messageId }); - } - userMessageId = userMessage.messageId; + if (!overrideParentMessageId) + await saveMessage({ ...userMessage, messageId: userMessageId, newMessageId: newUserMassageId }); + userMessageId = newUserMassageId; sendMessage(res, { title: await getConvoTitle(req?.session?.user?.username, conversationId), @@ -223,4 +222,4 @@ const ask = async ({ } }; -module.exports = router; \ No newline at end of file +module.exports = router; From 96b004a696d43a26b3022486b4384aee8aa4569a Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Sat, 8 Apr 2023 00:14:15 +0800 Subject: [PATCH 2/4] feat: add animation to New Topic. --- .../EndpointItem.jsx | 0 .../EndpointItems.jsx | 2 +- .../FileUpload.jsx | 0 .../PresetItem.jsx | 6 +++--- .../PresetItems.jsx | 2 +- .../index.jsx} | 15 +++++++++------ client/src/components/Input/index.jsx | 6 +++--- 7 files changed, 17 insertions(+), 14 deletions(-) rename client/src/components/Input/{Endpoints => NewConversationMenu}/EndpointItem.jsx (100%) rename client/src/components/Input/{Endpoints => NewConversationMenu}/EndpointItems.jsx (87%) rename client/src/components/Input/{Endpoints => NewConversationMenu}/FileUpload.jsx (100%) rename client/src/components/Input/{Endpoints => NewConversationMenu}/PresetItem.jsx (93%) rename client/src/components/Input/{Endpoints => NewConversationMenu}/PresetItems.jsx (90%) rename client/src/components/Input/{Endpoints/NewConversationMenu.jsx => NewConversationMenu/index.jsx} (88%) diff --git a/client/src/components/Input/Endpoints/EndpointItem.jsx b/client/src/components/Input/NewConversationMenu/EndpointItem.jsx similarity index 100% rename from client/src/components/Input/Endpoints/EndpointItem.jsx rename to client/src/components/Input/NewConversationMenu/EndpointItem.jsx diff --git a/client/src/components/Input/Endpoints/EndpointItems.jsx b/client/src/components/Input/NewConversationMenu/EndpointItems.jsx similarity index 87% rename from client/src/components/Input/Endpoints/EndpointItems.jsx rename to client/src/components/Input/NewConversationMenu/EndpointItems.jsx index 1828344b21..1d403e95a8 100644 --- a/client/src/components/Input/Endpoints/EndpointItems.jsx +++ b/client/src/components/Input/NewConversationMenu/EndpointItems.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import EndpointItem from './EndpointItem'; +import EndpointItem from './EndpointItem.jsx'; export default function EndpointItems({ endpoints, onSelect }) { return ( diff --git a/client/src/components/Input/Endpoints/FileUpload.jsx b/client/src/components/Input/NewConversationMenu/FileUpload.jsx similarity index 100% rename from client/src/components/Input/Endpoints/FileUpload.jsx rename to client/src/components/Input/NewConversationMenu/FileUpload.jsx diff --git a/client/src/components/Input/Endpoints/PresetItem.jsx b/client/src/components/Input/NewConversationMenu/PresetItem.jsx similarity index 93% rename from client/src/components/Input/Endpoints/PresetItem.jsx rename to client/src/components/Input/NewConversationMenu/PresetItem.jsx index fe8503d2cc..ea599bad39 100644 --- a/client/src/components/Input/Endpoints/PresetItem.jsx +++ b/client/src/components/Input/NewConversationMenu/PresetItem.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { DropdownMenuRadioItem } from '../../ui/DropdownMenu.tsx'; -import EditIcon from '../../svg/EditIcon'; -import TrashIcon from '../../svg/TrashIcon'; +import EditIcon from '../../svg/EditIcon.jsx'; +import TrashIcon from '../../svg/TrashIcon.jsx'; import getIcon from '~/utils/getIcon'; export default function PresetItem({ preset = {}, value, onSelect, onChangePreset, onDeletePreset }) { @@ -56,7 +56,7 @@ export default function PresetItem({ preset = {}, value, onSelect, onChangePrese /> */}
Date: Sat, 8 Apr 2023 00:14:44 +0800 Subject: [PATCH 3/4] feat: add host params to bingAI. [but seems not work in China] --- api/.env.example | 5 +++++ api/app/clients/bingai.js | 1 + 2 files changed, 6 insertions(+) diff --git a/api/.env.example b/api/.env.example index c952ebe491..4fa5a432a1 100644 --- a/api/.env.example +++ b/api/.env.example @@ -41,6 +41,11 @@ OPENAI_KEY= # Leave it and BINGAI_USER_TOKEN blank to disable this endpoint. BINGAI_TOKEN= +# BingAI Host: +# Necessary for some people in different countries, e.g. China (https://cn.bing.com) +# Leave it blank to use default server. +# BINGAI_HOST="https://cn.bing.com" + # BingAI User defined Token # Allow user to set their own token by client # Uncomment this to enable this feature. diff --git a/api/app/clients/bingai.js b/api/app/clients/bingai.js index 015da79069..ca790ec43d 100644 --- a/api/app/clients/bingai.js +++ b/api/app/clients/bingai.js @@ -27,6 +27,7 @@ const askBing = async ({ // cookies: '', debug: false, cache: store, + host: process.env.BINGAI_HOST || null, proxy: process.env.PROXY || null }); From 90946011f71dd48d8d6703e31c53959ac09c7092 Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Sat, 8 Apr 2023 00:36:58 +0800 Subject: [PATCH 4/4] fix: update titleConvo to use same title protocal as node-chatgpt-api --- api/app/titleConvo.js | 69 ++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/api/app/titleConvo.js b/api/app/titleConvo.js index dc55ea0c8f..280c66cbcf 100644 --- a/api/app/titleConvo.js +++ b/api/app/titleConvo.js @@ -18,49 +18,38 @@ const proxyEnvToAxiosProxy = proxyString => { const titleConvo = async ({ endpoint, text, response }) => { let title = 'New Chat'; - const messages = [ - { - role: 'system', - content: - // `You are a title-generator with one job: giving a conversation, detect the language and titling the conversation provided by a user, using the same language. The requirement are: 1. If possible, generate in 5 words or less, 2. Using title case, 3. must give the title using the language as the user said. 4. Don't refer to the participants of the conversation. 5. Do not include punctuation or quotation marks. 6. Your response should be in title case, exclusively containing the title. 7. don't say anything except the title. - `Detect user language and write in the same language an extremely concise title for this conversation, which you must accurately detect. Write in the detected language. Title in 5 Words or Less. No Punctuation/Quotation. All first letters of every word should be capitalized and complete only the title in User Language only. - -||>User: -"${text}" -||>Response: -"${JSON.stringify(response?.text)}" - -||>Title:` - } - // { - // role: 'user', - // content: `User:\n "${text}"\n\n${model}: \n"${JSON.stringify(response?.text)}"\n\n` - // } - ]; - - // console.log('Title Prompt', messages[0]); - - const request = { - model: 'gpt-3.5-turbo', - messages, - temperature: 0, - presence_penalty: 0, - frequency_penalty: 0 - }; - - // console.log('REQUEST', request); + const ChatGPTClient = (await import('@waylaidwanderer/chatgpt-api')).default; try { - const configuration = new Configuration({ - apiKey: process.env.OPENAI_KEY - }); - const openai = new OpenAIApi(configuration); - const completion = await openai.createChatCompletion(request, { - proxy: proxyEnvToAxiosProxy(process.env.PROXY || null) - }); + const instructionsPayload = { + role: 'system', + content: `Detect user language and write in the same language an extremely concise title for this conversation, which you must accurately detect. Write in the detected language. Title in 5 Words or Less. No Punctuation or Quotation. All first letters of every word should be capitalized and complete only the title in User Language only. - //eslint-disable-next-line - title = completion.data.choices[0].message.content.replace(/["\.]/g, ''); + ||>User: + "${text}" + ||>Response: + "${JSON.stringify(response?.text)}" + + ||>Title:` + }; + + const options = { + reverseProxyUrl: process.env.OPENAI_REVERSE_PROXY || null, + proxy: process.env.PROXY || null + }; + + const titleGenClientOptions = JSON.parse(JSON.stringify(options)); + + titleGenClientOptions.modelOptions = { + model: 'gpt-3.5-turbo', + temperature: 0, + presence_penalty: 0, + frequency_penalty: 0 + }; + + const titleGenClient = new ChatGPTClient(process.env.OPENAI_KEY, titleGenClientOptions); + const result = await titleGenClient.getCompletion([instructionsPayload], null); + title = result.choices[0].message.content.replace(/\s+/g, ' ').trim(); } catch (e) { console.error(e); console.log('There was an issue generating title, see error above');