mlx-bun 0.0.13 → 0.3.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.
Files changed (427) hide show
  1. package/README.md +71 -578
  2. package/bin/mlx-bun.mjs +1 -1
  3. package/docs/README.md +91 -0
  4. package/docs/{design → archive}/hlg-sampling.md +3 -3
  5. package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
  6. package/docs/{design → archive/investigations}/colibri-glm52-port.md +1 -1
  7. package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
  8. package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
  9. package/docs/{investigations → archive/investigations}/hlg-sampling-investigation.md +1 -1
  10. package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
  11. package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
  12. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +92 -0
  13. package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
  14. package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
  15. package/docs/{planning → archive/planning}/chat-ui-vision.md +1 -1
  16. package/docs/{planning → archive/planning}/chunk-task-roadmap.md +1 -1
  17. package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +4 -4
  18. package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +1 -1
  19. package/docs/{planning → archive/planning}/release-notes-v0.0.9.md +1 -1
  20. package/docs/archive/planning/release-notes-v0.2.0.md +49 -0
  21. package/docs/{planning → archive/planning}/website-readme-pass-plan.md +1 -1
  22. package/docs/design/batching.md +569 -0
  23. package/docs/design/decode-speed-program.md +3178 -169
  24. package/docs/design/dreaming-nightly-pipeline.md +675 -282
  25. package/docs/design/generic-model-support.md +579 -334
  26. package/docs/design/kv-cache.md +680 -0
  27. package/docs/design/orpo-training.md +673 -1239
  28. package/docs/design/speculative-decoding.md +1627 -0
  29. package/docs/design/turboquant.md +2102 -0
  30. package/docs/design/unified-engine-frontier-plan.md +1831 -727
  31. package/docs/design/web-chat-redesign.md +666 -1083
  32. package/docs/planning/PRODUCT_ROADMAP.md +34 -1
  33. package/docs/planning/release-notes-v0.3.0.md +35 -0
  34. package/docs/planning/video-series.md +421 -0
  35. package/docs/reference/benchmarks.md +1162 -0
  36. package/docs/reference/cli.md +395 -149
  37. package/docs/reference/distribution.md +321 -181
  38. package/docs/reference/environment.md +348 -0
  39. package/docs/reference/glossary.md +39 -0
  40. package/docs/reference/library-api.md +580 -142
  41. package/docs/reference/memory.md +227 -64
  42. package/docs/reference/models.md +137 -6
  43. package/docs/reference/server-api.md +938 -422
  44. package/docs/reference/server-config.md +652 -320
  45. package/docs/reference/training.md +393 -254
  46. package/docs/reference/troubleshooting.md +166 -0
  47. package/package.json +10 -5
  48. package/src/admission-plan.ts +18 -0
  49. package/src/anthropic.ts +92 -3
  50. package/src/audio/decode.ts +2 -2
  51. package/src/audio/features.ts +2 -2
  52. package/src/backends/mlx/autoregressive.ts +108 -0
  53. package/src/backends/mlx/batch-group.ts +1646 -0
  54. package/src/backends/mlx/diffusion.ts +39 -0
  55. package/src/backends/mlx/draft-target.ts +47 -0
  56. package/src/backends/mlx/evaluation.ts +105 -0
  57. package/src/backends/mlx/fill-append.ts +45 -0
  58. package/src/backends/mlx/gateway-binding.ts +71 -0
  59. package/src/backends/mlx/graph.ts +38 -0
  60. package/src/backends/mlx/memory-client.ts +189 -0
  61. package/src/backends/mlx/memory-guard.ts +40 -0
  62. package/src/backends/mlx/methods.ts +90 -0
  63. package/src/backends/mlx/model-prompt.ts +164 -0
  64. package/src/backends/mlx/model-serving.ts +79 -0
  65. package/src/backends/mlx/prefill.ts +33 -0
  66. package/src/backends/mlx/request-policy.ts +20 -0
  67. package/src/backends/mlx/rollback.ts +51 -0
  68. package/src/backends/mlx/serial-executor.ts +273 -0
  69. package/src/backends/mlx/speculative.ts +114 -0
  70. package/src/backends/mlx/state-views.ts +26 -0
  71. package/src/backends/mlx/text-engine.ts +73 -0
  72. package/src/cli.ts +189 -61
  73. package/src/client.ts +66 -0
  74. package/src/config.ts +21 -4
  75. package/src/contracts/completion.ts +16 -0
  76. package/src/contracts/execution.ts +49 -0
  77. package/src/contracts/generation.ts +103 -0
  78. package/src/contracts/host.ts +7 -0
  79. package/src/contracts/jobs.ts +66 -0
  80. package/src/contracts/pi-provider.ts +30 -0
  81. package/src/contracts/pi.ts +259 -0
  82. package/src/contracts/resources.ts +18 -0
  83. package/src/contracts/scheduling.ts +27 -0
  84. package/src/contracts/tsconfig.json +14 -0
  85. package/src/diffusion/diffusion-generate.ts +218 -153
  86. package/src/embed.ts +1 -1
  87. package/src/engine/admission.ts +59 -0
  88. package/src/engine/cancellation.ts +38 -0
  89. package/src/engine/engine.ts +56 -0
  90. package/src/engine/execution-coordinator.ts +70 -0
  91. package/src/engine/execution-plan.ts +51 -0
  92. package/src/engine/resources.ts +42 -0
  93. package/src/engine/scheduler.ts +67 -0
  94. package/src/engine/session.ts +247 -0
  95. package/src/eval/README.md +44 -1
  96. package/src/eval/kl.ts +263 -23
  97. package/src/eval/reference-logits.ts +207 -0
  98. package/src/eval/runner.ts +10 -79
  99. package/src/eval/tasks/bfcl.ts +2 -1
  100. package/src/eval/tasks/gsm8k.ts +2 -1
  101. package/src/eval/tasks/hashhop.ts +2 -1
  102. package/src/eval/tasks/humaneval.ts +5 -4
  103. package/src/eval/tasks/ifeval.ts +2 -1
  104. package/src/eval/tasks/mmlu.ts +2 -1
  105. package/src/expert-io.ts +3 -1
  106. package/src/expert-offload.ts +3 -1
  107. package/src/fill/echo-index.ts +188 -0
  108. package/src/fill/fill-session.ts +452 -0
  109. package/src/fill/proposal.ts +68 -0
  110. package/src/fill/schema-rows.ts +506 -0
  111. package/src/fill/tool-boundary.ts +103 -0
  112. package/src/fit.ts +24 -43
  113. package/src/generate.ts +740 -337
  114. package/src/grammar.ts +14 -8
  115. package/src/harness-pi.ts +15 -34
  116. package/src/hub-rest.ts +4 -4
  117. package/src/index.ts +27 -0
  118. package/src/inference/denoising.ts +17 -0
  119. package/src/inference/graph.ts +33 -0
  120. package/src/inference/prefill.ts +39 -0
  121. package/src/inference/rollback.ts +7 -0
  122. package/src/jobs/db.ts +4 -0
  123. package/src/jobs/index.ts +2 -0
  124. package/src/jobs/job-entry.ts +15 -14
  125. package/src/jobs/runner.ts +98 -13
  126. package/src/jobs/task-client.ts +19 -0
  127. package/src/jobs/types.ts +2 -58
  128. package/src/kv-scheme.ts +199 -0
  129. package/src/kv-store.ts +459 -234
  130. package/src/lab/README.md +18 -0
  131. package/src/{assets → lab/curve}/curve-designer.html +2 -2
  132. package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
  133. package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +7 -5
  134. package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
  135. package/src/library.ts +40 -0
  136. package/src/lora.ts +18 -0
  137. package/src/media-fetch.ts +20 -4
  138. package/src/memory/article.ts +1 -1
  139. package/src/memory/chunk.ts +1 -1
  140. package/src/memory/model.ts +32 -170
  141. package/src/memory/prompts.ts +1 -1
  142. package/src/memory/rest.ts +1 -1
  143. package/src/memory/schedule.ts +1 -1
  144. package/src/memory/stages.ts +4 -1
  145. package/src/memory/vault.ts +3 -4
  146. package/src/mlx/array.ts +9 -10
  147. package/src/mlx/compile.ts +12 -2
  148. package/src/mlx/ffi.ts +66 -22
  149. package/src/mlx/materialize.ts +23 -0
  150. package/src/mlx/metal-kernel.ts +10 -11
  151. package/src/mlx/ops.ts +64 -19
  152. package/src/mlx/quantized-rows.ts +36 -0
  153. package/src/mlx/token-bitmask.ts +52 -0
  154. package/src/mlx/turboquant-kv-decode.ts +82 -0
  155. package/src/mlx/turboquant-kv-inverse.ts +122 -0
  156. package/src/mlx/turboquant-ops.ts +33 -3
  157. package/src/mlx/turboquant-tables.ts +2 -2
  158. package/src/model/batched-mask.ts +9 -3
  159. package/src/model/batched-quant.ts +2 -2
  160. package/src/model/batched-rotating-quant.ts +45 -99
  161. package/src/model/batched-rotating-state.ts +73 -0
  162. package/src/model/batched-rotating.ts +57 -106
  163. package/src/model/batched-row-storage.ts +127 -0
  164. package/src/model/compiled-decode.ts +4 -3
  165. package/src/model/diffusion-gemma.ts +8 -8
  166. package/src/model/factory.ts +87 -49
  167. package/src/model/fingerprint.ts +1 -1
  168. package/src/model/flash-attention.ts +3 -3
  169. package/src/model/gemma4-base.ts +187 -17
  170. package/src/model/gemma4.ts +6 -6
  171. package/src/model/generated/gemma4-12b.ts +52 -148
  172. package/src/model/generated/gemma4-26b.ts +34 -94
  173. package/src/model/generated/gemma4-e4b.ts +28 -76
  174. package/src/model/glm52-cache.ts +19 -9
  175. package/src/model/glm52-dsa.ts +13 -9
  176. package/src/model/glm52-memory.ts +28 -1
  177. package/src/model/implementation.ts +69 -0
  178. package/src/model/minicpm5.ts +7 -8
  179. package/src/model/profile.ts +443 -0
  180. package/src/model/qwen-append.ts +12 -0
  181. package/src/model/qwen-conv.ts +52 -0
  182. package/src/model/qwen3-delta.ts +98 -2
  183. package/src/model/qwen3-mrope.ts +252 -0
  184. package/src/model/qwen3_5-checkpoint.ts +164 -0
  185. package/src/model/qwen3_5.ts +336 -60
  186. package/src/model/support.ts +1 -1
  187. package/src/model/trellis-balanced-scatter.ts +51 -0
  188. package/src/model/trellis-linear.ts +672 -0
  189. package/src/model/trellis-shared-m.ts +151 -0
  190. package/src/model/trellis-shared-scatter.ts +144 -0
  191. package/src/model/trellis-splitk-prefill.ts +158 -0
  192. package/src/model/trellis-tiled-prefill.ts +136 -0
  193. package/src/model/trellis-vector-expand.ts +62 -0
  194. package/src/model/trellis-wide-prefill.ts +94 -0
  195. package/src/model/universal/dense.ts +1 -1
  196. package/src/model/universal/modules.ts +8 -1
  197. package/src/native/frame_extract.swift +140 -0
  198. package/src/native-pack.ts +15 -7
  199. package/src/pi-provider.ts +6 -64
  200. package/src/pi-web.ts +14 -320
  201. package/src/prompt-cache.ts +97 -54
  202. package/src/quantize/allocator.ts +1 -1
  203. package/src/quantize/atomic-output.ts +38 -0
  204. package/src/quantize/calibration.ts +2 -1
  205. package/src/quantize/config-writer.ts +16 -3
  206. package/src/quantize/index.ts +28 -1
  207. package/src/quantize/job.ts +11 -0
  208. package/src/quantize/quantizer.ts +265 -100
  209. package/src/quantize/rotate.ts +603 -0
  210. package/src/quantize/safetensors-writer.ts +79 -1
  211. package/src/quantize/sensitivity.ts +41 -59
  212. package/src/quantize/trellis.ts +586 -0
  213. package/src/quantize/weight-transform.ts +292 -0
  214. package/src/responses.ts +130 -3
  215. package/src/runtime-config.ts +81 -0
  216. package/src/sampler.ts +276 -4
  217. package/src/serve/admin-routes.ts +184 -0
  218. package/src/serve/aux-routes.ts +132 -0
  219. package/src/serve/batch-scheduler.ts +8 -1558
  220. package/src/serve/chat-request.ts +391 -0
  221. package/src/serve/chat-stage.ts +195 -0
  222. package/src/serve/checkpoint-identity.ts +64 -0
  223. package/src/serve/completion-executor.ts +354 -0
  224. package/src/serve/completion-sink.ts +157 -0
  225. package/src/serve/discovery-routes.ts +204 -0
  226. package/src/serve/generation-gateway.ts +211 -243
  227. package/src/serve/http.ts +159 -0
  228. package/src/serve/inference-request.ts +79 -0
  229. package/src/serve/isolate.ts +297 -105
  230. package/src/serve/kv-budget.ts +14 -0
  231. package/src/serve/lab-routes.ts +341 -0
  232. package/src/serve/lane-registry.ts +2 -1
  233. package/src/serve/model-admin-routes.ts +155 -0
  234. package/src/serve/model-binding.ts +43 -0
  235. package/src/serve/model-host.ts +512 -0
  236. package/src/serve/openai-wire.ts +103 -0
  237. package/src/serve/parent-application.ts +56 -0
  238. package/src/serve/pipeline.ts +33 -0
  239. package/src/serve/preparation.ts +33 -0
  240. package/src/serve/prompt-response-trace.ts +147 -0
  241. package/src/serve/request-plan.ts +162 -0
  242. package/src/serve/request-prep.ts +346 -0
  243. package/src/serve/response-lease.ts +24 -0
  244. package/src/serve/responses-client.ts +69 -0
  245. package/src/serve/session-completion-engine.ts +110 -0
  246. package/src/serve/session-search.ts +1 -1
  247. package/src/serve/static-routes.ts +101 -0
  248. package/src/serve/text-completion-stage.ts +104 -0
  249. package/src/serve/token-streams.ts +519 -0
  250. package/src/server.ts +523 -3551
  251. package/src/spec/assistant-source.ts +10 -44
  252. package/src/spec/deepspec-source.ts +6 -6
  253. package/src/spec/dflash-source.ts +9 -8
  254. package/src/spec/dspark/ab-stats.ts +3 -3
  255. package/src/spec/dspark/calibration.ts +2 -2
  256. package/src/spec/dspark/deepspec-module.ts +2 -2
  257. package/src/spec/dspark/generate-dflash.ts +2 -2
  258. package/src/spec/dspark/generate.ts +2 -2
  259. package/src/spec/dspark/loader.ts +1 -1
  260. package/src/spec/dspark/module-dflash.ts +5 -4
  261. package/src/spec/dspark/module.ts +3 -3
  262. package/src/spec/dspark/quantize-drafter.ts +1 -1
  263. package/src/spec/generate.ts +1 -1
  264. package/src/spec/glm52-mtp-source.ts +9 -1
  265. package/src/spec/ngram-source.ts +1 -1
  266. package/src/spec/prefix-state.ts +45 -0
  267. package/src/spec/qwen-mtp-source.ts +528 -0
  268. package/src/spec/serve-loop.ts +179 -213
  269. package/src/spec/source.ts +42 -10
  270. package/src/spec/two-model.ts +1 -1
  271. package/src/ssd-cache.ts +95 -24
  272. package/src/ssd-durability.ts +207 -0
  273. package/src/tool-call.ts +51 -14
  274. package/src/train/flash-cce.ts +14 -13
  275. package/src/train/forward.ts +38 -1
  276. package/src/train/loss.ts +3 -2
  277. package/src/train/prefix-shared.ts +5 -1
  278. package/src/train/segmented.ts +9 -6
  279. package/src/train/trainer.ts +9 -8
  280. package/src/vision/preprocess.ts +1 -1
  281. package/src/vision/prompt.ts +48 -2
  282. package/src/vision/qwen3vl-preprocess.ts +409 -0
  283. package/src/vision/qwen3vl-prompt.ts +196 -0
  284. package/src/vision/qwen3vl-tower.ts +555 -0
  285. package/src/vision/video-frames.ts +148 -0
  286. package/src/web/app.html +1 -1
  287. package/src/web/app.js +15 -6
  288. package/src/web/src/adapters-panel.ts +3 -3
  289. package/src/web/src/assistant.ts +2 -36
  290. package/src/web/src/chat.ts +16 -9
  291. package/src/web/src/composer.ts +4 -4
  292. package/src/web/src/hub.ts +1 -1
  293. package/src/web/src/markdown.ts +0 -0
  294. package/src/web/src/memory-panel.ts +1 -1
  295. package/src/web/src/model-picker.ts +1 -1
  296. package/src/web/src/palette.ts +1 -1
  297. package/src/web/src/protocol.ts +3 -39
  298. package/src/web/src/sessions.ts +1 -1
  299. package/src/web/src/ui-catalog.ts +4 -18
  300. package/src/web-assets.ts +47 -0
  301. package/src/weights.ts +134 -33
  302. package/docs/archive/mlx-bun-lab-report.html +0 -275
  303. package/docs/archive/wwdc-mlx-bun.html +0 -848
  304. package/docs/design/adapters-end-to-end.md +0 -205
  305. package/docs/design/batching-perf-path.md +0 -255
  306. package/docs/design/batching-v2-plan.md +0 -529
  307. package/docs/design/bucketing-stage.md +0 -197
  308. package/docs/design/compat-cli-surface-design.md +0 -230
  309. package/docs/design/docs-reorg-plan.md +0 -165
  310. package/docs/design/dspark-serving-program.md +0 -371
  311. package/docs/design/dspark-speculative-decoding.md +0 -268
  312. package/docs/design/grammar-spec-batching-integration.md +0 -301
  313. package/docs/design/memory-inference-path.md +0 -422
  314. package/docs/design/memory-synthesis.md +0 -287
  315. package/docs/design/memory-system.md +0 -237
  316. package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
  317. package/docs/design/omlx-adoption-map.md +0 -98
  318. package/docs/design/orpo-dynamic-lambda.md +0 -220
  319. package/docs/design/orpo-future-enhancements.md +0 -340
  320. package/docs/design/paged-kv-cache.md +0 -214
  321. package/docs/design/parallel-slots.md +0 -567
  322. package/docs/design/parity-tier-dag.md +0 -161
  323. package/docs/design/repo-cleanup-plan.md +0 -189
  324. package/docs/design/runtime-isolation.md +0 -263
  325. package/docs/design/segmented-backward-training.md +0 -543
  326. package/docs/design/spec-decode-larger-targets.md +0 -229
  327. package/docs/design/ssd-kv-cold-tier.md +0 -288
  328. package/docs/design/structured-output.md +0 -484
  329. package/docs/design/tauri-desktop-app.md +0 -127
  330. package/docs/design/the-dreaming-master-plan.md +0 -445
  331. package/docs/design/turboquant-kv.md +0 -235
  332. package/docs/design/w4a16-compute-precision-spike.md +0 -232
  333. package/docs/design/web-chat-beat-matrix.md +0 -315
  334. package/docs/design/write-pipeline-entity.md +0 -468
  335. package/docs/investigations/curve-runs/bisector-route.json +0 -98
  336. package/docs/investigations/curve-runs/bisector-trace.json +0 -1393
  337. package/docs/investigations/curve-runs/curve-terrain.json +0 -1179
  338. package/docs/investigations/curve-runs/curve-terrain.svg +0 -42
  339. package/docs/investigations/hlg-ab.html +0 -34
  340. package/docs/investigations/hlg-explorer.html +0 -238
  341. package/docs/investigations/hlg-figs/cliff.svg +0 -1
  342. package/docs/investigations/hlg-figs/cross.svg +0 -1
  343. package/docs/investigations/hlg-figs/edges.svg +0 -1
  344. package/docs/investigations/hlg-figs/k20-grids.svg +0 -1
  345. package/docs/investigations/hlg-figs/k20-peaks.svg +0 -1
  346. package/docs/investigations/hlg-figs/lw-curve.svg +0 -1
  347. package/docs/investigations/hlg-figs/terrain.svg +0 -1
  348. package/docs/investigations/hlg-report.html +0 -262
  349. package/docs/investigations/hlg-runs/hlg-ab.json +0 -149
  350. package/docs/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
  351. package/docs/investigations/hlg-runs/hlg-blind.json +0 -107
  352. package/docs/investigations/hlg-runs/hlg-cliff.json +0 -197
  353. package/docs/investigations/hlg-runs/hlg-cross.json +0 -505
  354. package/docs/investigations/hlg-runs/hlg-edge.json +0 -388
  355. package/docs/investigations/hlg-runs/hlg-eval1.json +0 -25
  356. package/docs/investigations/hlg-runs/hlg-frontier.json +0 -86
  357. package/docs/investigations/hlg-runs/hlg-grid.json +0 -242
  358. package/docs/investigations/hlg-runs/hlg-grid2.json +0 -343
  359. package/docs/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
  360. package/docs/investigations/hlg-runs/hlg-map.json +0 -383
  361. package/docs/investigations/hlg-runs/run0-original.log +0 -159
  362. package/docs/investigations/hlg-runs/runA-recommended.log +0 -131
  363. package/docs/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
  364. package/docs/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
  365. package/docs/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
  366. package/docs/investigations/hlg-runs/runAD-ab-samples.log +0 -8
  367. package/docs/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
  368. package/docs/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
  369. package/docs/investigations/hlg-runs/runAG-eval-config2.log +0 -16
  370. package/docs/investigations/hlg-runs/runB-gain-variants.log +0 -192
  371. package/docs/investigations/hlg-runs/runC-pivots.log +0 -162
  372. package/docs/investigations/hlg-runs/runD-oetf.log +0 -132
  373. package/docs/investigations/hlg-runs/runE-eotf.log +0 -162
  374. package/docs/investigations/hlg-runs/runF-shaper-working.log +0 -86
  375. package/docs/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
  376. package/docs/investigations/hlg-runs/runH-wsweep.log +0 -176
  377. package/docs/investigations/hlg-runs/runI-asweep.log +0 -176
  378. package/docs/investigations/hlg-runs/runJ-knobmap.log +0 -49
  379. package/docs/investigations/hlg-runs/runK-frontier.log +0 -19
  380. package/docs/investigations/hlg-runs/runL-widemap.log +0 -65
  381. package/docs/investigations/hlg-runs/runM-frontier-emb.log +0 -15
  382. package/docs/investigations/hlg-runs/runN-verify.log +0 -116
  383. package/docs/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
  384. package/docs/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
  385. package/docs/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
  386. package/docs/investigations/hlg-runs/runR-blind-transcript.log +0 -79
  387. package/docs/investigations/hlg-runs/runS-cross-coherence.log +0 -33
  388. package/docs/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
  389. package/docs/investigations/hlg-runs/runU-cross-12b.log +0 -33
  390. package/docs/investigations/hlg-runs/runV-lw-e4b.log +0 -22
  391. package/docs/investigations/hlg-runs/runW-lw-12b.log +0 -22
  392. package/docs/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
  393. package/docs/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
  394. package/docs/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
  395. package/docs/planning/IDEAS.md +0 -69
  396. package/docs/reference/embedding.md +0 -197
  397. package/docs/reference/features-matrix.md +0 -100
  398. package/docs/reference/orpo-quickstart.md +0 -135
  399. package/src/flags.ts +0 -13
  400. /package/docs/{investigations → archive/investigations}/chunk-finetune-experiment.md +0 -0
  401. /package/docs/{investigations → archive/investigations}/colibri-oracle-pin.md +0 -0
  402. /package/docs/{investigations → archive/investigations}/curve-bisector-routing.md +0 -0
  403. /package/docs/{investigations → archive/investigations}/decode-roofline-lookagain.md +0 -0
  404. /package/docs/{investigations → archive/investigations}/dspark-handoff.md +0 -0
  405. /package/docs/{investigations → archive/investigations}/expert-offload-single-user-moe.md +0 -0
  406. /package/docs/{investigations → archive/investigations}/indexshare-performance-spike.md +0 -0
  407. /package/docs/{investigations → archive/investigations}/kernel-perf-review-2026-07.md +0 -0
  408. /package/docs/{investigations → archive/investigations}/lab-build-journal.md +0 -0
  409. /package/docs/{investigations → archive/investigations}/openwiki-evaluation.md +0 -0
  410. /package/docs/{investigations → archive/investigations}/orpo-base-uf-experiment-and-directions.md +0 -0
  411. /package/docs/{investigations → archive/investigations}/orpo-flash-cce-pin-leak.md +0 -0
  412. /package/docs/{investigations → archive/investigations}/orpo-uf-testing-handoff.md +0 -0
  413. /package/docs/{investigations → archive/investigations}/pi-builtin-investigation.md +0 -0
  414. /package/docs/{investigations → archive/investigations}/segmented-backward-handoff.md +0 -0
  415. /package/docs/{investigations → archive/investigations}/starter-model-port-handoff.md +0 -0
  416. /package/docs/{investigations → archive/investigations}/steel-flash-cce-handoff.md +0 -0
  417. /package/docs/{investigations → archive/investigations}/trainer-validation-experiment.md +0 -0
  418. /package/docs/{planning → archive/planning}/chat-ui-vision-memory-first.md +0 -0
  419. /package/docs/{planning → archive/planning}/journal.md +0 -0
  420. /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
  421. /package/docs/{planning → archive/planning}/release-notes-v0.0.10.md +0 -0
  422. /package/docs/{planning → archive/planning}/release-notes-v0.0.11.md +0 -0
  423. /package/docs/{planning → archive/planning}/release-notes-v0.0.12.md +0 -0
  424. /package/docs/{planning → archive/planning}/release-notes-v0.0.13.md +0 -0
  425. /package/docs/{planning → archive/planning}/web-ui-pass-plan.md +0 -0
  426. /package/{docs/investigations → src/serve/assets}/curve-terrain.html +0 -0
  427. /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
