import { pipeline, env } from '@huggingface/transformers'; import { fileURLToPath } from 'node:url'; import { readFile } from 'node:fs/promises'; const root=fileURLToPath(new URL('../',import.meta.url)); export const MODEL=Object.freeze({name:'Xenova/all-MiniLM-L6-v2',revision:'751bff37182d3f1213fa05d7196b954e230abad9',dtype:'q8',dimensions:384,maxTokens:256,license:'Apache-2.0',offline:true}); env.allowRemoteModels=false; env.allowLocalModels=true; env.localModelPath=root+'models/'; env.useBrowserCache=false; env.backends.onnx.wasm.numThreads=1; let extractorPromise,referencePromise; export async function getExtractor(){ if(!extractorPromise)extractorPromise=pipeline('feature-extraction',MODEL.name,{dtype:'q8',device:'cpu',local_files_only:true}); return extractorPromise; } export async function embedTexts(texts){ const extractor=await getExtractor(); const result=[]; // Bounded batches avoid padding all input to the longest issue. for(let start=0;start{ const references=JSON.parse(await readFile(root+'data/reference.json','utf8')); return {references,referenceVectors:await embedTexts(references.map(issueText))}; })(); return referencePromise; }