UNPKG

better-qdrant-mcp-server

Version:

MCP server for enhanced Qdrant vector database functionality

47 lines 2.02 kB
import { BaseEmbeddingService } from './base.js'; export class FastEmbedService extends BaseEmbeddingService { constructor(model) { super(undefined, undefined, model || 'BAAI/bge-small-en-v1.5'); // FastEmbed models typically produce 384-dimensional embeddings this.vectorSize = 384; this.defaultModel = 'BAAI/bge-small-en-v1.5'; this.embedder = null; } async initializeEmbedder() { if (!this.embedder) { // Dynamic import — cast to any to avoid NodeNext resolution picking up stale types const fastembed = await import('fastembed'); const FlagEmbedding = fastembed.FlagEmbedding; const EmbeddingModel = fastembed.EmbeddingModel; const modelName = this.model || this.defaultModel; // Map string model name to EmbeddingModel enum value, fallback to BGESmallENV15 const modelEnum = Object.values(EmbeddingModel).includes(modelName) ? modelName : EmbeddingModel.BGESmallENV15; this.embedder = await FlagEmbedding.init({ model: modelEnum }); } } async generateEmbeddings(texts) { await this.initializeEmbedder(); if (!this.embedder) { throw new Error('FastEmbed embedder not initialized'); } const embeddings = []; // The fastembed library's embed() returns an AsyncGenerator that yields batches of embeddings for await (const batch of this.embedder.embed(texts)) { for (const embedding of batch) { // Convert to plain number[] for proper JSON serialization // Array.from() handles both Float32Array and regular arrays safely embeddings.push(Array.from(embedding)); } } return embeddings; } requiresApiKey() { return false; } validateConfig() { // No validation needed as FastEmbed runs locally } } //# sourceMappingURL=fastembed.js.map