Source: connectors/EmbeddingConnectorFactory.js

/**
 * Factory for creating embedding connectors based on provider type
 */
import logger from 'loglevel'
import OllamaConnector from './OllamaConnector.js'
import NomicConnector from './NomicConnector.js'

export default class EmbeddingConnectorFactory {
    /**
     * Create an embedding connector based on provider configuration
     * @param {Object} config - Provider configuration
     * @param {string} config.provider - Provider type ('ollama', 'nomic')
     * @param {string} config.model - Model name to use
     * @param {Object} config.options - Provider-specific options
     * @returns {Object} - Embedding connector instance
     */
    static createConnector(config = {}) {
        const { provider = 'ollama', model, options = {} } = config
        
        logger.debug(`Creating embedding connector for provider: ${provider}`)
        
        switch (provider.toLowerCase()) {
            case 'ollama':
                return new OllamaConnector(
                    options.baseUrl || 'http://localhost:11434',
                    model || 'nomic-embed-text'
                )
                
            case 'nomic':
                return new NomicConnector(
                    options.apiKey || process.env.NOMIC_API_KEY,
                    model || 'nomic-embed-text-v1.5'
                )
                
            default:
                logger.warn(`Unknown embedding provider: ${provider}, falling back to Ollama`)
                return new OllamaConnector(
                    options.baseUrl || 'http://localhost:11434',
                    model || 'nomic-embed-text'
                )
        }
    }
    
    /**
     * Get list of supported embedding providers
     * @returns {string[]} - Array of supported provider names
     */
    static getSupportedProviders() {
        return ['ollama', 'nomic']
    }
    
    /**
     * Check if a provider is supported
     * @param {string} provider - Provider name to check
     * @returns {boolean} - Whether the provider is supported
     */
    static isProviderSupported(provider) {
        return this.getSupportedProviders().includes(provider.toLowerCase())
    }
    
    /**
     * Get default configuration for a provider
     * @param {string} provider - Provider name
     * @returns {Object} - Default configuration object
     */
    static getDefaultConfig(provider) {
        const configs = {
            ollama: {
                provider: 'ollama',
                model: 'nomic-embed-text',
                options: {
                    baseUrl: 'http://localhost:11434'
                }
            },
            nomic: {
                provider: 'nomic',
                model: 'nomic-embed-text-v1.5',
                options: {
                    apiKey: process.env.NOMIC_API_KEY
                }
            }
        }
        
        return configs[provider.toLowerCase()] || configs.ollama
    }
}