@@ -1,97 +1,260 @@
1
- # Memory
1
+ # Memory — the personal wiki
2
2
 
3
- mlx-bun memory is a local Markdown wiki that the built-in pi agents can read as durable user context.
3
+ `mlx-bun memory` is a local, durable memory for your assistant: a wiki of
4
+ Markdown articles at `~/.mlx-bun/wiki/` that the built-in pi agent reads to
5
+ remember your projects, people, decisions, and history across sessions. It is
6
+ yours — git-tracked, editable in any tool (Obsidian opens it as a vault), and it
7
+ never leaves the machine.
4
8
 
5
- Core rule:
9
+ The one rule the whole feature is built around:
6
10
 
7
- > Chat agents read memory articles. `mlx-bun memory synthesize` is the only writer.
11
+ > Chat-time agents **read** memory. `mlx-bun memory synthesize` is the only
12
+ > thing that **writes** it.
8
13
 
9
- The current release includes the vault, read path, Obsidian open flow, scheduler, and a live synthesis engine: `mlx-bun memory synthesize` runs the full local DAG (and the nightly job runs it on a schedule). Synthesis uses the same local models you chat with, switched into an editorial pipeline; stage-specific LoRA adapters are the hardening roadmap below.
14
+ Articles are durable priors; conversations are evidence; synthesis is the
15
+ deliberate, auditable step that turns evidence into updated articles. Normal
16
+ chat never mutates an article. Nightly synthesis is called **the Dreaming**;
17
+ its engineering design lives in
18
+ [dreaming-nightly-pipeline.md](../design/dreaming-nightly-pipeline.md) — this
19
+ page is the user-facing reference.
10
20
 
