@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,599 @@
1
+ // Written Gemma 4 e4b graph. Layer order and every operation binding are literal.
2
+ import type { MlxArray } from "@mlx-bun/mlx/array";
3
+ import * as ops from "@mlx-bun/mlx/ops";
4
+ import type { ModelConfig } from "../../artifacts/config";
5
+ import type { Weights } from "../../artifacts/weights";
6
+ import type { Cache } from "../../contracts/mlx/cache";
7
+ import type { MlxDeclaredGraph, MlxTokenPhases, MlxRowTable, MlxCapturingForward, MlxHeadForward, MlxPhaseForward, MlxKnownOperations, MlxLayerCapture, MlxPromptRange, MlxMixedRange, MlxPhaseGroup, MlxCacheLayer } from "../../contracts/mlx/graph";
8
+ import type { Vision, MediaSidecarProbes } from "../../contracts/mlx/media";
9
+ import { QuantizedEmbedding } from "../../layers/quantized-embedding";
10
+ import { RMSNorm } from "../../layers/normalization";
11
+ import { LoraState } from "../../layers/lora";
12
+ import { disposing } from "../../layers/helpers";
13
+ import { compiledLogitSoftcap } from "../../kernels/softcap";
14
+ import { logitSoftcap } from "../../kernels/logits";
15
+ import { ownResource, disposeResources } from "../../runtime/resources";
16
+ import { declareGraph } from "../capabilities";
17
+ import { GEMMA_GRAPH_FINGERPRINTS } from "./family";
18
+ import { CompiledDecode } from "./compiled-decode";
19
+ import { bindGemma4MediaInput, gemma4DraftTarget, gemma4MediaEncoders } from "./media";
20
+ import { type Gemma4Phase } from "./blocks";
21
+ import { SlidingAttention, FullAttention, FullKEqVAttention, SharedSlidingAttention, SharedFullAttention, GemmaLayerWeights, GemmaInputLayerWeights, GemmaMoeLayerWeights, GemmaDenseLayer, GemmaInputLayer, GemmaMoeLayer, CompiledGegluMLP, PlainGegluMLP, CompiledGeglu, SortedSwitchGLU, UnsortedSwitchGLU, FixedExperts, FixedPerLayerInputs, TracePerLayerInputs } from "./written-blocks";
22
+ import { GemmaForwardScope, GemmaInputForwardScope, GemmaMixedScope, ownMixed, donorMixed, sharedMixed, denseLoraTargets, inputLoraTargets, weightBytes, GemmaBuildScope } from "./written-forward";
23
+ export const FINGERPRINT = GEMMA_GRAPH_FINGERPRINTS["e4b"];
24
+
25
+ /** One decoder layer as the composition fixes it: its attention type; the layer
26
+ * whose cache it reads (itself when it owns one, else the last donor of its type,
27
+ * whose read it attends in the same forward); that cache's affine width and group
28
+ * under the composition's KV scheme (null: bf16); whether its keys are its values;
29
+ * whether it carries a layer scalar. */
30
+ export interface Gemma4Layer {
31
+ readonly attention: "sliding" | "full";
32
+ readonly cache: number;
33
+ readonly kv: { readonly bits: number; readonly groupSize: number } | null;
34
+ readonly kEqV: boolean;
35
+ readonly layerScalar: boolean;
36
+ }
37
+
38
+ /** The artifact's layers and kv_config, from mlx-community/gemma-4-e4b-it-OptiQ-4bit@98d7dc6a93ae05583e8a10018c8099459b58aeeb. */
39
+ export const LAYERS: readonly Gemma4Layer[] = Object.freeze([
40
+ /* 0 */ { attention: "sliding", cache: 0, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
41
+ /* 1 */ { attention: "sliding", cache: 1, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
42
+ /* 2 */ { attention: "sliding", cache: 2, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
43
+ /* 3 */ { attention: "sliding", cache: 3, kv: { bits: 8, groupSize: 64 }, kEqV: false, layerScalar: true },
44
+ /* 4 */ { attention: "sliding", cache: 4, kv: { bits: 8, groupSize: 64 }, kEqV: false, layerScalar: true },
45
+ /* 5 */ { attention: "full", cache: 5, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
46
+ /* 6 */ { attention: "sliding", cache: 6, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
47
+ /* 7 */ { attention: "sliding", cache: 7, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
48
+ /* 8 */ { attention: "sliding", cache: 8, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
49
+ /* 9 */ { attention: "sliding", cache: 9, kv: { bits: 8, groupSize: 64 }, kEqV: false, layerScalar: true },
50
+ /* 10 */ { attention: "sliding", cache: 10, kv: { bits: 8, groupSize: 64 }, kEqV: false, layerScalar: true },
51
+ /* 11 */ { attention: "full", cache: 11, kv: { bits: 8, groupSize: 64 }, kEqV: false, layerScalar: true },
52
+ /* 12 */ { attention: "sliding", cache: 12, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
53
+ /* 13 */ { attention: "sliding", cache: 13, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
54
+ /* 14 */ { attention: "sliding", cache: 14, kv: { bits: 8, groupSize: 64 }, kEqV: false, layerScalar: true },
55
+ /* 15 */ { attention: "sliding", cache: 15, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
56
+ /* 16 */ { attention: "sliding", cache: 16, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
57
+ /* 17 */ { attention: "full", cache: 17, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
58
+ /* 18 */ { attention: "sliding", cache: 18, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
59
+ /* 19 */ { attention: "sliding", cache: 19, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
60
+ /* 20 */ { attention: "sliding", cache: 20, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
61
+ /* 21 */ { attention: "sliding", cache: 21, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
62
+ /* 22 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
63
+ /* 23 */ { attention: "full", cache: 23, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
64
+ /* 24 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
65
+ /* 25 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
66
+ /* 26 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
67
+ /* 27 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
68
+ /* 28 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
69
+ /* 29 */ { attention: "full", cache: 23, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
70
+ /* 30 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
71
+ /* 31 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
72
+ /* 32 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
73
+ /* 33 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
74
+ /* 34 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
75
+ /* 35 */ { attention: "full", cache: 23, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
76
+ /* 36 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
77
+ /* 37 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
78
+ /* 38 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
79
+ /* 39 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
80
+ /* 40 */ { attention: "sliding", cache: 22, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
81
+ /* 41 */ { attention: "full", cache: 23, kv: { bits: 4, groupSize: 64 }, kEqV: false, layerScalar: true },
82
+ ]);
83
+
84
+ /** Layers [0, CACHES) own a cache. */
85
+ const CACHES = 24;
86
+ /** The donors whose read later layers attend. */
87
+ const PREFIX = "language_model.model";
88
+ const FINAL_LOGIT_SOFTCAP = 30;
89
+
90
+ export const DECODE_ROWS = 8;
91
+ export const VERIFY_ROWS = 64;
92
+
93
+ export class Gemma4E4b implements MlxDeclaredGraph, MlxTokenPhases {
94
+ readonly prefixBase = PREFIX;
95
+ readonly loraState = new LoraState();
96
+ readonly weightsBytes: number;
97
+ readonly embed: QuantizedEmbedding;
98
+ readonly finalNorm: RMSNorm;
99
+ readonly embedScale: number;
100
+ readonly windowSize: number;
101
+ readonly numDonors = CACHES;
102
+ readonly perLayerWidth: number;
103
+ readonly graphCapabilities = declareGraph({ media: { input: "embeddings", video: false }, hiddenLayerTaps: true, compiledDecode: true });
104
+ makeCache!: () => Cache[];
105
+ readonly cacheLayers: readonly MlxCacheLayer[];
106
+ readonly layers: readonly GemmaInputLayer[];
107
+ readonly traceLayers: readonly GemmaInputLayer[];
108
+ readonly #constants: ReturnType<typeof ownResource<MlxArray[]>>;
109
+ readonly #parts: readonly GemmaInputLayerWeights[];
110
+ readonly prompt: readonly MlxPromptRange[];
111
+ readonly promptChunk: typeof this.prompt;
112
+ readonly multiSequencePromptChunk: typeof this.multiSequencePrompt;
113
+ readonly multiSequencePrompt: readonly MlxPromptRange[];
114
+ readonly decode: MlxRowTable<MlxCapturingForward>;
115
+ readonly verify: MlxRowTable<MlxCapturingForward>;
116
+ readonly appendKnown: MlxKnownOperations;
117
+ readonly logits: MlxRowTable<MlxHeadForward>;
118
+ readonly mixed: readonly MlxMixedRange[];
119
+ readonly #inputs: FixedPerLayerInputs;
120
+ readonly #traceInputs: TracePerLayerInputs;
121
+ readonly #l0: GemmaInputLayer;
122
+ readonly #t0: GemmaInputLayer;
123
+ readonly #l1: GemmaInputLayer;
124
+ readonly #t1: GemmaInputLayer;
125
+ readonly #l2: GemmaInputLayer;
126
+ readonly #t2: GemmaInputLayer;
127
+ readonly #l3: GemmaInputLayer;
128
+ readonly #t3: GemmaInputLayer;
129
+ readonly #l4: GemmaInputLayer;
130
+ readonly #t4: GemmaInputLayer;
131
+ readonly #l5: GemmaInputLayer;
132
+ readonly #t5: GemmaInputLayer;
133
+ readonly #l6: GemmaInputLayer;
134
+ readonly #t6: GemmaInputLayer;
135
+ readonly #l7: GemmaInputLayer;
136
+ readonly #t7: GemmaInputLayer;
137
+ readonly #l8: GemmaInputLayer;
138
+ readonly #t8: GemmaInputLayer;
139
+ readonly #l9: GemmaInputLayer;
140
+ readonly #t9: GemmaInputLayer;
141
+ readonly #l10: GemmaInputLayer;
142
+ readonly #t10: GemmaInputLayer;
143
+ readonly #l11: GemmaInputLayer;
144
+ readonly #t11: GemmaInputLayer;
145
+ readonly #l12: GemmaInputLayer;
146
+ readonly #t12: GemmaInputLayer;
147
+ readonly #l13: GemmaInputLayer;
148
+ readonly #t13: GemmaInputLayer;
149
+ readonly #l14: GemmaInputLayer;
150
+ readonly #t14: GemmaInputLayer;
151
+ readonly #l15: GemmaInputLayer;
152
+ readonly #t15: GemmaInputLayer;
153
+ readonly #l16: GemmaInputLayer;
154
+ readonly #t16: GemmaInputLayer;
155
+ readonly #l17: GemmaInputLayer;
156
+ readonly #t17: GemmaInputLayer;
157
+ readonly #l18: GemmaInputLayer;
158
+ readonly #t18: GemmaInputLayer;
159
+ readonly #l19: GemmaInputLayer;
160
+ readonly #t19: GemmaInputLayer;
161
+ readonly #l20: GemmaInputLayer;
162
+ readonly #t20: GemmaInputLayer;
163
+ readonly #l21: GemmaInputLayer;
164
+ readonly #t21: GemmaInputLayer;
165
+ readonly #l22: GemmaInputLayer;
166
+ readonly #t22: GemmaInputLayer;
167
+ readonly #l23: GemmaInputLayer;
168
+ readonly #t23: GemmaInputLayer;
169
+ readonly #l24: GemmaInputLayer;
170
+ readonly #t24: GemmaInputLayer;
171
+ readonly #l25: GemmaInputLayer;
172
+ readonly #t25: GemmaInputLayer;
173
+ readonly #l26: GemmaInputLayer;
174
+ readonly #t26: GemmaInputLayer;
175
+ readonly #l27: GemmaInputLayer;
176
+ readonly #t27: GemmaInputLayer;
177
+ readonly #l28: GemmaInputLayer;
178
+ readonly #t28: GemmaInputLayer;
179
+ readonly #l29: GemmaInputLayer;
180
+ readonly #t29: GemmaInputLayer;
181
+ readonly #l30: GemmaInputLayer;
182
+ readonly #t30: GemmaInputLayer;
183
+ readonly #l31: GemmaInputLayer;
184
+ readonly #t31: GemmaInputLayer;
185
+ readonly #l32: GemmaInputLayer;
186
+ readonly #t32: GemmaInputLayer;
187
+ readonly #l33: GemmaInputLayer;
188
+ readonly #t33: GemmaInputLayer;
189
+ readonly #l34: GemmaInputLayer;
190
+ readonly #t34: GemmaInputLayer;
191
+ readonly #l35: GemmaInputLayer;
192
+ readonly #t35: GemmaInputLayer;
193
+ readonly #l36: GemmaInputLayer;
194
+ readonly #t36: GemmaInputLayer;
195
+ readonly #l37: GemmaInputLayer;
196
+ readonly #t37: GemmaInputLayer;
197
+ readonly #l38: GemmaInputLayer;
198
+ readonly #t38: GemmaInputLayer;
199
+ readonly #l39: GemmaInputLayer;
200
+ readonly #t39: GemmaInputLayer;
201
+ readonly #l40: GemmaInputLayer;
202
+ readonly #t40: GemmaInputLayer;
203
+ readonly #l41: GemmaInputLayer;
204
+ readonly #t41: GemmaInputLayer;
205
+ constructor(weights: Weights, readonly config: ModelConfig) {
206
+ using resources = new GemmaBuildScope();
207
+ this.weightsBytes = weightBytes(weights);
208
+ this.embed = QuantizedEmbedding.load(weights, `${PREFIX}.embed_tokens`, config);
209
+ this.finalNorm = new RMSNorm(weights.tensor(`${PREFIX}.norm.weight`), config.text.rmsNormEps);
210
+ this.embedScale = Math.sqrt(config.text.hiddenSize);
211
+ this.windowSize = config.text.slidingWindow;
212
+ this.#inputs = new FixedPerLayerInputs(weights, config, PREFIX);
213
+ this.#traceInputs = new TracePerLayerInputs(weights, config, PREFIX);
214
+ this.perLayerWidth = this.#inputs.width;
215
+ const p0 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.0`, new SlidingAttention(weights, config, `${PREFIX}.layers.0.self_attn`)));
216
+ this.#l0 = new GemmaInputLayer(p0, new CompiledGegluMLP(p0.mlp));
217
+ this.#t0 = new GemmaInputLayer(p0, new PlainGegluMLP(p0.mlp));
218
+ const p1 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.1`, new SlidingAttention(weights, config, `${PREFIX}.layers.1.self_attn`)));
219
+ this.#l1 = new GemmaInputLayer(p1, new CompiledGegluMLP(p1.mlp));
220
+ this.#t1 = new GemmaInputLayer(p1, new PlainGegluMLP(p1.mlp));
221
+ const p2 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.2`, new SlidingAttention(weights, config, `${PREFIX}.layers.2.self_attn`)));
222
+ this.#l2 = new GemmaInputLayer(p2, new CompiledGegluMLP(p2.mlp));
223
+ this.#t2 = new GemmaInputLayer(p2, new PlainGegluMLP(p2.mlp));
224
+ const p3 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.3`, new SlidingAttention(weights, config, `${PREFIX}.layers.3.self_attn`)));
225
+ this.#l3 = new GemmaInputLayer(p3, new CompiledGegluMLP(p3.mlp));
226
+ this.#t3 = new GemmaInputLayer(p3, new PlainGegluMLP(p3.mlp));
227
+ const p4 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.4`, new SlidingAttention(weights, config, `${PREFIX}.layers.4.self_attn`)));
228
+ this.#l4 = new GemmaInputLayer(p4, new CompiledGegluMLP(p4.mlp));
229
+ this.#t4 = new GemmaInputLayer(p4, new PlainGegluMLP(p4.mlp));
230
+ const p5 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.5`, new FullAttention(weights, config, `${PREFIX}.layers.5.self_attn`)));
231
+ this.#l5 = new GemmaInputLayer(p5, new CompiledGegluMLP(p5.mlp));
232
+ this.#t5 = new GemmaInputLayer(p5, new PlainGegluMLP(p5.mlp));
233
+ const p6 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.6`, new SlidingAttention(weights, config, `${PREFIX}.layers.6.self_attn`)));
234
+ this.#l6 = new GemmaInputLayer(p6, new CompiledGegluMLP(p6.mlp));
235
+ this.#t6 = new GemmaInputLayer(p6, new PlainGegluMLP(p6.mlp));
236
+ const p7 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.7`, new SlidingAttention(weights, config, `${PREFIX}.layers.7.self_attn`)));
237
+ this.#l7 = new GemmaInputLayer(p7, new CompiledGegluMLP(p7.mlp));
238
+ this.#t7 = new GemmaInputLayer(p7, new PlainGegluMLP(p7.mlp));
239
+ const p8 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.8`, new SlidingAttention(weights, config, `${PREFIX}.layers.8.self_attn`)));
240
+ this.#l8 = new GemmaInputLayer(p8, new CompiledGegluMLP(p8.mlp));
241
+ this.#t8 = new GemmaInputLayer(p8, new PlainGegluMLP(p8.mlp));
242
+ const p9 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.9`, new SlidingAttention(weights, config, `${PREFIX}.layers.9.self_attn`)));
243
+ this.#l9 = new GemmaInputLayer(p9, new CompiledGegluMLP(p9.mlp));
244
+ this.#t9 = new GemmaInputLayer(p9, new PlainGegluMLP(p9.mlp));
245
+ const p10 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.10`, new SlidingAttention(weights, config, `${PREFIX}.layers.10.self_attn`)));
246
+ this.#l10 = new GemmaInputLayer(p10, new CompiledGegluMLP(p10.mlp));
247
+ this.#t10 = new GemmaInputLayer(p10, new PlainGegluMLP(p10.mlp));
248
+ const p11 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.11`, new FullAttention(weights, config, `${PREFIX}.layers.11.self_attn`)));
249
+ this.#l11 = new GemmaInputLayer(p11, new CompiledGegluMLP(p11.mlp));
250
+ this.#t11 = new GemmaInputLayer(p11, new PlainGegluMLP(p11.mlp));
251
+ const p12 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.12`, new SlidingAttention(weights, config, `${PREFIX}.layers.12.self_attn`)));
252
+ this.#l12 = new GemmaInputLayer(p12, new CompiledGegluMLP(p12.mlp));
253
+ this.#t12 = new GemmaInputLayer(p12, new PlainGegluMLP(p12.mlp));
254
+ const p13 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.13`, new SlidingAttention(weights, config, `${PREFIX}.layers.13.self_attn`)));
255
+ this.#l13 = new GemmaInputLayer(p13, new CompiledGegluMLP(p13.mlp));
256
+ this.#t13 = new GemmaInputLayer(p13, new PlainGegluMLP(p13.mlp));
257
+ const p14 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.14`, new SlidingAttention(weights, config, `${PREFIX}.layers.14.self_attn`)));
258
+ this.#l14 = new GemmaInputLayer(p14, new CompiledGegluMLP(p14.mlp));
259
+ this.#t14 = new GemmaInputLayer(p14, new PlainGegluMLP(p14.mlp));
260
+ const p15 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.15`, new SlidingAttention(weights, config, `${PREFIX}.layers.15.self_attn`)));
261
+ this.#l15 = new GemmaInputLayer(p15, new CompiledGegluMLP(p15.mlp));
262
+ this.#t15 = new GemmaInputLayer(p15, new PlainGegluMLP(p15.mlp));
263
+ const p16 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.16`, new SlidingAttention(weights, config, `${PREFIX}.layers.16.self_attn`)));
264
+ this.#l16 = new GemmaInputLayer(p16, new CompiledGegluMLP(p16.mlp));
265
+ this.#t16 = new GemmaInputLayer(p16, new PlainGegluMLP(p16.mlp));
266
+ const p17 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.17`, new FullAttention(weights, config, `${PREFIX}.layers.17.self_attn`)));
267
+ this.#l17 = new GemmaInputLayer(p17, new CompiledGegluMLP(p17.mlp));
268
+ this.#t17 = new GemmaInputLayer(p17, new PlainGegluMLP(p17.mlp));
269
+ const p18 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.18`, new SlidingAttention(weights, config, `${PREFIX}.layers.18.self_attn`)));
270
+ this.#l18 = new GemmaInputLayer(p18, new CompiledGegluMLP(p18.mlp));
271
+ this.#t18 = new GemmaInputLayer(p18, new PlainGegluMLP(p18.mlp));
272
+ const p19 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.19`, new SlidingAttention(weights, config, `${PREFIX}.layers.19.self_attn`)));
273
+ this.#l19 = new GemmaInputLayer(p19, new CompiledGegluMLP(p19.mlp));
274
+ this.#t19 = new GemmaInputLayer(p19, new PlainGegluMLP(p19.mlp));
275
+ const p20 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.20`, new SlidingAttention(weights, config, `${PREFIX}.layers.20.self_attn`)));
276
+ this.#l20 = new GemmaInputLayer(p20, new CompiledGegluMLP(p20.mlp));
277
+ this.#t20 = new GemmaInputLayer(p20, new PlainGegluMLP(p20.mlp));
278
+ const p21 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.21`, new SlidingAttention(weights, config, `${PREFIX}.layers.21.self_attn`)));
279
+ this.#l21 = new GemmaInputLayer(p21, new CompiledGegluMLP(p21.mlp));
280
+ this.#t21 = new GemmaInputLayer(p21, new PlainGegluMLP(p21.mlp));
281
+ const p22 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.22`, new SlidingAttention(weights, config, `${PREFIX}.layers.22.self_attn`)));
282
+ this.#l22 = new GemmaInputLayer(p22, new CompiledGegluMLP(p22.mlp));
283
+ this.#t22 = new GemmaInputLayer(p22, new PlainGegluMLP(p22.mlp));
284
+ const p23 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.23`, new FullAttention(weights, config, `${PREFIX}.layers.23.self_attn`)));
285
+ this.#l23 = new GemmaInputLayer(p23, new CompiledGegluMLP(p23.mlp));
286
+ this.#t23 = new GemmaInputLayer(p23, new PlainGegluMLP(p23.mlp));
287
+ const p24 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.24`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.24.self_attn`)));
288
+ this.#l24 = new GemmaInputLayer(p24, new CompiledGegluMLP(p24.mlp));
289
+ this.#t24 = new GemmaInputLayer(p24, new PlainGegluMLP(p24.mlp));
290
+ const p25 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.25`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.25.self_attn`)));
291
+ this.#l25 = new GemmaInputLayer(p25, new CompiledGegluMLP(p25.mlp));
292
+ this.#t25 = new GemmaInputLayer(p25, new PlainGegluMLP(p25.mlp));
293
+ const p26 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.26`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.26.self_attn`)));
294
+ this.#l26 = new GemmaInputLayer(p26, new CompiledGegluMLP(p26.mlp));
295
+ this.#t26 = new GemmaInputLayer(p26, new PlainGegluMLP(p26.mlp));
296
+ const p27 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.27`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.27.self_attn`)));
297
+ this.#l27 = new GemmaInputLayer(p27, new CompiledGegluMLP(p27.mlp));
298
+ this.#t27 = new GemmaInputLayer(p27, new PlainGegluMLP(p27.mlp));
299
+ const p28 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.28`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.28.self_attn`)));
300
+ this.#l28 = new GemmaInputLayer(p28, new CompiledGegluMLP(p28.mlp));
301
+ this.#t28 = new GemmaInputLayer(p28, new PlainGegluMLP(p28.mlp));
302
+ const p29 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.29`, new SharedFullAttention(weights, config, `${PREFIX}.layers.29.self_attn`)));
303
+ this.#l29 = new GemmaInputLayer(p29, new CompiledGegluMLP(p29.mlp));
304
+ this.#t29 = new GemmaInputLayer(p29, new PlainGegluMLP(p29.mlp));
305
+ const p30 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.30`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.30.self_attn`)));
306
+ this.#l30 = new GemmaInputLayer(p30, new CompiledGegluMLP(p30.mlp));
307
+ this.#t30 = new GemmaInputLayer(p30, new PlainGegluMLP(p30.mlp));
308
+ const p31 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.31`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.31.self_attn`)));
309
+ this.#l31 = new GemmaInputLayer(p31, new CompiledGegluMLP(p31.mlp));
310
+ this.#t31 = new GemmaInputLayer(p31, new PlainGegluMLP(p31.mlp));
311
+ const p32 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.32`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.32.self_attn`)));
312
+ this.#l32 = new GemmaInputLayer(p32, new CompiledGegluMLP(p32.mlp));
313
+ this.#t32 = new GemmaInputLayer(p32, new PlainGegluMLP(p32.mlp));
314
+ const p33 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.33`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.33.self_attn`)));
315
+ this.#l33 = new GemmaInputLayer(p33, new CompiledGegluMLP(p33.mlp));
316
+ this.#t33 = new GemmaInputLayer(p33, new PlainGegluMLP(p33.mlp));
317
+ const p34 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.34`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.34.self_attn`)));
318
+ this.#l34 = new GemmaInputLayer(p34, new CompiledGegluMLP(p34.mlp));
319
+ this.#t34 = new GemmaInputLayer(p34, new PlainGegluMLP(p34.mlp));
320
+ const p35 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.35`, new SharedFullAttention(weights, config, `${PREFIX}.layers.35.self_attn`)));
321
+ this.#l35 = new GemmaInputLayer(p35, new CompiledGegluMLP(p35.mlp));
322
+ this.#t35 = new GemmaInputLayer(p35, new PlainGegluMLP(p35.mlp));
323
+ const p36 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.36`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.36.self_attn`)));
324
+ this.#l36 = new GemmaInputLayer(p36, new CompiledGegluMLP(p36.mlp));
325
+ this.#t36 = new GemmaInputLayer(p36, new PlainGegluMLP(p36.mlp));
326
+ const p37 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.37`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.37.self_attn`)));
327
+ this.#l37 = new GemmaInputLayer(p37, new CompiledGegluMLP(p37.mlp));
328
+ this.#t37 = new GemmaInputLayer(p37, new PlainGegluMLP(p37.mlp));
329
+ const p38 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.38`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.38.self_attn`)));
330
+ this.#l38 = new GemmaInputLayer(p38, new CompiledGegluMLP(p38.mlp));
331
+ this.#t38 = new GemmaInputLayer(p38, new PlainGegluMLP(p38.mlp));
332
+ const p39 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.39`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.39.self_attn`)));
333
+ this.#l39 = new GemmaInputLayer(p39, new CompiledGegluMLP(p39.mlp));
334
+ this.#t39 = new GemmaInputLayer(p39, new PlainGegluMLP(p39.mlp));
335
+ const p40 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.40`, new SharedSlidingAttention(weights, config, `${PREFIX}.layers.40.self_attn`)));
336
+ this.#l40 = new GemmaInputLayer(p40, new CompiledGegluMLP(p40.mlp));
337
+ this.#t40 = new GemmaInputLayer(p40, new PlainGegluMLP(p40.mlp));
338
+ const p41 = resources.hold(new GemmaInputLayerWeights(weights, config, `${PREFIX}.layers.41`, new SharedFullAttention(weights, config, `${PREFIX}.layers.41.self_attn`)));
339
+ this.#l41 = new GemmaInputLayer(p41, new CompiledGegluMLP(p41.mlp));
340
+ this.#t41 = new GemmaInputLayer(p41, new PlainGegluMLP(p41.mlp));
341
+ this.layers = Object.freeze([this.#l0, this.#l1, this.#l2, this.#l3, this.#l4, this.#l5, this.#l6, this.#l7, this.#l8, this.#l9, this.#l10, this.#l11, this.#l12, this.#l13, this.#l14, this.#l15, this.#l16, this.#l17, this.#l18, this.#l19, this.#l20, this.#l21, this.#l22, this.#l23, this.#l24, this.#l25, this.#l26, this.#l27, this.#l28, this.#l29, this.#l30, this.#l31, this.#l32, this.#l33, this.#l34, this.#l35, this.#l36, this.#l37, this.#l38, this.#l39, this.#l40, this.#l41]);
342
+ this.traceLayers = Object.freeze([this.#t0, this.#t1, this.#t2, this.#t3, this.#t4, this.#t5, this.#t6, this.#t7, this.#t8, this.#t9, this.#t10, this.#t11, this.#t12, this.#t13, this.#t14, this.#t15, this.#t16, this.#t17, this.#t18, this.#t19, this.#t20, this.#t21, this.#t22, this.#t23, this.#t24, this.#t25, this.#t26, this.#t27, this.#t28, this.#t29, this.#t30, this.#t31, this.#t32, this.#t33, this.#t34, this.#t35, this.#t36, this.#t37, this.#t38, this.#t39, this.#t40, this.#t41]);
343
+ this.#parts = Object.freeze([p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41]);
344
+ this.#constants = resources.finish();
345
+ this.cacheLayers = Object.freeze([
346
+ { kind: "sliding", window: config.text.slidingWindow },
347
+ { kind: "sliding", window: config.text.slidingWindow },
348
+ { kind: "sliding", window: config.text.slidingWindow },
349
+ { kind: "sliding", window: config.text.slidingWindow },
350
+ { kind: "sliding", window: config.text.slidingWindow },
351
+ { kind: "full", turboQuant: "deferred" },
352
+ { kind: "sliding", window: config.text.slidingWindow },
353
+ { kind: "sliding", window: config.text.slidingWindow },
354
+ { kind: "sliding", window: config.text.slidingWindow },
355
+ { kind: "sliding", window: config.text.slidingWindow },
356
+ { kind: "sliding", window: config.text.slidingWindow },
357
+ { kind: "full", turboQuant: "deferred" },
358
+ { kind: "sliding", window: config.text.slidingWindow },
359
+ { kind: "sliding", window: config.text.slidingWindow },
360
+ { kind: "sliding", window: config.text.slidingWindow },
361
+ { kind: "sliding", window: config.text.slidingWindow },
362
+ { kind: "sliding", window: config.text.slidingWindow },
363
+ { kind: "full", turboQuant: "deferred" },
364
+ { kind: "sliding", window: config.text.slidingWindow },
365
+ { kind: "sliding", window: config.text.slidingWindow },
366
+ { kind: "sliding", window: config.text.slidingWindow },
367
+ { kind: "sliding", window: config.text.slidingWindow },
368
+ { kind: "sliding", window: config.text.slidingWindow },
369
+ { kind: "full", turboQuant: "deferred" },
370
+ ]);
371
+ this.prompt = Object.freeze([{ from: 1, to: Infinity, operation: this.#window }]);
372
+ this.promptChunk = this.prompt;
373
+ this.multiSequencePrompt = this.prompt;
374
+ this.multiSequencePromptChunk = this.multiSequencePrompt;
375
+ this.decode = Object.freeze({ 1: this.#decode, 2: this.#decode, 3: this.#decode, 4: this.#decode, 5: this.#decode, 6: this.#decode, 7: this.#decode, 8: this.#decode ,
376
+ default: this.#decode,
377
+ });
378
+ this.verify = Object.freeze({ 1: this.#window, 2: this.#window, 3: this.#window, 4: this.#window, 5: this.#window, 6: this.#window, 7: this.#window, 8: this.#window, 9: this.#window, 10: this.#window, 11: this.#window, 12: this.#window, 13: this.#window, 14: this.#window, 15: this.#window, 16: this.#window, 17: this.#window, 18: this.#window, 19: this.#window, 20: this.#window, 21: this.#window, 22: this.#window, 23: this.#window, 24: this.#window, 25: this.#window, 26: this.#window, 27: this.#window, 28: this.#window, 29: this.#window, 30: this.#window, 31: this.#window, 32: this.#window, 33: this.#window, 34: this.#window, 35: this.#window, 36: this.#window, 37: this.#window, 38: this.#window, 39: this.#window, 40: this.#window, 41: this.#window, 42: this.#window, 43: this.#window, 44: this.#window, 45: this.#window, 46: this.#window, 47: this.#window, 48: this.#window, 49: this.#window, 50: this.#window, 51: this.#window, 52: this.#window, 53: this.#window, 54: this.#window, 55: this.#window, 56: this.#window, 57: this.#window, 58: this.#window, 59: this.#window, 60: this.#window, 61: this.#window, 62: this.#window, 63: this.#window, 64: this.#window ,
379
+ default: this.#window,
380
+ });
381
+ this.appendKnown = [{ from: 1, to: Infinity, operation: this.#known }];
382
+ this.logits = Object.freeze({ 1: this.#head, 2: this.#head, 3: this.#head, 4: this.#head, 5: this.#head, 6: this.#head, 7: this.#head, 8: this.#head, 9: this.#head, 10: this.#head, 11: this.#head, 12: this.#head, 13: this.#head, 14: this.#head, 15: this.#head, 16: this.#head, 17: this.#head, 18: this.#head, 19: this.#head, 20: this.#head, 21: this.#head, 22: this.#head, 23: this.#head, 24: this.#head, 25: this.#head, 26: this.#head, 27: this.#head, 28: this.#head, 29: this.#head, 30: this.#head, 31: this.#head, 32: this.#head, 33: this.#head, 34: this.#head, 35: this.#head, 36: this.#head, 37: this.#head, 38: this.#head, 39: this.#head, 40: this.#head, 41: this.#head, 42: this.#head, 43: this.#head, 44: this.#head, 45: this.#head, 46: this.#head, 47: this.#head, 48: this.#head, 49: this.#head, 50: this.#head, 51: this.#head, 52: this.#head, 53: this.#head, 54: this.#head, 55: this.#head, 56: this.#head, 57: this.#head, 58: this.#head, 59: this.#head, 60: this.#head, 61: this.#head, 62: this.#head, 63: this.#head, 64: this.#head ,
383
+ default: this.#head,
384
+ });
385
+ this.mixed = Object.freeze([{ from: 1, to: Infinity, operation: this.#mixed }]);
386
+ }
387
+ readonly #window = (ids: MlxArray, caches: Cache[], capture: MlxLayerCapture | null): MlxArray => this.#windowHidden(this.#embedTokens(ids), caches, "window", ids, capture);
388
+ #windowHidden(hidden: MlxArray, caches: Cache[], phase: Gemma4Phase, ids: MlxArray, capture: MlxLayerCapture | null): MlxArray {
389
+ using scope = new GemmaInputForwardScope(hidden, ids, capture, CACHES, this.#inputs);
390
+ scope.own(0, this.#l0.forward(scope.hidden, caches[0]!, phase, null, scope.input(0)));
391
+ scope.own(1, this.#l1.forward(scope.hidden, caches[1]!, phase, null, scope.input(1)));
392
+ scope.own(2, this.#l2.forward(scope.hidden, caches[2]!, phase, null, scope.input(2)));
393
+ scope.own(3, this.#l3.forward(scope.hidden, caches[3]!, phase, null, scope.input(3)));
394
+ scope.own(4, this.#l4.forward(scope.hidden, caches[4]!, phase, null, scope.input(4)));
395
+ scope.own(5, this.#l5.forward(scope.hidden, caches[5]!, phase, null, scope.input(5)));
396
+ scope.own(6, this.#l6.forward(scope.hidden, caches[6]!, phase, null, scope.input(6)));
397
+ scope.own(7, this.#l7.forward(scope.hidden, caches[7]!, phase, null, scope.input(7)));
398
+ scope.own(8, this.#l8.forward(scope.hidden, caches[8]!, phase, null, scope.input(8)));
399
+ scope.own(9, this.#l9.forward(scope.hidden, caches[9]!, phase, null, scope.input(9)));
400
+ scope.own(10, this.#l10.forward(scope.hidden, caches[10]!, phase, null, scope.input(10)));
401
+ scope.own(11, this.#l11.forward(scope.hidden, caches[11]!, phase, null, scope.input(11)));
402
+ scope.own(12, this.#l12.forward(scope.hidden, caches[12]!, phase, null, scope.input(12)));
403
+ scope.own(13, this.#l13.forward(scope.hidden, caches[13]!, phase, null, scope.input(13)));
404
+ scope.own(14, this.#l14.forward(scope.hidden, caches[14]!, phase, null, scope.input(14)));
405
+ scope.own(15, this.#l15.forward(scope.hidden, caches[15]!, phase, null, scope.input(15)));
406
+ scope.own(16, this.#l16.forward(scope.hidden, caches[16]!, phase, null, scope.input(16)));
407
+ scope.own(17, this.#l17.forward(scope.hidden, caches[17]!, phase, null, scope.input(17)));
408
+ scope.own(18, this.#l18.forward(scope.hidden, caches[18]!, phase, null, scope.input(18)));
409
+ scope.own(19, this.#l19.forward(scope.hidden, caches[19]!, phase, null, scope.input(19)));
410
+ scope.own(20, this.#l20.forward(scope.hidden, caches[20]!, phase, null, scope.input(20)));
411
+ scope.own(21, this.#l21.forward(scope.hidden, caches[21]!, phase, null, scope.input(21)));
412
+ scope.donor(22, this.#l22.forward(scope.hidden, caches[22]!, phase, null, scope.input(22)));
413
+ scope.donor(23, this.#l23.forward(scope.hidden, caches[23]!, phase, null, scope.input(23)));
414
+ scope.shared(24, this.#l24.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(24)));
415
+ scope.shared(25, this.#l25.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(25)));
416
+ scope.shared(26, this.#l26.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(26)));
417
+ scope.shared(27, this.#l27.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(27)));
418
+ scope.shared(28, this.#l28.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(28)));
419
+ scope.shared(29, this.#l29.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(29)));
420
+ scope.shared(30, this.#l30.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(30)));
421
+ scope.shared(31, this.#l31.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(31)));
422
+ scope.shared(32, this.#l32.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(32)));
423
+ scope.shared(33, this.#l33.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(33)));
424
+ scope.shared(34, this.#l34.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(34)));
425
+ scope.shared(35, this.#l35.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(35)));
426
+ scope.shared(36, this.#l36.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(36)));
427
+ scope.shared(37, this.#l37.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(37)));
428
+ scope.shared(38, this.#l38.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(38)));
429
+ scope.shared(39, this.#l39.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(39)));
430
+ scope.shared(40, this.#l40.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(40)));
431
+ scope.shared(41, this.#l41.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(41)));
432
+ return scope.finish(42, this.finalNorm.forward(scope.hidden));
433
+ }
434
+ readonly #decode = (ids: MlxArray, caches: Cache[], capture: MlxLayerCapture | null): MlxArray => this.#decodeHidden(this.#embedTokens(ids), caches, "decode", ids, capture);
435
+ #decodeHidden(hidden: MlxArray, caches: Cache[], phase: Gemma4Phase, ids: MlxArray, capture: MlxLayerCapture | null): MlxArray {
436
+ using scope = new GemmaInputForwardScope(hidden, ids, capture, CACHES, this.#inputs);
437
+ scope.own(0, this.#l0.forward(scope.hidden, caches[0]!, phase, null, scope.input(0)));
438
+ scope.own(1, this.#l1.forward(scope.hidden, caches[1]!, phase, null, scope.input(1)));
439
+ scope.own(2, this.#l2.forward(scope.hidden, caches[2]!, phase, null, scope.input(2)));
440
+ scope.own(3, this.#l3.forward(scope.hidden, caches[3]!, phase, null, scope.input(3)));
441
+ scope.own(4, this.#l4.forward(scope.hidden, caches[4]!, phase, null, scope.input(4)));
442
+ scope.own(5, this.#l5.forward(scope.hidden, caches[5]!, phase, null, scope.input(5)));
443
+ scope.own(6, this.#l6.forward(scope.hidden, caches[6]!, phase, null, scope.input(6)));
444
+ scope.own(7, this.#l7.forward(scope.hidden, caches[7]!, phase, null, scope.input(7)));
445
+ scope.own(8, this.#l8.forward(scope.hidden, caches[8]!, phase, null, scope.input(8)));
446
+ scope.own(9, this.#l9.forward(scope.hidden, caches[9]!, phase, null, scope.input(9)));
447
+ scope.own(10, this.#l10.forward(scope.hidden, caches[10]!, phase, null, scope.input(10)));
448
+ scope.own(11, this.#l11.forward(scope.hidden, caches[11]!, phase, null, scope.input(11)));
449
+ scope.own(12, this.#l12.forward(scope.hidden, caches[12]!, phase, null, scope.input(12)));
450
+ scope.own(13, this.#l13.forward(scope.hidden, caches[13]!, phase, null, scope.input(13)));
451
+ scope.own(14, this.#l14.forward(scope.hidden, caches[14]!, phase, null, scope.input(14)));
452
+ scope.own(15, this.#l15.forward(scope.hidden, caches[15]!, phase, null, scope.input(15)));
453
+ scope.own(16, this.#l16.forward(scope.hidden, caches[16]!, phase, null, scope.input(16)));
454
+ scope.own(17, this.#l17.forward(scope.hidden, caches[17]!, phase, null, scope.input(17)));
455
+ scope.own(18, this.#l18.forward(scope.hidden, caches[18]!, phase, null, scope.input(18)));
456
+ scope.own(19, this.#l19.forward(scope.hidden, caches[19]!, phase, null, scope.input(19)));
457
+ scope.own(20, this.#l20.forward(scope.hidden, caches[20]!, phase, null, scope.input(20)));
458
+ scope.own(21, this.#l21.forward(scope.hidden, caches[21]!, phase, null, scope.input(21)));
459
+ scope.donor(22, this.#l22.forward(scope.hidden, caches[22]!, phase, null, scope.input(22)));
460
+ scope.donor(23, this.#l23.forward(scope.hidden, caches[23]!, phase, null, scope.input(23)));
461
+ scope.shared(24, this.#l24.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(24)));
462
+ scope.shared(25, this.#l25.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(25)));
463
+ scope.shared(26, this.#l26.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(26)));
464
+ scope.shared(27, this.#l27.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(27)));
465
+ scope.shared(28, this.#l28.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(28)));
466
+ scope.shared(29, this.#l29.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(29)));
467
+ scope.shared(30, this.#l30.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(30)));
468
+ scope.shared(31, this.#l31.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(31)));
469
+ scope.shared(32, this.#l32.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(32)));
470
+ scope.shared(33, this.#l33.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(33)));
471
+ scope.shared(34, this.#l34.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(34)));
472
+ scope.shared(35, this.#l35.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(35)));
473
+ scope.shared(36, this.#l36.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(36)));
474
+ scope.shared(37, this.#l37.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(37)));
475
+ scope.shared(38, this.#l38.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(38)));
476
+ scope.shared(39, this.#l39.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(39)));
477
+ scope.shared(40, this.#l40.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(40)));
478
+ scope.shared(41, this.#l41.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(41)));
479
+ return scope.finish(42, this.finalNorm.forward(scope.hidden));
480
+ }
481
+ readonly #traceDecode = (ids: MlxArray, caches: Cache[], capture: MlxLayerCapture | null): MlxArray => this.#traceDecodeHidden(this.#embedTokens(ids), caches, "decode", ids, capture);
482
+ #traceDecodeHidden(hidden: MlxArray, caches: Cache[], phase: Gemma4Phase, ids: MlxArray, capture: MlxLayerCapture | null): MlxArray {
483
+ using scope = new GemmaInputForwardScope(hidden, ids, capture, CACHES, this.#traceInputs);
484
+ scope.own(0, this.#t0.forward(scope.hidden, caches[0]!, phase, null, scope.input(0)));
485
+ scope.own(1, this.#t1.forward(scope.hidden, caches[1]!, phase, null, scope.input(1)));
486
+ scope.own(2, this.#t2.forward(scope.hidden, caches[2]!, phase, null, scope.input(2)));
487
+ scope.own(3, this.#t3.forward(scope.hidden, caches[3]!, phase, null, scope.input(3)));
488
+ scope.own(4, this.#t4.forward(scope.hidden, caches[4]!, phase, null, scope.input(4)));
489
+ scope.own(5, this.#t5.forward(scope.hidden, caches[5]!, phase, null, scope.input(5)));
490
+ scope.own(6, this.#t6.forward(scope.hidden, caches[6]!, phase, null, scope.input(6)));
491
+ scope.own(7, this.#t7.forward(scope.hidden, caches[7]!, phase, null, scope.input(7)));
492
+ scope.own(8, this.#t8.forward(scope.hidden, caches[8]!, phase, null, scope.input(8)));
493
+ scope.own(9, this.#t9.forward(scope.hidden, caches[9]!, phase, null, scope.input(9)));
494
+ scope.own(10, this.#t10.forward(scope.hidden, caches[10]!, phase, null, scope.input(10)));
495
+ scope.own(11, this.#t11.forward(scope.hidden, caches[11]!, phase, null, scope.input(11)));
496
+ scope.own(12, this.#t12.forward(scope.hidden, caches[12]!, phase, null, scope.input(12)));
497
+ scope.own(13, this.#t13.forward(scope.hidden, caches[13]!, phase, null, scope.input(13)));
498
+ scope.own(14, this.#t14.forward(scope.hidden, caches[14]!, phase, null, scope.input(14)));
499
+ scope.own(15, this.#t15.forward(scope.hidden, caches[15]!, phase, null, scope.input(15)));
500
+ scope.own(16, this.#t16.forward(scope.hidden, caches[16]!, phase, null, scope.input(16)));
501
+ scope.own(17, this.#t17.forward(scope.hidden, caches[17]!, phase, null, scope.input(17)));
502
+ scope.own(18, this.#t18.forward(scope.hidden, caches[18]!, phase, null, scope.input(18)));
503
+ scope.own(19, this.#t19.forward(scope.hidden, caches[19]!, phase, null, scope.input(19)));
504
+ scope.own(20, this.#t20.forward(scope.hidden, caches[20]!, phase, null, scope.input(20)));
505
+ scope.own(21, this.#t21.forward(scope.hidden, caches[21]!, phase, null, scope.input(21)));
506
+ scope.donor(22, this.#t22.forward(scope.hidden, caches[22]!, phase, null, scope.input(22)));
507
+ scope.donor(23, this.#t23.forward(scope.hidden, caches[23]!, phase, null, scope.input(23)));
508
+ scope.shared(24, this.#t24.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(24)));
509
+ scope.shared(25, this.#t25.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(25)));
510
+ scope.shared(26, this.#t26.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(26)));
511
+ scope.shared(27, this.#t27.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(27)));
512
+ scope.shared(28, this.#t28.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(28)));
513
+ scope.shared(29, this.#t29.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(29)));
514
+ scope.shared(30, this.#t30.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(30)));
515
+ scope.shared(31, this.#t31.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(31)));
516
+ scope.shared(32, this.#t32.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(32)));
517
+ scope.shared(33, this.#t33.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(33)));
518
+ scope.shared(34, this.#t34.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(34)));
519
+ scope.shared(35, this.#t35.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(35)));
520
+ scope.shared(36, this.#t36.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(36)));
521
+ scope.shared(37, this.#t37.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(37)));
522
+ scope.shared(38, this.#t38.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(38)));
523
+ scope.shared(39, this.#t39.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(39)));
524
+ scope.shared(40, this.#t40.forward(scope.hidden, null, phase, scope.reads[22]!, scope.input(40)));
525
+ scope.shared(41, this.#t41.forward(scope.hidden, null, phase, scope.reads[23]!, scope.input(41)));
526
+ return scope.finish(42, this.finalNorm.forward(scope.hidden));
527
+ }
528
+ readonly #known = (ids: MlxArray, caches: Cache[]) => this.#window(ids, caches, null);
529
+ readonly #head = (hidden: MlxArray) => { const logits = this.embed.asLinear(hidden); return disposing(logits, compiledLogitSoftcap(logits, FINAL_LOGIT_SOFTCAP)); };
530
+ readonly traceLogits = (hidden: MlxArray) => { const logits = this.embed.asLinear(hidden); return disposing(logits, logitSoftcap(logits, FINAL_LOGIT_SOFTCAP)); };
531
+ readonly traceDecode = (ids: MlxArray, caches: Cache[], capture: MlxLayerCapture | null) => this.#traceDecode(ids, caches, capture);
532
+ compiledDecodeStep() { return CompiledDecode.for(this); }
533
+ releaseCompiledDecode(): void { CompiledDecode.release(this); }
534
+ readonly #mixed = (work: Parameters<MlxMixedRange["operation"]>[0]): MlxArray[] => {
535
+ using scope = new GemmaMixedScope(work, ids => this.#embedTokens(ids), CACHES, this.#inputs);
536
+ scope.layer(0, (x, group) => ownMixed(this.#l0.forwardAttn(x, group.cache[0]!, group.phase, null)), (x, input) => this.#l0.feedforward(x, input!));
537
+ scope.layer(1, (x, group) => ownMixed(this.#l1.forwardAttn(x, group.cache[1]!, group.phase, null)), (x, input) => this.#l1.feedforward(x, input!));
538
+ scope.layer(2, (x, group) => ownMixed(this.#l2.forwardAttn(x, group.cache[2]!, group.phase, null)), (x, input) => this.#l2.feedforward(x, input!));
539
+ scope.layer(3, (x, group) => ownMixed(this.#l3.forwardAttn(x, group.cache[3]!, group.phase, null)), (x, input) => this.#l3.feedforward(x, input!));
540
+ scope.layer(4, (x, group) => ownMixed(this.#l4.forwardAttn(x, group.cache[4]!, group.phase, null)), (x, input) => this.#l4.feedforward(x, input!));
541
+ scope.layer(5, (x, group) => ownMixed(this.#l5.forwardAttn(x, group.cache[5]!, group.phase, null)), (x, input) => this.#l5.feedforward(x, input!));
542
+ scope.layer(6, (x, group) => ownMixed(this.#l6.forwardAttn(x, group.cache[6]!, group.phase, null)), (x, input) => this.#l6.feedforward(x, input!));
543
+ scope.layer(7, (x, group) => ownMixed(this.#l7.forwardAttn(x, group.cache[7]!, group.phase, null)), (x, input) => this.#l7.feedforward(x, input!));
544
+ scope.layer(8, (x, group) => ownMixed(this.#l8.forwardAttn(x, group.cache[8]!, group.phase, null)), (x, input) => this.#l8.feedforward(x, input!));
545
+ scope.layer(9, (x, group) => ownMixed(this.#l9.forwardAttn(x, group.cache[9]!, group.phase, null)), (x, input) => this.#l9.feedforward(x, input!));
546
+ scope.layer(10, (x, group) => ownMixed(this.#l10.forwardAttn(x, group.cache[10]!, group.phase, null)), (x, input) => this.#l10.feedforward(x, input!));
547
+ scope.layer(11, (x, group) => ownMixed(this.#l11.forwardAttn(x, group.cache[11]!, group.phase, null)), (x, input) => this.#l11.feedforward(x, input!));
548
+ scope.layer(12, (x, group) => ownMixed(this.#l12.forwardAttn(x, group.cache[12]!, group.phase, null)), (x, input) => this.#l12.feedforward(x, input!));
549
+ scope.layer(13, (x, group) => ownMixed(this.#l13.forwardAttn(x, group.cache[13]!, group.phase, null)), (x, input) => this.#l13.feedforward(x, input!));
550
+ scope.layer(14, (x, group) => ownMixed(this.#l14.forwardAttn(x, group.cache[14]!, group.phase, null)), (x, input) => this.#l14.feedforward(x, input!));
551
+ scope.layer(15, (x, group) => ownMixed(this.#l15.forwardAttn(x, group.cache[15]!, group.phase, null)), (x, input) => this.#l15.feedforward(x, input!));
552
+ scope.layer(16, (x, group) => ownMixed(this.#l16.forwardAttn(x, group.cache[16]!, group.phase, null)), (x, input) => this.#l16.feedforward(x, input!));
553
+ scope.layer(17, (x, group) => ownMixed(this.#l17.forwardAttn(x, group.cache[17]!, group.phase, null)), (x, input) => this.#l17.feedforward(x, input!));
554
+ scope.layer(18, (x, group) => ownMixed(this.#l18.forwardAttn(x, group.cache[18]!, group.phase, null)), (x, input) => this.#l18.feedforward(x, input!));
555
+ scope.layer(19, (x, group) => ownMixed(this.#l19.forwardAttn(x, group.cache[19]!, group.phase, null)), (x, input) => this.#l19.feedforward(x, input!));
556
+ scope.layer(20, (x, group) => ownMixed(this.#l20.forwardAttn(x, group.cache[20]!, group.phase, null)), (x, input) => this.#l20.feedforward(x, input!));
557
+ scope.layer(21, (x, group) => ownMixed(this.#l21.forwardAttn(x, group.cache[21]!, group.phase, null)), (x, input) => this.#l21.feedforward(x, input!));
558
+ scope.layer(22, (x, group) => donorMixed(group, 22, this.#l22.forwardAttn(x, group.cache[22]!, group.phase, null)), (x, input) => this.#l22.feedforward(x, input!));
559
+ scope.layer(23, (x, group) => donorMixed(group, 23, this.#l23.forwardAttn(x, group.cache[23]!, group.phase, null)), (x, input) => this.#l23.feedforward(x, input!));
560
+ scope.layer(24, (x, group) => sharedMixed(this.#l24.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l24.feedforward(x, input!));
561
+ scope.layer(25, (x, group) => sharedMixed(this.#l25.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l25.feedforward(x, input!));
562
+ scope.layer(26, (x, group) => sharedMixed(this.#l26.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l26.feedforward(x, input!));
563
+ scope.layer(27, (x, group) => sharedMixed(this.#l27.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l27.feedforward(x, input!));
564
+ scope.layer(28, (x, group) => sharedMixed(this.#l28.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l28.feedforward(x, input!));
565
+ scope.layer(29, (x, group) => sharedMixed(this.#l29.forwardAttn(x, null, group.phase, group.reads[23]!)), (x, input) => this.#l29.feedforward(x, input!));
566
+ scope.layer(30, (x, group) => sharedMixed(this.#l30.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l30.feedforward(x, input!));
567
+ scope.layer(31, (x, group) => sharedMixed(this.#l31.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l31.feedforward(x, input!));
568
+ scope.layer(32, (x, group) => sharedMixed(this.#l32.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l32.feedforward(x, input!));
569
+ scope.layer(33, (x, group) => sharedMixed(this.#l33.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l33.feedforward(x, input!));
570
+ scope.layer(34, (x, group) => sharedMixed(this.#l34.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l34.feedforward(x, input!));
571
+ scope.layer(35, (x, group) => sharedMixed(this.#l35.forwardAttn(x, null, group.phase, group.reads[23]!)), (x, input) => this.#l35.feedforward(x, input!));
572
+ scope.layer(36, (x, group) => sharedMixed(this.#l36.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l36.feedforward(x, input!));
573
+ scope.layer(37, (x, group) => sharedMixed(this.#l37.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l37.feedforward(x, input!));
574
+ scope.layer(38, (x, group) => sharedMixed(this.#l38.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l38.feedforward(x, input!));
575
+ scope.layer(39, (x, group) => sharedMixed(this.#l39.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l39.feedforward(x, input!));
576
+ scope.layer(40, (x, group) => sharedMixed(this.#l40.forwardAttn(x, null, group.phase, group.reads[22]!)), (x, input) => this.#l40.feedforward(x, input!));
577
+ scope.layer(41, (x, group) => sharedMixed(this.#l41.forwardAttn(x, null, group.phase, group.reads[23]!)), (x, input) => this.#l41.feedforward(x, input!));
578
+ return scope.finish(42, this.finalNorm);
579
+ };
580
+ #embedTokens(ids: MlxArray): MlxArray { const hidden = this.embed.encode(ids); return disposing(hidden, ops.mulScalar(hidden, this.embedScale)); }
581
+ loraTargets() { return inputLoraTargets(this.#parts); }
582
+ materializeGraphConstants(): void { ops.evalAll(this.#constants.borrow()); }
583
+ dispose(): void { this.#constants.close(); }
584
+ bindMediaInput(input: Vision) { return bindGemma4MediaInput(this, input); }
585
+ mediaEncoders(modelDir: string, probes: MediaSidecarProbes) { return gemma4MediaEncoders(this, modelDir, probes); }
586
+ draftTarget(caches: Cache[]) { return gemma4DraftTarget(this, caches); }
587
+ logitsFromHidden(hidden: MlxArray): MlxArray { return this.#head(hidden); }
588
+ readonly mixedSeparate = Object.freeze({
589
+ decode: Object.freeze([{ from: 1, to: Infinity, operation: (group: MlxPhaseGroup) => this.#decode(group.ids, group.state, group.capture) }]),
590
+ window: Object.freeze([{ from: 1, to: Infinity, operation: (group: MlxPhaseGroup) => this.#window(group.ids, group.state, group.capture) }]),
591
+ verify: Object.freeze([{ from: 1, to: Infinity, operation: (group: MlxPhaseGroup) => this.#window(group.ids, group.state, group.capture) }]),
592
+ });
593
+ readonly sequence = Object.freeze([{ from: 1, to: Infinity, operation: (ids: MlxArray, caches: Cache[]) => this.#window(ids, caches, null) }]);
594
+ sequenceHidden(ids: MlxArray, caches: Cache[], _rows: number): MlxArray { return this.#window(ids, caches, null); }
595
+
596
+ readonly mediaPrefill = Object.freeze([{ from: 1, to: Infinity, operation: (embeds: MlxArray, caches: Cache[], bidir: MlxArray | null, ids: MlxArray, multimodal: MlxArray | null) => writtenInputMedia(this.embedScale, (hidden, cache, phase, tokens) => this.#windowHidden(hidden, cache, phase, tokens, null), embeds, caches, bidir, ids, multimodal) }]);
597
+ prefillEmbeddings(embeds: MlxArray, caches: Cache[], bidir: MlxArray | null, ids: MlxArray, multimodal: MlxArray | null = null): MlxArray { return this.mediaPrefill[0]!.operation(embeds, caches, bidir, ids, multimodal); }
598
+ }
599
+ import { writtenMedia, writtenInputMedia } from "./written-input";