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,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);