From 0f6fcd5928d9505151d0d41023cbe97056f69464 Mon Sep 17 00:00:00 2001 From: Daniel Avila Date: Sat, 25 Feb 2023 09:04:32 -0500 Subject: [PATCH] organize modules --- app/index.js | 9 ++++ models/index.js | 8 ++++ server/routes/ask.js | 87 ++++----------------------------------- server/routes/askBing.js | 72 ++++++++++++++++++++++++++++++++ server/routes/handlers.js | 13 ++++++ 5 files changed, 111 insertions(+), 78 deletions(-) create mode 100644 app/index.js create mode 100644 models/index.js create mode 100644 server/routes/askBing.js create mode 100644 server/routes/handlers.js diff --git a/app/index.js b/app/index.js new file mode 100644 index 0000000000..e81656b400 --- /dev/null +++ b/app/index.js @@ -0,0 +1,9 @@ +const { titleConvo } = require('./chatgpt'); +const { askClient } = require('./chatgpt-client'); +const { askBing } = require('./bingai'); + +module.exports = { + titleConvo, + askClient, + askBing, +}; \ No newline at end of file diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000000..6c48dec6d3 --- /dev/null +++ b/models/index.js @@ -0,0 +1,8 @@ +const { saveMessage, deleteMessages } = require('./Message'); +const { saveConvo } = require('./Conversation'); + +module.exports = { + saveMessage, + deleteMessages, + saveConvo, +}; \ No newline at end of file diff --git a/server/routes/ask.js b/server/routes/ask.js index f2aef7ebe0..0846880d92 100644 --- a/server/routes/ask.js +++ b/server/routes/ask.js @@ -1,83 +1,12 @@ const express = require('express'); const crypto = require('crypto'); const router = express.Router(); -const { titleConvo } = require('../../app/chatgpt'); -const { askClient } = require('../../app/chatgpt-client'); -const { askBing } = require('../../app/bingai'); -const { saveMessage, deleteMessages } = require('../../models/Message'); -const { saveConvo } = require('../../models/Conversation'); +const askBing = require('./askBing'); +const { titleConvo, askClient } = require('../../app/'); +const { saveMessage, deleteMessages, saveConvo } = require('../../models'); +const { handleError, sendMessage } = require('./handlers'); -const handleError = (res, errorMessage) => { - res.status(500).write(`event: error\ndata: ${errorMessage}`); - res.end(); -}; - -const sendMessage = (res, message) => { - res.write(`event: message\ndata: ${JSON.stringify(message)}\n\n`); -}; - -router.post('/bing', async (req, res) => { - const { model, text, ...convo } = req.body; - if (!text.trim().includes(' ') && text.length < 5) { - return handleError(res, 'Prompt empty or too short'); - } - - const userMessageId = crypto.randomUUID(); - let userMessage = { id: userMessageId, sender: 'User', text }; - - console.log('ask log', { model, ...userMessage, ...convo }); - - res.writeHead(200, { - Connection: 'keep-alive', - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache, no-transform', - 'Access-Control-Allow-Origin': '*', - 'X-Accel-Buffering': 'no' - }); - - try { - let tokens = ''; - const progressCallback = async (partial) => { - tokens += partial; - sendMessage(res, { text: tokens, message: true }); - }; - - let response = await askBing({ - text, - progressCallback, - convo - }); - - console.log('CLIENT RESPONSE'); - console.dir(response, { depth: null }); - - userMessage.conversationSignature = - convo.conversationSignature || response.conversationSignature; - userMessage.conversationId = convo.conversationId || response.conversationId; - userMessage.invocationId = response.invocationId; - await saveMessage(userMessage); - - if (!convo.conversationSignature) { - response.title = await titleConvo(text, response.response, model); - } - - response.text = response.response; - response.id = response.details.messageId; - response.suggestions = - response.details.suggestedResponses && - response.details.suggestedResponses.map((s) => s.text); - response.sender = model; - response.final = true; - await saveMessage(response); - await saveConvo(response); - sendMessage(res, response); - res.end(); - } catch (error) { - console.log(error); - await deleteMessages({ id: userMessageId }); - handleError(res, error.message); - } -}); +router.use('/bing', askBing); router.post('/', async (req, res) => { const { model, text, parentMessageId, conversationId } = req.body; @@ -113,10 +42,12 @@ router.post('/', async (req, res) => { if (typeof partial === 'object') { sendMessage(res, { ...partial, message: true }); } else { - tokens += partial; + tokens += partial === text ? '' : partial; if (tokens.includes('[DONE]')) { tokens = tokens.replace('[DONE]', ''); } + + // tokens = appendCode(tokens); sendMessage(res, { text: tokens, message: true, initial: i === 0 ? true : false }); i++; } @@ -132,7 +63,7 @@ router.post('/', async (req, res) => { } }); - console.log('CLIENT RESPONSE', gptResponse); + // console.log('CLIENT RESPONSE', gptResponse); if (!gptResponse.parentMessageId) { gptResponse.text = gptResponse.response; diff --git a/server/routes/askBing.js b/server/routes/askBing.js new file mode 100644 index 0000000000..3787e3fb9e --- /dev/null +++ b/server/routes/askBing.js @@ -0,0 +1,72 @@ +const express = require('express'); +const crypto = require('crypto'); +const router = express.Router(); +const { titleConvo, askBing } = require('../../app/'); +const { saveMessage, deleteMessages, saveConvo } = require('../../models'); +const { handleError, sendMessage } = require('./handlers'); + +router.post('/', async (req, res) => { + const { model, text, ...convo } = req.body; + if (!text.trim().includes(' ') && text.length < 5) { + return handleError(res, 'Prompt empty or too short'); + } + + const userMessageId = crypto.randomUUID(); + let userMessage = { id: userMessageId, sender: 'User', text }; + + console.log('ask log', { model, ...userMessage, ...convo }); + + res.writeHead(200, { + Connection: 'keep-alive', + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache, no-transform', + 'Access-Control-Allow-Origin': '*', + 'X-Accel-Buffering': 'no' + }); + + try { + let tokens = ''; + const progressCallback = async (partial) => { + tokens += partial === text ? '' : partial; + // tokens = appendCode(tokens); + sendMessage(res, { text: tokens, message: true }); + }; + + let response = await askBing({ + text, + progressCallback, + convo + }); + + console.log('CLIENT RESPONSE'); + console.dir(response, { depth: null }); + + userMessage.conversationSignature = + convo.conversationSignature || response.conversationSignature; + userMessage.conversationId = convo.conversationId || response.conversationId; + userMessage.invocationId = response.invocationId; + await saveMessage(userMessage); + + if (!convo.conversationSignature) { + response.title = await titleConvo(text, response.response, model); + } + + response.text = response.response; + response.id = response.details.messageId; + response.suggestions = + response.details.suggestedResponses && + response.details.suggestedResponses.map((s) => s.text); + response.sender = model; + response.final = true; + await saveMessage(response); + await saveConvo(response); + sendMessage(res, response); + res.end(); + } catch (error) { + console.log(error); + await deleteMessages({ id: userMessageId }); + handleError(res, error.message); + } +}); + +module.exports = router; diff --git a/server/routes/handlers.js b/server/routes/handlers.js new file mode 100644 index 0000000000..edd64e6184 --- /dev/null +++ b/server/routes/handlers.js @@ -0,0 +1,13 @@ +const handleError = (res, errorMessage) => { + res.status(500).write(`event: error\ndata: ${errorMessage}`); + res.end(); +}; + +const sendMessage = (res, message) => { + if (message.length === 0) { + return; + } + res.write(`event: message\ndata: ${JSON.stringify(message)}\n\n`); +}; + +module.exports = { handleError, sendMessage };