@lobu/embeddings 6.1.1 → 7.0.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.
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Local embedding generation with @xenova/transformers.
3
3
  */
4
+ export declare const DEFAULT_MODEL_NAME = "Xenova/bge-base-en-v1.5";
5
+ export declare const DEFAULT_DIMENSIONS = 768;
4
6
  export declare function getLocalModelInfo(): {
5
7
  model: string;
6
8
  dimensions: number;
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAEzE;AAsBD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5E;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAwBrB"}
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAC5D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAYtC,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAEzE;AA2BD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5E;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAsCrB"}
@@ -2,9 +2,9 @@
2
2
  * Local embedding generation with @xenova/transformers.
3
3
  */
4
4
  import { pipeline, env as transformersEnv, } from '@xenova/transformers';
5
- const DEFAULT_MODEL_NAME = 'Xenova/bge-base-en-v1.5';
5
+ export const DEFAULT_MODEL_NAME = 'Xenova/bge-base-en-v1.5';
6
+ export const DEFAULT_DIMENSIONS = 768;
6
7
  const DEFAULT_BATCH_SIZE = 32;
7
- const DEFAULT_DIMENSIONS = 768;
8
8
  transformersEnv.cacheDir = process.env.TRANSFORMERS_CACHE || '~/.cache/huggingface/transformers/';
9
9
  transformersEnv.backends.onnx.wasm.numThreads = 1;
10
10
  let extractorPromise = null;
@@ -19,8 +19,13 @@ async function getExtractor() {
19
19
  const modelName = getModelName();
20
20
  console.log(`[EmbeddingsService] Loading model: ${modelName}...`);
21
21
  const startTime = Date.now();
22
+ // Don't cache a rejected promise — a transient model-load failure would
23
+ // otherwise permanently brick the embeddings backend until process restart.
22
24
  extractorPromise = pipeline('feature-extraction', modelName, {
23
25
  quantized: true,
26
+ }).catch((err) => {
27
+ extractorPromise = null;
28
+ throw err;
24
29
  });
25
30
  const extractor = await extractorPromise;
26
31
  const loadTime = Date.now() - startTime;
@@ -45,12 +50,27 @@ export async function batchGenerateLocalEmbeddings(texts, batchSize = DEFAULT_BA
45
50
  const results = [];
46
51
  for (let i = 0; i < texts.length; i += batchSize) {
47
52
  const batch = texts.slice(i, i + batchSize);
48
- const batchOutputs = await Promise.all(batch.map((text) => extractor(text, {
53
+ // Pass the whole batch as an array — transformers.js runs a single padded,
54
+ // vectorized ONNX forward pass instead of N separate ones (the WASM backend
55
+ // is single-threaded, so the old `Promise.all` over per-text calls executed
56
+ // serially with full per-call tokenization/tensor-alloc overhead).
57
+ const output = await extractor(batch, {
49
58
  pooling: 'cls',
50
59
  normalize: true,
51
- })));
52
- const batchEmbeddings = batchOutputs.map((output) => Array.from(output.data));
53
- results.push(...batchEmbeddings);
60
+ });
61
+ // CLS-pooled + L2-normalized output is [batchSize, dim]; slice the flat
62
+ // Float32Array into per-row vectors. Prefer the tensor's reported dims;
63
+ // fall back to dividing the flat length by the batch size.
64
+ const flat = output.data;
65
+ const dims = output.dims;
66
+ const dim = dims && dims.length >= 2
67
+ ? dims[dims.length - 1]
68
+ : batch.length > 0
69
+ ? flat.length / batch.length
70
+ : 0;
71
+ for (let row = 0; row < batch.length; row++) {
72
+ results.push(Array.from(flat.slice(row * dim, (row + 1) * dim)));
73
+ }
54
74
  }
55
75
  return results;
56
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobu/embeddings",
3
- "version": "6.1.1",
3
+ "version": "7.0.0",
4
4
  "license": "BUSL-1.1",
5
5
  "type": "module",
6
6
  "description": "Embeddings HTTP service for Lobu memory",