From 487bfa473bb902e2401e458a75881f8e9889bbfe Mon Sep 17 00:00:00 2001 From: David Snelling Date: Thu, 19 Jun 2025 15:12:51 -0700 Subject: [PATCH] **feat: enhance BrainyData storage configuration with support for custom S3 endpoints and extended types** ### Changes: - Introduced `ExtendedBrainyDataConfig` interface to include `rootDirectory` in the storage configuration. - Enhanced S3 storage setup: - Added support for `customS3Storage` when `S3_ENDPOINT` is provided. - Retained standard `s3Storage` configuration for AWS S3 without custom endpoints. - Updated fallback logic for default storage types (`filesystem`, `memory`) with consistent handling for `rootDirectory`. - Refined `initializeBrainy` function to improve readability and configuration extensibility. - Updated TypeScript typings for improved clarity and maintainability. ### Purpose: Improved the `initializeBrainy` function by extending storage configuration capabilities, allowing seamless integration of custom S3 endpoints alongside standard AWS S3 settings. Enhanced overall code readability and adaptability for diverse storage configurations. --- cloud-wrapper/src/services/brainyService.ts | 78 +++++++++++++-------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/cloud-wrapper/src/services/brainyService.ts b/cloud-wrapper/src/services/brainyService.ts index 865f09e5..8fa21853 100644 --- a/cloud-wrapper/src/services/brainyService.ts +++ b/cloud-wrapper/src/services/brainyService.ts @@ -1,8 +1,17 @@ -import { BrainyData } from '@soulcraft/brainy'; -import dotenv from 'dotenv'; +import { BrainyData, BrainyDataConfig } from '@soulcraft/brainy' +import dotenv from 'dotenv' // Load environment variables -dotenv.config(); +dotenv.config() + +/** + * Extended configuration interface that includes rootDirectory + */ +interface ExtendedBrainyDataConfig extends BrainyDataConfig { + storage: BrainyDataConfig['storage'] & { + rootDirectory?: string + } +} /** * Initialize the Brainy instance with appropriate configuration @@ -10,39 +19,50 @@ dotenv.config(); */ export async function initializeBrainy(): Promise { // Get storage configuration from environment variables - const storageType = process.env.STORAGE_TYPE || 'filesystem'; + const storageType = process.env.STORAGE_TYPE || 'filesystem' // Create configuration object - const config: any = { + const config: ExtendedBrainyDataConfig = { storage: {} - }; + } // Configure storage based on type switch (storageType) { case 's3': // Configure S3 storage - config.storage.s3Storage = { - bucketName: process.env.S3_BUCKET_NAME, - accessKeyId: process.env.S3_ACCESS_KEY_ID, - secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, - region: process.env.S3_REGION || 'us-east-1', - endpoint: process.env.S3_ENDPOINT // Optional for custom S3-compatible services - }; - break; + if (process.env.S3_ENDPOINT) { + // Use customS3Storage for S3-compatible services with custom endpoints + config.storage.customS3Storage = { + bucketName: process.env.S3_BUCKET_NAME, + accessKeyId: process.env.S3_ACCESS_KEY_ID, + secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, + region: process.env.S3_REGION || 'us-east-1', + endpoint: process.env.S3_ENDPOINT + } + } else { + // Use standard S3 storage for AWS S3 + config.storage.s3Storage = { + bucketName: process.env.S3_BUCKET_NAME, + accessKeyId: process.env.S3_ACCESS_KEY_ID, + secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, + region: process.env.S3_REGION || 'us-east-1' + } + } + break case 'filesystem': // Configure filesystem storage - config.storage.rootDirectory = process.env.STORAGE_ROOT_DIR || './data'; - break; + config.storage.rootDirectory = process.env.STORAGE_ROOT_DIR || './data' + break case 'memory': // No additional configuration needed for memory storage - break; + break default: // Default to filesystem storage - config.storage.rootDirectory = process.env.STORAGE_ROOT_DIR || './data'; - break; + config.storage.rootDirectory = process.env.STORAGE_ROOT_DIR || './data' + break } // Note: Universal Sentence Encoder is now the only embedding option @@ -52,26 +72,26 @@ export async function initializeBrainy(): Promise { if (process.env.HNSW_M) { config.hnsw = { M: parseInt(process.env.HNSW_M, 10), - efConstruction: process.env.HNSW_EF_CONSTRUCTION - ? parseInt(process.env.HNSW_EF_CONSTRUCTION, 10) + efConstruction: process.env.HNSW_EF_CONSTRUCTION + ? parseInt(process.env.HNSW_EF_CONSTRUCTION, 10) : 200, - efSearch: process.env.HNSW_EF_SEARCH - ? parseInt(process.env.HNSW_EF_SEARCH, 10) + efSearch: process.env.HNSW_EF_SEARCH + ? parseInt(process.env.HNSW_EF_SEARCH, 10) : 50 - }; + } } // Create and initialize the Brainy instance - const brainy = new BrainyData(config); - await brainy.init(); + const brainy = new BrainyData(config) + await brainy.init() - return brainy; + return brainy } /** * Get the current storage type being used by Brainy */ export async function getStorageType(brainy: BrainyData): Promise { - const status = await brainy.status(); - return status.storageType || 'unknown'; + const status = await brainy.status() + return status.type || 'unknown' }