fix: ensure custom params are not passed to non custom models

This commit is contained in:
Daniel Avila 2023-03-14 20:21:41 -04:00
parent 6e32f71565
commit 796d8031e8
10 changed files with 503 additions and 151 deletions

274
api/package-lock.json generated
View file

@ -19,7 +19,8 @@
"keyv-file": "^0.2.0", "keyv-file": "^0.2.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mongoose": "^6.9.0", "mongoose": "^6.9.0",
"openai": "^3.1.0" "openai": "^3.1.0",
"sanitize-html": "^2.10.0"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^2.0.20", "nodemon": "^2.0.20",
@ -2211,6 +2212,14 @@
} }
} }
}, },
"node_modules/deepmerge": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
"integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/defaults": { "node_modules/defaults": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
@ -2247,6 +2256,57 @@
"npm": "1.2.8000 || >= 1.4.16" "npm": "1.2.8000 || >= 1.4.16"
} }
}, },
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
"entities": "^4.2.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
]
},
"node_modules/domhandler": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
"dependencies": {
"domelementtype": "^2.3.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
"integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
"dependencies": {
"dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0",
"domhandler": "^5.0.1"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dotenv": { "node_modules/dotenv": {
"version": "16.0.3", "version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@ -2278,6 +2338,17 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/entities": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
"integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/escape-html": { "node_modules/escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -2751,6 +2822,24 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/htmlparser2": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
"integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
"domutils": "^3.0.1",
"entities": "^4.3.0"
}
},
"node_modules/http-errors": { "node_modules/http-errors": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@ -2958,6 +3047,14 @@
"node": ">=0.12.0" "node": ">=0.12.0"
} }
}, },
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-stream": { "node_modules/is-stream": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@ -3273,6 +3370,17 @@
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
}, },
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/negotiator": { "node_modules/negotiator": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@ -3469,6 +3577,11 @@
"p-defer": "^3.0.0" "p-defer": "^3.0.0"
} }
}, },
"node_modules/parse-srcset": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
"integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
},
"node_modules/parseurl": { "node_modules/parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -3577,6 +3690,29 @@
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz",
"integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==" "integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g=="
}, },
"node_modules/postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/process": { "node_modules/process": {
"version": "0.11.10", "version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@ -3796,6 +3932,30 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/sanitize-html": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz",
"integrity": "sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ==",
"dependencies": {
"deepmerge": "^4.2.2",
"escape-string-regexp": "^4.0.0",
"htmlparser2": "^8.0.0",
"is-plain-object": "^5.0.0",
"parse-srcset": "^1.0.2",
"postcss": "^8.3.11"
}
},
"node_modules/sanitize-html/node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/saslprep": { "node_modules/saslprep": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
@ -3985,6 +4145,14 @@
"atomic-sleep": "^1.0.0" "atomic-sleep": "^1.0.0"
} }
}, },
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sparse-bitfield": { "node_modules/sparse-bitfield": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
@ -6275,6 +6443,11 @@
"ms": "2.1.2" "ms": "2.1.2"
} }
}, },
"deepmerge": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
"integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og=="
},
"defaults": { "defaults": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
@ -6298,6 +6471,39 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
}, },
"dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"requires": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
"entities": "^4.2.0"
}
},
"domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
},
"domhandler": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
"requires": {
"domelementtype": "^2.3.0"
}
},
"domutils": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
"integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
"requires": {
"dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0",
"domhandler": "^5.0.1"
}
},
"dotenv": { "dotenv": {
"version": "16.0.3", "version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@ -6323,6 +6529,11 @@
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
}, },
"entities": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
"integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -6687,6 +6898,17 @@
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
}, },
"htmlparser2": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
"integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
"requires": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
"domutils": "^3.0.1",
"entities": "^4.3.0"
}
},
"http-errors": { "http-errors": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@ -6826,6 +7048,11 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true "dev": true
}, },
"is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
},
"is-stream": { "is-stream": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@ -7074,6 +7301,11 @@
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
}, },
"nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
},
"negotiator": { "negotiator": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@ -7217,6 +7449,11 @@
"p-defer": "^3.0.0" "p-defer": "^3.0.0"
} }
}, },
"parse-srcset": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
"integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
},
"parseurl": { "parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -7303,6 +7540,16 @@
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz",
"integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==" "integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g=="
}, },
"postcss": {
"version": "8.4.21",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
"integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
},
"process": { "process": {
"version": "0.11.10", "version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@ -7458,6 +7705,26 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"sanitize-html": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz",
"integrity": "sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ==",
"requires": {
"deepmerge": "^4.2.2",
"escape-string-regexp": "^4.0.0",
"htmlparser2": "^8.0.0",
"is-plain-object": "^5.0.0",
"parse-srcset": "^1.0.2",
"postcss": "^8.3.11"
},
"dependencies": {
"escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
}
}
},
"saslprep": { "saslprep": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
@ -7615,6 +7882,11 @@
"atomic-sleep": "^1.0.0" "atomic-sleep": "^1.0.0"
} }
}, },
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
},
"sparse-bitfield": { "sparse-bitfield": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",

View file

@ -29,7 +29,8 @@
"keyv-file": "^0.2.0", "keyv-file": "^0.2.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mongoose": "^6.9.0", "mongoose": "^6.9.0",
"openai": "^3.1.0" "openai": "^3.1.0",
"sanitize-html": "^2.10.0"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^2.0.20", "nodemon": "^2.0.20",

View file

@ -7,7 +7,7 @@ const {
titleConvo, titleConvo,
askClient, askClient,
browserClient, browserClient,
customClient, customClient
// detectCode // detectCode
} = require('../../app/'); } = require('../../app/');
const { getConvo, saveMessage, getConvoTitle, saveConvo } = require('../../models'); const { getConvo, saveMessage, getConvoTitle, saveConvo } = require('../../models');
@ -18,7 +18,7 @@ router.use('/bing', askBing);
router.use('/sydney', askSydney); router.use('/sydney', askSydney);
router.post('/', async (req, res) => { router.post('/', async (req, res) => {
let { model, text, parentMessageId, conversationId: oldConversationId , ...convo } = req.body; let { model, text, parentMessageId, conversationId: oldConversationId, ...convo } = req.body;
if (text.length === 0) { if (text.length === 0) {
return handleError(res, { text: 'Prompt empty or too short' }); return handleError(res, { text: 'Prompt empty or too short' });
} }
@ -26,14 +26,14 @@ router.post('/', async (req, res) => {
const conversationId = oldConversationId || crypto.randomUUID(); const conversationId = oldConversationId || crypto.randomUUID();
const userMessageId = crypto.randomUUID(); const userMessageId = crypto.randomUUID();
const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000' const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000';
let userMessage = { let userMessage = {
messageId: userMessageId, messageId: userMessageId,
sender: 'User', sender: 'User',
text, text,
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
conversationId, conversationId,
isCreatedByUser: true isCreatedByUser: true
}; };
console.log('ask log', { console.log('ask log', {
@ -55,27 +55,28 @@ router.post('/', async (req, res) => {
await saveConvo({ ...userMessage, model, ...convo }); await saveConvo({ ...userMessage, model, ...convo });
return await ask({ return await ask({
userMessage, userMessage,
model, model,
convo, convo,
preSendRequest: true, preSendRequest: true,
req, res req,
res
}); });
}) });
router.post('/regenerate', async (req, res) => { router.post('/regenerate', async (req, res) => {
const { parentMessageId, model, chatGptLabel, promptPrefix } = req.body; const { model } = req.body;
const oldUserMessage = await getMessages({ messageId: req.body }) const oldUserMessage = await getMessages({ messageId: req.body });
if (oldUserMessage) { if (oldUserMessage) {
const convo = await getConvo(userMessage?.conversationId) const convo = await getConvo(userMessage?.conversationId);
const userMessageId = crypto.randomUUID(); const userMessageId = crypto.randomUUID();
let userMessage = { let userMessage = {
...userMessage, ...userMessage,
messageId: userMessageId, messageId: userMessageId
}; };
console.log('ask log for regeneration', { console.log('ask log for regeneration', {
@ -85,14 +86,14 @@ router.post('/regenerate', async (req, res) => {
}); });
return await ask({ return await ask({
userMessage, userMessage,
model, model,
convo, convo,
preSendRequest: false, preSendRequest: false,
req, res req,
res
}); });
} else } else return handleError(res, { text: 'Parent message not found' });
return handleError(res, { text: 'Parent message not found' });
// if (model === 'chatgptCustom' && !chatGptLabel && conversationId) { // if (model === 'chatgptCustom' && !chatGptLabel && conversationId) {
// const convo = await getConvo({ conversationId }); // const convo = await getConvo({ conversationId });
@ -106,15 +107,21 @@ router.post('/regenerate', async (req, res) => {
// await saveConvo({ ...userMessage, model, chatGptLabel, promptPrefix }); // await saveConvo({ ...userMessage, model, chatGptLabel, promptPrefix });
}); });
const ask = async ({ const ask = async ({
userMessage, userMessage,
overrideParentMessageId = null, overrideParentMessageId = null,
model, model,
convo, convo,
preSendRequest = true, preSendRequest = true,
req, res req,
res
}) => { }) => {
let { sender, text, parentMessageId: userParentMessageId, conversationId, messageId: userMessageId } = userMessage; let {
text,
parentMessageId: userParentMessageId,
conversationId,
messageId: userMessageId
} = userMessage;
let client; let client;
@ -134,14 +141,13 @@ const ask = async ({
'X-Accel-Buffering': 'no' 'X-Accel-Buffering': 'no'
}); });
if (preSendRequest) if (preSendRequest) sendMessage(res, { message: userMessage, created: true });
sendMessage(res, { message: userMessage, created: true });
try { try {
const progressCallback = createOnProgress(); const progressCallback = createOnProgress();
let gptResponse = await client({ let gptResponse = await client({
text, text,
onProgress: progressCallback.call(null, model, {res, text }), onProgress: progressCallback.call(null, model, { res, text }),
convo: { convo: {
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
conversationId, conversationId,
@ -168,16 +174,20 @@ const ask = async ({
gptResponse.text.toLowerCase().includes('no response') || gptResponse.text.toLowerCase().includes('no response') ||
gptResponse.text.toLowerCase().includes('no answer') gptResponse.text.toLowerCase().includes('no answer')
) { ) {
await saveMessage({ await saveMessage({
messageId: crypto.randomUUID(), sender: model, messageId: crypto.randomUUID(),
conversationId, parentMessageId: overrideParentMessageId || userMessageId, sender: model,
error: true, text: 'Prompt empty or too short'}); conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
error: true,
text: 'Prompt empty or too short'
});
return handleError(res, { text: 'Prompt empty or too short' }); return handleError(res, { text: 'Prompt empty or too short' });
} }
gptResponse.sender = model === 'chatgptCustom' ? convo.chatGptLabel : model; gptResponse.sender = model === 'chatgptCustom' ? convo.chatGptLabel : model;
gptResponse.model = model;
// gptResponse.final = true; // gptResponse.final = true;
// gptResponse.text = await detectCode(gptResponse.text);
gptResponse.text = await handleText(gptResponse.text); gptResponse.text = await handleText(gptResponse.text);
if (convo.chatGptLabel?.length > 0 && model === 'chatgptCustom') { if (convo.chatGptLabel?.length > 0 && model === 'chatgptCustom') {
@ -189,14 +199,14 @@ const ask = async ({
} }
// override the parentMessageId, for the regeneration. // override the parentMessageId, for the regeneration.
gptResponse.parentMessageId = overrideParentMessageId || userMessageId gptResponse.parentMessageId = overrideParentMessageId || userMessageId;
await saveMessage(gptResponse); await saveMessage(gptResponse);
await saveConvo(gptResponse); await saveConvo(gptResponse);
sendMessage(res, { sendMessage(res, {
title: await getConvoTitle(conversationId), title: await getConvoTitle(conversationId),
final: true, final: true,
requestMessage: userMessage, requestMessage: userMessage,
responseMessage: gptResponse responseMessage: gptResponse
}); });
res.end(); res.end();
@ -213,15 +223,19 @@ const ask = async ({
await saveConvo({ await saveConvo({
conversationId, conversationId,
title title
}) });
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
// await deleteMessages({ messageId: userMessageId }); // await deleteMessages({ messageId: userMessageId });
const errorMessage = { const errorMessage = {
messageId: crypto.randomUUID(), sender: model, messageId: crypto.randomUUID(),
conversationId, parentMessageId: overrideParentMessageId || userMessageId, sender: model,
error: true, text: error.message} conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
error: true,
text: error.message
};
await saveMessage(errorMessage); await saveMessage(errorMessage);
handleError(res, errorMessage); handleError(res, errorMessage);
} }

View file

@ -7,26 +7,32 @@ const { handleError, sendMessage, createOnProgress, handleText } = require('./ha
const citationRegex = /\[\^\d+?\^]/g; const citationRegex = /\[\^\d+?\^]/g;
router.post('/', async (req, res) => { router.post('/', async (req, res) => {
const { model, text, parentMessageId, conversationId: oldConversationId, ...convo } = req.body; const {
model,
text,
parentMessageId,
conversationId: oldConversationId,
...convo
} = req.body;
if (text.length === 0) { if (text.length === 0) {
return handleError(res, { text: 'Prompt empty or too short' }); return handleError(res, { text: 'Prompt empty or too short' });
} }
const conversationId = oldConversationId || crypto.randomUUID(); const conversationId = oldConversationId || crypto.randomUUID();
const isNewConversation = !oldConversationId const isNewConversation = !oldConversationId;
const userMessageId = crypto.randomUUID(); const userMessageId = crypto.randomUUID();
const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000' const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000';
let userMessage = { let userMessage = {
messageId: userMessageId, messageId: userMessageId,
sender: 'User', sender: 'User',
text, text,
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
conversationId, conversationId,
isCreatedByUser: true isCreatedByUser: true
}; };
console.log('ask log', { console.log('ask log', {
model, model,
...userMessage, ...userMessage,
...convo ...convo
@ -37,24 +43,31 @@ router.post('/', async (req, res) => {
return await ask({ return await ask({
isNewConversation, isNewConversation,
userMessage, userMessage,
model, model,
convo, convo,
preSendRequest: true, preSendRequest: true,
req, res req,
res
}); });
}) });
const ask = async ({ const ask = async ({
isNewConversation, isNewConversation,
overrideParentMessageId = null, overrideParentMessageId = null,
userMessage, userMessage,
model, model,
convo, convo,
preSendRequest = true, preSendRequest = true,
req, res req,
res
}) => { }) => {
let { sender, text, parentMessageId: userParentMessageId, conversationId, messageId: userMessageId } = userMessage; let {
text,
parentMessageId: userParentMessageId,
conversationId,
messageId: userMessageId
} = userMessage;
res.writeHead(200, { res.writeHead(200, {
Connection: 'keep-alive', Connection: 'keep-alive',
@ -64,19 +77,22 @@ const ask = async ({
'X-Accel-Buffering': 'no' 'X-Accel-Buffering': 'no'
}); });
if (preSendRequest) if (preSendRequest) sendMessage(res, { message: userMessage, created: true });
sendMessage(res, { message: userMessage, created: true });
try { try {
const progressCallback = createOnProgress(); const progressCallback = createOnProgress();
let response = await askBing({ let response = await askBing({
text, text,
onProgress: progressCallback.call(null, model, {res, text, parentMessageId: overrideParentMessageId || userMessageId }), onProgress: progressCallback.call(null, model, {
res,
text,
parentMessageId: overrideParentMessageId || userMessageId
}),
convo: { convo: {
...convo, ...convo,
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
conversationId, conversationId
}, }
}); });
console.log('BING RESPONSE', response); console.log('BING RESPONSE', response);
@ -88,13 +104,16 @@ const ask = async ({
userMessage.conversationId = response.conversationId || conversationId; userMessage.conversationId = response.conversationId || conversationId;
userMessage.invocationId = response.invocationId; userMessage.invocationId = response.invocationId;
await saveMessage(userMessage); await saveMessage(userMessage);
// Bing API will not use our conversationId at the first time, // Bing API will not use our conversationId at the first time,
// so change the placeholder conversationId to the real one. // so change the placeholder conversationId to the real one.
// Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId, // Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId,
// but in this situation, don't change the conversationId, but create new convo. // but in this situation, don't change the conversationId, but create new convo.
if (conversationId != userMessage.conversationId && isNewConversation) if (conversationId != userMessage.conversationId && isNewConversation)
await saveConvo({ conversationId: conversationId, newConversationId: userMessage.conversationId }); await saveConvo({
conversationId: conversationId,
newConversationId: userMessage.conversationId
});
conversationId = userMessage.conversationId; conversationId = userMessage.conversationId;
response.text = response.response; response.text = response.response;
@ -107,7 +126,8 @@ const ask = async ({
// response.final = true; // response.final = true;
// override the parentMessageId, for the regeneration. // override the parentMessageId, for the regeneration.
response.parentMessageId = overrideParentMessageId || response.parentMessageId || userMessageId; response.parentMessageId =
overrideParentMessageId || response.parentMessageId || userMessageId;
const links = getCitations(response); const links = getCitations(response);
response.text = response.text =
@ -116,11 +136,11 @@ const ask = async ({
response.text = await handleText(response.text); response.text = await handleText(response.text);
await saveMessage(response); await saveMessage(response);
await saveConvo({...response, model, ...convo}); await saveConvo({ ...response, model, chatGptLabel: null, promptPrefix: null, ...convo });
sendMessage(res, { sendMessage(res, {
title: await getConvoTitle(conversationId), title: await getConvoTitle(conversationId),
final: true, final: true,
requestMessage: userMessage, requestMessage: userMessage,
responseMessage: response responseMessage: response
}); });
res.end(); res.end();
@ -133,19 +153,23 @@ const ask = async ({
}); });
console.log('CONVERSATION TITLE', title); console.log('CONVERSATION TITLE', title);
await saveConvo({ await saveConvo({
conversationId, conversationId,
title title
}) });
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
// await deleteMessages({ messageId: userMessageId }); // await deleteMessages({ messageId: userMessageId });
const errorMessage = { const errorMessage = {
messageId: crypto.randomUUID(), sender: model, messageId: crypto.randomUUID(),
conversationId, parentMessageId: overrideParentMessageId || userMessageId, sender: model,
error: true, text: error.message} conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
error: true,
text: error.message
};
await saveMessage(errorMessage); await saveMessage(errorMessage);
handleError(res, errorMessage); handleError(res, errorMessage);
} }

View file

@ -7,26 +7,32 @@ const { handleError, sendMessage, createOnProgress, handleText } = require('./ha
const citationRegex = /\[\^\d+?\^]/g; const citationRegex = /\[\^\d+?\^]/g;
router.post('/', async (req, res) => { router.post('/', async (req, res) => {
const { model, text, parentMessageId, conversationId: oldConversationId, ...convo } = req.body; const {
model,
text,
parentMessageId,
conversationId: oldConversationId,
...convo
} = req.body;
if (text.length === 0) { if (text.length === 0) {
return handleError(res, { text: 'Prompt empty or too short' }); return handleError(res, { text: 'Prompt empty or too short' });
} }
const conversationId = oldConversationId || crypto.randomUUID(); const conversationId = oldConversationId || crypto.randomUUID();
const isNewConversation = !oldConversationId const isNewConversation = !oldConversationId;
const userMessageId = crypto.randomUUID(); const userMessageId = crypto.randomUUID();
const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000' const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000';
let userMessage = { let userMessage = {
messageId: userMessageId, messageId: userMessageId,
sender: 'User', sender: 'User',
text, text,
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
conversationId, conversationId,
isCreatedByUser: true isCreatedByUser: true
}; };
console.log('ask log', { console.log('ask log', {
model, model,
...userMessage, ...userMessage,
...convo ...convo
@ -37,24 +43,31 @@ router.post('/', async (req, res) => {
return await ask({ return await ask({
isNewConversation, isNewConversation,
userMessage, userMessage,
model, model,
convo, convo,
preSendRequest: true, preSendRequest: true,
req, res req,
res
}); });
}) });
const ask = async ({ const ask = async ({
isNewConversation, isNewConversation,
overrideParentMessageId = null, overrideParentMessageId = null,
userMessage, userMessage,
model, model,
convo, convo,
preSendRequest = true, preSendRequest = true,
req, res req,
res
}) => { }) => {
let { sender, text, parentMessageId: userParentMessageId, conversationId, messageId: userMessageId } = userMessage; let {
text,
parentMessageId: userParentMessageId,
conversationId,
messageId: userMessageId
} = userMessage;
res.writeHead(200, { res.writeHead(200, {
Connection: 'keep-alive', Connection: 'keep-alive',
@ -64,19 +77,22 @@ const ask = async ({
'X-Accel-Buffering': 'no' 'X-Accel-Buffering': 'no'
}); });
if (preSendRequest) if (preSendRequest) sendMessage(res, { message: userMessage, created: true });
sendMessage(res, { message: userMessage, created: true });
try { try {
const progressCallback = createOnProgress(); const progressCallback = createOnProgress();
let response = await askSydney({ let response = await askSydney({
text, text,
onProgress: progressCallback.call(null, model, {res, text, parentMessageId: overrideParentMessageId || userMessageId }), onProgress: progressCallback.call(null, model, {
res,
text,
parentMessageId: overrideParentMessageId || userMessageId
}),
convo: { convo: {
parentMessageId: userParentMessageId, parentMessageId: userParentMessageId,
conversationId, conversationId,
...convo ...convo
}, }
}); });
console.log('SYDNEY RESPONSE', response); console.log('SYDNEY RESPONSE', response);
@ -89,13 +105,11 @@ const ask = async ({
userMessage.invocationId = response.invocationId; userMessage.invocationId = response.invocationId;
// Unlike gpt and bing, Sydney will never accept our given userMessage.messageId, it will generate its own one. // Unlike gpt and bing, Sydney will never accept our given userMessage.messageId, it will generate its own one.
await saveMessage(userMessage); await saveMessage(userMessage);
// Save sydney response // Save sydney response
// response.id = response.messageId; // response.id = response.messageId;
response.invocationId = convo.invocationId ? convo.invocationId + 1 : 1; response.invocationId = convo.invocationId ? convo.invocationId + 1 : 1;
response.conversationId = conversationId response.conversationId = conversationId ? conversationId : crypto.randomUUID();
? conversationId
: crypto.randomUUID();
response.conversationSignature = convo.conversationSignature response.conversationSignature = convo.conversationSignature
? convo.conversationSignature ? convo.conversationSignature
: crypto.randomUUID(); : crypto.randomUUID();
@ -108,7 +122,8 @@ const ask = async ({
// response.final = true; // response.final = true;
// override the parentMessageId, for the regeneration. // override the parentMessageId, for the regeneration.
response.parentMessageId = overrideParentMessageId || response.parentMessageId || userMessageId; response.parentMessageId =
overrideParentMessageId || response.parentMessageId || userMessageId;
const links = getCitations(response); const links = getCitations(response);
response.text = response.text =
@ -124,17 +139,20 @@ const ask = async ({
// so change the placeholder conversationId to the real one. // so change the placeholder conversationId to the real one.
// Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId, // Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId,
// but in this situation, don't change the conversationId, but create new convo. // but in this situation, don't change the conversationId, but create new convo.
if (conversationId != userMessage.conversationId && isNewConversation) if (conversationId != userMessage.conversationId && isNewConversation)
await saveConvo({ conversationId: conversationId, newConversationId: userMessage.conversationId }); await saveConvo({
conversationId: conversationId,
newConversationId: userMessage.conversationId
});
conversationId = userMessage.conversationId; conversationId = userMessage.conversationId;
// Save sydney response & convo, then send // Save sydney response & convo, then send
await saveMessage(response); await saveMessage(response);
await saveConvo({...response, model, ...convo}); await saveConvo({ ...response, model, chatGptLabel: null, promptPrefix: null, ...convo });
sendMessage(res, { sendMessage(res, {
title: await getConvoTitle(conversationId), title: await getConvoTitle(conversationId),
final: true, final: true,
requestMessage: userMessage, requestMessage: userMessage,
responseMessage: response responseMessage: response
}); });
res.end(); res.end();
@ -147,19 +165,23 @@ const ask = async ({
}); });
console.log('CONVERSATION TITLE', title); console.log('CONVERSATION TITLE', title);
await saveConvo({ await saveConvo({
conversationId, conversationId,
title title
}) });
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
// await deleteMessages({ messageId: userMessageId }); // await deleteMessages({ messageId: userMessageId });
const errorMessage = { const errorMessage = {
messageId: crypto.randomUUID(), sender: model, messageId: crypto.randomUUID(),
conversationId, parentMessageId: overrideParentMessageId || userMessageId, sender: model,
error: true, text: error.message} conversationId,
parentMessageId: overrideParentMessageId || userMessageId,
error: true,
text: error.message
};
await saveMessage(errorMessage); await saveMessage(errorMessage);
handleError(res, errorMessage); handleError(res, errorMessage);
} }

View file

@ -11125,9 +11125,9 @@
} }
}, },
"node_modules/webpack": { "node_modules/webpack": {
"version": "5.75.0", "version": "5.76.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz",
"integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",
@ -19431,9 +19431,9 @@
} }
}, },
"webpack": { "webpack": {
"version": "5.75.0", "version": "5.76.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz",
"integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/eslint-scope": "^3.7.3", "@types/eslint-scope": "^3.7.3",

View file

@ -42,6 +42,8 @@ export default function Conversation({
dispatch(setEmptyMessage()); dispatch(setEmptyMessage());
const convo = { title, error: false, conversationId: id, chatGptLabel, promptPrefix }; const convo = { title, error: false, conversationId: id, chatGptLabel, promptPrefix };
// debugging
console.log(model, chatGptLabel, promptPrefix);
if (bingData) { if (bingData) {
const { const {
@ -77,17 +79,19 @@ export default function Conversation({
if (chatGptLabel) { if (chatGptLabel) {
dispatch(setModel('chatgptCustom')); dispatch(setModel('chatgptCustom'));
dispatch(setCustomModel(chatGptLabel.toLowerCase()));
} else { } else {
dispatch(setModel(model)); dispatch(setModel(model));
}
if (modelMap[model.toLowerCase()]) {
console.log('sender', model);
dispatch(setCustomModel(model.toLowerCase()));
} else {
dispatch(setCustomModel(null)); dispatch(setCustomModel(null));
} }
// if (modelMap[chatGptLabel.toLowerCase()]) {
// console.log('custom model', chatGptLabel);
// dispatch(setCustomModel(chatGptLabel.toLowerCase()));
// } else {
// dispatch(setCustomModel(null));
// }
dispatch(setMessages(data)); dispatch(setMessages(data));
dispatch(setCustomGpt(convo)); dispatch(setCustomGpt(convo));
dispatch(setText('')); dispatch(setText(''));

View file

@ -46,7 +46,10 @@ export default function ModelMenu() {
mutate(); mutate();
try { try {
const lastSelected = JSON.parse(localStorage.getItem('model')); const lastSelected = JSON.parse(localStorage.getItem('model'));
if (lastSelected && lastSelected !== 'chatgptCustom' && initial[lastSelected]) {
if (lastSelected === 'chatgptCustom') {
return;
} else if (initial[lastSelected]) {
dispatch(setModel(lastSelected)); dispatch(setModel(lastSelected));
} }
} catch (err) { } catch (err) {
@ -72,6 +75,7 @@ export default function ModelMenu() {
dispatch(setModel(value)); dispatch(setModel(value));
dispatch(setDisabled(false)); dispatch(setDisabled(false));
dispatch(setCustomModel(null)); dispatch(setCustomModel(null));
dispatch(setCustomGpt({ chatGptLabel: null, promptPrefix: null }));
} else if (!initial[value]) { } else if (!initial[value]) {
const chatGptLabel = modelMap[value]?.chatGptLabel; const chatGptLabel = modelMap[value]?.chatGptLabel;
const promptPrefix = modelMap[value]?.promptPrefix; const promptPrefix = modelMap[value]?.promptPrefix;

View file

@ -11,22 +11,23 @@ import { increasePage, decreasePage, setPage, setConvos, setPages } from '~/stor
export default function Nav({ navVisible, setNavVisible }) { export default function Nav({ navVisible, setNavVisible }) {
const dispatch = useDispatch(); const dispatch = useDispatch();
const [isHovering, setIsHovering] = useState(false); const [isHovering, setIsHovering] = useState(false);
const { conversationId, convos, pages, pageNumber, refreshConvoHint } = useSelector((state) => state.convo); const { conversationId, convos, pages, pageNumber, refreshConvoHint } = useSelector(
(state) => state.convo
);
const onSuccess = (data) => { const onSuccess = (data) => {
const { conversations, pages } = data; const { conversations, pages } = data;
if (pageNumber > pages) if (pageNumber > pages) {
dispatch(setPage(pages)); dispatch(setPage(pages));
else } else {
dispatch(setConvos(conversations)); dispatch(setConvos(conversations));
dispatch(setPages(pages)); dispatch(setPages(pages));
}
}; };
const { data, isLoading, mutate } = swr( const { data, isLoading, mutate } = swr(`/api/convos?pageNumber=${pageNumber}`, onSuccess, {
`/api/convos?pageNumber=${pageNumber}`, revalidateOnMount: false
onSuccess, });
{revalidateOnMount: false}
);
const containerRef = useRef(null); const containerRef = useRef(null);
const scrollPositionRef = useRef(null); const scrollPositionRef = useRef(null);
@ -36,23 +37,25 @@ export default function Nav({ navVisible, setNavVisible }) {
if (container) { if (container) {
scrollPositionRef.current = container.scrollTop; scrollPositionRef.current = container.scrollTop;
} }
} };
const nextPage = async () => { const nextPage = async () => {
moveToTop() moveToTop();
dispatch(increasePage()); dispatch(increasePage());
await mutate(); await mutate();
}; };
const previousPage = async () => { const previousPage = async () => {
moveToTop() moveToTop();
dispatch(decreasePage()); dispatch(decreasePage());
await mutate(); await mutate();
}; };
useEffect(() => {mutate()}, [pageNumber, conversationId, refreshConvoHint]); useEffect(() => {
mutate();
}, [pageNumber, conversationId, refreshConvoHint]);
useEffect(() => { useEffect(() => {
const container = containerRef.current; const container = containerRef.current;
@ -66,14 +69,14 @@ export default function Nav({ navVisible, setNavVisible }) {
}, [data]); }, [data]);
useEffect(() => { useEffect(() => {
setNavVisible(false) setNavVisible(false);
}, [conversationId, ]) }, [conversationId]);
const toggleNavVisible = () => { const toggleNavVisible = () => {
setNavVisible((prev) => { setNavVisible((prev) => {
return !prev return !prev;
}) });
} };
const containerClasses = const containerClasses =
isLoading && pageNumber === 1 isLoading && pageNumber === 1
@ -82,7 +85,12 @@ export default function Nav({ navVisible, setNavVisible }) {
return ( return (
<> <>
<div className={"dark nav bg-gray-900 md:fixed md:inset-y-0 md:flex md:w-[260px] md:flex-col" + (navVisible?' active':'')}> <div
className={
'nav dark bg-gray-900 md:fixed md:inset-y-0 md:flex md:w-[260px] md:flex-col' +
(navVisible ? ' active' : '')
}
>
<div className="flex h-full min-h-0 flex-col "> <div className="flex h-full min-h-0 flex-col ">
<div className="scrollbar-trigger flex h-full w-full flex-1 items-start border-white/20"> <div className="scrollbar-trigger flex h-full w-full flex-1 items-start border-white/20">
<nav className="flex h-full flex-1 flex-col space-y-1 p-2"> <nav className="flex h-full flex-1 flex-col space-y-1 p-2">
@ -117,7 +125,7 @@ export default function Nav({ navVisible, setNavVisible }) {
</div> </div>
<button <button
type="button" type="button"
className="nav-close-button -ml-0.5 -mt-0.5 inline-flex h-10 w-10 items-center justify-center rounded-md hover:text-gray-900 focus:outline-none focus:ring-white hover:text-white text-white" className="nav-close-button -ml-0.5 -mt-0.5 inline-flex h-10 w-10 items-center justify-center rounded-md text-white hover:text-gray-900 hover:text-white focus:outline-none focus:ring-white"
onClick={toggleNavVisible} onClick={toggleNavVisible}
> >
<span className="sr-only">Open sidebar</span> <span className="sr-only">Open sidebar</span>
@ -148,8 +156,10 @@ export default function Nav({ navVisible, setNavVisible }) {
</svg> </svg>
</button> </button>
</div> </div>
<div className={"nav-mask" + (navVisible?' active':'')} onClick={toggleNavVisible}> <div
</div> className={'nav-mask' + (navVisible ? ' active' : '')}
onClick={toggleNavVisible}
></div>
</> </>
); );
} }

View file

@ -6,8 +6,8 @@ const initialState = {
stopStream: false, stopStream: false,
disabled: false, disabled: false,
model: 'chatgpt', model: 'chatgpt',
promptPrefix: '', promptPrefix: null,
chatGptLabel: '', chatGptLabel: null,
customModel: null, customModel: null,
}; };
@ -34,6 +34,7 @@ const currentSlice = createSlice({
state.model = action.payload; state.model = action.payload;
}, },
setCustomGpt: (state, action) => { setCustomGpt: (state, action) => {
console.log('setCustomGpt', action.payload);
state.promptPrefix = action.payload.promptPrefix; state.promptPrefix = action.payload.promptPrefix;
state.chatGptLabel = action.payload.chatGptLabel; state.chatGptLabel = action.payload.chatGptLabel;
}, },