Spaces:
Runtime error
Runtime error
| import { IEmbeddingFunction } from "chromadb/src/embeddings/IEmbeddingFunction"; | |
| // Dynamically import module | |
| let TransformersApi: Promise<any>; | |
| export class TransformersEmbeddingFunction implements IEmbeddingFunction { | |
| private pipelinePromise: Promise<any> | null; | |
| /** | |
| * TransformersEmbeddingFunction constructor. | |
| * @param options The configuration options. | |
| * @param options.model The model to use to calculate embeddings. Defaults to 'Xenova/all-MiniLM-L6-v2', which is an ONNX port of `sentence-transformers/all-MiniLM-L6-v2`. | |
| * @param options.revision The specific model version to use (can be a branch, tag name, or commit id). Defaults to 'main'. | |
| * @param options.quantized Whether to load the 8-bit quantized version of the model. Defaults to `false`. | |
| * @param options.progress_callback If specified, this function will be called during model construction, to provide the user with progress updates. | |
| */ | |
| constructor({ | |
| model = "Xenova/all-MiniLM-L6-v2", | |
| revision = "main", | |
| quantized = false, | |
| progress_callback = null, | |
| }: { | |
| model?: string; | |
| revision?: string; | |
| quantized?: boolean; | |
| progress_callback?: Function | null; | |
| } = {}) { | |
| try { | |
| // Since Transformers.js is an ESM package, we use the dynamic `import` syntax instead of `require`. | |
| // Also, since we use `"module": "commonjs"` in tsconfig.json, we use the following workaround to ensure | |
| // the dynamic import is not transpiled to a `require` statement. | |
| // For more information, see https://github.com/microsoft/TypeScript/issues/43329#issuecomment-1008361973 | |
| TransformersApi = Function('return import("@xenova/transformers")')(); | |
| } catch (e) { | |
| throw new Error( | |
| "Please install the @xenova/transformers package to use the TransformersEmbeddingFunction, `npm install -S @xenova/transformers`." | |
| ); | |
| } | |
| // Store a promise that resolves to the pipeline | |
| this.pipelinePromise = new Promise(async (resolve, reject) => { | |
| try { | |
| const { pipeline } = await TransformersApi; | |
| resolve( | |
| await pipeline("feature-extraction", model, { | |
| quantized, | |
| revision, | |
| progress_callback, | |
| }) | |
| ); | |
| } catch (e) { | |
| reject(e); | |
| } | |
| }); | |
| } | |
| public async generate(texts: string[]): Promise<number[][]> { | |
| let pipe = await this.pipelinePromise; | |
| let output = await pipe(texts, { pooling: "mean", normalize: true }); | |
| return output.tolist(); | |
| } | |
| } |