import { BrainyData, BrainyDataConfig } from '@soulcraft/brainy' import dotenv from 'dotenv' // Load environment variables dotenv.config() /** * Extended configuration interface that includes rootDirectory */ interface ExtendedBrainyDataConfig extends BrainyDataConfig { storage: BrainyDataConfig['storage'] & { rootDirectory?: string } } /** * Initialize the Brainy instance with appropriate configuration * based on environment variables */ export async function initializeBrainy(): Promise { // Get storage configuration from environment variables const storageType = process.env.STORAGE_TYPE || 'filesystem' // Create configuration object const config: ExtendedBrainyDataConfig = { storage: {} } // Configure storage based on type switch (storageType) { case 's3': // Configure S3 storage 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 case 'memory': // No additional configuration needed for memory storage break default: // Default to filesystem storage config.storage.rootDirectory = process.env.STORAGE_ROOT_DIR || './data' break } // Note: Universal Sentence Encoder is now the only embedding option // TensorFlow.js is required for embedding to work // Configure HNSW index parameters if provided 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) : 200, 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() 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.type || 'unknown' }