@rokmohar/medusa-plugin-meilisearch
Version:
Meilisearch plugin for Medusa 2
157 lines • 10 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MeiliSearchEmbedder = void 0;
/**
* MeiliSearch Embedder Service for AI-powered semantic search
* Handles vector search configuration and embedding management
*/
class MeiliSearchEmbedder {
config_;
client_;
constructor(config, client) {
this.config_ = config;
this.client_ = client;
}
/**
* Check if vector search is enabled and properly configured
*/
isVectorSearchEnabled() {
return this.config_.vectorSearch?.enabled === true;
}
/**
* Configure embedders for an index based on vectorSearch configuration
*/
async configureEmbedders(indexKey) {
const { vectorSearch } = this.config_;
if (!vectorSearch?.enabled) {
return;
}
try {
const embedderConfig = this.createEmbedderConfig(vectorSearch.embedding);
const embedders = {
default: embedderConfig,
};
await this.client_.index(indexKey).updateEmbedders(embedders);
// Successfully configured embedders
}
catch {
// Failed to configure embedders - continue without vector search
// Don't throw - let the system continue without vector search
}
}
/**
* Create embedder configuration based on provider settings
*/
createEmbedderConfig(embeddingConfig) {
const baseConfig = {
dimensions: this.config_.vectorSearch?.dimensions ?? this.getDefaultDimensions(embeddingConfig.model),
distribution: {
mean: 0.7,
sigma: 0.3,
},
binaryQuantized: false,
};
switch (embeddingConfig.provider) {
case 'ollama':
return {
source: 'ollama',
url: embeddingConfig.ngrokUrl
? `${embeddingConfig.ngrokUrl}/api/embed`
: `${embeddingConfig.baseUrl}/api/embed`,
model: embeddingConfig.model,
documentTemplate: this.createDocumentTemplate(),
...baseConfig,
};
case 'openai':
return {
source: 'openAi',
apiKey: embeddingConfig.apiKey,
model: embeddingConfig.model,
url: embeddingConfig.baseUrl
? `${embeddingConfig.baseUrl}/embeddings`
: 'https://api.openai.com/v1/embeddings',
documentTemplate: this.createDocumentTemplate(),
documentTemplateMaxBytes: 500,
...baseConfig,
};
default: {
const _exhaustiveCheck = embeddingConfig;
throw new Error(`Unsupported embedding provider: ${String(_exhaustiveCheck)}`);
}
}
}
/**
* Get default dimensions for common embedding models
*/
getDefaultDimensions(model) {
const modelDimensions = {
'nomic-embed-text': 768,
'text-embedding-3-small': 1536,
};
return modelDimensions[model] ?? 768;
}
/**
* Create document template for embedding generation
*/
createDocumentTemplate() {
const { embeddingFields = ['title', 'description'] } = this.config_.vectorSearch ?? {};
// Create a template that combines the specified fields
const fieldTemplates = embeddingFields.map((field) => {
return `{{doc.${field}}}`;
});
return fieldTemplates.join(' ');
}
/**
* Enhance search options with vector search parameters
*/
enhanceSearchOptions(searchOptions, semanticSearch, semanticRatio) {
if (!semanticSearch || !this.isVectorSearchEnabled()) {
return searchOptions;
}
if (semanticRatio >= 1.0) {
// Pure semantic search
return {
...searchOptions,
hybrid: {
embedder: 'default',
semanticRatio: 1.0,
},
};
}
else if (semanticRatio > 0.0) {
// Hybrid search
return {
...searchOptions,
hybrid: {
embedder: 'default',
semanticRatio,
},
};
}
// semanticRatio = 0.0 means pure keyword search (no hybrid options)
return searchOptions;
}
/**
* Get embedder configuration status for admin panel
*/
getVectorSearchStatus() {
const { vectorSearch } = this.config_;
if (!vectorSearch?.enabled) {
return {
enabled: false,
embeddingFields: [],
semanticRatio: 0.5,
};
}
return {
enabled: true,
provider: vectorSearch.embedding.provider,
model: vectorSearch.embedding.model,
dimensions: vectorSearch.dimensions ?? this.getDefaultDimensions(vectorSearch.embedding.model),
embeddingFields: vectorSearch.embeddingFields ?? ['title', 'description'],
semanticRatio: vectorSearch.semanticRatio ?? 0.5,
};
}
}
exports.MeiliSearchEmbedder = MeiliSearchEmbedder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tZWlsaXNlYXJjaC91dGlscy9lbWJlZGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTs7O0dBR0c7QUFDSCxNQUFhLG1CQUFtQjtJQUNYLE9BQU8sQ0FBMEI7SUFDakMsT0FBTyxDQUFhO0lBRXZDLFlBQVksTUFBZ0MsRUFBRSxNQUFtQjtRQUMvRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLEtBQUssSUFBSSxDQUFBO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUN2QyxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUVyQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzNCLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN4RSxNQUFNLFNBQVMsR0FBYztnQkFDM0IsT0FBTyxFQUFFLGNBQWM7YUFDeEIsQ0FBQTtZQUVELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzdELG9DQUFvQztRQUN0QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaUVBQWlFO1lBQ2pFLDhEQUE4RDtRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CLENBQUMsZUFBZ0M7UUFDM0QsTUFBTSxVQUFVLEdBQUc7WUFDakIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNyRyxZQUFZLEVBQUU7Z0JBQ1osSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsS0FBSyxFQUFFLEdBQUc7YUFDWDtZQUNELGVBQWUsRUFBRSxLQUFLO1NBQ3ZCLENBQUE7UUFFRCxRQUFRLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTztvQkFDTCxNQUFNLEVBQUUsUUFBUTtvQkFDaEIsR0FBRyxFQUFFLGVBQWUsQ0FBQyxRQUFRO3dCQUMzQixDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsUUFBUSxZQUFZO3dCQUN6QyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsT0FBTyxZQUFZO29CQUMxQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7b0JBQzVCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDL0MsR0FBRyxVQUFVO2lCQUNkLENBQUE7WUFFSCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTztvQkFDTCxNQUFNLEVBQUUsUUFBUTtvQkFDaEIsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNO29CQUM5QixLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7b0JBQzVCLEdBQUcsRUFBRSxlQUFlLENBQUMsT0FBTzt3QkFDMUIsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLE9BQU8sYUFBYTt3QkFDekMsQ0FBQyxDQUFDLHNDQUFzQztvQkFDMUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFO29CQUMvQyx3QkFBd0IsRUFBRSxHQUFHO29CQUM3QixHQUFHLFVBQVU7aUJBQ2QsQ0FBQTtZQUVILE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsTUFBTSxnQkFBZ0IsR0FBVSxlQUFlLENBQUE7Z0JBRS9DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNoRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQixDQUFDLEtBQWE7UUFDeEMsTUFBTSxlQUFlLEdBQTJCO1lBQzlDLGtCQUFrQixFQUFFLEdBQUc7WUFDdkIsd0JBQXdCLEVBQUUsSUFBSTtTQUMvQixDQUFBO1FBRUQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM1QixNQUFNLEVBQUUsZUFBZSxHQUFHLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFBO1FBRXRGLHVEQUF1RDtRQUN2RCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkQsT0FBTyxTQUFTLEtBQUssSUFBSSxDQUFBO1FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLGFBQXNDLEVBQUUsY0FBdUIsRUFBRSxhQUFxQjtRQUN6RyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztZQUNyRCxPQUFPLGFBQWEsQ0FBQTtRQUN0QixDQUFDO1FBRUQsSUFBSSxhQUFhLElBQUksR0FBRyxFQUFFLENBQUM7WUFDekIsdUJBQXVCO1lBQ3ZCLE9BQU87Z0JBQ0wsR0FBRyxhQUFhO2dCQUNoQixNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLFNBQVM7b0JBQ25CLGFBQWEsRUFBRSxHQUFHO2lCQUNuQjthQUNGLENBQUE7UUFDSCxDQUFDO2FBQU0sSUFBSSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDL0IsZ0JBQWdCO1lBQ2hCLE9BQU87Z0JBQ0wsR0FBRyxhQUFhO2dCQUNoQixNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLFNBQVM7b0JBQ25CLGFBQWE7aUJBQ2Q7YUFDRixDQUFBO1FBQ0gsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSxPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUI7UUFDbkIsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUE7UUFFckMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMzQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLGVBQWUsRUFBRSxFQUFFO2dCQUNuQixhQUFhLEVBQUUsR0FBRzthQUNuQixDQUFBO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDekMsS0FBSyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSztZQUNuQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDOUYsZUFBZSxFQUFFLFlBQVksQ0FBQyxlQUFlLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1lBQ3pFLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYSxJQUFJLEdBQUc7U0FDakQsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQXZLRCxrREF1S0MifQ==