11
- ## Storage
21
+ ## Quick start
12
22
 
13
- - Vault: `~/.mlx-bun/wiki/`
14
- - User articles: `~/.mlx-bun/wiki/articles/*.md`
15
- - Read-only reference docs: `~/.mlx-bun/wiki/Reference/*.md`
16
- - Meta pages: `~/.mlx-bun/wiki/Meta/*.md`
17
- - Talk pages: `~/.mlx-bun/wiki/Talk/`
18
- - Override: `MLX_BUN_WIKI=/path/to/wiki`
19
- - Derived synthesis DB: `~/.cache/mlx-bun/memory.sqlite`
23
+ ```bash
24
+ mlx-bun memory init # create the wiki; offers import + nightly job
25
+ mlx-bun pi # the assistant now reads your memory automatically
26
+ mlx-bun memory status # where it is, how many articles, schedule state
27
+ mlx-bun memory search <query> # find something from the terminal
28
+ mlx-bun memory open # browse it in Obsidian
29
+ ```
30
+
31
+ `init` is idempotent and safe to re-run. It never overwrites files you have
32
+ edited: the README and `Meta/` pages are written only when missing. Once a
33
+ wiki exists, every `mlx-bun pi` session and the web chat behind `mlx-bun serve`
34
+ pick it up with no further configuration; if it does not exist, no memory
35
+ tools or prompt hints are exposed at all.
36
+
37
+ `mlx-bun setup` is a true alias for `mlx-bun memory` (same subcommands).
38
+
39
+ ## What the wiki contains
40
+
41
+ Everything lives under one portable folder (copy it and your memory moves
42
+ with you):
20
43
 
