diff --git a/src/lib/Playground/PlaygroundEmbedding.svelte b/src/lib/Playground/PlaygroundEmbedding.svelte index bc548d2e..1158d976 100644 --- a/src/lib/Playground/PlaygroundEmbedding.svelte +++ b/src/lib/Playground/PlaygroundEmbedding.svelte @@ -8,6 +8,7 @@ let query = ""; let model = "MiniLM"; + let customEmbeddingUrl = ""; let data:string[] = []; let dataresult:[string, number][] = []; let running = false; @@ -15,7 +16,7 @@ const run = async () => { if(running) return; running = true; - const processer = new HypaProcesser(model as any); + const processer = new HypaProcesser(model as any, customEmbeddingUrl); await processer.addText(data); console.log(processer.vectors) dataresult = await processer.similaritySearchScored(query); @@ -29,8 +30,14 @@ MiniLM L6 v2 Nomic Embed Text v1.5 + Custom (OpenAI-compatible) +{#if model === "custom"} + Custom Server URL + +{/if} + Query diff --git a/src/ts/process/memory/hypamemory.ts b/src/ts/process/memory/hypamemory.ts index 7de36eb8..90282e14 100644 --- a/src/ts/process/memory/hypamemory.ts +++ b/src/ts/process/memory/hypamemory.ts @@ -1,20 +1,24 @@ import localforage from "localforage"; import { globalFetch } from "src/ts/storage/globalApi"; import { runEmbedding } from "../transformers"; +import { alertError } from "src/ts/alert"; +import { appendLastPath } from "src/ts/util"; export class HypaProcesser{ oaikey:string vectors:memoryVector[] forage:LocalForage - model:'ada'|'MiniLM'|'nomic' + model:'ada'|'MiniLM'|'nomic'|'custom' + customEmbeddingUrl:string - constructor(model:'ada'|'MiniLM'|'nomic'){ + constructor(model:'ada'|'MiniLM'|'nomic'|'custom',customEmbeddingUrl?:string){ this.forage = localforage.createInstance({ name: "hypaVector" }) this.vectors = [] this.model = model + this.customEmbeddingUrl = customEmbeddingUrl } async embedDocuments(texts: string[]): Promise { @@ -40,15 +44,32 @@ export class HypaProcesser{ let results:Float32Array[] = await runEmbedding(inputs, this.model === 'nomic' ? 'nomic-ai/nomic-embed-text-v1.5' : 'Xenova/all-MiniLM-L6-v2') return results } - const gf = await globalFetch("https://api.openai.com/v1/embeddings", { - headers: { - "Authorization": "Bearer " + this.oaikey - }, - body: { - "input": input, - "model": "text-embedding-ada-002" + let gf = null; + if(this.model === 'custom'){ + if(!this.customEmbeddingUrl){ + alertError('Custom model requires a Custom Server URL') + return [0] } - }) + const {customEmbeddingUrl} = this + const replaceUrl = customEmbeddingUrl.endsWith('/embeddings')?customEmbeddingUrl:appendLastPath(customEmbeddingUrl,'embeddings') + + gf = await globalFetch(replaceUrl.toString(), { + body:{ + "input": input + }, + }) + } + if(this.model === 'ada'){ + gf = await globalFetch("https://api.openai.com/v1/embeddings", { + headers: { + "Authorization": "Bearer " + this.oaikey + }, + body: { + "input": input, + "model": "text-embedding-ada-002" + } + }) + } const data = gf.data diff --git a/src/ts/util.ts b/src/ts/util.ts index c93d63f2..8c74681c 100644 --- a/src/ts/util.ts +++ b/src/ts/util.ts @@ -492,4 +492,34 @@ export function trimUntilPunctuation(s:string){ result = result.slice(0, -1) } return result +} + +/** + * Appends the given last path to the provided URL. + * + * @param {string} url - The base URL to which the last path will be appended. + * @param {string} lastPath - The path to be appended to the URL. + * @returns {string} The modified URL with the last path appended. + * + * @example + * appendLastPath("https://github.com/kwaroran/RisuAI","/commits/main") + * return 'https://github.com/kwaroran/RisuAI/commits/main' + * + * @example + * appendLastPath("https://github.com/kwaroran/RisuAI/","/commits/main") + * return 'https://github.com/kwaroran/RisuAI/commits/main + * + * @example + * appendLastPath("http://127.0.0.1:7997","embeddings") + * return 'http://127.0.0.1:7997/embeddings' + */ +export function appendLastPath(url, lastPath) { + // Remove trailing slash from url if exists + url = url.replace(/\/$/, ''); + + // Remove leading slash from lastPath if exists + lastPath = lastPath.replace(/^\//, ''); + + // Concat the url and lastPath + return url + '/' + lastPath; } \ No newline at end of file