@mlx-bun/inference 0.0.0-stage → 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 (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1475 -2
  3. package/THIRD_PARTY_NOTICES.md +3404 -0
  4. package/dist/native/libmlx_bun_ane.dylib +0 -0
  5. package/dist/native/libmlx_bun_expert_io.dylib +0 -0
  6. package/dist/native/mlx-bun-frame-extract +0 -0
  7. package/examples/fit-model.ts +25 -0
  8. package/examples/qwen3-forward.ts +42 -0
  9. package/examples/qwen3-generate.ts +28 -0
  10. package/examples/trellis-expand.ts +23 -0
  11. package/package.json +129 -4
  12. package/src/adapters/available.ts +110 -0
  13. package/src/adapters/index.ts +3 -0
  14. package/src/adapters/manager.ts +316 -0
  15. package/src/artifacts/auxiliary-files.ts +45 -0
  16. package/src/artifacts/config-dialects.ts +94 -0
  17. package/src/artifacts/config.ts +341 -0
  18. package/src/artifacts/draft-vocabulary.ts +30 -0
  19. package/src/artifacts/expert-offload-build.ts +75 -0
  20. package/src/artifacts/expert-offload.ts +89 -0
  21. package/src/artifacts/experts/index.ts +3 -0
  22. package/src/artifacts/experts/io.ts +386 -0
  23. package/src/artifacts/experts/residency.ts +1134 -0
  24. package/src/artifacts/experts/usage.ts +415 -0
  25. package/src/artifacts/fingerprint.ts +44 -0
  26. package/src/artifacts/glm52/container.ts +305 -0
  27. package/src/artifacts/glm52/expert-layout.ts +249 -0
  28. package/src/artifacts/glm52/index.ts +7 -0
  29. package/src/artifacts/glm52/kernel-layout.ts +124 -0
  30. package/src/artifacts/glm52/layout.ts +152 -0
  31. package/src/artifacts/glm52/memory.ts +500 -0
  32. package/src/artifacts/glm52/resident-weights.ts +135 -0
  33. package/src/artifacts/glm52/weights.ts +503 -0
  34. package/src/artifacts/glm52-config.ts +262 -0
  35. package/src/artifacts/identity.ts +94 -0
  36. package/src/artifacts/index.ts +15 -0
  37. package/src/artifacts/mmap.ts +90 -0
  38. package/src/artifacts/safetensors-writer.ts +249 -0
  39. package/src/artifacts/safetensors.ts +164 -0
  40. package/src/artifacts/turboquant-fold.ts +42 -0
  41. package/src/artifacts/weight-audit.ts +43 -0
  42. package/src/artifacts/weights.ts +255 -0
  43. package/src/contracts/index.ts +2 -0
  44. package/src/contracts/mlx/attention.ts +8 -0
  45. package/src/contracts/mlx/cache.ts +510 -0
  46. package/src/contracts/mlx/checkpoint.ts +10 -0
  47. package/src/contracts/mlx/draft-checkpoint.ts +14 -0
  48. package/src/contracts/mlx/draft-projection.ts +27 -0
  49. package/src/contracts/mlx/draft-target.ts +84 -0
  50. package/src/contracts/mlx/drafter.ts +176 -0
  51. package/src/contracts/mlx/forward-work.ts +23 -0
  52. package/src/contracts/mlx/glm52-weights.ts +25 -0
  53. package/src/contracts/mlx/graph.ts +309 -0
  54. package/src/contracts/mlx/head.ts +6 -0
  55. package/src/contracts/mlx/index.ts +15 -0
  56. package/src/contracts/mlx/kv-codec.ts +9 -0
  57. package/src/contracts/mlx/media.ts +113 -0
  58. package/src/contracts/mlx/positions.ts +16 -0
  59. package/src/contracts/mlx/row-table.ts +2 -0
  60. package/src/contracts/mlx/trainable.ts +103 -0
  61. package/src/contracts/mlx/whisper.ts +96 -0
  62. package/src/contracts/portable/composition.ts +106 -0
  63. package/src/contracts/portable/denoising.ts +17 -0
  64. package/src/contracts/portable/execution.ts +79 -0
  65. package/src/contracts/portable/generation.ts +103 -0
  66. package/src/contracts/portable/graph.ts +80 -0
  67. package/src/contracts/portable/index.ts +15 -0
  68. package/src/contracts/portable/memory-plan.ts +26 -0
  69. package/src/contracts/portable/object-cache.ts +8 -0
  70. package/src/contracts/portable/prefill.ts +63 -0
  71. package/src/contracts/portable/prefix-cache.ts +33 -0
  72. package/src/contracts/portable/prompt.ts +2 -0
  73. package/src/contracts/portable/resources.ts +25 -0
  74. package/src/contracts/portable/rollback.ts +7 -0
  75. package/src/contracts/portable/sampling.ts +44 -0
  76. package/src/contracts/portable/scheduling.ts +54 -0
  77. package/src/contracts/portable/token-delivery.ts +4 -0
  78. package/src/contracts/portable/tsconfig.json +14 -0
  79. package/src/embeddings/index.ts +1 -0
  80. package/src/embeddings/text.ts +85 -0
  81. package/src/execution/admission.ts +59 -0
  82. package/src/execution/batch-group.ts +1240 -0
  83. package/src/execution/batch-types.ts +225 -0
  84. package/src/execution/cancellation.ts +38 -0
  85. package/src/execution/continuation-request.ts +45 -0
  86. package/src/execution/continuation-types.ts +10 -0
  87. package/src/execution/coordinator.ts +70 -0
  88. package/src/execution/denoising-group.ts +180 -0
  89. package/src/execution/engine.ts +56 -0
  90. package/src/execution/fill-group.ts +505 -0
  91. package/src/execution/fit.ts +184 -0
  92. package/src/execution/gateway-binding.ts +178 -0
  93. package/src/execution/grammar-group.ts +224 -0
  94. package/src/execution/index.ts +18 -0
  95. package/src/execution/methods.ts +75 -0
  96. package/src/execution/mixed-iteration.ts +96 -0
  97. package/src/execution/plan.ts +65 -0
  98. package/src/execution/prefill-cohort.ts +100 -0
  99. package/src/execution/prefill-rows.ts +263 -0
  100. package/src/execution/request-policy.ts +19 -0
  101. package/src/execution/row-sampling.ts +49 -0
  102. package/src/execution/scheduler.ts +92 -0
  103. package/src/execution/session.ts +247 -0
  104. package/src/execution/speculative-group.ts +797 -0
  105. package/src/execution/tasks.ts +44 -0
  106. package/src/generation/autoregressive.ts +840 -0
  107. package/src/generation/bindings/autoregressive.ts +104 -0
  108. package/src/generation/bindings/denoising.ts +60 -0
  109. package/src/generation/bindings/prefill-policy.ts +36 -0
  110. package/src/generation/checkpoint-identity.ts +60 -0
  111. package/src/generation/denoising.ts +85 -0
  112. package/src/generation/diffusion.ts +583 -0
  113. package/src/generation/fill/echo-index.ts +188 -0
  114. package/src/generation/fill/index.ts +3 -0
  115. package/src/generation/fill/proposal.ts +69 -0
  116. package/src/generation/fill/schema-rows.ts +506 -0
  117. package/src/generation/fill/session.ts +464 -0
  118. package/src/generation/fill/tool-boundary.ts +103 -0
  119. package/src/generation/fill-append.ts +58 -0
  120. package/src/generation/generate.ts +44 -0
  121. package/src/generation/grammar-step.ts +39 -0
  122. package/src/generation/index.ts +14 -0
  123. package/src/generation/phase-dispatch.ts +115 -0
  124. package/src/generation/prefill.ts +33 -0
  125. package/src/generation/result.ts +49 -0
  126. package/src/generation/scopes.ts +157 -0
  127. package/src/generation/speculative/acceptance.ts +41 -0
  128. package/src/generation/speculative/adaptive-draft-gate.ts +166 -0
  129. package/src/generation/speculative/bindings/assistant-rows.ts +102 -0
  130. package/src/generation/speculative/bindings/autoregressive-rows.ts +124 -0
  131. package/src/generation/speculative/bindings/binding.ts +106 -0
  132. package/src/generation/speculative/bindings/deepspec-rows.ts +33 -0
  133. package/src/generation/speculative/bindings/draft-target.ts +10 -0
  134. package/src/generation/speculative/bindings/glm52-mtp-rows.ts +128 -0
  135. package/src/generation/speculative/bindings/projected-context-rows.ts +78 -0
  136. package/src/generation/speculative/bindings/projected-draft-rows.ts +95 -0
  137. package/src/generation/speculative/bindings/qwen-mtp-rows.ts +336 -0
  138. package/src/generation/speculative/bindings/two-model-rows.ts +63 -0
  139. package/src/generation/speculative/cache-identity.ts +16 -0
  140. package/src/generation/speculative/draft-kind.ts +149 -0
  141. package/src/generation/speculative/draft-policy.ts +41 -0
  142. package/src/generation/speculative/draft-registry.ts +118 -0
  143. package/src/generation/speculative/draft-vocab.ts +110 -0
  144. package/src/generation/speculative/index.ts +17 -0
  145. package/src/generation/speculative/output.ts +49 -0
  146. package/src/generation/speculative/round.ts +307 -0
  147. package/src/generation/speculative/source.ts +144 -0
  148. package/src/generation/speculative/sources/assistant-source.ts +64 -0
  149. package/src/generation/speculative/sources/deepspec-source.ts +70 -0
  150. package/src/generation/speculative/sources/dflash-source.ts +84 -0
  151. package/src/generation/speculative/sources/dflash2-source.ts +86 -0
  152. package/src/generation/speculative/sources/glm52-mtp-source.ts +66 -0
  153. package/src/generation/speculative/sources/ngram-source.ts +165 -0
  154. package/src/generation/speculative/sources/qwen-mtp-source.ts +154 -0
  155. package/src/generation/speculative/sources/two-model.ts +75 -0
  156. package/src/generation/types.ts +194 -0
  157. package/src/index.ts +20 -0
  158. package/src/input/audio/audiotoolbox.ts +112 -0
  159. package/src/input/audio/decode.ts +133 -0
  160. package/src/input/audio/features.ts +202 -0
  161. package/src/input/audio/index.ts +6 -0
  162. package/src/input/audio/transcode.ts +67 -0
  163. package/src/input/audio/whisper-mel.ts +185 -0
  164. package/src/input/audio/whisper-tokenizer.ts +238 -0
  165. package/src/input/chat-template.ts +389 -0
  166. package/src/input/index.ts +6 -0
  167. package/src/input/media-fetch.ts +439 -0
  168. package/src/input/packed-mixed.ts +43 -0
  169. package/src/input/special-tokens.ts +75 -0
  170. package/src/input/token-groups.ts +49 -0
  171. package/src/input/tokenizer.ts +336 -0
  172. package/src/input/tool-call.ts +689 -0
  173. package/src/input/vision/index.ts +3 -0
  174. package/src/input/vision/preprocess.ts +247 -0
  175. package/src/input/vision/prompt.ts +398 -0
  176. package/src/input/vision/qwen3vl-preprocess.ts +409 -0
  177. package/src/input/vision/qwen3vl-prompt.ts +237 -0
  178. package/src/input/vision/video-frames.ts +100 -0
  179. package/src/kernels/ane/fill.ts +101 -0
  180. package/src/kernels/ane/linear.ts +416 -0
  181. package/src/kernels/attention/flash.ts +694 -0
  182. package/src/kernels/attention/kvq4-decode.ts +155 -0
  183. package/src/kernels/attention/masks.ts +40 -0
  184. package/src/kernels/attention/multi-query.ts +193 -0
  185. package/src/kernels/attention/paged.ts +130 -0
  186. package/src/kernels/delta/gated.ts +306 -0
  187. package/src/kernels/delta/index.ts +3 -0
  188. package/src/kernels/delta/silu-rms-heads.ts +69 -0
  189. package/src/kernels/delta/state.ts +74 -0
  190. package/src/kernels/gated-rms-norm.ts +64 -0
  191. package/src/kernels/glm52/layout.ts +37 -0
  192. package/src/kernels/glm52/streamed-experts.ts +360 -0
  193. package/src/kernels/logits.ts +38 -0
  194. package/src/kernels/quantization/affine-row.ts +154 -0
  195. package/src/kernels/quantization/affine-rows.ts +36 -0
  196. package/src/kernels/quantization/affine-split-mma.ts +144 -0
  197. package/src/kernels/quantization/affine3-mma.ts +117 -0
  198. package/src/kernels/quantization/affine3-rows.ts +103 -0
  199. package/src/kernels/quantization/affine4-mma.ts +113 -0
  200. package/src/kernels/quantization/affine4-rows.ts +102 -0
  201. package/src/kernels/residual-rms-norm.ts +65 -0
  202. package/src/kernels/sampling/index.ts +2 -0
  203. package/src/kernels/sampling/normalized-argmax.ts +116 -0
  204. package/src/kernels/sampling/token-bitmask.ts +52 -0
  205. package/src/kernels/softcap.ts +35 -0
  206. package/src/kernels/trellis/codebook.ts +123 -0
  207. package/src/kernels/trellis/down-codebook.ts +184 -0
  208. package/src/kernels/trellis/down-factored.ts +180 -0
  209. package/src/kernels/trellis/down-k3-interleaved-factored.ts +146 -0
  210. package/src/kernels/trellis/down-mma-wide.ts +195 -0
  211. package/src/kernels/trellis/down-mma.ts +145 -0
  212. package/src/kernels/trellis/expand.ts +42 -0
  213. package/src/kernels/trellis/gate-up-codebook-mma.ts +141 -0
  214. package/src/kernels/trellis/gate-up-codebook.ts +137 -0
  215. package/src/kernels/trellis/gate-up-factored.ts +197 -0
  216. package/src/kernels/trellis/gate-up-mma-wide.ts +147 -0
  217. package/src/kernels/trellis/gate-up-mma.ts +148 -0
  218. package/src/kernels/trellis/gate-up.ts +248 -0
  219. package/src/kernels/trellis/geometry.ts +22 -0
  220. package/src/kernels/trellis/index.ts +103 -0
  221. package/src/kernels/trellis/launch.ts +12 -0
  222. package/src/kernels/trellis/mixed-gate-up-factored.ts +119 -0
  223. package/src/kernels/trellis/mixed-gate-up.ts +146 -0
  224. package/src/kernels/trellis/qualified.ts +34 -0
  225. package/src/kernels/trellis/reduce.ts +150 -0
  226. package/src/kernels/trellis/scatter.ts +407 -0
  227. package/src/kernels/trellis/splitk-prefill.ts +152 -0
  228. package/src/kernels/trellis/tiled-prefill.ts +131 -0
  229. package/src/kernels/trellis/vector-expand.ts +58 -0
  230. package/src/kernels/trellis/wide-prefill.ts +89 -0
  231. package/src/kernels/turboquant/decode.ts +82 -0
  232. package/src/kernels/turboquant/index.ts +5 -0
  233. package/src/kernels/turboquant/inverse.ts +122 -0
  234. package/src/kernels/turboquant/ops.ts +860 -0
  235. package/src/kernels/turboquant/signs.ts +130 -0
  236. package/src/kernels/turboquant/tables.ts +124 -0
  237. package/src/layers/affine-verify-linear.ts +75 -0
  238. package/src/layers/ane-prefill-split.ts +283 -0
  239. package/src/layers/compiled-normalization.ts +41 -0
  240. package/src/layers/delta-heads.ts +23 -0
  241. package/src/layers/dense-embedding.ts +29 -0
  242. package/src/layers/dense-linear.ts +32 -0
  243. package/src/layers/dequantized-linear.ts +72 -0
  244. package/src/layers/folded-attention.ts +42 -0
  245. package/src/layers/geglu.ts +130 -0
  246. package/src/layers/helpers.ts +7 -0
  247. package/src/layers/index.ts +36 -0
  248. package/src/layers/kv4-decode-attention.ts +15 -0
  249. package/src/layers/layer-norm.ts +24 -0
  250. package/src/layers/loading.ts +92 -0
  251. package/src/layers/lora.ts +150 -0
  252. package/src/layers/normalization.ts +9 -0
  253. package/src/layers/prefix-layout.ts +33 -0
  254. package/src/layers/quantized-append-attention.ts +32 -0
  255. package/src/layers/quantized-attention.ts +353 -0
  256. package/src/layers/quantized-embedding.ts +39 -0
  257. package/src/layers/quantized-linear.ts +137 -0
  258. package/src/layers/quantized-switch-linear.ts +37 -0
  259. package/src/layers/qwen-append.ts +12 -0
  260. package/src/layers/qwen-mrope.ts +238 -0
  261. package/src/layers/rope-2d.ts +110 -0
  262. package/src/layers/rope.ts +389 -0
  263. package/src/layers/swiglu.ts +23 -0
  264. package/src/layers/trellis-codebook-down.ts +52 -0
  265. package/src/layers/trellis-codebook-gate-up.ts +42 -0
  266. package/src/layers/trellis-down.ts +117 -0
  267. package/src/layers/trellis-gate-up.ts +71 -0
  268. package/src/layers/trellis-linear.ts +211 -0
  269. package/src/layers/trellis-prompt.ts +102 -0
  270. package/src/layers/trellis-reduce-gate-up.ts +73 -0
  271. package/src/layers/trellis-scatter-down.ts +98 -0
  272. package/src/models/ane-install.ts +74 -0
  273. package/src/models/audio/conformer.ts +656 -0
  274. package/src/models/cache-composition.ts +44 -0
  275. package/src/models/capabilities.ts +89 -0
  276. package/src/models/chat-template.ts +10 -0
  277. package/src/models/composition.ts +107 -0
  278. package/src/models/diffusion-gemma/experts.ts +59 -0
  279. package/src/models/diffusion-gemma/family.ts +21 -0
  280. package/src/models/diffusion-gemma/model.ts +900 -0
  281. package/src/models/diffusion-gemma/vision.ts +549 -0
  282. package/src/models/drafter-loaders.ts +49 -0
  283. package/src/models/drafters.ts +39 -0
  284. package/src/models/factory.ts +351 -0
  285. package/src/models/families.ts +70 -0
  286. package/src/models/family.ts +125 -0
  287. package/src/models/gemma4/assistant-target.ts +46 -0
  288. package/src/models/gemma4/assistant.ts +327 -0
  289. package/src/models/gemma4/blocks.ts +755 -0
  290. package/src/models/gemma4/compiled-decode.ts +452 -0
  291. package/src/models/gemma4/family.ts +39 -0
  292. package/src/models/gemma4/gemma4-12b.ts +677 -0
  293. package/src/models/gemma4/gemma4-26b.ts +544 -0
  294. package/src/models/gemma4/gemma4-e4b.ts +599 -0
  295. package/src/models/gemma4/graphs.ts +147 -0
  296. package/src/models/gemma4/media.ts +88 -0
  297. package/src/models/gemma4/model.ts +860 -0
  298. package/src/models/gemma4/serving-blocks.ts +72 -0
  299. package/src/models/gemma4/trainable.ts +186 -0
  300. package/src/models/gemma4/written-blocks.ts +232 -0
  301. package/src/models/gemma4/written-forward.ts +159 -0
  302. package/src/models/gemma4/written-input.ts +29 -0
  303. package/src/models/glm52/atlas.ts +507 -0
  304. package/src/models/glm52/coupling.ts +388 -0
  305. package/src/models/glm52/dsa.ts +601 -0
  306. package/src/models/glm52/family.ts +20 -0
  307. package/src/models/glm52/mla.ts +812 -0
  308. package/src/models/glm52/model.ts +1127 -0
  309. package/src/models/glm52/moe.ts +223 -0
  310. package/src/models/glm52/mtp.ts +60 -0
  311. package/src/models/glm52/pilot.ts +537 -0
  312. package/src/models/glm52/reference.ts +445 -0
  313. package/src/models/glm52/residency.ts +557 -0
  314. package/src/models/glm52/streamed-experts.ts +447 -0
  315. package/src/models/graph.ts +59 -0
  316. package/src/models/implementation.ts +230 -0
  317. package/src/models/index.ts +15 -0
  318. package/src/models/media-input.ts +15 -0
  319. package/src/models/memory-plan.ts +39 -0
  320. package/src/models/minicpm5/family.ts +29 -0
  321. package/src/models/minicpm5/model.ts +394 -0
  322. package/src/models/minicpm5/trainable.ts +90 -0
  323. package/src/models/profile.ts +337 -0
  324. package/src/models/qwen/blocks.ts +658 -0
  325. package/src/models/qwen/checkpoint.ts +190 -0
  326. package/src/models/qwen/families.ts +57 -0
  327. package/src/models/qwen/media-input.ts +161 -0
  328. package/src/models/qwen/mtp.ts +101 -0
  329. package/src/models/qwen/qwen3-moe.ts +355 -0
  330. package/src/models/qwen/qwen3.ts +323 -0
  331. package/src/models/qwen/qwen38-27b-trellis-m1max.ts +1532 -0
  332. package/src/models/qwen/qwen38-27b-trellis-m4pro.ts +1092 -0
  333. package/src/models/qwen/qwen3_5.ts +433 -0
  334. package/src/models/qwen/written-layers.ts +285 -0
  335. package/src/models/row-table.ts +1 -0
  336. package/src/models/runtime.ts +73 -0
  337. package/src/models/speculative/deepspec-artifact.ts +10 -0
  338. package/src/models/speculative/deepspec.ts +744 -0
  339. package/src/models/speculative/dflash.ts +553 -0
  340. package/src/models/speculative/dflash2-artifact.ts +9 -0
  341. package/src/models/speculative/dflash2-operations.ts +1 -0
  342. package/src/models/speculative/dflash2.ts +576 -0
  343. package/src/models/speculative/loader.ts +29 -0
  344. package/src/models/support.ts +79 -0
  345. package/src/models/universal/archs.ts +365 -0
  346. package/src/models/universal/blocks.ts +479 -0
  347. package/src/models/universal/dense.ts +255 -0
  348. package/src/models/universal/family.ts +17 -0
  349. package/src/models/vision/qwen3vl.ts +566 -0
  350. package/src/models/vision/siglip.ts +520 -0
  351. package/src/models/vision/unified.ts +176 -0
  352. package/src/models/whisper/family.ts +19 -0
  353. package/src/models/whisper/fast.ts +734 -0
  354. package/src/models/whisper/model.ts +430 -0
  355. package/src/runtime/compiled-trace.ts +16 -0
  356. package/src/runtime/config.ts +77 -0
  357. package/src/runtime/expert-trace.ts +71 -0
  358. package/src/runtime/graph-forward.ts +65 -0
  359. package/src/runtime/integers.ts +6 -0
  360. package/src/runtime/native.ts +16 -0
  361. package/src/runtime/resources.ts +53 -0
  362. package/src/runtime/row-operations.ts +42 -0
  363. package/src/runtime/trace.ts +161 -0
  364. package/src/sampling/curve.ts +122 -0
  365. package/src/sampling/draft.ts +55 -0
  366. package/src/sampling/extras.ts +45 -0
  367. package/src/sampling/filters.ts +134 -0
  368. package/src/sampling/grammar.ts +630 -0
  369. package/src/sampling/hlg.ts +290 -0
  370. package/src/sampling/index.ts +9 -0
  371. package/src/sampling/processors.ts +142 -0
  372. package/src/sampling/sampler.ts +120 -0
  373. package/src/sampling/step.ts +343 -0
  374. package/src/sampling/types.ts +161 -0
  375. package/src/sampling/window-filters.ts +46 -0
  376. package/src/scoring/decisions.ts +96 -0
  377. package/src/scoring/full-sequence.ts +103 -0
  378. package/src/scoring/index.ts +9 -0
  379. package/src/scoring/kl.ts +29 -0
  380. package/src/scoring/perplexity.ts +165 -0
  381. package/src/scoring/response-logps.ts +65 -0
  382. package/src/state/affine-attention.ts +180 -0
  383. package/src/state/attachment.ts +68 -0
  384. package/src/state/attention-read.ts +215 -0
  385. package/src/state/batched-kv.ts +294 -0
  386. package/src/state/batched-mask.ts +445 -0
  387. package/src/state/batched-quant.ts +389 -0
  388. package/src/state/batched-quantized-kv.ts +209 -0
  389. package/src/state/batched-rotating-quant.ts +457 -0
  390. package/src/state/batched-rotating-state.ts +149 -0
  391. package/src/state/batched-rotating.ts +430 -0
  392. package/src/state/batched-row-storage.ts +179 -0
  393. package/src/state/batched-ssm.ts +54 -0
  394. package/src/state/batched-turboquant-kv.ts +144 -0
  395. package/src/state/bf16-first-kv.ts +663 -0
  396. package/src/state/cache-service.ts +592 -0
  397. package/src/state/capabilities.ts +65 -0
  398. package/src/state/checkpoint.ts +46 -0
  399. package/src/state/continuation-persistence.ts +126 -0
  400. package/src/state/decode-step-inputs.ts +31 -0
  401. package/src/state/decoded-kv-donor.ts +12 -0
  402. package/src/state/delayed-quantized-kv.ts +141 -0
  403. package/src/state/delayed-rotating-quantized-kv.ts +178 -0
  404. package/src/state/delayed-turboquant-kv.ts +123 -0
  405. package/src/state/durability.ts +214 -0
  406. package/src/state/encoder-cache.ts +26 -0
  407. package/src/state/full-kv-row-append.ts +33 -0
  408. package/src/state/full-kv-row-donor.ts +54 -0
  409. package/src/state/full-prefill-padding.ts +56 -0
  410. package/src/state/full-prefill-row.ts +112 -0
  411. package/src/state/full-transitioning-kv-rows.ts +70 -0
  412. package/src/state/glm52-cache.ts +783 -0
  413. package/src/state/grouped-heads-kv4-cache.ts +26 -0
  414. package/src/state/index.ts +38 -0
  415. package/src/state/kv-attention-view.ts +77 -0
  416. package/src/state/kv-budget.ts +14 -0
  417. package/src/state/kv-scheme.ts +315 -0
  418. package/src/state/kv-storage.ts +57 -0
  419. package/src/state/kv-tensor-rows.ts +212 -0
  420. package/src/state/kv.ts +324 -0
  421. package/src/state/kv4-head256-cache.ts +46 -0
  422. package/src/state/latent-legos.ts +895 -0
  423. package/src/state/layout.ts +277 -0
  424. package/src/state/leases.ts +26 -0
  425. package/src/state/paged/cache.ts +689 -0
  426. package/src/state/paged/codec.ts +36 -0
  427. package/src/state/paged/rows.ts +223 -0
  428. package/src/state/persistence-types.ts +173 -0
  429. package/src/state/persistence-worker.ts +83 -0
  430. package/src/state/persistence.ts +1036 -0
  431. package/src/state/persistence.worker.d.ts +3 -0
  432. package/src/state/persistence.worker.js +264 -0
  433. package/src/state/prefix-cache.ts +685 -0
  434. package/src/state/quantized-kv.ts +369 -0
  435. package/src/state/quantized-tensor.ts +26 -0
  436. package/src/state/request-policy.ts +48 -0
  437. package/src/state/retention-policy.ts +37 -0
  438. package/src/state/rollback.ts +131 -0
  439. package/src/state/rotating-kv-donor.ts +35 -0
  440. package/src/state/rotating-kv-layout.ts +341 -0
  441. package/src/state/rotating-kv.ts +529 -0
  442. package/src/state/rotating-quantized-kv.ts +616 -0
  443. package/src/state/rotating-row-transaction.ts +35 -0
  444. package/src/state/rows.ts +104 -0
  445. package/src/state/softcap-attention.ts +118 -0
  446. package/src/state/speculative/glm52-mtp-state.ts +38 -0
  447. package/src/state/speculative/qwen-mtp-state.ts +34 -0
  448. package/src/state/speculative-rotating-kv.ts +113 -0
  449. package/src/state/ssd-cache.ts +434 -0
  450. package/src/state/ssm-prefill-padding.ts +39 -0
  451. package/src/state/ssm.ts +422 -0
  452. package/src/state/target-layout.ts +7 -0
  453. package/src/state/tiered-prefix-cache.ts +45 -0
  454. package/src/state/training-cache.ts +300 -0
  455. package/src/state/transitioning-kv-rows.ts +267 -0
  456. package/src/state/turboquant-attention.ts +97 -0
  457. package/src/state/turboquant-codec.ts +90 -0
  458. package/src/state/turboquant-kv.ts +442 -0
  459. package/src/state/views.ts +26 -0
  460. package/src/transcription/index.ts +3 -0
  461. package/src/transcription/silero-vad.ts +379 -0
  462. package/src/transcription/whisper/decode.ts +773 -0
  463. package/src/transcription/whisper/format.ts +74 -0
  464. package/src/transcription/whisper/index.ts +4 -0
  465. package/src/transcription/whisper/timing.ts +274 -0
  466. package/src/transcription/whisper/transcribe.ts +394 -0
  467. package/src/transcription/whisper/types.ts +22 -0
@@ -0,0 +1,230 @@
1
+ import type { ModelConfig } from "../artifacts/config";
2
+ import type { AffineKvLayer, Composition, DraftDepth } from "../contracts/portable/composition";
3
+ import type { AneProgramSpec } from "../kernels/ane/linear";
4
+ import {
5
+ assertResolvedModelProfile,
6
+ type GenerationLoop,
7
+ type ModelExecutionComposition,
8
+ type ModelGraph,
9
+ type ModelLoader,
10
+ type ResolvedModelProfile,
11
+ } from "./profile";
12
+
13
+ /** Engine code implements this port. Source and Model remain backend-specific;
14
+ * selection introduces no tensor conversion or dispatch in the token loop.
15
+ * create borrows source; a failed construction must release its own resources.
16
+ * `composition` is the record the loader resolved; a graph registry receives a
17
+ * {@link Composition}. A complete implementation that owns its loader takes
18
+ * `void` and composes itself from its source. */
19
+ export interface ModelImplementation<Source, Model, Composed = Composition> {
20
+ readonly id: string;
21
+ readonly graph: ModelGraph;
22
+ readonly loader: ModelLoader;
23
+ readonly loop: GenerationLoop;
24
+ create(source: Source, config: ModelConfig, profile: ResolvedModelProfile, composition: Composed): Model;
25
+ }
26
+
27
+ export interface ModelImplementationProvider<Source, Model, Composed = Composition> {
28
+ /** Validate identity and composition, then return one compatible binding.
29
+ * A declared implementation must never silently fall back to another. */
30
+ select(config: ModelConfig, profile: ResolvedModelProfile): ModelImplementation<Source, Model, Composed>;
31
+ }
32
+
33
+ /** The implementation a profile runs: the one it names, else its graph's own.
34
+ * Which of the family's graphs that builds is its {@link GraphTable}'s choice,
35
+ * made from the composition, never the profile's. */
36
+ export function implementationIdFor(execution: ModelExecutionComposition): string {
37
+ return execution.implementation ?? execution.graph;
38
+ }
39
+
40
+ /** Immutable composition, with identity matching delegated to model profiles.
41
+ * Exact declarations are requirements: absent/incompatible code is an error,
42
+ * never an invitation to retry with a different numerical implementation. */
43
+ export class ModelImplementationRegistry<Source, Model> implements ModelImplementationProvider<Source, Model> {
44
+ private readonly entries: ReadonlyMap<string, ModelImplementation<Source, Model>>;
45
+
46
+ constructor(implementations: readonly ModelImplementation<Source, Model>[]) {
47
+ const entries = new Map<string, ModelImplementation<Source, Model>>();
48
+ for (const implementation of implementations) {
49
+ if (!implementation.id.trim()) throw new Error("model implementation id must not be empty");
50
+ if (entries.has(implementation.id))
51
+ throw new Error(`duplicate model implementation ${implementation.id}`);
52
+ entries.set(implementation.id, Object.freeze({
53
+ id: implementation.id,
54
+ graph: implementation.graph,
55
+ loader: implementation.loader,
56
+ loop: implementation.loop,
57
+ create: implementation.create.bind(implementation),
58
+ }));
59
+ }
60
+ this.entries = entries;
61
+ }
62
+
63
+ /** Return a new composition; active models retain their existing binding. */
64
+ with(...implementations: readonly ModelImplementation<Source, Model>[]): ModelImplementationRegistry<Source, Model> {
65
+ return new ModelImplementationRegistry([...this.entries.values(), ...implementations]);
66
+ }
67
+
68
+ select(config: ModelConfig, profile: ResolvedModelProfile): ModelImplementation<Source, Model> {
69
+ assertResolvedModelProfile(config, profile);
70
+ const execution = profile.profile.execution;
71
+ const id = implementationIdFor(execution);
72
+ const implementation = this.entries.get(id);
73
+ if (!implementation)
74
+ throw new Error(`model profile ${profile.profile.id} requires unavailable implementation ${id}; refusing to fall back`);
75
+ if (implementation.graph !== execution.graph || implementation.loader !== execution.loader ||
76
+ implementation.loop !== execution.loop)
77
+ throw new Error(`model implementation ${id} is incompatible with profile ${profile.profile.id}; refusing to fall back`);
78
+ return implementation;
79
+ }
80
+ }
81
+
82
+ /** A KV scheme as a table entry serves it: its storage, the kind and widths. A
83
+ * composition's scheme also names the affine read kernels (`kernels`) and the
84
+ * delayed conversion start (`quantizedKvStart`); the cache composes both from
85
+ * the composition, so neither constrains the graph. */
86
+ export type ServedKv =
87
+ | { readonly kind: "bf16" }
88
+ | { readonly kind: "affine"; readonly bits: number; readonly groupSize: number }
89
+ | { readonly kind: "affine-layers"; readonly layers: readonly AffineKvLayer[] }
90
+ | { readonly kind: "turbo"; readonly kBits: number; readonly vBits: number };
91
+
92
+ /** The configurations for which a graph is recommended by default. Each field
93
+ * present participates in default selection; explicit graph choices bypass it. */
94
+ export interface ServedComposition {
95
+ /** The artifact's fingerprint, as the table's `fingerprint` computes it from the config. */
96
+ readonly fingerprint?: string;
97
+ /** The GPU architecture (`Composition.device`). */
98
+ readonly device?: string;
99
+ /** The KV schemes served. A composition matches one with the same kind and
100
+ * widths (every layer's, for a per-layer scheme). */
101
+ readonly kv?: readonly ServedKv[];
102
+ readonly draftDepth?: DraftDepth;
103
+ readonly prefillChunkTokens?: number;
104
+ /** The most rows per forward the graph was built for: a composition with at most this many matches. */
105
+ readonly maxRows?: number;
106
+ /** The most verification rows the file lists. The scheduler's row cap times
107
+ * its maximum drafted-window length must fit for default selection. */
108
+ readonly maxVerifyRows?: number;
109
+ }
110
+
111
+ /** One graph of a family and the composition it serves. `create` borrows the
112
+ * source and releases what it built if construction fails, as
113
+ * {@link ModelImplementation.create} does. */
114
+ export interface GraphEntry<Source, Model> {
115
+ /** Names the graph in diagnostics and tests. */
116
+ readonly id: string;
117
+ readonly serves: ServedComposition;
118
+ create(source: Source, config: ModelConfig, composition: Composition): Model;
119
+ /** The programs this file loads, compiled by the install step before loading
120
+ * weights. The graph's program list takes no composition. Absent: none. */
121
+ anePrograms?(): readonly AneProgramSpec[];
122
+ }
123
+
124
+ const kvKey = (scheme: ServedKv): string => {
125
+ switch (scheme.kind) {
126
+ case "bf16": return "bf16";
127
+ case "affine": return `affine ${scheme.bits}/${scheme.groupSize}`;
128
+ case "affine-layers":
129
+ return `layers ${[...scheme.layers].sort((a, b) => a.layer - b.layer)
130
+ .map(layer => `${layer.layer}:${layer.bits}/${layer.groupSize}`).join(",")}`;
131
+ case "turbo": return `turbo k${scheme.kBits}v${scheme.vBits}`;
132
+ }
133
+ };
134
+ const depthKey = (depth: DraftDepth): string => typeof depth === "number" ? `${depth}` : `adaptive ${depth.max}`;
135
+ const SERVED_FIELDS: readonly (keyof ServedComposition)[] =
136
+ ["fingerprint", "device", "kv", "draftDepth", "prefillChunkTokens", "maxRows", "maxVerifyRows"];
137
+ const constraintCount = (serves: ServedComposition): number =>
138
+ SERVED_FIELDS.filter(field => serves[field] !== undefined).length;
139
+
140
+ /** Whether `composition`, on an artifact with `fingerprint`, meets every constraint of `serves`. */
141
+ function meets(serves: ServedComposition, fingerprint: string | undefined, composition: Composition): boolean {
142
+ return (serves.fingerprint === undefined || serves.fingerprint === fingerprint) &&
143
+ (serves.device === undefined || serves.device === composition.device) &&
144
+ (serves.kv === undefined || serves.kv.some(scheme => kvKey(scheme) === kvKey(composition.kv))) &&
145
+ (serves.draftDepth === undefined || depthKey(serves.draftDepth) === depthKey(composition.draftDepth)) &&
146
+ (serves.prefillChunkTokens === undefined || serves.prefillChunkTokens === composition.prefillChunkTokens) &&
147
+ (serves.maxRows === undefined || composition.maxRows <= serves.maxRows) &&
148
+ (serves.maxVerifyRows === undefined || composition.maxRows *
149
+ (typeof composition.draftDepth === "number" ? composition.draftDepth + 1 : composition.draftDepth.max + 1) <= serves.maxVerifyRows);
150
+ }
151
+
152
+ /** Whether one composition could meet both: every field both constrain admits a common value. */
153
+ function overlap(a: ServedComposition, b: ServedComposition): boolean {
154
+ const both = <T>(x: T | undefined, y: T | undefined, joint: (x: T, y: T) => boolean) =>
155
+ x === undefined || y === undefined || joint(x, y);
156
+ return both(a.device, b.device, (x, y) => x === y) &&
157
+ both(a.fingerprint, b.fingerprint, (x, y) => x === y) &&
158
+ both(a.kv, b.kv, (x, y) => x.some(scheme => y.some(other => kvKey(scheme) === kvKey(other)))) &&
159
+ both(a.draftDepth, b.draftDepth, (x, y) => depthKey(x) === depthKey(y)) &&
160
+ both(a.prefillChunkTokens, b.prefillChunkTokens, (x, y) => x === y);
161
+ }
162
+
163
+ /**
164
+ * A family's default graph recommendations, selected by composition. Adding a
165
+ * recommended graph means adding an entry. Callers may supply any graph directly. The
166
+ * family's generic graph is the one entry that constrains nothing.
167
+ *
168
+ * Default selection runs once, when the loader loads the graph: among the entries
169
+ * whose every constraint the composition meets, the one
170
+ * constraining the most fields wins.
171
+ * The generic entry meets every composition,
172
+ * so the table never refuses; a request the built graph cannot serve is refused
173
+ * before it runs, by the gateway's planning from the graph's declared
174
+ * capabilities. Construction rejects a table without exactly one generic entry,
175
+ * or with two entries of equal constraint count that one composition could both
176
+ * meet, so no winner depends on the order of entries.
177
+ */
178
+ export class GraphTable<Source, Model> {
179
+ readonly entries: readonly GraphEntry<Source, Model>[];
180
+ /** The unconstrained entry: it serves what nothing more specific matches, and
181
+ * is how a bench constructs the generic graph explicitly as an A/B control. */
182
+ readonly generic: GraphEntry<Source, Model>;
183
+ readonly #fingerprint: ((config: ModelConfig) => string) | undefined;
184
+
185
+ /** `fingerprint` computes the artifact fingerprint the entries name; required when one names it. */
186
+ constructor(entries: readonly GraphEntry<Source, Model>[], fingerprint?: (config: ModelConfig) => string) {
187
+ const generic = entries.filter(entry => constraintCount(entry.serves) === 0);
188
+ if (generic.length !== 1)
189
+ throw new Error(`graph table needs exactly one generic entry (constraining nothing); found ${generic.length}`);
190
+ for (const [index, entry] of entries.entries()) {
191
+ if (entries.findIndex(other => other.id === entry.id) !== index) throw new Error(`graph table: duplicate entry ${entry.id}`);
192
+ if (entry.serves.fingerprint !== undefined && !fingerprint)
193
+ throw new Error(`graph table: ${entry.id} names a fingerprint, and the table computes none`);
194
+ if (entry.serves.kv?.length === 0) throw new Error(`graph table: ${entry.id} serves no KV scheme`);
195
+ for (const other of entries.slice(index + 1))
196
+ if (constraintCount(entry.serves) === constraintCount(other.serves) && overlap(entry.serves, other.serves))
197
+ throw new Error(`graph table: ${entry.id} and ${other.id} constrain as many fields and one composition ` +
198
+ "could meet both; constrain one of them further");
199
+ }
200
+ this.entries = Object.freeze([...entries]);
201
+ this.generic = generic[0]!;
202
+ this.#fingerprint = fingerprint;
203
+ }
204
+
205
+ /** Recommend a default, or return the caller's explicit choice unchanged.
206
+ * A supplied entry needs no registration and is not checked against the
207
+ * recommendation's device, artifact or configuration keys. */
208
+ select(config: ModelConfig, composition: Composition, graph?: string | GraphEntry<Source, Model>): GraphEntry<Source, Model> {
209
+ if (graph !== undefined) return this.explicit(graph);
210
+ return this.match(this.#fingerprint?.(config), composition);
211
+ }
212
+
213
+ /** Resolve a named shipped graph or accept the caller's own graph entry. */
214
+ explicit(graph: string | GraphEntry<Source, Model>): GraphEntry<Source, Model> {
215
+ if (typeof graph !== "string") return graph;
216
+ const entry = this.entries.find(entry => entry.id === graph);
217
+ if (!entry) throw new Error(`graph table has no graph named ${graph}`);
218
+ return entry;
219
+ }
220
+
221
+ /** The entry serving `composition` on an artifact with `fingerprint` (as the table computes it). */
222
+ match(fingerprint: string | undefined, composition: Composition): GraphEntry<Source, Model> {
223
+ let chosen = this.generic, count = 0;
224
+ for (const entry of this.entries) {
225
+ const constrained = constraintCount(entry.serves);
226
+ if (constrained > count && meets(entry.serves, fingerprint, composition)) { chosen = entry; count = constrained; }
227
+ }
228
+ return chosen;
229
+ }
230
+ }
@@ -0,0 +1,15 @@
1
+ export * from "./composition";
2
+ export * from "./ane-install";
3
+ export * from "./factory";
4
+ export * from "./runtime";
5
+ export * from "./memory-plan";
6
+ export * from "./chat-template";
7
+ export * from "./families";
8
+ export type { ModelFamily, MoeDeclaration } from "./family";
9
+ export * from "./profile";
10
+ export * from "./implementation";
11
+ export * from "./support";
12
+ export * from "./graph";
13
+ export * from "./cache-composition";
14
+ export * from "./capabilities";
15
+ export * from "./media-input";
@@ -0,0 +1,15 @@
1
+ import type { MlxArray } from "@mlx-bun/mlx/array";
2
+ import type { Cache } from "../contracts/mlx/cache";
3
+ import type { MlxPromptInput } from "../contracts/mlx/media";
4
+
5
+ /** Preserve the ordinary generator's projection geometry for a prepared
6
+ * embedding sequence: process the whole prompt, then project only its tip. */
7
+ export function bindEmbeddingsInput(
8
+ prefill: (ids: MlxArray, caches: Cache[], start: number, phase: "tail" | "decode", width: number) => MlxArray,
9
+ ): MlxPromptInput {
10
+ return { prefill(ids, caches, start, phase, width) {
11
+ using hidden = prefill(ids, caches, start, phase, width);
12
+ const [batch, length, hiddenWidth] = hidden.shape;
13
+ return hidden.slice([0, length! - 1, 0], [batch!, length!, hiddenWidth!]);
14
+ } };
15
+ }
@@ -0,0 +1,39 @@
1
+ // Memory plans that need only the artifact's headers, so callers can ask for
2
+ // one without loading any native module.
3
+
4
+ import { totalmem } from "node:os";
5
+ import type { ModelConfig } from "../artifacts/config";
6
+ import {
7
+ GLM52_G5_DEFAULT_CONTEXT_TOKENS,
8
+ GLM52_G5_DEFAULT_MAX_GENERATION_TOKENS,
9
+ GLM52_G5_DEFAULT_PROCESS_LIMIT_BYTES,
10
+ planGlm52MemoryForArtifact,
11
+ } from "../artifacts/glm52/memory";
12
+ import type { MemoryPlan } from "../contracts/portable/memory-plan";
13
+ import { resolveModelProfile, type ResolvedModelProfile, type ResolveModelProfileOptions } from "./profile";
14
+
15
+ /** Whether the resolved profile's weights load through a planned runtime. */
16
+ export function plansMemory(resolved: ResolvedModelProfile): boolean {
17
+ return resolved.profile.execution.loader !== "safetensors";
18
+ }
19
+
20
+ /** The memory plan a planned runtime would run under on this machine, or null
21
+ * when the model has none (its caller estimates from resident weights). Reads
22
+ * artifact headers only. */
23
+ export async function planRuntimeMemory(
24
+ modelDir: string, config: ModelConfig,
25
+ options: { contextTokens?: number; machineBytes?: number; profiles?: ResolveModelProfileOptions } = {},
26
+ ): Promise<MemoryPlan | null> {
27
+ const resolved = resolveModelProfile(config, options.profiles);
28
+ if (!plansMemory(resolved)) return null;
29
+ const machineBytes = options.machineBytes ?? totalmem();
30
+ const contextTokens = options.contextTokens ?? GLM52_G5_DEFAULT_CONTEXT_TOKENS;
31
+ return planGlm52MemoryForArtifact(modelDir, {
32
+ machineBytes,
33
+ processLimitBytes: Math.min(GLM52_G5_DEFAULT_PROCESS_LIMIT_BYTES, machineBytes),
34
+ contextTokens,
35
+ maxGenerationTokens: Math.min(contextTokens, GLM52_G5_DEFAULT_MAX_GENERATION_TOKENS),
36
+ batchSize: 1,
37
+ enableMtp: true,
38
+ });
39
+ }
@@ -0,0 +1,29 @@
1
+ import { GENERIC_GENERATION_DEFAULTS, L1, defineFamily } from "../family";
2
+
3
+ /** MiniCPM5 ships as `llama`; its dimensions are what tell it from a plain
4
+ * Llama, so a listing that has only the `model_type` cannot name it. */
5
+ export const MINICPM5_FAMILY = defineFamily({
6
+ graph: "minicpm5",
7
+ accepts: config => {
8
+ const t = config.text;
9
+ return config.modelType === "llama" &&
10
+ t.hiddenSize === 1536 &&
11
+ t.numHiddenLayers === 24 &&
12
+ t.numAttentionHeads === 16 &&
13
+ t.numKeyValueHeads === 2 &&
14
+ t.headDim === 128 &&
15
+ t.vocabSize === 130560 &&
16
+ t.tieWordEmbeddings === false;
17
+ },
18
+ hasModelType: () => false,
19
+ tier: "targeted",
20
+ label: "MiniCPM5",
21
+ loader: "safetensors",
22
+ loop: "autoregressive",
23
+ fidelity: L1,
24
+ specialization: "dedicated",
25
+ profileId: "minicpm5-dedicated",
26
+ capabilities: ["minicpm5-graph"],
27
+ // The model card recommends direct replies unless thinking is asked for.
28
+ generationDefaults: { ...GENERIC_GENERATION_DEFAULTS, enableThinking: false },
29
+ });