import { VoyageAIEmbedding, GeminiEmbedding, OllamaEmbedding } from "@zilliz/claude-context-core";
import { ContextMcpConfig } from "./config.js";
import { IbthinkEmbedding } from "./ibthink-embedding.js";
import { OpenAIEmbedding } from "./openai-embedding.js";
// Helper function to create embedding instance based on provider
export function createEmbeddingInstance(config: ContextMcpConfig): OpenAIEmbedding | VoyageAIEmbedding | GeminiEmbedding | OllamaEmbedding | IbthinkEmbedding {
console.log(`[EMBEDDING] Creating ${config.embeddingProvider} embedding instance...`);
switch (config.embeddingProvider) {
case 'OpenAI':
if (!config.openaiApiKey || config.openaiApiKey === 'placeholder') {
console.error(`[EMBEDDING] ❌ OpenAI API key is required but not provided`);
throw new Error('OPENAI_API_KEY is required for OpenAI embedding provider');
}
console.log(`[EMBEDDING] 🔧 Configuring custom OpenAI with model: ${config.embeddingModel}`);
const openaiEmbedding = new OpenAIEmbedding({
apiKey: config.openaiApiKey,
model: config.embeddingModel,
...(config.openaiBaseUrl && { baseURL: config.openaiBaseUrl })
});
console.log(`[EMBEDDING] ✅ Custom OpenAI embedding instance created successfully`);
return openaiEmbedding;
case 'VoyageAI':
if (!config.voyageaiApiKey) {
console.error(`[EMBEDDING] ❌ VoyageAI API key is required but not provided`);
throw new Error('VOYAGEAI_API_KEY is required for VoyageAI embedding provider');
}
console.log(`[EMBEDDING] 🔧 Configuring VoyageAI with model: ${config.embeddingModel}`);
const voyageEmbedding = new VoyageAIEmbedding({
apiKey: config.voyageaiApiKey,
model: config.embeddingModel
});
console.log(`[EMBEDDING] ✅ VoyageAI embedding instance created successfully`);
return voyageEmbedding;
case 'Gemini':
if (!config.geminiApiKey) {
console.error(`[EMBEDDING] ❌ Gemini API key is required but not provided`);
throw new Error('GEMINI_API_KEY is required for Gemini embedding provider');
}
console.log(`[EMBEDDING] 🔧 Configuring Gemini with model: ${config.embeddingModel}`);
const geminiEmbedding = new GeminiEmbedding({
apiKey: config.geminiApiKey,
model: config.embeddingModel,
...(config.geminiBaseUrl && { baseURL: config.geminiBaseUrl })
});
console.log(`[EMBEDDING] ✅ Gemini embedding instance created successfully`);
return geminiEmbedding;
case 'Ollama':
const ollamaHost = config.ollamaHost || 'http://127.0.0.1:11434';
console.log(`[EMBEDDING] 🔧 Configuring Ollama with model: ${config.embeddingModel}, host: ${ollamaHost}`);
const ollamaEmbedding = new OllamaEmbedding({
model: config.embeddingModel,
host: config.ollamaHost
});
console.log(`[EMBEDDING] ✅ Ollama embedding instance created successfully`);
return ollamaEmbedding;
case 'Ibthink':
if (!config.ibthinkApiKey) {
console.error(`[EMBEDDING] ❌ Ibthink API key is required but not provided`);
throw new Error('IBTHINK_API_KEY is required for Ibthink embedding provider');
}
console.log(`[EMBEDDING] 🔧 Configuring Ibthink with model: ${config.embeddingModel}`);
const ibthinkEmbedding = new IbthinkEmbedding({
model: config.embeddingModel,
apiKey: config.ibthinkApiKey,
...(config.ibthinkBaseUrl && { baseURL: config.ibthinkBaseUrl })
});
console.log(`[EMBEDDING] ✅ Ibthink embedding instance created successfully`);
return ibthinkEmbedding;
default:
console.error(`[EMBEDDING] ❌ Unsupported embedding provider: ${config.embeddingProvider}`);
throw new Error(`Unsupported embedding provider: ${config.embeddingProvider}`);
}
}
export function logEmbeddingProviderInfo(config: ContextMcpConfig, embedding: OpenAIEmbedding | VoyageAIEmbedding | GeminiEmbedding | OllamaEmbedding | IbthinkEmbedding): void {
console.log(`[EMBEDDING] ✅ Successfully initialized ${config.embeddingProvider} embedding provider`);
console.log(`[EMBEDDING] Provider details - Model: ${config.embeddingModel}, Dimension: ${embedding.getDimension()}`);
// Log provider-specific configuration details
switch (config.embeddingProvider) {
case 'OpenAI':
console.log(`[EMBEDDING] OpenAI configuration - API Key: ${config.openaiApiKey ? '✅ Provided' : '❌ Missing'}, Base URL: ${config.openaiBaseUrl || 'Default'}`);
break;
case 'VoyageAI':
console.log(`[EMBEDDING] VoyageAI configuration - API Key: ${config.voyageaiApiKey ? '✅ Provided' : '❌ Missing'}`);
break;
case 'Gemini':
console.log(`[EMBEDDING] Gemini configuration - API Key: ${config.geminiApiKey ? '✅ Provided' : '❌ Missing'}, Base URL: ${config.geminiBaseUrl || 'Default'}`);
break;
case 'Ollama':
console.log(`[EMBEDDING] Ollama configuration - Host: ${config.ollamaHost || 'http://127.0.0.1:11434'}, Model: ${config.embeddingModel}`);
break;
case 'Ibthink':
console.log(`[EMBEDDING] Ibthink configuration - API Key: ${config.ibthinkApiKey ? '✅ Provided' : '❌ Missing'}, Base URL: ${config.ibthinkBaseUrl || 'Default'}`);
break;
}
}