mlx-bun 0.0.13 → 0.3.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 (427) hide show
  1. package/README.md +71 -578
  2. package/bin/mlx-bun.mjs +1 -1
  3. package/docs/README.md +91 -0
  4. package/docs/{design → archive}/hlg-sampling.md +3 -3
  5. package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
  6. package/docs/{design → archive/investigations}/colibri-glm52-port.md +1 -1
  7. package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
  8. package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
  9. package/docs/{investigations → archive/investigations}/hlg-sampling-investigation.md +1 -1
  10. package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
  11. package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
  12. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +92 -0
  13. package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
  14. package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
  15. package/docs/{planning → archive/planning}/chat-ui-vision.md +1 -1
  16. package/docs/{planning → archive/planning}/chunk-task-roadmap.md +1 -1
  17. package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +4 -4
  18. package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +1 -1
  19. package/docs/{planning → archive/planning}/release-notes-v0.0.9.md +1 -1
  20. package/docs/archive/planning/release-notes-v0.2.0.md +49 -0
  21. package/docs/{planning → archive/planning}/website-readme-pass-plan.md +1 -1
  22. package/docs/design/batching.md +569 -0
  23. package/docs/design/decode-speed-program.md +3178 -169
  24. package/docs/design/dreaming-nightly-pipeline.md +675 -282
  25. package/docs/design/generic-model-support.md +579 -334
  26. package/docs/design/kv-cache.md +680 -0
  27. package/docs/design/orpo-training.md +673 -1239
  28. package/docs/design/speculative-decoding.md +1627 -0
  29. package/docs/design/turboquant.md +2102 -0
  30. package/docs/design/unified-engine-frontier-plan.md +1831 -727
  31. package/docs/design/web-chat-redesign.md +666 -1083
  32. package/docs/planning/PRODUCT_ROADMAP.md +34 -1
  33. package/docs/planning/release-notes-v0.3.0.md +35 -0
  34. package/docs/planning/video-series.md +421 -0
  35. package/docs/reference/benchmarks.md +1162 -0
  36. package/docs/reference/cli.md +395 -149
  37. package/docs/reference/distribution.md +321 -181
  38. package/docs/reference/environment.md +348 -0
  39. package/docs/reference/glossary.md +39 -0
  40. package/docs/reference/library-api.md +580 -142
  41. package/docs/reference/memory.md +227 -64
  42. package/docs/reference/models.md +137 -6
  43. package/docs/reference/server-api.md +938 -422
  44. package/docs/reference/server-config.md +652 -320
  45. package/docs/reference/training.md +393 -254
  46. package/docs/reference/troubleshooting.md +166 -0
  47. package/package.json +10 -5
  48. package/src/admission-plan.ts +18 -0
  49. package/src/anthropic.ts +92 -3
  50. package/src/audio/decode.ts +2 -2
  51. package/src/audio/features.ts +2 -2
  52. package/src/backends/mlx/autoregressive.ts +108 -0
  53. package/src/backends/mlx/batch-group.ts +1646 -0
  54. package/src/backends/mlx/diffusion.ts +39 -0
  55. package/src/backends/mlx/draft-target.ts +47 -0
  56. package/src/backends/mlx/evaluation.ts +105 -0
  57. package/src/backends/mlx/fill-append.ts +45 -0
  58. package/src/backends/mlx/gateway-binding.ts +71 -0
  59. package/src/backends/mlx/graph.ts +38 -0
  60. package/src/backends/mlx/memory-client.ts +189 -0
  61. package/src/backends/mlx/memory-guard.ts +40 -0
  62. package/src/backends/mlx/methods.ts +90 -0
  63. package/src/backends/mlx/model-prompt.ts +164 -0
  64. package/src/backends/mlx/model-serving.ts +79 -0
  65. package/src/backends/mlx/prefill.ts +33 -0
  66. package/src/backends/mlx/request-policy.ts +20 -0
  67. package/src/backends/mlx/rollback.ts +51 -0
  68. package/src/backends/mlx/serial-executor.ts +273 -0
  69. package/src/backends/mlx/speculative.ts +114 -0
  70. package/src/backends/mlx/state-views.ts +26 -0
  71. package/src/backends/mlx/text-engine.ts +73 -0
  72. package/src/cli.ts +189 -61
  73. package/src/client.ts +66 -0
  74. package/src/config.ts +21 -4
  75. package/src/contracts/completion.ts +16 -0
  76. package/src/contracts/execution.ts +49 -0
  77. package/src/contracts/generation.ts +103 -0
  78. package/src/contracts/host.ts +7 -0
  79. package/src/contracts/jobs.ts +66 -0
  80. package/src/contracts/pi-provider.ts +30 -0
  81. package/src/contracts/pi.ts +259 -0
  82. package/src/contracts/resources.ts +18 -0
  83. package/src/contracts/scheduling.ts +27 -0
  84. package/src/contracts/tsconfig.json +14 -0
  85. package/src/diffusion/diffusion-generate.ts +218 -153
  86. package/src/embed.ts +1 -1
  87. package/src/engine/admission.ts +59 -0
  88. package/src/engine/cancellation.ts +38 -0
  89. package/src/engine/engine.ts +56 -0
  90. package/src/engine/execution-coordinator.ts +70 -0
  91. package/src/engine/execution-plan.ts +51 -0
  92. package/src/engine/resources.ts +42 -0
  93. package/src/engine/scheduler.ts +67 -0
  94. package/src/engine/session.ts +247 -0
  95. package/src/eval/README.md +44 -1
  96. package/src/eval/kl.ts +263 -23
  97. package/src/eval/reference-logits.ts +207 -0
  98. package/src/eval/runner.ts +10 -79
  99. package/src/eval/tasks/bfcl.ts +2 -1
  100. package/src/eval/tasks/gsm8k.ts +2 -1
  101. package/src/eval/tasks/hashhop.ts +2 -1
  102. package/src/eval/tasks/humaneval.ts +5 -4
  103. package/src/eval/tasks/ifeval.ts +2 -1
  104. package/src/eval/tasks/mmlu.ts +2 -1
  105. package/src/expert-io.ts +3 -1
  106. package/src/expert-offload.ts +3 -1
  107. package/src/fill/echo-index.ts +188 -0
  108. package/src/fill/fill-session.ts +452 -0
  109. package/src/fill/proposal.ts +68 -0
  110. package/src/fill/schema-rows.ts +506 -0
  111. package/src/fill/tool-boundary.ts +103 -0
  112. package/src/fit.ts +24 -43
  113. package/src/generate.ts +740 -337
  114. package/src/grammar.ts +14 -8
  115. package/src/harness-pi.ts +15 -34
  116. package/src/hub-rest.ts +4 -4
  117. package/src/index.ts +27 -0
  118. package/src/inference/denoising.ts +17 -0
  119. package/src/inference/graph.ts +33 -0
  120. package/src/inference/prefill.ts +39 -0
  121. package/src/inference/rollback.ts +7 -0
  122. package/src/jobs/db.ts +4 -0
  123. package/src/jobs/index.ts +2 -0
  124. package/src/jobs/job-entry.ts +15 -14
  125. package/src/jobs/runner.ts +98 -13
  126. package/src/jobs/task-client.ts +19 -0
  127. package/src/jobs/types.ts +2 -58
  128. package/src/kv-scheme.ts +199 -0
  129. package/src/kv-store.ts +459 -234
  130. package/src/lab/README.md +18 -0
  131. package/src/{assets → lab/curve}/curve-designer.html +2 -2
  132. package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
  133. package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +7 -5
  134. package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
  135. package/src/library.ts +40 -0
  136. package/src/lora.ts +18 -0
  137. package/src/media-fetch.ts +20 -4
  138. package/src/memory/article.ts +1 -1
  139. package/src/memory/chunk.ts +1 -1
  140. package/src/memory/model.ts +32 -170
  141. package/src/memory/prompts.ts +1 -1
  142. package/src/memory/rest.ts +1 -1
  143. package/src/memory/schedule.ts +1 -1
  144. package/src/memory/stages.ts +4 -1
  145. package/src/memory/vault.ts +3 -4
  146. package/src/mlx/array.ts +9 -10
  147. package/src/mlx/compile.ts +12 -2
  148. package/src/mlx/ffi.ts +66 -22
  149. package/src/mlx/materialize.ts +23 -0
  150. package/src/mlx/metal-kernel.ts +10 -11
  151. package/src/mlx/ops.ts +64 -19
  152. package/src/mlx/quantized-rows.ts +36 -0
  153. package/src/mlx/token-bitmask.ts +52 -0
  154. package/src/mlx/turboquant-kv-decode.ts +82 -0
  155. package/src/mlx/turboquant-kv-inverse.ts +122 -0
  156. package/src/mlx/turboquant-ops.ts +33 -3
  157. package/src/mlx/turboquant-tables.ts +2 -2
  158. package/src/model/batched-mask.ts +9 -3
  159. package/src/model/batched-quant.ts +2 -2
  160. package/src/model/batched-rotating-quant.ts +45 -99
  161. package/src/model/batched-rotating-state.ts +73 -0
  162. package/src/model/batched-rotating.ts +57 -106
  163. package/src/model/batched-row-storage.ts +127 -0
  164. package/src/model/compiled-decode.ts +4 -3
  165. package/src/model/diffusion-gemma.ts +8 -8
  166. package/src/model/factory.ts +87 -49
  167. package/src/model/fingerprint.ts +1 -1
  168. package/src/model/flash-attention.ts +3 -3
  169. package/src/model/gemma4-base.ts +187 -17
  170. package/src/model/gemma4.ts +6 -6
  171. package/src/model/generated/gemma4-12b.ts +52 -148
  172. package/src/model/generated/gemma4-26b.ts +34 -94
  173. package/src/model/generated/gemma4-e4b.ts +28 -76
  174. package/src/model/glm52-cache.ts +19 -9
  175. package/src/model/glm52-dsa.ts +13 -9
  176. package/src/model/glm52-memory.ts +28 -1
  177. package/src/model/implementation.ts +69 -0
  178. package/src/model/minicpm5.ts +7 -8
  179. package/src/model/profile.ts +443 -0
  180. package/src/model/qwen-append.ts +12 -0
  181. package/src/model/qwen-conv.ts +52 -0
  182. package/src/model/qwen3-delta.ts +98 -2
  183. package/src/model/qwen3-mrope.ts +252 -0
  184. package/src/model/qwen3_5-checkpoint.ts +164 -0
  185. package/src/model/qwen3_5.ts +336 -60
  186. package/src/model/support.ts +1 -1
  187. package/src/model/trellis-balanced-scatter.ts +51 -0
  188. package/src/model/trellis-linear.ts +672 -0
  189. package/src/model/trellis-shared-m.ts +151 -0
  190. package/src/model/trellis-shared-scatter.ts +144 -0
  191. package/src/model/trellis-splitk-prefill.ts +158 -0
  192. package/src/model/trellis-tiled-prefill.ts +136 -0
  193. package/src/model/trellis-vector-expand.ts +62 -0
  194. package/src/model/trellis-wide-prefill.ts +94 -0
  195. package/src/model/universal/dense.ts +1 -1
  196. package/src/model/universal/modules.ts +8 -1
  197. package/src/native/frame_extract.swift +140 -0
  198. package/src/native-pack.ts +15 -7
  199. package/src/pi-provider.ts +6 -64
  200. package/src/pi-web.ts +14 -320
  201. package/src/prompt-cache.ts +97 -54
  202. package/src/quantize/allocator.ts +1 -1
  203. package/src/quantize/atomic-output.ts +38 -0
  204. package/src/quantize/calibration.ts +2 -1
  205. package/src/quantize/config-writer.ts +16 -3
  206. package/src/quantize/index.ts +28 -1
  207. package/src/quantize/job.ts +11 -0
  208. package/src/quantize/quantizer.ts +265 -100
  209. package/src/quantize/rotate.ts +603 -0
  210. package/src/quantize/safetensors-writer.ts +79 -1
  211. package/src/quantize/sensitivity.ts +41 -59
  212. package/src/quantize/trellis.ts +586 -0
  213. package/src/quantize/weight-transform.ts +292 -0
  214. package/src/responses.ts +130 -3
  215. package/src/runtime-config.ts +81 -0
  216. package/src/sampler.ts +276 -4
  217. package/src/serve/admin-routes.ts +184 -0
  218. package/src/serve/aux-routes.ts +132 -0
  219. package/src/serve/batch-scheduler.ts +8 -1558
  220. package/src/serve/chat-request.ts +391 -0
  221. package/src/serve/chat-stage.ts +195 -0
  222. package/src/serve/checkpoint-identity.ts +64 -0
  223. package/src/serve/completion-executor.ts +354 -0
  224. package/src/serve/completion-sink.ts +157 -0
  225. package/src/serve/discovery-routes.ts +204 -0
  226. package/src/serve/generation-gateway.ts +211 -243
  227. package/src/serve/http.ts +159 -0
  228. package/src/serve/inference-request.ts +79 -0
  229. package/src/serve/isolate.ts +297 -105
  230. package/src/serve/kv-budget.ts +14 -0
  231. package/src/serve/lab-routes.ts +341 -0
  232. package/src/serve/lane-registry.ts +2 -1
  233. package/src/serve/model-admin-routes.ts +155 -0
  234. package/src/serve/model-binding.ts +43 -0
  235. package/src/serve/model-host.ts +512 -0
  236. package/src/serve/openai-wire.ts +103 -0
  237. package/src/serve/parent-application.ts +56 -0
  238. package/src/serve/pipeline.ts +33 -0
  239. package/src/serve/preparation.ts +33 -0
  240. package/src/serve/prompt-response-trace.ts +147 -0
  241. package/src/serve/request-plan.ts +162 -0
  242. package/src/serve/request-prep.ts +346 -0
  243. package/src/serve/response-lease.ts +24 -0
  244. package/src/serve/responses-client.ts +69 -0
  245. package/src/serve/session-completion-engine.ts +110 -0
  246. package/src/serve/session-search.ts +1 -1
  247. package/src/serve/static-routes.ts +101 -0
  248. package/src/serve/text-completion-stage.ts +104 -0
  249. package/src/serve/token-streams.ts +519 -0
  250. package/src/server.ts +523 -3551
  251. package/src/spec/assistant-source.ts +10 -44
  252. package/src/spec/deepspec-source.ts +6 -6
  253. package/src/spec/dflash-source.ts +9 -8
  254. package/src/spec/dspark/ab-stats.ts +3 -3
  255. package/src/spec/dspark/calibration.ts +2 -2
  256. package/src/spec/dspark/deepspec-module.ts +2 -2
  257. package/src/spec/dspark/generate-dflash.ts +2 -2
  258. package/src/spec/dspark/generate.ts +2 -2
  259. package/src/spec/dspark/loader.ts +1 -1
  260. package/src/spec/dspark/module-dflash.ts +5 -4
  261. package/src/spec/dspark/module.ts +3 -3
  262. package/src/spec/dspark/quantize-drafter.ts +1 -1
  263. package/src/spec/generate.ts +1 -1
  264. package/src/spec/glm52-mtp-source.ts +9 -1
  265. package/src/spec/ngram-source.ts +1 -1
  266. package/src/spec/prefix-state.ts +45 -0
  267. package/src/spec/qwen-mtp-source.ts +528 -0
  268. package/src/spec/serve-loop.ts +179 -213
  269. package/src/spec/source.ts +42 -10
  270. package/src/spec/two-model.ts +1 -1
  271. package/src/ssd-cache.ts +95 -24
  272. package/src/ssd-durability.ts +207 -0
  273. package/src/tool-call.ts +51 -14
  274. package/src/train/flash-cce.ts +14 -13
  275. package/src/train/forward.ts +38 -1
  276. package/src/train/loss.ts +3 -2
  277. package/src/train/prefix-shared.ts +5 -1
  278. package/src/train/segmented.ts +9 -6
  279. package/src/train/trainer.ts +9 -8
  280. package/src/vision/preprocess.ts +1 -1
  281. package/src/vision/prompt.ts +48 -2
  282. package/src/vision/qwen3vl-preprocess.ts +409 -0
  283. package/src/vision/qwen3vl-prompt.ts +196 -0
  284. package/src/vision/qwen3vl-tower.ts +555 -0
  285. package/src/vision/video-frames.ts +148 -0
  286. package/src/web/app.html +1 -1
  287. package/src/web/app.js +15 -6
  288. package/src/web/src/adapters-panel.ts +3 -3
  289. package/src/web/src/assistant.ts +2 -36
  290. package/src/web/src/chat.ts +16 -9
  291. package/src/web/src/composer.ts +4 -4
  292. package/src/web/src/hub.ts +1 -1
  293. package/src/web/src/markdown.ts +0 -0
  294. package/src/web/src/memory-panel.ts +1 -1
  295. package/src/web/src/model-picker.ts +1 -1
  296. package/src/web/src/palette.ts +1 -1
  297. package/src/web/src/protocol.ts +3 -39
  298. package/src/web/src/sessions.ts +1 -1
  299. package/src/web/src/ui-catalog.ts +4 -18
  300. package/src/web-assets.ts +47 -0
  301. package/src/weights.ts +134 -33
  302. package/docs/archive/mlx-bun-lab-report.html +0 -275
  303. package/docs/archive/wwdc-mlx-bun.html +0 -848
  304. package/docs/design/adapters-end-to-end.md +0 -205
  305. package/docs/design/batching-perf-path.md +0 -255
  306. package/docs/design/batching-v2-plan.md +0 -529
  307. package/docs/design/bucketing-stage.md +0 -197
  308. package/docs/design/compat-cli-surface-design.md +0 -230
  309. package/docs/design/docs-reorg-plan.md +0 -165
  310. package/docs/design/dspark-serving-program.md +0 -371
  311. package/docs/design/dspark-speculative-decoding.md +0 -268
  312. package/docs/design/grammar-spec-batching-integration.md +0 -301
  313. package/docs/design/memory-inference-path.md +0 -422
  314. package/docs/design/memory-synthesis.md +0 -287
  315. package/docs/design/memory-system.md +0 -237
  316. package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
  317. package/docs/design/omlx-adoption-map.md +0 -98
  318. package/docs/design/orpo-dynamic-lambda.md +0 -220
  319. package/docs/design/orpo-future-enhancements.md +0 -340
  320. package/docs/design/paged-kv-cache.md +0 -214
  321. package/docs/design/parallel-slots.md +0 -567
  322. package/docs/design/parity-tier-dag.md +0 -161
  323. package/docs/design/repo-cleanup-plan.md +0 -189
  324. package/docs/design/runtime-isolation.md +0 -263
  325. package/docs/design/segmented-backward-training.md +0 -543
  326. package/docs/design/spec-decode-larger-targets.md +0 -229
  327. package/docs/design/ssd-kv-cold-tier.md +0 -288
  328. package/docs/design/structured-output.md +0 -484
  329. package/docs/design/tauri-desktop-app.md +0 -127
  330. package/docs/design/the-dreaming-master-plan.md +0 -445
  331. package/docs/design/turboquant-kv.md +0 -235
  332. package/docs/design/w4a16-compute-precision-spike.md +0 -232
  333. package/docs/design/web-chat-beat-matrix.md +0 -315
  334. package/docs/design/write-pipeline-entity.md +0 -468
  335. package/docs/investigations/curve-runs/bisector-route.json +0 -98
  336. package/docs/investigations/curve-runs/bisector-trace.json +0 -1393
  337. package/docs/investigations/curve-runs/curve-terrain.json +0 -1179
  338. package/docs/investigations/curve-runs/curve-terrain.svg +0 -42
  339. package/docs/investigations/hlg-ab.html +0 -34
  340. package/docs/investigations/hlg-explorer.html +0 -238
  341. package/docs/investigations/hlg-figs/cliff.svg +0 -1
  342. package/docs/investigations/hlg-figs/cross.svg +0 -1
  343. package/docs/investigations/hlg-figs/edges.svg +0 -1
  344. package/docs/investigations/hlg-figs/k20-grids.svg +0 -1
  345. package/docs/investigations/hlg-figs/k20-peaks.svg +0 -1
  346. package/docs/investigations/hlg-figs/lw-curve.svg +0 -1
  347. package/docs/investigations/hlg-figs/terrain.svg +0 -1
  348. package/docs/investigations/hlg-report.html +0 -262
  349. package/docs/investigations/hlg-runs/hlg-ab.json +0 -149
  350. package/docs/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
  351. package/docs/investigations/hlg-runs/hlg-blind.json +0 -107
  352. package/docs/investigations/hlg-runs/hlg-cliff.json +0 -197
  353. package/docs/investigations/hlg-runs/hlg-cross.json +0 -505
  354. package/docs/investigations/hlg-runs/hlg-edge.json +0 -388
  355. package/docs/investigations/hlg-runs/hlg-eval1.json +0 -25
  356. package/docs/investigations/hlg-runs/hlg-frontier.json +0 -86
  357. package/docs/investigations/hlg-runs/hlg-grid.json +0 -242
  358. package/docs/investigations/hlg-runs/hlg-grid2.json +0 -343
  359. package/docs/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
  360. package/docs/investigations/hlg-runs/hlg-map.json +0 -383
  361. package/docs/investigations/hlg-runs/run0-original.log +0 -159
  362. package/docs/investigations/hlg-runs/runA-recommended.log +0 -131
  363. package/docs/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
  364. package/docs/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
  365. package/docs/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
  366. package/docs/investigations/hlg-runs/runAD-ab-samples.log +0 -8
  367. package/docs/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
  368. package/docs/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
  369. package/docs/investigations/hlg-runs/runAG-eval-config2.log +0 -16
  370. package/docs/investigations/hlg-runs/runB-gain-variants.log +0 -192
  371. package/docs/investigations/hlg-runs/runC-pivots.log +0 -162
  372. package/docs/investigations/hlg-runs/runD-oetf.log +0 -132
  373. package/docs/investigations/hlg-runs/runE-eotf.log +0 -162
  374. package/docs/investigations/hlg-runs/runF-shaper-working.log +0 -86
  375. package/docs/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
  376. package/docs/investigations/hlg-runs/runH-wsweep.log +0 -176
  377. package/docs/investigations/hlg-runs/runI-asweep.log +0 -176
  378. package/docs/investigations/hlg-runs/runJ-knobmap.log +0 -49
  379. package/docs/investigations/hlg-runs/runK-frontier.log +0 -19
  380. package/docs/investigations/hlg-runs/runL-widemap.log +0 -65
  381. package/docs/investigations/hlg-runs/runM-frontier-emb.log +0 -15
  382. package/docs/investigations/hlg-runs/runN-verify.log +0 -116
  383. package/docs/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
  384. package/docs/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
  385. package/docs/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
  386. package/docs/investigations/hlg-runs/runR-blind-transcript.log +0 -79
  387. package/docs/investigations/hlg-runs/runS-cross-coherence.log +0 -33
  388. package/docs/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
  389. package/docs/investigations/hlg-runs/runU-cross-12b.log +0 -33
  390. package/docs/investigations/hlg-runs/runV-lw-e4b.log +0 -22
  391. package/docs/investigations/hlg-runs/runW-lw-12b.log +0 -22
  392. package/docs/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
  393. package/docs/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
  394. package/docs/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
  395. package/docs/planning/IDEAS.md +0 -69
  396. package/docs/reference/embedding.md +0 -197
  397. package/docs/reference/features-matrix.md +0 -100
  398. package/docs/reference/orpo-quickstart.md +0 -135
  399. package/src/flags.ts +0 -13
  400. /package/docs/{investigations → archive/investigations}/chunk-finetune-experiment.md +0 -0
  401. /package/docs/{investigations → archive/investigations}/colibri-oracle-pin.md +0 -0
  402. /package/docs/{investigations → archive/investigations}/curve-bisector-routing.md +0 -0
  403. /package/docs/{investigations → archive/investigations}/decode-roofline-lookagain.md +0 -0
  404. /package/docs/{investigations → archive/investigations}/dspark-handoff.md +0 -0
  405. /package/docs/{investigations → archive/investigations}/expert-offload-single-user-moe.md +0 -0
  406. /package/docs/{investigations → archive/investigations}/indexshare-performance-spike.md +0 -0
  407. /package/docs/{investigations → archive/investigations}/kernel-perf-review-2026-07.md +0 -0
  408. /package/docs/{investigations → archive/investigations}/lab-build-journal.md +0 -0
  409. /package/docs/{investigations → archive/investigations}/openwiki-evaluation.md +0 -0
  410. /package/docs/{investigations → archive/investigations}/orpo-base-uf-experiment-and-directions.md +0 -0
  411. /package/docs/{investigations → archive/investigations}/orpo-flash-cce-pin-leak.md +0 -0
  412. /package/docs/{investigations → archive/investigations}/orpo-uf-testing-handoff.md +0 -0
  413. /package/docs/{investigations → archive/investigations}/pi-builtin-investigation.md +0 -0
  414. /package/docs/{investigations → archive/investigations}/segmented-backward-handoff.md +0 -0
  415. /package/docs/{investigations → archive/investigations}/starter-model-port-handoff.md +0 -0
  416. /package/docs/{investigations → archive/investigations}/steel-flash-cce-handoff.md +0 -0
  417. /package/docs/{investigations → archive/investigations}/trainer-validation-experiment.md +0 -0
  418. /package/docs/{planning → archive/planning}/chat-ui-vision-memory-first.md +0 -0
  419. /package/docs/{planning → archive/planning}/journal.md +0 -0
  420. /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
  421. /package/docs/{planning → archive/planning}/release-notes-v0.0.10.md +0 -0
  422. /package/docs/{planning → archive/planning}/release-notes-v0.0.11.md +0 -0
  423. /package/docs/{planning → archive/planning}/release-notes-v0.0.12.md +0 -0
  424. /package/docs/{planning → archive/planning}/release-notes-v0.0.13.md +0 -0
  425. /package/docs/{planning → archive/planning}/web-ui-pass-plan.md +0 -0
  426. /package/{docs/investigations → src/serve/assets}/curve-terrain.html +0 -0
  427. /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
