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,181 +0,0 @@
1
- // Calibration data loading for sensitivity analysis.
2
- //
3
- // Port of optiq/calibration/datasets.py `load_llm_calibration` /
4
- // `_load_optiq_calibration`: load a multi-domain JSONL mix, tokenize, build one
5
- // long token stream, and chunk it into fixed-length sequences. The
6
- // `calibrationFn` contract is the TS analogue of OptIQ's
7
- // `list[(args_tuple, kwargs_dict)]`: here, just a list of `number[]` token-id
8
- // prompts (each a (1, seq_len) row the model forwards).
9
- //
10
- // Two deviations from the Python, both forced by our pure-JS tokenizer surface
11
- // (src/tokenizer.ts exposes plain `encode` only, no `apply_chat_template`):
12
- // - `messages` samples use the role-prefixed dumb-concatenation fallback —
13
- // exactly OptIQ's `no chat template` branch.
14
- // - `add_special_tokens=False` is the OptIQ encode flag; our `encode` already
15
- // omits special tokens for raw substrings.
16
- //
17
- // Source mix: the bundled `optiq.jsonl` if locatable on disk (the oracle venv's
18
- // optiq/calibration/data/optiq.jsonl), else a small built-in fallback corpus so
19
- // the path works with no external data.
20
-
21
- import { existsSync } from "node:fs";
22
- import type { LoadedTokenizer } from "../tokenizer";
23
- import { runtimeValue } from "../runtime-config";
24
-
25
- /** One JSONL calibration sample (subset of the OptIQ schema we can consume). */
26
- interface CalibrationSample {
27
- domain?: string;
28
- text?: string;
29
- messages?: Array<{ role: string; content: string }>;
30
- tools?: unknown;
31
- }
32
-
33
- /** Candidate on-disk locations for the bundled optiq.jsonl mix. */
34
- function bundledMixCandidates(): string[] {
35
- const home = process.env.HOME ?? "";
36
- const rel = "lib/python3.14/site-packages/optiq/calibration/data/optiq.jsonl";
37
- return [
38
- runtimeValue("MLX_BUN_CALIBRATION_JSONL"),
39
- `${home}/Code/mlx-lm-example/.venv/${rel}`,
40
- `${home}/Code/mlx-lm/.venv/${rel}`,
41
- ].filter((p): p is string => !!p);
42
- }
43
-
44
- /** A tiny built-in fallback corpus (used only when no JSONL mix is found).
45
- * Multi-domain prose so groups have meaningful activation diversity. */
46
- const FALLBACK_CORPUS: string[] = [
47
- "The history of computing stretches back to mechanical calculators and the abacus. Charles Babbage designed the Analytical Engine, a general-purpose mechanical computer, in the nineteenth century. Ada Lovelace wrote what is often considered the first algorithm intended for such a machine. The theoretical foundations were later laid by Alan Turing, whose model of computation defined the limits of what machines can compute.",
48
- "In physics, the conservation of energy states that the total energy of an isolated system remains constant over time. Energy can neither be created nor destroyed; rather, it transforms from one form to another. Kinetic energy becomes potential energy as a ball rises, and back again as it falls. Thermodynamics extends these ideas to heat, work, and entropy in large systems.",
49
- "Functions in programming are reusable blocks of code that perform a specific task. They take inputs, called arguments, and may return a value. Pure functions have no side effects and always return the same output for the same input, which makes them easier to test and reason about. Recursion is a technique where a function calls itself to solve smaller subproblems.",
50
- "The water cycle describes the continuous movement of water on, above, and below the surface of the Earth. Water evaporates from oceans and lakes, condenses into clouds, and precipitates as rain or snow. Rivers carry water back to the sea, and groundwater slowly percolates through soil and rock. Plants release water vapor through transpiration, contributing to atmospheric moisture.",
51
- "Economic markets coordinate the production and exchange of goods through prices. When demand for a product rises and supply stays fixed, prices tend to increase, signaling producers to make more. Competition drives firms to lower costs and innovate. Externalities, such as pollution, are costs not reflected in market prices and often require regulation to address.",
52
- "A neural network is composed of layers of interconnected nodes, each applying a weighted sum followed by a nonlinear activation. During training, the network adjusts its weights to minimize a loss function via gradient descent. Backpropagation efficiently computes gradients by applying the chain rule layer by layer. Deeper networks can represent more complex functions but are harder to train.",
53
- ];
54
-
55
- /**
56
- * Build a calibration callable from a tokenizer.
57
- *
58
- * @returns a zero-arg function producing `number[][]` — N token-id rows, each
59
- * of length `seqLen`, ready to forward through a model.
60
- */
61
- export function loadLlmCalibration(
62
- tokenizer: LoadedTokenizer,
63
- opts: {
64
- nSamples?: number;
65
- seqLen?: number;
66
- seed?: number;
67
- mix?: string;
68
- } = {},
69
- ): () => number[][] {
70
- const nSamples = opts.nSamples ?? 32;
71
- const seqLen = opts.seqLen ?? 1024;
72
- const seed = opts.seed ?? 42;
73
- const mix = opts.mix ?? "optiq";
74
-
75
- const samples = loadSamples(mix);
76
-
77
- // Concatenate every sample's tokens into one long stream.
78
- const allTokens: number[] = [];
79
- for (const s of samples) {
80
- let text: string | undefined;
81
- if (s.messages) {
82
- // No chat template available in our JS tokenizer — role-prefixed
83
- // concatenation (OptIQ's no-chat-template fallback branch).
84
- text = s.messages.map((m) => `[${m.role}]: ${m.content}`).join("\n\n");
85
- } else if (s.text !== undefined) {
86
- text = s.text;
87
- } else {
88
- continue;
89
- }
90
- const toks = tokenizer.encode(text);
91
- for (const t of toks) allTokens.push(t);
92
- }
93
-
94
- if (allTokens.length < seqLen) {
95
- throw new Error(
96
- `Calibration mix produced only ${allTokens.length} tokens (< seqLen=${seqLen}). ` +
97
- `Try a smaller seqLen or a larger mix.`,
98
- );
99
- }
100
-
101
- // Chunk start offsets, shuffled deterministically (seeded), like OptIQ.
102
- const starts: number[] = [];
103
- for (let s = 0; s < allTokens.length - seqLen; s += seqLen) starts.push(s);
104
- shuffleInPlace(starts, seed);
105
-
106
- const chunks: number[][] = [];
107
- for (const start of starts.slice(0, nSamples)) {
108
- chunks.push(allTokens.slice(start, start + seqLen));
109
- }
110
-
111
- if (chunks.length === 0) {
112
- throw new Error("Could not create any calibration sequences.");
113
- }
114
-
115
- return () => chunks;
116
- }
117
-
118
- /** Load raw samples from the mix spec ("optiq" → bundled, else a JSONL path,
119
- * else the built-in fallback corpus). */
120
- function loadSamples(mix: string): CalibrationSample[] {
121
- let jsonlPath: string | null = null;
122
- if (mix === "optiq") {
123
- jsonlPath = bundledMixCandidates().find((p) => existsSync(p)) ?? null;
124
- } else if (existsSync(mix)) {
125
- jsonlPath = mix;
126
- } else {
127
- throw new Error(
128
- `calibration mix not found at ${mix}. Use mix='optiq' (default) or a ` +
129
- `path to a JSONL file.`,
130
- );
131
- }
132
-
133
- if (jsonlPath) return parseJsonl(jsonlPath);
134
-
135
- // Built-in fallback: synthesize one prose sample per corpus entry.
136
- return FALLBACK_CORPUS.map((text) => ({ domain: "prose", text }));
137
- }
138
-
139
- /** Parse a JSONL file into CalibrationSample[] (one object per non-blank line). */
140
- function parseJsonl(path: string): CalibrationSample[] {
141
- // Synchronous read so the caller can stay synchronous; the file is small.
142
- const text = readFileSyncUtf8(path);
143
- const out: CalibrationSample[] = [];
144
- for (const line of text.split("\n")) {
145
- const trimmed = line.trim();
146
- if (trimmed) out.push(JSON.parse(trimmed) as CalibrationSample);
147
- }
148
- return out;
149
- }
150
-
151
- function readFileSyncUtf8(path: string): string {
152
- // Bun's readFileSync via node:fs is available in this runtime.
153
- // (Kept local so the rest of the module is import-light.)
154
- const { readFileSync } = require("node:fs") as typeof import("node:fs");
155
- return readFileSync(path, "utf8");
156
- }
157
-
158
- /** Deterministic Fisher–Yates shuffle (mulberry32 PRNG seeded by `seed`).
159
- * NOTE: this does NOT reproduce numpy's RandomState shuffle order — it only
160
- * needs to be deterministic for our own reproducibility; the exact sample
161
- * ordering does not affect the allocator's 1:1 parity (that test feeds
162
- * synthetic SensitivityResults directly). */
163
- function shuffleInPlace<T>(arr: T[], seed: number): void {
164
- const rand = mulberry32(seed >>> 0);
165
- for (let i = arr.length - 1; i > 0; i--) {
166
- const j = Math.floor(rand() * (i + 1));
167
- const tmp = arr[i]!;
168
- arr[i] = arr[j]!;
169
- arr[j] = tmp;
170
- }
171
- }
172
-
173
- function mulberry32(a: number): () => number {
174
- return () => {
175
- a |= 0;
176
- a = (a + 0x6d2b79f5) | 0;
177
- let t = Math.imul(a ^ (a >>> 15), 1 | a);
178
- t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
179
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
180
- };
181
- }
@@ -1,145 +0,0 @@
1
- // Config + sidecar writer for a quantized model directory.
2
- //
3
- // Produces the `config.json` block the loader (src/config.ts → parseQuantization)
4
- // reads back: a top-level `quantization` object AND a mirror `quantization_config`
5
- // (HF compatibility — config.ts reads `raw.quantization ?? raw.quantization_config`).
6
- // The block carries default {group_size, bits, mode} plus per-module overrides
7
- // keyed by module path (e.g. "model.embed_tokens") — exactly the OptiQ layout.
8
- //
9
- // Aux files (tokenizer, chat template, generation config, …) are copied through
10
- // verbatim so the output directory is a complete, loadable model snapshot.
11
-
12
- import { existsSync } from "node:fs";
13
- import { join } from "node:path";
14
-
15
- /** A per-module quantization override. `false` means "left unquantized". */
16
- export type PerLayerEntry =
17
- | { bits: number; groupSize: number; mode?: string; trellis?: { L: number; code: string; axis: 0 | 1 } }
18
- | false;
19
-
20
- /** The default quantization definition for the model. */
21
- export interface QuantDef {
22
- bits: number;
23
- groupSize: number;
24
- mode?: string;
25
- }
26
-
27
- /** The serialized quantization block, ready to drop into config.json. */
28
- export interface QuantizationBlock {
29
- group_size: number;
30
- bits: number;
31
- mode: string;
32
- // plus per-module entries: { [modulePath]: {bits, group_size} | false }
33
- [modulePath: string]: number | string | { bits: number; group_size: number; mode?: string; trellis?: { L: number; code: string; axis: 0 | 1 } } | false;
34
- }
35
-
36
- /**
37
- * Build the `quantization` config object: a `{group_size, bits, mode}` default
38
- * plus one entry per module in `perLayer`. A module mapped to `false` is
39
- * serialized as `false` (mlx's "not quantized" convention); otherwise it
40
- * becomes `{bits, group_size}`.
41
- */
42
- export function buildQuantizationBlock(
43
- def: QuantDef,
44
- perLayer: Map<string, PerLayerEntry>,
45
- ): QuantizationBlock {
46
- const block: QuantizationBlock = {
47
- group_size: def.groupSize,
48
- bits: def.bits,
49
- mode: def.mode ?? "affine",
50
- };
51
- for (const [path, entry] of perLayer) {
52
- if (entry === false) { block[path] = false; continue; }
53
- const v: { bits: number; group_size: number; mode?: string; trellis?: { L: number; code: string; axis: 0 | 1 } } =
54
- { bits: entry.bits, group_size: entry.groupSize };
55
- if (entry.mode) v.mode = entry.mode;
56
- if (entry.trellis) v.trellis = entry.trellis;
57
- block[path] = v;
58
- }
59
- return block;
60
- }
61
-
62
- /** Aux files copied through verbatim from the source dir when present. */
63
- const AUX_FILES = [
64
- "tokenizer.json",
65
- "tokenizer_config.json",
66
- "tokenizer.model",
67
- "spiece.model",
68
- "chat_template.jinja",
69
- "generation_config.json",
70
- "special_tokens_map.json",
71
- "added_tokens.json",
72
- "vocab.json",
73
- "merges.txt",
74
- "README.md",
75
- "kv_config.json",
76
- ];
77
-
78
- /** Metadata for the OptiQ-style sidecar describing the achieved quantization. */
79
- export interface OptiqMetadata {
80
- method: string;
81
- base_model: string;
82
- bits: number;
83
- group_size: number;
84
- achieved_bpw: number;
85
- per_layer_count: number;
86
- weight_transforms?: Array<{
87
- id: string;
88
- seed: number;
89
- family: string;
90
- deviations: string[];
91
- }>;
92
- }
93
-
94
- /**
95
- * Write `config.json` (deep copy of `srcConfigRaw` with both `quantization`
96
- * and `quantization_config` set to `block`) into `outDir`, copy through any
97
- * present aux files, and write `optiq_metadata.json` describing the run.
98
- *
99
- * `*.model` tokenizer files beyond the known names are also swept in so SPM /
100
- * tiktoken sidecars survive the round-trip.
101
- */
102
- export async function writeQuantizedConfig(
103
- srcConfigRaw: Record<string, unknown>,
104
- outDir: string,
105
- block: QuantizationBlock,
106
- opts: { srcDir?: string; optiq?: OptiqMetadata } = {},
107
- ): Promise<void> {
108
- // Deep copy so we never mutate the caller's config object.
109
- const config = JSON.parse(JSON.stringify(srcConfigRaw)) as Record<string, unknown>;
110
- config.quantization = block;
111
- config.quantization_config = block;
112
- await Bun.write(join(outDir, "config.json"), JSON.stringify(config, null, 2));
113
-
114
- if (opts.srcDir) await copyAuxFiles(opts.srcDir, outDir);
115
-
116
- if (opts.optiq) {
117
- await Bun.write(
118
- join(outDir, "optiq_metadata.json"),
119
- JSON.stringify(opts.optiq, null, 2),
120
- );
121
- }
122
- }
123
-
124
- /** Copy known aux files (and any `*.model`) from src → out when present. */
125
- export async function copyAuxFiles(srcDir: string, outDir: string): Promise<void> {
126
- const seen = new Set<string>();
127
- for (const f of AUX_FILES) {
128
- const src = join(srcDir, f);
129
- if (existsSync(src)) {
130
- await Bun.write(join(outDir, f), Bun.file(src));
131
- seen.add(f);
132
- }
133
- }
134
- // Sweep any additional *.model tokenizer sidecars not in the known list.
135
- try {
136
- const { readdirSync } = await import("node:fs");
137
- for (const f of readdirSync(srcDir)) {
138
- if (f.endsWith(".model") && !seen.has(f)) {
139
- await Bun.write(join(outDir, f), Bun.file(join(srcDir, f)));
140
- }
141
- }
142
- } catch {
143
- // src dir unreadable — aux copy is best-effort.
144
- }
145
- }
@@ -1,84 +0,0 @@
1
- // Public API for native model quantization. The server (and the job system)
2
- // import from here: quantize a model directory, write sharded safetensors,
3
- // build the config block, and resolve/inspect models for the wizard UI.
4
-
5
- export { quantizeModelDir, isQuantizable, withPreparedProbe } from "./quantizer";
6
- export type {
7
- PreparedProbe,
8
- ProbeSource,
9
- QuantizeOptions,
10
- QuantizeResult,
11
- ProgressEvent,
12
- } from "./quantizer";
13
-
14
- export {
15
- planQwen35Fold,
16
- planQwenMtpFold,
17
- } from "./rotate";
18
- export type {
19
- FoldOptions,
20
- QwenFoldOptions,
21
- } from "./rotate";
22
-
23
- export {
24
- automaticRotationWeightTransform,
25
- llamaWeightTransform,
26
- planLlamaWeightTransform,
27
- qwen35WeightTransform,
28
- qwenMtpWeightTransform,
29
- } from "./weight-transform";
30
- export type {
31
- LlamaWeightTransformPlan,
32
- QwenWeightTransformPlan,
33
- WeightTransform,
34
- WeightTransformContext,
35
- WeightTransformMetadata,
36
- WeightTransformPlan,
37
- } from "./weight-transform";
38
-
39
- export {
40
- writeShardedSafetensors,
41
- DEFAULT_SHARD_BYTES,
42
- } from "./safetensors-writer";
43
- export type {
44
- NamedTensor,
45
- ShardInfo,
46
- SafetensorsIndex,
47
- WriteResult,
48
- WriteOpts,
49
- } from "./safetensors-writer";
50
-
51
- export {
52
- buildQuantizationBlock,
53
- writeQuantizedConfig,
54
- } from "./config-writer";
55
- export type {
56
- QuantDef,
57
- PerLayerEntry,
58
- QuantizationBlock,
59
- OptiqMetadata,
60
- } from "./config-writer";
61
-
62
- // Mixed-precision (OptiQ sensitivity + knapsack) surface.
63
- export {
64
- optimizeMixedPrecision,
65
- computeBpw,
66
- klReduction,
67
- UpgradeHeap,
68
- } from "./allocator";
69
- export type {
70
- LayerQuantConfig,
71
- OptimizationResult,
72
- OptimizeMixedPrecisionOptions,
73
- UpgradeEntry,
74
- } from "./allocator";
75
-
76
- export { analyzeSensitivityExact, klFromRef } from "./sensitivity";
77
- export type {
78
- SensitivityResult,
79
- AnalyzeSensitivityOptions,
80
- } from "./sensitivity";
81
-
82
- export { loadLlmCalibration } from "./calibration";
83
-
84
- export { quantizeRunner, inspectModel } from "./job";
@@ -1,162 +0,0 @@
1
- // The quantize JobRunner: wires a submitted quantize job to quantizeModelDir().
2
- // Speaks the shared src/jobs/types.ts contract. The submit config carries the
3
- // source model (a registry query, a model_id, or an explicit src_dir), the
4
- // output dir, and the target bits / group size.
5
- //
6
- // Registers itself with the jobs runner registry on import so both the
7
- // in-process submit path and the subprocess job-entry resolver (which
8
- // dynamic-imports this module via KIND_MODULES) find the "quantize" runner.
9
-
10
- import { statSync } from "node:fs";
11
- import type { Emit, JobRunner } from "../jobs/types";
12
- import { registerRunner } from "../jobs/runner";
13
- import { Registry } from "../registry";
14
- import { loadModelConfig } from "../config";
15
- import { quantizeModelDir, type QuantizeOptions } from "./quantizer";
16
- import { automaticRotationWeightTransform } from "./weight-transform";
17
-
18
- /** Resolve the source model directory from a job config. Accepts an explicit
19
- * filesystem path (src_dir) or a registry query / model id (model_id). */
20
- function resolveSrcDir(config: Record<string, unknown>): string {
21
- const srcDir = config.src_dir as string | undefined;
22
- if (srcDir) return srcDir;
23
- const modelId = config.model_id as string | undefined;
24
- if (!modelId) throw new Error("quantize job: missing src_dir or model_id");
25
- // A path-looking model_id is taken literally; otherwise resolve via registry.
26
- if (modelId.includes("/") && existsSyncSafe(modelId)) return modelId;
27
- const reg = new Registry();
28
- try {
29
- return reg.resolve(modelId).path;
30
- } finally {
31
- reg.close();
32
- }
33
- }
34
-
35
- function existsSyncSafe(p: string): boolean {
36
- try {
37
- statSync(p);
38
- return true;
39
- } catch {
40
- return false;
41
- }
42
- }
43
-
44
- export const quantizeRunner: JobRunner = async (emit: Emit, config) => {
45
- const outDir = String(config.out_dir ?? "");
46
- if (!outDir) throw new Error("quantize job: missing out_dir");
47
-
48
- const bits = Number(config.bits ?? 4) as 4 | 8;
49
- const groupSize = Number(config.group_size ?? 64) as 32 | 64;
50
- if (bits !== 4 && bits !== 8) throw new Error(`quantize job: bits must be 4 or 8 (got ${bits})`);
51
- if (groupSize !== 32 && groupSize !== 64)
52
- throw new Error(`quantize job: group_size must be 32 or 64 (got ${groupSize})`);
53
-
54
- const srcDir = resolveSrcDir(config);
55
-
56
- // Mixed-precision (OptiQ sensitivity sweep + knapsack) is triggered by
57
- // targetBpw. The server/CLI send these as snake_case in the job config — they
58
- // MUST be forwarded into opts or quantizeModelDir silently runs uniform.
59
- const targetBpw = config.target_bpw != null ? Number(config.target_bpw) : undefined;
60
- const mixed = targetBpw !== undefined;
61
- const rotationSeed = Number(config.rotation_seed ?? 42);
62
- if (config.rotate_weights && !Number.isInteger(rotationSeed))
63
- throw new Error(`quantize job: rotation_seed must be an integer (got ${String(config.rotation_seed)})`);
64
-
65
- emit({
66
- type: "stage",
67
- stage: "starting",
68
- progress: 0.01,
69
- message: mixed
70
- ? `Quantizing ${srcDir} → mixed ${targetBpw} bpw (OptiQ sensitivity sweep, ~minutes)`
71
- : `Quantizing ${srcDir} → ${bits}-bit (g${groupSize})`,
72
- });
73
-
74
- const opts: QuantizeOptions = {
75
- bits, groupSize, mode: String(config.mode ?? "affine"),
76
- ...(targetBpw !== undefined ? { targetBpw } : {}),
77
- ...(Array.isArray(config.candidate_bits) ? { candidateBits: (config.candidate_bits as number[]).map(Number) } : {}),
78
- ...(config.reference ? { reference: String(config.reference) } : {}),
79
- ...(config.calibration_mix ? { calibrationMix: String(config.calibration_mix) } : {}),
80
- ...(config.n_calibration != null ? { nCalibration: Number(config.n_calibration) } : {}),
81
- ...(config.rotate_weights
82
- ? {
83
- weightTransform: automaticRotationWeightTransform({
84
- seed: rotationSeed,
85
- }),
86
- }
87
- : {}),
88
- };
89
-
90
- const r = await quantizeModelDir(srcDir, outDir, opts, (e) =>
91
- emit({ type: "stage", stage: e.stage, progress: e.progress, message: e.message }),
92
- );
93
-
94
- emit({
95
- type: "stage",
96
- stage: "done",
97
- progress: 1,
98
- message: `Quantized ${r.nQuantized} modules (${r.achievedBpw.toFixed(2)} bpw)`,
99
- output_dir: r.outDir,
100
- });
101
-
102
- return { outputPath: r.outDir };
103
- };
104
-
105
- /** Lightweight model inspection for the `/api/quantize/inspect` route: report
106
- * whether a model is quantizable and its on-disk size, from the registry +
107
- * config (never touches tensor bytes). */
108
- export async function inspectModel(model_id: string): Promise<{
109
- ok: boolean;
110
- model_id: string;
111
- arch: string | null;
112
- support: boolean;
113
- size_gb: number;
114
- error?: string;
115
- }> {
116
- try {
117
- let path = model_id;
118
- let arch: string | null = null;
119
- let sizeBytes = 0;
120
-
121
- if (!(model_id.includes("/") && existsSyncSafe(model_id))) {
122
- const reg = new Registry();
123
- try {
124
- const rec = reg.resolve(model_id);
125
- path = rec.path;
126
- arch = rec.modelType;
127
- sizeBytes = rec.sizeBytes;
128
- } finally {
129
- reg.close();
130
- }
131
- }
132
-
133
- const config = await loadModelConfig(path);
134
- arch = arch ?? config.modelType ?? (config.architectures[0] ?? null);
135
- // Supported = a text architecture this quantizer can walk. v1 quantizes
136
- // any model whose weights are plain 2D Linear/embedding tensors; we treat
137
- // every loadable text config as supported and let eligibility filter
138
- // per-tensor at quantize time.
139
- const support = config.text.numHiddenLayers > 0;
140
-
141
- return {
142
- ok: true,
143
- model_id,
144
- arch,
145
- support,
146
- size_gb: sizeBytes / (1 << 30),
147
- };
148
- } catch (e) {
149
- return {
150
- ok: false,
151
- model_id,
152
- arch: null,
153
- support: false,
154
- size_gb: 0,
155
- error: e instanceof Error ? e.message : String(e),
156
- };
157
- }
158
- }
159
-
160
- // Self-register on import: `kind: "quantize"` resolves both for in-process
161
- // submit and for the subprocess job-entry (KIND_MODULES → ../quantize/job.ts).
162
- registerRunner("quantize", quantizeRunner);