@vivantel/virage-embedder-transformers 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # @vivantel/virage-embedder-transformers
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@vivantel/virage-embedder-transformers.svg)](https://www.npmjs.com/package/@vivantel/virage-embedder-transformers)
4
+
5
+ Local, offline embedding provider for `@vivantel/virage-core` using `@huggingface/transformers`. No API key required — models run entirely on your machine.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @vivantel/virage-embedder-transformers
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```typescript
16
+ import { TransformersEmbedder } from "@vivantel/virage-embedder-transformers";
17
+
18
+ const embedder = new TransformersEmbedder({
19
+ model: "Xenova/all-MiniLM-L6-v2",
20
+ dimensions: 384,
21
+ });
22
+ ```
23
+
24
+ The pipeline initializes lazily — the model is downloaded on the first `embed()` call and cached locally.
25
+
26
+ ## JSON config
27
+
28
+ ```json
29
+ {
30
+ "embedder": {
31
+ "package": "@vivantel/virage-embedder-transformers",
32
+ "config": {
33
+ "model": "Xenova/all-MiniLM-L6-v2",
34
+ "dimensions": 384
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Recommended models
41
+
42
+ | Model | Dimensions | Notes |
43
+ | --- | --- | --- |
44
+ | `Xenova/all-MiniLM-L6-v2` | 384 | Fast, good quality, 80 MB |
45
+ | `Xenova/all-mpnet-base-v2` | 768 | Higher quality, 420 MB |
46
+ | `Xenova/paraphrase-multilingual-MiniLM-L12-v2` | 384 | Multilingual |
47
+
48
+ Any ONNX-compatible model on the HuggingFace hub can be used.
49
+
50
+ ## Options
51
+
52
+ | Option | Type | Description |
53
+ | --- | --- | --- |
54
+ | `model` | `string` | HuggingFace model ID (required) |
55
+ | `dimensions` | `number` | Output dimensions (default: 384) |
56
+ | `device` | `"cpu" \| "webgpu"` | Inference device (default: `"cpu"`) |
57
+ | `cacheDir` | `string` | Local model cache directory |
58
+
59
+ ## First run
60
+
61
+ On the first `embed()` call the model weights are downloaded from HuggingFace and cached locally (~80–420 MB depending on the model). Subsequent runs use the cached model.
62
+
63
+ ## License
64
+
65
+ MIT
@@ -0,0 +1,12 @@
1
+ export interface BenchmarkResult {
2
+ model: string;
3
+ tokensPerSec: number;
4
+ memoryMB: number;
5
+ firstQueryLatencyMs: number;
6
+ dimensions: number;
7
+ }
8
+ export declare function benchmarkEmbedder(modelId: string, options?: {
9
+ sampleTexts?: string[];
10
+ device?: "cpu" | "webgpu";
11
+ }): Promise<BenchmarkResult>;
12
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CACtB,GACL,OAAO,CAAC,eAAe,CAAC,CAkC1B"}
@@ -0,0 +1,39 @@
1
+ const SAMPLE_TEXTS = [
2
+ "The quick brown fox jumps over the lazy dog.",
3
+ "Machine learning models transform text into dense vector representations.",
4
+ "TypeScript provides static typing for JavaScript applications.",
5
+ "Retrieval augmented generation improves LLM accuracy with external knowledge.",
6
+ "Vector similarity search enables semantic document retrieval at scale.",
7
+ ];
8
+ const CHARS_PER_TOKEN = 4;
9
+ export async function benchmarkEmbedder(modelId, options = {}) {
10
+ const texts = options.sampleTexts ?? SAMPLE_TEXTS;
11
+ const { TransformersEmbedder } = await import("./embedder.js");
12
+ const embedder = new TransformersEmbedder({
13
+ model: modelId,
14
+ device: options.device ?? "cpu",
15
+ });
16
+ // Measure first-query latency (includes model load time)
17
+ const heapBefore = process.memoryUsage().heapUsed;
18
+ const t0 = performance.now();
19
+ const first = await embedder.embed(texts[0]);
20
+ const firstQueryLatencyMs = performance.now() - t0;
21
+ const heapAfter = process.memoryUsage().heapUsed;
22
+ // Warm-up run (already done above)
23
+ // Throughput: embed all texts
24
+ const t1 = performance.now();
25
+ await embedder.embedBatch(texts);
26
+ const batchMs = performance.now() - t1;
27
+ const totalChars = texts.reduce((s, t) => s + t.length, 0);
28
+ const totalTokens = Math.ceil(totalChars / CHARS_PER_TOKEN);
29
+ const tokensPerSec = totalTokens / (batchMs / 1000);
30
+ const memoryMB = Math.max(0, heapAfter - heapBefore) / 1024 / 1024;
31
+ return {
32
+ model: modelId,
33
+ tokensPerSec: Math.round(tokensPerSec),
34
+ memoryMB: Math.round(memoryMB * 10) / 10,
35
+ firstQueryLatencyMs: Math.round(firstQueryLatencyMs),
36
+ dimensions: first.length,
37
+ };
38
+ }
39
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"AAQA,MAAM,YAAY,GAAG;IACnB,8CAA8C;IAC9C,2EAA2E;IAC3E,gEAAgE;IAChE,+EAA+E;IAC/E,wEAAwE;CACzE,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,UAGI,EAAE;IAEN,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IAClD,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC;QACxC,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;KAChC,CAAC,CAAC;IAEH,yDAAyD;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;IAClD,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;IAEjD,mCAAmC;IACnC,8BAA8B;IAC9B,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAEnE,OAAO;QACL,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QACtC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,EAAE;QACxC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;QACpD,UAAU,EAAE,KAAK,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { EmbeddingProvider, Logger } from "@vivantel/virage-core";
2
+ export interface QuantizationOptions {
3
+ /** Data type for model quantization. Reduces memory usage at small quality cost. */
4
+ dtype: "int8" | "uint8" | "fp16" | "q4";
5
+ threads?: number;
6
+ }
7
+ export interface TransformersEmbedderOptions {
8
+ /** HuggingFace model ID, e.g. "Xenova/all-MiniLM-L6-v2" */
9
+ model: string;
10
+ /** Output vector dimensions. Auto-detected from the model if omitted. */
11
+ dimensions?: number;
12
+ device?: "cpu" | "webgpu";
13
+ /** Local directory for caching downloaded models. */
14
+ cacheDir?: string;
15
+ /** Optional quantization settings. Reduces RAM usage by 60-75%, speeds up inference. */
16
+ quantization?: QuantizationOptions;
17
+ }
18
+ export declare class TransformersEmbedder implements EmbeddingProvider {
19
+ readonly name = "transformers";
20
+ readonly dimensions: number;
21
+ readonly model: string;
22
+ readonly preferredBatchSize = 32;
23
+ private readonly device;
24
+ private readonly cacheDir?;
25
+ private readonly quantization?;
26
+ private _pipeline;
27
+ private logger;
28
+ constructor(options: TransformersEmbedderOptions);
29
+ setLogger(logger: Logger): void;
30
+ private getPipeline;
31
+ embed(text: string): Promise<number[]>;
32
+ embedBatch(texts: string[]): Promise<number[][]>;
33
+ healthCheck(): Promise<boolean>;
34
+ }
35
+ //# sourceMappingURL=embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,oFAAoF;IACpF,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAWD,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,kBAAkB,MAAM;IAEjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAsB;IACpD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,MAAM,CAAuB;gBAEzB,OAAO,EAAE,2BAA2B;IAQhD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;YAIjB,WAAW;IA0BnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAuBhD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
@@ -0,0 +1,67 @@
1
+ export class TransformersEmbedder {
2
+ name = "transformers";
3
+ dimensions;
4
+ model;
5
+ preferredBatchSize = 32;
6
+ device;
7
+ cacheDir;
8
+ quantization;
9
+ _pipeline = null;
10
+ logger = null;
11
+ constructor(options) {
12
+ this.model = options.model;
13
+ this.dimensions = options.dimensions ?? 384;
14
+ this.device = options.device ?? "cpu";
15
+ this.cacheDir = options.cacheDir;
16
+ this.quantization = options.quantization;
17
+ }
18
+ setLogger(logger) {
19
+ this.logger = logger.withTag("transformers");
20
+ }
21
+ async getPipeline() {
22
+ if (this._pipeline)
23
+ return this._pipeline;
24
+ this.logger?.info(`Loading model ${this.model}`);
25
+ this.logger?.debug(`Device: ${this.device}${this.quantization ? `, dtype: ${this.quantization.dtype}` : ""}`);
26
+ // Lazy import — consumers must install @huggingface/transformers
27
+ const { pipeline, env } = await import("@huggingface/transformers");
28
+ if (this.cacheDir) {
29
+ env.cacheDir = this.cacheDir;
30
+ }
31
+ this._pipeline = (await pipeline("feature-extraction", this.model, {
32
+ device: this.device,
33
+ ...(this.quantization ? { dtype: this.quantization.dtype } : {}),
34
+ }));
35
+ this.logger?.info(`Model ${this.model} ready (${this.dimensions}d, device=${this.device})`);
36
+ return this._pipeline;
37
+ }
38
+ async embed(text) {
39
+ const pipe = await this.getPipeline();
40
+ const output = await pipe([text], { pooling: "mean", normalize: true });
41
+ return Array.from(output.data.slice(0, this.dimensions));
42
+ }
43
+ async embedBatch(texts) {
44
+ const pipe = await this.getPipeline();
45
+ this.logger?.verbose(`Batch ${texts.length} texts`);
46
+ this.logger?.trace(`Text lengths: ${texts.map((t) => t.length).join(", ")}`);
47
+ const start = Date.now();
48
+ const output = await pipe(texts, { pooling: "mean", normalize: true });
49
+ this.logger?.debug(`Batch inference: ${Date.now() - start}ms for ${texts.length} texts`);
50
+ const stride = output.data.length / texts.length;
51
+ const result = [];
52
+ for (let i = 0; i < texts.length; i++) {
53
+ result.push(Array.from(output.data.slice(i * stride, i * stride + this.dimensions)));
54
+ }
55
+ return result;
56
+ }
57
+ async healthCheck() {
58
+ try {
59
+ await this.getPipeline();
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { TransformersEmbedder, type TransformersEmbedderOptions, type QuantizationOptions, } from "./embedder.js";
2
+ export { benchmarkEmbedder, type BenchmarkResult } from "./benchmark.js";
3
+ import type { EmbeddingProvider } from "@vivantel/virage-core";
4
+ /** Factory used by the JSON config loader. */
5
+ export declare function createEmbedder(config: Record<string, unknown>): EmbeddingProvider;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAM/D,8CAA8C;AAC9C,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,iBAAiB,CAiBnB"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { TransformersEmbedder, } from "./embedder.js";
2
+ export { benchmarkEmbedder } from "./benchmark.js";
3
+ import { TransformersEmbedder, } from "./embedder.js";
4
+ /** Factory used by the JSON config loader. */
5
+ export function createEmbedder(config) {
6
+ const model = config.model;
7
+ if (typeof model !== "string" || !model) {
8
+ throw new Error('@vivantel/virage-embedder-transformers: config.model is required (e.g. "Xenova/all-MiniLM-L6-v2")');
9
+ }
10
+ const opts = {
11
+ model,
12
+ dimensions: typeof config.dimensions === "number" ? config.dimensions : undefined,
13
+ device: config.device === "webgpu" ? "webgpu" : "cpu",
14
+ cacheDir: typeof config.cacheDir === "string" ? config.cacheDir : undefined,
15
+ };
16
+ return new TransformersEmbedder(opts);
17
+ }
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAGrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EACL,oBAAoB,GAErB,MAAM,eAAe,CAAC;AAEvB,8CAA8C;AAC9C,MAAM,UAAU,cAAc,CAC5B,MAA+B;IAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAgC;QACxC,KAAK;QACL,UAAU,EACR,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACvE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;QACrD,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC;IAEF,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@vivantel/virage-embedder-transformers",
3
+ "version": "0.2.0",
4
+ "description": "Local transformers.js embedding provider for @vivantel/rag-core",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "sideEffects": false,
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "type-check": "tsc --noEmit",
25
+ "test": "vitest run",
26
+ "prepublishOnly": "npm run build",
27
+ "lint": "eslint src/",
28
+ "lint:fix": "eslint src/ --fix",
29
+ "format": "prettier --write \"src/**/*.ts\"",
30
+ "fix": "npm run lint:fix && npm run format"
31
+ },
32
+ "keywords": [
33
+ "rag",
34
+ "embeddings",
35
+ "transformers",
36
+ "huggingface",
37
+ "local",
38
+ "offline"
39
+ ],
40
+ "author": "Vivantel",
41
+ "license": "MIT",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/vivantel/virage",
45
+ "directory": "packages/virage-embedder-transformers"
46
+ },
47
+ "dependencies": {
48
+ "@huggingface/transformers": "^4.2.0"
49
+ },
50
+ "peerDependencies": {
51
+ "@vivantel/virage-core": "*"
52
+ },
53
+ "devDependencies": {
54
+ "@vivantel/virage-core": "0.2.0",
55
+ "@types/node": "^25.9.1",
56
+ "typescript": "^6.0.3",
57
+ "vitest": "^4.1.8"
58
+ },
59
+ "engines": {
60
+ "node": ">=18.0.0"
61
+ }
62
+ }