🧹fix: Handle Abort Message Edge Cases (#1462)

* 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
This commit is contained in:
Danny Avila 2023-12-30 12:34:23 -05:00 committed by GitHub
parent f19f5dca8e
commit 379e470e38
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 529 additions and 207 deletions

View file

@ -516,7 +516,7 @@ class BaseClient {
} }
async saveMessageToDatabase(message, endpointOptions, user = null) { async saveMessageToDatabase(message, endpointOptions, user = null) {
await saveMessage({ ...message, user, unfinished: false, cancelled: false }); await saveMessage({ ...message, user, unfinished: false });
await saveConvo(user, { await saveConvo(user, {
conversationId: message.conversationId, conversationId: message.conversationId,
endpoint: this.options.endpoint, endpoint: this.options.endpoint,

View file

@ -54,7 +54,6 @@ describe('formatMessage', () => {
_id: '6512cdfb92cbf69fea615331', _id: '6512cdfb92cbf69fea615331',
messageId: 'b620bf73-c5c3-4a38-b724-76886aac24c4', messageId: 'b620bf73-c5c3-4a38-b724-76886aac24c4',
__v: 0, __v: 0,
cancelled: false,
conversationId: '5c23d24f-941f-4aab-85df-127b596c8aa5', conversationId: '5c23d24f-941f-4aab-85df-127b596c8aa5',
createdAt: Date.now(), createdAt: Date.now(),
error: false, error: false,

View file

@ -18,7 +18,6 @@ module.exports = {
isCreatedByUser = false, isCreatedByUser = false,
error, error,
unfinished, unfinished,
cancelled,
files, files,
isEdited = false, isEdited = false,
finish_reason = null, finish_reason = null,
@ -45,7 +44,6 @@ module.exports = {
finish_reason, finish_reason,
error, error,
unfinished, unfinished,
cancelled,
tokenCount, tokenCount,
plugin, plugin,
plugins, plugins,

View file

@ -68,10 +68,6 @@ const messageSchema = mongoose.Schema(
type: Boolean, type: Boolean,
default: false, default: false,
}, },
cancelled: {
type: Boolean,
default: false,
},
error: { error: {
type: Boolean, type: Boolean,
default: false, default: false,

View file

@ -54,7 +54,7 @@
"keyv": "^4.5.4", "keyv": "^4.5.4",
"keyv-file": "^0.2.0", "keyv-file": "^0.2.0",
"klona": "^2.0.6", "klona": "^2.0.6",
"langchain": "^0.0.186", "langchain": "^0.0.213",
"librechat-data-provider": "*", "librechat-data-provider": "*",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"meilisearch": "^0.33.0", "meilisearch": "^0.33.0",

View file

@ -62,7 +62,6 @@ const AskController = async (req, res, next, initializeClient, addTitle) => {
text: partialText, text: partialText,
model: client.modelOptions.model, model: client.modelOptions.model,
unfinished: true, unfinished: true,
cancelled: false,
error: false, error: false,
user, user,
}); });

View file

@ -61,7 +61,6 @@ const EditController = async (req, res, next, initializeClient) => {
text: partialText, text: partialText,
model: endpointOption.modelOptions.model, model: endpointOption.modelOptions.model,
unfinished: true, unfinished: true,
cancelled: false,
isEdited: true, isEdited: true,
error: false, error: false,
user, user,

View file

@ -7,17 +7,26 @@ const spendTokens = require('~/models/spendTokens');
const { logger } = require('~/config'); const { logger } = require('~/config');
async function abortMessage(req, res) { 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) { if (!abortControllers.has(abortKey) && !res.headersSent) {
return res.status(404).send({ message: 'Request not found' }); return res.status(404).send({ message: 'Request not found' });
} }
const { abortController } = abortControllers.get(abortKey); const { abortController } = abortControllers.get(abortKey);
const ret = await abortController.abortCompletion(); const finalEvent = await abortController.abortCompletion();
logger.debug('[abortMessage] Aborted request', { abortKey }); logger.debug('[abortMessage] Aborted request', { abortKey });
abortControllers.delete(abortKey); abortControllers.delete(abortKey);
res.send(JSON.stringify(ret));
if (res.headersSent && finalEvent) {
return sendMessage(res, finalEvent);
}
res.send(JSON.stringify(finalEvent));
} }
const handleAbort = () => { const handleAbort = () => {
@ -58,7 +67,6 @@ const createAbortController = (req, res, getAbortData) => {
finish_reason: 'incomplete', finish_reason: 'incomplete',
model: endpointOption.modelOptions.model, model: endpointOption.modelOptions.model,
unfinished: false, unfinished: false,
cancelled: true,
error: false, error: false,
isCreatedByUser: false, isCreatedByUser: false,
tokenCount: completionTokens, tokenCount: completionTokens,
@ -84,10 +92,16 @@ const createAbortController = (req, res, getAbortData) => {
}; };
const handleAbortError = async (res, req, error, data) => { 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 { 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 = { const options = {
sender, sender,
messageId, messageId,
@ -97,6 +111,15 @@ const handleAbortError = async (res, req, error, data) => {
shouldSaveMessage: true, shouldSaveMessage: true,
user: req.user.id, user: req.user.id,
}; };
if (partialText) {
options.overrideProps = {
error: false,
unfinished: true,
text: partialText,
};
}
const callback = async () => { const callback = async () => {
if (abortControllers.has(conversationId)) { if (abortControllers.has(conversationId)) {
const { abortController } = abortControllers.get(conversationId); const { abortController } = abortControllers.get(conversationId);
@ -113,7 +136,7 @@ const handleAbortError = async (res, req, error, data) => {
return await abortMessage(req, res); return await abortMessage(req, res);
} catch (err) { } catch (err) {
logger.error('[handleAbortError] error while trying to abort message', err); logger.error('[handleAbortError] error while trying to abort message', err);
return respondWithError(); return respondWithError(partialText);
} }
} else { } else {
return respondWithError(); return respondWithError();

View file

@ -99,7 +99,6 @@ const ask = async ({
parentMessageId: overrideParentMessageId || userMessageId, parentMessageId: overrideParentMessageId || userMessageId,
text: text, text: text,
unfinished: true, unfinished: true,
cancelled: false,
error: false, error: false,
isCreatedByUser: false, isCreatedByUser: false,
user, user,
@ -155,7 +154,6 @@ const ask = async ({
text: await handleText(response), text: await handleText(response),
sender: endpointOption?.chatGptLabel || 'ChatGPT', sender: endpointOption?.chatGptLabel || 'ChatGPT',
unfinished: false, unfinished: false,
cancelled: false,
error: false, error: false,
isCreatedByUser: false, isCreatedByUser: false,
}; };
@ -226,7 +224,6 @@ const ask = async ({
conversationId, conversationId,
parentMessageId: overrideParentMessageId || userMessageId, parentMessageId: overrideParentMessageId || userMessageId,
unfinished: false, unfinished: false,
cancelled: false,
error: true, error: true,
isCreatedByUser: false, isCreatedByUser: false,
text: `${getPartialMessage() ?? ''}\n\nError message: "${error.message}"`, text: `${getPartialMessage() ?? ''}\n\nError message: "${error.message}"`,

View file

@ -125,7 +125,6 @@ const ask = async ({
model, model,
text: text, text: text,
unfinished: true, unfinished: true,
cancelled: false,
error: false, error: false,
isCreatedByUser: false, isCreatedByUser: false,
user, user,
@ -193,7 +192,6 @@ const ask = async ({
response.details.suggestedResponses && response.details.suggestedResponses &&
response.details.suggestedResponses.map((s) => s.text), response.details.suggestedResponses.map((s) => s.text),
unfinished, unfinished,
cancelled: false,
error: false, error: false,
isCreatedByUser: false, isCreatedByUser: false,
}; };
@ -263,7 +261,6 @@ const ask = async ({
text: partialText, text: partialText,
model, model,
unfinished: true, unfinished: true,
cancelled: false,
error: false, error: false,
isCreatedByUser: false, isCreatedByUser: false,
}; };
@ -285,7 +282,6 @@ const ask = async ({
conversationId, conversationId,
parentMessageId: overrideParentMessageId || userMessageId, parentMessageId: overrideParentMessageId || userMessageId,
unfinished: false, unfinished: false,
cancelled: false,
error: true, error: true,
text: error.message, text: error.message,
model, model,

View file

@ -81,7 +81,6 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
text: partialText, text: partialText,
model: endpointOption.modelOptions.model, model: endpointOption.modelOptions.model,
unfinished: true, unfinished: true,
cancelled: false,
error: false, error: false,
plugins, plugins,
user, user,

View file

@ -88,7 +88,6 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
text: partialText, text: partialText,
model: endpointOption.modelOptions.model, model: endpointOption.modelOptions.model,
unfinished: true, unfinished: true,
cancelled: false,
isEdited: true, isEdited: true,
error: false, error: false,
user, user,

View file

@ -1,5 +1,6 @@
const crypto = require('crypto'); 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. * 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. * Sends message data in Server Sent Events format.
* @param {object} res - - The server response. * @param {object} res - - The server response.
* @param {string} message - The message to be sent. * @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') => { const sendMessage = (res, message, event = 'message') => {
if (message.length === 0) { if (message.length === 0) {
@ -32,19 +33,27 @@ const sendMessage = (res, message, event = 'message') => {
* @param {function} callback - [Optional] The callback function to be executed. * @param {function} callback - [Optional] The callback function to be executed.
*/ */
const sendError = async (res, options, callback) => { const sendError = async (res, options, callback) => {
const { user, sender, conversationId, messageId, parentMessageId, text, shouldSaveMessage } = const {
options; user,
sender,
conversationId,
messageId,
parentMessageId,
text,
shouldSaveMessage,
overrideProps = {},
} = options;
const errorMessage = { const errorMessage = {
sender, sender,
messageId: messageId ?? crypto.randomUUID(), messageId: messageId ?? crypto.randomUUID(),
conversationId, conversationId,
parentMessageId, parentMessageId,
unfinished: false, unfinished: false,
cancelled: false,
error: true, error: true,
final: true, final: true,
text, text,
isCreatedByUser: false, isCreatedByUser: false,
...overrideProps,
}; };
if (callback && typeof callback === 'function') { if (callback && typeof callback === 'function') {
await callback(); await callback();
@ -54,6 +63,17 @@ const sendError = async (res, options, callback) => {
await saveMessage({ ...errorMessage, user }); 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); handleError(res, errorMessage);
}; };

View file

@ -35,7 +35,7 @@ const DisplayMessage = ({ text, isCreatedByUser, message, showCursor }: TDisplay
return ( return (
<Container> <Container>
{imageFiles && {imageFiles &&
imageFiles.map((file, i) => ( imageFiles.map((file) => (
<Image <Image
key={file.file_id} key={file.file_id}
imagePath={file.preview ?? file.filepath ?? ''} imagePath={file.preview ?? file.filepath ?? ''}
@ -64,7 +64,7 @@ const DisplayMessage = ({ text, isCreatedByUser, message, showCursor }: TDisplay
// Unfinished Message Component // Unfinished Message Component
const UnfinishedMessage = () => ( const UnfinishedMessage = () => (
<ErrorMessage text="This is an unfinished message. The AI may still be generating a response, it was aborted, or a censor was triggered. Refresh or visit later to see more updates." /> <ErrorMessage text="The response is incomplete; it's either still processing, was cancelled, or censored. Refresh or try a different prompt." />
); );
// Content Component // Content Component

View file

@ -172,10 +172,6 @@ export default function ExportModal({ open, onOpenChange, conversation }) {
fieldName: 'unfinished', fieldName: 'unfinished',
fieldValues: entries.find((e) => e.fieldName == 'unfinished').fieldValues, fieldValues: entries.find((e) => e.fieldName == 'unfinished').fieldValues,
}, },
{
fieldName: 'cancelled',
fieldValues: entries.find((e) => e.fieldName == 'cancelled').fieldValues,
},
{ {
fieldName: 'messageId', fieldName: 'messageId',
fieldValues: entries.find((e) => e.fieldName == 'messageId').fieldValues, fieldValues: entries.find((e) => e.fieldName == 'messageId').fieldValues,
@ -226,9 +222,6 @@ export default function ExportModal({ open, onOpenChange, conversation }) {
if (message.unfinished) { if (message.unfinished) {
data += '*(This is an unfinished message)*\n'; data += '*(This is an unfinished message)*\n';
} }
if (message.cancelled) {
data += '*(This is a cancelled message)*\n';
}
data += '\n\n'; data += '\n\n';
} }
@ -275,9 +268,6 @@ export default function ExportModal({ open, onOpenChange, conversation }) {
if (message.unfinished) { if (message.unfinished) {
data += '(This is an unfinished message)\n'; data += '(This is an unfinished message)\n';
} }
if (message.cancelled) {
data += '(This is a cancelled message)\n';
}
data += '\n\n'; data += '\n\n';
} }

View file

@ -217,7 +217,6 @@ export default function useChatHelpers(index = 0, paramId: string | undefined) {
messageId: responseMessageId ?? `${isRegenerate ? messageId : fakeMessageId}_`, messageId: responseMessageId ?? `${isRegenerate ? messageId : fakeMessageId}_`,
conversationId, conversationId,
unfinished: false, unfinished: false,
submitting: true,
isCreatedByUser: false, isCreatedByUser: false,
isEdited: isEditOrContinue, isEdited: isEditOrContinue,
error: false, error: false,

View file

@ -64,7 +64,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
messageId: message?.overrideParentMessageId + '_', messageId: message?.overrideParentMessageId + '_',
plugin: plugin ?? null, plugin: plugin ?? null,
plugins: plugins ?? [], plugins: plugins ?? [],
submitting: true,
// unfinished: true // unfinished: true
}, },
]); ]);
@ -79,7 +78,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
messageId: message?.messageId + '_', messageId: message?.messageId + '_',
plugin: plugin ?? null, plugin: plugin ?? null,
plugins: plugins ?? [], plugins: plugins ?? [],
submitting: true,
// unfinished: true // unfinished: true
}, },
]); ]);
@ -136,7 +134,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
...initialResponse, ...initialResponse,
parentMessageId: message?.overrideParentMessageId ?? null, parentMessageId: message?.overrideParentMessageId ?? null,
messageId: message?.overrideParentMessageId + '_', messageId: message?.overrideParentMessageId + '_',
submitting: true,
}, },
]); ]);
} else { } else {
@ -147,7 +144,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
...initialResponse, ...initialResponse,
parentMessageId: message?.messageId, parentMessageId: message?.messageId,
messageId: 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) => { const abortConversation = (conversationId = '', submission: TSubmission) => {
console.log(submission); console.log(submission);
const { endpoint } = submission?.conversation || {}; const { endpoint } = submission?.conversation || {};
let res: Response;
fetch(`/api/ask/${endpoint}/abort`, { fetch(`/api/ask/${endpoint}/abort`, {
method: 'POST', method: 'POST',
@ -249,9 +246,15 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
abortKey: conversationId, abortKey: conversationId,
}), }),
}) })
.then((response) => response.json()) .then((response) => {
res = response;
return response.json();
})
.then((data) => { .then((data) => {
console.log('aborted', data); console.log('aborted', data);
if (res.status === 404) {
return setIsSubmitting(false);
}
cancelHandler(data, submission); cancelHandler(data, submission);
}) })
.catch((error) => { .catch((error) => {

618
package-lock.json generated
View file

@ -68,7 +68,7 @@
"keyv": "^4.5.4", "keyv": "^4.5.4",
"keyv-file": "^0.2.0", "keyv-file": "^0.2.0",
"klona": "^2.0.6", "klona": "^2.0.6",
"langchain": "^0.0.186", "langchain": "^0.0.213",
"librechat-data-provider": "*", "librechat-data-provider": "*",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"meilisearch": "^0.33.0", "meilisearch": "^0.33.0",
@ -103,67 +103,44 @@
"supertest": "^6.3.3" "supertest": "^6.3.3"
} }
}, },
"api/node_modules/@types/node": { "api/node_modules/@aws-crypto/sha256-js": {
"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": {
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
"engines": { "optional": true,
"node": ">=10" "peer": true,
},
"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==",
"dependencies": { "dependencies": {
"@anthropic-ai/sdk": "^0.6.2", "@aws-crypto/util": "^5.2.0",
"ansi-styles": "^5.0.0", "@aws-sdk/types": "^3.222.0",
"binary-extensions": "^2.2.0", "tslib": "^2.6.2"
"camelcase": "6", },
"decamelize": "^1.2.0", "engines": {
"expr-eval": "^2.0.2", "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", "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", "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", "uuid": "^9.0.0",
"yaml": "^2.2.1", "zod": "^3.22.3"
"zod": "^3.22.3",
"zod-to-json-schema": "^3.20.4"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
@ -174,29 +151,27 @@
"@aws-sdk/client-dynamodb": "^3.310.0", "@aws-sdk/client-dynamodb": "^3.310.0",
"@aws-sdk/client-kendra": "^3.352.0", "@aws-sdk/client-kendra": "^3.352.0",
"@aws-sdk/client-lambda": "^3.310.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-sagemaker-runtime": "^3.310.0",
"@aws-sdk/client-sfn": "^3.310.0", "@aws-sdk/client-sfn": "^3.310.0",
"@aws-sdk/credential-provider-node": "^3.388.0", "@aws-sdk/credential-provider-node": "^3.388.0",
"@azure/storage-blob": "^12.15.0", "@clickhouse/client": "^0.2.5",
"@clickhouse/client": "^0.0.14",
"@cloudflare/ai": "^1.0.12", "@cloudflare/ai": "^1.0.12",
"@datastax/astra-db-ts": "0.1.2",
"@elastic/elasticsearch": "^8.4.0", "@elastic/elasticsearch": "^8.4.0",
"@getmetal/metal-sdk": "*", "@getmetal/metal-sdk": "*",
"@getzep/zep-js": "^0.9.0", "@getzep/zep-js": "^0.9.0",
"@gomomento/sdk": "^1.47.1", "@gomomento/sdk": "^1.51.1",
"@gomomento/sdk-core": "^1.47.1", "@gomomento/sdk-core": "^1.51.1",
"@gomomento/sdk-web": "^1.47.1",
"@google-ai/generativelanguage": "^0.2.1", "@google-ai/generativelanguage": "^0.2.1",
"@google-cloud/storage": "^6.10.1", "@gradientai/nodejs-sdk": "^1.2.0",
"@huggingface/inference": "^2.6.4", "@huggingface/inference": "^2.6.4",
"@mozilla/readability": "*", "@mozilla/readability": "*",
"@notionhq/client": "^2.2.10",
"@opensearch-project/opensearch": "*", "@opensearch-project/opensearch": "*",
"@pinecone-database/pinecone": "^1.1.0", "@pinecone-database/pinecone": "^1.1.0",
"@planetscale/database": "^1.8.0", "@planetscale/database": "^1.8.0",
"@qdrant/js-client-rest": "^1.2.0", "@qdrant/js-client-rest": "^1.2.0",
"@raycast/api": "^1.55.2", "@raycast/api": "^1.55.2",
"@rockset/client": "^0.9.1",
"@smithy/eventstream-codec": "^2.0.5", "@smithy/eventstream-codec": "^2.0.5",
"@smithy/protocol-http": "^3.0.6", "@smithy/protocol-http": "^3.0.6",
"@smithy/signature-v4": "^2.0.10", "@smithy/signature-v4": "^2.0.10",
@ -210,52 +185,37 @@
"@vercel/kv": "^0.2.3", "@vercel/kv": "^0.2.3",
"@vercel/postgres": "^0.5.0", "@vercel/postgres": "^0.5.0",
"@writerai/writer-sdk": "^0.40.2", "@writerai/writer-sdk": "^0.40.2",
"@xata.io/client": "^0.25.1", "@xata.io/client": "^0.28.0",
"@xenova/transformers": "^2.5.4", "@xenova/transformers": "^2.5.4",
"@zilliz/milvus2-sdk-node": ">=2.2.7", "@zilliz/milvus2-sdk-node": ">=2.2.7",
"apify-client": "^2.7.1",
"assemblyai": "^2.0.2",
"axios": "*",
"cassandra-driver": "^4.7.2", "cassandra-driver": "^4.7.2",
"cheerio": "^1.0.0-rc.12",
"chromadb": "*", "chromadb": "*",
"closevector-common": "0.1.0-alpha.1", "closevector-common": "0.1.0-alpha.1",
"closevector-node": "0.1.0-alpha.10", "closevector-node": "0.1.0-alpha.10",
"closevector-web": "0.1.0-alpha.16", "closevector-web": "0.1.0-alpha.16",
"cohere-ai": ">=6.0.0", "cohere-ai": ">=6.0.0",
"convex": "^1.3.1", "convex": "^1.3.1",
"d3-dsv": "^2.0.0", "discord.js": "^14.14.1",
"epub2": "^3.0.1",
"faiss-node": "^0.5.1", "faiss-node": "^0.5.1",
"fast-xml-parser": "^4.2.7",
"firebase-admin": "^11.9.0", "firebase-admin": "^11.9.0",
"google-auth-library": "^8.9.0", "google-auth-library": "^8.9.0",
"googleapis": "^126.0.1", "googleapis": "^126.0.1",
"hnswlib-node": "^1.4.2", "hnswlib-node": "^1.4.2",
"html-to-text": "^9.0.5", "html-to-text": "^9.0.5",
"ignore": "^5.2.0",
"ioredis": "^5.3.2", "ioredis": "^5.3.2",
"jsdom": "*", "jsdom": "*",
"llmonitor": "^0.5.8", "llmonitor": "^0.5.9",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mammoth": "*",
"mongodb": "^5.2.0", "mongodb": "^5.2.0",
"mysql2": "^3.3.3", "mysql2": "^3.3.3",
"neo4j-driver": "*", "neo4j-driver": "*",
"node-llama-cpp": "*", "node-llama-cpp": "*",
"notion-to-md": "^3.1.0",
"pdf-parse": "1.1.1",
"peggy": "^3.0.2",
"pg": "^8.11.0", "pg": "^8.11.0",
"pg-copy-streams": "^6.0.5", "pg-copy-streams": "^6.0.5",
"pickleparser": "^0.2.1", "pickleparser": "^0.2.1",
"playwright": "^1.32.1",
"portkey-ai": "^0.1.11", "portkey-ai": "^0.1.11",
"puppeteer": "^19.7.2",
"redis": "^4.6.4", "redis": "^4.6.4",
"replicate": "^0.18.0", "replicate": "^0.18.0",
"sonix-speech-recognition": "^2.1.1",
"srt-parser-2": "^1.2.2",
"typeorm": "^0.3.12", "typeorm": "^0.3.12",
"typesense": "^1.5.3", "typesense": "^1.5.3",
"usearch": "^1.1.1", "usearch": "^1.1.1",
@ -263,9 +223,7 @@
"voy-search": "0.6.2", "voy-search": "0.6.2",
"weaviate-ts-client": "^1.4.0", "weaviate-ts-client": "^1.4.0",
"web-auth-library": "^1.0.3", "web-auth-library": "^1.0.3",
"ws": "^8.14.2", "ws": "^8.14.2"
"youtube-transcript": "^1.0.6",
"youtubei.js": "^5.8.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@aws-crypto/sha256-js": { "@aws-crypto/sha256-js": {
@ -283,9 +241,6 @@
"@aws-sdk/client-lambda": { "@aws-sdk/client-lambda": {
"optional": true "optional": true
}, },
"@aws-sdk/client-s3": {
"optional": true
},
"@aws-sdk/client-sagemaker-runtime": { "@aws-sdk/client-sagemaker-runtime": {
"optional": true "optional": true
}, },
@ -295,15 +250,15 @@
"@aws-sdk/credential-provider-node": { "@aws-sdk/credential-provider-node": {
"optional": true "optional": true
}, },
"@azure/storage-blob": {
"optional": true
},
"@clickhouse/client": { "@clickhouse/client": {
"optional": true "optional": true
}, },
"@cloudflare/ai": { "@cloudflare/ai": {
"optional": true "optional": true
}, },
"@datastax/astra-db-ts": {
"optional": true
},
"@elastic/elasticsearch": { "@elastic/elasticsearch": {
"optional": true "optional": true
}, },
@ -319,13 +274,10 @@
"@gomomento/sdk-core": { "@gomomento/sdk-core": {
"optional": true "optional": true
}, },
"@gomomento/sdk-web": {
"optional": true
},
"@google-ai/generativelanguage": { "@google-ai/generativelanguage": {
"optional": true "optional": true
}, },
"@google-cloud/storage": { "@gradientai/nodejs-sdk": {
"optional": true "optional": true
}, },
"@huggingface/inference": { "@huggingface/inference": {
@ -334,9 +286,6 @@
"@mozilla/readability": { "@mozilla/readability": {
"optional": true "optional": true
}, },
"@notionhq/client": {
"optional": true
},
"@opensearch-project/opensearch": { "@opensearch-project/opensearch": {
"optional": true "optional": true
}, },
@ -352,6 +301,9 @@
"@raycast/api": { "@raycast/api": {
"optional": true "optional": true
}, },
"@rockset/client": {
"optional": true
},
"@smithy/eventstream-codec": { "@smithy/eventstream-codec": {
"optional": true "optional": true
}, },
@ -400,21 +352,9 @@
"@zilliz/milvus2-sdk-node": { "@zilliz/milvus2-sdk-node": {
"optional": true "optional": true
}, },
"apify-client": {
"optional": true
},
"assemblyai": {
"optional": true
},
"axios": {
"optional": true
},
"cassandra-driver": { "cassandra-driver": {
"optional": true "optional": true
}, },
"cheerio": {
"optional": true
},
"chromadb": { "chromadb": {
"optional": true "optional": true
}, },
@ -433,18 +373,12 @@
"convex": { "convex": {
"optional": true "optional": true
}, },
"d3-dsv": { "discord.js": {
"optional": true
},
"epub2": {
"optional": true "optional": true
}, },
"faiss-node": { "faiss-node": {
"optional": true "optional": true
}, },
"fast-xml-parser": {
"optional": true
},
"firebase-admin": { "firebase-admin": {
"optional": true "optional": true
}, },
@ -460,9 +394,6 @@
"html-to-text": { "html-to-text": {
"optional": true "optional": true
}, },
"ignore": {
"optional": true
},
"ioredis": { "ioredis": {
"optional": true "optional": true
}, },
@ -475,9 +406,6 @@
"lodash": { "lodash": {
"optional": true "optional": true
}, },
"mammoth": {
"optional": true
},
"mongodb": { "mongodb": {
"optional": true "optional": true
}, },
@ -490,15 +418,6 @@
"node-llama-cpp": { "node-llama-cpp": {
"optional": true "optional": true
}, },
"notion-to-md": {
"optional": true
},
"pdf-parse": {
"optional": true
},
"peggy": {
"optional": true
},
"pg": { "pg": {
"optional": true "optional": true
}, },
@ -508,27 +427,15 @@
"pickleparser": { "pickleparser": {
"optional": true "optional": true
}, },
"playwright": {
"optional": true
},
"portkey-ai": { "portkey-ai": {
"optional": true "optional": true
}, },
"puppeteer": {
"optional": true
},
"redis": { "redis": {
"optional": true "optional": true
}, },
"replicate": { "replicate": {
"optional": true "optional": true
}, },
"sonix-speech-recognition": {
"optional": true
},
"srt-parser-2": {
"optional": true
},
"typeorm": { "typeorm": {
"optional": true "optional": true
}, },
@ -550,6 +457,337 @@
"web-auth-library": { "web-auth-library": {
"optional": true "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": { "ws": {
"optional": true "optional": true
}, },
@ -562,9 +800,9 @@
} }
}, },
"api/node_modules/langchain/node_modules/@anthropic-ai/sdk": { "api/node_modules/langchain/node_modules/@anthropic-ai/sdk": {
"version": "0.6.8", "version": "0.9.1",
"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.6.8.tgz", "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.9.1.tgz",
"integrity": "sha512-z4gDFrBf+W2wOVvwA3CA+5bfKOxQhPeXQo7+ITWj3r3XPulIMEasVT0KrD41G+anr5Yc3d2PKvXKB6b1LSon5w==", "integrity": "sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA==",
"dependencies": { "dependencies": {
"@types/node": "^18.11.18", "@types/node": "^18.11.18",
"@types/node-fetch": "^2.6.4", "@types/node-fetch": "^2.6.4",
@ -577,6 +815,19 @@
"web-streams-polyfill": "^3.2.1" "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": { "api/node_modules/uuid": {
"version": "9.0.1", "version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
@ -597,6 +848,13 @@
"node": ">= 8" "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": { "client": {
"name": "@librechat/frontend", "name": "@librechat/frontend",
"version": "0.6.5", "version": "0.6.5",
@ -6189,9 +6447,9 @@
} }
}, },
"node_modules/@langchain/core": { "node_modules/@langchain/core": {
"version": "0.1.1", "version": "0.1.5",
"resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.1.1.tgz", "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.1.5.tgz",
"integrity": "sha512-p+BzmILzGAWjHxzNy1ZygfsNWxZcipWH3zvY0WC33ly+nmBp4n+MCVd25hKQ4YYWOqoOGGWSzFJukd5PxaXMDQ==", "integrity": "sha512-5RdZpbadMYXTKdZrWZ6JeYT09BZssprg+komE+FbXxW+kbGE0QJJaj8dnzPNdzVCAhDLQQTOV2CAM+vOLsaxzQ==",
"dependencies": { "dependencies": {
"ansi-styles": "^5.0.0", "ansi-styles": "^5.0.0",
"camelcase": "6", "camelcase": "6",
@ -6254,6 +6512,21 @@
"node": ">=18" "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": { "node_modules/@librechat/backend": {
"resolved": "api", "resolved": "api",
"link": true "link": true
@ -9785,7 +10058,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
"dev": true, "devOptional": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -13378,6 +13651,13 @@
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
"dev": true "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": { "node_modules/fast-uri": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz",
@ -14270,6 +14550,22 @@
"node": ">=14" "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": { "node_modules/googleapis": {
"version": "126.0.1", "version": "126.0.1",
"resolved": "https://registry.npmjs.org/googleapis/-/googleapis-126.0.1.tgz", "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-126.0.1.tgz",
@ -19131,6 +19427,16 @@
"webidl-conversions": "^3.0.0" "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": { "node_modules/node-html-parser": {
"version": "5.4.2", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", "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": { "node_modules/zod-to-json-schema": {
"version": "3.21.4", "version": "3.20.3",
"resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.21.4.tgz", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.20.3.tgz",
"integrity": "sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==", "integrity": "sha512-/Q3wnyxAfCt94ZcrGiXXoiAfRqasxl9CX64LZ9fj+4dKH68zulUtU0uk1WMxQPfAxQ0ZI70dKzcoW7hHj+DwSQ==",
"peerDependencies": { "peerDependencies": {
"zod": "^3.21.4" "zod": "^3.20.0"
} }
}, },
"node_modules/zwitch": { "node_modules/zwitch": {

View file

@ -229,7 +229,6 @@ export const tMessageSchema = z.object({
.default(() => new Date().toISOString()), .default(() => new Date().toISOString()),
current: z.boolean().optional(), current: z.boolean().optional(),
unfinished: z.boolean().optional(), unfinished: z.boolean().optional(),
submitting: z.boolean().optional(),
searchResult: z.boolean().optional(), searchResult: z.boolean().optional(),
finish_reason: z.string().optional(), finish_reason: z.string().optional(),
}); });