UNPKG

ultimate-mcp-server

Version:

The definitive all-in-one Model Context Protocol server for AI-assisted coding across 30+ platforms

122 lines 4.07 kB
import OpenAI from 'openai'; import axios from 'axios'; export class BaseEmbeddingProvider { normalizeVector(vector) { const magnitude = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0)); return vector.map(val => val / magnitude); } } export class OpenAIEmbeddingProvider extends BaseEmbeddingProvider { name = 'openai'; model; dimension; client; constructor(config) { super(); this.model = config.model || 'text-embedding-3-small'; this.dimension = config.dimension || (this.model === 'text-embedding-3-small' ? 1536 : 3072); this.client = new OpenAI({ apiKey: config.apiKey || process.env.OPENAI_API_KEY }); } async embed(text) { const response = await this.client.embeddings.create({ model: this.model, input: text, dimensions: this.dimension }); return response.data[0].embedding; } async embedBatch(texts) { const response = await this.client.embeddings.create({ model: this.model, input: texts, dimensions: this.dimension }); return response.data.map(item => item.embedding); } } export class CohereEmbeddingProvider extends BaseEmbeddingProvider { name = 'cohere'; model; dimension = 1024; apiKey; baseURL = 'https://api.cohere.ai/v1'; constructor(config) { super(); this.model = config.model || 'embed-english-v3.0'; this.apiKey = config.apiKey || process.env.COHERE_API_KEY || ''; } async embed(text) { const response = await axios.post(`${this.baseURL}/embed`, { texts: [text], model: this.model, input_type: 'search_document' }, { headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' } }); return response.data.embeddings[0]; } async embedBatch(texts) { const response = await axios.post(`${this.baseURL}/embed`, { texts, model: this.model, input_type: 'search_document' }, { headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' } }); return response.data.embeddings; } } export class LocalEmbeddingProvider extends BaseEmbeddingProvider { name = 'local'; model = 'simple-hash'; dimension = 384; constructor(config) { super(); if (config.dimension) { this.dimension = config.dimension; } } async embed(text) { // Simple hash-based embedding for local testing // In production, use sentence-transformers or similar const vector = new Array(this.dimension).fill(0); for (let i = 0; i < text.length; i++) { const charCode = text.charCodeAt(i); const index = (charCode * (i + 1)) % this.dimension; vector[index] += charCode / 255.0; } // Add some randomness for variation for (let i = 0; i < this.dimension; i++) { vector[i] += (Math.sin(i * text.length) + 1) / 2; } return this.normalizeVector(vector); } async embedBatch(texts) { return Promise.all(texts.map(text => this.embed(text))); } } export class EmbeddingProviderFactory { static create(config) { switch (config.provider) { case 'openai': return new OpenAIEmbeddingProvider(config); case 'cohere': return new CohereEmbeddingProvider(config); case 'local': return new LocalEmbeddingProvider(config); default: throw new Error(`Unknown embedding provider: ${config.provider}`); } } } // Export convenience function export function createEmbeddingProvider(config) { return EmbeddingProviderFactory.create(config); } //# sourceMappingURL=embeddings.js.map