| export async function getEmbeddings( |
| worker, |
| weightsURL, |
| tokenizerURL, |
| configURL, |
| modelID, |
| sentences, |
| updateStatus = null |
| ) { |
| return new Promise((resolve, reject) => { |
| worker.postMessage({ |
| weightsURL, |
| tokenizerURL, |
| configURL, |
| modelID, |
| sentences, |
| }); |
| function messageHandler(event) { |
| if ("error" in event.data) { |
| worker.removeEventListener("message", messageHandler); |
| reject(new Error(event.data.error)); |
| } |
| if (event.data.status === "complete") { |
| worker.removeEventListener("message", messageHandler); |
| resolve(event.data); |
| } |
| if (updateStatus) updateStatus(event.data); |
| } |
| worker.addEventListener("message", messageHandler); |
| }); |
| } |
|
|
| const MODELS = { |
| intfloat_e5_small_v2: { |
| base_url: "https://huggingface.co/intfloat/e5-small-v2/resolve/main/", |
| search_prefix: "query: ", |
| document_prefix: "passage: ", |
| }, |
| intfloat_e5_base_v2: { |
| base_url: "https://huggingface.co/intfloat/e5-base-v2/resolve/main/", |
| search_prefix: "query: ", |
| document_prefix: "passage:", |
| }, |
| intfloat_multilingual_e5_small: { |
| base_url: |
| "https://huggingface.co/intfloat/multilingual-e5-small/resolve/main/", |
| search_prefix: "query: ", |
| document_prefix: "passage: ", |
| }, |
| sentence_transformers_all_MiniLM_L6_v2: { |
| base_url: |
| "https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/refs%2Fpr%2F21/", |
| search_prefix: "", |
| document_prefix: "", |
| }, |
| sentence_transformers_all_MiniLM_L12_v2: { |
| base_url: |
| "https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2/resolve/refs%2Fpr%2F4/", |
| search_prefix: "", |
| document_prefix: "", |
| }, |
| }; |
| export function getModelInfo(id) { |
| return { |
| modelURL: MODELS[id].base_url + "model.safetensors", |
| configURL: MODELS[id].base_url + "config.json", |
| tokenizerURL: MODELS[id].base_url + "tokenizer.json", |
| search_prefix: MODELS[id].search_prefix, |
| document_prefix: MODELS[id].document_prefix, |
| }; |
| } |
|
|
| export function cosineSimilarity(vec1, vec2) { |
| const dot = vec1.reduce((acc, val, i) => acc + val * vec2[i], 0); |
| const a = Math.sqrt(vec1.reduce((acc, val) => acc + val * val, 0)); |
| const b = Math.sqrt(vec2.reduce((acc, val) => acc + val * val, 0)); |
| return dot / (a * b); |
| } |
| export async function getWikiText(article) { |
| |
| const URL = `https://en.wikipedia.org/w/api.php?action=query&prop=extracts&exlimit=1&titles=${article}&explaintext=1&exsectionformat=plain&format=json&origin=*`; |
| return fetch(URL, { |
| method: "GET", |
| headers: { |
| Accept: "application/json", |
| }, |
| }) |
| .then((r) => r.json()) |
| .then((data) => { |
| const pages = data.query.pages; |
| const pageId = Object.keys(pages)[0]; |
| const extract = pages[pageId].extract; |
| if (extract === undefined || extract === "") { |
| throw new Error("No article found"); |
| } |
| return extract; |
| }) |
| .catch((error) => console.error("Error:", error)); |
| } |
|
|