rag-cli-tester
Version:
A lightweight CLI tool for testing RAG (Retrieval-Augmented Generation) systems with different embedding combinations
213 lines • 8.57 kB
JavaScript
;
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