21
- The vault is plain Markdown, git-tracked, and opens directly in Obsidian. `Reference/` contains read-only symlinks to mlx-bun's own docs so memory has useful built-in residents on day one; synthesis must never write them.
44
+ | Path | What it is |
45
+ | --- | --- |
46
+ | `~/.mlx-bun/wiki/` | The vault root. Override with `MLX_BUN_WIKI=/path/to/wiki`. |
47
+ | `articles/*.md` | Your memory articles — one topic per file, `Topic_Name.md`. The only thing synthesis writes. |
48
+ | `Reference/*.md` | Read-only symlinks to mlx-bun's own docs (README, server API/config, library API, embedding, distribution, training, ORPO quickstart, product roadmap), so the assistant can answer mlx-bun questions on day one. Synthesis never writes here. |
49
+ | `Meta/*.md` | Operational pages the pipeline follows: editorial guidelines, article conventions, infobox schemas, category definitions, entities policy, summary style, bucketing/buckets, chunking, topics to ignore. Edit them to steer synthesis. |
50
+ | `Talk/` | Per-article discussion and conflict notes. |
51
+ | `README.md`, `.gitignore` | Orientation page; keeps `.DS_Store` and Obsidian workspace state out of git. |
52
+
53
+ The vault is plain Markdown and a git repository (`init` runs `git init` and
54
+ makes the initial commit). Every synthesis run commits its changes, so any
55
+ article change is reviewable and revertible with ordinary git. You can edit
56
+ any file directly; the next run respects your edits.
57
+
58
+ Two things live **outside** the vault because they are derived or operational:
59
+
60
+ - `~/.cache/mlx-bun/memory.sqlite` — the synthesis store (ingested
61
+ conversations, chunks, buckets, watermarks, and a rebuildable index of the
62
+ articles). The vault is truth; this DB is a cache plus pipeline ledger.
63
+ - `~/.mlx-bun/logs/memory-synthesis.{out,err}.log` — output of the nightly job.
64
+
65
+ Article names are **stems**: the filename without `.md`, underscores for
66
+ spaces (`Archie_Project`). Every command and tool below takes a stem.
22
67
 
23
68
  ## CLI
24
69
 
70
+ All subcommands are `mlx-bun memory <sub>`; with no subcommand, `status` runs.
71
+ An unknown subcommand prints help and exits non-zero (so scripts and launchd
72
+ jobs can detect typos).
73
+
74
+ ### Set up and inspect
75
+
25
76
  ```bash
26
- mlx-bun memory init # create the wiki; optional import + schedule
27
- mlx-bun memory status # path, article count, git, schedule, recent articles
28
- mlx-bun memory open # open wiki in Obsidian/Finder
29
- mlx-bun memory open <article> # open a specific article
30
- mlx-bun memory list # list article stems + Reference/* docs
31
- mlx-bun memory search <query> # search articles
32
- mlx-bun memory toc <article> # headings + anchors
33
- mlx-bun memory section <article> <anchor>
34
- mlx-bun memory links <article> # outbound/inbound wikilinks
35
- mlx-bun memory read <article> # print article body
36
- mlx-bun memory synthesize --dry-run
37
- mlx-bun memory schedule --at 03:00
38
- mlx-bun memory unschedule
77
+ mlx-bun memory init # create the wiki (alias: setup)
78
+ mlx-bun memory status # path, article + reference counts, git, nightly state, recent articles
79
+ mlx-bun memory open [article] # open the wiki or one article (alias: browse)
39
80
  ```
