2025-09-21 20:19:51 -04:00
|
|
|
import { AuthType, EToolResources } from 'librechat-data-provider';
|
2025-08-26 12:10:18 -04:00
|
|
|
import type { TPlugin } from 'librechat-data-provider';
|
2025-08-09 12:02:44 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Filters out duplicate plugins from the list of plugins.
|
|
|
|
|
*
|
|
|
|
|
* @param plugins The list of plugins to filter.
|
|
|
|
|
* @returns The list of plugins with duplicates removed.
|
|
|
|
|
*/
|
|
|
|
|
export const filterUniquePlugins = (plugins?: TPlugin[]): TPlugin[] => {
|
|
|
|
|
const seen = new Set();
|
|
|
|
|
return (
|
|
|
|
|
plugins?.filter((plugin) => {
|
|
|
|
|
const duplicate = seen.has(plugin.pluginKey);
|
|
|
|
|
seen.add(plugin.pluginKey);
|
|
|
|
|
return !duplicate;
|
|
|
|
|
}) || []
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Determines if a plugin is authenticated by checking if all required authentication fields have non-empty values.
|
|
|
|
|
* Supports alternate authentication fields, allowing validation against multiple possible environment variables.
|
|
|
|
|
*
|
|
|
|
|
* @param plugin The plugin object containing the authentication configuration.
|
|
|
|
|
* @returns True if the plugin is authenticated for all required fields, false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
export const checkPluginAuth = (plugin?: TPlugin): boolean => {
|
|
|
|
|
if (!plugin?.authConfig || plugin.authConfig.length === 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return plugin.authConfig.every((authFieldObj) => {
|
💎 fix: Gemini Image Gen Tool Vertex AI Auth and File Storage (#11923)
* chore: saveToCloudStorage function and enhance error handling
- Removed unnecessary parameters and streamlined the logic for saving images to cloud storage.
- Introduced buffer handling for base64 image data and improved the integration with file strategy functions.
- Enhanced error handling during local image saving to ensure robustness.
- Updated the createGeminiImageTool function to reflect changes in the saveToCloudStorage implementation.
* refactor: streamline image persistence logic in GeminiImageGen
- Consolidated image saving functionality by renaming and refactoring the saveToCloudStorage function to persistGeneratedImage.
- Improved error handling and logging for image persistence operations.
- Enhanced the replaceUnwantedChars function to better sanitize input strings.
- Updated createGeminiImageTool to reflect changes in image handling and ensure consistent behavior across storage strategies.
* fix: clean up GeminiImageGen by removing unused functions and improving logging
- Removed the getSafeFormat and persistGeneratedImage functions to streamline image handling.
- Updated logging in createGeminiImageTool for clarity and consistency.
- Consolidated imports by eliminating unused dependencies, enhancing code maintainability.
* chore: update environment configuration and manifest for unused GEMINI_VERTEX_ENABLED
- Removed the Vertex AI configuration option from .env.example to simplify setup.
- Updated the manifest.json to reflect the removal of the Vertex AI dependency in the authentication field.
- Cleaned up the createGeminiImageTool function by eliminating unused fields related to Vertex AI, streamlining the code.
* fix: update loadAuthValues call in loadTools function for GeminiImageGen tool
- Modified the loadAuthValues function call to include throwError: false, preventing exceptions on authentication failures.
- Removed the unused processFileURL parameter from the tool context object, streamlining the code.
* refactor: streamline GoogleGenAI initialization in GeminiImageGen
- Removed unused file system access check for Google application credentials, simplifying the environment setup.
- Added googleAuthOptions to the GoogleGenAI instantiation, enhancing the configuration for authentication.
* fix: update Gemini API Key label and description in manifest.json
- Changed the label to indicate that the Gemini API Key is optional.
- Revised the description to clarify usage with Vertex AI and service accounts, enhancing user guidance.
* fix: enhance abort signal handling in createGeminiImageTool
- Introduced derivedSignal to manage abort events during image generation, improving responsiveness to cancellation requests.
- Added an abortHandler to log when image generation is aborted, enhancing debugging capabilities.
- Ensured proper cleanup of event listeners in the finally block to prevent memory leaks.
* fix: update authentication handling for plugins to support optional fields
- Added support for optional authentication fields in the manifest and PluginAuthForm.
- Updated the checkPluginAuth function to correctly validate plugins with optional fields.
- Enhanced tests to cover scenarios with optional authentication fields, ensuring accurate validation logic.
2026-02-24 08:21:02 -05:00
|
|
|
if (authFieldObj.optional === true) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-09 12:02:44 -04:00
|
|
|
const authFieldOptions = authFieldObj.authField.split('||');
|
|
|
|
|
let isFieldAuthenticated = false;
|
|
|
|
|
|
|
|
|
|
for (const fieldOption of authFieldOptions) {
|
|
|
|
|
const envValue = process.env[fieldOption];
|
|
|
|
|
if (envValue && envValue.trim() !== '' && envValue !== AuthType.USER_PROVIDED) {
|
|
|
|
|
isFieldAuthenticated = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return isFieldAuthenticated;
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param toolkits
|
|
|
|
|
* @param toolName
|
|
|
|
|
* @returns toolKey
|
|
|
|
|
*/
|
|
|
|
|
export function getToolkitKey({
|
|
|
|
|
toolkits,
|
|
|
|
|
toolName,
|
|
|
|
|
}: {
|
|
|
|
|
toolkits: TPlugin[];
|
|
|
|
|
toolName?: string;
|
|
|
|
|
}): string | undefined {
|
|
|
|
|
let toolkitKey: string | undefined;
|
|
|
|
|
if (!toolName) {
|
|
|
|
|
return toolkitKey;
|
|
|
|
|
}
|
|
|
|
|
for (const toolkit of toolkits) {
|
|
|
|
|
if (toolName.startsWith(EToolResources.image_edit)) {
|
|
|
|
|
const splitMatches = toolkit.pluginKey.split('_');
|
|
|
|
|
const suffix = splitMatches[splitMatches.length - 1];
|
|
|
|
|
if (toolName.endsWith(suffix)) {
|
|
|
|
|
toolkitKey = toolkit.pluginKey;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (toolName.startsWith(toolkit.pluginKey)) {
|
|
|
|
|
toolkitKey = toolkit.pluginKey;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return toolkitKey;
|
|
|
|
|
}
|