From 84b104e65fad1dfa328787ff03eeba554e680022 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 15 Mar 2023 15:44:48 -0400 Subject: [PATCH] chore: delegate response text parsing to one location --- api/server/routes/ask.js | 2 +- api/server/routes/askBing.js | 10 ++-------- api/server/routes/askSydney.js | 11 ++-------- api/server/routes/handlers.js | 20 +++++++++++++++---- .../src/components/Messages/TextWrapper.jsx | 2 +- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/api/server/routes/ask.js b/api/server/routes/ask.js index 69c180c8a7..ad2a7178c2 100644 --- a/api/server/routes/ask.js +++ b/api/server/routes/ask.js @@ -162,7 +162,7 @@ const ask = async ({ gptResponse.sender = model === 'chatgptCustom' ? convo.chatGptLabel : model; gptResponse.model = model; // gptResponse.final = true; - gptResponse.text = await handleText(gptResponse.text); + gptResponse.text = await handleText(gptResponse); if (convo.chatGptLabel?.length > 0 && model === 'chatgptCustom') { gptResponse.chatGptLabel = convo.chatGptLabel; diff --git a/api/server/routes/askBing.js b/api/server/routes/askBing.js index aa052c31d7..cfbac77185 100644 --- a/api/server/routes/askBing.js +++ b/api/server/routes/askBing.js @@ -1,10 +1,9 @@ const express = require('express'); const crypto = require('crypto'); const router = express.Router(); -const { titleConvo, getCitations, citeText, askBing } = require('../../app/'); +const { titleConvo, askBing } = require('../../app/'); const { saveMessage, getConvoTitle, saveConvo } = require('../../models'); const { handleError, sendMessage, createOnProgress, handleText } = require('./handlers'); -const citationRegex = /\[\^\d+?\^]/g; router.post('/', async (req, res) => { const { @@ -129,12 +128,7 @@ const ask = async ({ response.parentMessageId = overrideParentMessageId || response.parentMessageId || userMessageId; - const links = getCitations(response); - response.text = - citeText(response) + - (links?.length > 0 && hasCitations ? `\n${links}` : ''); - response.text = await handleText(response.text); - + response.text = await handleText(response, true); await saveMessage(response); await saveConvo({ ...response, model, chatGptLabel: null, promptPrefix: null, ...convo }); sendMessage(res, { diff --git a/api/server/routes/askSydney.js b/api/server/routes/askSydney.js index 7fecc2a450..00f287fa7b 100644 --- a/api/server/routes/askSydney.js +++ b/api/server/routes/askSydney.js @@ -1,10 +1,9 @@ const express = require('express'); const crypto = require('crypto'); const router = express.Router(); -const { titleConvo, getCitations, citeText, askSydney } = require('../../app/'); +const { titleConvo, askSydney } = require('../../app/'); const { saveMessage, saveConvo, getConvoTitle } = require('../../models'); const { handleError, sendMessage, createOnProgress, handleText } = require('./handlers'); -const citationRegex = /\[\^\d+?\^]/g; router.post('/', async (req, res) => { const { @@ -97,7 +96,6 @@ const ask = async ({ console.log('SYDNEY RESPONSE', response); // console.dir(response, { depth: null }); - const hasCitations = response.response.match(citationRegex)?.length > 0; userMessage.conversationSignature = convo.conversationSignature || response.conversationSignature; @@ -125,12 +123,6 @@ const ask = async ({ response.parentMessageId = overrideParentMessageId || response.parentMessageId || userMessageId; - const links = getCitations(response); - response.text = - citeText(response) + - (links?.length > 0 && hasCitations ? `\n${links}` : ''); - response.text = await handleText(response.text); - // Save user message userMessage.conversationId = response.conversationId || conversationId; await saveMessage(userMessage); @@ -146,6 +138,7 @@ const ask = async ({ }); conversationId = userMessage.conversationId; + response.text = await handleText(response, true); // Save sydney response & convo, then send await saveMessage(response); await saveConvo({ ...response, model, chatGptLabel: null, promptPrefix: null, ...convo }); diff --git a/api/server/routes/handlers.js b/api/server/routes/handlers.js index 31213f3080..3ba4e81243 100644 --- a/api/server/routes/handlers.js +++ b/api/server/routes/handlers.js @@ -1,7 +1,8 @@ const _ = require('lodash'); const sanitizeHtml = require('sanitize-html'); -const { titleConvo, citeText, detectCode } = require('../../app/'); -const htmlTagRegex = /(<\/?\s*[a-zA-Z]*\s*(?:\s+[a-zA-Z]+\s*=\s*(?:"[^"]*"|'[^']*'))*\s*(?:\/?)>|<\s*[a-zA-Z]+\s*(?:\s+[a-zA-Z]+\s*=\s*(?:"[^"]*"|'[^']*'))*\s*(?:\/?>|<\/?>))/g; +const citationRegex = /\[\^\d+?\^]/g; +const { getCitations, citeText, detectCode } = require('../../app/'); +// const htmlTagRegex = /(<\/?\s*[a-zA-Z]*\s*(?:\s+[a-zA-Z]+\s*=\s*(?:"[^"]*"|'[^']*'))*\s*(?:\/?)>|<\s*[a-zA-Z]+\s*(?:\s+[a-zA-Z]+\s*=\s*(?:"[^"]*"|'[^']*'))*\s*(?:\/?>|<\/?>))/g; const handleError = (res, message) => { res.write(`event: error\ndata: ${JSON.stringify(message)}\n\n`); @@ -51,9 +52,20 @@ const createOnProgress = () => { return onProgress; }; -const handleText = async (input) => { - let text = input; +const handleText = async (response, bing = false) => { + let { text } = response; text = await detectCode(text); + response.text = text; + + if (bing) { + // const hasCitations = response.response.match(citationRegex)?.length > 0; + const links = getCitations(response); + if (response.text.match(citationRegex)?.length > 0) { + text = citeText(response); + } + text += links?.length > 0 ? `\n${links}` : ''; + } + // const htmlTags = text.match(htmlTagRegex); // if (text.includes('```') && htmlTags && htmlTags.length > 0) { // htmlTags.forEach((tag) => { diff --git a/client/src/components/Messages/TextWrapper.jsx b/client/src/components/Messages/TextWrapper.jsx index af38b56a5c..5719ee876b 100644 --- a/client/src/components/Messages/TextWrapper.jsx +++ b/client/src/components/Messages/TextWrapper.jsx @@ -142,7 +142,7 @@ export default function TextWrapper({ text }) { // map over the parts and wrap any text between tildes with tags const parts = text.split(markupRegex); const codeParts = inLineWrap(parts); - return <>{codeParts}; // return the wrapped text + return {codeParts}; // return the wrapped text } else { return {text}; }