40
81
 
41
- **`memory synthesize` writes to your vault.** It runs the full local synthesis DAG (segment → extract → route → create/patch → reconcile → link → wikify) and creates/patches articles under `articles/` (git-committed, so every change is reviewable and revertible). `--dry-run` is the safe, no-write mode: it reports what would happen without touching the vault. `--since` and `--model` scope/steer a run. The decomposed stage workers (`segment`/`extract`/`route`/`synthesize-stage`/`link`) run one stage each and are resumable.
82
+ `init` walks through setup in a terminal: creates the vault, then offers to
83
+ seed it by importing `articles/*.md` from an existing wiki you point it at
84
+ (existing files are never overwritten), then offers to install the nightly
85
+ synthesis job. Both offers are TTY-only and default to no import / no
86
+ schedule, so a non-interactive `init` just creates the vault.
42
87
 
43
- ## Agent tools
88
+ `open` prefers Obsidian (`open -a Obsidian` for the vault, the `obsidian://`
89
+ URL handler for a single article) and falls back to Finder / the default
90
+ Markdown app.
44
91
 
45
- Both `mlx-bun pi` and the web chat expose these read-only tools, in the recommended call order — FIND the article, READ it small, follow the graph, fall back to reference docs and utilities, search only as a last resort:
92
+ ### Read from the terminal
46
93
 
47
- **FIND** (deterministic lookup, never a vector search):
48
- - `memory_resolve` — name/alias → the article
49
- - `memory_category` — category/type/series → members
94
+ ```bash
95
+ mlx-bun memory list # article stems + Reference/* docs
96
+ mlx-bun memory search <query> # ranked article matches + sample lines
97
+ mlx-bun memory toc <article> # headings with their #anchors
98
+ mlx-bun memory section <article> <anchor> # one section's body
99
+ mlx-bun memory links <article> # resolved outbound + inbound [[wikilinks]]
100
+ mlx-bun memory read <article> # the full article
101
+ ```
50
102
 
51
- **READ** (TOC → one section, not a full-article dump):
52
- - `memory_read` — TOC + lead by default; `force=true` for the full article
53
- - `memory_section` — one section's body (the default granularity)
103
+ These are the same filesystem helpers the agent tools use. `search` is a
104
+ substring search over articles and reference docs, not a semantic one; results
105
+ prefixed `Reference/` are mlx-bun docs, not your memory.
54
106
 
55
- **Follow the graph**:
56
- - `memory_links` — outbound/inbound wikilinks
57
- - `memory_infobox` — read an article's infobox fields (there is no infobox *query* tool — the infobox is content the model reads, not a filter)
107
+ ### Synthesize
58
108
 
