{"version":3,"file":"loader-D_ldqJra.mjs","names":[],"sources":["../../../../../node_modules/.pnpm/ruvector-onnx-embeddings-wasm@0.1.2/node_modules/ruvector-onnx-embeddings-wasm/loader.js"],"sourcesContent":["/**\n * Model Loader for RuVector ONNX Embeddings WASM\n *\n * Provides easy loading of pre-trained models from HuggingFace Hub\n */\n\n/**\n * Pre-configured models with their HuggingFace URLs\n */\nexport const MODELS = {\n    // Sentence Transformers - Small & Fast\n    'all-MiniLM-L6-v2': {\n        name: 'all-MiniLM-L6-v2',\n        dimension: 384,\n        maxLength: 256,\n        size: '23MB',\n        description: 'Fast, general-purpose embeddings',\n        model: 'https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/onnx/model.onnx',\n        tokenizer: 'https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer.json',\n    },\n    'all-MiniLM-L12-v2': {\n        name: 'all-MiniLM-L12-v2',\n        dimension: 384,\n        maxLength: 256,\n        size: '33MB',\n        description: 'Better quality, balanced speed',\n        model: 'https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2/resolve/main/onnx/model.onnx',\n        tokenizer: 'https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2/resolve/main/tokenizer.json',\n    },\n\n    // BGE Models - State of the art\n    'bge-small-en-v1.5': {\n        name: 'bge-small-en-v1.5',\n        dimension: 384,\n        maxLength: 512,\n        size: '33MB',\n        description: 'State-of-the-art small model',\n        model: 'https://huggingface.co/BAAI/bge-small-en-v1.5/resolve/main/onnx/model.onnx',\n        tokenizer: 'https://huggingface.co/BAAI/bge-small-en-v1.5/resolve/main/tokenizer.json',\n    },\n    'bge-base-en-v1.5': {\n        name: 'bge-base-en-v1.5',\n        dimension: 768,\n        maxLength: 512,\n        size: '110MB',\n        description: 'Best overall quality',\n        model: 'https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/onnx/model.onnx',\n        tokenizer: 'https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/tokenizer.json',\n    },\n\n    // E5 Models - Microsoft\n    'e5-small-v2': {\n        name: 'e5-small-v2',\n        dimension: 384,\n        maxLength: 512,\n        size: '33MB',\n        description: 'Excellent for search & retrieval',\n        model: 'https://huggingface.co/intfloat/e5-small-v2/resolve/main/onnx/model.onnx',\n        tokenizer: 'https://huggingface.co/intfloat/e5-small-v2/resolve/main/tokenizer.json',\n    },\n\n    // GTE Models - Alibaba\n    'gte-small': {\n        name: 'gte-small',\n        dimension: 384,\n        maxLength: 512,\n        size: '33MB',\n        description: 'Good multilingual support',\n        model: 'https://huggingface.co/thenlper/gte-small/resolve/main/onnx/model.onnx',\n        tokenizer: 'https://huggingface.co/thenlper/gte-small/resolve/main/tokenizer.json',\n    },\n};\n\n/**\n * Default model for quick start\n */\nexport const DEFAULT_MODEL = 'all-MiniLM-L6-v2';\n\n/**\n * Model loader with caching support\n */\nexport class ModelLoader {\n    constructor(options = {}) {\n        this.cache = options.cache ?? true;\n        this.cacheStorage = options.cacheStorage ?? 'ruvector-models';\n        this.onProgress = options.onProgress ?? null;\n    }\n\n    /**\n     * Load a pre-configured model by name\n     * @param {string} modelName - Model name from MODELS\n     * @returns {Promise<{modelBytes: Uint8Array, tokenizerJson: string, config: object}>}\n     */\n    async loadModel(modelName = DEFAULT_MODEL) {\n        const modelConfig = MODELS[modelName];\n        if (!modelConfig) {\n            throw new Error(`Unknown model: ${modelName}. Available: ${Object.keys(MODELS).join(', ')}`);\n        }\n\n        console.log(`Loading model: ${modelConfig.name} (${modelConfig.size})`);\n\n        const [modelBytes, tokenizerJson] = await Promise.all([\n            this.fetchWithCache(modelConfig.model, `${modelName}-model.onnx`, 'arraybuffer'),\n            this.fetchWithCache(modelConfig.tokenizer, `${modelName}-tokenizer.json`, 'text'),\n        ]);\n\n        return {\n            modelBytes: new Uint8Array(modelBytes),\n            tokenizerJson,\n            config: modelConfig,\n        };\n    }\n\n    /**\n     * Load model from custom URLs\n     * @param {string} modelUrl - URL to ONNX model\n     * @param {string} tokenizerUrl - URL to tokenizer.json\n     * @returns {Promise<{modelBytes: Uint8Array, tokenizerJson: string}>}\n     */\n    async loadFromUrls(modelUrl, tokenizerUrl) {\n        const [modelBytes, tokenizerJson] = await Promise.all([\n            this.fetchWithCache(modelUrl, null, 'arraybuffer'),\n            this.fetchWithCache(tokenizerUrl, null, 'text'),\n        ]);\n\n        return {\n            modelBytes: new Uint8Array(modelBytes),\n            tokenizerJson,\n        };\n    }\n\n    /**\n     * Load model from local files (Node.js)\n     * @param {string} modelPath - Path to ONNX model\n     * @param {string} tokenizerPath - Path to tokenizer.json\n     * @returns {Promise<{modelBytes: Uint8Array, tokenizerJson: string}>}\n     */\n    async loadFromFiles(modelPath, tokenizerPath) {\n        // Node.js environment\n        if (typeof process !== 'undefined' && process.versions?.node) {\n            const fs = await import('fs/promises');\n            const [modelBytes, tokenizerJson] = await Promise.all([\n                fs.readFile(modelPath),\n                fs.readFile(tokenizerPath, 'utf8'),\n            ]);\n            return {\n                modelBytes: new Uint8Array(modelBytes),\n                tokenizerJson,\n            };\n        }\n        throw new Error('loadFromFiles is only available in Node.js');\n    }\n\n    /**\n     * Fetch with optional caching (uses Cache API in browsers)\n     */\n    async fetchWithCache(url, cacheKey, responseType) {\n        // Try cache first (browser only)\n        if (this.cache && typeof caches !== 'undefined' && cacheKey) {\n            try {\n                const cache = await caches.open(this.cacheStorage);\n                const cached = await cache.match(cacheKey);\n                if (cached) {\n                    console.log(`  Cache hit: ${cacheKey}`);\n                    return responseType === 'arraybuffer'\n                        ? await cached.arrayBuffer()\n                        : await cached.text();\n                }\n            } catch (e) {\n                // Cache API not available, continue with fetch\n            }\n        }\n\n        // Fetch from network\n        console.log(`  Downloading: ${url}`);\n        const response = await this.fetchWithProgress(url);\n\n        if (!response.ok) {\n            throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);\n        }\n\n        // Clone for caching\n        const responseClone = response.clone();\n\n        // Cache the response (browser only)\n        if (this.cache && typeof caches !== 'undefined' && cacheKey) {\n            try {\n                const cache = await caches.open(this.cacheStorage);\n                await cache.put(cacheKey, responseClone);\n            } catch (e) {\n                // Cache write failed, continue\n            }\n        }\n\n        return responseType === 'arraybuffer'\n            ? await response.arrayBuffer()\n            : await response.text();\n    }\n\n    /**\n     * Fetch with progress reporting\n     */\n    async fetchWithProgress(url) {\n        const response = await fetch(url);\n\n        if (!this.onProgress || !response.body) {\n            return response;\n        }\n\n        const contentLength = response.headers.get('content-length');\n        if (!contentLength) {\n            return response;\n        }\n\n        const total = parseInt(contentLength, 10);\n        let loaded = 0;\n\n        const reader = response.body.getReader();\n        const chunks = [];\n\n        while (true) {\n            const { done, value } = await reader.read();\n            if (done) break;\n\n            chunks.push(value);\n            loaded += value.length;\n\n            this.onProgress({\n                loaded,\n                total,\n                percent: Math.round((loaded / total) * 100),\n            });\n        }\n\n        const body = new Uint8Array(loaded);\n        let position = 0;\n        for (const chunk of chunks) {\n            body.set(chunk, position);\n            position += chunk.length;\n        }\n\n        return new Response(body, {\n            headers: response.headers,\n            status: response.status,\n            statusText: response.statusText,\n        });\n    }\n\n    /**\n     * Clear cached models\n     */\n    async clearCache() {\n        if (typeof caches !== 'undefined') {\n            await caches.delete(this.cacheStorage);\n            console.log('Model cache cleared');\n        }\n    }\n\n    /**\n     * List available models\n     */\n    static listModels() {\n        return Object.entries(MODELS).map(([key, config]) => ({\n            id: key,\n            ...config,\n        }));\n    }\n}\n\n/**\n * Quick helper to create an embedder with a pre-configured model\n *\n * @example\n * ```javascript\n * import { createEmbedder } from './loader.js';\n *\n * const embedder = await createEmbedder('all-MiniLM-L6-v2');\n * const embedding = embedder.embedOne(\"Hello world\");\n * ```\n */\nexport async function createEmbedder(modelName = DEFAULT_MODEL, wasmModule = null) {\n    // Import WASM module if not provided\n    if (!wasmModule) {\n        wasmModule = await import('./ruvector_onnx_embeddings_wasm.js');\n        // Only call default() for web/bundler targets (not nodejs)\n        if (typeof wasmModule.default === 'function') {\n            await wasmModule.default();\n        }\n    }\n\n    const loader = new ModelLoader();\n    const { modelBytes, tokenizerJson, config } = await loader.loadModel(modelName);\n\n    const embedderConfig = new wasmModule.WasmEmbedderConfig()\n        .setMaxLength(config.maxLength)\n        .setNormalize(true)\n        .setPooling(0); // Mean pooling\n\n    const embedder = wasmModule.WasmEmbedder.withConfig(\n        modelBytes,\n        tokenizerJson,\n        embedderConfig\n    );\n\n    return embedder;\n}\n\n/**\n * Quick helper for one-off embedding (loads model, embeds, returns)\n *\n * @example\n * ```javascript\n * import { embed } from './loader.js';\n *\n * const embedding = await embed(\"Hello world\");\n * const embeddings = await embed([\"Hello\", \"World\"]);\n * ```\n */\nexport async function embed(text, modelName = DEFAULT_MODEL) {\n    const embedder = await createEmbedder(modelName);\n\n    if (Array.isArray(text)) {\n        return embedder.embedBatch(text);\n    }\n    return embedder.embedOne(text);\n}\n\n/**\n * Quick helper for similarity comparison\n *\n * @example\n * ```javascript\n * import { similarity } from './loader.js';\n *\n * const score = await similarity(\"I love dogs\", \"I adore puppies\");\n * console.log(score); // ~0.85\n * ```\n */\nexport async function similarity(text1, text2, modelName = DEFAULT_MODEL) {\n    const embedder = await createEmbedder(modelName);\n    return embedder.similarity(text1, text2);\n}\n\nexport default {\n    MODELS,\n    DEFAULT_MODEL,\n    ModelLoader,\n    createEmbedder,\n    embed,\n    similarity,\n};\n"],"ignoreList":[0],"mappings":"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"}