import localforage from "localforage"; import { globalFetch } from "src/ts/storage/globalApi"; import { runEmbedding } from "../transformers"; export class HypaProcesser{ oaikey:string vectors:memoryVector[] forage:LocalForage model:'ada'|'MiniLM'|'nomic' constructor(model:'ada'|'MiniLM'|'nomic'){ this.forage = localforage.createInstance({ name: "hypaVector" }) this.vectors = [] this.model = model } async embedDocuments(texts: string[]): Promise { const subPrompts = chunkArray(texts,512); const embeddings: number[][] = []; for (let i = 0; i < subPrompts.length; i += 1) { const input = subPrompts[i]; const data = await this.getEmbeds(input) embeddings.push(...data); } return embeddings; } async getEmbeds(input:string[]|string) { if(this.model === 'MiniLM' || this.model === 'nomic'){ const inputs:string[] = Array.isArray(input) ? input : [input] let results:Float32Array[] = [] for(let i=0;i { for(let i=0;i ({ content: texts[idx], embedding })); for(let i=0;i result[0]); } async similaritySearchScored(query: string) { const results = await this.similaritySearchVectorWithScore((await this.getEmbeds(query))[0],); return results } private async similaritySearchVectorWithScore( query: number[], ): Promise<[string, number][]> { const memoryVectors = this.vectors const searches = memoryVectors .map((vector, index) => ({ similarity: similarity(query, vector.embedding), index, })) .sort((a, b) => (a.similarity > b.similarity ? -1 : 0)) const result: [string, number][] = searches.map((search) => [ memoryVectors[search.index].content, search.similarity, ]); return result; } similarityCheck(query1:number[],query2: number[]) { return similarity(query1, query2) } } function similarity(a:number[], b:number[]) { return a.reduce((acc, val, i) => acc + val * b[i], 0); } type memoryVector = { embedding:number[] content:string, alreadySaved?:boolean } const chunkArray = (arr: T[], chunkSize: number) => arr.reduce((chunks, elem, index) => { const chunkIndex = Math.floor(index / chunkSize); const chunk = chunks[chunkIndex] || []; chunks[chunkIndex] = chunk.concat([elem]); return chunks; }, [] as T[][]);