mlx-bun 0.0.10 → 0.0.12

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 (216) hide show
  1. package/README.md +107 -32
  2. package/THIRD_PARTY_LICENSES.md +10 -0
  3. package/docs/archive/mlx-bun-lab-report.html +275 -0
  4. package/docs/archive/wwdc-mlx-bun.html +848 -0
  5. package/docs/design/audio-input-plan.md +356 -0
  6. package/docs/design/batching-perf-path.md +58 -35
  7. package/docs/design/batching-v2-plan.md +23 -9
  8. package/docs/design/bucketing-stage.md +2 -1
  9. package/docs/design/colibri-glm52-port.md +1479 -0
  10. package/docs/design/compat-cli-surface-design.md +4 -3
  11. package/docs/design/decode-speed-program.md +172 -0
  12. package/docs/design/docs-reorg-plan.md +1 -1
  13. package/docs/design/dspark-serving-program.md +371 -0
  14. package/docs/design/dspark-speculative-decoding.md +167 -5
  15. package/docs/design/faithful-l1-consolidation.md +310 -0
  16. package/docs/design/generic-model-support.md +8 -5
  17. package/docs/design/grammar-spec-batching-integration.md +301 -0
  18. package/docs/design/minicpm5-decode-megakernel.md +16 -11
  19. package/docs/design/mlx-lm-tool-parity-plan.md +11 -1
  20. package/docs/design/omlx-adoption-map.md +14 -6
  21. package/docs/design/orpo-training.md +34 -30
  22. package/docs/design/paged-kv-cache.md +214 -0
  23. package/docs/design/parallel-slots.md +82 -49
  24. package/docs/design/parity-tier-dag.md +43 -33
  25. package/docs/design/pre-colibri-stabilization.md +329 -0
  26. package/docs/design/repo-cleanup-plan.md +189 -0
  27. package/docs/design/runtime-isolation.md +19 -3
  28. package/docs/design/segmented-backward-training.md +3 -2
  29. package/docs/design/ssd-kv-cold-tier.md +130 -0
  30. package/docs/design/structured-output.md +484 -0
  31. package/docs/design/the-dreaming-master-plan.md +2 -3
  32. package/docs/design/turboquant-kv.md +235 -0
  33. package/docs/design/unified-engine-frontier-plan.md +774 -0
  34. package/docs/design/web-chat-beat-matrix.md +315 -0
  35. package/docs/design/web-chat-redesign.md +1112 -0
  36. package/docs/investigations/colibri-oracle-pin.md +1284 -0
  37. package/docs/investigations/dspark-handoff.md +182 -16
  38. package/docs/investigations/indexshare-performance-spike.md +357 -0
  39. package/docs/investigations/lab-build-journal.md +2 -2
  40. package/docs/investigations/openwiki-evaluation.md +249 -0
  41. package/docs/planning/IDEAS.md +14 -0
  42. package/docs/planning/PRODUCT_ROADMAP.md +2 -3
  43. package/docs/planning/chat-ui-vision-memory-first.md +199 -0
  44. package/docs/planning/chat-ui-vision.md +50 -0
  45. package/docs/planning/memory-docs-and-dag-plan.md +15 -6
  46. package/docs/planning/release-notes-v0.0.11.md +239 -0
  47. package/docs/planning/release-notes-v0.0.12.md +80 -0
  48. package/docs/reference/cli.md +63 -18
  49. package/docs/reference/distribution.md +37 -6
  50. package/docs/reference/embedding.md +40 -16
  51. package/docs/reference/features-matrix.md +99 -0
  52. package/docs/reference/library-api.md +69 -20
  53. package/docs/reference/memory.md +26 -6
  54. package/docs/reference/models.md +60 -3
  55. package/docs/reference/orpo-quickstart.md +3 -4
  56. package/docs/reference/server-api.md +717 -24
  57. package/docs/reference/server-config.md +265 -129
  58. package/docs/reference/training.md +24 -16
  59. package/package.json +5 -3
  60. package/src/anthropic.ts +67 -44
  61. package/src/audio/conformer.ts +647 -0
  62. package/src/audio/decode.ts +133 -0
  63. package/src/audio/features.ts +202 -0
  64. package/src/audio/transcode.ts +67 -0
  65. package/src/chat-template.ts +155 -10
  66. package/src/cli.ts +483 -113
  67. package/src/config.ts +116 -24
  68. package/src/diffusion/diffusion-generate.ts +14 -8
  69. package/src/download.ts +143 -12
  70. package/src/eval/README.md +7 -6
  71. package/src/eval/ifeval.ts +63 -120
  72. package/src/eval/kl.ts +59 -3
  73. package/src/eval/quality-db.ts +2 -2
  74. package/src/eval/runner.ts +17 -8
  75. package/src/eval/tasks/ifeval.ts +167 -31
  76. package/src/expert-io.ts +391 -0
  77. package/src/expert-offload.ts +15 -2
  78. package/src/expert-residency.ts +1134 -0
  79. package/src/expert-usage.ts +415 -0
  80. package/src/flags.ts +13 -0
  81. package/src/generate.ts +438 -35
  82. package/src/grammar.ts +585 -0
  83. package/src/hf-push.ts +1 -1
  84. package/src/hub-rest.ts +242 -0
  85. package/src/index.ts +14 -2
  86. package/src/jobs/runner.ts +37 -18
  87. package/src/kv-store.ts +586 -93
  88. package/src/lora.ts +85 -14
  89. package/src/md-modules.d.ts +42 -0
  90. package/src/media-fetch.ts +426 -0
  91. package/src/memory/rest.ts +245 -0
  92. package/src/memory/vault.ts +74 -0
  93. package/src/mlx/array.ts +149 -19
  94. package/src/mlx/autograd.ts +53 -16
  95. package/src/mlx/checkpoint.ts +46 -13
  96. package/src/mlx/custom-vjp.ts +83 -35
  97. package/src/mlx/ffi.ts +27 -3
  98. package/src/mlx/metal-kernel.ts +7 -4
  99. package/src/mlx/ops.ts +153 -23
  100. package/src/mlx/turboquant-ops.ts +831 -0
  101. package/src/mlx/turboquant-tables.ts +237 -0
  102. package/src/model/batched-mask.ts +62 -1
  103. package/src/model/batched-quant.ts +206 -0
  104. package/src/model/batched-rotating-quant.ts +346 -0
  105. package/src/model/batched-rotating.ts +46 -1
  106. package/src/model/compiled-decode.ts +4 -15
  107. package/src/model/factory.ts +103 -6
  108. package/src/model/gemma4-base.ts +395 -39
  109. package/src/model/gemma4.ts +122 -33
  110. package/src/model/generated/gemma4-12b.ts +9 -13
  111. package/src/model/generated/gemma4-26b.ts +10 -5
  112. package/src/model/generated/gemma4-e4b.ts +14 -9
  113. package/src/model/glm52-atlas.ts +511 -0
  114. package/src/model/glm52-cache.ts +706 -0
  115. package/src/model/glm52-config.ts +262 -0
  116. package/src/model/glm52-container.ts +305 -0
  117. package/src/model/glm52-coupling.ts +388 -0
  118. package/src/model/glm52-dsa.ts +602 -0
  119. package/src/model/glm52-expert-layout.ts +253 -0
  120. package/src/model/glm52-layout.ts +152 -0
  121. package/src/model/glm52-memory.ts +473 -0
  122. package/src/model/glm52-mla.ts +786 -0
  123. package/src/model/glm52-moe.ts +223 -0
  124. package/src/model/glm52-pilot.ts +537 -0
  125. package/src/model/glm52-reference.ts +445 -0
  126. package/src/model/glm52-residency.ts +557 -0
  127. package/src/model/glm52-resident-weights.ts +135 -0
  128. package/src/model/glm52-streamed-experts.ts +453 -0
  129. package/src/model/glm52-streamed-metal.ts +610 -0
  130. package/src/model/glm52-weights.ts +503 -0
  131. package/src/model/glm52.ts +1153 -0
  132. package/src/model/minicpm5.ts +58 -102
  133. package/src/model/paged-kv.ts +253 -0
  134. package/src/model/qwen3-delta.ts +76 -15
  135. package/src/model/qwen3-moe.ts +404 -0
  136. package/src/model/qwen3.ts +9 -8
  137. package/src/model/qwen3_5.ts +88 -23
  138. package/src/model/support.ts +19 -1
  139. package/src/model/universal/dense.ts +40 -5
  140. package/src/model/universal/rope.ts +36 -21
  141. package/src/native/expert_io.c +523 -0
  142. package/src/native-pack.ts +6 -4
  143. package/src/pi-web.ts +1299 -82
  144. package/src/preflight.ts +27 -8
  145. package/src/prompt-cache.ts +293 -33
  146. package/src/quantize/quantizer.ts +16 -1
  147. package/src/registry.ts +57 -2
  148. package/src/responses.ts +62 -49
  149. package/src/serve/batch-scheduler.ts +1050 -78
  150. package/src/serve/generation-gateway.ts +252 -24
  151. package/src/serve/isolate.ts +417 -0
  152. package/src/serve/lane-registry.ts +44 -0
  153. package/src/serve/session-search.ts +326 -0
  154. package/src/server.ts +1701 -175
  155. package/src/spec/assistant-source.ts +150 -0
  156. package/src/spec/deepspec-source.ts +143 -0
  157. package/src/spec/dflash-source.ts +124 -0
  158. package/src/spec/dspark/ab-stats.ts +136 -0
  159. package/src/spec/dspark/calibration.ts +112 -0
  160. package/src/spec/dspark/deepspec-module.ts +801 -0
  161. package/src/spec/dspark/generate-dflash.ts +72 -20
  162. package/src/spec/dspark/loader.ts +23 -0
  163. package/src/spec/dspark/module-dflash.ts +278 -36
  164. package/src/spec/dspark/quantize-drafter.ts +91 -0
  165. package/src/spec/generate.ts +59 -25
  166. package/src/spec/glm52-mtp-source.ts +392 -0
  167. package/src/spec/ngram-source.ts +132 -0
  168. package/src/spec/serve-loop.ts +617 -0
  169. package/src/spec/source.ts +118 -0
  170. package/src/spec/two-model.ts +171 -0
  171. package/src/ssd-cache.ts +111 -35
  172. package/src/tokenizer.ts +288 -2
  173. package/src/tool-approvals.ts +131 -0
  174. package/src/tool-call.ts +438 -22
  175. package/src/train/flash-cce.ts +2 -2
  176. package/src/train/job.ts +0 -12
  177. package/src/train/lora-params.ts +17 -6
  178. package/src/train/trainer.ts +60 -30
  179. package/src/vision/prompt.ts +217 -48
  180. package/src/web/app.html +1197 -1791
  181. package/src/web/app.js +5694 -0
  182. package/src/web/icon.svg +13 -0
  183. package/src/web/manifest.webmanifest +24 -0
  184. package/src/web/src/adapters-panel.ts +288 -0
  185. package/src/web/src/api.ts +57 -0
  186. package/src/web/src/assistant.ts +485 -0
  187. package/src/web/src/chat.ts +1050 -0
  188. package/src/web/src/composer.ts +959 -0
  189. package/src/web/src/dataset.ts +132 -0
  190. package/src/web/src/finetune.ts +267 -0
  191. package/src/web/src/hub.ts +428 -0
  192. package/src/web/src/main.ts +98 -0
  193. package/src/web/src/markdown.ts +0 -0
  194. package/src/web/src/memory-panel.ts +572 -0
  195. package/src/web/src/model-picker.ts +159 -0
  196. package/src/web/src/palette.ts +346 -0
  197. package/src/web/src/protocol.ts +62 -0
  198. package/src/web/src/quantize.ts +167 -0
  199. package/src/web/src/rag.ts +274 -0
  200. package/src/web/src/sessions.ts +469 -0
  201. package/src/web/src/shell.ts +804 -0
  202. package/src/web/src/status.ts +300 -0
  203. package/src/web/src/ui-catalog.ts +92 -0
  204. package/src/web/sw.js +71 -0
  205. package/src/web/vendor/README.md +61 -0
  206. package/src/web/vendor/hljs-LICENSE +29 -0
  207. package/src/web/vendor/hljs-theme.css +59 -0
  208. package/src/web/vendor/hljs.js +26 -0
  209. package/src/web-tools.ts +54 -2
  210. package/src/weights.ts +82 -19
  211. package/src/model/fused-decode-kernel.ts +0 -312
  212. package/src/model/fused-geglu-kernel.ts +0 -198
  213. package/src/model/fused-mlp-kernel.ts +0 -169
  214. package/src/model/fused-swiglu-kernel.ts +0 -240
  215. package/src/model/steel-linear-kernel.ts +0 -96
  216. package/src/status-page.html +0 -497
