mlx-bun 0.4.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 (601) hide show
  1. package/README.md +1453 -88
  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 +10 -8
  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 +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  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 +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  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/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,674 +0,0 @@
1
- # Library API
2
-
3
- The HTTP server is one consumer of a library-first API. Everything it
4
- does — generation, sampling, KV schemes, LoRA, vision, caching, memory
5
- admission — is importable directly into a Bun process. Published as
6
- `mlx-bun` on npm; `bunx mlx-bun` runs the CLI, `import … from "mlx-bun"`
7
- (or `./src/index` in a clone) is the programmatic surface.
8
-
9
- This page is the canonical description of that surface. The source of
10
- truth is the package export map: `src/index.ts` preserves the native compatibility API,
11
- `src/library.ts` supplies the CPU-safe `mlx-bun/engine` entry, and
12
- `src/client.ts` supplies `mlx-bun/client`. These exports are the semver contract;
13
- everything else under `src/` is internal and may change without notice.
14
- Every export is documented below, grouped the way `src/index.ts` groups
15
- them.
16
-
17
- One rule everywhere: **one generation at a time per process** (one GPU).
18
- The server serializes through a queue (or, under `--batch N`, its
19
- continuous scheduler — a server scheduling mechanism, not a library
20
- surface); direct library callers must do the same.
21
-
22
- ## Export map
23
-
24
- | Group | Values | Types |
25
- |---|---|---|
26
- | [Native runtime](#native-runtime) | `ensureNativeRuntime`, `nativeRuntimeDir` | — |
27
- | [Config and weights](#config-and-weights) | `loadModelConfig`, `Weights` | — |
28
- | [Model profiles](#model-profiles) | `resolveModelProfile`, `configFingerprint`, `externalArtifactFingerprint`, `BUILTIN_ARTIFACT_PROFILES`, `ENGINE_CAPABILITIES` | `ArtifactModelProfile`, `EngineCapability`, `FidelityTarget`, `FidelityTier`, `GenerationLoop`, `ModelArtifactIdentity`, `ModelExecutionComposition`, `ModelGraph`, `ModelLoader`, `ModelProfile`, `ModelSpecialization`, `ResolveModelProfileOptions`, `ResolvedModelProfile` |
29
- | [Opening a model](#opening-a-model) | `openModel`, `createModel`, `openGlm52RuntimeModel` | `RuntimeModel`, `ModelOpenOptions`, `Glm52RuntimeOpenOptions` |
30
- | [Engine-owned implementations](#engine-owned-implementations) | `ModelImplementationRegistry` | `ModelImplementation`, `ModelImplementationProvider`, `ModelServingBinding`, `ModelPromptBuilder`, `BuiltPrompt`, `ServedModelInfo`, `ServingContext`, `ModelHostSource`, `AdapterService`, `MlxGatewayBinding`, `MlxBatchGroup`, `MlxSerialServices`, `MlxSerialBinding` |
31
- | [Concrete model classes](#concrete-model-classes) | `Gemma4Model`, `MiniCPM5Model`, `Qwen3Model` | — |
32
- | [Tokenizer](#tokenizer) | `loadTokenizer` | — |
33
- | [Chat templates](#chat-templates) | `ChatTemplate` | — |
34
- | [Generation](#generatemodel-prompttokens-options--generation) | `generate` | — |
35
- | [Text embeddings](#text-embeddings) | `embedOne`, `embedMany`, `isEmbeddingModel`, `withInstruction` | `EmbedResult` |
36
- | [Model discovery](#model-discovery-registry) | `Registry` | — |
37
- | [Downloads](#downloads) | `downloadModel` | — |
38
- | [Memory fit](#memory-fit) | `fit`, `skuMatrix`, `thisMachine`, `chooseAutoModel`, `recommendedRepoId`, `largestRecommendedRepoId`, `DEFAULT_REPO_ID`, `COEXIST_FRACTION` | — |
39
- | [Serving](#serving) | `loadContext`, `createServer`, `shutdownServer` | `LoadContextOptions`, `ServerContext`, `ServerOptions` |
40
-
41
- Types that are *not* exported (`GenerateOptions`, `GenerateStats`,
42
- `GeneratedToken`, `Generation`, `LoadedTokenizer`, `ChatMessage`,
43
- `RenderOptions`, `ModelConfig`, `MachineSpec`, `FitReport`, `ModelRecord`,
44
- `DownloadOptions`, `Cache`) are reachable through inference — e.g.
45
- `Parameters<typeof generate>[2]`, `Awaited<ReturnType<typeof loadTokenizer>>`.
46
-
47
- ## Quick start
48
-
49
- ```ts
50
- import { initializeMlx } from "mlx-bun/engine";
51
-
52
- // Bootstrap finishes before the native API is imported.
53
- const { openModel, loadTokenizer, ChatTemplate, generate } = await initializeMlx();
54
- const dir = "/path/to/hf-snapshot"; // mlx-bun ls prints these
55
- const model = await openModel(dir);
56
- const tok = await loadTokenizer(dir);
57
- const template = await ChatTemplate.load(dir);
58
-
59
- // The template emits <bos> as text and the tokenizer post-processor prepends
60
- // one too; trim the duplicate exactly the way the server does.
61
- const ids = tok.encode(template.render([{ role: "user", content: "hi" }]));
62
- const promptIds = ids[0] === ids[1] && ids[0] === tok.bosTokenId ? ids.slice(1) : ids;
63
-
64
- const gen = generate(model, promptIds, { maxTokens: 256, temperature: 0 });
65
- const out: number[] = [];
66
- for await (const t of gen) out.push(t.token); // t: { token, index }
67
- console.log(tok.decode(out, true));
68
- console.log(gen.stats); // set once iteration ends
69
- ```
70
-
71
- Ordinary safetensors loading is lazy (mmap + mlx native loader). GLM-5.2
72
- first runs its header-only exact process equation, then opens the bounded
73
- Colibri resident/expert tiers; impossible plans fail before either tier is
74
- committed.
75
-
76
- ## Clients and isolated hosts
77
-
78
- `mlx-bun/client` and `mlx-bun/engine` can be imported without native MLX.
79
- `createCompletionClient` accepts a `/v1` URL and optionally a borrowed host
80
- implementing `forward(Request): Promise<Response>`. It sends JSON completions,
81
- forces `stream: false`, passes cancellation through `signal`, and never retries
82
- a POST. Full SSE streaming remains available through the host's `forward` port
83
- and the existing HTTP API. A supplied host belongs to the caller.
84
-
85
- ```ts
86
- import { createCompletionClient, openIsolatedHost } from "mlx-bun/engine";
87
-
88
- const host = await openIsolatedHost("/path/to/hf-snapshot");
89
- try {
90
- const client = createCompletionClient({ baseUrl: "http://engine/v1", host });
91
- const result = await client.complete({
92
- body: { messages: [{ role: "user", content: "Hello" }], max_tokens: 64 },
93
- });
94
- console.log(result.choices[0]?.message?.content);
95
- } finally {
96
- await host.close();
97
- }
98
- ```
99
-
100
- `openIsolatedHost(model, { arguments?, readyTimeoutMs? })` starts the existing
101
- CLI on a private Unix socket and resolves after health readiness. `close()`
102
- waits for the worker to exit. `createDirectHost(handler, shutdown?)` adapts an
103
- in-process HTTP handler to the same contract; its shutdown callback owns any
104
- native resources and response streams. `createInferenceEngine` and
105
- `CancellationSource` expose the portable token-session API for registered methods.
106
- The original root exports remain compatible and require an installed native runtime.
107
-
108
- Sessions support queued `stream`, bounded `collect`, and direct `callback`
109
- delivery. Callback control supplies `onTokens(ids, logprobs?)`; execution awaits
110
- it, and returning `false` requests a normal stop. The callback owns any retained
111
- output storage. Methods must honor that stop and finish cleanup before returning
112
- metrics. HTTP uses this mode to preserve immediate stop/tool parsing without a
113
- second queue. Method IDs and private state belong to the implementation.
114
-
115
- ## Engine-owned implementations
116
-
117
- `ModelImplementationRegistry<Source, Model>` validates a resolved artifact profile
118
- and selects registered engine code. Its `select()` checks the named implementation,
119
- graph, loader and construction loop; missing or incompatible code fails before
120
- construction. `with()` returns a new immutable registry. Model files supply data,
121
- not executable registrations.
122
-
123
- `createModel(weights, config, profile, implementations)` and
124
- `openModel(directory, { profiles, implementations })` preserve the supplied
125
- registry's return interface. Resident implementations can therefore return their
126
- own graph/method binding without inheriting a concrete model class. The caller
127
- owns already-open weights; a successfully opened implementation must retain the
128
- weights it uses. Resident overrides cannot replace the Colibri streamed loader.
129
-
130
- For a complete implementation, pass a
131
- `ModelImplementationProvider<ModelHostSource, Promise<ServerContext<Model>>>`
132
- to `loadContext(directory, modelId, { profiles, implementations })`. Selection
133
- precedes either default weight loader. The selected code owns loading, including
134
- partial-allocation cleanup on failure, and returns the model metadata and a
135
- `serving` binding. `ModelServingBinding` supplies planning, serial methods, batch
136
- groups, prompt/media preparation, restore, diagnostics and optional embeddings.
137
- One implementation may expose multiple methods with its own selection policy.
138
- The host owns loaded resources; the server borrows the context.
139
-
140
- The executable replacement example is
141
- [`tests/serve/model-replacement.test.ts`](../../tests/serve/model-replacement.test.ts).
142
- It selects one synthetic exact artifact registration and exercises two custom
143
- methods through the public loader and HTTP API, without a concrete model class.
144
-
145
- ## Native runtime
146
-
147
- Library consumers bypass the CLI's first-run step, so call
148
- `ensureNativeRuntime()` once before constructing a model on a machine that
149
- may not have the MLX native runtime yet. It downloads the sha256-verified
150
- native pack (MLX plus the direct-Colibri expert-I/O helper) to
151
- `~/Library/Caches/mlx-bun/` and is a no-op when the runtime is already
152
- present (beside the executable, already cached, `MLX_BUN_LIBMLXC`, or
153
- installed via homebrew). It resolves to the runtime directory.
154
- `nativeRuntimeDir()` returns the resolved directory, or `null` on a fresh
155
- machine.
156
-
157
- ```ts
158
- import { ensureNativeRuntime, nativeRuntimeDir } from "mlx-bun";
159
-
160
- if (nativeRuntimeDir() === null) console.log("first run: fetching the native pack");
161
- const runtime = await ensureNativeRuntime({
162
- onProgress: (received, total) => console.log(`${received}/${total}`),
163
- });
164
- console.log(runtime);
165
- ```
166
-
167
- `ensureNativeRuntime(opts?)` also accepts `url`, `sha256`, `sizeBytes`, and
168
- `destDir` overrides for pinned/offline installs; production callers pass
169
- nothing.
170
-
171
- ## Config and weights
172
-
173
- `loadModelConfig(modelDir)` parses `config.json` (and, for GLM-5.2,
174
- `generation_config.json`) into the normalized `ModelConfig` every other
175
- entry point consumes: `modelType`, `text` (layer/head geometry, rope,
176
- window, MoE), `quantization`, `kvQuant` (from `kv_config.json`),
177
- `eosTokenIds`, `hasVisionSidecar`, and the `raw` object.
178
-
179
- `Weights.open(modelDir)` opens every safetensors shard through the mlx
180
- native loader on the CPU stream: header-parsed, mmap-backed, no bytes
181
- materialize until a tensor is touched. It is the input to `createModel` and
182
- to the concrete model constructors. Ownership is explicit: `dispose()`
183
- frees every native map and cached tensor; `releaseShard(file)` frees one
184
- shard's materialized tensors (it transparently re-opens on the next
185
- `tensor()` that needs it — the seam whole-model transforms use at 27B
186
- scale). `tensor(name)`, `has(name)`, `info(name)`, `fileOf(name)`, and
187
- `tensorNames` are the read side.
188
-
189
- ```ts
190
- import { loadModelConfig, Weights } from "mlx-bun";
191
-
192
- const config = await loadModelConfig(dir);
193
- const weights = await Weights.open(dir);
194
- console.log(config.modelType, config.text.numHiddenLayers, weights.tensorNames.length);
195
- weights.dispose();
196
- ```
197
-
198
- ## Model profiles
199
-
200
- `openModel()`, `createModel()`, and `loadContext()` resolve a declared
201
- model profile before they open weights. A profile declares construction
202
- only — loader, model graph, generation loop, specialization — and carries
203
- its fidelity contract (`l1` bit-exact vs mlx-lm, `l2` bit-exact vs
204
- mlx-optiq, `l3` measured). Exact artifact profiles outrank family
205
- profiles; dedicated/generated graphs outrank the universal fallback.
206
- Profile selection never rewrites generation options: `kvConfig`,
207
- TurboQuant KV, adapters, grammar, sampling, or an explicitly configured
208
- draft method stay authoritative.
209
-
210
- `resolveModelProfile(config, options?)` returns a `ResolvedModelProfile`:
211
- `profile` (the declaration), `artifact` (`fingerprint` —
212
- `hf:<org>/<repo>@<revision>` when the path is an immutable Hugging Face
213
- snapshot, else `null` — plus `configFingerprint`), and `exactArtifact`.
214
- `configFingerprint(config)` is the stable hash over every config field that
215
- changes the decode graph structure plus the kv_config layout.
216
- `externalArtifactFingerprint(modelDir)` is the HF-snapshot identity rule
217
- on its own. `BUILTIN_ARTIFACT_PROFILES` lists the exact declarations this
218
- repository backs with parity or measured evidence; `ENGINE_CAPABILITIES`
219
- is the frozen capability vocabulary profiles declare against.
220
-
221
- ```ts
222
- import { loadModelConfig, resolveModelProfile } from "mlx-bun";
223
-
224
- const config = await loadModelConfig(dir);
225
- const resolved = resolveModelProfile(config);
226
- console.log(resolved.profile.id);
227
- console.log(resolved.artifact.fingerprint); // hf:<org>/<repo>@<revision> or null
228
- console.log(resolved.profile.fidelity); // { tier, oracle, claim }
229
- console.log(resolved.profile.execution); // { loader, graph, loop, specialization }
230
- ```
231
-
232
- For a local artifact that is not stored under an immutable HF snapshot
233
- path, an application supplies its own provenance fingerprint and exact
234
- declaration. The resolver checks the declared config fingerprint and the
235
- required engine capabilities; an exact match that fails either check
236
- refuses instead of taking the family or generic fallback.
237
-
238
- ```ts
239
- import {
240
- configFingerprint,
241
- loadModelConfig,
242
- resolveModelProfile,
243
- type ArtifactModelProfile,
244
- } from "mlx-bun";
245
-
246
- const config = await loadModelConfig(dir);
247
- const mine: ArtifactModelProfile = {
248
- id: "acme/gemma4-e4b-custom@2026-08",
249
- artifactFingerprint: "acme:gemma4-e4b-custom@sha256-…",
250
- configFingerprint: configFingerprint(config),
251
- fidelity: { tier: "l1", oracle: "mlx-lm", claim: "bit-exact" },
252
- // Must cover everything the execution composition implies.
253
- requiredCapabilities: ["safetensors", "autoregressive", "gemma4-graph"],
254
- execution: {
255
- loader: "safetensors", graph: "gemma4",
256
- loop: "autoregressive", specialization: "dedicated",
257
- },
258
- };
259
- const resolved = resolveModelProfile(config, {
260
- artifactFingerprint: mine.artifactFingerprint,
261
- artifactProfiles: [mine],
262
- });
263
- console.log(resolved.exactArtifact); // true
264
- ```
265
-
266
- ## Opening a model
267
-
268
- `openModel(modelDir, options?)` is the artifact-aware constructor and the
269
- preferred entry point: it loads the config, resolves the profile, and
270
- either opens safetensors weights and builds the graph the profile names, or
271
- — when the profile's loader is `colibri` — routes to
272
- `openGlm52RuntimeModel`. It resolves to a `RuntimeModel`, the union every
273
- other API accepts (`Gemma4Model | MiniCPM5Model | Qwen35Model | Qwen3Model
274
- | Qwen3MoeModel | DiffusionGemmaModel | Glm52Model | UniversalDenseModel`).
275
- `options` is `Glm52RuntimeOpenOptions`; models other than the direct
276
- Colibri GLM-5.2 artifact ignore it.
277
-
278
- `createModel(weights, config, resolved?)` is the direct-construction form
279
- for callers that already hold `Weights` and a `ModelConfig` (and
280
- optionally a previously resolved profile — it re-validates the profile
281
- against the config). It throws for the GLM-5.2 graph, which has no
282
- ordinary safetensors index and must go through `openModel` /
283
- `openGlm52RuntimeModel`.
284
-
285
- `openGlm52RuntimeModel(modelDir, options?)` opens the direct Colibri
286
- artifact through the bounded expert runtime and resolves to `{ model, plan }`
287
- — the model plus the exact header-derived memory plan (`Glm52MemoryPlan`)
288
- that was checked before any resident tensor or expert slab was touched.
289
- Options: `memoryBudgetBytes` (whole-process ceiling; default = the smaller
290
- of the validated preset and physical RAM), `contextTokens`,
291
- `maxGenerationTokens`, `batchSize`, `enableMtp` (default on),
292
- `mtpDraftTokens`, `libraryPath` (expert-I/O dylib override), and
293
- `machineBytes` (test seam).
294
-
295
- ```ts
296
- import { createModel, loadModelConfig, openModel, resolveModelProfile, Weights } from "mlx-bun";
297
-
298
- // Preferred.
299
- const model = await openModel(dir);
300
-
301
- // Equivalent for safetensors artifacts, with each step visible.
302
- const config = await loadModelConfig(dir);
303
- const profile = resolveModelProfile(config);
304
- const same = createModel(await Weights.open(dir), config, profile);
305
-
306
- // The direct Colibri GLM-5.2 artifact takes its load-only resource controls here.
307
- const glm = await openModel(glmDir, {
308
- contextTokens: 4096, maxGenerationTokens: 256, enableMtp: false,
309
- });
310
- ```
311
-
312
- Direct `generate()` on a GLM-5.2 model supports the full
313
- sampling/grammar/logprobs contract but does not itself mount a drafter;
314
- native MTP is a serving-context feature (`loadContext`).
315
-
316
- ## Concrete model classes
317
-
318
- `Gemma4Model`, `MiniCPM5Model`, and `Qwen3Model` are exported today for
319
- callers that need the concrete type (e.g. `model.layers`,
320
- `model.loraTargets()`, `Qwen3Model.embedPooled`). Each constructs as
321
- `new X(weights, config)` from `Weights` + `ModelConfig` and exposes
322
- `makeCache(): Cache[]`, `forward(tokens, cache)`, and `config`.
323
-
324
- > **Prefer `openModel` / `createModel`.** These class exports may be removed
325
- > from the public surface: the factory is the supported way to obtain a
326
- > `RuntimeModel`, and the other graphs (Qwen3.5, Qwen3-MoE, DiffusionGemma,
327
- > GLM-5.2, the universal dense graph) are already reachable only through
328
- > it. Narrow with `instanceof` when a concrete type is genuinely needed
329
- > (`isEmbeddingModel` below is the shipped example).
330
-
331
- ```ts
332
- import { Gemma4Model, loadModelConfig, Weights } from "mlx-bun";
333
-
334
- const config = await loadModelConfig(dir);
335
- const gemma = new Gemma4Model(await Weights.open(dir), config); // same object createModel returns
336
- console.log(gemma.layers.length, gemma.windowSize);
337
- ```
338
-
339
- ## Tokenizer
340
-
341
- `loadTokenizer(modelDir)` loads `tokenizer.json` + `tokenizer_config.json`
342
- through a pure-JS tokenizer (no native code; embeds in `bun build
343
- --compile`) with round-trip parity against the Python oracle. The result
344
- exposes `encode(text, addSpecialTokens = true)`, `decode(ids,
345
- skipSpecialTokens = false)`, `idToToken(id)` (the undecoded vocab piece,
346
- for logprobs), `bosTokenId`, `eosTokenId`, and the streaming-detokenizer
347
- parity flags (`trimsLeadingSpace`, `bareSpaceTokenId`) the server consults.
348
- `encode` memoizes byte-identical inputs and splices incrementally on
349
- shared prefixes.
350
-
351
- ```ts
352
- import { loadTokenizer } from "mlx-bun";
353
-
354
- const tok = await loadTokenizer(dir);
355
- const ids = tok.encode("The quick brown fox", false); // no BOS
356
- console.log(ids, tok.decode(ids), tok.idToToken(ids[0]!));
357
- ```
358
-
359
- ## Chat templates
360
-
361
- `ChatTemplate.load(modelDir, { disableThinking? })` renders the model's own
362
- `chat_template` (from `tokenizer_config.json` or `chat_template.jinja`)
363
- via a pure-JS Jinja engine, so the template cannot rot when the model
364
- updates it; GLM-5.2's pinned template ships as a built-in renderer.
365
- `render(messages, options?)` takes OpenAI-shaped `ChatMessage`s (`role`,
366
- `content`, `tool_calls`, `tool_call_id`, `name`, `reasoning`) and
367
- `RenderOptions`: `addGenerationPrompt` (default true), `tools`,
368
- `enableThinking`, `reasoningEffort` (`"xhigh" | "medium" | "low"`, only for
369
- templates that read it — see `readsReasoningEffort`), and
370
- `preserveThinking`. Capability flags on the instance: `supportsThinking`,
371
- `thinkingFormat` (`"think-tag" | "gemma-channel" | null`),
372
- `readsReasoningEffort`, `readsPreserveThinking`.
373
-
374
- ```ts
375
- import { ChatTemplate } from "mlx-bun";
376
-
377
- const template = await ChatTemplate.load(dir);
378
- const rendered = template.render(
379
- [
380
- { role: "system", content: "Answer briefly." },
381
- { role: "user", content: "What is 2+2?" },
382
- ],
383
- { enableThinking: template.supportsThinking ? false : undefined },
384
- );
385
- ```
386
-
387
- ## generate(model, promptTokens, options) → Generation
388
-
389
- `generate` is the streaming port of mlx-lm's `generate_step`: chunked
390
- prefill with per-chunk cache evaluation, pipelined decode via async eval,
391
- on-device sampling (only the chosen token id crosses to JS). It returns a
392
- `Generation`: an `AsyncIterable<GeneratedToken>` (`{ token, index,
393
- logprobs? }`) with a `stats` property (`GenerateStats`, available after
394
- iteration completes — also after an early `break`, which cleanly cancels
395
- the in-flight step). Adapters, the wired-memory scope, and GLM usage
396
- flushing are all scoped to the iteration.
397
-
398
- `GenerateOptions` (all optional):
399
-
400
- | option | default | notes |
401
- |---|---|---|
402
- | `maxTokens` | 512 | |
403
- | `temperature` / `topP` / `topK` / `minP` / `minTokensToKeep` / `seed` | greedy when temperature 0 | on-device sampling; seeded per (seed, step); reference chain order top-p → min-p → XTC → top-k |
404
- | `xtcProbability` / `xtcThreshold` / `xtcSpecialTokens` | off | XTC ("exclude top choices") |
405
- | `hlg` / `curve` | off | tone-curve and log-prob transfer-curve samplers (replace the flat temperature slope) |
406
- | `logitBias` | none | additive per-token-id bias, applied before penalties |
407
- | `repetitionPenalty` / `repetitionContextSize` | off / 20 | |
408
- | `presencePenalty` / `frequencyPenalty` (+ `…ContextSize`) | off | OpenAI-style, may be negative |
409
- | `eosTokenIds` | from config | includes the tool-handoff token |
410
- | `prefillChunkSize` | 2048 | matches mlx-lm |
411
- | `signal` | none | `AbortSignal`; cancels before allocation, between AR prefill chunks, and between decode steps. An active native operation completes before the next cancellation check. |
412
- | `onPrefillDone` / `snapshotAt` | — | fired once at the stable cache boundary before further KV is written (the server's prompt-cache snapshot hook) |
413
- | `cache` | fresh | pre-warmed `Cache[]`; `cache[0].offset` tokens are treated as already prefilled. Caller keeps ownership |
414
- | `kvBits` / `kvGroupSize` / `quantizedKvStart` | off / 64 / 5000 | uniform KV quantization (4 or 8), incl. rotating caches |
415
- | `kvConfig` | off | per-layer mixed precision from `kv_config.json` (`config.kvQuant`); overrides `kvBits`, start 0 — optiq serve semantics |
416
- | `turboQuant` | off | TurboQuant KV scheme (docs/design/turboquant.md), a rotation-based alternative to uniform `kvBits`; mutually exclusive with `kvBits`/`kvConfig` |
417
- | `pagedKv` | off | `{ blockSize? }` — OPTIONAL paged KV cache (docs/design/kv-cache.md); v1 scope is serial batch=1 Gemma4-family bf16, mutually exclusive with `kvBits`/`kvConfig`/`turboQuant`/draft/compiled decode |
418
- | `adapters` | none | mounted LoRA adapter ids, applied for exactly this generation |
419
- | `promptEmbeddings` / `imageMask` / `multimodalMask` / `visionPixels` | — | vision and audio paths (see `src/vision/`, docs/design/generic-model-support.md); caller keeps ownership |
420
- | `logprobs` / `topLogprobs` | off | per-token logprob capture (mlx_lm.server parity): the emitted token's log-probability and the top-k (id, logprob) pairs — full-vocab log-softmax after logits processors, before the sampler |
421
- | `grammar` | off | a compiled `GrammarController` (`src/grammar.ts`) for structured output — masks invalid tokens to `-inf` each step (L2-class, oMLX oracle) |
422
-
423
- `GenerateStats`: `promptTokens`, `cachedTokens`, `generatedTokens`,
424
- `prefillTps` / `prefillMs`, `decodeTps` / `decodeMs`, `cacheTokens` (the
425
- exact token sequence whose KV is in the cache — feed it to
426
- `PromptCache.put`). Timing semantics match mlx-lm: the prompt clock runs
427
- until the first token arrives (the prefill→decode boundary is prompt time),
428
- the decode clock from there. An optional `spec` field carries
429
- speculative-decoding telemetry (serve `--draft-model` path only):
430
- `drafted`, `accepted`, `targetCalls`, and per-draft-position
431
- `draftedByPos` / `acceptedByPos` counts.
432
-
433
- ```ts
434
- import { generate } from "mlx-bun";
435
-
436
- const gen = generate(model, promptIds, {
437
- maxTokens: 256,
438
- temperature: 0.7, topP: 0.95, seed: 42, // reproducible sampling
439
- kvBits: 8, quantizedKvStart: 4096, // optional: quantized KV past 4k
440
- logprobs: true, topLogprobs: 5,
441
- });
442
- for await (const t of gen) {
443
- process.stdout.write(tok.decode([t.token], true));
444
- if (t.index > 64) break; // early break cancels cleanly
445
- }
446
- console.log(gen.stats?.decodeTps, gen.stats?.cacheTokens.length);
447
- ```
448
-
449
- ## Text embeddings
450
-
451
- Qwen3-Embedding models run on the plain-Qwen3 backbone, the only graph
452
- exposing `embedPooled` (last-token hidden → L2-norm). `isEmbeddingModel`
453
- narrows a `RuntimeModel` to `Qwen3Model`; `embedOne(model, tok, text,
454
- instruction?)` and `embedMany(model, tok, texts, instruction?)` encode
455
- without BOS, append the `<|endoftext|>` pooling token, run one forward per
456
- text (the runtime is single-sequence), and return `EmbedResult`s:
457
- `vector` (`Float32Array`, L2-normalized, so dot product = cosine) and
458
- `tokens`. `withInstruction(text, instruction?)` applies Qwen3-Embedding's
459
- query format (`Instruct: …\nQuery:…`); documents embed raw, only queries
460
- take an instruction. These are the same vectors the CLI (`mlx-bun embed`)
461
- and `/v1/embeddings` produce — bit-exact vs mlx-lm.
462
-
463
- ```ts
464
- import { embedMany, embedOne, isEmbeddingModel, loadTokenizer, openModel } from "mlx-bun";
465
-
466
- const model = await openModel(embedDir); // a Qwen3-Embedding snapshot
467
- if (!isEmbeddingModel(model)) throw new Error("not an embedding model");
468
- const tok = await loadTokenizer(embedDir);
469
-
470
- const query = embedOne(model, tok, "cats", "Given a query, retrieve relevant passages");
471
- const docs = embedMany(model, tok, ["the cat sat", "a kitten rested", "tax law"]);
472
- const cosine = (a: Float32Array, b: Float32Array) =>
473
- a.reduce((s, x, i) => s + x * b[i]!, 0);
474
- console.log(docs.map((d) => cosine(query.vector, d.vector)));
475
- ```
476
-
477
- ## Model discovery (Registry)
478
-
479
- `Registry` is the model index behind `mlx-bun ls` / `scan` / `/v1/models`: a
480
- `bun:sqlite` cache (default `~/.cache/mlx-bun/registry.sqlite`, or
481
- `":memory:"`) of every snapshot in the Hugging Face hub cache (`HF_HUB_CACHE`
482
- > `HF_HOME/hub` > `~/.cache/huggingface/hub`). `scan(hubDir?)` re-walks the
483
- cache and returns the record count; `list(filter?)` returns `ModelRecord`s
484
- (`path`, `repoId`, `modelType`, `sizeBytes`, `expertsBytes`, `sidecarBytes`,
485
- quantization fields, vision/audio/kv-config/tool-template capability flags,
486
- `license`) filtered by `vision`, `maxBytes`, or a substring `query`;
487
- `listCanonical(filter?)` collapses to one record per repo (the `refs/main`
488
- snapshot); `resolve(query)` returns exactly one model or throws listing the
489
- candidates; `close()` closes the database.
490
-
491
- ```ts
492
- import { Registry } from "mlx-bun";
493
-
494
- const reg = new Registry();
495
- await reg.scan();
496
- for (const m of reg.listCanonical({ vision: true })) console.log(m.repoId, m.sizeBytes);
497
- const m = reg.resolve("e4b"); // unique-match query
498
- console.log(m.path);
499
- reg.close();
500
- ```
501
-
502
- ## Downloads
503
-
504
- `downloadModel(repoId, opts?)` fetches a Hugging Face repo into the
505
- standard hub cache layout (blobs + snapshots + refs), resumable and
506
- sha-verified through the same machinery the native pack uses, with a disk
507
- preflight that credits verified blobs and partial prefixes before the first
508
- payload. It resolves to the snapshot directory — the `dir` every other
509
- entry point takes. `DownloadOptions`: `revision` (default `main`),
510
- `cacheDir`, `endpoint`, `token` (default: the local HF login), and
511
- `onProgress(file, received, total)`. Multi-GB downloads are the caller's
512
- decision; nothing here starts one implicitly.
513
-
514
- ```ts
515
- import { DEFAULT_REPO_ID, downloadModel } from "mlx-bun";
516
-
517
- const dir = await downloadModel(DEFAULT_REPO_ID, {
518
- onProgress: (file, received, total) => console.log(file, received, total),
519
- });
520
- console.log(dir); // …/snapshots/<sha>
521
- ```
522
-
523
- ## Memory fit
524
-
525
- `fit` is the deterministic memory contract behind `mlx-bun fit` and server
526
- admission: weights (bytes from the registry) + KV at the requested context
527
- (config geometry; sliding-window layers saturate at the window; quantized
528
- schemes billed via `kvScheme`) + prefill transient (chunk × calibrated
529
- bytes/token) against the machine's usable envelope (RAM × wired fraction,
530
- or an explicit `usableBytes` budget). MoE-aware: decode reads active
531
- experts only. Signature: `fit(config, weightsBytes, ctx, machine =
532
- thisMachine(), chunk = 2048, expertsBytes = 0, usableBytes?, kvScheme?)` →
533
- `FitReport` (`fits`, `maxSafeContext`, `predictedDecodeTps`, `weightsBytes`,
534
- `kvBytes`, `transientBytes`, `totalBytes`, `usableBytes`, …).
535
-
536
- `thisMachine(bandwidthGBs?)` detects the chip and RAM; `skuMatrix(config,
537
- weightsBytes, ctx, expertsBytes?, kvScheme?)` runs `fit` across the
538
- representative Apple Silicon SKU table. `DEFAULT_REPO_ID` is the default
539
- model everywhere (e4b); `recommendedRepoId()` returns it;
540
- `largestRecommendedRepoId(ramBytes?)` is the per-RAM-tier "biggest Gemma"
541
- for explicit opt-in. `chooseAutoModel(candidates, defaultRepoId,
542
- fitsFullBudget, fitsCoexistBudget)` is the pure auto-pick rule (default if
543
- it fits → largest that leaves `COEXIST_FRACTION` headroom → largest that
544
- fits at all); the caller supplies the fit predicates.
545
-
546
- ```ts
547
- import {
548
- chooseAutoModel, COEXIST_FRACTION, DEFAULT_REPO_ID, fit, loadModelConfig,
549
- Registry, skuMatrix, thisMachine,
550
- } from "mlx-bun";
551
-
552
- const reg = new Registry();
553
- await reg.scan();
554
- const m = reg.resolve("12B");
555
- const config = await loadModelConfig(m.path);
556
-
557
- const report = fit(config, m.sizeBytes, 8192, thisMachine(), 2048, m.expertsBytes);
558
- console.log(report.fits, report.maxSafeContext, report.predictedDecodeTps);
559
- console.table(skuMatrix(config, m.sizeBytes, 8192, m.expertsBytes));
560
-
561
- const machine = thisMachine();
562
- const pick = chooseAutoModel(
563
- reg.listCanonical(),
564
- DEFAULT_REPO_ID,
565
- (c) => c.sizeBytes <= machine.ramBytes * 0.75,
566
- (c) => c.sizeBytes <= machine.ramBytes * COEXIST_FRACTION,
567
- );
568
- console.log(pick?.repoId);
569
- ```
570
-
571
- ## Serving
572
-
573
- `loadContext(modelDir, modelId?, opts?)` builds the `ServerContext` the
574
- server runs on: the `model` (via the same profile resolution as
575
- `openModel`), `profile`, `tokenizer`, `template`, `modelId`, lazily-loaded
576
- vision/audio towers, the `adapters` manager, the model's `kvConfig`,
577
- `genDefaults` from `generation_config.json`, an optional speculative
578
- `draft` provider, and `glmMemoryPlan` for the Colibri runtime. It refuses
579
- models that cannot serve any context within the budget (pre-GPU, mmap-only
580
- check). `LoadContextOptions`: `memoryBudgetBytes`, `glm`
581
- (`Glm52RuntimeOpenOptions`, ignored by other models), and the speculative
582
- decoding trio `draftModelDir` / `numDraftTokens` / `draftKind`
583
- (`"dspark" | "deepspec" | "assistant" | "two-model" | "ngram" | "mtp"`)
584
- plus `ngramMax` / `ngramMin`. `profiles` and `implementations` supply the
585
- engine-owned construction registry described above.
586
-
587
- `createServer(ctx, port = 0, serverOptions?)` returns Bun's `Server`
588
- exposing OpenAI chat completions, Anthropic `/v1/messages`, OpenAI
589
- Responses, embeddings, adapters, and `/stats` —
590
- [server-api.md](./server-api.md). `ServerOptions` mirrors the CLI flags in
591
- [server-config.md](./server-config.md): `promptCacheBytes` (byte-capped
592
- LRU, never count-capped), `kvBudgetBytes`, `kvQuant` (`"off" | "config" |
593
- bits`; unset = bf16), `turboQuant`, `pagedKv`, `memoryBudgetBytes`
594
- (admission control — the only OOM defense), `batch`, `hostname`,
595
- `unixSocket`, `owner`, `defaultThinking`, `defaultTemperature` /
596
- `defaultTopP` / `defaultTopK` / `defaultMaxTokens`, `defaultAdapter`, `hlg`,
597
- and the SSD tier (`ssdCacheDir`, `ssdCacheMaxBytes`, `ssdDemoteIdleSec`,
598
- `ssdCacheVerify`).
599
-
600
- `shutdownServer(server, timeoutMs = 120_000)` stops accepting requests, waits for
601
- active work and managed jobs, flushes durable caches, and closes session/runtime
602
- services. It returns `{ stopped, timedOut, durability }`. A timeout reports
603
- unfinished shutdown; it does not dispose a borrowed model context.
604
-
605
- ```ts
606
- import { createServer, loadContext } from "mlx-bun";
607
-
608
- const ctx = await loadContext(dir, "my-model", { memoryBudgetBytes: 12e9 });
609
- const server = createServer(ctx, 8080, {
610
- promptCacheBytes: 2e9,
611
- kvQuant: "config", // apply the model's kv_config.json
612
- memoryBudgetBytes: 12e9,
613
- owner: "embedded",
614
- });
615
- console.log(server.port);
616
- // … later
617
- server.stop();
618
- ```
619
-
620
- For GLM-5.2, pass its load-only resource controls under `glm`:
621
-
622
- ```ts
623
- const glmCtx = await loadContext(glmDir, "glm-5.2", {
624
- glm: {
625
- contextTokens: 4096,
626
- maxGenerationTokens: 128,
627
- batchSize: 8,
628
- enableMtp: true, // default; native MTP routes requests serial+spec
629
- },
630
- });
631
- ```
632
-
633
- ## Internal pieces referenced above (not exported)
634
-
635
- `PromptCache` (`src/prompt-cache.ts`, the byte-capped in-process prefix
636
- cache), `AdapterManager` (`src/lora.ts`, LoRA hot-swap — reachable as
637
- `ctx.adapters` on a `ServerContext`), and `saveKvCache` / `loadKvCache`
638
- (`src/kv-store.ts`, cross-process KV persistence) are deliberately **not**
639
- re-exported from `"mlx-bun"`: they are implementation-level and may change
640
- without notice. In a clone they import from their internal paths; the
641
- `adapters` and `cache` options of `generate` are the public seams they plug
642
- into.
643
-
644
- ```ts
645
- import { PromptCache } from "./src/prompt-cache";
646
- const cache = new PromptCache(2e9); // BYTE-capped LRU
647
- const hit = cache.take(promptIds, /*namespace*/ ""); // longest common prefix, trimmed
648
- const caches = hit?.caches ?? model.makeCache();
649
- const gen = generate(model, promptIds, { cache: caches });
650
- for await (const t of gen) { /* … */ }
651
- cache.put(gen.stats!.cacheTokens, caches, ""); // hand ownership back
652
- ```
653
-
654
- Namespace entries by adapter spec when LoRA is in play (KV computed under
655
- one adapter must not seed another's prefill).
656
-
657
- ## Memory & disposal rules
658
-
659
- - `MlxArray` wrappers have explicit `.dispose()` with a
660
- FinalizationRegistry backstop — dispose what you create in hot paths.
661
- - Caches you own (from `model.makeCache()` outside the prompt cache):
662
- dispose each via `c.dispose()` when done. `Weights` you opened yourself:
663
- `weights.dispose()`.
664
- - GPU OOM is **uncatchable** (mlx throws from a Metal completion
665
- handler → process death). Use `fit`/admission before generating, not
666
- try/catch around it.
667
- - Never read a typed array that native code wrote in a hot path; use
668
- the `read.*` helpers (bun#32054 — see the Phase 4 findings in the PLAN
669
- archive: `git show 3199c75:PLAN-archive.md`).
670
-
671
- When embedding the high-level library in your own compiled application, pass
672
- `command: ["/path/to/mlx-bun"]` to `openIsolatedHost`. Source/package consumers
673
- use the installed CLI source automatically; compiled callers supply the worker
674
- executable explicitly because their own executable is not the mlx-bun CLI.