@seanhogg/builderforce-memory-engine 2026.6.31 → 2026.6.34

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.
Files changed (90) hide show
  1. package/README.md +2 -0
  2. package/dist/bench/harness.d.ts +37 -0
  3. package/dist/bench/harness.d.ts.map +1 -0
  4. package/dist/bench/harness.js +171 -0
  5. package/dist/bench/harness.js.map +1 -0
  6. package/dist/bench/index.d.ts +11 -0
  7. package/dist/bench/index.d.ts.map +1 -0
  8. package/dist/bench/index.js +10 -0
  9. package/dist/bench/index.js.map +1 -0
  10. package/dist/bench/metrics.d.ts +36 -0
  11. package/dist/bench/metrics.d.ts.map +1 -0
  12. package/dist/bench/metrics.js +83 -0
  13. package/dist/bench/metrics.js.map +1 -0
  14. package/dist/bench/types.d.ts +119 -0
  15. package/dist/bench/types.d.ts.map +1 -0
  16. package/dist/bench/types.js +16 -0
  17. package/dist/bench/types.js.map +1 -0
  18. package/dist/export/gguf.d.ts +23 -0
  19. package/dist/export/gguf.d.ts.map +1 -0
  20. package/dist/export/gguf.js +158 -0
  21. package/dist/export/gguf.js.map +1 -0
  22. package/dist/export/hf.d.ts +32 -0
  23. package/dist/export/hf.d.ts.map +1 -0
  24. package/dist/export/hf.js +138 -0
  25. package/dist/export/hf.js.map +1 -0
  26. package/dist/export/index.d.ts +57 -0
  27. package/dist/export/index.d.ts.map +1 -0
  28. package/dist/export/index.js +85 -0
  29. package/dist/export/index.js.map +1 -0
  30. package/dist/export/onnx.d.ts +32 -0
  31. package/dist/export/onnx.d.ts.map +1 -0
  32. package/dist/export/onnx.js +265 -0
  33. package/dist/export/onnx.js.map +1 -0
  34. package/dist/export/protobuf.d.ts +34 -0
  35. package/dist/export/protobuf.d.ts.map +1 -0
  36. package/dist/export/protobuf.js +77 -0
  37. package/dist/export/protobuf.js.map +1 -0
  38. package/dist/export/safetensors.d.ts +22 -0
  39. package/dist/export/safetensors.d.ts.map +1 -0
  40. package/dist/export/safetensors.js +66 -0
  41. package/dist/export/safetensors.js.map +1 -0
  42. package/dist/export/tensors.d.ts +51 -0
  43. package/dist/export/tensors.d.ts.map +1 -0
  44. package/dist/export/tensors.js +76 -0
  45. package/dist/export/tensors.js.map +1 -0
  46. package/dist/index.d.ts +9 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +8 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/kernels/selective_scan.d.ts.map +1 -1
  51. package/dist/kernels/selective_scan.js +7 -3
  52. package/dist/kernels/selective_scan.js.map +1 -1
  53. package/dist/lm/evermind_lm.d.ts +17 -1
  54. package/dist/lm/evermind_lm.d.ts.map +1 -1
  55. package/dist/lm/evermind_lm.js +49 -5
  56. package/dist/lm/evermind_lm.js.map +1 -1
  57. package/dist/model/mamba_model.d.ts.map +1 -1
  58. package/dist/model/mamba_model.js +9 -1
  59. package/dist/model/mamba_model.js.map +1 -1
  60. package/dist/utils/crc32.d.ts +37 -0
  61. package/dist/utils/crc32.d.ts.map +1 -0
  62. package/dist/utils/crc32.js +70 -0
  63. package/dist/utils/crc32.js.map +1 -0
  64. package/dist/utils/delta.d.ts +37 -0
  65. package/dist/utils/delta.d.ts.map +1 -0
  66. package/dist/utils/delta.js +108 -0
  67. package/dist/utils/delta.js.map +1 -0
  68. package/dist/utils/gpu_utils.d.ts +21 -0
  69. package/dist/utils/gpu_utils.d.ts.map +1 -1
  70. package/dist/utils/gpu_utils.js +64 -5
  71. package/dist/utils/gpu_utils.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/bench/harness.ts +219 -0
  74. package/src/bench/index.ts +37 -0
  75. package/src/bench/metrics.ts +98 -0
  76. package/src/bench/types.ts +121 -0
  77. package/src/export/gguf.ts +168 -0
  78. package/src/export/hf.ts +155 -0
  79. package/src/export/index.ts +128 -0
  80. package/src/export/onnx.ts +331 -0
  81. package/src/export/protobuf.ts +86 -0
  82. package/src/export/safetensors.ts +77 -0
  83. package/src/export/tensors.ts +107 -0
  84. package/src/index.ts +63 -0
  85. package/src/kernels/selective_scan.ts +7 -3
  86. package/src/lm/evermind_lm.ts +53 -8
  87. package/src/model/mamba_model.ts +9 -1
  88. package/src/utils/crc32.ts +82 -0
  89. package/src/utils/delta.ts +117 -0
  90. package/src/utils/gpu_utils.ts +60 -5