59
- **Reference docs** (mlx-bun's own docs, mirrored read-only into the vault):
60
- - `reference_search`
61
- - `reference_read`
62
- - `reference_list`
109
+ ```bash
110
+ mlx-bun memory synthesize [--dry-run] # run the full pipeline now (aliases: pipeline, all)
111
+ ```
63
112
 
64
- **Utility**:
65
- - `memory_list` — user articles plus read-only `Reference/*` docs
66
- - `memory_status` — vault path, setup state, article count, git state, last synthesis run (from the vault's git log), schedule state, recent changed articles
113
+ **This writes to your vault** (only `articles/`, committed to git). It runs
114
+ the full local DAG — segment → extract → route → create/patch → link — then an
115
+ editorial wikify sweep over every article. `--dry-run` is the safe mode: it
116
+ lists the planned stages, makes no model calls, and writes nothing. The
117
+ command also accepts `--since` and `--model`, but the current pipeline does
118
+ not apply them — a run always covers the store's whole pending corpus with the
119
+ default model.
67
120
 
68
- **Last resort**:
69
- - `memory_search` — substring fallback when FIND failed
121
+ Synthesis runs on Gemma-4-e4b (the OptiQ 4-bit release) loaded from the
122
+ Hugging Face hub cache; if it is not downloaded the command stops with the
123
+ exact `hf download` line to run. If a trained `memory-chunk` adapter is present
124
+ at `~/.cache/mlx-bun/adapters/memory-chunk` the segment stage mounts it; every
125
+ other stage runs the base model with its policy prompt. Set
126
+ `MLX_BUN_MEMORY_BATCH=<n>` to batch model calls (default 1).
127
+
128
+ Synthesis operates on conversations already loaded into the synthesis store.
129
+ The pipeline's ingest step reports "corpus already in the store" — it does not
130
+ scan your pi sessions on its own today, so a fresh store yields an empty run.
131
+
132
+ ### Run one stage
70
133
 
71
- The tools are always registered. If no vault exists, they return a setup message instead of disappearing. Search/read results prefixed with `Reference/` are mlx-bun docs, not user memory articles.
134
+ The DAG is decomposed into independent, resumable workers. Each pulls its
135
+ eligible work from the store by state, walks oldest-conversation-first,
136
+ persists, and exits — so you can run them separately, or as separate concurrent
137
+ processes on different conversation slices (GPU and memory allowing):
72
138
 
73
- ## Web chat REST surface
139
+ ```bash
140
+ mlx-bun memory segment [--limit N] [--convs a,b] # conversations → topic chunks
141
+ mlx-bun memory extract [--limit N] [--convs a,b] # chunks → entities
142
+ mlx-bun memory route [--convs a,b] # entities → create / capture decisions
143
+ mlx-bun memory synthesize-stage [--limit N] [--convs a,b] # create + patch articles (alias: stage-synthesize)
144
+ mlx-bun memory link [--limit N] # deterministic cross-linking, no model
145
+ ```
74
146
 
75
- The web chat's Memory panel talks to a separate, HTTP-only `/api/memory/*` route surface (status/list/search/article/links/history/diff + a `POST /api/memory/init` consent-card endpoint) — thin wrappers over the same vault read path above, documented in [server-api.md](server-api.md#get-apimemory--post-apimemoryinit). The agent-tool surface above is unaffected by it.
147
+ `--limit` bounds the batch (segment, extract, synthesize-stage, link);
148
+ `--convs` restricts a run to specific conversation ids. `link` inline-links
149
+ first mentions of other articles and rebuilds each `## See also` from mentions
150
+ and co-occurrence; it is idempotent and needs no model.
76
151
 
77
- ## Obsidian
152
+ ### Schedule the Dreaming
78
153
 
79
154
  ```bash
80
- mlx-bun memory open
81
- mlx-bun memory open Archie_Project
155
+ mlx-bun memory schedule [--at HH:MM] # install the nightly job (default 03:00)
156
+ mlx-bun memory unschedule # remove it
82
157
  ```
83
158
 
84
- The first command opens the vault. The second opens one article. Obsidian is preferred; Finder/default Markdown app is the fallback.
159
+ `schedule` writes a launchd agent (`~/Library/LaunchAgents/com.mlx-bun.memory.plist`,
160
+ label `com.mlx-bun.memory`) that runs `mlx-bun memory synthesize` at the
161
+ given local time and loads it. launchd survives reboots and runs a job missed
162
+ while the machine was asleep on next wake. `status` shows whether the job is
163
+ installed and loaded; if `launchctl load` fails the plist is still written and
164
+ the command tells you to load it by hand.
165
+
166
+ ## The Dreaming — what nightly synthesis does
167
+
168
+ From your side, the Dreaming is a nightly editor that reads what you talked
169
+ about and keeps a wiki current. Each run:
170
+
171
+ 1. **Segments** each new conversation into single-topic chunks (pointer ranges
172
+ into the transcript, not copies).
173
+ 2. **Extracts** the subjects each chunk is about — people, projects, tools,
174
+ decisions — and resolves aliases so "the Lumix" and "Lumix S5" are one thing.
175
+ 3. **Routes** every subject: enough substance gets its own article; thin
176
+ subjects are captured so they stay searchable until they warrant one. There
177
+ is no notability filter — if you talk about it, it surfaces.
178
+ 4. **Creates or patches** articles: new subjects get an outline, per-section
179
+ drafts, and an infobox; existing articles get one section folded in at a
180
+ time, the rest left byte-identical. Corrections arrive as ordinary chunks,
181
+ and chronological processing means your latest position wins.
182
+ 5. **Cross-links** the vault (first mentions → `[[wikilinks]]`, co-occurrence →
183
+ See also) and commits.
184
+ 6. **Wikifies** — an editorial sweep over every article: tighten each section
185
+ without losing any citation or specific detail, refresh the infobox.
186
+
187
+ Deterministic gates sit between every model step: citation survival, footnote
188
+ integrity, word floors, wikilink resolution, article-structure checks. A weak
189
+ model output is rejected and the article is left untouched — a bad night is a
190
+ no-op, never a corrupted vault. Every article carries `conv:` citations back to
191
+ the conversation that supported it.
192
+
193
+ Everything runs locally on the same base model you chat with; no embeddings,
194
+ no cloud. Architecture, stage contracts, and the gate definitions are in
195
+ [dreaming-nightly-pipeline.md](../design/dreaming-nightly-pipeline.md).
196
+
197
+ ## Agent tools (pi and web chat)
198
+
199
+ When a vault exists, `mlx-bun pi` and the web chat register these read-only
200
+ tools plus a `memory` skill that teaches the workflow: **FIND** the article,
201
+ **READ** it small, follow the graph, use reference docs for mlx-bun questions,
202
+ and search only as a last resort. The system prompt gets one soft hint that
203
+ memory is on; memory is for user-specific continuity, not a first step for
204
+ weather, public facts, or ordinary coding tasks.
205
+
206
+ **FIND** (deterministic lookup, never a vector search):
207
+ - `memory_resolve` — name or alias → the article (stem, title, kind, lead); offers near candidates on a miss.
208
+ - `memory_category` — one of category / type / series → member articles.
209
+
210
+ **READ** (TOC → one section, not a whole-article dump):
211
+ - `memory_read` — TOC + lead by default; `force=true` for the full article (large articles still degrade to TOC + lead).
212
+ - `memory_section` — one section by heading anchor; the default read granularity.
213
+
214
+ **Follow the graph**:
215
+ - `memory_links` — outbound `[[links]]` grouped by origin (infobox / series / see also / prose) plus inbound backlinks.
216
+ - `memory_infobox` — an article's infobox as key:value facts to read. There is no infobox *query* tool; to find articles use `memory_resolve` or `memory_category`.
217
+
218
+ **Reference docs** (mlx-bun's own docs, mirrored read-only under `Reference/`):
219
+ - `reference_search`, `reference_read`, `reference_list`.
220
+
221
+ **Utility**:
222
+ - `memory_list` — your article stems (an overview/fallback, not a first move).
223
+ - `memory_status` — vault path, setup state, article count, git state, schedule state.
224
+
225
+ **Last resort**:
226
+ - `memory_search` — substring search across articles; use only after the deterministic finders failed.
227
+
228
+ All of these are read-only and auto-allowed; none can modify an article. If
229
+ the vault is missing, the tools are not registered at all, and the skill and
230
+ prompt hint are omitted.
231
+
232
+ ## Web chat: Memory panel and REST routes
233
+
234
+ The web chat's Memory panel talks to a loopback-only HTTP surface that wraps
235
+ the same vault helpers: `GET /api/memory/status`, `/list`, `/search`,
236
+ `/article`, `/links`, `/history`, `/diff`, and `POST /api/memory/init` (the
237
+ first-run consent card; the same `setupVault` the CLI uses, minus the
238
+ interactive import and schedule prompts). A `GET /v1/memory/synthesize`
239
+ route streams a synthesis run as server-sent events (`?dry=1` for a dry run).
240
+ Wire details — parameters, response shapes, the no-vault response — are owned
241
+ by [server-api.md](server-api.md#get-apimemory--post-apimemoryinit). These
242
+ routes never touch the agent-tool surface above.
85
243
 
86
- ## Synthesis roadmap
244
+ ## Consent and safety
87
245
 
88
- The pipeline (saved pi sessions → articles) runs today on the local model; the roadmap hardens each stage with four specialized LoRA adapters trained from existing Lucien-scale pipeline data and distributed from Hugging Face:
246
+ - Creating the vault is explicit (`memory init` or the web consent card);
247
+ scheduling is explicit (`memory schedule` or the `init` prompt).
248
+ - Chat-time tools are read-only. Article mutation by the agent during chat is
249
+ out of bounds by construction.
250
+ - Opening Obsidian or Finder is you browsing and editing your own files; it is
251
+ not agent mutation.
252
+ - Imports copy articles in; the source wiki is never modified.
253
+ - Nothing — articles, conversations, synthesis — leaves the machine.
89
254
 
90
- 1. deterministic ingest of saved web/terminal pi session JSONL;
91
- 2. **memory-chunk LoRA** — conversation → topic chunks (already trained as a WIP artifact);
92
- 3. **memory-bucket LoRA** — chunk → existing bucket or new article proposal;
93
- 4. **memory-synthesis LoRA** — chunks + existing article → conservative article update candidate;
94
- 5. **memory-editor LoRA** — candidate article → polished wiki Markdown;
95
- 6. deterministic footnote/wikilink normalization, quality gates, and git commit.
255
+ ## Related
96
256
 
97
- The adapters propose; the pipeline validates and writes. The pipeline writes only `articles/`; `Reference/` is immutable context. Synthesis is live today (`mlx-bun memory synthesize` runs the full DAG; the nightly `memory schedule` job runs it automatically); imported/hand-written user articles and the built-in read-only mlx-bun reference docs coexist with synthesized ones.
257
+ - [cli.md](cli.md#memory--the-personal-wiki) — the `memory` command in the full CLI reference.
258
+ - [server-api.md](server-api.md#get-apimemory--post-apimemoryinit) — `/api/memory/*` wire format.
259
+ - [dreaming-nightly-pipeline.md](../design/dreaming-nightly-pipeline.md) — the canonical pipeline design.
260
+ - [docs/design/dreaming-nightly-pipeline.md](../design/dreaming-nightly-pipeline.md), [docs/design/dreaming-nightly-pipeline.md](../design/dreaming-nightly-pipeline.md) — synthesis internals and the local inference path.
@@ -1,8 +1,88 @@
1
- # Model management: get / scan / ls / gc
2
-
3
- How mlx-bun downloads, indexes, lists, and reclaims models. The store is
4
- the standard Hugging Face hub cache — nothing proprietary; `hf` and
5
- mlx-lm read/write the same tree.
1
+ # Models: supported roster + management (get / scan / ls / gc)
2
+
3
+ The one supported-model list, plus how mlx-bun downloads, indexes, lists,
4
+ and reclaims models. The store is the standard Hugging Face hub cache —
5
+ nothing proprietary; `hf` and mlx-lm read/write the same tree.
6
+
7
+ ## Supported models
8
+
9
+ The source of truth is code, not this table: `src/model/profile.ts`
10
+ (which `model_type` loads via which graph), `src/model/support.ts` (the
11
+ support tier `mlx-bun ls` prints), `src/model/universal/archs.ts` (the
12
+ Tier-0 descriptor table), `src/spec/source.ts` + `src/server.ts` (draft
13
+ sources), and the `instanceof` gates in `src/server.ts` for image / video /
14
+ audio. If this table and the code disagree, the code wins and this table
15
+ is the bug.
16
+
17
+ Scope is deliberate: a few families held to explicit oracle contracts
18
+ (L1 = bit-exact vs mlx-lm, L2 = bit-exact vs mlx-optiq, L3 = measured, no
19
+ oracle), plus a declared Tier-0 generic surface. There is no alias table —
20
+ the "query" column is a substring that `resolve()` matches against
21
+ already-downloaded repos (it must match exactly one repo; see
22
+ [Query resolution rules](#query-resolution-rules-per-verb)).
23
+
24
+ | `serve` query | Validated artifact (HF repo) | Family · load path · tier | Modalities | Draft sources | KV schemes | Notes |
25
+ | --- | --- | --- | --- | --- | --- | --- |
26
+ | `e4b` | `mlx-community/gemma-4-e4b-it-OptiQ-4bit` | Gemma 4 (`gemma4*`) · dedicated `gemma4` graph with a **generated** specialization keyed on the config fingerprint · L1 | text · **image** (SigLIP tower in the bf16 `optiq_vision.safetensors` sidecar) · **audio** (Conformer tower in the same sidecar) | two-model · Gemma `-assistant` (L2) · locally-trained DSpark (`dspark.json`) · ngram | bf16 · uniform 4/8 · `config` (kv_config.json, batches) · turbo · `--paged-kv` | **Default model** (`DEFAULT_REPO_ID`, src/fit.ts). The only audio-capable artifact. ~7.0 GB on disk (benchmarks.md legend, 2026-06-15). Trains (LoRA / ORPO / SFT). |
27
+ | `12B` | `mlx-community/gemma-4-12B-it-OptiQ-4bit` | Gemma 4 · generated specialization · L1 | text · **image** (encoder-free `gemma4_unified_vision` declared in config.json — no sidecar needed). No audio: the snapshot's sidecar is an audio **stub** (`embed_audio` only, no `audio_tower.*`) | two-model · `-assistant` · DSpark local · **DeepSpec released** (`deepseek-ai/dspark_gemma4_12b_block7`) · ngram | bf16 · uniform · `config` · turbo · `--paged-kv` | ~8.4 GB (2026-06-15). `largestRecommendedRepoId` pick for ≥ 24 GB RAM (src/fit.ts). Trains. |
28
+ | `26B` | `mlx-community/gemma-4-26B-A4B-it-OptiQ-4bit` | Gemma 4 MoE · generated specialization · L1 | text · image **only if** the snapshot ships the SigLIP sidecar (registry `has_vision_sidecar`; the tower is `gemma4_vision`). No `audio_config` → no audio | two-model · `-assistant` · ngram | bf16 · uniform · `config` · turbo · `--paged-kv` | ~18 GB (2026-06-15). `largestRecommendedRepoId` pick for ≥ 48 GB RAM. |
29
+ | any other `gemma4*` config (1B, e2b, 31B, …) | — | Gemma 4 · the `Gemma4Model` monolith (no generated specialization) · L1 by family | per the registry's vision/audio flags | same as the family | same as the family | Loads by `model_type`; **no artifact is pinned in tests/support/goldens for these**, so treat as family-supported, artifact-unvalidated. |
30
+ | `MiniCPM5` | `mlx-community/MiniCPM5-1B-OptiQ-4bit` | MiniCPM5 · `model_type: llama` matched by exact shape (`isMiniCPM5Config`) → dedicated `minicpm5` graph · L1 / L2 | text | two-model · ngram | bf16 · uniform · `config` (batches — Phase 3.1) · turbo (quality curve measured 2026-07-06, benchmarks.md §3) | Sub-GB starter (benchmarks.md legend). Trains (segmented backward). Tool calling (XML). |
31
+ | `Qwen3.5-4B` | `mlx-community/Qwen3.5-4B-OptiQ-4bit` | Qwen3.5 (`qwen3_5` / `qwen3_5_text`, dense hybrid gated-DeltaNet) · dedicated `qwen3.5` graph · L1 | text (image/video only when the artifact ships vision weights — see Qwen3.8) | two-model · ngram · `mtp` if a `qwen3_5_mtp` companion exists | bf16 (L1) · `config` (KV-ON parity passed 2026-06-15, PLAN 14e) | Thinking + tool calling. Batches on the SSM path (`MLX_BUN_BATCH_SSM=0` reverts). The MoE variant `qwen3_5_moe` is **not** supported. |
32
+ | `Qwen3.8` | `mlx-community/Qwen3.8-27B-OptiQ-4bit` @ `b04599de95d7a9bfbd7f208d347c0f10d9432a42` | Qwen3.5 family · **exact artifact profile** `qwen3.8-27b-optiq-4bit` (safetensors + `qwen3.5` graph) · L1 | text · **image** · **video** (`image_url` / `video_url` parts; Qwen3-VL tower + mRoPE; video decodes via the AVFoundation sidecar `mlx-bun-frame-extract`, 2 fps, ≤ 768 frames). Video never combines with audio; no audio | **native MTP head** (`mlx-community/Qwen3.8-27B-MTP-bf16`, auto-detected `qwen3_5_mtp`; `--draft-kind mtp` with no `--draft-model` uses a bundled `mtp/` subfolder) · two-model · ngram | bf16 (L1) · `config` is **Lab** — policy copied from the same-topology Qwen3.6 artifact, no model-specific oracle (benchmarks.md, 2026-08-22) | `reasoning_effort` (xhigh/medium/low) + `preserve_thinking` + tool calling. `/v1/models` advertises vision. Shipped in v0.2.0. |
33
+ | `Qwen3-Embedding` | `mlx-community/Qwen3-Embedding-4B-4bit-DWQ` | plain `qwen3` · dedicated `qwen3` graph · L1 | text | — | — | **Embeddings only**: `/v1/embeddings` + `mlx-bun embed`. Auto-picked by `embed` when no query is given; never the chat default. |
34
+ | `Qwen3-30B` | `mlx-community/Qwen3-30B-A3B-Thinking-2507-4bit` | Qwen3-MoE (`qwen3_moe`) · dedicated `qwen3-moe` graph · L1 (opt-in slow parity test, `MLX_BUN_TEST_QWEN3_MOE=1`) | text | two-model · ngram | bf16 (the artifact ships no kv_config.json) | Sparse top-k SwitchGLU experts. |
35
+ | `diffusiongemma` | `mlx-community/diffusiongemma-26B-A4B-it-OptiQ-4bit` | DiffusionGemma (`diffusion_gemma`) · dedicated graph + **denoising loop** (non-autoregressive) · L2 (optiq) | text · **image** (single image; its own inline-quantized SigLIP tower). No video / audio | — (no AR verify loop) | — (canvas model; the `--kv-quant` axis does not apply) | Serial lane always. Diffusion-native LoRA trains. |
36
+ | `GLM-5.2-colibri` | `mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp` @ `3cc8db99b1b13fc79325d987ba3c1c430766b3b8` | GLM-5.2 (`glm_moe_dsa`) · **Colibri container loader** + dedicated `glm5.2` graph (streamed experts) · **exact artifact profile**, L3 | text | **checkpoint-native MTP** (`--mtp on`, the default; mutually exclusive with `--draft-model`) | checkpoint-native compressed **MLA/DSA** cache (its own scheme; SSD tier v3 persists it) | Fixed-context admission: `--context-length` (4096) and `--max-tokens` (128) are reserved by the header-only resource equation before weights open; `--memory-budget` defaults to min(25 GiB, RAM). `--mtp off` enables ordinary batching. Embeddings, vision/audio, adapters, and training are unsupported. See [below](#direct-container-artifacts-glm-5x). |
37
+ | Tier-0 generic | validated manifest (`tests/support/universal-manifest.ts`): `Llama-3.2-1B-Instruct-4bit`, `Qwen2.5-0.5B-Instruct-4bit`, `Qwen3-0.6B-4bit`, `quantized-gemma-2b-it`, `gemma-2-2b-it-4bit`, `Phi-3.5-mini-instruct-4bit`, `GLM-4-9B-0414-4bit`, `granite-3.3-2b-instruct-4bit`, `starcoder2-3b-4bit`, `SmolLM3-3B-4bit` (all `mlx-community/`) and `ekryski/OLMo-2-0425-1B-Instruct-4bit` | 11 `model_type`s: `llama`, `smollm3`, `qwen2`, `qwen3`, `gemma`, `gemma2`, `phi3`, `olmo2`, `glm4`, `granite`, `starcoder2` (+ mlx-lm remaps `mistral`, `iquestcoder` → `llama`) · `universal-dense` graph · L1 | text | two-model · ngram | bf16 (the validated cell) | `ls` labels these `supported (generic)`. Batch only for plain full-attention archs (gated B=2 on Llama-3.2-3B); gemma2-family / sliding-window archs run serial. No compiled specialization. A `model_type` absent from the table refuses to load. |
38
+
39
+ Rules that apply across rows (all enforced in `src/server.ts`):
40
+
41
+ - **Draft sources.** Two-model and ngram work on any autoregressive target
42
+ (two-model requires the same tokenizer family — probe-checked at startup).
43
+ The KV-borrowing drafters (`-assistant`, DSpark, DeepSpec) require a
44
+ Gemma 4 target; `qwen3_5_mtp` heads require a Qwen3.5-family target; GLM's
45
+ MTP is its own row. Qwen MTP companions may store dense or affine-quantized
46
+ projections; the loader uses each module's quantization metadata. Target
47
+ verification is unchanged, while draft acceptance and speed depend on the
48
+ companion. Any quantized KV scheme excludes the speculative lane
49
+ (requests keep the scheme and decode serially without speculation).
50
+ - **Qwen3.5-family checkpoint generations.** Both ship the same graph and both
51
+ load: the mlx-lm-converted naming (`language_model.model.*`,
52
+ `language_model.lm_head`, `vision_tower.*`) and the transformers-5.8 export
53
+ (`model.language_model.*`, top-level `lm_head`, `model.visual.*`, in-repo
54
+ `mtp.*`, HF-layout `conv1d.weight` `[C,1,K]`, RMSNorm gains stored as γ−1).
55
+ The load seam (`src/model/qwen3_5-checkpoint.ts`) replicates mlx-lm's
56
+ `sanitize()` exactly: in-repo `mtp.*` and the vision tensors are dropped from
57
+ the text graph, and the +1.0 γ shift fires **only** when the artifact carries
58
+ `mtp.*` tensors **or** an unsanitized `conv1d.weight` — never on the naming
59
+ alone, so an old artifact can never be shifted.
60
+ - **KV schemes.** `--kv-quant 4|8` (uniform, L1) and `config` (per-layer
61
+ `kv_config.json`, L2) apply to the autoregressive families that ship the
62
+ file; `turbo` additionally requires a full-attention `head_dim` in
63
+ {64, 128, 256, 512} (refused at startup otherwise) and is solo-only;
64
+ `--paged-kv` is Gemma 4 only, bf16, serial. Flag detail:
65
+ [server-config.md](server-config.md).
66
+ - **Modalities.** Image requests reach a Gemma 4 model only when
67
+ `has_vision_sidecar` or a `*_unified_vision` config is present; audio only
68
+ when `audio_config` AND the sidecar's `audio_tower.*` tensors are both
69
+ present; video only on a Qwen3.5-family model. A request carrying media the
70
+ model cannot take is an explicit 400, never a silent text-only degrade.
71
+ Wire formats: [server-api.md](server-api.md).
72
+ - **Memory.** Disk sizes above are the dated figures from
73
+ [benchmarks.md](benchmarks.md); for RAM, ask `mlx-bun fit <query> --ctx
74
+ <n>` rather than a table (src/fit.ts is the calculator).
75
+
76
+ ### How a new model gets here
77
+
78
+ A `model_type` earns a row by landing a descriptor (Tier-0) or a dedicated
79
+ graph (targeted) **plus a green parity manifest entry** against the oracle
80
+ that already ships it — the process, cost per arch, and the graduation path
81
+ from generic to targeted are in
82
+ [docs/design/generic-model-support.md](../design/generic-model-support.md)
83
+ (§3.1 descriptor table, §3.5 the parity gate, §3.6 graduation). Exact
84
+ artifacts additionally get a declared profile (see
85
+ [Declared model profiles](#declared-model-profiles)).
6
86
 
7
87
  ## The cache layout (and why duplicates happen)
8
88
 
@@ -65,7 +145,16 @@ existing prefix in chunks — no whole-file allocation):
65
145
  A mismatch deletes the partial (never resume corrupt bytes); a short
66
146
  read keeps the `.incomplete` for resume.
67
147
 
68
- ## GLM-5.2 on a 32 GB Mac
148
+ ## Direct-container artifacts (GLM-5.x)
149
+
150
+ Models that load through the Colibri container loader (`loader: "colibri"`
151
+ in `src/model/profile.ts`) skip `Weights.open` entirely: a header-only
152
+ resource equation runs before any resident tensor or expert slab opens, and
153
+ an impossible plan fails without committing memory. One validated artifact
154
+ today; a GLM-5.3+ artifact joins as a new row in the roster above plus a
155
+ subsection here once it has a declared profile.
156
+
157
+ ### GLM-5.2 on a 32 GB Mac
69
158
 
70
159
  The validated direct-container artifact is
71
160
  `mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp` at revision
@@ -106,6 +195,48 @@ The artifact is an external MIT-licensed derivative of
106
195
  weights. Model weights are not bundled with mlx-bun; review the artifact model
107
196
  card before redistribution.
108
197
 
198
+ ## Declared model profiles
199
+
200
+ Model loading resolves one immutable profile before weights are opened. A
201
+ profile names four things: the external artifact fingerprint when one is
202
+ known, its fidelity target, the engine capabilities it requires, and the
203
+ composed loader/model-graph/generation-loop path.
204
+
205
+ Exact artifact profiles outrank family profiles. The current exact declarations
206
+ are:
207
+
208
+ | profile | external artifact | fidelity | execution |
209
+ | --- | --- | --- | --- |
210
+ | `qwen3.8-27b-optiq-4bit` | `mlx-community/Qwen3.8-27B-OptiQ-4bit` revision `b04599de95d7a9bfbd7f208d347c0f10d9432a42` | L1: bit-exact mlx-lm | safetensors + dedicated Qwen3.5/3.8 graph + autoregressive loop |
211
+ | `glm5.2-colibri-int4-int8-mtp` | `mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp` revision `3cc8db99b1b13fc79325d987ba3c1c430766b3b8` | L3: measured, no matching tier oracle | Colibri container + dedicated GLM-5.2 graph + autoregressive loop |
212
+
213
+ The fingerprint is the Hugging Face repo plus immutable snapshot revision, so
214
+ moving the cache does not change it. A mutable alias such as `snapshots/staged`
215
+ or an arbitrary local directory is not treated as exact. Those artifacts use
216
+ the dedicated model-family profile when one matches, then the universal dense
217
+ profile when that architecture is supported. Unsupported architectures still
218
+ refuse with the existing targeted/generic support list.
219
+
220
+ Profiles select construction only. They do not enable, disable, or replace MTP,
221
+ mixed-precision KV from `kv_config.json`, TurboQuant KV, adapters, grammar, or
222
+ sampling. Those methods remain explicit flags/request fields or documented
223
+ defaults. If an exact profile requires a capability the running engine does not
224
+ have, loading refuses; it never downgrades to another model path.
225
+
226
+ **Packed trellis artifacts.** A `quantization` entry with `mode: "trellis"`
227
+ (TurboQuant Q2b, `mjriii/Qwen3.8-27B-q3-…-packed`) stores that module as a
228
+ trellis-coded bit-stream + fp16 row scales and is served by the engine's own
229
+ Metal kernels; stock mlx-lm cannot load it. Experimental k3/axis0 artifacts
230
+ can store two-block interleaved codes as a 3D tensor; the loader identifies
231
+ the layout from its shape and keeps one resident code copy. Format and kernels:
232
+ `docs/design/turboquant.md` (Q campaign); fallback `MLX_BUN_TRELLIS=expand`:
233
+ `server-config.md`.
234
+
235
+ Fidelity labels mean L1 = bit-exact mlx-lm, L2 = bit-exact mlx-optiq, and L3 =
236
+ measured evidence without a matching oracle. Model profiles do not imply that a
237
+ quantized artifact retains the base model's benchmark score; quality evidence
238
+ belongs to that exact artifact.
239
+
109
240
  ## scan + the registry
110
241
 
111
242
  `mlx-bun scan` walks `models--*/snapshots/*` reading only `config.json`