From 379e470e386ae71137172d9bab8b49826a0b97bb Mon Sep 17 00:00:00 2001 From: Danny Avila <110412045+danny-avila@users.noreply.github.com> Date: Sat, 30 Dec 2023 12:34:23 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9fix:=20Handle=20Abort=20Message=20E?= =?UTF-8?q?dge=20Cases=20(#1462)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: bump langchain to v0.0.213 from v0.0.186 * fix: handle abort edge cases: - abort message server-side if response experienced error mid-generation - attempt to recover message if aborting resulted in error - if abortKey is not provided, use conversationId if it exists - if headers were already sent, send an Event stream message - issue warning for possible Google censor/filter refactor(streamResponse): for `sendError`, allow passing overrides so that error can include partial generation, improve typing for `sendMessage` * chore(MessageContent): remove eslint warning for unused `i`, rephrase unfinished message text * fix(useSSE): avoid invoking cancelHandler if the abort response was 404 * chore(TMessage): remove unnecessary, unused legacy message property `submitting` * chore(TMessage): remove unnecessary legacy message property `cancelled` * chore(abortMiddleware): remove unused `errorText` property to avoid confusion --- api/app/clients/BaseClient.js | 2 +- .../clients/prompts/formatMessages.spec.js | 1 - api/models/Message.js | 2 - api/models/schema/messageSchema.js | 4 - api/package.json | 2 +- api/server/controllers/AskController.js | 1 - api/server/controllers/EditController.js | 1 - api/server/middleware/abortMiddleware.js | 37 +- api/server/routes/ask/askChatGPTBrowser.js | 3 - api/server/routes/ask/bingAI.js | 4 - api/server/routes/ask/gptPlugins.js | 1 - api/server/routes/edit/gptPlugins.js | 1 - api/server/utils/streamResponse.js | 30 +- .../Chat/Messages/Content/MessageContent.tsx | 4 +- .../Nav/ExportConversation/ExportModal.jsx | 10 - client/src/hooks/useChatHelpers.ts | 1 - client/src/hooks/useSSE.ts | 13 +- package-lock.json | 618 +++++++++++++----- packages/data-provider/src/schemas.ts | 1 - 19 files changed, 529 insertions(+), 207 deletions(-) diff --git a/api/app/clients/BaseClient.js b/api/app/clients/BaseClient.js index b76883265a..ea63a3ce90 100644 --- a/api/app/clients/BaseClient.js +++ b/api/app/clients/BaseClient.js @@ -516,7 +516,7 @@ class BaseClient { } async saveMessageToDatabase(message, endpointOptions, user = null) { - await saveMessage({ ...message, user, unfinished: false, cancelled: false }); + await saveMessage({ ...message, user, unfinished: false }); await saveConvo(user, { conversationId: message.conversationId, endpoint: this.options.endpoint, diff --git a/api/app/clients/prompts/formatMessages.spec.js b/api/app/clients/prompts/formatMessages.spec.js index 0497e4c47a..636cdb1c8e 100644 --- a/api/app/clients/prompts/formatMessages.spec.js +++ b/api/app/clients/prompts/formatMessages.spec.js @@ -54,7 +54,6 @@ describe('formatMessage', () => { _id: '6512cdfb92cbf69fea615331', messageId: 'b620bf73-c5c3-4a38-b724-76886aac24c4', __v: 0, - cancelled: false, conversationId: '5c23d24f-941f-4aab-85df-127b596c8aa5', createdAt: Date.now(), error: false, diff --git a/api/models/Message.js b/api/models/Message.js index 270ff851f9..7cb9bdc377 100644 --- a/api/models/Message.js +++ b/api/models/Message.js @@ -18,7 +18,6 @@ module.exports = { isCreatedByUser = false, error, unfinished, - cancelled, files, isEdited = false, finish_reason = null, @@ -45,7 +44,6 @@ module.exports = { finish_reason, error, unfinished, - cancelled, tokenCount, plugin, plugins, diff --git a/api/models/schema/messageSchema.js b/api/models/schema/messageSchema.js index 4c0ff2521e..bcc28cd23b 100644 --- a/api/models/schema/messageSchema.js +++ b/api/models/schema/messageSchema.js @@ -68,10 +68,6 @@ const messageSchema = mongoose.Schema( type: Boolean, default: false, }, - cancelled: { - type: Boolean, - default: false, - }, error: { type: Boolean, default: false, diff --git a/api/package.json b/api/package.json index fe5731cbd2..56d1a7e59b 100644 --- a/api/package.json +++ b/api/package.json @@ -54,7 +54,7 @@ "keyv": "^4.5.4", "keyv-file": "^0.2.0", "klona": "^2.0.6", - "langchain": "^0.0.186", + "langchain": "^0.0.213", "librechat-data-provider": "*", "lodash": "^4.17.21", "meilisearch": "^0.33.0", diff --git a/api/server/controllers/AskController.js b/api/server/controllers/AskController.js index d1d9f8f7ad..ffaa10938c 100644 --- a/api/server/controllers/AskController.js +++ b/api/server/controllers/AskController.js @@ -62,7 +62,6 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { text: partialText, model: client.modelOptions.model, unfinished: true, - cancelled: false, error: false, user, }); diff --git a/api/server/controllers/EditController.js b/api/server/controllers/EditController.js index 023dc35a83..ecc1461260 100644 --- a/api/server/controllers/EditController.js +++ b/api/server/controllers/EditController.js @@ -61,7 +61,6 @@ const EditController = async (req, res, next, initializeClient) => { text: partialText, model: endpointOption.modelOptions.model, unfinished: true, - cancelled: false, isEdited: true, error: false, user, diff --git a/api/server/middleware/abortMiddleware.js b/api/server/middleware/abortMiddleware.js index 4a109acf8f..811963174c 100644 --- a/api/server/middleware/abortMiddleware.js +++ b/api/server/middleware/abortMiddleware.js @@ -7,17 +7,26 @@ const spendTokens = require('~/models/spendTokens'); const { logger } = require('~/config'); async function abortMessage(req, res) { - const { abortKey } = req.body; + let { abortKey, conversationId } = req.body; + + if (!abortKey && conversationId) { + abortKey = conversationId; + } if (!abortControllers.has(abortKey) && !res.headersSent) { return res.status(404).send({ message: 'Request not found' }); } const { abortController } = abortControllers.get(abortKey); - const ret = await abortController.abortCompletion(); + const finalEvent = await abortController.abortCompletion(); logger.debug('[abortMessage] Aborted request', { abortKey }); abortControllers.delete(abortKey); - res.send(JSON.stringify(ret)); + + if (res.headersSent && finalEvent) { + return sendMessage(res, finalEvent); + } + + res.send(JSON.stringify(finalEvent)); } const handleAbort = () => { @@ -58,7 +67,6 @@ const createAbortController = (req, res, getAbortData) => { finish_reason: 'incomplete', model: endpointOption.modelOptions.model, unfinished: false, - cancelled: true, error: false, isCreatedByUser: false, tokenCount: completionTokens, @@ -84,10 +92,16 @@ const createAbortController = (req, res, getAbortData) => { }; const handleAbortError = async (res, req, error, data) => { - logger.error('[handleAbortError] response error and aborting request', error); + logger.error('[handleAbortError] AI response error; aborting request:', error); const { sender, conversationId, messageId, parentMessageId, partialText } = data; - const respondWithError = async () => { + if (error.stack && error.stack.includes('google')) { + logger.warn( + `AI Response error for conversation ${conversationId} likely caused by Google censor/filter`, + ); + } + + const respondWithError = async (partialText) => { const options = { sender, messageId, @@ -97,6 +111,15 @@ const handleAbortError = async (res, req, error, data) => { shouldSaveMessage: true, user: req.user.id, }; + + if (partialText) { + options.overrideProps = { + error: false, + unfinished: true, + text: partialText, + }; + } + const callback = async () => { if (abortControllers.has(conversationId)) { const { abortController } = abortControllers.get(conversationId); @@ -113,7 +136,7 @@ const handleAbortError = async (res, req, error, data) => { return await abortMessage(req, res); } catch (err) { logger.error('[handleAbortError] error while trying to abort message', err); - return respondWithError(); + return respondWithError(partialText); } } else { return respondWithError(); diff --git a/api/server/routes/ask/askChatGPTBrowser.js b/api/server/routes/ask/askChatGPTBrowser.js index 37065b3770..34f1096a87 100644 --- a/api/server/routes/ask/askChatGPTBrowser.js +++ b/api/server/routes/ask/askChatGPTBrowser.js @@ -99,7 +99,6 @@ const ask = async ({ parentMessageId: overrideParentMessageId || userMessageId, text: text, unfinished: true, - cancelled: false, error: false, isCreatedByUser: false, user, @@ -155,7 +154,6 @@ const ask = async ({ text: await handleText(response), sender: endpointOption?.chatGptLabel || 'ChatGPT', unfinished: false, - cancelled: false, error: false, isCreatedByUser: false, }; @@ -226,7 +224,6 @@ const ask = async ({ conversationId, parentMessageId: overrideParentMessageId || userMessageId, unfinished: false, - cancelled: false, error: true, isCreatedByUser: false, text: `${getPartialMessage() ?? ''}\n\nError message: "${error.message}"`, diff --git a/api/server/routes/ask/bingAI.js b/api/server/routes/ask/bingAI.js index 7a7177a96e..1281b56ae3 100644 --- a/api/server/routes/ask/bingAI.js +++ b/api/server/routes/ask/bingAI.js @@ -125,7 +125,6 @@ const ask = async ({ model, text: text, unfinished: true, - cancelled: false, error: false, isCreatedByUser: false, user, @@ -193,7 +192,6 @@ const ask = async ({ response.details.suggestedResponses && response.details.suggestedResponses.map((s) => s.text), unfinished, - cancelled: false, error: false, isCreatedByUser: false, }; @@ -263,7 +261,6 @@ const ask = async ({ text: partialText, model, unfinished: true, - cancelled: false, error: false, isCreatedByUser: false, }; @@ -285,7 +282,6 @@ const ask = async ({ conversationId, parentMessageId: overrideParentMessageId || userMessageId, unfinished: false, - cancelled: false, error: true, text: error.message, model, diff --git a/api/server/routes/ask/gptPlugins.js b/api/server/routes/ask/gptPlugins.js index b0aa1aa0f0..bab60ee23a 100644 --- a/api/server/routes/ask/gptPlugins.js +++ b/api/server/routes/ask/gptPlugins.js @@ -81,7 +81,6 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, text: partialText, model: endpointOption.modelOptions.model, unfinished: true, - cancelled: false, error: false, plugins, user, diff --git a/api/server/routes/edit/gptPlugins.js b/api/server/routes/edit/gptPlugins.js index b4f1f7ce85..cd61b53237 100644 --- a/api/server/routes/edit/gptPlugins.js +++ b/api/server/routes/edit/gptPlugins.js @@ -88,7 +88,6 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, text: partialText, model: endpointOption.modelOptions.model, unfinished: true, - cancelled: false, isEdited: true, error: false, user, diff --git a/api/server/utils/streamResponse.js b/api/server/utils/streamResponse.js index 85d35f2c55..1933839fac 100644 --- a/api/server/utils/streamResponse.js +++ b/api/server/utils/streamResponse.js @@ -1,5 +1,6 @@ const crypto = require('crypto'); -const { saveMessage } = require('~/models/Message'); +const { saveMessage, getMessages } = require('~/models/Message'); +const { getConvo } = require('~/models/Conversation'); /** * Sends error data in Server Sent Events format and ends the response. @@ -15,7 +16,7 @@ const handleError = (res, message) => { * Sends message data in Server Sent Events format. * @param {object} res - - The server response. * @param {string} message - The message to be sent. - * @param {string} event - [Optional] The type of event. Default is 'message'. + * @param {'message' | 'error' | 'cancel'} event - [Optional] The type of event. Default is 'message'. */ const sendMessage = (res, message, event = 'message') => { if (message.length === 0) { @@ -32,19 +33,27 @@ const sendMessage = (res, message, event = 'message') => { * @param {function} callback - [Optional] The callback function to be executed. */ const sendError = async (res, options, callback) => { - const { user, sender, conversationId, messageId, parentMessageId, text, shouldSaveMessage } = - options; + const { + user, + sender, + conversationId, + messageId, + parentMessageId, + text, + shouldSaveMessage, + overrideProps = {}, + } = options; const errorMessage = { sender, messageId: messageId ?? crypto.randomUUID(), conversationId, parentMessageId, unfinished: false, - cancelled: false, error: true, final: true, text, isCreatedByUser: false, + ...overrideProps, }; if (callback && typeof callback === 'function') { await callback(); @@ -54,6 +63,17 @@ const sendError = async (res, options, callback) => { await saveMessage({ ...errorMessage, user }); } + if (!errorMessage.error) { + const requestMessage = { messageId: parentMessageId, conversationId }; + const query = await getMessages(requestMessage); + return sendMessage(res, { + final: true, + requestMessage: query?.[0] ? query[0] : requestMessage, + responseMessage: errorMessage, + conversation: await getConvo(user, conversationId), + }); + } + handleError(res, errorMessage); }; diff --git a/client/src/components/Chat/Messages/Content/MessageContent.tsx b/client/src/components/Chat/Messages/Content/MessageContent.tsx index 908eda6795..875d4ebb5a 100644 --- a/client/src/components/Chat/Messages/Content/MessageContent.tsx +++ b/client/src/components/Chat/Messages/Content/MessageContent.tsx @@ -35,7 +35,7 @@ const DisplayMessage = ({ text, isCreatedByUser, message, showCursor }: TDisplay return ( {imageFiles && - imageFiles.map((file, i) => ( + imageFiles.map((file) => ( ( - + ); // Content Component diff --git a/client/src/components/Nav/ExportConversation/ExportModal.jsx b/client/src/components/Nav/ExportConversation/ExportModal.jsx index 0295d37de7..e4f292a78a 100644 --- a/client/src/components/Nav/ExportConversation/ExportModal.jsx +++ b/client/src/components/Nav/ExportConversation/ExportModal.jsx @@ -172,10 +172,6 @@ export default function ExportModal({ open, onOpenChange, conversation }) { fieldName: 'unfinished', fieldValues: entries.find((e) => e.fieldName == 'unfinished').fieldValues, }, - { - fieldName: 'cancelled', - fieldValues: entries.find((e) => e.fieldName == 'cancelled').fieldValues, - }, { fieldName: 'messageId', fieldValues: entries.find((e) => e.fieldName == 'messageId').fieldValues, @@ -226,9 +222,6 @@ export default function ExportModal({ open, onOpenChange, conversation }) { if (message.unfinished) { data += '*(This is an unfinished message)*\n'; } - if (message.cancelled) { - data += '*(This is a cancelled message)*\n'; - } data += '\n\n'; } @@ -275,9 +268,6 @@ export default function ExportModal({ open, onOpenChange, conversation }) { if (message.unfinished) { data += '(This is an unfinished message)\n'; } - if (message.cancelled) { - data += '(This is a cancelled message)\n'; - } data += '\n\n'; } diff --git a/client/src/hooks/useChatHelpers.ts b/client/src/hooks/useChatHelpers.ts index d5cc37a159..bb702cb98f 100644 --- a/client/src/hooks/useChatHelpers.ts +++ b/client/src/hooks/useChatHelpers.ts @@ -217,7 +217,6 @@ export default function useChatHelpers(index = 0, paramId: string | undefined) { messageId: responseMessageId ?? `${isRegenerate ? messageId : fakeMessageId}_`, conversationId, unfinished: false, - submitting: true, isCreatedByUser: false, isEdited: isEditOrContinue, error: false, diff --git a/client/src/hooks/useSSE.ts b/client/src/hooks/useSSE.ts index e41fa3cb10..e5258511c7 100644 --- a/client/src/hooks/useSSE.ts +++ b/client/src/hooks/useSSE.ts @@ -64,7 +64,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) { messageId: message?.overrideParentMessageId + '_', plugin: plugin ?? null, plugins: plugins ?? [], - submitting: true, // unfinished: true }, ]); @@ -79,7 +78,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) { messageId: message?.messageId + '_', plugin: plugin ?? null, plugins: plugins ?? [], - submitting: true, // unfinished: true }, ]); @@ -136,7 +134,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) { ...initialResponse, parentMessageId: message?.overrideParentMessageId ?? null, messageId: message?.overrideParentMessageId + '_', - submitting: true, }, ]); } else { @@ -147,7 +144,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) { ...initialResponse, parentMessageId: message?.messageId, messageId: message?.messageId + '_', - submitting: true, }, ]); } @@ -238,6 +234,7 @@ export default function useSSE(submission: TSubmission | null, index = 0) { const abortConversation = (conversationId = '', submission: TSubmission) => { console.log(submission); const { endpoint } = submission?.conversation || {}; + let res: Response; fetch(`/api/ask/${endpoint}/abort`, { method: 'POST', @@ -249,9 +246,15 @@ export default function useSSE(submission: TSubmission | null, index = 0) { abortKey: conversationId, }), }) - .then((response) => response.json()) + .then((response) => { + res = response; + return response.json(); + }) .then((data) => { console.log('aborted', data); + if (res.status === 404) { + return setIsSubmitting(false); + } cancelHandler(data, submission); }) .catch((error) => { diff --git a/package-lock.json b/package-lock.json index 1e3ff9e5d7..806b828ce5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "keyv": "^4.5.4", "keyv-file": "^0.2.0", "klona": "^2.0.6", - "langchain": "^0.0.186", + "langchain": "^0.0.213", "librechat-data-provider": "*", "lodash": "^4.17.21", "meilisearch": "^0.33.0", @@ -103,67 +103,44 @@ "supertest": "^6.3.3" } }, - "api/node_modules/@types/node": { - "version": "18.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", - "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "api/node_modules/ansi-styles": { + "api/node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "api/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "api/node_modules/cohere-ai": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-6.0.0.tgz", - "integrity": "sha512-u1KmPw2PWbTQbbZXmdVs610N/zYyh/V6mL/nDXqx1Gl6X7IH84z9gK3jNv/f69Uzc007xe3zHmMYk80WlkHEmA==" - }, - "api/node_modules/langchain": { - "version": "0.0.186", - "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.0.186.tgz", - "integrity": "sha512-uXDipmw9aUrUmDNcFr2XH9ORmshWIlIb/qFKneS1K3X5upMUg7TSbaBxqV9WxuuenLUSYaoTcTy7P/pKkbqXPg==", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "optional": true, + "peer": true, "dependencies": { - "@anthropic-ai/sdk": "^0.6.2", - "ansi-styles": "^5.0.0", - "binary-extensions": "^2.2.0", - "camelcase": "6", - "decamelize": "^1.2.0", - "expr-eval": "^2.0.2", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "api/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "api/node_modules/@langchain/community": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@langchain/community/-/community-0.0.12.tgz", + "integrity": "sha512-mcm6FxxnLxSx9PiYvehGGwvcHjsVR5WXfYOwymojf/6d0apyewjOLzKsR3xx0HJVtCs8pff7NZSdDoE+jj8OcA==", + "dependencies": { + "@langchain/core": "~0.1.5", + "@langchain/openai": "~0.0.9", "flat": "^5.0.2", - "js-tiktoken": "^1.0.7", - "js-yaml": "^4.1.0", - "jsonpointer": "^5.0.1", - "langchainhub": "~0.0.6", "langsmith": "~0.0.48", - "ml-distance": "^4.0.0", - "openai": "^4.17.0", - "openapi-types": "^12.1.3", - "p-queue": "^6.6.2", - "p-retry": "4", "uuid": "^9.0.0", - "yaml": "^2.2.1", - "zod": "^3.22.3", - "zod-to-json-schema": "^3.20.4" + "zod": "^3.22.3" }, "engines": { "node": ">=18" @@ -174,29 +151,27 @@ "@aws-sdk/client-dynamodb": "^3.310.0", "@aws-sdk/client-kendra": "^3.352.0", "@aws-sdk/client-lambda": "^3.310.0", - "@aws-sdk/client-s3": "^3.310.0", "@aws-sdk/client-sagemaker-runtime": "^3.310.0", "@aws-sdk/client-sfn": "^3.310.0", "@aws-sdk/credential-provider-node": "^3.388.0", - "@azure/storage-blob": "^12.15.0", - "@clickhouse/client": "^0.0.14", + "@clickhouse/client": "^0.2.5", "@cloudflare/ai": "^1.0.12", + "@datastax/astra-db-ts": "0.1.2", "@elastic/elasticsearch": "^8.4.0", "@getmetal/metal-sdk": "*", "@getzep/zep-js": "^0.9.0", - "@gomomento/sdk": "^1.47.1", - "@gomomento/sdk-core": "^1.47.1", - "@gomomento/sdk-web": "^1.47.1", + "@gomomento/sdk": "^1.51.1", + "@gomomento/sdk-core": "^1.51.1", "@google-ai/generativelanguage": "^0.2.1", - "@google-cloud/storage": "^6.10.1", + "@gradientai/nodejs-sdk": "^1.2.0", "@huggingface/inference": "^2.6.4", "@mozilla/readability": "*", - "@notionhq/client": "^2.2.10", "@opensearch-project/opensearch": "*", "@pinecone-database/pinecone": "^1.1.0", "@planetscale/database": "^1.8.0", "@qdrant/js-client-rest": "^1.2.0", "@raycast/api": "^1.55.2", + "@rockset/client": "^0.9.1", "@smithy/eventstream-codec": "^2.0.5", "@smithy/protocol-http": "^3.0.6", "@smithy/signature-v4": "^2.0.10", @@ -210,52 +185,37 @@ "@vercel/kv": "^0.2.3", "@vercel/postgres": "^0.5.0", "@writerai/writer-sdk": "^0.40.2", - "@xata.io/client": "^0.25.1", + "@xata.io/client": "^0.28.0", "@xenova/transformers": "^2.5.4", "@zilliz/milvus2-sdk-node": ">=2.2.7", - "apify-client": "^2.7.1", - "assemblyai": "^2.0.2", - "axios": "*", "cassandra-driver": "^4.7.2", - "cheerio": "^1.0.0-rc.12", "chromadb": "*", "closevector-common": "0.1.0-alpha.1", "closevector-node": "0.1.0-alpha.10", "closevector-web": "0.1.0-alpha.16", "cohere-ai": ">=6.0.0", "convex": "^1.3.1", - "d3-dsv": "^2.0.0", - "epub2": "^3.0.1", + "discord.js": "^14.14.1", "faiss-node": "^0.5.1", - "fast-xml-parser": "^4.2.7", "firebase-admin": "^11.9.0", "google-auth-library": "^8.9.0", "googleapis": "^126.0.1", "hnswlib-node": "^1.4.2", "html-to-text": "^9.0.5", - "ignore": "^5.2.0", "ioredis": "^5.3.2", "jsdom": "*", - "llmonitor": "^0.5.8", + "llmonitor": "^0.5.9", "lodash": "^4.17.21", - "mammoth": "*", "mongodb": "^5.2.0", "mysql2": "^3.3.3", "neo4j-driver": "*", "node-llama-cpp": "*", - "notion-to-md": "^3.1.0", - "pdf-parse": "1.1.1", - "peggy": "^3.0.2", "pg": "^8.11.0", "pg-copy-streams": "^6.0.5", "pickleparser": "^0.2.1", - "playwright": "^1.32.1", "portkey-ai": "^0.1.11", - "puppeteer": "^19.7.2", "redis": "^4.6.4", "replicate": "^0.18.0", - "sonix-speech-recognition": "^2.1.1", - "srt-parser-2": "^1.2.2", "typeorm": "^0.3.12", "typesense": "^1.5.3", "usearch": "^1.1.1", @@ -263,9 +223,7 @@ "voy-search": "0.6.2", "weaviate-ts-client": "^1.4.0", "web-auth-library": "^1.0.3", - "ws": "^8.14.2", - "youtube-transcript": "^1.0.6", - "youtubei.js": "^5.8.0" + "ws": "^8.14.2" }, "peerDependenciesMeta": { "@aws-crypto/sha256-js": { @@ -283,9 +241,6 @@ "@aws-sdk/client-lambda": { "optional": true }, - "@aws-sdk/client-s3": { - "optional": true - }, "@aws-sdk/client-sagemaker-runtime": { "optional": true }, @@ -295,15 +250,15 @@ "@aws-sdk/credential-provider-node": { "optional": true }, - "@azure/storage-blob": { - "optional": true - }, "@clickhouse/client": { "optional": true }, "@cloudflare/ai": { "optional": true }, + "@datastax/astra-db-ts": { + "optional": true + }, "@elastic/elasticsearch": { "optional": true }, @@ -319,13 +274,10 @@ "@gomomento/sdk-core": { "optional": true }, - "@gomomento/sdk-web": { - "optional": true - }, "@google-ai/generativelanguage": { "optional": true }, - "@google-cloud/storage": { + "@gradientai/nodejs-sdk": { "optional": true }, "@huggingface/inference": { @@ -334,9 +286,6 @@ "@mozilla/readability": { "optional": true }, - "@notionhq/client": { - "optional": true - }, "@opensearch-project/opensearch": { "optional": true }, @@ -352,6 +301,9 @@ "@raycast/api": { "optional": true }, + "@rockset/client": { + "optional": true + }, "@smithy/eventstream-codec": { "optional": true }, @@ -400,21 +352,9 @@ "@zilliz/milvus2-sdk-node": { "optional": true }, - "apify-client": { - "optional": true - }, - "assemblyai": { - "optional": true - }, - "axios": { - "optional": true - }, "cassandra-driver": { "optional": true }, - "cheerio": { - "optional": true - }, "chromadb": { "optional": true }, @@ -433,18 +373,12 @@ "convex": { "optional": true }, - "d3-dsv": { - "optional": true - }, - "epub2": { + "discord.js": { "optional": true }, "faiss-node": { "optional": true }, - "fast-xml-parser": { - "optional": true - }, "firebase-admin": { "optional": true }, @@ -460,9 +394,6 @@ "html-to-text": { "optional": true }, - "ignore": { - "optional": true - }, "ioredis": { "optional": true }, @@ -475,9 +406,6 @@ "lodash": { "optional": true }, - "mammoth": { - "optional": true - }, "mongodb": { "optional": true }, @@ -490,15 +418,6 @@ "node-llama-cpp": { "optional": true }, - "notion-to-md": { - "optional": true - }, - "pdf-parse": { - "optional": true - }, - "peggy": { - "optional": true - }, "pg": { "optional": true }, @@ -508,27 +427,15 @@ "pickleparser": { "optional": true }, - "playwright": { - "optional": true - }, "portkey-ai": { "optional": true }, - "puppeteer": { - "optional": true - }, "redis": { "optional": true }, "replicate": { "optional": true }, - "sonix-speech-recognition": { - "optional": true - }, - "srt-parser-2": { - "optional": true - }, "typeorm": { "optional": true }, @@ -550,6 +457,337 @@ "web-auth-library": { "optional": true }, + "ws": { + "optional": true + } + } + }, + "api/node_modules/@types/node": { + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "api/node_modules/cohere-ai": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-6.0.0.tgz", + "integrity": "sha512-u1KmPw2PWbTQbbZXmdVs610N/zYyh/V6mL/nDXqx1Gl6X7IH84z9gK3jNv/f69Uzc007xe3zHmMYk80WlkHEmA==" + }, + "api/node_modules/fast-xml-parser": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "api/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "api/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "api/node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "optional": true, + "peer": true, + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "api/node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "api/node_modules/langchain": { + "version": "0.0.213", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.0.213.tgz", + "integrity": "sha512-nQDOJXvtIAIuUzamCiF1AWyi2GH9FSDPR+3XulJUEpdU60aSFPZ9GBiWdu+dVHXeAmm8C0iCVi0+3GWLJrUoXA==", + "dependencies": { + "@anthropic-ai/sdk": "^0.9.1", + "@langchain/community": "~0.0.12", + "@langchain/core": "~0.1.5", + "@langchain/openai": "~0.0.9", + "binary-extensions": "^2.2.0", + "expr-eval": "^2.0.2", + "js-tiktoken": "^1.0.7", + "js-yaml": "^4.1.0", + "jsonpointer": "^5.0.1", + "langchainhub": "~0.0.6", + "langsmith": "~0.0.48", + "ml-distance": "^4.0.0", + "openapi-types": "^12.1.3", + "p-retry": "4", + "uuid": "^9.0.0", + "yaml": "^2.2.1", + "zod": "^3.22.3", + "zod-to-json-schema": "3.20.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.310.0", + "@aws-sdk/client-sagemaker-runtime": "^3.310.0", + "@aws-sdk/client-sfn": "^3.310.0", + "@aws-sdk/credential-provider-node": "^3.388.0", + "@azure/storage-blob": "^12.15.0", + "@gomomento/sdk": "^1.51.1", + "@gomomento/sdk-core": "^1.51.1", + "@gomomento/sdk-web": "^1.51.1", + "@google-ai/generativelanguage": "^0.2.1", + "@google-cloud/storage": "^6.10.1", + "@notionhq/client": "^2.2.10", + "@pinecone-database/pinecone": "^1.1.0", + "@supabase/supabase-js": "^2.10.0", + "@vercel/kv": "^0.2.3", + "@xata.io/client": "^0.28.0", + "apify-client": "^2.7.1", + "assemblyai": "^4.0.0", + "axios": "*", + "cheerio": "^1.0.0-rc.12", + "chromadb": "*", + "convex": "^1.3.1", + "d3-dsv": "^2.0.0", + "epub2": "^3.0.1", + "fast-xml-parser": "^4.2.7", + "google-auth-library": "^8.9.0", + "googleapis": "^126.0.1", + "html-to-text": "^9.0.5", + "ignore": "^5.2.0", + "ioredis": "^5.3.2", + "jsdom": "*", + "mammoth": "^1.6.0", + "mongodb": "^5.2.0", + "node-llama-cpp": "*", + "notion-to-md": "^3.1.0", + "officeparser": "^4.0.4", + "pdf-parse": "1.1.1", + "peggy": "^3.0.2", + "playwright": "^1.32.1", + "puppeteer": "^19.7.2", + "pyodide": "^0.24.1", + "redis": "^4.6.4", + "sonix-speech-recognition": "^2.1.1", + "srt-parser-2": "^1.2.2", + "typeorm": "^0.3.12", + "vectordb": "^0.1.4", + "weaviate-ts-client": "^1.4.0", + "web-auth-library": "^1.0.3", + "ws": "^8.14.2", + "youtube-transcript": "^1.0.6", + "youtubei.js": "^5.8.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-sagemaker-runtime": { + "optional": true + }, + "@aws-sdk/client-sfn": { + "optional": true + }, + "@aws-sdk/credential-provider-node": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@gomomento/sdk": { + "optional": true + }, + "@gomomento/sdk-core": { + "optional": true + }, + "@gomomento/sdk-web": { + "optional": true + }, + "@google-ai/generativelanguage": { + "optional": true + }, + "@google-cloud/storage": { + "optional": true + }, + "@notionhq/client": { + "optional": true + }, + "@pinecone-database/pinecone": { + "optional": true + }, + "@supabase/supabase-js": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "apify-client": { + "optional": true + }, + "assemblyai": { + "optional": true + }, + "axios": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "chromadb": { + "optional": true + }, + "convex": { + "optional": true + }, + "d3-dsv": { + "optional": true + }, + "epub2": { + "optional": true + }, + "faiss-node": { + "optional": true + }, + "fast-xml-parser": { + "optional": true + }, + "google-auth-library": { + "optional": true + }, + "googleapis": { + "optional": true + }, + "html-to-text": { + "optional": true + }, + "ignore": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "mammoth": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "node-llama-cpp": { + "optional": true + }, + "notion-to-md": { + "optional": true + }, + "officeparser": { + "optional": true + }, + "pdf-parse": { + "optional": true + }, + "peggy": { + "optional": true + }, + "playwright": { + "optional": true + }, + "puppeteer": { + "optional": true + }, + "pyodide": { + "optional": true + }, + "redis": { + "optional": true + }, + "sonix-speech-recognition": { + "optional": true + }, + "srt-parser-2": { + "optional": true + }, + "typeorm": { + "optional": true + }, + "vectordb": { + "optional": true + }, + "weaviate-ts-client": { + "optional": true + }, + "web-auth-library": { + "optional": true + }, "ws": { "optional": true }, @@ -562,9 +800,9 @@ } }, "api/node_modules/langchain/node_modules/@anthropic-ai/sdk": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.6.8.tgz", - "integrity": "sha512-z4gDFrBf+W2wOVvwA3CA+5bfKOxQhPeXQo7+ITWj3r3XPulIMEasVT0KrD41G+anr5Yc3d2PKvXKB6b1LSon5w==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.9.1.tgz", + "integrity": "sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA==", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -577,6 +815,19 @@ "web-streams-polyfill": "^3.2.1" } }, + "api/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "api/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -597,6 +848,13 @@ "node": ">= 8" } }, + "api/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true, + "peer": true + }, "client": { "name": "@librechat/frontend", "version": "0.6.5", @@ -6189,9 +6447,9 @@ } }, "node_modules/@langchain/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.1.1.tgz", - "integrity": "sha512-p+BzmILzGAWjHxzNy1ZygfsNWxZcipWH3zvY0WC33ly+nmBp4n+MCVd25hKQ4YYWOqoOGGWSzFJukd5PxaXMDQ==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.1.5.tgz", + "integrity": "sha512-5RdZpbadMYXTKdZrWZ6JeYT09BZssprg+komE+FbXxW+kbGE0QJJaj8dnzPNdzVCAhDLQQTOV2CAM+vOLsaxzQ==", "dependencies": { "ansi-styles": "^5.0.0", "camelcase": "6", @@ -6254,6 +6512,21 @@ "node": ">=18" } }, + "node_modules/@langchain/openai": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.0.9.tgz", + "integrity": "sha512-Py7rJijOjNtb9pj5He+E9uAj9d8PCX+8Ix4LvY7cUTMCDlfkhngw2DhJ8wlk23u1IvunakdnnN74pfbO2JJBrw==", + "dependencies": { + "@langchain/core": "~0.1.5", + "js-tiktoken": "^1.0.7", + "openai": "^4.19.0", + "zod": "^3.22.3", + "zod-to-json-schema": "3.20.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@librechat/backend": { "resolved": "api", "link": true @@ -9785,7 +10058,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -13378,6 +13651,13 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "optional": true, + "peer": true + }, "node_modules/fast-uri": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", @@ -14270,6 +14550,22 @@ "node": ">=14" } }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "optional": true, + "peer": true, + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/googleapis": { "version": "126.0.1", "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-126.0.1.tgz", @@ -19131,6 +19427,16 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-html-parser": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", @@ -26341,11 +26647,11 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.21.4.tgz", - "integrity": "sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.20.3.tgz", + "integrity": "sha512-/Q3wnyxAfCt94ZcrGiXXoiAfRqasxl9CX64LZ9fj+4dKH68zulUtU0uk1WMxQPfAxQ0ZI70dKzcoW7hHj+DwSQ==", "peerDependencies": { - "zod": "^3.21.4" + "zod": "^3.20.0" } }, "node_modules/zwitch": { diff --git a/packages/data-provider/src/schemas.ts b/packages/data-provider/src/schemas.ts index a1706eacaa..4698ea6a55 100644 --- a/packages/data-provider/src/schemas.ts +++ b/packages/data-provider/src/schemas.ts @@ -229,7 +229,6 @@ export const tMessageSchema = z.object({ .default(() => new Date().toISOString()), current: z.boolean().optional(), unfinished: z.boolean().optional(), - submitting: z.boolean().optional(), searchResult: z.boolean().optional(), finish_reason: z.string().optional(), });