diff --git a/api/app/clients/BaseClient.js b/api/app/clients/BaseClient.js index 22940bae5f..0d769155b1 100644 --- a/api/app/clients/BaseClient.js +++ b/api/app/clients/BaseClient.js @@ -1,6 +1,12 @@ const crypto = require('crypto'); const fetch = require('node-fetch'); -const { supportsBalanceCheck, Constants, CacheKeys, Time } = require('librechat-data-provider'); +const { + supportsBalanceCheck, + ErrorTypes, + Constants, + CacheKeys, + Time, +} = require('librechat-data-provider'); const { getMessages, saveMessage, updateMessage, saveConvo } = require('~/models'); const { addSpaceIfNeeded, isEnabled } = require('~/server/utils'); const checkBalance = require('~/models/checkBalance'); @@ -383,9 +389,10 @@ class BaseClient { const latestMessage = orderedWithInstructions[orderedWithInstructions.length - 1]; if (payload.length === 0 && !shouldSummarize && latestMessage) { - throw new Error( - `Prompt token count of ${latestMessage.tokenCount} exceeds max token count of ${this.maxContextTokens}.`, - ); + const info = `${latestMessage.tokenCount} / ${this.maxContextTokens}`; + const errorMessage = `{ "type": "${ErrorTypes.INPUT_LENGTH}", "info": "${info}" }`; + logger.warn(`Prompt token count exceeds max token count (${info}).`); + throw new Error(errorMessage); } if (usePrevSummary) { diff --git a/client/src/components/Messages/Content/Error.tsx b/client/src/components/Messages/Content/Error.tsx index 966528f124..476360080f 100644 --- a/client/src/components/Messages/Content/Error.tsx +++ b/client/src/components/Messages/Content/Error.tsx @@ -33,6 +33,10 @@ type TExpiredKey = { endpoint: string; }; +type TInputLength = { + info: string; +}; + const errorMessages = { [ErrorTypes.MODERATION]: 'com_error_moderation', [ErrorTypes.NO_USER_KEY]: 'com_error_no_user_key', @@ -42,6 +46,10 @@ const errorMessages = { const { expiredAt, endpoint } = json; return localize('com_error_expired_user_key', endpoint, expiredAt); }, + [ErrorTypes.INPUT_LENGTH]: (json: TInputLength, localize: LocalizeFunction) => { + const { info } = json; + return localize('com_error_input_length', info); + }, [ViolationTypes.BAN]: 'Your account has been temporarily banned due to violations of our service.', invalid_api_key: diff --git a/client/src/localization/languages/Eng.ts b/client/src/localization/languages/Eng.ts index 3d239bb8f5..efcd403ad3 100644 --- a/client/src/localization/languages/Eng.ts +++ b/client/src/localization/languages/Eng.ts @@ -25,6 +25,8 @@ export default { com_error_invalid_user_key: 'Invalid key provided. Please provide a valid key and try again.', com_error_expired_user_key: 'Provided key for {0} expired at {1}. Please provide a new key and try again.', + com_error_input_length: + 'The latest message token count is too long, exceeding the token limit ({0} respectively). Please shorten your message, adjust the max context size from the conversation parameters, or fork the conversation to continue.', com_files_no_results: 'No results.', com_files_filter: 'Filter files...', com_files_number_selected: '{0} of {1} file(s) selected', diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index a22512636e..405e0f7793 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -839,6 +839,11 @@ export enum ErrorTypes { * Moderation error */ MODERATION = 'moderation', + + /** + * Prompt exceeds max length + */ + INPUT_LENGTH = 'INPUT_LENGTH', } /**