@@ -0,0 +1,158 @@
1
+ /**
2
+ * export/gguf.ts — export weights to a GGUF v3 container (the llama.cpp format).
3
+ *
4
+ * Emits a spec-valid GGUF file: magic + version, KV metadata (architecture, dims,
5
+ * expert counts…), aligned tensor-info table, then aligned tensor data. ggml
6
+ * stores dimensions innermost-first, so row-major shapes are reversed here.
7
+ *
8
+ * NOTE: GGUF is a *container*. llama.cpp can only RUN a file whose
9
+ * `general.architecture` it has a graph for; "evermind" is custom, so this file
10
+ * is a valid, inspectable artifact (gguf tooling reads it) but won't execute in
11
+ * stock llama.cpp until the architecture is upstreamed. It exists so the same
12
+ * weights can travel through GGUF-native tooling. For an executable export use
13
+ * {@link ./onnx} or {@link ./safetensors}.
14
+ */
15
+ import { archOf, namedTensors } from "./tensors.js";
16
+ import { floatToFp16 } from "../utils/quantization.js";
17
+ const GGUF_MAGIC = 0x46554747; // "GGUF" little-endian
18
+ const GGUF_VERSION = 3;
19
+ const ALIGNMENT = 32;
20
+ // GGUF metadata value types
21
+ const T_UINT32 = 4;
22
+ const T_STRING = 8;
23
+ // ggml tensor types
24
+ const GGML_F32 = 0;
25
+ const GGML_F16 = 1;
26
+ /** A growable little-endian byte buffer. */
27
+ class ByteBuf {
28
+ buf = new Uint8Array(1024);
29
+ len = 0;
30
+ ensure(n) {
31
+ if (this.len + n <= this.buf.length)
32
+ return;
33
+ let cap = this.buf.length * 2;
34
+ while (cap < this.len + n)
35
+ cap *= 2;
36
+ const next = new Uint8Array(cap);
37
+ next.set(this.buf.subarray(0, this.len));
38
+ this.buf = next;
39
+ }
40
+ u32(v) {
41
+ this.ensure(4);
42
+ new DataView(this.buf.buffer).setUint32(this.len, v, true);
43
+ this.len += 4;
44
+ }
45
+ u64(v) {
46
+ this.ensure(8);
47
+ new DataView(this.buf.buffer).setBigUint64(this.len, BigInt(v), true);
48
+ this.len += 8;
49
+ }
50
+ raw(bytes) {
51
+ this.ensure(bytes.length);
52
+ this.buf.set(bytes, this.len);
53
+ this.len += bytes.length;
54
+ }
55
+ /** Pad with zeros until the length is a multiple of `align`. */
56
+ alignTo(align) {
57
+ const pad = (align - (this.len % align)) % align;
58
+ if (pad > 0) {
59
+ this.ensure(pad);
60
+ this.len += pad;
61
+ }
62
+ }
63
+ string(s) {
64
+ const bytes = new TextEncoder().encode(s);
65
+ this.u64(bytes.length);
66
+ this.raw(bytes);
67
+ }
68
+ get length() {
69
+ return this.len;
70
+ }
71
+ bytes() {
72
+ return this.buf.subarray(0, this.len);
73
+ }
74
+ }
75
+ function tensorBytes(data, fp16) {
76
+ if (!fp16) {
77
+ const out = new Uint8Array(data.length * 4);
78
+ const dv = new DataView(out.buffer);
79
+ for (let i = 0; i < data.length; i++)
80
+ dv.setFloat32(i * 4, data[i], true);
81
+ return out;
82
+ }
83
+ const out = new Uint8Array(data.length * 2);
84
+ const dv = new DataView(out.buffer);
85
+ for (let i = 0; i < data.length; i++)
86
+ dv.setUint16(i * 2, floatToFp16(data[i]), true);
87
+ return out;
88
+ }
89
+ /** Export a trained LM to GGUF bytes. */
90
+ export function exportGguf(lm, opts = {}) {
91
+ const fp16 = opts.fp16 ?? false;
92
+ const a = archOf(lm);
93
+ const tensors = namedTensors(lm);
94
+ const ggmlType = fp16 ? GGML_F16 : GGML_F32;
95
+ const bytesPer = fp16 ? 2 : 4;
96
+ const kvU32 = [
97
+ ["evermind.vocab_size", a.vocabSize],
98
+ ["evermind.embedding_length", a.dModel],
99
+ ["evermind.block_count", a.numLayers],
100
+ ["evermind.conv_kernel", a.convKernel],
101
+ ["evermind.feed_forward_length", a.hiddenDim],
102
+ ["evermind.expert_count", a.numExperts],
103
+ ["evermind.expert_used_count", a.topK],
104
+ ["general.alignment", ALIGNMENT],
105
+ ];
106
+ const kvStr = [
107
+ ["general.architecture", "evermind"],
108
+ ["general.name", opts.name ?? "Evermind"],
109
+ ];
110
+ // Header: magic, version, tensor_count, metadata_kv_count, KVs.
111
+ const head = new ByteBuf();
112
+ head.u32(GGUF_MAGIC);
113
+ head.u32(GGUF_VERSION);
114
+ head.u64(tensors.length);
115
+ head.u64(kvU32.length + kvStr.length);
116
+ for (const [k, v] of kvStr) {
117
+ head.string(k);
118
+ head.u32(T_STRING);
119
+ head.string(v);
120
+ }
121
+ for (const [k, v] of kvU32) {
122
+ head.string(k);
123
+ head.u32(T_UINT32);
124
+ head.u32(v);
125
+ }
126
+ // Tensor-info table. Offsets are relative to the start of the (aligned) tensor
127
+ // data section; each tensor starts at an ALIGNMENT boundary within it.
128
+ const dims = (t) => [...t.shape].reverse(); // ggml: innermost first
129
+ let dataOffset = 0;
130
+ const offsets = [];
131
+ for (const t of tensors) {
132
+ offsets.push(dataOffset);
133
+ const nbytes = t.data.length * bytesPer;
134
+ dataOffset += nbytes;
135
+ dataOffset += (ALIGNMENT - (dataOffset % ALIGNMENT)) % ALIGNMENT;
136
+ }
137
+ tensors.forEach((t, i) => {
138
+ head.string(t.name);
139
+ const d = dims(t);
140
+ head.u32(d.length);
141
+ for (const dim of d)
142
+ head.u64(dim);
143
+ head.u32(ggmlType);
144
+ head.u64(offsets[i]);
145
+ });
146
+ // Pad header to the alignment boundary, then write aligned tensor data.
147
+ head.alignTo(ALIGNMENT);
148
+ const dataStart = head.length;
149
+ for (let i = 0; i < tensors.length; i++) {
150
+ // Re-establish alignment relative to the data section start.
151
+ const want = dataStart + offsets[i];
152
+ while (head.length < want)
153
+ head.raw(new Uint8Array(1));
154
+ head.raw(tensorBytes(tensors[i].data, fp16));
155
+ }
156
+ return head.bytes();
157
+ }
158
+ //# sourceMappingURL=gguf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gguf.js","sourceRoot":"","sources":["../../src/export/gguf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * export/hf.ts — the Hugging Face repository sidecar files.
3
+ *
4
+ * The JSON/markdown that turns raw weights into an ingestible HF model repo:
5
+ * • config.json — architecture config (model_type "evermind")
6
+ * • generation_config.json — default decoding params
7
+ * • tokenizer.json — the byte-level BPE in HF `tokenizers` format
8
+ * • README.md — the model card (YAML front-matter + body)
9
+ *
10
+ * The tokenizer uses the same GPT-2 byte→unicode alphabet as {@link BPETokenizer}
11
+ * (a ByteLevel pre-tokenizer/decoder), so HF `tokenizers` / transformers.js
12
+ * reproduce our encode/decode.
13
+ */
14
+ import type { EvermindLM } from "../lm/evermind_lm.js";
15
+ import type { BPETokenizer } from "../tokenizer/bpe.js";
16
+ export interface HfMeta {
17
+ name?: string;
18
+ version?: string;
19
+ license?: string;
20
+ author?: string;
21
+ description?: string;
22
+ tags?: string[];
23
+ }
24
+ /** HF `config.json` describing the Evermind architecture. */
25
+ export declare function configJson(lm: EvermindLM): Record<string, unknown>;
26
+ /** HF `generation_config.json` — greedy by default, matching the reference. */
27
+ export declare function generationConfigJson(): Record<string, unknown>;
28
+ /** HF `tokenizer.json` (the `tokenizers` fast-tokenizer format) for the BPE. */
29
+ export declare function tokenizerJson(tok: BPETokenizer): Record<string, unknown>;
30
+ /** HF model card (`README.md`) with YAML front-matter. */
31
+ export declare function modelCardMarkdown(lm: EvermindLM, meta?: HfMeta): string;
32
+ //# sourceMappingURL=hf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hf.d.ts","sourceRoot":"","sources":["../../src/export/hf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBlE;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9D;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCxE;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAyD3E"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * export/hf.ts — the Hugging Face repository sidecar files.
3
+ *
4
+ * The JSON/markdown that turns raw weights into an ingestible HF model repo:
5
+ * • config.json — architecture config (model_type "evermind")
6
+ * • generation_config.json — default decoding params
7
+ * • tokenizer.json — the byte-level BPE in HF `tokenizers` format
8
+ * • README.md — the model card (YAML front-matter + body)
9
+ *
10
+ * The tokenizer uses the same GPT-2 byte→unicode alphabet as {@link BPETokenizer}
11
+ * (a ByteLevel pre-tokenizer/decoder), so HF `tokenizers` / transformers.js
12
+ * reproduce our encode/decode.
13
+ */
14
+ import { archOf, paramCount } from "./tensors.js";
15
+ /** HF `config.json` describing the Evermind architecture. */
16
+ export function configJson(lm) {
17
+ const a = archOf(lm);
18
+ return {
19
+ model_type: "evermind",
20
+ architectures: ["EvermindForCausalLM"],
21
+ vocab_size: a.vocabSize,
22
+ d_model: a.dModel,
23
+ hidden_size: a.dModel,
24
+ num_hidden_layers: a.numLayers,
25
+ conv_kernel: a.convKernel,
26
+ intermediate_size: a.hiddenDim,
27
+ num_experts: a.numExperts,
28
+ num_experts_per_tok: a.topK,
29
+ rms_norm_eps: 1e-5,
30
+ tie_word_embeddings: true,
31
+ torch_dtype: "float32",
32
+ transformers_version: "4.0.0",
33
+ };
34
+ }
35
+ /** HF `generation_config.json` — greedy by default, matching the reference. */
36
+ export function generationConfigJson() {
37
+ return { do_sample: false, temperature: 1.0, max_new_tokens: 64 };
38
+ }
39
+ /** HF `tokenizer.json` (the `tokenizers` fast-tokenizer format) for the BPE. */
40
+ export function tokenizerJson(tok) {
41
+ const vocab = {};
42
+ for (const [token, id] of tok.vocab)
43
+ vocab[token] = id;
44
+ const merges = [...tok.merges.keys()]; // already "a b" space-separated pairs
45
+ const added = [];
46
+ for (const content of [tok.unkToken, tok.bosToken, tok.eosToken, tok.padToken]) {
47
+ const id = tok.vocab.get(content);
48
+ if (id !== undefined && !added.some((t) => t.id === id))
49
+ added.push({ id, content });
50
+ }
51
+ return {
52
+ version: "1.0",
53
+ truncation: null,
54
+ padding: null,
55
+ added_tokens: added.map((t) => ({
56
+ id: t.id,
57
+ content: t.content,
58
+ single_word: false,
59
+ lstrip: false,
60
+ rstrip: false,
61
+ normalized: false,
62
+ special: true,
63
+ })),
64
+ normalizer: null,
65
+ pre_tokenizer: { type: "ByteLevel", add_prefix_space: false, trim_offsets: true, use_regex: true },
66
+ post_processor: { type: "ByteLevel", add_prefix_space: true, trim_offsets: false, use_regex: true },
67
+ decoder: { type: "ByteLevel", add_prefix_space: true, trim_offsets: true, use_regex: true },
68
+ model: {
69
+ type: "BPE",
70
+ dropout: null,
71
+ unk_token: null,
72
+ continuing_subword_prefix: null,
73
+ end_of_word_suffix: null,
74
+ fuse_unk: false,
75
+ byte_fallback: false,
76
+ vocab,
77
+ merges,
78
+ },
79
+ };
80
+ }
81
+ /** HF model card (`README.md`) with YAML front-matter. */
82
+ export function modelCardMarkdown(lm, meta = {}) {
83
+ const a = archOf(lm);
84
+ const params = paramCount(lm);
85
+ const name = meta.name ?? "Evermind";
86
+ const license = meta.license ?? "mit";
87
+ const tags = ["evermind", "ssm", "mixture-of-experts", "text-generation", ...(meta.tags ?? [])];
88
+ const front = [
89
+ "---",
90
+ `license: ${license}`,
91
+ "library_name: builderforce-memory",
92
+ "pipeline_tag: text-generation",
93
+ "tags:",
94
+ ...tags.map((t) => ` - ${t}`),
95
+ "---",
96
+ ].join("\n");
97
+ const body = `
98
+ # ${name}
99
+
100
+ ${meta.description ?? "A self-updating SSM language model built with the BuilderForce Evermind engine."}
101
+
102
+ An **Evermind** model: a shared-expert hybrid SSM (depthwise causal conv token-mixer
103
+ + top-k Mixture-of-Experts channel-mixer, tied embeddings). Trained and run natively
104
+ in TypeScript/WebGPU; this repository is an export for the Hugging Face ecosystem.
105
+
106
+ ## Architecture
107
+
108
+ | field | value |
109
+ | --- | --- |
110
+ | vocab size | ${a.vocabSize} |
111
+ | d_model | ${a.dModel} |
112
+ | layers | ${a.numLayers} |
113
+ | conv kernel | ${a.convKernel} |
114
+ | FFN hidden | ${a.hiddenDim} |
115
+ | experts (top-k) | ${a.numExperts} (${a.topK}) |
116
+ | parameters | ${params.toLocaleString("en-US")} |
117
+
118
+ ## Files
119
+
120
+ - \`model.safetensors\` — weights (HF-native, F32).
121
+ - \`model.onnx\` — runnable graph (\`input_ids\` → \`logits\`); load with onnxruntime / transformers.js.
122
+ - \`config.json\`, \`generation_config.json\`, \`tokenizer.json\` — HF sidecars.
123
+ - \`model.gguf\` — GGUF container (custom architecture; for GGUF tooling).
124
+ - \`model.evermind\` — the native package; runs in \`@seanhogg/builderforce-memory\` (full self-update).
125
+
126
+ ## Usage (ONNX, no KV-cache — re-run full context per step)
127
+
128
+ \`\`\`js
129
+ import * as ort from "onnxruntime-web";
130
+ const session = await ort.InferenceSession.create("model.onnx");
131
+ const ids = BigInt64Array.from([/* token ids */].map(BigInt));
132
+ const input_ids = new ort.Tensor("int64", ids, [1, ids.length]);
133
+ const { logits } = await session.run({ input_ids });
134
+ \`\`\`
135
+ ${meta.author ? `\n## Author\n\n${meta.author}\n` : ""}`;
136
+ return `${front}\n${body}`;
137
+ }
138
+ //# sourceMappingURL=hf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hf.js","sourceRoot":"","sources":["../../src/export/hf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * export/index.ts — the model-export registry.
3
+ *
4
+ * One entry point — {@link exportEvermind} — turns a trained {@link EvermindLM}
5
+ * (+ its tokenizer) into a named set of files in a requested format. The runtime
6
+ * is untouched: export reads the model through its public surface only. This is
7
+ * the *publishing* seam — training/serving stay in the WebGPU/TS runtime; export
8
+ * is offered as a separate step that emits portable artifacts (ONNX, safetensors,
9
+ * GGUF) and a complete Hugging Face repo bundle.
10
+ *
11
+ * Formats:
12
+ * • "safetensors" → model.safetensors
13
+ * • "onnx" → model.onnx
14
+ * • "gguf" → model.gguf
15
+ * • "huggingface" → a full HF repo (safetensors + onnx + gguf + config +
16
+ * tokenizer.json + generation_config + README), ready to push
17
+ */
18
+ import type { EvermindLM } from "../lm/evermind_lm.js";
19
+ import type { BPETokenizer } from "../tokenizer/bpe.js";
20
+ import { type HfMeta } from "./hf.js";
21
+ export type ExportFormat = "safetensors" | "onnx" | "gguf" | "huggingface";
22
+ /** One emitted file. `data` is bytes (binary) or a string (text). */
23
+ export interface ExportFile {
24
+ path: string;
25
+ data: Uint8Array | string;
26
+ contentType: string;
27
+ }
28
+ export interface ExportResult {
29
+ format: ExportFormat;
30
+ files: ExportFile[];
31
+ /** Total trainable scalar parameters of the exported model. */
32
+ paramCount: number;
33
+ }
34
+ export interface ExportOptions extends HfMeta {
35
+ /** Store weights as float16 where the format supports it. Default false. */
36
+ fp16?: boolean;
37
+ }
38
+ /** Catalog of formats for UI pickers (id + human label + extension). */
39
+ export declare const EXPORT_FORMATS: {
40
+ id: ExportFormat;
41
+ label: string;
42
+ description: string;
43
+ ext: string;
44
+ }[];
45
+ /**
46
+ * Export a trained model in the requested format. `tokenizer` is required for the
47
+ * "huggingface" bundle (to emit tokenizer.json); the weight-only formats ignore it.
48
+ */
49
+ export declare function exportEvermind(lm: EvermindLM, format: ExportFormat, opts?: ExportOptions, tokenizer?: BPETokenizer): ExportResult;
50
+ export { exportSafetensors, tensorsToSafetensors } from "./safetensors.js";
51
+ export { exportOnnx } from "./onnx.js";
52
+ export { exportGguf } from "./gguf.js";
53
+ export { configJson, generationConfigJson, tokenizerJson, modelCardMarkdown } from "./hf.js";
54
+ export type { HfMeta } from "./hf.js";
55
+ export { namedTensors, evermindTensorSpec, archOf, paramCount } from "./tensors.js";
56
+ export type { NamedTensor, EvermindArch, TensorSpec } from "./tensors.js";
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/export/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAAsE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAE1G,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAE3E,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM;IAC3C,4EAA4E;IAC5E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wEAAwE;AACxE,eAAO,MAAM,cAAc,EAAE;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAKjG,CAAC;AAQF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,aAAkB,EACxB,SAAS,CAAC,EAAE,YAAY,GACvB,YAAY,CAiDd;AAED,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC7F,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * export/index.ts — the model-export registry.
3
+ *
4
+ * One entry point — {@link exportEvermind} — turns a trained {@link EvermindLM}
5
+ * (+ its tokenizer) into a named set of files in a requested format. The runtime
6
+ * is untouched: export reads the model through its public surface only. This is
7
+ * the *publishing* seam — training/serving stay in the WebGPU/TS runtime; export
8
+ * is offered as a separate step that emits portable artifacts (ONNX, safetensors,
9
+ * GGUF) and a complete Hugging Face repo bundle.
10
+ *
11
+ * Formats:
12
+ * • "safetensors" → model.safetensors
13
+ * • "onnx" → model.onnx
14
+ * • "gguf" → model.gguf
15
+ * • "huggingface" → a full HF repo (safetensors + onnx + gguf + config +
16
+ * tokenizer.json + generation_config + README), ready to push
17
+ */
18
+ import { paramCount } from "./tensors.js";
19
+ import { exportSafetensors } from "./safetensors.js";
20
+ import { exportOnnx } from "./onnx.js";
21
+ import { exportGguf } from "./gguf.js";
22
+ import { configJson, generationConfigJson, tokenizerJson, modelCardMarkdown } from "./hf.js";
23
+ /** Catalog of formats for UI pickers (id + human label + extension). */
24
+ export const EXPORT_FORMATS = [
25
+ { id: "huggingface", label: "Hugging Face repo", description: "Full publishable repo: safetensors + ONNX + GGUF + config + tokenizer + model card", ext: "/" },
26
+ { id: "onnx", label: "ONNX", description: "Runnable graph for onnxruntime / transformers.js (input_ids → logits)", ext: ".onnx" },
27
+ { id: "safetensors", label: "Safetensors", description: "HF-native weight format (lossless F32 / half-size F16)", ext: ".safetensors" },
28
+ { id: "gguf", label: "GGUF", description: "llama.cpp container (custom architecture; for GGUF tooling)", ext: ".gguf" },
29
+ ];
30
+ const JSON_CT = "application/json";
31
+ function jsonFile(path, obj) {
32
+ return { path, data: JSON.stringify(obj, null, 2), contentType: JSON_CT };
33
+ }
34
+ /**
35
+ * Export a trained model in the requested format. `tokenizer` is required for the
36
+ * "huggingface" bundle (to emit tokenizer.json); the weight-only formats ignore it.
37
+ */
38
+ export function exportEvermind(lm, format, opts = {}, tokenizer) {
39
+ const params = paramCount(lm);
40
+ const base = () => ({ format, files: [], paramCount: params });
41
+ switch (format) {
42
+ case "safetensors": {
43
+ const r = base();
44
+ r.files.push({
45
+ path: "model.safetensors",
46
+ data: exportSafetensors(lm, { fp16: opts.fp16 }),
47
+ contentType: "application/octet-stream",
48
+ });
49
+ return r;
50
+ }
51
+ case "onnx": {
52
+ const r = base();
53
+ r.files.push({
54
+ path: "model.onnx",
55
+ data: exportOnnx(lm, { producerVersion: opts.version }),
56
+ contentType: "application/octet-stream",
57
+ });
58
+ return r;
59
+ }
60
+ case "gguf": {
61
+ const r = base();
62
+ r.files.push({
63
+ path: "model.gguf",
64
+ data: exportGguf(lm, { name: opts.name, fp16: opts.fp16 }),
65
+ contentType: "application/octet-stream",
66
+ });
67
+ return r;
68
+ }
69
+ case "huggingface": {
70
+ if (!tokenizer)
71
+ throw new Error("exportEvermind('huggingface'): a tokenizer is required for tokenizer.json");
72
+ const r = base();
73
+ r.files.push({ path: "model.safetensors", data: exportSafetensors(lm, { fp16: opts.fp16 }), contentType: "application/octet-stream" }, { path: "model.onnx", data: exportOnnx(lm, { producerVersion: opts.version }), contentType: "application/octet-stream" }, { path: "model.gguf", data: exportGguf(lm, { name: opts.name, fp16: opts.fp16 }), contentType: "application/octet-stream" }, jsonFile("config.json", configJson(lm)), jsonFile("generation_config.json", generationConfigJson()), jsonFile("tokenizer.json", tokenizerJson(tokenizer)), { path: "README.md", data: modelCardMarkdown(lm, opts), contentType: "text/markdown" });
74
+ return r;
75
+ }
76
+ default:
77
+ throw new Error(`exportEvermind: unknown format "${String(format)}"`);
78
+ }
79
+ }
80
+ export { exportSafetensors, tensorsToSafetensors } from "./safetensors.js";
81
+ export { exportOnnx } from "./onnx.js";
82
+ export { exportGguf } from "./gguf.js";
83
+ export { configJson, generationConfigJson, tokenizerJson, modelCardMarkdown } from "./hf.js";
84
+ export { namedTensors, evermindTensorSpec, archOf, paramCount } from "./tensors.js";
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/export/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * export/onnx.ts — export a trained {@link EvermindLM} to a runnable ONNX graph.
3
+ *
4
+ * Produces a standard causal-LM ONNX `ModelProto`: input `input_ids` [batch,seq]
5
+ * (int64) → output `logits` [batch,seq,vocab] (float). No KV cache — the model is
6
+ * stateless and recomputes the full context each step, so a host (onnxruntime-web,
7
+ * onnxruntime-node, or transformers.js driving the generation loop) re-runs the
8
+ * whole sequence per token. The graph reproduces the CPU reference forward
9
+ * EXACTLY:
10
+ *
11
+ * • embedding → Gather(emb, input_ids)
12
+ * • RMSNorm → Mul/ReduceMean/Add/Sqrt/Div/Mul (eps = 1e-5)
13
+ * • causal → Transpose → Conv(group=D, pads=[K-1,0], kernel reversed) → Transpose
14
+ * depthwise conv (so out[t] = Σⱼ ker[j]·x[t−j], matching the reference tap order)
15
+ * • MoE → router MatMul → TopK → Softmax → ScatterElements (dense top-k mask)
16
+ * → shared FFN + Σₑ combineₑ · expertₑ(x) (numerically identical to
17
+ * the sparse reference: non-selected experts get combine 0)
18
+ * • tied head → MatMul(x, embᵀ)
19
+ *
20
+ * Opset 18 / IR v8. Weights are emitted as raw little-endian f32 initializers that
21
+ * are byte-identical to {@link namedTensors} (matmul weights are transposed by a
22
+ * graph node at runtime, not duplicated on disk).
23
+ *
24
+ * Zero dependencies — the protobuf is hand-encoded by {@link ./protobuf}.
25
+ */
26
+ import type { EvermindLM } from "../lm/evermind_lm.js";
27
+ /** Build the ONNX bytes for a trained LM. */
28
+ export declare function exportOnnx(lm: EvermindLM, opts?: {
29
+ producerName?: string;
30
+ producerVersion?: string;
31
+ }): Uint8Array;
32
+ //# sourceMappingURL=onnx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onnx.d.ts","sourceRoot":"","sources":["../../src/export/onnx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAwGvD,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CAsGrH"}