From e5a88c4ecbc86a6ac6eef7475d1a9c8b58e91b08 Mon Sep 17 00:00:00 2001 From: sub-hub Date: Sat, 27 Apr 2024 18:21:44 +0900 Subject: [PATCH] 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