From a0c94715ce99321441d0276e8733ca372d03ea42 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 15 Mar 2023 15:21:04 -0400 Subject: [PATCH] chore: refactor titleConvo --- api/app/titleConvo.js | 63 ++++++++++++++++++++-------------- api/server/routes/ask.js | 12 ++----- api/server/routes/askBing.js | 12 ++----- api/server/routes/askSydney.js | 12 ++----- api/server/routes/handlers.js | 19 +--------- 5 files changed, 47 insertions(+), 71 deletions(-) diff --git a/api/app/titleConvo.js b/api/app/titleConvo.js index 344af6f893..e37fcb3b0c 100644 --- a/api/app/titleConvo.js +++ b/api/app/titleConvo.js @@ -16,33 +16,44 @@ const proxyEnvToAxiosProxy = (proxyString) => { return proxyConfig; }; -const titleConvo = async ({ message, response, model }) => { - const configuration = new Configuration({ - apiKey: process.env.OPENAI_KEY - }); - const openai = new OpenAIApi(configuration); - const completion = await openai.createChatCompletion( - { - model: 'gpt-3.5-turbo', - 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 in title case, using the same language.' - }, - { - role: 'user', - content: `In 5 words or less, summarize the conversation below with a title in title case using the language the user writes in. Don't refer to the participants of the conversation by name. Do not include punctuation or quotation marks. Your response should be in title case, exclusively containing the title. Conversation:\n\nUser: "${message}"\n\n${model}: "${response}"\n\nTitle: ` - } - ] - }, - { proxy: proxyEnvToAxiosProxy(process.env.PROXY || null) } - ); +const titleConvo = async ({ model, text, response }) => { + let title = 'New Chat'; + try { + const configuration = new Configuration({ + apiKey: process.env.OPENAI_KEY + }); + const openai = new OpenAIApi(configuration); + const completion = await openai.createChatCompletion( + { + model: 'gpt-3.5-turbo', + 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 in title case, using the same language.' + }, + { + role: 'user', + content: `In 5 words or less, summarize the conversation below with a title in title case using the language the user writes in. Don't refer to the participants of the conversation by name. Do not include punctuation or quotation marks. Your response should be in title case, exclusively containing the title. Conversation:\n\nUser: "${text}"\n\n${model}: "${JSON.stringify( + response?.text + )}"\n\nTitle: ` + } + ] + }, + { proxy: proxyEnvToAxiosProxy(process.env.PROXY || null) } + ); - //eslint-disable-next-line - return completion.data.choices[0].message.content.replace(/["\.]/g, ''); + //eslint-disable-next-line + title = completion.data.choices[0].message.content.replace(/["\.]/g, ''); + } catch (e) { + console.error(e); + console.log('There was an issue generating title, see error above'); + } + + console.log('CONVERSATION TITLE', title); + return title; }; -const debouncedTitleConvo = _.debounce(titleConvo, 500); +const throttledTitleConvo = _.throttle(titleConvo, 1000); -module.exports = debouncedTitleConvo; +module.exports = throttledTitleConvo; diff --git a/api/server/routes/ask.js b/api/server/routes/ask.js index 1d497c86b8..69c180c8a7 100644 --- a/api/server/routes/ask.js +++ b/api/server/routes/ask.js @@ -3,15 +3,9 @@ const crypto = require('crypto'); const router = express.Router(); const askBing = require('./askBing'); const askSydney = require('./askSydney'); -const { askClient, browserClient, customClient } = require('../../app/'); +const { titleConvo, askClient, browserClient, customClient } = require('../../app/'); const { getConvo, saveMessage, getConvoTitle, saveConvo } = require('../../models'); -const { - handleError, - sendMessage, - createOnProgress, - genTitle, - handleText -} = require('./handlers'); +const { handleError, sendMessage, createOnProgress, handleText } = require('./handlers'); const { getMessages } = require('../../models/Message'); router.use('/bing', askBing); @@ -192,7 +186,7 @@ const ask = async ({ res.end(); if (userParentMessageId == '00000000-0000-0000-0000-000000000000') { - const title = await genTitle({ model, text, response: gptResponse }); + const title = await titleConvo({ model, text, response: gptResponse }); await saveConvo({ conversationId, diff --git a/api/server/routes/askBing.js b/api/server/routes/askBing.js index 681332ec37..aa052c31d7 100644 --- a/api/server/routes/askBing.js +++ b/api/server/routes/askBing.js @@ -1,15 +1,9 @@ const express = require('express'); const crypto = require('crypto'); const router = express.Router(); -const { getCitations, citeText, askBing } = require('../../app/'); +const { titleConvo, getCitations, citeText, askBing } = require('../../app/'); const { saveMessage, getConvoTitle, saveConvo } = require('../../models'); -const { - handleError, - sendMessage, - createOnProgress, - genTitle, - handleText -} = require('./handlers'); +const { handleError, sendMessage, createOnProgress, handleText } = require('./handlers'); const citationRegex = /\[\^\d+?\^]/g; router.post('/', async (req, res) => { @@ -152,7 +146,7 @@ const ask = async ({ res.end(); if (userParentMessageId == '00000000-0000-0000-0000-000000000000') { - const title = await genTitle({ model, text, response }); + const title = await titleConvo({ model, text, response }); await saveConvo({ conversationId, diff --git a/api/server/routes/askSydney.js b/api/server/routes/askSydney.js index 40aa967bcc..7fecc2a450 100644 --- a/api/server/routes/askSydney.js +++ b/api/server/routes/askSydney.js @@ -1,15 +1,9 @@ const express = require('express'); const crypto = require('crypto'); const router = express.Router(); -const { getCitations, citeText, askSydney } = require('../../app/'); +const { titleConvo, getCitations, citeText, askSydney } = require('../../app/'); const { saveMessage, saveConvo, getConvoTitle } = require('../../models'); -const { - handleError, - sendMessage, - createOnProgress, - genTitle, - handleText -} = require('./handlers'); +const { handleError, sendMessage, createOnProgress, handleText } = require('./handlers'); const citationRegex = /\[\^\d+?\^]/g; router.post('/', async (req, res) => { @@ -164,7 +158,7 @@ const ask = async ({ res.end(); if (userParentMessageId == '00000000-0000-0000-0000-000000000000') { - const title = await genTitle({ model, text, response }); + const title = await titleConvo({ model, text, response }); await saveConvo({ conversationId, diff --git a/api/server/routes/handlers.js b/api/server/routes/handlers.js index e3bd72583f..31213f3080 100644 --- a/api/server/routes/handlers.js +++ b/api/server/routes/handlers.js @@ -15,23 +15,6 @@ const sendMessage = (res, message) => { res.write(`event: message\ndata: ${JSON.stringify(message)}\n\n`); }; -const genTitle = async ({ model, text, response }) => { - let title = 'New Chat'; - try { - title = await titleConvo({ - model, - message: text, - response: JSON.stringify(response?.text) - }); - } catch (e) { - console.error(e); - console.log('There was an issue generating title, see error above'); - } - - console.log('CONVERSATION TITLE', title); - return title; -}; - const createOnProgress = () => { let i = 0; let tokens = ''; @@ -82,4 +65,4 @@ const handleText = async (input) => { return text; }; -module.exports = { handleError, sendMessage, createOnProgress, genTitle, handleText }; +module.exports = { handleError, sendMessage, createOnProgress, handleText };