diff --git a/api/app/citeText.js b/api/app/citeText.js index fc85c3285f..8998535fea 100644 --- a/api/app/citeText.js +++ b/api/app/citeText.js @@ -1,27 +1,29 @@ -/* -// example -const ex = "Fetch API[^1^], Axios[^3^], or XMLHttpRequest[^2^]. Each of these..."; -const links = [ - 'https://www.freecodecamp.org/news/here-is-the-most-popular-ways-to-make-an-http-request-in-javascript-954ce8c95aaa/', - 'https://stackoverflow.com/questions/247483/http-get-request-in-javascript', - 'https://livecodestream.dev/post/5-ways-to-make-http-requests-in-javascript/' -]; - -const regex = /\[\^\d+?\^]/g; - -const citations = Array.from(new Set(ex.match(regex))); -const linkMap = {}; -citations.forEach(citation => { - const digit = citation.match(/\d+?/g)[0]; - linkMap[citation] = links[digit - 1]; -}); -*/ const citationRegex = /\[\^\d+?\^]/g; -const citeText = (res) => { +const citeText = (res, noLinks = false) => { + let result = res.text || res; + const citations = Array.from(new Set(result.match(citationRegex))); + if (citations?.length === 0) return result; + + if (noLinks) { + citations.forEach((citation) => { + const digit = citation.match(/\d+?/g)[0]; + result = result.replaceAll(citation, `[${digit}](#)`); + }); + + return result; + } + let sources = res.details.sourceAttributions; - if (!sources) return res.response; + if (sources?.length === 0) return result; sources = sources.map((source) => source.seeMoreUrl); + + citations.forEach((citation) => { + const digit = citation.match(/\d+?/g)[0]; + result = result.replaceAll(citation, `[${digit}](${sources[digit - 1]})`); + }); + + return result; }; -module.exports = citeText; \ No newline at end of file +module.exports = citeText; diff --git a/api/app/getCitations.js b/api/app/getCitations.js index 46d4e72c07..0061daff0d 100644 --- a/api/app/getCitations.js +++ b/api/app/getCitations.js @@ -5,7 +5,7 @@ const getCitations = (res) => { const textBlocks = res.details.adaptiveCards[0].body; if (!textBlocks) return ''; let links = textBlocks[textBlocks.length - 1]?.text.match(regex); - if (links?.length === 0) return ''; + if (links?.length === 0 || !links) return ''; links = links.map((link) => '- ' + link.trim()); return 'Learn more:\n' + links.join('\n'); }; diff --git a/api/app/index.js b/api/app/index.js index 0a829609fd..7b61f8de95 100644 --- a/api/app/index.js +++ b/api/app/index.js @@ -5,6 +5,7 @@ const { askBing } = require('./bingai'); const { askSydney } = require('./sydney'); const titleConvo = require('./titleConvo'); const getCitations = require('./getCitations'); +const citeText = require('./citeText'); const detectCode = require('./detectCode'); module.exports = { @@ -15,5 +16,6 @@ module.exports = { askSydney, titleConvo, getCitations, + citeText, detectCode }; \ No newline at end of file diff --git a/api/server/routes/askSydney.js b/api/server/routes/askSydney.js index 1755a40d16..fc6fe9f5ce 100644 --- a/api/server/routes/askSydney.js +++ b/api/server/routes/askSydney.js @@ -1,7 +1,7 @@ const express = require('express'); const crypto = require('crypto'); const router = express.Router(); -const { titleConvo, getCitations, askSydney } = require('../../app/'); +const { titleConvo, getCitations, citeText, askSydney } = require('../../app/'); const { saveMessage, deleteMessages, saveConvo, getConvoTitle } = require('../../models'); const { handleError, sendMessage } = require('./handlers'); @@ -29,6 +29,7 @@ router.post('/', async (req, res) => { const progressCallback = async (partial) => { tokens += partial === text ? '' : partial; // tokens = appendCode(tokens); + tokens = citeText(tokens, true); sendMessage(res, { text: tokens, message: true }); }; @@ -60,6 +61,7 @@ router.post('/', async (req, res) => { ? convo.conversationSignature : crypto.randomUUID(); response.text = response.response; + delete response.response; response.suggestions = response.details.suggestedResponses && response.details.suggestedResponses.map((s) => s.text); @@ -67,7 +69,7 @@ router.post('/', async (req, res) => { response.final = true; const links = getCitations(response); - console.log('sydney links', links); + response.text = citeText(response); // Save user message userMessage.conversationId = response.conversationId; diff --git a/client/src/utils/handleSubmit.js b/client/src/utils/handleSubmit.js index 02f89f21d6..09e1aa52b6 100644 --- a/client/src/utils/handleSubmit.js +++ b/client/src/utils/handleSubmit.js @@ -24,7 +24,6 @@ export default function handleSubmit({ const isBing = model === 'bingai' || model === 'sydney'; if (isBing && convo.conversationId) { - console.log('bing convo', convo); payload = { ...payload, jailbreakConversationId: convo.jailbreakConversationId, diff --git a/client/webpack.config.js b/client/webpack.config.js index 2461658544..3c44be5385 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -10,6 +10,7 @@ module.exports = { * to use its built-in optimizations accordingly. default is production */ mode: 'development', + cache: false, /** "entry" * the entry point */