better-qdrant-mcp-server
Version:
MCP server for enhanced Qdrant vector database functionality
47 lines • 2.02 kB
JavaScript
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