From 8df0ecd438bd53324044c46224ed6712d849d890 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Mon, 18 Aug 2025 02:16:16 -0400 Subject: [PATCH] refactor: enhance AppConfig to include fileStrategies and update related file strategy logic --- api/server/services/AppService.js | 1 + api/server/utils/getFileStrategy.js | 27 +++++++++++---------------- packages/api/src/types/config.ts | 2 ++ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/api/server/services/AppService.js b/api/server/services/AppService.js index 0390faf515..881f6dc9ca 100644 --- a/api/server/services/AppService.js +++ b/api/server/services/AppService.js @@ -105,6 +105,7 @@ const AppService = async () => { imageOutputType, interfaceConfig, turnstileConfig, + fileStrategies: config.fileStrategies, }; const agentsDefaults = agentsConfigSetup(config); diff --git a/api/server/utils/getFileStrategy.js b/api/server/utils/getFileStrategy.js index 4e3cf671e0..2e3dfdd79e 100644 --- a/api/server/utils/getFileStrategy.js +++ b/api/server/utils/getFileStrategy.js @@ -1,14 +1,14 @@ -const { FileContext } = require('librechat-data-provider'); +const { FileSources, FileContext } = require('librechat-data-provider'); /** * Determines the appropriate file storage strategy based on file type and configuration. * - * @param {Object} config - App configuration object containing fileStrategy and fileStrategies + * @param {AppConfig} appConfig - App configuration object containing fileStrategy and fileStrategies * @param {Object} options - File context options * @param {boolean} options.isAvatar - Whether this is an avatar upload * @param {boolean} options.isImage - Whether this is an image upload * @param {string} options.context - File context from FileContext enum - * @returns {string} Storage strategy to use (e.g., 'local', 's3', 'azure') + * @returns {string} Storage strategy to use (e.g., FileSources.local, 's3', 'azure') * * @example * // Legacy single strategy @@ -19,30 +19,25 @@ const { FileContext } = require('librechat-data-provider'); * getFileStrategy( * { * fileStrategy: 's3', - * fileStrategies: { avatar: 'local', document: 's3' } + * fileStrategies: { avatar: FileSources.local, document: 's3' } * }, * { isAvatar: true } - * ) // Returns 'local' + * ) // Returns FileSources.local */ function getFileStrategy(appConfig, { isAvatar = false, isImage = false, context = null } = {}) { - // Handle both old (config object) and new (`appConfig` object) calling patterns - const isAppConfig = appConfig.fileStrategy !== undefined; - const config = isAppConfig ? appConfig.config : appConfig; - const fileStrategy = isAppConfig ? appConfig.fileStrategy : appConfig.fileStrategy; - // Fallback to legacy single strategy if no granular config - if (!config?.fileStrategies) { - return fileStrategy || 'local'; // Default to 'local' if undefined + if (!appConfig?.fileStrategies) { + return appConfig.fileStrategy || FileSources.local; // Default to FileSources.local if undefined } - const strategies = config.fileStrategies; - const defaultStrategy = strategies.default || fileStrategy || 'local'; + const strategies = appConfig.fileStrategies; + const defaultStrategy = strategies.default || appConfig.fileStrategy || FileSources.local; // Priority order for strategy selection: // 1. Specific file type strategy // 2. Default strategy from fileStrategies // 3. Legacy fileStrategy - // 4. 'local' as final fallback + // 4. FileSources.local as final fallback let selectedStrategy; @@ -55,7 +50,7 @@ function getFileStrategy(appConfig, { isAvatar = false, isImage = false, context selectedStrategy = strategies.document || defaultStrategy; } - return selectedStrategy || 'local'; // Final fallback to 'local' + return selectedStrategy || FileSources.local; // Final fallback to FileSources.local } module.exports = { getFileStrategy }; diff --git a/packages/api/src/types/config.ts b/packages/api/src/types/config.ts index 45e512b61a..a3a205fef7 100644 --- a/packages/api/src/types/config.ts +++ b/packages/api/src/types/config.ts @@ -31,6 +31,8 @@ export interface AppConfig { webSearch?: TCustomConfig['webSearch']; /** File storage strategy ('local', 's3', 'firebase', 'azure_blob') */ fileStrategy: FileSources.local | FileSources.s3 | FileSources.firebase | FileSources.azure_blob; + /** File strategies configuration */ + fileStrategies: TCustomConfig['fileStrategies']; /** Registration configurations */ registration?: TCustomConfig['registration']; /** Actions configurations */