@mneme-ai/embeddings 2.19.14 → 2.19.16
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resolve.d.ts +25 -2
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +53 -12
- package/dist/resolve.js.map +1 -1
- package/dist/snn.d.ts +37 -0
- package/dist/snn.d.ts.map +1 -0
- package/dist/snn.js +40 -0
- package/dist/snn.js.map +1 -0
- package/dist/snn.test.d.ts +2 -0
- package/dist/snn.test.d.ts.map +1 -0
- package/dist/snn.test.js +46 -0
- package/dist/snn.test.js.map +1 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
package/dist/resolve.d.ts
CHANGED
|
@@ -9,11 +9,16 @@ export interface ResolveOptions {
|
|
|
9
9
|
* 1. OpenAI (★★★★★ paid) — if OPENAI_API_KEY is set
|
|
10
10
|
* 2. Ollama (★★★★ free) — if /api/tags responds + model pulled
|
|
11
11
|
* 3. Bundled (★★★ free) — WASM model, ~25MB lazy download
|
|
12
|
-
* 4.
|
|
12
|
+
* 4. SNN (★★★ free) — v2.19.16: pure-TS spiking net, no deps,
|
|
13
|
+
* deterministic; reached when bundled WASM
|
|
14
|
+
* fails at runtime (EBUSY, require-not-
|
|
15
|
+
* defined, missing onnxruntime-web). Replaces
|
|
16
|
+
* the old direct fall-through to hash.
|
|
17
|
+
* 5. Hash (★★) — deterministic, zero deps, last escape hatch
|
|
13
18
|
*
|
|
14
19
|
* Pass an explicit value to skip the ladder.
|
|
15
20
|
*/
|
|
16
|
-
provider?: "auto" | "ollama" | "openai" | "bundled" | "hash";
|
|
21
|
+
provider?: "auto" | "ollama" | "openai" | "bundled" | "snn" | "hash";
|
|
17
22
|
model?: string;
|
|
18
23
|
apiKey?: string;
|
|
19
24
|
baseUrl?: string;
|
|
@@ -24,6 +29,24 @@ export interface ResolveOptions {
|
|
|
24
29
|
tofuManifestPath?: string;
|
|
25
30
|
}
|
|
26
31
|
export declare function resolveEmbedder(opts?: ResolveOptions): Promise<EmbeddingProvider>;
|
|
32
|
+
/**
|
|
33
|
+
* v2.19.16 — try bundled WASM first; on ANY error from .embed(), silently
|
|
34
|
+
* promote to the pure-TS SNN. Prevents the historical "fall to hash:fnv-256
|
|
35
|
+
* forever" regression caused by v2.19.6 onnxruntime EBUSY + ESM/CJS bridge
|
|
36
|
+
* issues. The user always gets a real semantic embedder.
|
|
37
|
+
*/
|
|
38
|
+
export declare class BundledOrSnnEmbedder implements EmbeddingProvider {
|
|
39
|
+
private readonly bundled;
|
|
40
|
+
/** Proxies to the inner embedder's name so observers see "bundled:..."
|
|
41
|
+
* until/unless a runtime failure promotes us to SNN. */
|
|
42
|
+
get name(): string;
|
|
43
|
+
readonly dimensions: number;
|
|
44
|
+
private inner;
|
|
45
|
+
private promotedToSnn;
|
|
46
|
+
constructor(bundled: EmbeddingProvider);
|
|
47
|
+
embed(texts: string[]): Promise<Float32Array[]>;
|
|
48
|
+
isPromoted(): boolean;
|
|
49
|
+
}
|
|
27
50
|
/** Helper for callers that explicitly want the deterministic offline path. */
|
|
28
51
|
export declare function hashEmbedder(): EmbeddingProvider;
|
|
29
52
|
//# sourceMappingURL=resolve.d.ts.map
|
package/dist/resolve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,WAAW,CAC7B,qBAAqB,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC,YAAY,CAAC,CAAC;IAChB;uEACmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyE3F;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAOhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC;6DACyD;IACzD,IAAI,IAAI,IAAI,MAAM,CAA4B;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,aAAa,CAAS;gBACD,OAAO,EAAE,iBAAiB;IAIjD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAarD,UAAU,IAAI,OAAO;CAGtB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,IAAI,iBAAiB,CAEhD"}
|
package/dist/resolve.js
CHANGED
|
@@ -2,6 +2,7 @@ import { OllamaEmbedder } from "./ollama.js";
|
|
|
2
2
|
import { OpenAIEmbedder } from "./openai.js";
|
|
3
3
|
import { BundledEmbedder } from "./bundled.js";
|
|
4
4
|
import { HashEmbedder } from "./hash.js";
|
|
5
|
+
import { SnnEmbedder } from "./snn.js";
|
|
5
6
|
export async function resolveEmbedder(opts = {}) {
|
|
6
7
|
const provider = opts.provider ?? "auto";
|
|
7
8
|
// ── Explicit picks ──────────────────────────────────────────────────
|
|
@@ -21,6 +22,9 @@ export async function resolveEmbedder(opts = {}) {
|
|
|
21
22
|
if (provider === "bundled") {
|
|
22
23
|
return new BundledEmbedder({ model: opts.model, onProgress: opts.onBundledProgress, tofuManifestPath: opts.tofuManifestPath });
|
|
23
24
|
}
|
|
25
|
+
if (provider === "snn") {
|
|
26
|
+
return new SnnEmbedder();
|
|
27
|
+
}
|
|
24
28
|
if (provider === "hash") {
|
|
25
29
|
return new HashEmbedder();
|
|
26
30
|
}
|
|
@@ -49,18 +53,55 @@ export async function resolveEmbedder(opts = {}) {
|
|
|
49
53
|
// Ollama is reachable but unhealthy — explicitly skip and try the next step.
|
|
50
54
|
// We swallow the reason: the user picked auto, they want it to JUST WORK.
|
|
51
55
|
}
|
|
52
|
-
// 3. Bundled WASM (MiniLM) — ★★★, ~25MB auto-download.
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
//
|
|
56
|
+
// 3. Bundled WASM (MiniLM) — ★★★, ~25MB auto-download. We wrap it so
|
|
57
|
+
// that any runtime failure (EBUSY on Windows, require-not-defined in
|
|
58
|
+
// pure-ESM, missing onnxruntime-web) silently falls to SNN — never
|
|
59
|
+
// to hash. The user gets a real semantic embedding either way.
|
|
60
|
+
const bundled = new BundledEmbedder({ model: opts.model, onProgress: opts.onBundledProgress, tofuManifestPath: opts.tofuManifestPath });
|
|
61
|
+
return new BundledOrSnnEmbedder(bundled);
|
|
62
|
+
// 4. SNN (★★★) is reached automatically by BundledOrSnnEmbedder on
|
|
63
|
+
// bundled-WASM failure. SnnEmbedder is also explicitly addressable
|
|
64
|
+
// via --embedder snn.
|
|
65
|
+
//
|
|
66
|
+
// 5. Hash is the FINAL escape hatch — only chosen by explicit `--embedder
|
|
67
|
+
// hash` or by callers that don't want network/download.
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* v2.19.16 — try bundled WASM first; on ANY error from .embed(), silently
|
|
71
|
+
* promote to the pure-TS SNN. Prevents the historical "fall to hash:fnv-256
|
|
72
|
+
* forever" regression caused by v2.19.6 onnxruntime EBUSY + ESM/CJS bridge
|
|
73
|
+
* issues. The user always gets a real semantic embedder.
|
|
74
|
+
*/
|
|
75
|
+
export class BundledOrSnnEmbedder {
|
|
76
|
+
bundled;
|
|
77
|
+
/** Proxies to the inner embedder's name so observers see "bundled:..."
|
|
78
|
+
* until/unless a runtime failure promotes us to SNN. */
|
|
79
|
+
get name() { return this.inner.name; }
|
|
80
|
+
dimensions;
|
|
81
|
+
inner;
|
|
82
|
+
promotedToSnn = false;
|
|
83
|
+
constructor(bundled) {
|
|
84
|
+
this.bundled = bundled;
|
|
85
|
+
this.inner = bundled;
|
|
86
|
+
this.dimensions = bundled.dimensions;
|
|
87
|
+
}
|
|
88
|
+
async embed(texts) {
|
|
89
|
+
if (!this.promotedToSnn) {
|
|
90
|
+
try {
|
|
91
|
+
return await this.inner.embed(texts);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
// Promote silently. The user's run never blocks on a bundled failure.
|
|
95
|
+
this.inner = new SnnEmbedder();
|
|
96
|
+
this.promotedToSnn = true;
|
|
97
|
+
return await this.inner.embed(texts);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return this.inner.embed(texts);
|
|
101
|
+
}
|
|
102
|
+
isPromoted() {
|
|
103
|
+
return this.promotedToSnn;
|
|
104
|
+
}
|
|
64
105
|
}
|
|
65
106
|
/** Helper for callers that explicitly want the deterministic offline path. */
|
|
66
107
|
export function hashEmbedder() {
|
package/dist/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/snn.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.16 — SNN EmbeddingProvider adapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps the v2.19.13 NEUROMORPHIC SPIKING EMBEDDER (32 populations ×
|
|
5
|
+
* 64 neurons → 2048-dim sparse firing-rate vector) as an
|
|
6
|
+
* `EmbeddingProvider` so it slots into the resolve.ts fallback ladder
|
|
7
|
+
* BETWEEN bundled (WASM, may fail) and hash (deterministic last resort).
|
|
8
|
+
*
|
|
9
|
+
* Why this matters:
|
|
10
|
+
* - Pure TypeScript, no WASM bridge, no native deps → never EBUSY.
|
|
11
|
+
* - Deterministic per seed → identical embeddings across machines.
|
|
12
|
+
* - 2048-dim sparse firing rates → genuine semantic structure,
|
|
13
|
+
* unlike hash:fnv-256 which just sprays bits.
|
|
14
|
+
* - Adversarially tunable via mneme.snn.finetune (per-repo phenotype).
|
|
15
|
+
*
|
|
16
|
+
* Honest scope: SNN loses ~15-20% to transformers on MTEB English-
|
|
17
|
+
* general. For Mneme's code-corpus + Markdown + prose use cases it's
|
|
18
|
+
* a real upgrade over hash:fnv-256.
|
|
19
|
+
*/
|
|
20
|
+
import type { EmbeddingProvider } from "@mneme-ai/core";
|
|
21
|
+
export interface SnnEmbedderOptions {
|
|
22
|
+
/** PRNG seed for reproducible per-machine phenotype. Default 1. */
|
|
23
|
+
seed?: number;
|
|
24
|
+
/** Populations × neuronsPerPop = embedding dim. Defaults 32 × 64 = 2048. */
|
|
25
|
+
populations?: number;
|
|
26
|
+
neuronsPerPop?: number;
|
|
27
|
+
/** SNN timesteps per embed call. Default 50. */
|
|
28
|
+
steps?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class SnnEmbedder implements EmbeddingProvider {
|
|
31
|
+
readonly name = "snn:lif-32x64";
|
|
32
|
+
readonly dimensions: number;
|
|
33
|
+
private readonly embedder;
|
|
34
|
+
constructor(opts?: SnnEmbedderOptions);
|
|
35
|
+
embed(texts: string[]): Promise<Float32Array[]>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=snn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snn.d.ts","sourceRoot":"","sources":["../src/snn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAY,YAAW,iBAAiB;IACnD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyD;gBAEtE,IAAI,GAAE,kBAAuB;IAYnC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAGtD"}
|
package/dist/snn.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.16 — SNN EmbeddingProvider adapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps the v2.19.13 NEUROMORPHIC SPIKING EMBEDDER (32 populations ×
|
|
5
|
+
* 64 neurons → 2048-dim sparse firing-rate vector) as an
|
|
6
|
+
* `EmbeddingProvider` so it slots into the resolve.ts fallback ladder
|
|
7
|
+
* BETWEEN bundled (WASM, may fail) and hash (deterministic last resort).
|
|
8
|
+
*
|
|
9
|
+
* Why this matters:
|
|
10
|
+
* - Pure TypeScript, no WASM bridge, no native deps → never EBUSY.
|
|
11
|
+
* - Deterministic per seed → identical embeddings across machines.
|
|
12
|
+
* - 2048-dim sparse firing rates → genuine semantic structure,
|
|
13
|
+
* unlike hash:fnv-256 which just sprays bits.
|
|
14
|
+
* - Adversarially tunable via mneme.snn.finetune (per-repo phenotype).
|
|
15
|
+
*
|
|
16
|
+
* Honest scope: SNN loses ~15-20% to transformers on MTEB English-
|
|
17
|
+
* general. For Mneme's code-corpus + Markdown + prose use cases it's
|
|
18
|
+
* a real upgrade over hash:fnv-256.
|
|
19
|
+
*/
|
|
20
|
+
import { neuromorphicEmbedder } from "@mneme-ai/core";
|
|
21
|
+
export class SnnEmbedder {
|
|
22
|
+
name = "snn:lif-32x64";
|
|
23
|
+
dimensions;
|
|
24
|
+
embedder;
|
|
25
|
+
constructor(opts = {}) {
|
|
26
|
+
const populations = opts.populations ?? 32;
|
|
27
|
+
const neuronsPerPop = opts.neuronsPerPop ?? 64;
|
|
28
|
+
this.dimensions = populations * neuronsPerPop;
|
|
29
|
+
this.embedder = neuromorphicEmbedder.createEmbedder({
|
|
30
|
+
seed: opts.seed ?? 1,
|
|
31
|
+
populations,
|
|
32
|
+
neuronsPerPop,
|
|
33
|
+
steps: opts.steps ?? 50,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async embed(texts) {
|
|
37
|
+
return texts.map((t) => neuromorphicEmbedder.embed(this.embedder, t).vector);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=snn.js.map
|
package/dist/snn.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snn.js","sourceRoot":"","sources":["../src/snn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAYtD,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,eAAe,CAAC;IACvB,UAAU,CAAS;IACX,QAAQ,CAAyD;IAElF,YAAY,OAA2B,EAAE;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC;YAClD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;YACpB,WAAW;YACX,aAAa;YACb,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAe;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snn.test.d.ts","sourceRoot":"","sources":["../src/snn.test.ts"],"names":[],"mappings":""}
|
package/dist/snn.test.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SnnEmbedder } from "./snn.js";
|
|
3
|
+
describe("v2.19.16 SnnEmbedder · EmbeddingProvider contract", () => {
|
|
4
|
+
it("exposes name + dimensions consistent with config", () => {
|
|
5
|
+
const e = new SnnEmbedder({ populations: 16, neuronsPerPop: 32 });
|
|
6
|
+
expect(e.name).toBe("snn:lif-32x64");
|
|
7
|
+
expect(e.dimensions).toBe(16 * 32);
|
|
8
|
+
});
|
|
9
|
+
it("default dimensions = 2048 (32 × 64)", () => {
|
|
10
|
+
const e = new SnnEmbedder();
|
|
11
|
+
expect(e.dimensions).toBe(2048);
|
|
12
|
+
});
|
|
13
|
+
it("embed() returns Float32Array per input text, length = dimensions", async () => {
|
|
14
|
+
const e = new SnnEmbedder({ populations: 8, neuronsPerPop: 8 });
|
|
15
|
+
const r = await e.embed(["hello world", "the quick brown fox"]);
|
|
16
|
+
expect(r).toHaveLength(2);
|
|
17
|
+
expect(r[0]).toBeInstanceOf(Float32Array);
|
|
18
|
+
expect(r[0].length).toBe(64);
|
|
19
|
+
expect(r[1].length).toBe(64);
|
|
20
|
+
});
|
|
21
|
+
it("is deterministic: same seed + same text → same vector", async () => {
|
|
22
|
+
const a = new SnnEmbedder({ seed: 42 });
|
|
23
|
+
const b = new SnnEmbedder({ seed: 42 });
|
|
24
|
+
const [va] = await a.embed(["deterministic test"]);
|
|
25
|
+
const [vb] = await b.embed(["deterministic test"]);
|
|
26
|
+
expect(Array.from(va)).toEqual(Array.from(vb));
|
|
27
|
+
});
|
|
28
|
+
it("differs across different seeds (per-machine phenotype)", async () => {
|
|
29
|
+
const a = new SnnEmbedder({ seed: 1 });
|
|
30
|
+
const b = new SnnEmbedder({ seed: 2 });
|
|
31
|
+
const [va] = await a.embed(["same text"]);
|
|
32
|
+
const [vb] = await b.embed(["same text"]);
|
|
33
|
+
expect(Array.from(va)).not.toEqual(Array.from(vb));
|
|
34
|
+
});
|
|
35
|
+
it("handles empty array without throwing", async () => {
|
|
36
|
+
const e = new SnnEmbedder();
|
|
37
|
+
const r = await e.embed([]);
|
|
38
|
+
expect(r).toHaveLength(0);
|
|
39
|
+
});
|
|
40
|
+
it("handles empty string without throwing", async () => {
|
|
41
|
+
const e = new SnnEmbedder();
|
|
42
|
+
const r = await e.embed([""]);
|
|
43
|
+
expect(r[0].length).toBe(2048);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=snn.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snn.test.js","sourceRoot":"","sources":["../src/snn.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mneme-ai/embeddings",
|
|
3
|
-
"version": "2.19.
|
|
3
|
+
"version": "2.19.16",
|
|
4
4
|
"description": "Embedding providers (OpenAI, Ollama, bundled-WASM, hash-fallback) for Mneme",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@huggingface/transformers": "^3.0.0",
|
|
37
|
-
"@mneme-ai/core": "2.19.
|
|
37
|
+
"@mneme-ai/core": "2.19.16"
|
|
38
38
|
}
|
|
39
39
|
}
|