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,126 +0,0 @@
1
- # ORPO-on-UF — results + testing-phase handoff
2
-
3
- **Status:** training done (2026-06-20); **testing phase = next.** This doc is the
4
- "where we are + what to run" so anyone (or a fresh session) can execute the measurements.
5
- Companion: [trainer-validation-experiment.md](trainer-validation-experiment.md) (the
6
- validation that got us here).
7
-
8
- ## The run that just finished
9
-
10
- From-**base** ORPO on UltraFeedback, MiniCPM5-1B.
11
- - **Base:** `mlx-community/MiniCPM5-1B-OptiQ-4bit` (the full post-trained model; optiq quant).
12
- - **Data:** `~/.cache/mlx-bun/eval-data/uf-cpm5` — 14,691 train / 148 val, `{prompt,chosen,rejected}`.
13
- - **Config:** ORPO, **1 epoch (14,691 iters)**, B=1, seq 2048, rank 16, **λ=0.1**, cosine LR
14
- 1e-5, **no-segment**. From base (no warm-start).
15
- - **Command:** `SEQ=2048 EVAL_EVERY=500 RANK=16 SCHED=cosine LAMBDA=0.1
16
- ADAPTER_DIR=./adapters/cpm5-uf-frombase bun scripts/experiments/pref-control.ts orpo
17
- ~/.cache/mlx-bun/eval-data/uf-cpm5 uf-frombase 14691 1e-5`
18
-
19
- ## Key result — the two ORPO halves decoupled
20
-
21
- | half | metric | best | at step | final (14690) |
22
- |---|---|---|---|---|
23
- | **SFT** | loss (NLL+λOR) ↓ | **1.5057** | **14500** (the end) | 1.506 |
24
- | **DPO** | margin ↑ | **0.143** | **6000** | 0.127 |
25
- | — | accuracy | **81/148** | ~5500 | 80/148 |
26
-
27
- - **SFT improved across the *whole* run** (loss bottomed at the end) → **final adapter = best SFT.**
28
- - **DPO peaked at ~6000 and faded** → **step ~6000 = best DPO**, slightly worse SFT (loss 1.5077).
29
- - **No single checkpoint has both.** Honest summary: a **small, early-peaking preference
30
- signal** (~+6 questions, chance 74 → peak 81/148) that **drifted down in the tail**, while
31
- SFT kept inching to its ~1.506 floor. Whether even that small lift **converts** on an
32
- independent test is the open question the testing phase answers.
33
-
34
- ## Artifacts + baselines
35
-
36
- - **Final adapter:** `./adapters/cpm5-uf-frombase/` (mountable: `eval.ts --adapter`).
37
- - **Trajectory:** `runs/uf-frombase.{json,csv}`; **plot:** `runs/uf-frombase.png` via
38
- `scripts/experiments/plot-runs.py` (panels: loss=val+train-EMA; questions-correct/148;
39
- margin — each zoomed to its band).
40
- - **x1 baseline** (base CPM5, full capability suite): **28.69** (in the eval DB; needs the
41
- MMLU-argmax + HumanEval-python fixes — see Gotchas). optiq published is 30.28.
42
- - **⚠ No intermediate checkpoints this run** — `pref-control.ts` lacked `saveCheckpoints`
43
- (now **fixed**; future runs checkpoint every val eval + track best-margin). The ~6k peak
44
- is recoverable by **deterministic replay** (same seed/order → same adapter).
45
-
46
- ## Testing plan
47
-
48
- **PRIMARY — the headline (READY TO RUN):**
49
- - **A. final adapter vs base** on x2 (capability) + Exp 2 (judge win-rate). Answers "did a
50
- full epoch of ORPO-on-UF move a 1B, on an *independent* test?"
51
-
52
- **SWEEP / SYNTHESIS:**
53
- - **B. recover the ~6k peak** — re-run from base to ~7k (checkpoints now on), grab the
54
- step-6000 (and neighbors, pick best-val). The early-stop peak arm.
55
- - **C. four-way** — base / 6k-peak / final / final+6k on x2 + Exp 2 → traces the
56
- early-stopping curve on an independent test.
57
- - **D. DPO-boost (the day's synthesis) — keep best SFT, re-pressure the DPO.** Warm-start
58
- from the **final** adapter (best SFT, NLL at floor), re-apply the **DPO-helpful examples
59
- with HIGH λ** (or DPO-only). = dynamic-λ (ramp preference at SFT-saturation) + data-curation
60
- in one move. Tests the fork: DPO stalled because of a **capacity ceiling** (won't help) or
61
- **dilution / λ-too-gentle** (margin recovers past 0.143 while loss holds ~1.506 → better on
62
- *both* axes than any single checkpoint).
63
- - **E. data-valuation control** — `final + (0–6000)` vs `final + (6000–14691)`, same size.
64
- First-half wins → those examples carry the DPO signal; tie → it's "more preference training,"
65
- not *which* examples. (We control which pairs go in, so this generalizes to **curating** the
66
- data with the model as the probe.)
67
-
68
- ## Commands
69
-
70
- `ORC=/Users/joshrossi/Code/mlx-lm-example/.venv/bin/python` (HumanEval interpreter, this machine).
71
-
72
- ```bash
73
- # A — x2 capability (final vs base; base x1=28.69 already recorded)
74
- MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5 --adapter ./adapters/cpm5-uf-frombase
75
- # A — Exp 2 (gen base+trained responses, then judge head-to-head)
76
- bun scripts/experiments/prefbench.ts gen mtbench ./adapters/cpm5-uf-frombase mtbench-uf # GPU
77
- bun scripts/experiments/prefbench.ts judge mtbench-uf # codex
78
- # B — replay base→7k to recover the ~6k checkpoint (now checkpoints)
79
- SEQ=2048 EVAL_EVERY=500 RANK=16 SCHED=cosine LAMBDA=0.1 ADAPTER_DIR=./adapters/cpm5-uf-replay \
80
- bun scripts/experiments/pref-control.ts orpo ~/.cache/mlx-bun/eval-data/uf-cpm5 uf-replay 7000 1e-5
81
- ```
82
-
83
- ## Harness gaps to close for D / E
84
-
85
- `pref-control.ts` does **not yet** support (needed for the DPO-boost + control arms):
86
- 1. **Warm-start from an adapter** (`--resume` / load a non-zero adapter before training) —
87
- the trainer has `warm_start_adapter` (see `trainer.ts`); just not wired into pref-control.
88
- 2. **Data-subset selection** (feed a chosen subset / order of pairs, e.g. rows 0–6000) —
89
- pref-control feeds the whole `train.jsonl`; needs a row-range / id-list option.
90
- 3. λ is already env-controllable (`LAMBDA=`), so high-λ is ready once 1+2 exist.
91
-
92
- ## Validated infrastructure (all green — see trainer-validation-experiment.md)
93
-
94
- - **Trainer:** positive controls pass — DPO & ORPO drive prefer-uppercase val acc → 1.0;
95
- grads match autograd. `scripts/experiments/pref-control.ts`.
96
- - **Capability harness:** reproduces optiq across 6 tasks after two fixes (below).
97
- `eval.ts capability --adapter` wired.
98
- - **Judge:** `gpt-5.4-mini` via `codex exec`, **keyless**, structured, order-swapped,
99
- 3/3 positive control. `scripts/experiments/llm-judge.ts`.
100
- - **Exp 2 harness:** `scripts/experiments/prefbench.ts` (gen/judge); prompts downloaded
101
- (`mt_bench.jsonl` 80, `alpaca_eval.json` 805).
102
- - **MMLU frozen set:** optiq's exact 969 questions + dev exemplars captured
103
- (`mmlu_optiq_frozen.jsonl` / `mmlu_optiq_dev.jsonl`) for parity work.
104
-
105
- ## Gotchas / load-bearing facts
106
-
107
- - **`AdapterManager.mount` affects the *serving* forward** (eval generation, chat) **but NOT
108
- the *training* `branchLogpMean`.** Measure training metrics via the trainLora emit, not mount.
109
- - **Eval env:** `MLX_BUN_ORACLE_PYTHON=$ORC` (HumanEval code-exec — wrong default path on this
110
- machine); evals default to **non-thinking** (optiq parity; `MLX_BUN_EVAL_THINK=1` to re-enable).
111
- - **MMLU parity:** our number (47.7 old / ~50 argmax) vs optiq 52.4 is **sampling + forward
112
- parity**, not noise (both deterministic argmax). Use the frozen set; remaining gap = our
113
- forward vs `mlx_lm` (logit-diff test on the frozen prompts — **queued, GPU**).
114
- - **Determinism:** same seed/order → same adapter. Replay recovers any checkpoint.
115
- - **Server adapter API** (`POST /v1/adapters` + per-request `"adapter":"id"`) is the clean way
116
- to compare *many* adapters via chat; **raw eval (`--adapter`) is required for capability**
117
- (MMLU is logit-argmax, not chat generation).
118
-
119
- ## Recommended order
120
-
121
- 1. **A** (final vs base) — the headline, READY. Run x2, then Exp 2.
122
- 2. **B** — replay to recover the 6k peak (cheap, ~45 min).
123
- 3. **C** — eval base/6k/final on the suite (four-way needs D for the +6k arm).
124
- 4. Close the **pref-control harness gaps** (warm-start + subset), then **D** (DPO-boost) and
125
- **E** (data-valuation control) — the synthesis experiments.
126
- 5. (Parallel/queued) **MMLU forward-parity** logit-diff to nail x1 ≈ 30.28.
@@ -1,92 +0,0 @@
1
- # Pareto-specialized runtime findings
2
-
3
- ## Question
4
-
5
- Which parts of mlx-bun should converge on shared infrastructure, and which parts should remain deliberately specialized so cleanup does not turn the runtime into a lowest-common-denominator model host?
6
-
7
- This note compares three mature specialization clusters: the Colibri/GLM-5.2 runtime, the Qwen3.8 27B TurboQuant and MTP work, and ORPO training. The evidence says the same thing in all three places: share lifecycle and composition policy, but keep artifact layout and numerical work close to the model or method that owns them.
8
-
9
- ## Shared control-plane infrastructure
10
-
11
- The shared layer decides what runs, owns resources, and records what happened. It does not rewrite the selected computation.
12
-
13
- - **Model construction.** `openModel()` recognizes the direct Colibri artifact before ordinary safetensors loading. `createModel()` prefers dedicated and fingerprint-generated model classes before the universal fallback, and explicitly says the generic path must not shadow a dedicated port. This is shared dispatch with specialized implementations, not one universal graph. [Factory dispatch](../../../src/model/factory.ts#L30-L150)
14
- - **Concurrency and request composition.** The target is one concurrency-driven engine. One active request uses the B=1 pipelined or compiled fast path; concurrent requests use the general step up to `--batch N`. B=1 is an internal specialization, not a permanent public lane. Features are stackable layers, and scheduling must not replace the selected KV scheme, adapter, draft method, grammar, or sampler. [Unified engine decision](../../design/unified-engine-frontier-plan.md#L333-L403) [Composition matrix](../../design/unified-engine-frontier-plan.md#L405-L424)
15
- - **Cache lifecycle and capability.** `Cache` owns update, masks, state, rollback, accounting, and disposal. `BatchableCache` adds row merge, extraction, filtering, and byte projection. The scheduler can depend on those capabilities without knowing whether a row contains ordinary KV, recurrent state, TurboQuant tensors, or compressed GLM state. [Cache interface](../../../src/model/gemma4-base.ts#L264-L303) [Batchable cache interface](../../../src/model/gemma4-base.ts#L347-L357)
16
- - **Resolved KV policy.** `KvScheme` preserves bf16, uniform affine, per-layer affine, and TurboQuant as distinct immutable schemes. It centralizes names, accounting, and current batch capability checks without pretending the schemes have identical storage or kernels. [KV scheme](../../../src/kv-scheme.ts#L84-L169)
17
- - **Draft lifecycle.** `DraftProvider` owns server-lifetime machinery and opens a request-scoped `DraftSource`. The source interface carries prompt mode, target taps, draft, commit, rollback-related cache state, and disposal. Assistant, DSpark, Qwen MTP, and native GLM MTP can share speculative orchestration while retaining different state transitions. [Draft source](../../../src/spec/source.ts#L31-L101) [Draft provider](../../../src/spec/source.ts#L103-L118)
18
- - **Expert residency policy.** The budget equation, stable expert union, lease state, backend contract, telemetry, and pressure correction are reusable. GLM supplies artifact geometry and byte segments to that policy. [Residency planning and union](../../../src/expert-residency.ts#L17-L155) [Residency backend](../../../src/expert-residency.ts#L157-L170)
19
- - **Offline transform orchestration.** `WeightTransform` separates name/config planning from lazy tensor application. Llama, the Qwen3.5 trunk, and Qwen MTP are real adapters over the same conversion seam. [Weight transform interface](../../../src/quantize/weight-transform.ts#L40-L51) [Qwen transform adapters](../../../src/quantize/weight-transform.ts#L244-L268)
20
- - **Training orchestration.** `TrainConfig` names independent techniques such as segmented backward, fused or flash CCE, prefix sharing, regularization, and ORPO semantics. `orpoLoop()` composes the selected techniques and chooses the model-specific backward implementation. [Training configuration](../../../src/train/trainer.ts#L42-L150) [ORPO composition](../../../src/train/trainer.ts#L821-L948)
21
-
22
- ## Deliberately specialized data-plane code
23
-
24
- ### Colibri and GLM-5.2
25
-
26
- GLM-5.2 is not a descriptor-table variation of a dense transformer. Its graph has MLA, DSA, shared plus routed MoE, native MTP, and compressed cache state. Its public artifact also has a dedicated container and streamed expert layout. The design therefore calls for a dedicated `Glm52Model`, direct artifact support, and a one-read routed-expert kernel rather than repacking into generic projection-major tensors. [Dedicated graph and artifact contract](../../design/colibri-glm52-port.md#L323-L357)
27
-
28
- The memory contract is also model and artifact specific. A header-only preflight reads the container, derives expert slot layouts, counts DSA and MTP state, and refuses startup when the exact resident weights, expert slabs, compressed KV, verification transients, allocator reserve, Bun reserve, and safety margin exceed the process limit. [GLM geometry and preflight](../../../src/model/glm52-memory.ts#L340-L500) The runtime then maps Colibri segments into generic residency leases, but retains GLM-specific slot layouts, MTP slabs, signed-int8 requirements, and routed-SwiGLU executors. [GLM residency binding](../../../src/model/glm52-residency.ts#L138-L230) [GLM executor construction](../../../src/model/glm52-residency.ts#L300-L459)
29
-
30
- That split is intentional. Bun owns residency policy and observability; the native helper owns aligned slabs, `pread`, wiring, and completion fences; the GLM model owns tensor semantics and kernels. [Ownership map](../../design/colibri-glm52-port.md#L580-L600)
31
-
32
- ### Qwen3.8 27B, TurboQuant, and MTP
33
-
34
- Qwen3.5/3.8 keeps a dedicated graph because gated DeltaNet recurrence, full attention, MRoPE, output gates, and recurrent speculative rollback are numerical behavior, not configuration decoration. [Qwen graph](../../../src/model/qwen3_5.ts#L128-L322) [Qwen model interface](../../../src/model/qwen3_5.ts#L512-L673)
35
-
36
- Qwen MTP preserves its own artifact and state machine behind `DraftProvider` and `DraftSource`. The provider rejects a non-Qwen target or a hidden-size mismatch. The request source uses tapped pre-final-norm target state, maintains its own KV, samples through the target sampler, and rebuilds accepted rows from verified target hiddens. Those rules must not move into generic speculative orchestration. [Qwen MTP provider](../../../src/spec/qwen-mtp-source.ts#L193-L235) [Qwen MTP state machine](../../../src/spec/qwen-mtp-source.ts#L237-L430)
37
-
38
- TurboQuant KV demonstrates the right form of specialization. `TurboQuantKVCache` implements the shared `Cache` lifecycle, while keeping packed indices, scales, zero points, FWHT-domain values, supported head dimensions, and conversion rules inside the class. [TurboQuant cache](../../../src/model/gemma4-base.ts#L1539-L1800) The weight pipeline follows the same rule. `WeightTransform` is shared, but the Qwen corridor map preserves the output gate, recurrent internals, vision-to-residual seam, untied 27B head, and companion MTP basis. [Qwen transform seam](../../design/turboquant-weights.md#L80-L87) [Qwen corridor map](../../design/turboquant-weights.md#L125-L174)
39
-
40
- ### ORPO training
41
-
42
- ORPO benefits from composition, not one generic backward. The trainer combines prefix sharing, segmented recomputation, fused or flash CCE, LoRA regularization, and objective semantics. The data plane remains specialized where the model topology demands it. Gemma4 segmented ORPO threads per-layer inputs and cross-segment donor KV cotangents; MiniCPM5 uses a simpler segment graph. [Composed ORPO paths](../../design/orpo-training.md#L178-L218) [Gemma4 segmented backward](../../../src/train/segmented.ts#L1137-L1471)
43
-
44
- Flash CCE is a shared quantized-head interface with specialized Metal kernels and explicit shape guards. Its implementation selects Steel, simdgroup, or scalar kernels from actual hidden, vocabulary, group, and tile geometry, and exposes exact-gradient escape hatches. Flattening this into a generic matrix-loss helper would lose the memory and watchdog constraints that justify it. [Flash CCE head](../../../src/train/flash-cce.ts#L42-L64) [Forward dispatch](../../../src/train/flash-cce.ts#L1033-L1132) [Backward dispatch](../../../src/train/flash-cce.ts#L1134-L1234)
45
-
46
- Dynamic lambda is not implemented. Its design belongs in the ORPO control plane: validation metrics update a live lambda source in `orpoLoop()`, while every monolithic and segmented loss reads the same value. It should not create another family of backward classes. [Dynamic-lambda status and signals](../../design/orpo-dynamic-lambda.md#L1-L27) [Proposed wiring](../../design/orpo-dynamic-lambda.md#L163-L180)
47
-
48
- ## Interfaces that already preserve specialization
49
-
50
- | Interface | Shared invariant | Specialization retained behind it |
51
- |---|---|---|
52
- | `RuntimeModel` plus factory dispatch | Construction and serving can hold one model type | Dedicated GLM, Qwen, Gemma, diffusion, MoE, and generated graphs |
53
- | `Cache` / `BatchableCache` | Lifecycle, rollback, row operations, byte projection | Plain, rotating, quantized, TurboQuant, SSM, MLA, and DSA storage |
54
- | `KvScheme` | One resolved KV choice and stable identity | Per-scheme accounting, conversion, persistence, and kernels |
55
- | `DraftProvider` / `DraftSource` | Request lifecycle, target taps, draft and commit | Assistant, DSpark, Qwen MTP, and GLM MTP state machines |
56
- | `ExpertResidencyBackend` | Lease and I/O lifecycle | Colibri container offsets, slot packing, expert kernels, and prediction policy inputs |
57
- | `WeightTransform` | Plan first, apply lazily, record identity | Family-specific exact fold corridors and companion artifacts |
58
- | ORPO trainer configuration | One run composes selected techniques | Model-specific masks, donor topology, VJPs, and Metal kernels |
59
-
60
- ## Declared profile seam (S2, 2026-08-21)
61
-
62
- Model construction now resolves one `ResolvedModelProfile` before opening
63
- weights. An exact artifact declaration binds an immutable external fingerprint,
64
- config fingerprint, fidelity contract, required engine capabilities, and a
65
- loader/graph/loop composition. Exact Qwen3.8 OptiQ and GLM-5.2 Colibri revisions
66
- are pinned; other supported artifacts retain dedicated family resolution and
67
- then the universal dense fallback.
68
-
69
- The factory consumes the resolved composition, and the serving context retains
70
- it for library callers. A matched exact declaration with a config or capability
71
- mismatch refuses rather than taking another route. The profile seam does not
72
- own request methods: MTP, KV schemes, adapters, grammar, and sampling remain
73
- independently resolved inputs to completion execution. This keeps the control
74
- plane declarative without turning a model profile into a feature preset.
75
-
76
- These interfaces preserve specialization because they describe lifecycle or capability, not tensor algebra. They also have multiple real implementations. That is the useful test for whether an abstraction belongs.
77
-
78
- ## Rules for steady-state cleanup
79
-
80
- 1. **Unify control, not math.** Centralize admission, concurrency, cancellation, ownership, accounting, persistence, telemetry, and technique composition. Keep tensor layout, recurrence, cache encoding, model topology, and kernel selection with their owning model, artifact, or method.
81
- 2. **Keep one concurrency-driven engine.** B=1 and B>1 are internal step specializations in one engine. `--batch N` is a concurrency cap. Observed placement may be reported, but serial versus batch must not become a permanent public mode or feature-selection interface. Current feature-specific serial routing is capability debt.
82
- 3. **Never weaken a resolved composition to fit a path.** If batching lacks TurboQuant, MTP, adapters, grammar, or another selected method, close that capability gap or reject the unsupported composition. Do not silently substitute bf16 KV, disable drafting, or change sampling.
83
- 4. **Prefer capability interfaces over family checks.** Scheduling should ask caches whether they can merge or project bytes and draft sources what target state they require. Factory dispatch is the proper place for model identity checks.
84
- 5. **Let dedicated ports outrank generic fallbacks.** The universal model path is valuable for ordinary architectures. It must not absorb GLM MLA/DSA, Qwen recurrence, artifact-specific MTP, or another optimized graph merely to reduce class count.
85
- 6. **Treat artifacts as executable contracts.** Validate manifests, tensor families, layouts, quantization metadata, companion seeds, and memory equations before allocation. Keep artifact-specific loaders and transforms when repacking would add copies, lose reproducibility, or change arithmetic.
86
- 7. **Generalize only after the invariant is visible in two implementations.** Extract lifecycle and capability seams such as `DraftSource` or `WeightTransform`. Do not extract a common tensor algorithm from code that only looks similar but has different masks, state, accumulation order, or oracle.
87
- 8. **Compose optimizations at the orchestrator, then test the cross-product.** ORPO proves that prefix sharing, flash CCE, segmented backward, and regularization can stack while model-specific backward code remains intact. Serving needs the same discipline for model graph, KV scheme, MTP, adapters, grammar, sampling, and concurrency.
88
- 9. **Bind every specialized path to its own oracle and measured purpose.** A specialized module earns its place through parity, memory, quality, or throughput gates on the artifact and hardware it targets. If the benefit disappears, delete the specialization instead of preserving it as architecture folklore.
89
-
90
- ## Strongest conclusion
91
-
92
- The steady state is not a generic engine with scattered exceptions. It is a shared control plane that carries authoritative compositions through one concurrency-driven engine, plus specialized data planes selected by model, artifact, and numerical method. That structure preserves the project's Pareto advantage: common serving and training behavior where sameness is real, and unapologetically specific code where the result depends on it.
@@ -1,308 +0,0 @@
1
- # Investigation: pi as a "built-in" terminal for mlx-bun
2
-
3
- *2026-06-12. Question (PRODUCT_ROADMAP "Harness UX" / PLAN direction A):
4
- can `mlx-bun pi` drop the user into a working pi agent session against
5
- the locally running model — and what's the best mechanism? Sources:
6
- https://pi.dev/docs/latest (sdk, tui, rpc, custom-provider pages) plus
7
- direct inspection of the installed packages
8
- (`~/.bun/install/global/node_modules/@earendil-works/*`, v0.79.1).*
9
-
10
- > **Outcome (2026-06-14, what actually shipped).** This investigation
11
- > proposed shipping the subprocess launcher first and promoting to an
12
- > embedded flagship later. We went straight to the embedded design and
13
- > then **dropped the subprocess path entirely** (Option 2 + the
14
- > `--external-pi` fallback in P4): `mlx-bun pi` runs pi's own
15
- > `InteractiveMode` **in-process** (src/pi-terminal.ts) with a custom
16
- > mlx-bun coding-agent prompt, full coding tools + web tools, and pi's
17
- > native approval prompts — nothing to install. A user who already runs
18
- > pi connects it to the local model with **`mlx-bun harness pi`**
19
- > (Option 1, src/harness-pi.ts) — that's the only "their pi" path, since
20
- > launching a pi they already have was pure duplication. The web-chat
21
- > half (Option 4) ships via src/pi-web.ts. The analysis below is the
22
- > point-in-time reasoning that led here.
23
-
24
- ## TL;DR
25
-
26
- **Yes, and better than hoped.** pi is not just embeddable — it is a
27
- Bun-native, MIT-licensed npm package whose own release binary is built
28
- with `bun build --compile`, the exact toolchain mlx-bun's Phase 5
29
- single-binary bundle already uses. The full interactive TUI (editor,
30
- chat history, all built-in commands) is an exported SDK class
31
- (`InteractiveMode`), not CLI-only internals. Four integration options
32
- exist, they are not mutually exclusive, and the recommended path is:
33
- ship the cheap subprocess launcher now, promote to a true in-binary
34
- embed as the flagship. pi's RPC mode separately gives us the protocol
35
- for the built-in web chat UI, so this investigation pays for direction
36
- A's part 1 as well.
37
-
38
- ## What pi is, technically
39
-
40
- - Four MIT-licensed packages, all v0.79.1, all from
41
- `github.com/earendil-works/pi`:
42
- `pi-coding-agent` (13 MB, the agent + CLI + SDK), `pi-ai` (4.9 MB,
43
- provider/streaming layer), `pi-agent-core` (1.3 MB), `pi-tui`
44
- (1.9 MB, differential-rendering TUI lib). ~21 MB total on disk
45
- before tree-shaking — negligible next to model weights, modest next
46
- to mlx-bun's current binary.
47
- - **Bun-compile native**: `pi-coding-agent`'s `build:binary` script is
48
- literally `bun build --compile ./dist/bun/cli.js ...` — upstream
49
- ships a Bun single-file executable themselves. Embedding it in our
50
- Bun bundle is a supported configuration, not an experiment.
51
- - Engines: node ≥ 22.19 (pi-tui uses `/v`-flag regexes — fails under
52
- node 18, fine under Bun ≥ 1.3.x, which mlx-bun already pins).
53
- - Assets that must ride along in a binary (upstream's
54
- `copy-binary-assets` is the manifest): theme JSONs, a few PNGs,
55
- export-html templates, `photon_rs_bg.wasm` (image ops), and pi-tui's
56
- prebuilt `.node` natives (`darwin-arm64`/`darwin-x64` ship in the
57
- package).
58
- - Local-model support is **already proven on this machine**:
59
- `~/.pi/agent/models.json` has an `mlx` provider
60
- (`api: "openai-completions"`, baseUrl + `sk-optiq-` key, compat
61
- flags) serving Qwen quants. mlx-bun's OpenAI surface is what pi
62
- expects.
63
-
64
- ## The four integration options
65
-
66
- ### Option 1 — `mlx-bun harness pi`: configure the user's existing pi
67
-
68
- Write/merge the provider entry into `~/.pi/agent/models.json` (or drop
69
- a tiny extension that calls `pi.registerProvider(...)` — the
70
- documented programmatic route, which can even discover models
71
- dynamically from our `/v1/models`). Validate with one tiny request,
72
- print the launch command.
73
-
74
- - **Effort**: hours. **Risk**: low (must merge, not clobber, user
75
- config — the docs' extension route avoids touching models.json at
76
- all). **Verdict**: do regardless; this is the harness-adapter
77
- pattern from the roadmap and it's nearly free.
78
-
79
- **Pros**: nearly free; respects the user's pi setup, sessions, themes,
80
- extensions; zero version coupling; the dynamic-discovery extension
81
- keeps the model list in sync with our server automatically.
82
- **Cons**: requires pi to already be installed; not "built-in" — the
83
- appliance story still has two moving parts; config-merge bugs are the
84
- classic way to annoy users (the extension route mostly avoids this).
85
-
86
- ### Option 2 — `mlx-bun pi` (v1): spawn the user's installed pi
87
-
88
- Start our server, then spawn `pi` with a session-scoped provider
89
- config (extension dir or env) pointing at it. If pi isn't installed,
90
- print the install one-liner.
91
-
92
- - **Effort**: a day with polish. **Risk**: version skew with whatever
93
- pi the user has; not "built-in" — two installs.
94
- - **Verdict**: the right v1. Real UX win immediately, zero coupling.
95
- - **Bonus**: unrecognized flags pass straight through, so
96
- `mlx-bun pi -p "summarize @notes.md"` (pi's non-interactive print
97
- mode), `--mode json/rpc`, `--continue`, `--resume` etc. all work on
98
- day one without us implementing anything.
99
-
100
- **Pros**: fast to ship; full pi feature surface via passthrough;
101
- upgrades to pi arrive for free; failure modes are simple (no pi →
102
- print install hint). **Cons**: still two installs; we can't control
103
- the pi version (an upstream flag/behavior change can break our
104
- launcher); per-run provider injection needs care so we don't pollute
105
- the user's global config; process lifecycle (server + child TUI)
106
- needs clean shutdown handling.
107
-
108
- ### Option 3 — SDK embed (the real "built-in"): pi inside the mlx-bun binary
109
-
110
- This is the one the question was really about, and the SDK is
111
- explicitly designed for it:
112
-
113
- - `createAgentSession({...})` builds a session; the
114
- `examples/sdk/12-full-control.ts` example shows **zero-discovery**
115
- embedding: in-memory `SessionManager`/`SettingsManager`/
116
- `ModelRegistry`, custom `ResourceLoader`, explicit tool list,
117
- runtime API keys — nothing leaks from/to `~/.pi` unless we want it
118
- to.
119
- - `InteractiveMode` is exported: "full TUI interactive mode with
120
- editor, chat history, and all built-in commands", constructed from
121
- an `AgentSessionRuntime`. We do not rebuild a chat TUI from pi-tui
122
- primitives (the tui docs are explicit that components are for
123
- extensions, not a full-app kit) — we run *pi's own* TUI in-process.
124
- - Provider wiring: register an `openai-completions` provider at our
125
- own server's baseUrl (loopback HTTP into our already-running
126
- `Bun.serve` — simplest and keeps one code path for external
127
- clients), models listed from our registry with real context-window
128
- numbers per device profile.
129
- - Flow for `mlx-bun pi`: detect profile → ensure model → start server
130
- in-process → `createAgentSession` against `localhost` →
131
- `new InteractiveMode(runtime).run()`.
132
-
133
- Open engineering questions (all look tractable, none look fatal):
134
-
135
- 1. **One process, two workloads**: the TUI event loop and the
136
- server/generation queue share the JS thread; mlx compute happens in
137
- native code but graph-build is JS-side (~ms-scale per decode step).
138
- TUI rendering is differential and cheap; needs a smoke test for
139
- input latency during decode, not a redesign.
140
- 2. **Bundle plumbing**: embed pi's asset list + pi-tui `.node`
141
- prebuilds + photon wasm into the Phase 5 compile. Upstream's own
142
- binary build proves each piece works under `bun build --compile`;
143
- our work is making *their* asset-path resolution find files inside
144
- *our* bundle.
145
- 3. **Version pinning**: pi moves fast (0.79.x); pin exact, upgrade
146
- deliberately, keep Option 2 as the fallback path when upstream
147
- breaks SDK surface.
148
- 4. **Identity**: embedded pi should read/write its own session dir
149
- (`~/.mlx-bun/pi-sessions` or similar) and not fight a user's
150
- standalone pi install. The full-control example shows every knob
151
- needed (`agentDir`, custom storage paths).
152
-
153
- - **Effort**: ~1–2 weeks including bundle work and latency testing.
154
- - **Verdict**: feasible and high-value; this is the appliance moment —
155
- one binary, one command, a real agent on a local model. `-p` and
156
- `--mode rpc/json` remain supported natively: `runPrintMode` and
157
- `runRpcMode` are SDK exports, so the embedded CLI keeps pi's
158
- headless modes.
159
-
160
- **Pros**: the true appliance — one binary, no prior installs; we pin
161
- and test the exact pi version we ship; full control of defaults
162
- (session dir, tools, system prompt, model list per device profile);
163
- in-process events shared with the web UI; offline-clean.
164
- **Cons**: most engineering (asset bundling, latency validation); we
165
- own the upgrade treadmill for a fast-moving 0.x dependency; embedded
166
- pi diverges from the user's own pi config/extensions unless we
167
- deliberately opt into discovery; binary grows ~20 MB.
168
-
169
- ### Option 4 — RPC / JSON event-stream mode (not for the terminal — for the web UI)
170
-
171
- `pi --mode rpc` speaks JSONL over stdin/stdout: `prompt`, `steer`,
172
- `abort`, model control, state/stats queries, plus a streamed event
173
- model (`message_update` deltas, `tool_execution_*`, `turn_*`) and even
174
- an extension-UI sub-protocol. The docs name "custom frontends (web
175
- dashboards…)" as a primary use case.
176
-
177
- - **Verdict**: wrong tool for `mlx-bun pi` (we'd be rebuilding pi's
178
- TUI on top of pi), but the **right backbone for the built-in web
179
- chat UI**: `mlx-bun` serves a page; the server bridges
180
- WebSocket ↔ RPC events (or drives `AgentSession.subscribe()`
181
- in-process — same event shapes, no subprocess). Tool calls,
182
- steering, and progress come for free instead of us re-implementing
183
- an agent loop in the browser.
184
-
185
- **Pros**: documented, versioned JSONL protocol; UI-agnostic (web,
186
- IDE, bots); steering/abort/stats built in; works with either the
187
- subprocess or the embedded session as the engine. **Cons**: not a
188
- terminal UX at all; strict framing rules to honor; the extension-UI
189
- sub-protocol must be bridged if extensions prompt the user.
190
-
191
- ## Does this make sense as a feature?
192
-
193
- Yes — it is arguably the highest-leverage product move available:
194
-
195
- - It converts mlx-bun from "a server you point things at" into a
196
- complete local-AI appliance, which is the PRODUCT_ROADMAP north
197
- star verbatim.
198
- - The marginal cost is small because the hard parts are already done
199
- on both sides: our OpenAI surface is SDK-verified, pi's SDK is
200
- designed for embedding, and both projects compile with the same Bun
201
- toolchain. MIT licensing removes the bundling question.
202
- - One investigation, both deliverables: the same `AgentSession` event
203
- stream powers the embedded TUI *and* the web chat UI, so direction
204
- A's two halves share a core.
205
- - Caveats worth stating: we take on pi's release cadence as a
206
- dependency; the agent quality ceiling is the local model's (12B
207
- OptiQ tool-calling is decent but this becomes the showcase — the
208
- Lucien-direction evals would tell us exactly how good); and the
209
- embedded TUI must not degrade decode throughput (measure, per house
210
- rules).
211
-
212
- ## Implementation plan
213
-
214
- To be explicit about the recommendation: **the locally installed pi is
215
- the v1 stepping stone, not the destination.** Users who have their own
216
- pi always get first-class support (P1); the flagship `mlx-bun pi` ends
217
- as the embedded, single-binary experience (P3/P4).
218
-
219
- ### P1 — `mlx-bun harness pi` (hours–1 day)
220
-
221
- 1. Detect pi (`which pi`, `~/.bun/bin/pi`, npm global); report version.
222
- 2. Generate an extension file (e.g. `~/.pi/agent/extensions/mlx-bun.ts`)
223
- that calls `pi.registerProvider("mlx-bun", ...)` with **dynamic
224
- discovery**: fetch our `/v1/models` at pi startup so the model list
225
- tracks the server. No models.json surgery; trivially reversible
226
- (delete one file).
227
- 3. Validate: tiny completion against the running server through pi's
228
- provider path; print `pi --provider mlx-bun` launch hint.
229
- 4. Failure modes: pi missing → print install one-liner; server down →
230
- offer to start it.
231
-
232
- ### P2 — `mlx-bun pi` v1: subprocess launcher (~1–2 days)
233
-
234
- 1. Ensure server: reuse a running instance if healthy, else start
235
- in-process and wait for readiness.
236
- 2. Resolve the pi binary; if absent, offer the installer.
237
- 3. Spawn pi with stdio inherited and a **session-scoped provider**: a
238
- generated `-e <tmp-extension>.ts` registering the provider for this
239
- run only (no global config writes), plus
240
- `--provider mlx-bun --model <profile default>`.
241
- 4. **Pass through all remaining argv** — this is where `mlx-bun pi -p
242
- "..."`, `--mode rpc`, `--continue`, `@file` args work for free.
243
- 5. Lifecycle: child exit → optionally keep the server warm (flag);
244
- SIGINT goes to the child (pi handles double-ctrl-C), server shuts
245
- down cleanly after.
246
-
247
- ### P3 — embed spike (≤1 week, run via `bun run`, no bundling yet)
248
-
249
- 1. Add pi packages as pinned deps (exact `0.79.x`).
250
- 2. Wire `createAgentSession` full-control style: in-memory
251
- registry/settings, our provider at the loopback baseUrl, session
252
- dir under `~/.mlx-bun/`, default tools, our system prompt.
253
- 3. Run `new InteractiveMode(runtime)` in the same process as the
254
- server.
255
- 4. **Gates** (house rule — numbers on this machine): editor latency
256
- during 12B decode subjectively clean + decode tok/s within noise
257
- of server-only; tool-call round-trip (read/bash/edit) works against
258
- the 12B; clean teardown.
259
- 5. Decide discovery policy: default isolated; `--pi-config` opt-in to
260
- the user's `~/.pi` extensions/skills/themes.
261
-
262
- ### P4 — single binary + shared event plumbing (~1 week)
263
-
264
- 1. Fold pi's asset manifest (theme JSONs, PNGs, export-html templates,
265
- photon wasm, pi-tui darwin `.node` prebuilds) into the Phase 5
266
- `bun build --compile`; patch/verify pi's asset-path resolution
267
- inside the bundle (upstream's own binary build is the existence
268
- proof).
269
- 2. CLI surface: `mlx-bun pi [pi-args]` → embedded `InteractiveMode`;
270
- `-p` → `runPrintMode`; `--mode rpc` → `runRpcMode`. Subprocess
271
- path (P2) remains as `--external-pi` fallback.
272
- 3. Web chat UI rides the same `AgentSession.subscribe()` events over
273
- WebSocket (Option 4 shape, in-process — no subprocess needed).
274
- 4. Upgrade policy: bump pi deliberately per release, re-run the P3
275
- gates as the regression suite.
276
-
277
- ### First-run starter model (folds into P2/P4; model gated on Phase 14)
278
-
279
- The first-run experience must not be "watch a progress bar for 10
280
- minutes." Plan: a sub-gigabyte **starter model** downloads first and is
281
- chatting within ~1 minute — with a docs-grounded "tour guide" system
282
- prompt (README + server-api + pi guide preloaded, so a 1B doesn't
283
- hallucinate about mlx-bun) and a banner: *"the ideal model for your Mac
284
- is downloading in the background."* The profile model streams behind it
285
- (sequenced, not parallel, so downloads don't split bandwidth); swap
286
- when ready.
287
-
288
- Measured sizes (HF tree API, 2026-06-12):
289
-
290
- | Candidate | Download | Note |
291
- |---|---|---|
292
- | gemma-4-e2b-it-OptiQ-4bit | 5.26 GB | smallest Gemma — disqualifies the family for the starter slot |
293
- | gemma-4-e4b / 12B OptiQ-4bit | 7.0 / 8.4 GB | profile models, not starters |
294
- | **Qwen3.5-0.8B-OptiQ-4bit** | **0.89 GB** | **preferred**: rides the Phase 14 Qwen port; doubles as the first tier-a parity target |
295
- | MiniCPM5-1B-OptiQ-4bit | 0.92 GB | strong (52% MMLU, +4.44 OptiQ delta) but a third architecture family — A/B later |
296
-
297
- Decisions: starter is **downloaded, never bundled** (a ~900 MB binary
298
- kills brew install); it stays on disk afterward (future
299
- speculative-decoding draft + always-works fallback). Hot-swap (or
300
- offer-to-swap) when the profile model lands is the only new runtime
301
- work. Dependency: a runnable sub-GB model requires the Phase 14 Qwen
302
- bring-up — the starter feature is the reason the 0.8B goes first there.
303
-
304
- ## Recommended sequence
305
-
306
- P1 + P2 now (days, immediate demo value, zero coupling) → P3 spike
307
- with its latency gate → P4 single-binary flagship, reusing the event
308
- plumbing for the built-in web UI.