mlx-bun 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +1449 -109
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +7 -5
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +10 -10
  78. package/src/{serve → server}/chat-stage.ts +14 -14
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +33 -41
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +25 -82
  85. package/src/{serve → server}/http.ts +25 -13
  86. package/src/{serve → server}/inference-request.ts +5 -5
  87. package/src/server/job-routes.ts +20 -0
  88. package/src/server/media-prompt.ts +63 -0
  89. package/src/server/memory-completion-client.ts +46 -0
  90. package/src/server/model-routes.ts +192 -0
  91. package/src/{serve → server}/openai-wire.ts +3 -2
  92. package/src/{serve → server}/pipeline.ts +1 -1
  93. package/src/server/prompt-builder.ts +13 -0
  94. package/src/server/prompt-contracts.ts +17 -0
  95. package/src/server/proxy-routes.ts +187 -0
  96. package/src/server/publishing-routes.ts +41 -0
  97. package/src/{serve → server}/request-plan.ts +6 -8
  98. package/src/{serve → server}/request-prep.ts +47 -50
  99. package/src/{serve → server}/responses-client.ts +30 -13
  100. package/src/{responses.ts → server/responses.ts} +12 -93
  101. package/src/server/routes.ts +205 -0
  102. package/src/server/start.ts +72 -0
  103. package/src/server/status-routes.ts +108 -0
  104. package/src/{serve → server}/text-completion-stage.ts +25 -4
  105. package/src/server/text-prompt.ts +12 -0
  106. package/src/{serve → server}/token-streams.ts +36 -38
  107. package/src/server/worker-routes.ts +311 -0
  108. package/src/storage/paths.ts +61 -0
  109. package/src/web/assets.ts +37 -0
  110. package/src/web/{src → browser}/api.ts +5 -23
  111. package/src/web/browser/chat-host.ts +17 -0
  112. package/src/web/browser/installed-panels.ts +6 -0
  113. package/src/web/browser/main.ts +55 -0
  114. package/src/web/browser/markdown.ts +279 -0
  115. package/src/web/browser/memory-panel.ts +9 -0
  116. package/src/web/browser/palette.ts +64 -0
  117. package/src/web/browser/protocol.ts +13 -0
  118. package/src/web/browser/shell.ts +467 -0
  119. package/src/web/{src → browser}/status.ts +32 -36
  120. package/src/web/build.ts +51 -0
  121. package/src/web/public/app.html +1054 -0
  122. package/src/web/{sw.js → public/sw.js} +4 -3
  123. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  124. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  125. package/THIRD_PARTY_LICENSES.md +0 -51
  126. package/docs/README.md +0 -107
  127. package/docs/archive/hlg-sampling.md +0 -350
  128. package/docs/archive/investigations/audio-input-plan.md +0 -356
  129. package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
  174. package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
  175. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  176. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  177. package/docs/design/batching.md +0 -2054
  178. package/docs/design/decode-speed-program.md +0 -2404
  179. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  180. package/docs/design/generic-model-support.md +0 -821
  181. package/docs/design/kv-cache.md +0 -993
  182. package/docs/design/orpo-training.md +0 -680
  183. package/docs/design/speculative-decoding.md +0 -2129
  184. package/docs/design/turboquant.md +0 -2225
  185. package/docs/design/unified-engine-frontier-plan.md +0 -1987
  186. package/docs/design/web-chat-redesign.md +0 -695
  187. package/docs/planning/PRODUCT_ROADMAP.md +0 -593
  188. package/docs/planning/ResearchTopics.md +0 -119
  189. package/docs/planning/public-readiness-handoff.md +0 -244
  190. package/docs/planning/public-readiness.md +0 -149
  191. package/docs/planning/video-series.md +0 -421
  192. package/docs/reference/benchmarks.md +0 -3587
  193. package/docs/reference/cli.md +0 -646
  194. package/docs/reference/distribution.md +0 -380
  195. package/docs/reference/environment.md +0 -494
  196. package/docs/reference/glossary.md +0 -39
  197. package/docs/reference/library-api.md +0 -688
  198. package/docs/reference/memory.md +0 -260
  199. package/docs/reference/models.md +0 -346
  200. package/docs/reference/server-api.md +0 -1945
  201. package/docs/reference/server-config.md +0 -973
  202. package/docs/reference/training.md +0 -462
  203. package/docs/reference/troubleshooting.md +0 -158
  204. package/src/admission-plan.ts +0 -18
  205. package/src/audio/audiotoolbox.ts +0 -112
  206. package/src/audio/conformer.ts +0 -655
  207. package/src/audio/decode.ts +0 -133
  208. package/src/audio/features.ts +0 -202
  209. package/src/audio/mic-capture.ts +0 -98
  210. package/src/audio/silero-vad.ts +0 -379
  211. package/src/audio/transcode.ts +0 -67
  212. package/src/audio/whisper-decode.ts +0 -774
  213. package/src/audio/whisper-fast.ts +0 -732
  214. package/src/audio/whisper-format.ts +0 -73
  215. package/src/audio/whisper-mel.ts +0 -185
  216. package/src/audio/whisper-timing.ts +0 -274
  217. package/src/audio/whisper-tokenizer.ts +0 -239
  218. package/src/audio/whisper-transcribe.ts +0 -410
  219. package/src/backends/mlx/assistant-target.ts +0 -46
  220. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  221. package/src/backends/mlx/autoregressive.ts +0 -129
  222. package/src/backends/mlx/batch-group.ts +0 -1874
  223. package/src/backends/mlx/cache-attachment.ts +0 -67
  224. package/src/backends/mlx/cache-layout.ts +0 -31
  225. package/src/backends/mlx/checkpoint-state.ts +0 -53
  226. package/src/backends/mlx/continuation-persistence.ts +0 -107
  227. package/src/backends/mlx/continuation-request.ts +0 -43
  228. package/src/backends/mlx/continuation.ts +0 -77
  229. package/src/backends/mlx/diffusion.ts +0 -39
  230. package/src/backends/mlx/draft-target.ts +0 -32
  231. package/src/backends/mlx/encoder-cache.ts +0 -25
  232. package/src/backends/mlx/evaluation.ts +0 -105
  233. package/src/backends/mlx/fill-append.ts +0 -58
  234. package/src/backends/mlx/fill-group.ts +0 -497
  235. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  236. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  237. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  238. package/src/backends/mlx/gateway-binding.ts +0 -174
  239. package/src/backends/mlx/graph.ts +0 -38
  240. package/src/backends/mlx/kv-codec.ts +0 -9
  241. package/src/backends/mlx/kv-maintenance.ts +0 -161
  242. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  243. package/src/backends/mlx/memory-client.ts +0 -189
  244. package/src/backends/mlx/methods.ts +0 -90
  245. package/src/backends/mlx/mixed-iteration.ts +0 -62
  246. package/src/backends/mlx/model-prompt.ts +0 -178
  247. package/src/backends/mlx/model-serving.ts +0 -80
  248. package/src/backends/mlx/paged-cache-codec.ts +0 -27
  249. package/src/backends/mlx/prefill-cohort.ts +0 -100
  250. package/src/backends/mlx/prefill-policy.ts +0 -26
  251. package/src/backends/mlx/prefill-rows.ts +0 -244
  252. package/src/backends/mlx/prefill.ts +0 -33
  253. package/src/backends/mlx/projected-context-rows.ts +0 -72
  254. package/src/backends/mlx/prompt-input.ts +0 -29
  255. package/src/backends/mlx/qwen-prompt-input.ts +0 -40
  256. package/src/backends/mlx/request-policy.ts +0 -20
  257. package/src/backends/mlx/request-state-policy.ts +0 -54
  258. package/src/backends/mlx/rollback.ts +0 -92
  259. package/src/backends/mlx/row-sampling.ts +0 -49
  260. package/src/backends/mlx/serial-executor.ts +0 -251
  261. package/src/backends/mlx/speculative-group.ts +0 -438
  262. package/src/backends/mlx/speculative-round.ts +0 -161
  263. package/src/backends/mlx/speculative.ts +0 -131
  264. package/src/backends/mlx/state-rows.ts +0 -104
  265. package/src/backends/mlx/state-views.ts +0 -46
  266. package/src/backends/mlx/target-layout-capability.ts +0 -35
  267. package/src/backends/mlx/text-engine.ts +0 -73
  268. package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
  269. package/src/chat-template.ts +0 -382
  270. package/src/cli.ts +0 -3490
  271. package/src/config.ts +0 -399
  272. package/src/contracts/completion.ts +0 -16
  273. package/src/contracts/execution.ts +0 -70
  274. package/src/contracts/generation.ts +0 -103
  275. package/src/contracts/host.ts +0 -7
  276. package/src/contracts/object-cache.ts +0 -8
  277. package/src/contracts/pi-provider.ts +0 -30
  278. package/src/contracts/pi.ts +0 -261
  279. package/src/contracts/prefix-cache.ts +0 -33
  280. package/src/contracts/resources.ts +0 -25
  281. package/src/contracts/sampling.ts +0 -23
  282. package/src/contracts/scheduling.ts +0 -54
  283. package/src/contracts/tsconfig.json +0 -14
  284. package/src/dataset/generators.ts +0 -1087
  285. package/src/dataset/index.ts +0 -12
  286. package/src/dataset/job.ts +0 -81
  287. package/src/dataset/llm.ts +0 -71
  288. package/src/dataset/registry.ts +0 -528
  289. package/src/diffusion/diffusion-generate.ts +0 -507
  290. package/src/download.ts +0 -505
  291. package/src/embed.ts +0 -77
  292. package/src/engine/admission.ts +0 -59
  293. package/src/engine/cancellation.ts +0 -38
  294. package/src/engine/engine.ts +0 -56
  295. package/src/engine/execution-coordinator.ts +0 -70
  296. package/src/engine/execution-plan.ts +0 -64
  297. package/src/engine/execution-tasks.ts +0 -44
  298. package/src/engine/namespaced-cache.ts +0 -13
  299. package/src/engine/resources.ts +0 -53
  300. package/src/engine/scheduler.ts +0 -92
  301. package/src/engine/session.ts +0 -247
  302. package/src/eval/README.md +0 -130
  303. package/src/eval/ifeval.ts +0 -81
  304. package/src/eval/kl-prompts.ts +0 -29
  305. package/src/eval/kl.ts +0 -590
  306. package/src/eval/perplexity.ts +0 -164
  307. package/src/eval/quality-db.ts +0 -92
  308. package/src/eval/reference-logits.ts +0 -207
  309. package/src/eval/runner.ts +0 -124
  310. package/src/eval/score.ts +0 -49
  311. package/src/eval/tasks/bfcl.ts +0 -535
  312. package/src/eval/tasks/gsm8k.ts +0 -98
  313. package/src/eval/tasks/hashhop.ts +0 -139
  314. package/src/eval/tasks/humaneval.ts +0 -275
  315. package/src/eval/tasks/ifeval.ts +0 -525
  316. package/src/eval/tasks/mmlu.ts +0 -157
  317. package/src/eval/ultrafeedback.ts +0 -60
  318. package/src/evaldb.ts +0 -199
  319. package/src/expert-io.ts +0 -393
  320. package/src/expert-offload-build.ts +0 -77
  321. package/src/expert-offload.ts +0 -76
  322. package/src/expert-residency.ts +0 -1134
  323. package/src/expert-usage.ts +0 -415
  324. package/src/fill/echo-index.ts +0 -188
  325. package/src/fill/fill-session.ts +0 -463
  326. package/src/fill/proposal.ts +0 -68
  327. package/src/fill/schema-rows.ts +0 -506
  328. package/src/fill/tool-boundary.ts +0 -103
  329. package/src/fit.ts +0 -249
  330. package/src/generate.ts +0 -1352
  331. package/src/grammar.ts +0 -604
  332. package/src/harness-pi.ts +0 -184
  333. package/src/hf-push.ts +0 -628
  334. package/src/hub-rest.ts +0 -242
  335. package/src/index.ts +0 -63
  336. package/src/inference/denoising.ts +0 -17
  337. package/src/inference/draft-acceptance.ts +0 -41
  338. package/src/inference/draft-output.ts +0 -49
  339. package/src/inference/graph.ts +0 -33
  340. package/src/inference/prefill.ts +0 -45
  341. package/src/inference/rollback.ts +0 -7
  342. package/src/jobs/index.ts +0 -31
  343. package/src/jobs/job-entry.ts +0 -107
  344. package/src/jobs/task-client.ts +0 -19
  345. package/src/jobs/types.ts +0 -2
  346. package/src/kv-scheme.ts +0 -279
  347. package/src/kv-store.ts +0 -1135
  348. package/src/lab/README.md +0 -22
  349. package/src/lab/curve/curve-designer.html +0 -303
  350. package/src/lab/curve/curve-sampler.ts +0 -122
  351. package/src/lab/expert-trace/expert-trace.ts +0 -69
  352. package/src/lab/paged-kv/paged-attention.ts +0 -117
  353. package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
  354. package/src/lab/paged-kv/paged-kv.ts +0 -336
  355. package/src/library.ts +0 -40
  356. package/src/lora.ts +0 -408
  357. package/src/md-modules.d.ts +0 -54
  358. package/src/media-fetch.ts +0 -442
  359. package/src/memory/article.ts +0 -558
  360. package/src/memory/chunk-validation.ts +0 -150
  361. package/src/memory/chunk.ts +0 -318
  362. package/src/memory/cluster.ts +0 -351
  363. package/src/memory/coverage.ts +0 -134
  364. package/src/memory/crosslink.ts +0 -0
  365. package/src/memory/db.ts +0 -253
  366. package/src/memory/entity.ts +0 -203
  367. package/src/memory/gate.ts +0 -187
  368. package/src/memory/history.ts +0 -152
  369. package/src/memory/ingest.ts +0 -335
  370. package/src/memory/model.ts +0 -183
  371. package/src/memory/normalize.ts +0 -671
  372. package/src/memory/parse.ts +0 -22
  373. package/src/memory/pipeline.ts +0 -275
  374. package/src/memory/prompts.ts +0 -65
  375. package/src/memory/query.ts +0 -334
  376. package/src/memory/reconcile.ts +0 -734
  377. package/src/memory/redirect.ts +0 -108
  378. package/src/memory/reindex.ts +0 -325
  379. package/src/memory/resolve.ts +0 -307
  380. package/src/memory/rest.ts +0 -245
  381. package/src/memory/route.ts +0 -272
  382. package/src/memory/schedule.ts +0 -165
  383. package/src/memory/stages.ts +0 -777
  384. package/src/memory/synthesize.ts +0 -1638
  385. package/src/memory/tools.ts +0 -749
  386. package/src/memory/vault.ts +0 -1194
  387. package/src/memory/wikify.ts +0 -1064
  388. package/src/mlx/array.ts +0 -425
  389. package/src/mlx/autograd.ts +0 -304
  390. package/src/mlx/checkpoint.ts +0 -149
  391. package/src/mlx/compile.ts +0 -168
  392. package/src/mlx/custom-vjp.ts +0 -188
  393. package/src/mlx/ffi.ts +0 -531
  394. package/src/mlx/materialize.ts +0 -23
  395. package/src/mlx/metal-kernel.ts +0 -159
  396. package/src/mlx/normalized-argmax.ts +0 -116
  397. package/src/mlx/ops.ts +0 -1108
  398. package/src/mlx/quantized-rows.ts +0 -36
  399. package/src/mlx/token-bitmask.ts +0 -52
  400. package/src/mlx/turboquant-kv-decode.ts +0 -82
  401. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  402. package/src/mlx/turboquant-ops.ts +0 -861
  403. package/src/mlx/turboquant-tables.ts +0 -237
  404. package/src/mmap.ts +0 -90
  405. package/src/model/artifact-identity.ts +0 -73
  406. package/src/model/batched-kv.ts +0 -235
  407. package/src/model/batched-mask.ts +0 -279
  408. package/src/model/batched-quant.ts +0 -212
  409. package/src/model/batched-quantized-kv.ts +0 -144
  410. package/src/model/batched-rotating-quant.ts +0 -353
  411. package/src/model/batched-rotating-state.ts +0 -149
  412. package/src/model/batched-rotating.ts +0 -338
  413. package/src/model/batched-row-storage.ts +0 -179
  414. package/src/model/batched-ssm.ts +0 -52
  415. package/src/model/batched-turboquant-kv.ts +0 -94
  416. package/src/model/compiled-decode.ts +0 -712
  417. package/src/model/decoded-kv-donor.ts +0 -12
  418. package/src/model/delayed-quantized-kv.ts +0 -72
  419. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  420. package/src/model/delayed-turboquant-kv.ts +0 -57
  421. package/src/model/diffusion-gemma.ts +0 -1026
  422. package/src/model/factory.ts +0 -215
  423. package/src/model/fingerprint.ts +0 -45
  424. package/src/model/flash-attention.ts +0 -694
  425. package/src/model/full-prefill-padding.ts +0 -56
  426. package/src/model/full-prefill-row.ts +0 -105
  427. package/src/model/gemma4-base.ts +0 -2370
  428. package/src/model/gemma4.ts +0 -1395
  429. package/src/model/generated/gemma4-12b.ts +0 -429
  430. package/src/model/generated/gemma4-26b.ts +0 -448
  431. package/src/model/generated/gemma4-e4b.ts +0 -717
  432. package/src/model/generated/index.ts +0 -18
  433. package/src/model/glm52-atlas.ts +0 -511
  434. package/src/model/glm52-cache.ts +0 -792
  435. package/src/model/glm52-config.ts +0 -262
  436. package/src/model/glm52-container.ts +0 -305
  437. package/src/model/glm52-coupling.ts +0 -388
  438. package/src/model/glm52-dsa.ts +0 -606
  439. package/src/model/glm52-expert-layout.ts +0 -253
  440. package/src/model/glm52-layout.ts +0 -152
  441. package/src/model/glm52-memory.ts +0 -500
  442. package/src/model/glm52-mla.ts +0 -792
  443. package/src/model/glm52-moe.ts +0 -223
  444. package/src/model/glm52-pilot.ts +0 -537
  445. package/src/model/glm52-reference.ts +0 -445
  446. package/src/model/glm52-residency.ts +0 -557
  447. package/src/model/glm52-resident-weights.ts +0 -135
  448. package/src/model/glm52-streamed-experts.ts +0 -453
  449. package/src/model/glm52-streamed-metal.ts +0 -610
  450. package/src/model/glm52-weights.ts +0 -503
  451. package/src/model/glm52.ts +0 -1132
  452. package/src/model/implementation.ts +0 -69
  453. package/src/model/kv-attention-view.ts +0 -70
  454. package/src/model/minicpm5.ts +0 -376
  455. package/src/model/profile.ts +0 -468
  456. package/src/model/quantized-append-attention.ts +0 -31
  457. package/src/model/qwen-append.ts +0 -12
  458. package/src/model/qwen-conv.ts +0 -52
  459. package/src/model/qwen3-delta-state.ts +0 -74
  460. package/src/model/qwen3-delta.ts +0 -451
  461. package/src/model/qwen3-moe.ts +0 -404
  462. package/src/model/qwen3-mrope.ts +0 -250
  463. package/src/model/qwen3.ts +0 -277
  464. package/src/model/qwen3_5-checkpoint.ts +0 -164
  465. package/src/model/qwen3_5.ts +0 -881
  466. package/src/model/rotating-kv-donor.ts +0 -35
  467. package/src/model/rotating-kv-layout.ts +0 -262
  468. package/src/model/rotating-row-transaction.ts +0 -35
  469. package/src/model/speculative-rotating-kv.ts +0 -101
  470. package/src/model/ssm-prefill-padding.ts +0 -39
  471. package/src/model/support.ts +0 -110
  472. package/src/model/token-groups.ts +0 -66
  473. package/src/model/trellis-balanced-scatter.ts +0 -51
  474. package/src/model/trellis-linear.ts +0 -672
  475. package/src/model/trellis-shared-m.ts +0 -151
  476. package/src/model/trellis-shared-scatter.ts +0 -144
  477. package/src/model/trellis-splitk-prefill.ts +0 -158
  478. package/src/model/trellis-tiled-prefill.ts +0 -136
  479. package/src/model/trellis-vector-expand.ts +0 -62
  480. package/src/model/trellis-wide-prefill.ts +0 -94
  481. package/src/model/turboquant-codec.ts +0 -89
  482. package/src/model/universal/archs.ts +0 -332
  483. package/src/model/universal/dense.ts +0 -612
  484. package/src/model/universal/modules.ts +0 -170
  485. package/src/model/universal/rope.ts +0 -381
  486. package/src/model/whisper.ts +0 -435
  487. package/src/native/expert_io.c +0 -523
  488. package/src/native/frame_extract.swift +0 -140
  489. package/src/native/mic_capture.swift +0 -92
  490. package/src/native-pack.ts +0 -163
  491. package/src/pi-provider.ts +0 -53
  492. package/src/pi-session.ts +0 -81
  493. package/src/pi-terminal.ts +0 -274
  494. package/src/pi-web.ts +0 -1940
  495. package/src/preflight.ts +0 -158
  496. package/src/prompt-cache.ts +0 -682
  497. package/src/quantize/allocator.ts +0 -627
  498. package/src/quantize/atomic-output.ts +0 -38
  499. package/src/quantize/calibration.ts +0 -181
  500. package/src/quantize/config-writer.ts +0 -145
  501. package/src/quantize/index.ts +0 -84
  502. package/src/quantize/job.ts +0 -162
  503. package/src/quantize/quantizer.ts +0 -666
  504. package/src/quantize/rotate.ts +0 -603
  505. package/src/quantize/safetensors-writer.ts +0 -249
  506. package/src/quantize/sensitivity.ts +0 -216
  507. package/src/quantize/trellis.ts +0 -586
  508. package/src/quantize/weight-transform.ts +0 -292
  509. package/src/registry.ts +0 -602
  510. package/src/runtime-config.ts +0 -77
  511. package/src/safetensors.ts +0 -165
  512. package/src/sampler.ts +0 -1012
  513. package/src/serve/admin-routes.ts +0 -184
  514. package/src/serve/assets/curve-terrain.html +0 -105
  515. package/src/serve/assets/training-inference-map.html +0 -575
  516. package/src/serve/audio-routes.ts +0 -323
  517. package/src/serve/aux-routes.ts +0 -132
  518. package/src/serve/batch-scheduler.ts +0 -8
  519. package/src/serve/checkpoint-identity.ts +0 -64
  520. package/src/serve/generation-gateway.ts +0 -537
  521. package/src/serve/isolate.ts +0 -609
  522. package/src/serve/kv-budget.ts +0 -14
  523. package/src/serve/lab-routes.ts +0 -341
  524. package/src/serve/lane-registry.ts +0 -45
  525. package/src/serve/model-admin-routes.ts +0 -155
  526. package/src/serve/model-binding.ts +0 -49
  527. package/src/serve/model-host.ts +0 -511
  528. package/src/serve/parent-application.ts +0 -56
  529. package/src/serve/prompt-response-trace.ts +0 -161
  530. package/src/serve/response-lease.ts +0 -24
  531. package/src/serve/session-search.ts +0 -326
  532. package/src/serve/static-routes.ts +0 -101
  533. package/src/serve/transcription-server.ts +0 -64
  534. package/src/serve/transcription-service.ts +0 -502
  535. package/src/server.ts +0 -1282
  536. package/src/spec/assistant-rows.ts +0 -93
  537. package/src/spec/assistant-source.ts +0 -126
  538. package/src/spec/cache-identity.ts +0 -22
  539. package/src/spec/deepspec-rows.ts +0 -29
  540. package/src/spec/deepspec-source.ts +0 -145
  541. package/src/spec/dflash-source.ts +0 -149
  542. package/src/spec/drafter.ts +0 -304
  543. package/src/spec/dspark/ab-stats.ts +0 -136
  544. package/src/spec/dspark/calibration.ts +0 -112
  545. package/src/spec/dspark/data-dflash.ts +0 -156
  546. package/src/spec/dspark/data.ts +0 -201
  547. package/src/spec/dspark/deepspec-module.ts +0 -776
  548. package/src/spec/dspark/generate-dflash.ts +0 -245
  549. package/src/spec/dspark/generate.ts +0 -290
  550. package/src/spec/dspark/loader.ts +0 -23
  551. package/src/spec/dspark/loss.ts +0 -213
  552. package/src/spec/dspark/module-dflash.ts +0 -560
  553. package/src/spec/dspark/module.ts +0 -540
  554. package/src/spec/dspark/quantize-drafter.ts +0 -91
  555. package/src/spec/dspark/sample.ts +0 -112
  556. package/src/spec/generate.ts +0 -276
  557. package/src/spec/glm52-mtp-graph.ts +0 -29
  558. package/src/spec/glm52-mtp-rows.ts +0 -132
  559. package/src/spec/glm52-mtp-source.ts +0 -318
  560. package/src/spec/glm52-mtp-state.ts +0 -33
  561. package/src/spec/ngram-source.ts +0 -226
  562. package/src/spec/projected-draft-rows.ts +0 -73
  563. package/src/spec/qwen-mtp-module.ts +0 -171
  564. package/src/spec/qwen-mtp-rows.ts +0 -230
  565. package/src/spec/qwen-mtp-source.ts +0 -386
  566. package/src/spec/qwen-mtp-state.ts +0 -30
  567. package/src/spec/serve-loop.ts +0 -587
  568. package/src/spec/source.ts +0 -228
  569. package/src/spec/two-model-rows.ts +0 -62
  570. package/src/spec/two-model.ts +0 -113
  571. package/src/ssd-cache.ts +0 -431
  572. package/src/ssd-durability.ts +0 -209
  573. package/src/storage/host-buffer.ts +0 -24
  574. package/src/storage/kv-writer.ts +0 -83
  575. package/src/storage/kv-writer.worker.js +0 -264
  576. package/src/storage/retention-policy.ts +0 -37
  577. package/src/tiered-prompt-cache.ts +0 -45
  578. package/src/tokenizer.ts +0 -335
  579. package/src/tool-approvals.ts +0 -131
  580. package/src/tool-call.ts +0 -695
  581. package/src/train/dataset.ts +0 -484
  582. package/src/train/diffusion-lora.ts +0 -216
  583. package/src/train/export.ts +0 -32
  584. package/src/train/flash-cce.ts +0 -1234
  585. package/src/train/forward.ts +0 -266
  586. package/src/train/fuse.ts +0 -243
  587. package/src/train/index.ts +0 -46
  588. package/src/train/job.ts +0 -205
  589. package/src/train/lora-params.ts +0 -254
  590. package/src/train/loss.ts +0 -1591
  591. package/src/train/merge.ts +0 -195
  592. package/src/train/optimizer.ts +0 -183
  593. package/src/train/prefix-shared.ts +0 -490
  594. package/src/train/rank.ts +0 -137
  595. package/src/train/segmented.ts +0 -1828
  596. package/src/train/steel-qmm-header.ts +0 -1461
  597. package/src/train/trainer.ts +0 -1221
  598. package/src/train/watch.ts +0 -542
  599. package/src/vision/diffusion-vision.ts +0 -620
  600. package/src/vision/embedder.ts +0 -176
  601. package/src/vision/preprocess.ts +0 -247
  602. package/src/vision/prompt.ts +0 -409
  603. package/src/vision/qwen3vl-preprocess.ts +0 -409
  604. package/src/vision/qwen3vl-prompt.ts +0 -233
  605. package/src/vision/qwen3vl-tower.ts +0 -566
  606. package/src/vision/siglip.ts +0 -607
  607. package/src/vision/video-frames.ts +0 -148
  608. package/src/web/app.html +0 -2155
  609. package/src/web/app.js +0 -5863
  610. package/src/web/skills/memory/SKILL.md +0 -120
  611. package/src/web/skills/web-research/SKILL.md +0 -46
  612. package/src/web/skills.ts +0 -97
  613. package/src/web/src/adapters-panel.ts +0 -288
  614. package/src/web/src/assistant.ts +0 -451
  615. package/src/web/src/chat.ts +0 -1060
  616. package/src/web/src/composer.ts +0 -962
  617. package/src/web/src/dataset.ts +0 -132
  618. package/src/web/src/finetune.ts +0 -267
  619. package/src/web/src/hub.ts +0 -428
  620. package/src/web/src/main.ts +0 -98
  621. package/src/web/src/markdown.ts +0 -0
  622. package/src/web/src/memory-panel.ts +0 -572
  623. package/src/web/src/model-picker.ts +0 -159
  624. package/src/web/src/palette.ts +0 -346
  625. package/src/web/src/protocol.ts +0 -26
  626. package/src/web/src/quantize.ts +0 -167
  627. package/src/web/src/rag.ts +0 -274
  628. package/src/web/src/sessions.ts +0 -469
  629. package/src/web/src/shell.ts +0 -804
  630. package/src/web/src/ui-catalog.ts +0 -78
  631. package/src/web/src/voice.ts +0 -141
  632. package/src/web/vendor/README.md +0 -61
  633. package/src/web-assets.ts +0 -47
  634. package/src/web-tools.ts +0 -478
  635. package/src/weights.ts +0 -255
  636. /package/src/{serve → server}/completion-sink.ts +0 -0
  637. /package/src/{serve → server}/generated-token-history.ts +0 -0
  638. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  639. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  640. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,304 +0,0 @@
