@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,285 @@
1
+ import type { MlxArray } from "@mlx-bun/mlx/array";
2
+ import type { Weights } from "../../artifacts/weights";
3
+ import type { ModelConfig } from "../../artifacts/config";
4
+ import { QuantizedLinear } from "../../layers/quantized-linear";
5
+ import { TrellisLinear } from "../../layers/trellis-linear";
6
+ import type { TrellisRepresentations } from "../../kernels/trellis/index";
7
+ import type { RowProjection } from "../../layers/trellis-prompt";
8
+ import { TrellisUnfusedMLP,TrellisExpandReducePrompt,TrellisExpandScatterPrompt } from "../../layers/trellis-prompt";
9
+ import { LoraOperation,LoraState } from "../../layers/lora";
10
+ import { QwenGatedDeltaNet, Qwen3TextAttention, Qwen3MediaAttention, QwenDeltaLayer, QwenAttentionLayer } from "./blocks";
11
+ import { AneAffineSplit, type AneMlpSplit, type AneGpuRows } from "../../layers/ane-prefill-split";
12
+ import { compiledSwiglu } from "../../layers/swiglu";
13
+ import { qwen35WeightsView } from "./checkpoint";
14
+
15
+ /** Checkpoint naming only; it never selects a layer or numerical operation. */
16
+ export function canonicalQwenWeights(weights: Weights): Weights {
17
+ const view = qwen35WeightsView(weights);
18
+ if (view) weights.setView(view);
19
+ return weights;
20
+ }
21
+
22
+ /** A weight attachment port. The graph names every constructor at its binding;
23
+ * these helpers only put the named projections on the named block. */
24
+ export type AffineProjectionClass = new (linear: QuantizedLinear) => RowProjection;
25
+ export type GateUpClass = new (gate: TrellisLinear, up: TrellisLinear) => RowProjection;
26
+ export type TrellisProjectionClass = new (linear: TrellisLinear) => RowProjection;
27
+ export type GateDownClass = new (gateUp: RowProjection, down: RowProjection) => RowProjection;
28
+ export type UnfusedClass = new (gate: RowProjection, up: RowProjection, down: RowProjection) => RowProjection;
29
+ export type FusedClass = new (gate: TrellisLinear, up: TrellisLinear, down: RowProjection,state?:LoraState) => RowProjection & {dispose():void};
30
+ export type QwenProjectionTarget=QuantizedLinear|TrellisLinear;
31
+
32
+ /** Program/buffer ownership shared by written ANE bindings. Shape lookup only
33
+ * shares resources; the graph supplies the operation and row capacity. */
34
+ export class AneWeightShares {
35
+ readonly affine = new Map<string, AneAffineSplit>();
36
+ mlp: AneMlpSplit | undefined;
37
+ readonly owned: { dispose(): void }[] = [];
38
+ projection(linear: QuantizedLinear, Split: typeof AneAffineSplit, fraction: number, rows: number, slices?: number, gpuRows?: AneGpuRows): AneAffineSplit {
39
+ const shape = `${linear.inFeatures}:${linear.outFeatures}`;
40
+ const projection = Split.build(linear, fraction, rows, this.affine.get(shape), slices, gpuRows);
41
+ this.affine.set(shape, projection);
42
+ this.owned.push(projection);
43
+ return projection;
44
+ }
45
+ [Symbol.dispose](): void { for (const resource of this.owned.splice(0)) resource.dispose(); }
46
+ }
47
+
48
+ export interface AneMlpClass {
49
+ build(gate: TrellisLinear, up: TrellisLinear, down: TrellisLinear,
50
+ fraction: number, rows: number, share?: AneMlpSplit, slices?: number): AneMlpSplit;
51
+ }
52
+ export class AneBoundMlp {
53
+ readonly split: AneMlpSplit;
54
+ readonly #operation:LoraOperation;
55
+ constructor(trellis: TrellisWeights, Split: AneMlpClass, fraction: number, rows: number, shares: AneWeightShares, slices?: number) {
56
+ this.split = Split.build(trellis.gate, trellis.up, trellis.down, fraction, rows, shares.mlp, slices);
57
+ shares.mlp = this.split;
58
+ shares.owned.push(this.split);
59
+ const overlay=new TrellisUnfusedMLP(new TrellisExpandReducePrompt(trellis.gate),new TrellisExpandReducePrompt(trellis.up),new TrellisExpandScatterPrompt(trellis.down));
60
+ this.#operation=new LoraOperation(x=>this.split.forward(x,compiledSwiglu),x=>overlay.forward(x),trellis.state,[trellis.gate.delta,trellis.up.delta,trellis.down.delta]);
61
+ shares.owned.push(this.#operation);
62
+ }
63
+ forward(x:MlxArray):MlxArray { return this.#operation.forward(x); }
64
+ }
65
+
66
+ export class TrellisWeights {
67
+ readonly gate: TrellisLinear;
68
+ readonly up: TrellisLinear;
69
+ readonly down: TrellisLinear;
70
+ readonly #owned:{dispose():void}[]=[];
71
+ constructor(weights: Weights, config: ModelConfig, readonly prefix: string, representations: TrellisRepresentations,readonly state:LoraState) {
72
+ this.gate = TrellisLinear.load(weights, `${prefix}.mlp.gate_proj`, config, false, representations);
73
+ this.up = TrellisLinear.load(weights, `${prefix}.mlp.up_proj`, config, false, representations);
74
+ this.down = TrellisLinear.load(weights, `${prefix}.mlp.down_proj`, config, true, representations);
75
+ }
76
+ keep(resource:{dispose():void}):void { this.#owned.push(resource); }
77
+ operation(plain:RowProjection,adapted:RowProjection):LoraOperation {
78
+ const operation=new LoraOperation(x=>plain.forward(x),x=>adapted.forward(x),this.state,[this.gate.delta,this.up.delta]);
79
+ this.keep(operation);
80
+ return operation;
81
+ }
82
+ targets():readonly (readonly [string,TrellisLinear])[] {
83
+ return [[`${this.prefix}.mlp.gate_proj`,this.gate],[`${this.prefix}.mlp.up_proj`,this.up],[`${this.prefix}.mlp.down_proj`,this.down]];
84
+ }
85
+ dispose():void { for (const resource of this.#owned.splice(0)) resource.dispose(); }
86
+ }
87
+
88
+ /** A gate/up operation already includes the activation; its down projection is
89
+ * another operation the graph names. Both borrow their input. */
90
+ export class GateDownMLP {
91
+ constructor(readonly gateUp: RowProjection, readonly down: RowProjection) {}
92
+ forward(x: MlxArray): MlxArray {
93
+ using hidden = this.gateUp.forward(x);
94
+ return this.down.forward(hidden);
95
+ }
96
+ }
97
+
98
+ export class DeltaWeights {
99
+ readonly trellis: TrellisWeights;
100
+ readonly inProjQkv: QuantizedLinear;
101
+ readonly inProjZ: QuantizedLinear;
102
+ readonly inProjA: QuantizedLinear;
103
+ readonly inProjB: QuantizedLinear;
104
+ readonly outProj: QuantizedLinear;
105
+ constructor(weights: Weights, config: ModelConfig, readonly prefix: string, representations: TrellisRepresentations,state:LoraState) {
106
+ this.trellis = new TrellisWeights(weights, config, prefix, representations,state);
107
+ const block = `${prefix}.linear_attn`;
108
+ this.inProjQkv = QuantizedLinear.load(weights, `${block}.in_proj_qkv`, config);
109
+ this.inProjZ = QuantizedLinear.load(weights, `${block}.in_proj_z`, config);
110
+ this.inProjA = QuantizedLinear.load(weights, `${block}.in_proj_a`, config);
111
+ this.inProjB = QuantizedLinear.load(weights, `${block}.in_proj_b`, config);
112
+ this.outProj = QuantizedLinear.load(weights, `${block}.out_proj`, config);
113
+ }
114
+ stage(weights: Weights, config: ModelConfig, Layer: typeof QwenDeltaLayer,
115
+ Mlp: GateDownClass, GateUp: GateUpClass, Gate: TrellisProjectionClass, Down: TrellisProjectionClass,
116
+ Qkv: AffineProjectionClass, Z: AffineProjectionClass, A: AffineProjectionClass,
117
+ B: AffineProjectionClass, Out: AffineProjectionClass, qkScale: { q: MlxArray; k: MlxArray },
118
+ Block: typeof QwenGatedDeltaNet = QwenGatedDeltaNet): QwenDeltaLayer {
119
+ const down=new Down(this.trellis.down),plain=new Mlp(new GateUp(this.trellis.gate,this.trellis.up),down);
120
+ const overlay=new TrellisUnfusedMLP(new Gate(this.trellis.gate),new Gate(this.trellis.up),down);
121
+ return new Layer(weights,config,this.prefix,this.bind(weights,config,Qkv,Z,A,B,Out,qkScale,Block),this.trellis.operation(plain,overlay));
122
+ }
123
+ prompt(weights: Weights, config: ModelConfig, Layer: typeof QwenDeltaLayer,
124
+ Mlp: UnfusedClass, Gate: TrellisProjectionClass, Down: TrellisProjectionClass,
125
+ Plain: AffineProjectionClass, qkScale: { q: MlxArray; k: MlxArray }): QwenDeltaLayer {
126
+ return new Layer(weights, config, this.prefix, this.bind(weights, config, Plain, Plain, Plain, Plain, Plain, qkScale),
127
+ new Mlp(new Gate(this.trellis.gate), new Gate(this.trellis.up), new Down(this.trellis.down)));
128
+ }
129
+ fused(weights: Weights, config: ModelConfig, Layer: typeof QwenDeltaLayer,
130
+ Mlp: FusedClass, Down: TrellisProjectionClass, Plain: AffineProjectionClass,
131
+ qkScale: { q: MlxArray; k: MlxArray }): QwenDeltaLayer {
132
+ const mlp=new Mlp(this.trellis.gate,this.trellis.up,new Down(this.trellis.down),this.trellis.state);
133
+ this.trellis.keep(mlp);
134
+ return new Layer(weights,config,this.prefix,this.bind(weights,config,Plain,Plain,Plain,Plain,Plain,qkScale),mlp);
135
+ }
136
+ withMlp(weights: Weights, config: ModelConfig, Layer: typeof QwenDeltaLayer,
137
+ mlp: RowProjection, Projection: AffineProjectionClass, qkScale: { q: MlxArray; k: MlxArray }): QwenDeltaLayer {
138
+ return new Layer(weights, config, this.prefix, this.bind(weights, config, Projection, Projection, Projection, Projection, Projection, qkScale), mlp);
139
+ }
140
+ withProjections(weights: Weights, config: ModelConfig, Layer: typeof QwenDeltaLayer,
141
+ mlp: RowProjection, Qkv: AffineProjectionClass, Z: AffineProjectionClass, A: AffineProjectionClass,
142
+ B: AffineProjectionClass, Out: AffineProjectionClass, qkScale: {q:MlxArray;k:MlxArray}): QwenDeltaLayer {
143
+ return new Layer(weights,config,this.prefix,this.bind(weights,config,Qkv,Z,A,B,Out,qkScale),mlp);
144
+ }
145
+ withBoundProjections(weights: Weights,config:ModelConfig,Layer:typeof QwenDeltaLayer,
146
+ mlp:RowProjection,qkv:RowProjection,z:RowProjection,a:RowProjection,b:RowProjection,out:RowProjection,
147
+ qkScale:{q:MlxArray;k:MlxArray}):QwenDeltaLayer {
148
+ const block=new QwenGatedDeltaNet(weights,config,`${this.prefix}.linear_attn`,{
149
+ inProjQkv:qkv,inProjZ:z,inProjA:a,inProjB:b,outProj:out,
150
+ });
151
+ block.qkScale=qkScale;
152
+ return new Layer(weights,config,this.prefix,block,mlp);
153
+ }
154
+ aneProjections(weights:Weights,config:ModelConfig,Layer:typeof QwenDeltaLayer,mlp:RowProjection,
155
+ Split:typeof AneAffineSplit,Dense:AffineProjectionClass,Plain:AffineProjectionClass,rows:number,shares:AneWeightShares,
156
+ qkScale:{q:MlxArray;k:MlxArray}):QwenDeltaLayer {
157
+ return this.withBoundProjections(weights,config,Layer,mlp,
158
+ shares.projection(this.inProjQkv,Split,0.375,rows,4,rest=>new Dense(rest)),
159
+ shares.projection(this.inProjZ,Split,0.375,rows,4,rest=>new Dense(rest)),
160
+ new Plain(this.inProjA),new Plain(this.inProjB),
161
+ shares.projection(this.outProj,Split,0.375,rows,4,rest=>new Dense(rest)),qkScale);
162
+ }
163
+ aneStage(weights: Weights, config: ModelConfig, Layer: typeof QwenDeltaLayer,
164
+ Mlp: typeof AneBoundMlp, Split: AneMlpClass, Affine: typeof AneAffineSplit,
165
+ Plain: AffineProjectionClass, fraction: number, rows: number, shares: AneWeightShares,
166
+ qkScale: { q: MlxArray; k: MlxArray }): QwenDeltaLayer {
167
+ const mlp = new Mlp(this.trellis, Split, fraction, rows, shares);
168
+ return new Layer(weights, config, this.prefix, this.ane(weights, config, Plain, Affine, fraction, rows, shares, qkScale), mlp);
169
+ }
170
+ bind(weights: Weights, config: ModelConfig,
171
+ Qkv: AffineProjectionClass, Z: AffineProjectionClass, A: AffineProjectionClass,
172
+ B: AffineProjectionClass, Out: AffineProjectionClass,
173
+ qkScale: { q: MlxArray; k: MlxArray }, Block: typeof QwenGatedDeltaNet = QwenGatedDeltaNet): QwenGatedDeltaNet<RowProjection> {
174
+ const block = new Block(weights, config, `${this.prefix}.linear_attn`, {
175
+ inProjQkv: new Qkv(this.inProjQkv), inProjZ: new Z(this.inProjZ),
176
+ inProjA: new A(this.inProjA), inProjB: new B(this.inProjB), outProj: new Out(this.outProj),
177
+ });
178
+ block.qkScale = qkScale;
179
+ return block;
180
+ }
181
+ ane(weights: Weights, config: ModelConfig, Plain: AffineProjectionClass,
182
+ Split: typeof AneAffineSplit, fraction: number, rows: number, shares: AneWeightShares,
183
+ qkScale: { q: MlxArray; k: MlxArray }): QwenGatedDeltaNet<RowProjection> {
184
+ const block = new QwenGatedDeltaNet(weights, config, `${this.prefix}.linear_attn`, {
185
+ inProjQkv: new Plain(this.inProjQkv), inProjZ: shares.projection(this.inProjZ, Split, fraction, rows),
186
+ inProjA: new Plain(this.inProjA), inProjB: new Plain(this.inProjB),
187
+ outProj: shares.projection(this.outProj, Split, fraction, rows),
188
+ });
189
+ block.qkScale = qkScale;
190
+ return block;
191
+ }
192
+ targets(): readonly (readonly [string,QwenProjectionTarget])[] {
193
+ const prefix = `${this.prefix}.linear_attn`;
194
+ return [[`${prefix}.in_proj_qkv`, this.inProjQkv], [`${prefix}.in_proj_z`, this.inProjZ],
195
+ [`${prefix}.in_proj_a`, this.inProjA], [`${prefix}.in_proj_b`, this.inProjB], [`${prefix}.out_proj`, this.outProj],...this.trellis.targets()];
196
+ }
197
+ }
198
+
199
+ export class AttentionWeights {
200
+ readonly trellis: TrellisWeights;
201
+ readonly qProj: QuantizedLinear;
202
+ readonly kProj: QuantizedLinear;
203
+ readonly vProj: QuantizedLinear;
204
+ readonly oProj: QuantizedLinear;
205
+ constructor(weights: Weights, config: ModelConfig, readonly prefix: string, representations: TrellisRepresentations,state:LoraState) {
206
+ this.trellis = new TrellisWeights(weights, config, prefix, representations,state);
207
+ const block = `${prefix}.self_attn`;
208
+ this.qProj = QuantizedLinear.load(weights, `${block}.q_proj`, config);
209
+ this.kProj = QuantizedLinear.load(weights, `${block}.k_proj`, config);
210
+ this.vProj = QuantizedLinear.load(weights, `${block}.v_proj`, config);
211
+ this.oProj = QuantizedLinear.load(weights, `${block}.o_proj`, config);
212
+ }
213
+ stage(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
214
+ Mlp: GateDownClass, GateUp: GateUpClass, Gate: TrellisProjectionClass, Down: TrellisProjectionClass,
215
+ Q: AffineProjectionClass, K: AffineProjectionClass, V: AffineProjectionClass, O: AffineProjectionClass): QwenAttentionLayer {
216
+ const down=new Down(this.trellis.down),plain=new Mlp(new GateUp(this.trellis.gate,this.trellis.up),down);
217
+ const overlay=new TrellisUnfusedMLP(new Gate(this.trellis.gate),new Gate(this.trellis.up),down);
218
+ return new Layer(weights,config,this.prefix,this.text(weights,config,Q,K,V,O),this.trellis.operation(plain,overlay));
219
+ }
220
+ prompt(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
221
+ Mlp: UnfusedClass, Gate: TrellisProjectionClass, Down: TrellisProjectionClass,
222
+ Plain: AffineProjectionClass): QwenAttentionLayer {
223
+ return new Layer(weights, config, this.prefix, this.text(weights, config, Plain, Plain, Plain, Plain),
224
+ new Mlp(new Gate(this.trellis.gate), new Gate(this.trellis.up), new Down(this.trellis.down)));
225
+ }
226
+ fused(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
227
+ Mlp: FusedClass, Down: TrellisProjectionClass, Plain: AffineProjectionClass): QwenAttentionLayer {
228
+ const mlp=new Mlp(this.trellis.gate,this.trellis.up,new Down(this.trellis.down),this.trellis.state);
229
+ this.trellis.keep(mlp);
230
+ return new Layer(weights,config,this.prefix,this.text(weights,config,Plain,Plain,Plain,Plain),mlp);
231
+ }
232
+ withMlp(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
233
+ mlp: RowProjection, Projection: AffineProjectionClass): QwenAttentionLayer {
234
+ return new Layer(weights, config, this.prefix, this.text(weights, config, Projection, Projection, Projection, Projection), mlp);
235
+ }
236
+ withProjections(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
237
+ mlp: RowProjection, Q: AffineProjectionClass, K: AffineProjectionClass, V: AffineProjectionClass, O: AffineProjectionClass): QwenAttentionLayer {
238
+ return new Layer(weights,config,this.prefix,this.text(weights,config,Q,K,V,O),mlp);
239
+ }
240
+ withBoundProjections(weights:Weights,config:ModelConfig,Layer:typeof QwenAttentionLayer,
241
+ mlp:RowProjection,q:RowProjection,k:RowProjection,v:RowProjection,o:RowProjection):QwenAttentionLayer {
242
+ const block=new Qwen3TextAttention(weights,config,`${this.prefix}.self_attn`,{qProj:q,kProj:k,vProj:v,oProj:o});
243
+ return new Layer(weights,config,this.prefix,block,mlp);
244
+ }
245
+ aneProjections(weights:Weights,config:ModelConfig,Layer:typeof QwenAttentionLayer,mlp:RowProjection,
246
+ Split:typeof AneAffineSplit,Dense:AffineProjectionClass,_Plain:AffineProjectionClass,rows:number,shares:AneWeightShares):QwenAttentionLayer {
247
+ return this.withBoundProjections(weights,config,Layer,mlp,
248
+ shares.projection(this.qProj,Split,0.375,rows,4,rest=>new Dense(rest)),new Dense(this.kProj),new Dense(this.vProj),
249
+ shares.projection(this.oProj,Split,0.375,rows,4,rest=>new Dense(rest)));
250
+ }
251
+ mediaLayer(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
252
+ mlp: RowProjection, Projection: AffineProjectionClass): QwenAttentionLayer {
253
+ return new Layer(weights, config, this.prefix, this.media(weights, config, Projection, Projection, Projection, Projection), mlp);
254
+ }
255
+ aneStage(weights: Weights, config: ModelConfig, Layer: typeof QwenAttentionLayer,
256
+ Mlp: typeof AneBoundMlp, Split: AneMlpClass, Affine: typeof AneAffineSplit,
257
+ Plain: AffineProjectionClass, fraction: number, rows: number, shares: AneWeightShares): QwenAttentionLayer {
258
+ const mlp = new Mlp(this.trellis, Split, fraction, rows, shares);
259
+ return new Layer(weights, config, this.prefix, this.ane(weights, config, Plain, Affine, fraction, rows, shares), mlp);
260
+ }
261
+ text(weights: Weights, config: ModelConfig, Q: AffineProjectionClass, K: AffineProjectionClass,
262
+ V: AffineProjectionClass, O: AffineProjectionClass): Qwen3TextAttention<RowProjection> {
263
+ return new Qwen3TextAttention(weights, config, `${this.prefix}.self_attn`, {
264
+ qProj: new Q(this.qProj), kProj: new K(this.kProj), vProj: new V(this.vProj), oProj: new O(this.oProj),
265
+ });
266
+ }
267
+ media(weights: Weights, config: ModelConfig, Q: AffineProjectionClass, K: AffineProjectionClass,
268
+ V: AffineProjectionClass, O: AffineProjectionClass): Qwen3MediaAttention<RowProjection> {
269
+ return new Qwen3MediaAttention(weights, config, `${this.prefix}.self_attn`, {
270
+ qProj: new Q(this.qProj), kProj: new K(this.kProj), vProj: new V(this.vProj), oProj: new O(this.oProj),
271
+ });
272
+ }
273
+ ane(weights: Weights, config: ModelConfig, Plain: AffineProjectionClass,
274
+ Split: typeof AneAffineSplit, fraction: number, rows: number, shares: AneWeightShares): Qwen3TextAttention<RowProjection> {
275
+ return new Qwen3TextAttention(weights, config, `${this.prefix}.self_attn`, {
276
+ qProj: new Plain(this.qProj), kProj: new Plain(this.kProj), vProj: new Plain(this.vProj),
277
+ oProj: shares.projection(this.oProj, Split, fraction, rows),
278
+ });
279
+ }
280
+ targets(): readonly (readonly [string,QwenProjectionTarget])[] {
281
+ const prefix = `${this.prefix}.self_attn`;
282
+ return [[`${prefix}.q_proj`, this.qProj], [`${prefix}.k_proj`, this.kProj],
283
+ [`${prefix}.v_proj`, this.vProj], [`${prefix}.o_proj`, this.oProj],...this.trellis.targets()];
284
+ }
285
+ }
@@ -0,0 +1 @@
1
+ export { rowOperationFor, rowTableWithDefault } from "../runtime/row-operations";
@@ -0,0 +1,73 @@
1
+ // Runtimes that plan memory before opening any weights (streamed expert
2
+ // loaders). Callers pass generic options and receive a generic plan, the
3
+ // runtime's draft-head fact and its telemetry; which model owns the loader is
4
+ // decided here from the resolved profile, never by the application.
5
+
6
+ import type { MemoryPlan } from "../contracts/portable/memory-plan";
7
+ import { BF16_KV, type KvStorageScheme } from "../contracts/portable/composition";
8
+ import type { DisposableResource } from "../contracts/portable/resources";
9
+ import { declaredGraph } from "./capabilities";
10
+ import { openGlm52RuntimeModel, type RuntimeModel } from "./factory";
11
+ import { plansMemory } from "./memory-plan";
12
+ import type { ResolvedModelProfile } from "./profile";
13
+
14
+ /** Options every planned runtime understands; a runtime ignores what it has no
15
+ * use for. Unset values take the runtime's own preset. */
16
+ export interface RuntimeOpenOptions {
17
+ /** Whole-process ceiling in bytes. */
18
+ memoryBudgetBytes?: number;
19
+ /** Context tokens the plan reserves. */
20
+ contextTokens?: number;
21
+ /** Generated-token allowance within `contextTokens`. */
22
+ maxGenerationTokens?: number;
23
+ /** Maximum ordinary continuous-batch rows. */
24
+ batchSize?: number;
25
+ /** The checkpoint-native draft head, on by default where the checkpoint has one. */
26
+ nativeDraft?: boolean;
27
+ /** Test/diagnostic override; normal callers use physical RAM. */
28
+ machineBytes?: number;
29
+ /** Native loader library override. */
30
+ libraryPath?: string;
31
+ /** The composition's KV scheme and paging, which the runtime's caches compose
32
+ * (unset: unquantized, unpaged). */
33
+ kv?: KvStorageScheme;
34
+ pagedKv?: { readonly blockSize: number } | null;
35
+ }
36
+
37
+ export interface OpenedRuntime {
38
+ readonly model: RuntimeModel & DisposableResource;
39
+ readonly memoryPlan: MemoryPlan;
40
+ /** Runtime telemetry for status views: the plan's line items and live streaming state. */
41
+ diagnostics(): Record<string, unknown>;
42
+ }
43
+
44
+ /** Open the profile's planned runtime. The plan runs before any resident tensor
45
+ * or streaming tier is opened, so an impossible configuration fails without
46
+ * committing memory. */
47
+ export async function openPlannedRuntime(
48
+ modelDir: string, resolved: ResolvedModelProfile, options: RuntimeOpenOptions = {},
49
+ ): Promise<OpenedRuntime> {
50
+ if (!plansMemory(resolved))
51
+ throw new Error(`profile ${resolved.profile.id} does not load through a planned runtime`);
52
+ const { model, plan } = await openGlm52RuntimeModel(modelDir, {
53
+ memoryBudgetBytes: options.memoryBudgetBytes, contextTokens: options.contextTokens,
54
+ maxGenerationTokens: options.maxGenerationTokens, batchSize: options.batchSize,
55
+ enableMtp: options.nativeDraft, machineBytes: options.machineBytes, libraryPath: options.libraryPath,
56
+ ...(options.kv || options.pagedKv ? { caches: { kv: options.kv ?? BF16_KV, pagedKv: options.pagedKv ?? null } } : {}),
57
+ });
58
+ const sparse = declaredGraph(model).graphCapabilities.sparseAttention;
59
+ return {
60
+ model,
61
+ memoryPlan: plan,
62
+ diagnostics: () => ({
63
+ preset: plan.preset, planned_process_bytes: plan.plannedProcessBytes,
64
+ process_limit_bytes: plan.processLimitBytes, context_tokens: plan.contextTokens,
65
+ max_generation_tokens: plan.maxGenerationTokens, batch_size: plan.batchSize,
66
+ dsa: sparse, mtp: plan.enableMtp,
67
+ mtp_draft_tokens: plan.mtpDraftTokens, resident_weight_bytes: plan.lineItems.residentWeightsBytes,
68
+ main_expert_slab_bytes: plan.lineItems.mainExpertSlabBytes,
69
+ mtp_expert_slab_bytes: plan.lineItems.mtpExpertSlabBytes,
70
+ expert_runtime: declaredGraph(model).expertResidency?.() ?? null,
71
+ }),
72
+ };
73
+ }
@@ -0,0 +1,10 @@
1
+ // How DeepSeek's released DSpark drafter (DeepSpec) declares itself in its
2
+ // config.json. No MLX: the draft registry and quantization read it to recognize
3
+ // the checkpoint before loading anything.
4
+
5
+ /** `architectures[0]` of a DeepSpec checkpoint. */
6
+ const DEEPSPEC_ARCHITECTURE = "Gemma4DSparkModel";
7
+
8
+ export function isDeepspecArchitecture(architectures: unknown): boolean {
9
+ return Array.isArray(architectures) && architectures[0] === DEEPSPEC_ARCHITECTURE;
10
+ }