diff --git a/app/chatgpt.js b/app/chatgpt.js index c7eb1a926f..164839d6da 100644 --- a/app/chatgpt.js +++ b/app/chatgpt.js @@ -6,9 +6,9 @@ const ask = async (question, progressCallback, convo) => { const { ChatGPTAPI } = await import('chatgpt'); const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_KEY, messageStore }); let options = { - onProgress: (partialRes) => { + onProgress: async (partialRes) => { if (partialRes.text.length > 0) { - progressCallback(partialRes); + await progressCallback(partialRes); } } }; diff --git a/models/Message.js b/models/Message.js index 1529005ff2..b5c23d4f8e 100644 --- a/models/Message.js +++ b/models/Message.js @@ -32,11 +32,12 @@ const Message = mongoose.models.Message || mongoose.model('Message', messageSche module.exports = { saveMessage: async (message) => { - const { text, id, parentMessageId, conversationId } = message; + const { id, conversationId, parentMessageId, sender, text } = message; await Message.create({ id, conversationId, parentMessageId, + sender, text }); } diff --git a/models/dbConnect.js b/models/dbConnect.js index 1c3db7e47f..385d058838 100644 --- a/models/dbConnect.js +++ b/models/dbConnect.js @@ -25,12 +25,13 @@ async function dbConnect() { const opts = { useNewUrlParser: true, useUnifiedTopology: true, - bufferCommands: false, + bufferCommands: false // bufferMaxEntries: 0, // useFindAndModify: true, // useCreateIndex: true }; + mongoose.set('strictQuery', true); cached.promise = mongoose.connect(MONGO_URI, opts).then((mongoose) => { return mongoose; }); diff --git a/package-lock.json b/package-lock.json index ea2ceeab27..69b7f797b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "mongoose": "^6.9.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-textarea-autosize": "^8.4.0", "url": "^0.11.0" }, "devDependencies": { @@ -2855,7 +2856,6 @@ "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -2866,8 +2866,7 @@ "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { "version": "7.20.7", @@ -10290,6 +10289,22 @@ "react": "^18.2.0" } }, + "node_modules/react-textarea-autosize": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz", + "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -11607,6 +11622,43 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -14262,7 +14314,6 @@ "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.11" }, @@ -14270,8 +14321,7 @@ "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" } } }, @@ -19615,6 +19665,16 @@ "scheduler": "^0.23.0" } }, + "react-textarea-autosize": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz", + "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -20611,6 +20671,26 @@ } } }, + "use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "requires": {} + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "requires": { + "use-isomorphic-layout-effect": "^1.1.1" + } + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", diff --git a/package.json b/package.json index 17c79fb323..92eb57ca1f 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "mongoose": "^6.9.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-textarea-autosize": "^8.4.0", "url": "^0.11.0" }, "devDependencies": { diff --git a/server/index.js b/server/index.js index 5f67654f6c..71be42e526 100644 --- a/server/index.js +++ b/server/index.js @@ -4,9 +4,9 @@ const dbConnect = require('../models/dbConnect'); const { saveMessage } = require('../models/Message'); const crypto = require('crypto'); const path = require('path'); +const cors = require('cors'); const app = express(); const port = 3050; -const cors = require('cors'); app.use(cors()); app.use(express.json()); @@ -24,6 +24,7 @@ app.post('/ask', async (req, res) => { console.log(req.body); const { text, parentMessageId, conversationId } = req.body; const userMessageId = crypto.randomUUID(); + let userMessage = { id: userMessageId, sender: 'User', text }; res.writeHead(200, { Connection: 'keep-alive', @@ -34,9 +35,11 @@ app.post('/ask', async (req, res) => { }); let i = 0; - const progressCallback = (partial) => { - // console.log('partial', partial); + const progressCallback = async (partial) => { // console.log('partial', partial); if (i === 0) { + userMessage.parentMessageId = parentMessageId ? parentMessageId : partial.id; + userMessage.conversationId = conversationId ? conversationId : partial.conversationId; + await saveMessage(userMessage); res.write(`event: message\ndata: ${JSON.stringify({ ...partial, initial: true })}\n\n`); i++; } @@ -46,10 +49,11 @@ app.post('/ask', async (req, res) => { let gptResponse = await ask(text, progressCallback, { parentMessageId, conversationId }); if (!!parentMessageId) { - console.log('req parent vs res parent', parentMessageId, gptResponse.parentMessageId); - gptResponse = { ...gptResponse, parentMessageId, sender: 'GPT' }; + // console.log('req parent vs res parent', parentMessageId, gptResponse.parentMessageId); + gptResponse = { ...gptResponse, parentMessageId }; } + gptResponse.sender = 'GPT'; await saveMessage(gptResponse); res.write(`event: message\ndata: ${JSON.stringify(gptResponse)}\n\n`);