1
- // Native autograd via mlx-c value_and_grad over a JS loss closure.
2
- //
3
- // Encapsulates the exact FFI lifecycle proven in lab/spikes/phase-train-vag.ts:
4
- // JS loss closure (JSCallback) → mlx_closure_new_func_payload →
5
- // mlx_value_and_grad → mlx_closure_value_and_grad_apply → read grads.
6
- //
7
- // House rules honored:
8
- // - Out-params read via bun:ffi `read.u64` (never slot[0] — DFG stale-read).
9
- // - The JS closure NEVER throws across the FFI boundary (try/catch → return 1);
10
- // the captured error is re-thrown on the JS side after apply() fails.
11
- // - All native handles (closure, value_and_grad closure, JSCallback) are held
12
- // alive on the instance and freed in dispose().
13
-
14
- import { JSCallback, ptr, read } from "bun:ffi";
15
- import { C, takeMlxError } from "./ffi";
16
- import { MlxArray } from "./array";
17
-
18
- type CallbackHandle = Pick<JSCallback, "ptr" | "close">;
19
- type NativeCall<F extends (...args: any[]) => any> =
20
- (...args: Parameters<F>) => ReturnType<F>;
21
-
22
- /** Constructor-only dependency seam for deterministic native failure tests. */
23
- export interface ValueAndGradConstructorHooks {
24
- callback?: (
25
- callback: ConstructorParameters<typeof JSCallback>[0],
26
- definition: ConstructorParameters<typeof JSCallback>[1],
27
- ) => CallbackHandle;
28
- closureNew?: NativeCall<typeof C.mlx_closure_new_func_payload>;
29
- transformedNew?: NativeCall<typeof C.mlx_closure_value_and_grad_new>;
30
- transform?: NativeCall<typeof C.mlx_value_and_grad>;
31
- transformedFree?: NativeCall<typeof C.mlx_closure_value_and_grad_free>;
32
- closureFree?: NativeCall<typeof C.mlx_closure_free>;
33
- }
34
-
35
- /** A reusable value-and-grad over a JS-built loss graph.
36
- *
37
- * `loss(primals)` receives the input arrays in argument order and must
38
- * return a single SCALAR MlxArray (the loss). The graph it builds is
39
- * differentiated w.r.t. the inputs named in `argIdx`. `apply(primals)`
40
- * returns the loss value and exactly `argIdx.length` gradients (one per
41
- * differentiated input, in `argIdx` order).
42
- *
43
- * The closure must not throw; if the user `loss` throws, the error is
44
- * captured and surfaced from `apply()`. The MlxArrays handed to `loss`
45
- * are owned by mlx — do NOT dispose them; the returned loss IS disposed
46
- * of by mlx's graph. */
47
- export class ValueAndGrad {
48
- readonly #cb: CallbackHandle;
49
- readonly #closure: bigint;
50
- readonly #vag: bigint;
51
- readonly #argIdx: Int32Array;
52
- readonly #freeClosure: NativeCall<typeof C.mlx_closure_free>;
53
- readonly #freeVag: NativeCall<typeof C.mlx_closure_value_and_grad_free>;
54
- #closureError: string | null = null;
55
- #disposed = false;
56
-
57
- constructor(
58
- loss: (primals: MlxArray[]) => MlxArray,
59
- argIdx: number[],
60
- hooks: ValueAndGradConstructorHooks = {},
61
- ) {
62
- if (argIdx.length === 0) throw new Error("ValueAndGrad: argIdx must be non-empty");
63
- this.#argIdx = new Int32Array(argIdx);
64
- const makeCallback = hooks.callback ?? ((callback, definition) => new JSCallback(callback, definition));
65
- const closureNew = hooks.closureNew ?? C.mlx_closure_new_func_payload;
66
- const transformedNew = hooks.transformedNew ?? C.mlx_closure_value_and_grad_new;
67
- const transform = hooks.transform ?? C.mlx_value_and_grad;
68
- this.#freeClosure = hooks.closureFree ?? C.mlx_closure_free;
69
- this.#freeVag = hooks.transformedFree ?? C.mlx_closure_value_and_grad_free;
70
-
71
- const cb = makeCallback(
72
- (outPtr: number, inVec: bigint, _payload: number): number => {
73
- try {
74
- // Read the primals out of the input vector_array. mlx_vector_array_get
75
- // returns a fresh (ref-counted) handle, so disposing the wrapper
76
- // afterward is correct — it drops our reference, not mlx's graph
77
- // reference (proven in lab/spikes/phase-train-vag.ts).
78
- const n = Number(C.mlx_vector_array_size(inVec));
79
- const primals: MlxArray[] = [];
80
- for (let i = 0; i < n; i++) {
81
- const slot = new BigUint64Array([C.mlx_array_new()]);
82
- const sp = ptr(slot);
83
- if (C.mlx_vector_array_get(sp, inVec, BigInt(i)) !== 0)
84
- throw new Error(`vector_array_get(${i}) failed`);
85
- primals.push(new MlxArray(read.u64(sp, 0)));
86
- }
87
- const out = loss(primals);
88
- // Populate *out with the single scalar loss. set_data copies the
89
- // handle into the output vector (mlx retains its own reference), so
90
- // disposing the loss wrapper afterward drops only our reference.
91
- const handles = new BigUint64Array([out.handle]);
92
- if (C.mlx_vector_array_set_data(outPtr as never, ptr(handles), 1n) !== 0)
93
- throw new Error("vector_array_set_data failed");
94
- for (const p of primals) p.dispose();
95
- out.dispose();
96
- return 0;
97
- } catch (e) {
98
- this.#closureError = e instanceof Error ? e.message : String(e);
99
- return 1;
100
- }
101
- },
102
- { args: ["ptr", "u64", "ptr"], returns: "i32" },
103
- );
104
-
105
- let closure: bigint | null = null;
106
- let vagSlot: BigUint64Array | null = null;
107
- try {
108
- closure = closureNew(cb.ptr as never, null, null);
109
- vagSlot = new BigUint64Array([transformedNew()]);
110
- if (transform(ptr(vagSlot), closure, ptr(this.#argIdx), BigInt(this.#argIdx.length)) !== 0)
111
- throw new Error("mlx_value_and_grad failed");
112
- this.#cb = cb;
113
- this.#closure = closure;
114
- this.#vag = read.u64(ptr(vagSlot), 0);
115
- } catch (e) {
116
- // mlx-c out-params are initialized live handles. On failure the slot
117
- // still owns whichever handle it contains and must be freed explicitly.
118
- if (vagSlot) this.#freeVag(read.u64(ptr(vagSlot), 0));
119
- if (closure !== null) this.#freeClosure(closure);
120
- cb.close();
121
- throw e;
122
- }
123
- }
124
-
125
- /** Run the loss + backward on `primals` (in argument order). Returns the
126
- * scalar loss and one gradient per differentiated input. Caller owns all
127
- * returned arrays (dispose them). */
128
- apply(primals: MlxArray[]): { value: MlxArray; grads: MlxArray[] } {
129
- if (this.#disposed) throw new Error("ValueAndGrad used after dispose");
130
- this.#closureError = null;
131
-
132
- const handles = new BigUint64Array(primals.map((p) => p.handle));
133
- const inVec = C.mlx_vector_array_new_data(ptr(handles), BigInt(primals.length));
134
-
135
- const valueSlot = new BigUint64Array([C.mlx_vector_array_new()]);
136
- const gradsSlot = new BigUint64Array([C.mlx_vector_array_new()]);
137
- const st = C.mlx_closure_value_and_grad_apply(ptr(valueSlot), ptr(gradsSlot), this.#vag, inVec);
138
- const valueVec = read.u64(ptr(valueSlot), 0);
139
- const gradsVec = read.u64(ptr(gradsSlot), 0);
140
- if (st !== 0) {
141
- C.mlx_vector_array_free(valueVec);
142
- C.mlx_vector_array_free(gradsVec);
143
- C.mlx_vector_array_free(inVec);
144
- // Surface whichever error fired: a JS throw inside the loss closure
145
- // (#closureError) or MLX's own C-level error (takeMlxError) — e.g. a
146
- // missing vjp for an op in the forward graph. Discarding the latter
147
- // turned an "unsupported gradient" into an opaque failure.
148
- const mlxErr = takeMlxError();
149
- const detail = this.#closureError ?? mlxErr ?? "";
150
- throw new Error(`value_and_grad_apply failed${detail ? `: ${detail}` : ""}`);
151
- }
152
-
153
- // value vector has exactly one entry (the scalar loss).
154
- const value = vecGet(valueVec, 0);
155
-
156
- const nGrads = Number(C.mlx_vector_array_size(gradsVec));
157
- if (nGrads !== this.#argIdx.length) {
158
- value.dispose();
159
- C.mlx_vector_array_free(valueVec);
160
- C.mlx_vector_array_free(gradsVec);
161
- C.mlx_vector_array_free(inVec);
162
- throw new Error(`expected ${this.#argIdx.length} grads, got ${nGrads}`);
163
- }
164
- const grads: MlxArray[] = [];
165
- for (let i = 0; i < nGrads; i++) grads.push(vecGet(gradsVec, i));
166
-
167
- C.mlx_vector_array_free(valueVec);
168
- C.mlx_vector_array_free(gradsVec);
169
- C.mlx_vector_array_free(inVec);
170
- return { value, grads };
171
- }
172
-
173
- dispose(): void {
174
- if (this.#disposed) return;
175
- this.#disposed = true;
176
- this.#freeVag(this.#vag);
177
- this.#freeClosure(this.#closure);
178
- this.#cb.close();
179
- }
180
-
181
- [Symbol.dispose](): void {
182
- this.dispose();
183
- }
184
- }
185
-
186
- /** Pull array `i` out of a vector_array into an owned MlxArray wrapper. */
187
- function vecGet(vec: bigint, i: number): MlxArray {
188
- const slot = new BigUint64Array([C.mlx_array_new()]);
189
- const sp = ptr(slot);
190
- if (C.mlx_vector_array_get(sp, vec, BigInt(i)) !== 0)
191
- throw new Error(`vector_array_get(${i}) failed`);
192
- return new MlxArray(read.u64(sp, 0));
193
- }
194
-
195
- /** Reverse-mode AD via mlx_vjp: given a function `fn(primals) -> outputs` and a
196
- * cotangent per output, returns the cotangent w.r.t. EVERY primal. This is the
197
- * natural primitive for segmented backward (segment forward + dh -> [dh_in,
198
- * ...dLoRA]) — no surrogate scalar and no value_and_grad closure. Unlike
199
- * ValueAndGrad it returns a vjp for ALL primals (not a selected argnum subset).
200
- *
201
- * `fn` must build its output graph from the input arrays in argument order and
202
- * return them (most often a single array). It must not throw; a throw is
203
- * captured and surfaced from apply(). The MlxArrays handed to `fn` are owned by
204
- * mlx — do NOT dispose them. Lifecycle/house-rules mirror ValueAndGrad. */
205
- export class Vjp {
206
- readonly #cb: JSCallback;
207
- readonly #closure: bigint;
208
- readonly #nOut: number;
209
- #closureError: string | null = null;
210
- #disposed = false;
211
-
212
- /** @param nOut number of arrays `fn` returns (length of the cotangent list). */
213
- constructor(fn: (primals: MlxArray[]) => MlxArray[], nOut = 1) {
214
- this.#nOut = nOut;
215
- this.#cb = new JSCallback(
216
- (outPtr: number, inVec: bigint, _payload: number): number => {
217
- try {
218
- const n = Number(C.mlx_vector_array_size(inVec));
219
- const primals: MlxArray[] = [];
220
- for (let i = 0; i < n; i++) {
221
- const slot = new BigUint64Array([C.mlx_array_new()]);
222
- const sp = ptr(slot);
223
- if (C.mlx_vector_array_get(sp, inVec, BigInt(i)) !== 0)
224
- throw new Error(`vector_array_get(${i}) failed`);
225
- primals.push(new MlxArray(read.u64(sp, 0)));
226
- }
227
- const outs = fn(primals);
228
- const handles = new BigUint64Array(outs.map((o) => o.handle));
229
- if (C.mlx_vector_array_set_data(outPtr as never, ptr(handles), BigInt(outs.length)) !== 0)
230
- throw new Error("vector_array_set_data failed");
231
- for (const p of primals) p.dispose();
232
- for (const o of outs) o.dispose();
233
- return 0;
234
- } catch (e) {
235
- this.#closureError = e instanceof Error ? e.message : String(e);
236
- return 1;
237
- }
238
- },
239
- { args: ["ptr", "u64", "ptr"], returns: "i32" },
240
- );
241
- this.#closure = C.mlx_closure_new_func_payload(this.#cb.ptr as never, null, null);
242
- }
243
-
244
- /** Run the vjp on `primals` with `cotangents` (one per output of `fn`).
245
- * Returns the outputs (fn(primals)) and one cotangent per primal (in primal
246
- * order). Caller owns all returned arrays. */
247
- apply(primals: MlxArray[], cotangents: MlxArray[]): { outputs: MlxArray[]; vjps: MlxArray[] } {
248
- if (this.#disposed) throw new Error("Vjp used after dispose");
249
- if (cotangents.length !== this.#nOut)
250
- throw new Error(`Vjp: expected ${this.#nOut} cotangents, got ${cotangents.length}`);
251
- this.#closureError = null;
252
-
253
- const pHandles = new BigUint64Array(primals.map((p) => p.handle));
254
- const cHandles = new BigUint64Array(cotangents.map((c) => c.handle));
255
- const inVec = C.mlx_vector_array_new_data(ptr(pHandles), BigInt(primals.length));
256
- const cotVec = C.mlx_vector_array_new_data(ptr(cHandles), BigInt(cotangents.length));
257
-
258
- const outSlot = new BigUint64Array([C.mlx_vector_array_new()]);
259
- const vjpSlot = new BigUint64Array([C.mlx_vector_array_new()]);
260
- const st = C.mlx_vjp(ptr(outSlot), ptr(vjpSlot), this.#closure, inVec, cotVec);
261
- const outVec = read.u64(ptr(outSlot), 0);
262
- const vjpVec = read.u64(ptr(vjpSlot), 0);
263
- if (st !== 0) {
264
- C.mlx_vector_array_free(outVec);
265
- C.mlx_vector_array_free(vjpVec);
266
- C.mlx_vector_array_free(inVec);
267
- C.mlx_vector_array_free(cotVec);
268
- const mlxErr = takeMlxError();
269
- const detail = this.#closureError ?? mlxErr ?? "";
270
- throw new Error(`mlx_vjp failed${detail ? `: ${detail}` : ""}`);
271
- }
272
-
273
- const nVjp = Number(C.mlx_vector_array_size(vjpVec));
274
- if (nVjp !== primals.length) {
275
- C.mlx_vector_array_free(outVec);
276
- C.mlx_vector_array_free(vjpVec);
277
- C.mlx_vector_array_free(inVec);
278
- C.mlx_vector_array_free(cotVec);
279
- throw new Error(`Vjp: expected ${primals.length} vjps, got ${nVjp}`);
280
- }
281
- const nOut = Number(C.mlx_vector_array_size(outVec));
282
- const outputs: MlxArray[] = [];
283
- for (let i = 0; i < nOut; i++) outputs.push(vecGet(outVec, i));
284
- const vjps: MlxArray[] = [];
285
- for (let i = 0; i < nVjp; i++) vjps.push(vecGet(vjpVec, i));
286
-
287
- C.mlx_vector_array_free(outVec);
288
- C.mlx_vector_array_free(vjpVec);
289
- C.mlx_vector_array_free(inVec);
290
- C.mlx_vector_array_free(cotVec);
291
- return { outputs, vjps };
292
- }
293
-
294
- dispose(): void {
295
- if (this.#disposed) return;
296
- this.#disposed = true;
297
- C.mlx_closure_free(this.#closure);
298
- this.#cb.close();
299
- }
300
-
301
- [Symbol.dispose](): void {
302
- this.dispose();
303
- }
304
- }
@@ -1,149 +0,0 @@
1
- // Gradient checkpointing (rematerialization) via mlx-c mlx_checkpoint.
2
- //
3
- // Wraps a JS function (MlxArray[]) -> MlxArray[] into a closure whose forward
4
- // activations are dropped and RECOMPUTED during the enclosing value_and_grad
5
- // backward. Used to bound training memory on long sequences: instead of
6
- // retaining every transformer layer's activations, each checkpointed unit is
7
- // recomputed one at a time in the backward pass.
8
- //
9
- // Same FFI lifecycle as ValueAndGrad (src/mlx/autograd.ts): a JSCallback over
10
- // the user fn → mlx_closure_new_func_payload → mlx_checkpoint → applied with
11
- // mlx_closure_apply. The closure must not throw across the FFI boundary; a JS
12
- // throw is captured and re-surfaced from apply().
13
-
14
- import { JSCallback, ptr, read } from "bun:ffi";
15
- import { C, takeMlxError } from "./ffi";
16
- import { MlxArray } from "./array";
17
-
18
- type CallbackHandle = Pick<JSCallback, "ptr" | "close">;
19
- type NativeCall<F extends (...args: any[]) => any> =
20
- (...args: Parameters<F>) => ReturnType<F>;
21
-
22
- /** Constructor-only dependency seam for deterministic native failure tests. */
23
- export interface CheckpointConstructorHooks {
24
- callback?: (
25
- callback: ConstructorParameters<typeof JSCallback>[0],
26
- definition: ConstructorParameters<typeof JSCallback>[1],
27
- ) => CallbackHandle;
28
- closureNew?: NativeCall<typeof C.mlx_closure_new_func_payload>;
29
- transformedNew?: NativeCall<typeof C.mlx_closure_new>;
30
- transform?: NativeCall<typeof C.mlx_checkpoint>;
31
- closureFree?: NativeCall<typeof C.mlx_closure_free>;
32
- }
33
-
34
- /** A reusable checkpointed wrapper over a JS-built subgraph.
35
- *
36
- * `fn(inputs)` receives the input arrays (in order) and returns one or more
37
- * output arrays. Applying the checkpoint builds the same forward graph, but
38
- * marks it for recomputation: the enclosing backward recomputes `fn` rather
39
- * than reading retained activations. Gradients flow to the explicit inputs
40
- * AND to any outer-trace leaves captured by `fn` (e.g. swapped-in LoRA
41
- * primals), exactly as if `fn` had been inlined. */
42
- export class Checkpoint {
43
- readonly #cb: CallbackHandle;
44
- readonly #closure: bigint;
45
- readonly #ckpt: bigint;
46
- readonly #freeClosure: NativeCall<typeof C.mlx_closure_free>;
47
- #closureError: string | null = null;
48
- #disposed = false;
49
-
50
- constructor(
51
- fn: (inputs: MlxArray[]) => MlxArray[],
52
- hooks: CheckpointConstructorHooks = {},
53
- ) {
54
- const makeCallback = hooks.callback ?? ((callback, definition) => new JSCallback(callback, definition));
55
- const closureNew = hooks.closureNew ?? C.mlx_closure_new_func_payload;
56
- const transformedNew = hooks.transformedNew ?? C.mlx_closure_new;
57
- const transform = hooks.transform ?? C.mlx_checkpoint;
58
- this.#freeClosure = hooks.closureFree ?? C.mlx_closure_free;
59
-
60
- const cb = makeCallback(
61
- (outPtr: number, inVec: bigint, _payload: number): number => {
62
- try {
63
- const n = Number(C.mlx_vector_array_size(inVec));
64
- const inputs: MlxArray[] = [];
65
- for (let i = 0; i < n; i++) {
66
- const slot = new BigUint64Array([C.mlx_array_new()]);
67
- const sp = ptr(slot);
68
- if (C.mlx_vector_array_get(sp, inVec, BigInt(i)) !== 0)
69
- throw new Error(`vector_array_get(${i}) failed`);
70
- inputs.push(new MlxArray(read.u64(sp, 0)));
71
- }
72
- const outs = fn(inputs);
73
- const handles = new BigUint64Array(outs.map((o) => o.handle));
74
- if (C.mlx_vector_array_set_data(outPtr as never, ptr(handles), BigInt(outs.length)) !== 0)
75
- throw new Error("vector_array_set_data failed");
76
- for (const p of inputs) p.dispose();
77
- for (const o of outs) o.dispose();
78
- return 0;
79
- } catch (e) {
80
- this.#closureError = e instanceof Error ? e.message : String(e);
81
- return 1;
82
- }
83
- },
84
- { args: ["ptr", "u64", "ptr"], returns: "i32" },
85
- );
86
-
87
- let closure: bigint | null = null;
88
- let slot: BigUint64Array | null = null;
89
- try {
90
- closure = closureNew(cb.ptr as never, null, null);
91
- slot = new BigUint64Array([transformedNew()]);
92
- if (transform(ptr(slot), closure) !== 0)
93
- throw new Error(`mlx_checkpoint failed: ${takeMlxError() ?? ""}`);
94
- this.#cb = cb;
95
- this.#closure = closure;
96
- this.#ckpt = read.u64(ptr(slot), 0);
97
- } catch (e) {
98
- if (slot) this.#freeClosure(read.u64(ptr(slot), 0));
99
- if (closure !== null) this.#freeClosure(closure);
100
- cb.close();
101
- throw e;
102
- }
103
- }
104
-
105
- /** Apply the checkpointed fn. Returns its outputs as owned MlxArrays. */
106
- apply(inputs: MlxArray[]): MlxArray[] {
107
- if (this.#disposed) throw new Error("Checkpoint used after dispose");
108
- this.#closureError = null;
109
-
110
- const handles = new BigUint64Array(inputs.map((p) => p.handle));
111
- const inVec = C.mlx_vector_array_new_data(ptr(handles), BigInt(inputs.length));
112
- const outSlot = new BigUint64Array([C.mlx_vector_array_new()]);
113
- const st = C.mlx_closure_apply(ptr(outSlot), this.#ckpt, inVec);
114
- const outVec = read.u64(ptr(outSlot), 0);
115
- if (st !== 0) {
116
- C.mlx_vector_array_free(outVec);
117
- C.mlx_vector_array_free(inVec);
118
- const detail = this.#closureError ?? takeMlxError() ?? "";
119
- throw new Error(`checkpoint apply failed${detail ? `: ${detail}` : ""}`);
120
- }
121
- const nOut = Number(C.mlx_vector_array_size(outVec));
122
- const outs: MlxArray[] = [];
123
- for (let i = 0; i < nOut; i++) {
124
- const slot = new BigUint64Array([C.mlx_array_new()]);
125
- const sp = ptr(slot);
126
- if (C.mlx_vector_array_get(sp, outVec, BigInt(i)) !== 0) {
127
- C.mlx_vector_array_free(outVec);
128
- C.mlx_vector_array_free(inVec);
129
- throw new Error(`checkpoint output get(${i}) failed`);
130
- }
131
- outs.push(new MlxArray(read.u64(sp, 0)));
132
- }
133
- C.mlx_vector_array_free(outVec);
134
- C.mlx_vector_array_free(inVec);
135
- return outs;
136
- }
137
-
138
- dispose(): void {
139
- if (this.#disposed) return;
140
- this.#disposed = true;
141
- this.#freeClosure(this.#ckpt);
142
- this.#freeClosure(this.#closure);
143
- this.#cb.close();
144
- }
145
-
146
- [Symbol.dispose](): void {
147
- this.dispose();
148
- }
149
- }
@@ -1,168 +0,0 @@
1
- // mx.compile from Bun: wrap a JS graph-builder in an mlx_closure, hand it
2
- // to mlx_compile, and replay the compiled graph in C++ thereafter.
3
- //
4
- // The trace function runs EXACTLY ONCE per (ndim, dtype) input signature
5
- // (shapeless=true): mlx invokes our JSCallback with tracer arrays during
6
- // the first mlx_closure_apply, we build the graph with the ordinary ops
7
- // layer, and every later apply replays it natively — zero per-op FFI.
8
- //
9
- // Contract for trace functions:
10
- // - receive positional MlxArray inputs, return positional MlxArray outputs
11
- // - must NOT dispose the inputs (the trampoline owns them) and must NOT
12
- // eval anything (tracer arrays have no data — eval inside a trace is an
13
- // mlx error by design)
14
- // - arrays created inside the trace (weights, scalarLike constants) are
15
- // captured as graph constants — correct for weights, which never change
16
- // - with shapeless=true the graph must stay valid as dim SIZES change
17
- // (ndim/dtype changes retrace automatically): no reshape/slice constants
18
- // derived from a varying dimension
19
-
20
- import { JSCallback, ptr, read } from "bun:ffi";
21
- import { C, type MlxHandle, takeMlxError } from "./ffi";
22
- import { MlxArray } from "./array";
23
-
24
- export type TraceFn = (inputs: MlxArray[]) => MlxArray[];
25
-
26
- const traceRegistry = new Map<number, { fn: TraceFn; count: number; shapeless: boolean }>();
27
- let nextTraceId = 1;
28
- let shapelessTracing = false;
29
-
30
- /** Fixed-shape custom kernels must fall back while a shapeless graph traces. */
31
- export function isShapelessTracing(): boolean {
32
- return shapelessTracing;
33
- }
34
- /** Error thrown by a trace fn, carried across the C boundary (the
35
- * trampoline must not throw into mlx; it returns non-zero instead). */
36
- let traceError: unknown = null;
37
-
38
- /** Count of trace invocations, exposed for tests (a working shapeless
39
- * compile traces once and replays thereafter). */
40
- export let traceCalls = 0;
41
-
42
- // int (*fun)(mlx_vector_array* res, const mlx_vector_array args, void* payload)
43
- // mlx_vector_array is the usual one-pointer struct, by value → u64.
44
- // Tracing happens synchronously inside mlx_closure_apply on the calling
45
- // thread, so a non-threadsafe JSCallback is safe (same argument as the
46
- // error handler in ffi.ts).
47
- const trampoline = new JSCallback(
48
- (resPtr: number, argsVec: bigint, payload: number): number => {
49
- const previousShapeless = shapelessTracing;
50
- try {
51
- const entry = traceRegistry.get(payload);
52
- if (!entry) throw new Error(`compile trampoline: unknown trace id ${payload}`);
53
- shapelessTracing ||= entry.shapeless;
54
- const fn = entry.fn;
55
- entry.count++;
56
- traceCalls++;
57
- const n = Number(C.mlx_vector_array_size(argsVec));
58
- const inputs: MlxArray[] = [];
59
- const slot = new BigUint64Array(1);
60
- const slotPtr = ptr(slot);
61
- for (let i = 0; i < n; i++) {
62
- slot[0] = C.mlx_array_new();
63
- if (C.mlx_vector_array_get(slotPtr, argsVec, BigInt(i)) !== 0)
64
- throw new Error(`vector_array_get(${i}) failed: ${takeMlxError() ?? ""}`);
65
- inputs.push(new MlxArray(read.u64(slotPtr, 0)));
66
- }
67
- const outputs = fn(inputs);
68
- const handles = new BigUint64Array(outputs.map((o) => o.handle));
69
- if (C.mlx_vector_array_set_data(resPtr, ptr(handles), BigInt(outputs.length)) !== 0)
70
- throw new Error(`vector_array_set_data failed: ${takeMlxError() ?? ""}`);
71
- for (const o of outputs) o.dispose();
72
- for (const a of inputs) a.dispose();
73
- return 0;
74
- } catch (e) {
75
- traceError = e;
76
- return 1;
77
- } finally {
78
- shapelessTracing = previousShapeless;
79
- }
80
- },
81
- { args: ["ptr", "u64", "ptr"], returns: "i32" },
82
- );
83
-
84
- /** MLX_COMPILE_MODE_* (compile.h). NO_FUSE keeps the host-side replay win
85
- * while disabling kernel fusion — the escape hatch if fusion ever breaks
86
- * the bit-exact gate. */
87
- export function setCompileMode(mode: "disabled" | "no_simplify" | "no_fuse" | "enabled"): void {
88
- const v = { disabled: 0, no_simplify: 1, no_fuse: 2, enabled: 3 }[mode];
89
- if (C.mlx_set_compile_mode(v) !== 0)
90
- throw new Error(`mlx_set_compile_mode failed: ${takeMlxError() ?? ""}`);
91
- }
92
-
93
- export class CompiledFunction {
94
- #compiled: MlxHandle;
95
- #traceId: number;
96
- #disposed = false;
97
-
98
- /** Times this function's trace ran. A shapeless decode closure must
99
- * trace exactly once — its input ndims/dtypes never change — so any
100
- * count > 1 is a silent retrace (per-step JS graph builds sneaking
101
- * back in) and gets flagged by compiled-decode. */
102
- get traceCount(): number {
103
- return traceRegistry.get(this.#traceId)?.count ?? 0;
104
- }
105
-
106
- constructor(fn: TraceFn, shapeless = true) {
107
- this.#traceId = nextTraceId++;
108
- traceRegistry.set(this.#traceId, { fn, count: 0, shapeless });
109
- // payload is the trace id smuggled through the void* (never deref'd);
110
- // dtor is null — nothing to free on the C side.
111
- const raw = C.mlx_closure_new_func_payload(trampoline.ptr, this.#traceId as never, null);
112
- const slot = new BigUint64Array([C.mlx_closure_new()]);
113
- const slotPtr = ptr(slot);
114
- const status = C.mlx_compile(slotPtr, raw, shapeless);
115
- const compiled = read.u64(slotPtr, 0);
116
- C.mlx_closure_free(raw);
117
- if (status !== 0) {
118
- C.mlx_closure_free(compiled);
119
- traceRegistry.delete(this.#traceId);
120
- throw new Error(`mlx_compile failed: ${takeMlxError() ?? ""}`);
121
- }
122
- this.#compiled = compiled;
123
- }
124
-
125
- /** Run the compiled graph. First call (per ndim/dtype signature) traces
126
- * through the JS fn; later calls replay natively. Returned arrays are
127
- * owned by the caller. */
128
- apply(inputs: MlxArray[]): MlxArray[] {
129
- if (this.#disposed) throw new Error("CompiledFunction used after dispose");
130
- const handles = new BigUint64Array(inputs.length);
131
- for (let i = 0; i < inputs.length; i++) handles[i] = inputs[i]!.handle;
132
- const inVec = C.mlx_vector_array_new_data(ptr(handles), BigInt(inputs.length));
133
- const slot = new BigUint64Array([C.mlx_vector_array_new()]);
134
- const slotPtr = ptr(slot);
135
- const status = C.mlx_closure_apply(slotPtr, this.#compiled, inVec);
136
- const outVec = read.u64(slotPtr, 0);
137
- C.mlx_vector_array_free(inVec);
138
- if (status !== 0) {
139
- C.mlx_vector_array_free(outVec);
140
- const e = traceError;
141
- traceError = null;
142
- throw e instanceof Error
143
- ? e
144
- : new Error(`compiled apply failed: ${takeMlxError() ?? "(no mlx message)"}`);
145
- }
146
- const n = Number(C.mlx_vector_array_size(outVec));
147
- const outputs: MlxArray[] = [];
148
- const aSlot = new BigUint64Array(1);
149
- const aPtr = ptr(aSlot);
150
- for (let i = 0; i < n; i++) {
151
- aSlot[0] = C.mlx_array_new();
152
- if (C.mlx_vector_array_get(aPtr, outVec, BigInt(i)) !== 0) {
153
- C.mlx_vector_array_free(outVec);
154
- throw new Error(`vector_array_get(out ${i}) failed: ${takeMlxError() ?? ""}`);
155
- }
156
- outputs.push(new MlxArray(read.u64(aPtr, 0)));
157
- }
158
- C.mlx_vector_array_free(outVec);
159
- return outputs;
160
- }
161
-
162
- dispose(): void {
163
- if (this.#disposed) return;
164
- this.#disposed = true;
165
- C.mlx_closure_free(this.#compiled);
166
- traceRegistry.delete(this.#traceId);
167
- }
168
- }