From e5a88c4ecbc86a6ac6eef7475d1a9c8b58e91b08 Mon Sep 17 00:00:00 2001 From: sub-hub Date: Sat, 27 Apr 2024 18:21:44 +0900 Subject: [PATCH 1/3] Add support for custom embedding URL in PlaygroundEmbedding.svelte and HypaProcesser --- src/lib/Playground/PlaygroundEmbedding.svelte | 9 +++- src/ts/process/memory/hypamemory.ts | 44 ++++++++++++++----- 2 files changed, 42 insertions(+), 11 deletions(-) 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..8597d40e 100644 --- a/src/ts/process/memory/hypamemory.ts +++ b/src/ts/process/memory/hypamemory.ts @@ -1,20 +1,23 @@ import localforage from "localforage"; import { globalFetch } from "src/ts/storage/globalApi"; import { runEmbedding } from "../transformers"; +import { alertError } from "src/ts/alert"; 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 +43,36 @@ 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] } - }) + + let replaceUrl = new URL(this.customEmbeddingUrl) + + if(replaceUrl.pathname !== '/embeddings'){ + replaceUrl.pathname = '/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 From 96622482b39a17da1851d171ac2b609177064899 Mon Sep 17 00:00:00 2001 From: sub-hub Date: Sat, 27 Apr 2024 22:09:23 +0900 Subject: [PATCH 2/3] Add appendLastPath util function and use it in hypamemory --- src/ts/process/memory/hypamemory.ts | 7 ++----- src/ts/util.ts | 30 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/ts/process/memory/hypamemory.ts b/src/ts/process/memory/hypamemory.ts index 8597d40e..e9691155 100644 --- a/src/ts/process/memory/hypamemory.ts +++ b/src/ts/process/memory/hypamemory.ts @@ -2,6 +2,7 @@ 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{ @@ -50,11 +51,7 @@ export class HypaProcesser{ return [0] } - let replaceUrl = new URL(this.customEmbeddingUrl) - - if(replaceUrl.pathname !== '/embeddings'){ - replaceUrl.pathname = '/embeddings' - } + const replaceUrl = appendLastPath(this.customEmbeddingUrl,'embeddings') gf = await globalFetch(replaceUrl.toString(), { body:{ 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 From cefdc1ad11bafb39b0364483bf8ff5eebfe5b753 Mon Sep 17 00:00:00 2001 From: sub-hub Date: Sat, 27 Apr 2024 22:41:48 +0900 Subject: [PATCH 3/3] Fix customEmbeddingUrl handling in HypaProcesser --- src/ts/process/memory/hypamemory.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ts/process/memory/hypamemory.ts b/src/ts/process/memory/hypamemory.ts index e9691155..90282e14 100644 --- a/src/ts/process/memory/hypamemory.ts +++ b/src/ts/process/memory/hypamemory.ts @@ -50,8 +50,8 @@ export class HypaProcesser{ alertError('Custom model requires a Custom Server URL') return [0] } - - const replaceUrl = appendLastPath(this.customEmbeddingUrl,'embeddings') + const {customEmbeddingUrl} = this + const replaceUrl = customEmbeddingUrl.endsWith('/embeddings')?customEmbeddingUrl:appendLastPath(customEmbeddingUrl,'embeddings') gf = await globalFetch(replaceUrl.toString(), { body:{