@@ -0,0 +1,132 @@
1
+ // NgramSource — MODEL-FREE prompt-lookup speculative drafting behind the
2
+ // DraftSource seam (src/spec/source.ts). No weights, no caches, no tokenizer:
3
+ // drafts are copied from the request's own token stream. When the trailing
4
+ // k-gram of (prompt + emitted-so-far) has occurred earlier in that stream,
5
+ // the tokens that followed the earlier occurrence are proposed as the draft;
6
+ // the shared verify/accept executor (src/spec/serve-loop.ts) makes the result
7
+ // LOSSLESS by construction (drafts are only proposals — the target's own
8
+ // samples decide every emitted token, at any temperature; only the acceptance
9
+ // rate moves). Best case: agentic/RAG/code-edit traffic that re-emits spans
10
+ // already present in context.
11
+ //
12
+ // Prior art (ported, not invented): "Prompt Lookup Decoding" (Apoorv Saxena,
13
+ // github.com/apoorvumang/prompt-lookup-decoding) and vLLM's `ngram` proposer
14
+ // (vllm/v1 spec_decode ngram_proposer) — both match the LONGEST k-gram first
15
+ // (k = max..min) and take the FIRST occurrence scanning left-to-right; we
16
+ // follow that exactly. Defaults mirror Saxena (max_ngram_size=3,
17
+ // num_pred_tokens=10 → our --num-draft-tokens default for this kind).
18
+ //
19
+ // Token-history reconstruction (the one subtle part): the seam hands sources
20
+ // the prompt at prefill() and only the FEED tail each round — never the full
21
+ // emitted stream — so this source rebuilds it from the feed/commit discipline
22
+ // (same information two-model keeps in its draft KV):
23
+ // - prefill: history = prompt to len-1 under the oracle tail-split shape
24
+ // (the last prompt token arrives as the first round's feed = [pending]);
25
+ // full prompt under the legacy shape (token0 arrives as its feed).
26
+ // - draft(feed): history += feed. feed is [correction] after a rejected
27
+ // round, or [lastDraft, bonus] after an all-accept round (mlx-lm's
28
+ // re-feed rule, generate.py:645-648) — so the all-accept round's LAST
29
+ // draft is deliberately NOT pushed at commit (it arrives here instead).
30
+ // - commit(d, kAccept): history += drafts[0 .. min(kAccept, d-1)) — the
31
+ // accepted drafts except that re-fed last one. Rejected tips never enter
32
+ // history; the correction token arrives via the next feed.
33
+ // Invariant at matching time (just after the feed push): history ==
34
+ // prompt + every emitted token, ending at the pending/anchor token.
35
+ //
36
+ // A round with no match returns [] — the serve loop's d=0 semantics degrade
37
+ // it to one plain target step (bit-equivalent to non-spec decode), so ngram
38
+ // speculation is structurally never worse than plain decode by more than the
39
+ // JS scan (~µs against 30k-token histories).
40
+
41
+ import { flagOn } from "../flags";
42
+ import type { DraftProvider, DraftSource } from "./source";
43
+
44
+ export interface NgramOptions {
45
+ /** Longest suffix k-gram tried first (Saxena max_ngram_size). */
46
+ max?: number;
47
+ /** Shortest k-gram tried before giving up (vLLM prompt_lookup_min). */
48
+ min?: number;
49
+ }
50
+
51
+ export class NgramProvider implements DraftProvider {
52
+ readonly id = "ngram";
53
+ readonly weightsBytes = 0;
54
+ readonly max: number;
55
+ readonly min: number;
56
+
57
+ constructor(opts: NgramOptions = {}) {
58
+ this.max = Math.max(1, opts.max ?? 3);
59
+ this.min = Math.max(1, Math.min(opts.min ?? 1, this.max));
60
+ }
61
+
62
+ open(_opts: Parameters<DraftProvider["open"]>[0]): DraftSource {
63
+ // Sampler and target both ignored: proposals come from lookup, not a
64
+ // model, so drafting is sampler-independent (like the assistant source —
65
+ // correctness holds at any temperature, only acceptance moves).
66
+ return new NgramSource(this.max, this.min);
67
+ }
68
+
69
+ dispose(): void {}
70
+ }
71
+
72
+ class NgramSource implements DraftSource {
73
+ readonly weightsBytes = 0;
74
+ #hist: number[] = [];
75
+ #lastDrafts: number[] = [];
76
+
77
+ constructor(
78
+ private readonly max: number,
79
+ private readonly min: number,
80
+ ) {}
81
+
82
+ /** Test hook — the reconstructed prompt+emitted stream (see header). */
83
+ get history(): readonly number[] {
84
+ return this.#hist;
85
+ }
86
+
87
+ prefill(promptIds: number[]): void {
88
+ // Mirror the serve loop's prefill shape (two-model.ts does the same): under
89
+ // the oracle tail split the last prompt token is never prefilled — it IS
90
+ // the first feed. Legacy shape (kill switch / 1-token prompt): full prompt,
91
+ // and the sampled token0 arrives as the first feed.
92
+ const tailSplit = flagOn("MLX_BUN_PREFILL_TAIL_SPLIT", true);
93
+ const upTo = tailSplit && promptIds.length > 1 ? promptIds.length - 1 : promptIds.length;
94
+ this.#hist = promptIds.slice(0, upTo);
95
+ }
96
+
97
+ draft(feed: number[], n: number, _stepBase: number): number[] {
98
+ this.#hist.push(...feed);
99
+ this.#lastDrafts = this.#propose(n);
100
+ return this.#lastDrafts;
101
+ }
102
+
103
+ commit(d: number, kAccept: number): void {
104
+ // Accepted drafts join history, EXCEPT an all-accept round's last draft —
105
+ // the serve loop re-feeds it ([lastDraft, bonus]) and the next draft()'s
106
+ // feed push would double it (see header). d=0 rounds push nothing.
107
+ const upTo = Math.max(0, Math.min(kAccept, d - 1));
108
+ for (let i = 0; i < upTo; i++) this.#hist.push(this.#lastDrafts[i]!);
109
+ }
110
+
111
+ /** Longest-k-first, first-occurrence prompt lookup (Saxena/vLLM order):
112
+ * find the trailing k-gram earlier in history, propose what followed it. */
113
+ #propose(n: number): number[] {
114
+ const h = this.#hist;
115
+ const L = h.length;
116
+ const kTop = Math.min(this.max, L - 1);
117
+ for (let k = kTop; k >= this.min; k--) {
118
+ const tailAt = L - k;
119
+ // First occurrence, left to right; i + k < L both excludes the trailing
120
+ // self-match and guarantees at least one continuation token.
121
+ search: for (let i = 0; i + k < L; i++) {
122
+ for (let j = 0; j < k; j++) {
123
+ if (h[i + j] !== h[tailAt + j]) continue search;
124
+ }
125
+ return h.slice(i + k, i + k + n);
126
+ }
127
+ }
128
+ return [];
129
+ }
130
+
131
+ dispose(): void {}
132
+ }