@@ -0,0 +1,354 @@
1
+ import type {
2
+ GenerateOptions,
3
+ GenerateStats,
4
+ TokenLogprobs,
5
+ } from "../generate";
6
+ import type {
7
+ GenerationMechanism,
8
+ GenerationPlacement,
9
+ OnToken,
10
+ RequestShape,
11
+ Vision,
12
+ } from "./generation-gateway";
13
+ import {
14
+ type CompletionEvent,
15
+ type CompletionFinishReason,
16
+ type CompletionFlowControl,
17
+ type CompletionResult,
18
+ type CompletionSinkOptions,
19
+ CompletionSink,
20
+ type CompletionToolCall,
21
+ } from "./completion-sink";
22
+ import { recordLane, type Lane } from "./lane-registry";
23
+ import {
24
+ planRequest,
25
+ type RequestPlan,
26
+ type RequestPlanInput,
27
+ type RequestRejection,
28
+ } from "./request-plan";
29
+ import type { PromptResponseTrace } from "./prompt-response-trace";
30
+ import { cleanupFailure } from "../engine/resources";
31
+
32
+ export interface CompletionEngine {
33
+ place(shape: RequestShape, options?: GenerateOptions): GenerationPlacement;
34
+ run(
35
+ promptIds: number[],
36
+ options: GenerateOptions & { stopSequences?: string[] },
37
+ onToken: OnToken,
38
+ vision: Vision | undefined,
39
+ shape: RequestShape,
40
+ placement: GenerationPlacement,
41
+ signal?: AbortSignal,
42
+ trace?: PromptResponseTrace,
43
+ ): Promise<GenerateStats>;
44
+ }
45
+
46
+ export interface CompletionPreparation {
47
+ requestId: string;
48
+ plan: RequestPlanInput;
49
+ vision?: Vision;
50
+ pipeline: Omit<CompletionSinkOptions, "flowControl">;
51
+ createFlowControl?(placement: CompletionPlacement):
52
+ | CompletionSinkOptions["flowControl"];
53
+ onPlacement?(placement: CompletionPlacement): void;
54
+ idToToken(id: number): string;
55
+ }
56
+
57
+ export interface CompletionPlacement {
58
+ mechanism: GenerationMechanism;
59
+ lane: Lane;
60
+ shape: RequestShape;
61
+ }
62
+
63
+ interface PreparedData extends Omit<CompletionPreparation, "plan"> {
64
+ plan: RequestPlan;
65
+ stream: boolean;
66
+ requestedMaxTokens: number;
67
+ }
68
+
69
+ const preparedBrand: unique symbol = Symbol("PreparedCompletion");
70
+
71
+ /** A single-use completion declaration. Protocol adapters can create one but
72
+ * cannot inspect or rewrite the resolved execution plan after preparation. */
73
+ export interface PreparedCompletion {
74
+ readonly [preparedBrand]: true;
75
+ }
76
+
77
+ const preparedData = new WeakMap<PreparedCompletion, PreparedData>();
78
+
79
+ export function prepareCompletion(data: CompletionPreparation): PreparedCompletion {
80
+ const planned = planRequest(data.plan);
81
+ if (!planned.ok) {
82
+ planned.dispose();
83
+ throw new CompletionRejected(planned);
84
+ }
85
+ const prepared = Object.freeze({ [preparedBrand]: true }) as PreparedCompletion;
86
+ preparedData.set(prepared, {
87
+ requestId: data.requestId,
88
+ plan: planned,
89
+ stream: data.plan.stream,
90
+ requestedMaxTokens: data.plan.requestedMaxTokens,
91
+ ...(data.vision ? { vision: data.vision } : {}),
92
+ pipeline: data.pipeline,
93
+ ...(data.createFlowControl
94
+ ? { createFlowControl: data.createFlowControl }
95
+ : {}),
96
+ ...(data.onPlacement ? { onPlacement: data.onPlacement } : {}),
97
+ idToToken: data.idToToken,
98
+ });
99
+ return prepared;
100
+ }
101
+
102
+ export interface CompletionControl {
103
+ signal?: AbortSignal;
104
+ trace?: PromptResponseTrace;
105
+ onEvents?(events: readonly CompletionEvent[]):
106
+ | void
107
+ | false
108
+ | Promise<void | false>;
109
+ /** Receives one live, read-only usage view before execution. Retain the
110
+ * reference to close an errored protocol stream with accumulated usage.
111
+ * The executor updates it in place, avoiding per-token callback/allocation
112
+ * work on the decode path. */
113
+ onUsageProgress?(usage: Readonly<CompletionUsage>): void;
114
+ }
115
+
116
+ export interface CompletionUsage {
117
+ promptTokens: number;
118
+ cachedTokens: number;
119
+ completionTokens: number;
120
+ totalTokens: number;
121
+ speculation?: GenerateStats["spec"];
122
+ /** Token fast-forwarding telemetry (serial lane, MLX_BUN_FILL=strict). */
123
+ fill?: GenerateStats["fill"];
124
+ }
125
+
126
+ export interface CompletionSummary {
127
+ content: string;
128
+ reasoning: string;
129
+ toolCalls: CompletionToolCall[];
130
+ stopped: boolean;
131
+ finishReason: CompletionFinishReason;
132
+ lane: Lane;
133
+ usage: CompletionUsage;
134
+ logprobs: { content: Record<string, unknown>[] } | null;
135
+ }
136
+
137
+ export class CompletionRejected extends Error {
138
+ readonly status: number;
139
+ readonly error: RequestRejection["error"];
140
+
141
+ constructor(rejection: RequestRejection) {
142
+ super(rejection.error.message);
143
+ this.name = "CompletionRejected";
144
+ this.status = rejection.status;
145
+ this.error = rejection.error;
146
+ }
147
+ }
148
+
149
+ class LogprobsCollector {
150
+ readonly #tokens: number[] = [];
151
+ readonly #tokenLogprobs: number[] = [];
152
+ readonly #topTokens: { id: number; token: string; logprob: number }[][] = [];
153
+
154
+ constructor(
155
+ private readonly wantLogprobs: boolean,
156
+ private readonly topK: number,
157
+ private readonly idToToken: (id: number) => string,
158
+ ) {}
159
+
160
+ push(token: number, info?: TokenLogprobs): void {
161
+ this.#tokens.push(token);
162
+ if (this.wantLogprobs) this.#tokenLogprobs.push(info?.logprob ?? NaN);
163
+ if (this.topK > 0) {
164
+ this.#topTokens.push(
165
+ (info?.top ?? []).map((candidate) => ({
166
+ id: candidate.id,
167
+ token: this.idToToken(candidate.id),
168
+ logprob: candidate.logprob,
169
+ })),
170
+ );
171
+ }
172
+ }
173
+
174
+ payload(): { content: Record<string, unknown>[] } | null {
175
+ if (this.#topTokens.length) {
176
+ return {
177
+ content: this.#topTokens.map((tokens) =>
178
+ tokens.length ? { ...tokens[0]!, top_logprobs: tokens } : {},
179
+ ),
180
+ };
181
+ }
182
+ if (this.#tokenLogprobs.length) {
183
+ return {
184
+ content: this.#tokens.map((id, index) => ({
185
+ id,
186
+ logprob: this.#tokenLogprobs[index]!,
187
+ })),
188
+ };
189
+ }
190
+ return null;
191
+ }
192
+ }
193
+
194
+ function initialLane(mechanism: GenerationMechanism, shape: RequestShape): Lane {
195
+ if (mechanism === "continuous") return "batched";
196
+ return shape.hasDraft ? "serial+spec" : "serial";
197
+ }
198
+
199
+ function finalLane(
200
+ mechanism: GenerationMechanism,
201
+ lane: Lane,
202
+ stats: GenerateStats,
203
+ ): Lane {
204
+ if (mechanism === "continuous") return "batched";
205
+ return stats.spec ? "serial+spec" : "serial";
206
+ }
207
+
208
+ function finishReason(
209
+ result: CompletionResult,
210
+ stats: GenerateStats,
211
+ maxTokens: number,
212
+ ): CompletionFinishReason {
213
+ if (result.toolCalls.length) return "tool_calls";
214
+ if (result.stopped) return "stop";
215
+ return stats.finishReason ?? (stats.generatedTokens >= maxTokens ? "length" : "stop");
216
+ }
217
+
218
+ function combineControl(
219
+ sinkControl: CompletionFlowControl,
220
+ eventControl: void | false | Promise<void | false>,
221
+ ): void | false | Promise<void | false> {
222
+ if (sinkControl === false || eventControl === false) return false;
223
+ if (!(sinkControl instanceof Promise) && !(eventControl instanceof Promise))
224
+ return undefined;
225
+ return Promise.all([sinkControl, eventControl]).then((values) =>
226
+ values.includes(false) ? false : undefined,
227
+ );
228
+ }
229
+
230
+ /** Owns one completion attempt from admission through terminal accounting.
231
+ * Model math and scheduling policy remain in the supplied CompletionEngine. */
232
+ export class CompletionExecutor {
233
+ constructor(private readonly engine: CompletionEngine) {}
234
+
235
+ async execute(
236
+ prepared: PreparedCompletion,
237
+ control: CompletionControl = {},
238
+ ): Promise<CompletionSummary> {
239
+ const input = preparedData.get(prepared);
240
+ if (!input) throw new Error("prepared completion has already been executed");
241
+ preparedData.delete(prepared);
242
+
243
+ const planned = input.plan;
244
+ const closeCompletion = control.trace?.begin("completion.total");
245
+ const usageProgress: CompletionUsage | null = control.onUsageProgress
246
+ ? {
247
+ promptTokens: planned.promptIds.length,
248
+ cachedTokens: 0,
249
+ completionTokens: 0,
250
+ totalTokens: planned.promptIds.length,
251
+ }
252
+ : null;
253
+
254
+ try {
255
+ if (usageProgress) control.onUsageProgress!(usageProgress);
256
+ const closePlacement = control.trace?.begin("completion.placement");
257
+ const enginePlacement = this.engine.place(planned.shape, planned.options);
258
+ closePlacement?.();
259
+ if (enginePlacement.shape !== planned.shape)
260
+ throw new Error("generation placement does not belong to this request shape");
261
+ const mechanism = enginePlacement.mechanism;
262
+ const lane = enginePlacement.execution
263
+ ? (mechanism === "continuous" ? "batched" : enginePlacement.execution.method === "speculative" ? "serial+spec" : "serial")
264
+ : initialLane(mechanism, planned.shape);
265
+ recordLane(input.requestId, lane);
266
+ const placement = { mechanism, lane, shape: planned.shape };
267
+ input.onPlacement?.(placement);
268
+ const flowControl = input.createFlowControl?.(placement);
269
+ const sink = new CompletionSink({
270
+ ...input.pipeline,
271
+ ...(flowControl ? { flowControl } : {}),
272
+ });
273
+ const logprobs = planned.captureLogprobs
274
+ ? new LogprobsCollector(
275
+ planned.wantLogprobs,
276
+ planned.topLogprobs,
277
+ input.idToToken,
278
+ )
279
+ : null;
280
+ control.signal?.throwIfAborted();
281
+ planned.transferOwnership();
282
+
283
+ const consumeToken: OnToken = (token, tokenLogprobs) => {
284
+ logprobs?.push(token, tokenLogprobs);
285
+ const pushed = sink.push(token);
286
+ const observed = pushed.events.length
287
+ ? control.onEvents?.(pushed.events)
288
+ : undefined;
289
+ return combineControl(pushed.control, observed);
290
+ };
291
+ const onToken: OnToken = usageProgress
292
+ ? (token, tokenLogprobs) => {
293
+ usageProgress.completionTokens++;
294
+ usageProgress.totalTokens++;
295
+ return consumeToken(token, tokenLogprobs);
296
+ }
297
+ : consumeToken;
298
+ const stats = await this.engine.run(
299
+ planned.promptIds,
300
+ planned.options,
301
+ onToken,
302
+ input.vision,
303
+ planned.shape,
304
+ enginePlacement,
305
+ control.signal,
306
+ control.trace,
307
+ );
308
+
309
+ if (input.stream) control.signal?.throwIfAborted();
310
+ const result = sink.finish();
311
+ if (result.events.length) await control.onEvents?.(result.events);
312
+
313
+ const resolvedLane = finalLane(mechanism, lane, stats);
314
+ if (resolvedLane !== lane) recordLane(input.requestId, resolvedLane);
315
+ if (usageProgress) {
316
+ usageProgress.promptTokens = stats.promptTokens;
317
+ usageProgress.cachedTokens = stats.cachedTokens;
318
+ usageProgress.completionTokens = stats.generatedTokens;
319
+ usageProgress.totalTokens = stats.promptTokens + stats.generatedTokens;
320
+ if (stats.spec) usageProgress.speculation = stats.spec;
321
+ else delete usageProgress.speculation;
322
+ if (stats.fill) usageProgress.fill = stats.fill;
323
+ else delete usageProgress.fill;
324
+ }
325
+ const summary = {
326
+ content: result.content,
327
+ reasoning: result.reasoning,
328
+ toolCalls: result.toolCalls,
329
+ stopped: result.stopped,
330
+ finishReason: finishReason(
331
+ result,
332
+ stats,
333
+ planned.options.maxTokens ?? input.requestedMaxTokens,
334
+ ),
335
+ lane: resolvedLane,
336
+ usage: {
337
+ promptTokens: stats.promptTokens,
338
+ cachedTokens: stats.cachedTokens,
339
+ completionTokens: stats.generatedTokens,
340
+ totalTokens: stats.promptTokens + stats.generatedTokens,
341
+ ...(stats.spec ? { speculation: stats.spec } : {}),
342
+ ...(stats.fill ? { fill: stats.fill } : {}),
343
+ },
344
+ logprobs: logprobs?.payload() ?? null,
345
+ };
346
+ planned.dispose(); // retained preparation reservations outlive the native run
347
+ closeCompletion?.();
348
+ return summary;
349
+ } catch (error) {
350
+ closeCompletion?.();
351
+ cleanupFailure(error, () => planned.dispose());
352
+ }
353
+ }
354
+ }
@@ -0,0 +1,157 @@
1
+ export interface CompletionToolCall {
2
+ id: string;
3
+ type: "function";
4
+ function: { name: string; arguments: string };
5
+ }
6
+
7
+ export type CompletionEvent =
8
+ | { type: "content"; text: string }
9
+ | { type: "reasoning"; text: string }
10
+ | { type: "tool_calls"; calls: CompletionToolCall[] };
11
+
12
+ export type CompletionFlowControl = false | Promise<void> | undefined;
13
+
14
+ export interface CompletionPush {
15
+ events: CompletionEvent[];
16
+ control: CompletionFlowControl;
17
+ }
18
+
19
+ export interface CompletionResult {
20
+ events: CompletionEvent[];
21
+ content: string;
22
+ reasoning: string;
23
+ toolCalls: CompletionToolCall[];
24
+ stopped: boolean;
25
+ }
26
+
27
+ export type CompletionFinishReason = "stop" | "length" | "tool_calls";
28
+
29
+ export interface CompletionStreamProtocol {
30
+ start(): string[];
31
+ addEvents(events: CompletionEvent[]): string[];
32
+ finish(reason: CompletionFinishReason, usage: Record<string, unknown>): string[];
33
+ error(message: string): string[];
34
+ }
35
+
36
+ export interface TokenTextRouter {
37
+ push(token: number): string;
38
+ flush(): string;
39
+ takeReasoning(): string;
40
+ toolCalls(): CompletionToolCall[];
41
+ }
42
+
43
+ export interface TextStopper {
44
+ readonly stopped: boolean;
45
+ push(text: string): string;
46
+ flush(): string;
47
+ }
48
+
49
+ export interface ThinkingSplitter {
50
+ push(text: string): { content: string; reasoning: string };
51
+ flush(): { content: string; reasoning: string };
52
+ }
53
+
54
+ export interface CompletionSinkOptions {
55
+ router: TokenTextRouter;
56
+ stopper: TextStopper;
57
+ thinking: ThinkingSplitter;
58
+ collectToolCalls: boolean;
59
+ flowControl?: (emitted: boolean) => CompletionFlowControl;
60
+ }
61
+
62
+ /** One generated-token sink for every text-serving surface.
63
+ *
64
+ * Chat uses the full router → stop matcher → thinking splitter stack.
65
+ * Text completions use the same sink with a plain router, thinking disabled,
66
+ * and tool-call collection off. `push()` returns both semantic events and the
67
+ * generation callback's control signal: false halts decode; a Promise yields
68
+ * before the next token. */
69
+ export class CompletionSink {
70
+ readonly #router: TokenTextRouter;
71
+ readonly #stopper: TextStopper;
72
+ readonly #thinking: ThinkingSplitter;
73
+ readonly #collectToolCalls: boolean;
74
+ readonly #flowControl?: (emitted: boolean) => CompletionFlowControl;
75
+ #content = "";
76
+ #reasoning = "";
77
+
78
+ constructor(options: CompletionSinkOptions) {
79
+ this.#router = options.router;
80
+ this.#stopper = options.stopper;
81
+ this.#thinking = options.thinking;
82
+ this.#collectToolCalls = options.collectToolCalls;
83
+ this.#flowControl = options.flowControl;
84
+ }
85
+
86
+ get stopped(): boolean {
87
+ return this.#stopper.stopped;
88
+ }
89
+
90
+ push(token: number): CompletionPush {
91
+ const events: CompletionEvent[] = [];
92
+ const rawContent = this.#router.push(token);
93
+ this.#emitReasoning(events, this.#router.takeReasoning());
94
+ this.#emitParts(events, this.#thinking.push(this.#stopper.push(rawContent)));
95
+ return {
96
+ events,
97
+ control: this.#stopper.stopped
98
+ ? false
99
+ : this.#flowControl?.(events.length > 0),
100
+ };
101
+ }
102
+
103
+ finish(): CompletionResult {
104
+ const events: CompletionEvent[] = [];
105
+ if (!this.#stopper.stopped) {
106
+ const flushed = this.#router.flush();
107
+ this.#emitReasoning(events, this.#router.takeReasoning());
108
+ let tail = this.#stopper.push(flushed);
109
+ if (!this.#stopper.stopped) tail += this.#stopper.flush();
110
+ this.#emitParts(events, this.#thinking.push(tail));
111
+ }
112
+ this.#emitParts(events, this.#thinking.flush());
113
+
114
+ const toolCalls = this.#collectToolCalls ? this.#router.toolCalls() : [];
115
+ if (toolCalls.length) events.push({ type: "tool_calls", calls: toolCalls });
116
+ return {
117
+ events,
118
+ content: this.#content,
119
+ reasoning: this.#reasoning,
120
+ toolCalls,
121
+ stopped: this.#stopper.stopped,
122
+ };
123
+ }
124
+
125
+ #emitParts(
126
+ events: CompletionEvent[],
127
+ parts: { content: string; reasoning: string },
128
+ ): void {
129
+ this.#emitReasoning(events, parts.reasoning);
130
+ if (parts.content) {
131
+ this.#content += parts.content;
132
+ events.push({ type: "content", text: parts.content });
133
+ }
134
+ }
135
+
136
+ #emitReasoning(events: CompletionEvent[], text: string): void {
137
+ if (!text) return;
138
+ this.#reasoning += text;
139
+ events.push({ type: "reasoning", text });
140
+ }
141
+ }
142
+
143
+ export function createTimedFlowControl(
144
+ enabled: boolean,
145
+ intervalMs = 25,
146
+ now: () => number = () => performance.now(),
147
+ yieldTask: () => Promise<void> = () => new Promise<void>((resolve) => setImmediate(resolve)),
148
+ ): (emitted: boolean) => CompletionFlowControl {
149
+ let lastYield = now();
150
+ return (emitted) => {
151
+ if (!enabled || !emitted) return undefined;
152
+ const current = now();
153
+ if (current - lastYield < intervalMs) return undefined;
154
+ lastYield = current;
155
+ return yieldTask();
156
+ };
157
+ }