UNPKG

rag-cli-tester

Version:

A lightweight CLI tool for testing RAG (Retrieval-Augmented Generation) systems with different embedding combinations

213 lines 8.57 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ConfigManager = void 0; const fs = __importStar(require("fs")); const path = __importStar(require("path")); const dotenv_1 = require("dotenv"); const providers_1 = require("./providers"); class ConfigManager { constructor(configPath) { this.configPath = configPath || path.join(process.cwd(), '.rag-config.json'); } async loadConfig() { // Load from .env file in current working directory (where user runs the command) const userEnvPath = path.join(process.cwd(), '.env'); if (fs.existsSync(userEnvPath)) { (0, dotenv_1.config)({ path: userEnvPath }); } else { // Fallback to default .env loading (0, dotenv_1.config)(); } // Try to load from config file let fileConfig = {}; if (fs.existsSync(this.configPath)) { try { const configContent = fs.readFileSync(this.configPath, 'utf-8'); fileConfig = JSON.parse(configContent); } catch (error) { console.warn(`Warning: Could not parse config file ${this.configPath}`); } } // Use Next.js/Supabase standard environment variable names const config = { database: { url: process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || fileConfig.database?.url || '', anonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || fileConfig.database?.anonKey || '' }, embedding: { model: 'local', localModel: process.env.EMBEDDING_MODEL || fileConfig.embedding?.localModel || 'Xenova/all-MiniLM-L6-v2' }, outputPath: process.env.OUTPUT_PATH || fileConfig.outputPath || './rag-test-results' }; return config; } async saveConfig(config) { try { const configJson = JSON.stringify(config, null, 2); fs.writeFileSync(this.configPath, configJson); console.log(`✅ Configuration saved to ${this.configPath}`); } catch (error) { throw new Error(`Failed to save config: ${error instanceof Error ? error.message : String(error)}`); } } getAvailableProviders() { return providers_1.ProviderManager.detectAvailableProviders(); } createEmbeddingConfig(provider) { const config = { model: provider }; switch (provider) { case 'openai': config.openaiApiKey = process.env.OPENAI_API_KEY; config.openaiModel = process.env.OPENAI_EMBEDDING_MODEL || 'text-embedding-3-small'; break; case 'gemini': config.geminiApiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY; config.geminiModel = process.env.GEMINI_EMBEDDING_MODEL || 'embedding-001'; break; case 'local': default: config.localModel = process.env.LOCAL_EMBEDDING_MODEL || 'Xenova/all-MiniLM-L6-v2'; break; } return config; } createLLMConfig(provider) { switch (provider) { case 'openai': return { provider: 'openai', apiKey: process.env.OPENAI_API_KEY || '', model: process.env.OPENAI_MODEL || 'gpt-4o' }; case 'gemini': return { provider: 'gemini', apiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY || '', model: process.env.GEMINI_MODEL || 'gemini-1.5-flash' }; case 'anthropic': return { provider: 'anthropic', apiKey: process.env.ANTHROPIC_API_KEY || '', model: process.env.ANTHROPIC_MODEL || 'claude-3-sonnet-20240229' }; case 'custom': return { provider: 'custom', apiKey: process.env.CUSTOM_API_KEY || '', model: process.env.CUSTOM_MODEL || 'gpt-4o', endpoint: process.env.CUSTOM_ENDPOINT }; default: throw new Error(`Unsupported LLM provider: ${provider}`); } } validateConfig(config) { const errors = []; if (!config.database.url) { errors.push('Database URL is required. Set NEXT_PUBLIC_SUPABASE_URL in your .env file or run "rag-test configure"'); } if (!config.database.anonKey) { errors.push('Database anonymous key is required. Set NEXT_PUBLIC_SUPABASE_ANON_KEY in your .env file or run "rag-test configure"'); } if (!config.embedding.localModel) { errors.push('Embedding model name is required'); } return { isValid: errors.length === 0, errors }; } async initializeConfig() { const inquirer = await Promise.resolve().then(() => __importStar(require('inquirer'))); console.log('🔧 Setting up RAG CLI Tester configuration...\n'); const answers = await inquirer.default.prompt([ { type: 'input', name: 'databaseUrl', message: 'Enter your Supabase URL:', validate: (input) => input.length > 0 || 'URL is required' }, { type: 'input', name: 'databaseKey', message: 'Enter your Supabase anonymous key:', validate: (input) => input.length > 0 || 'Anonymous key is required' }, { type: 'list', name: 'embeddingModel', message: 'Choose embedding model:', choices: [ { name: 'all-MiniLM-L6-v2 (Default, lightweight)', value: 'Xenova/all-MiniLM-L6-v2' }, { name: 'all-mpnet-base-v2 (Better quality, larger)', value: 'Xenova/all-mpnet-base-v2' }, { name: 'multi-qa-MiniLM-L6-cos-v1 (Q&A optimized)', value: 'Xenova/multi-qa-MiniLM-L6-cos-v1' } ], default: 'Xenova/all-MiniLM-L6-v2' }, { type: 'input', name: 'outputPath', message: 'Output directory for test results:', default: './rag-test-results' } ]); const config = { database: { url: answers.databaseUrl, anonKey: answers.databaseKey }, embedding: { model: 'local', localModel: answers.embeddingModel }, outputPath: answers.outputPath }; await this.saveConfig(config); return config; } getConfigPath() { return this.configPath; } } exports.ConfigManager = ConfigManager; //# sourceMappingURL=config.js.map