@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,104 @@
1
+ import { pagedDecodeCompiles } from "../../state/paged/cache";
2
+ import type { GraphDescriptor } from "../../contracts/portable/graph";
3
+ import type { MlxArray } from "@mlx-bun/mlx/array";
4
+ import type { Cache } from "../../contracts/mlx/cache";
5
+ import type { MlxCompiledDecodeStep, MlxKnownSpans, MlxModelMemory } from "../../contracts/mlx/graph";
6
+ import { compiledDecodeStepOf, tokenPhasesOf } from "../../models/capabilities";
7
+ import { runtimeConfig, type RuntimeConfig } from "../../runtime/config";
8
+ import type { MlxTokenGraph } from "../../models/graph";
9
+ import type { PrefillPolicy } from "../../contracts/portable/prefill";
10
+ import { resolveMlxPrefillPolicy } from "./prefill-policy";
11
+ import { COMPOSITION_DEFAULTS, type KvStorageScheme, type PagedKvComposition } from "../../contracts/portable/composition";
12
+ import { MlxPhaseDispatch } from "../phase-dispatch";
13
+
14
+ export type { MlxModelMemory };
15
+
16
+ export interface MlxDecodeStep {
17
+ /** Consume one pending token and advance state once. Returned arrays belong
18
+ * to the caller. A step that throws fails the generation. */
19
+ step(token: MlxArray, state: Cache[]): { logits: MlxArray; evalWith: MlxArray[] };
20
+ /** Release per-run workspaces after pending outputs are dropped and before
21
+ * cache disposal. Wait for native work if releasing requires completion. */
22
+ close(): void | Promise<void>;
23
+ }
24
+
25
+ /** One replaceable binding owns all graph-specific operations used by the AR
26
+ * loop: the graph's named phases and the facts the loop reads once. The
27
+ * current method requires MLX tensors and the legacy Cache[] ABI. Weights are
28
+ * borrowed for the binding's lifetime; generated caches are owned by the run.
29
+ * Caller-provided caches and media remain borrowed. */
30
+ export interface MlxAutoregressiveBinding {
31
+ readonly runtime?: RuntimeConfig;
32
+ readonly prefillPolicy?: PrefillPolicy;
33
+ readonly descriptor: GraphDescriptor;
34
+ /** The graph's phase operations. */
35
+ readonly phases: MlxPhaseDispatch;
36
+ readonly eosTokenIds: readonly number[];
37
+ readonly memory: MlxModelMemory;
38
+ readonly adapters?: { active: string[] };
39
+ /** The composition's KV scheme, which `makeCache` composes; absent: bf16. */
40
+ readonly kv?: KvStorageScheme;
41
+ /** The composition's paging (`pagedKv`); absent: none. */
42
+ readonly pagedKv?: PagedKvComposition | null;
43
+ /** The composition's `prefillTailSplit`; absent: the default. */
44
+ readonly prefillTailSplit?: boolean;
45
+ /** The composition's `grammarJump`; absent: the default. */
46
+ readonly grammarJump?: boolean;
47
+ /** The graph's committed known-token spans, when it declares them. */
48
+ readonly knownSpans?: MlxKnownSpans;
49
+ makeCache(): Cache[];
50
+ /** The vision prefill phase over prepared embeddings (borrowed). */
51
+ prefillEmbeddings?(
52
+ embeddings: MlxArray, state: Cache[], imageMask: MlxArray | null,
53
+ ids: MlxArray, multimodalMask: MlxArray | null, width: number,
54
+ ): MlxArray;
55
+ /** The graph's compiled decode step for this run, chosen once after
56
+ * prefill: present when the graph declares one, the run allows replay and
57
+ * its composition kept compiled decode on. A compiled/fused decoder belongs to
58
+ * THIS graph, never to a model inferred from a name or inherited by a
59
+ * replacement. */
60
+ createDecode?(policy: { hasAdapters: boolean }): MlxDecodeStep | null;
61
+ }
62
+
63
+ /** Bind a resident graph to the autoregressive method: its phases, caches and
64
+ * memory, and the compiled decode step it declares. Nothing here reads which
65
+ * model the graph is. */
66
+ export function bindMlxAutoregressiveGraph(model: MlxTokenGraph): MlxAutoregressiveBinding {
67
+ const runtime = runtimeConfig();
68
+ const facts = model.composition ?? COMPOSITION_DEFAULTS;
69
+ const compiledOn = (!model.composition?.pagedKv || pagedDecodeCompiles(model.composition.pagedKv, model.composition.kv));
70
+ return {
71
+ runtime,
72
+ prefillPolicy: resolveMlxPrefillPolicy(model, runtime),
73
+ descriptor: Object.freeze({ id: `legacy:${model.config.modelType}`, artifact: "legacy-resident-model",
74
+ stateAbi: "legacy-cache-array-v1", backend: "mlx", graphAbi: "mlx-hidden-bsh-v1" }),
75
+ phases: new MlxPhaseDispatch(tokenPhasesOf(model)),
76
+ eosTokenIds: model.config.eosTokenIds,
77
+ memory: model,
78
+ adapters: model.loraState,
79
+ ...(model.composition ? { kv: model.composition.kv } : {}),
80
+ pagedKv: facts.pagedKv ?? null, prefillTailSplit: facts.prefillTailSplit, grammarJump: facts.grammarJump,
81
+ ...(model.knownSpans ? { knownSpans: model.knownSpans } : {}),
82
+ makeCache: model.makeCache.bind(model),
83
+ prefillEmbeddings: model.embeddingPrompt ? (embeddings, caches, imageMask, ids, multimodalMask, rows) =>
84
+ model.embeddingPrompt!.find(range => rows >= range.from && rows <= range.to)!.operation(embeddings, caches, imageMask, ids, multimodalMask)
85
+ : model.prefillEmbeddings?.bind(model),
86
+ createDecode(policy) {
87
+ // Only a graph that declares a compiled step has one, and only a
88
+ // composition whose storage the step drives keeps it on. Adapters would
89
+ // bake residuals into the tape.
90
+ if (!compiledOn || policy.hasAdapters) return null;
91
+ const compiled: MlxCompiledDecodeStep | null = compiledDecodeStepOf(model);
92
+ if (!compiled) return null;
93
+ // The graph owns the compiled closures; its unload releases them.
94
+ return { step: (token, caches) => compiled.step(token, caches), close() {} };
95
+ },
96
+ };
97
+ }
98
+
99
+ export function assertMlxAutoregressiveBinding(binding: MlxAutoregressiveBinding): void {
100
+ const descriptor = binding.descriptor;
101
+ if (descriptor.backend !== "mlx" || descriptor.graphAbi !== "mlx-hidden-bsh-v1" ||
102
+ descriptor.stateAbi !== "legacy-cache-array-v1")
103
+ throw new Error(`AR binding ${descriptor.id} has an incompatible backend, graph, or state ABI`);
104
+ }
@@ -0,0 +1,60 @@
1
+ import type { DenoisingGraph } from "../../contracts/portable/denoising";
2
+ import type { MlxArray } from "@mlx-bun/mlx/array";
3
+ import type { Cache } from "../../contracts/mlx/cache";
4
+ import type { MlxModelMemory } from "./autoregressive";
5
+ import type { MlxDeclaredGraph, MlxDenoisingOperations } from "../../contracts/mlx/graph";
6
+ import { declaredGraph } from "../../models/capabilities";
7
+ import { disposeResources } from "../../runtime/resources";
8
+ import { runtimeConfig, type RuntimeConfig } from "../../runtime/config";
9
+
10
+ export interface MlxDenoisingBinding<State = Cache[]> {
11
+ readonly runtime?: RuntimeConfig;
12
+ readonly graph: DenoisingGraph<MlxArray, State>;
13
+ readonly memory: MlxModelMemory;
14
+ readonly adapters?: { active: string[] };
15
+ }
16
+
17
+ /** A resident graph as the denoising binding takes it: its declaration, the denoising operations the
18
+ * declared method promises, its weights for the wired-limit scope and its mounted adapters. */
19
+ export type MlxDenoisingModel = MlxDeclaredGraph & MlxModelMemory & Partial<MlxDenoisingOperations> &
20
+ { readonly loraState?: { active: string[] } };
21
+
22
+ /** Only a graph that declares the denoising method binds here, and it must provide the operations. */
23
+ export function bindLegacyDenoisingModel(resident: MlxDenoisingModel): MlxDenoisingBinding {
24
+ if (declaredGraph(resident).graphCapabilities.method !== "denoising")
25
+ throw new TypeError("the graph does not declare the denoising method");
26
+ const model = resident as MlxDenoisingOperations;
27
+ for (const operation of ["extendPrefill", "decoderLogits", "dequantEmbedWeight", "softEmbeddings"] as const)
28
+ if (typeof model[operation] !== "function")
29
+ throw new TypeError(`the graph declares the denoising method but provides no ${operation}`);
30
+ if (!model.denoisingPrefill && typeof model.prefill !== "function")
31
+ throw new TypeError("the graph declares the denoising method but provides no prefill");
32
+ return {
33
+ runtime: runtimeConfig(),
34
+ memory: resident, adapters: resident.loraState,
35
+ graph: {
36
+ descriptor: Object.freeze({ id: "legacy-diffusion-gemma", backend: "mlx",
37
+ graphAbi: "mlx-denoising-v1", stateAbi: "legacy-cache-array-v1", artifact: "legacy-resident-model" }),
38
+ vocabSize: model.config.text.vocabSize, canvasLength: model.canvasLength, embedScale: model.embedScale,
39
+ prefill: (ids, vision) => model.denoisingPrefill
40
+ ? model.denoisingPrefill.find(range => ids.length >= range.from && ids.length <= range.to)!.operation(ids, vision ?? null)
41
+ : vision ? model.prefillVision!(ids, vision) : model.prefill!(ids),
42
+ extendPrefill: (tokens,state) => model.denoisingAppend
43
+ ? model.denoisingAppend.find(range=>tokens.size>=range.from && tokens.size<=range.to)!.operation(tokens,state)
44
+ : model.extendPrefill(tokens,state),
45
+ decoderLogits: (canvas,state,feedback) => model.denoisingDecode
46
+ ? model.denoisingDecode.find(range=>canvas.size>=range.from && canvas.size<=range.to)!.operation(canvas,state,feedback)
47
+ : model.decoderLogits(canvas,state,feedback),
48
+ dequantEmbedWeight: model.dequantEmbedWeight.bind(model),
49
+ softEmbeddings: model.softEmbeddings.bind(model),
50
+ closeState: disposeResources,
51
+ },
52
+ };
53
+ }
54
+
55
+ export function assertMlxDenoisingGraph<State>(graph: DenoisingGraph<MlxArray, State>): void {
56
+ const descriptor = graph.descriptor;
57
+ if (descriptor.backend !== "mlx" || descriptor.graphAbi !== "mlx-denoising-v1" ||
58
+ !descriptor.stateAbi)
59
+ throw new Error(`denoising graph ${descriptor.id} has an incompatible backend, graph, or state ABI`);
60
+ }
@@ -0,0 +1,36 @@
1
+ import type { ModelConfig } from "../../artifacts/config";
2
+ import type { GraphDeclaration } from "../../contracts/portable/graph";
3
+ import { declaredGraph } from "../../models/capabilities";
4
+ import type { PrefillPolicy } from "../../contracts/portable/prefill";
5
+ import { sdpaFallbackBytes } from "../../state/kv-scheme";
6
+ import type { RuntimeConfig } from "../../runtime/config";
7
+
8
+ /** The graph facts prefill sizing reads: its geometry and its declaration. */
9
+ export interface PrefillSizedGraph {
10
+ readonly config: ModelConfig;
11
+ readonly graphCapabilities: GraphDeclaration;
12
+ }
13
+
14
+ /** Retain large chunks for short prompts, but where the graph declares a
15
+ * bounded prefill workspace, bound the materialized attention score workspace
16
+ * at long context. This changes work size, never request admission. Explicit
17
+ * chunk settings remain exact. */
18
+ export function resolveMlxPrefillPolicy(graph: PrefillSizedGraph, runtime: RuntimeConfig,
19
+ override?: number): PrefillPolicy {
20
+ const explicit = override ?? (runtime.value("MLX_BUN_RD_PREFILL_CHUNK") === undefined
21
+ ? undefined : runtime.number("MLX_BUN_RD_PREFILL_CHUNK", 2048));
22
+ if (explicit !== undefined) {
23
+ const chunk = Math.max(1, Math.floor(explicit));
24
+ return { chunkSize: () => chunk };
25
+ }
26
+ if (!declaredGraph(graph).graphCapabilities.prefill.boundedWorkspace) return { chunkSize: () => 2048 };
27
+ const config = graph.config;
28
+ // Capture geometry now, independently of later configuration mutation.
29
+ const geometry = { ...config, text: { ...config.text, layerTypes: [...(config.text.layerTypes ?? [])] } };
30
+ const workspaceBytes = 1024 ** 3;
31
+ return { chunkSize(promptTokens) {
32
+ let chunk = 2048;
33
+ while (chunk > 8 && sdpaFallbackBytes(geometry, chunk, promptTokens) > workspaceBytes) chunk /= 2;
34
+ return chunk;
35
+ } };
36
+ }
@@ -0,0 +1,60 @@
1
+ import type { GenerateOptions } from "./types";
2
+ import type { ResolvedExecution } from "../contracts/portable/execution";
3
+ import { createHash } from "node:crypto";
4
+
5
+ /** Sort object fields only; array order is meaningful for adapter composition,
6
+ * stop handling and quantization recipes. */
7
+ function canonical(value: unknown): unknown {
8
+ if (Array.isArray(value)) return value.map(canonical);
9
+ if (value && typeof value === "object")
10
+ return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))
11
+ .map(([key, item]) => [key, canonical(item)]));
12
+ return value;
13
+ }
14
+
15
+ /** Stable identity for an exactly resumable generation. The prompt already
16
+ * includes rendered messages and tool schemas; the remaining fields cover
17
+ * every sampling policy that can change the continuation. The KV scheme is
18
+ * the composition's: the store holding the checkpoint is keyed by it. */
19
+ export function generationCheckpointKey(
20
+ promptIds: number[], options: GenerateOptions & { stopSequences?: readonly string[] }, cacheNs = "",
21
+ execution?: ResolvedExecution, bindingIdentity?: unknown,
22
+ ): string {
23
+ const policy = {
24
+ version: 5,
25
+ execution: execution && { method: execution.method, mechanism: execution.mechanism,
26
+ fill: execution.fill,
27
+ compiledDecode: execution.compiledDecode, grammarJump: execution.grammarJump },
28
+ bindingIdentity,
29
+ stopSequences: options.stopSequences ?? [],
30
+ cacheNs,
31
+ promptIds,
32
+ maxTokens: options.maxTokens,
33
+ eosTokenIds: options.eosTokenIds,
34
+ temperature: options.temperature,
35
+ topP: options.topP,
36
+ topK: options.topK,
37
+ minP: options.minP,
38
+ minTokensToKeep: options.minTokensToKeep,
39
+ xtcProbability: options.xtcProbability,
40
+ xtcThreshold: options.xtcThreshold,
41
+ xtcSpecialTokens: options.xtcSpecialTokens,
42
+ // A missing client seed means "fresh randomness" for a new request, but
43
+ // an identical RETRY must find the durable checkpoint and restore the
44
+ // original random stream. Keep the generated seed out of request identity;
45
+ // it travels in checkpoint metadata instead. Explicit seeds remain part of
46
+ // the policy, so changing one cannot select an incompatible checkpoint.
47
+ seedMode: options.seedWasExplicit ? "explicit" : "server-default",
48
+ seed: options.seedWasExplicit ? options.seed : undefined,
49
+ hlg: options.hlg,
50
+ curve: options.curve,
51
+ logitBias: options.logitBias,
52
+ repetitionPenalty: options.repetitionPenalty,
53
+ repetitionContextSize: options.repetitionContextSize,
54
+ presencePenalty: options.presencePenalty,
55
+ presenceContextSize: options.presenceContextSize,
56
+ frequencyPenalty: options.frequencyPenalty,
57
+ frequencyContextSize: options.frequencyContextSize,
58
+ };
59
+ return createHash("sha256").update(JSON.stringify(canonical(policy))).digest("hex");
60
+ }
@@ -0,0 +1,85 @@
1
+ // Denoising generation: adapts a non-autoregressive denoising graph to the
2
+ // Generation contract. The denoising engine runs its own prefill and canvas
3
+ // loop to completion (`denoiseAsync`); only then are the finished canvas's
4
+ // tokens yielded one by one, so nothing streams while it runs. There is no
5
+ // chunked prefill, decode pipelining or early token-zero yield here (those are
6
+ // the autoregressive path), and prefill/cache stats are zero.
7
+
8
+ import { runtimeConfig } from "../runtime/config";
9
+ import { type MlxDenoisingBinding } from "./bindings/denoising";
10
+ import { adapterScoped,modelNeedsWiredLimit,usageScoped,wiredScoped } from "./scopes";
11
+ import { denoiseAsync, type DiffusionGenOptions } from "./diffusion";
12
+ import { Generation } from "./result";
13
+ import { GenerateOptions,GenerateStats,GeneratedToken } from "./types";
14
+
15
+ /** Denoising bindings use their own state and feedback graph. Each request
16
+ * draws from its own key sequence; callers still serialize model access. */
17
+ export function generateDenoising<State>(
18
+ binding: MlxDenoisingBinding<State>, promptTokens: number[], options: GenerateOptions = {},
19
+ ): Generation {
20
+ let inner = generateDiffusionInner(binding, promptTokens, options);
21
+ if (options.adapters?.length && binding.adapters)
22
+ inner = adapterScoped({ loraState: binding.adapters }, options.adapters, inner);
23
+ if (binding.memory.expertRuntime?.finishUsage || binding.memory.expertRuntime?.flushUsage)
24
+ inner = usageScoped(binding.memory, inner);
25
+ const runtime = binding.runtime ?? runtimeConfig();
26
+ return new Generation(modelNeedsWiredLimit(binding.memory, undefined,
27
+ runtime.value("MLX_BUN_FORCE_WIRE") === "1") ? wiredScoped(inner) : inner, runtime);
28
+ }
29
+
30
+ /** The served denoising request: greedy confidence-threshold, a fresh canvas
31
+ * seed unless the caller pins one, the checkpoint's stopping set {1, 106}
32
+ * united with any caller EOS, and 256 tokens unless the caller sets a limit. */
33
+ export function denoisingRequestOptions(options: GenerateOptions): DiffusionGenOptions {
34
+ const seed =
35
+ options.seed !== undefined
36
+ ? BigInt(options.seed)
37
+ : BigInt(Math.floor(Math.random() * 0x7fffffff));
38
+ return {
39
+ maxTokens: options.maxTokens ?? 256,
40
+ sampler: "confidence-threshold",
41
+ temperature: 0,
42
+ eosTokenIds: [...new Set([1, 106, ...(options.eosTokenIds ?? [])])],
43
+ seed,
44
+ visionPixels: options.visionPixels,
45
+ };
46
+ }
47
+
48
+ /** Non-autoregressive diffusion generation, adapted to the AR Generation
49
+ * contract. Runs the denoising engine (its own prefill + canvas loop) and
50
+ * streams the emitted tokens. v1: greedy (temperature 0, confidence-threshold
51
+ * sampler — the OptiQ default); per-block intra-stream + temperature>0
52
+ * (categorical) are follow-ups. */
53
+ async function* generateDiffusionInner<State>(
54
+ binding: MlxDenoisingBinding<State>,
55
+ promptTokens: number[],
56
+ options: GenerateOptions,
57
+ ): AsyncGenerator<GeneratedToken, GenerateStats> {
58
+ options.signal?.throwIfAborted();
59
+ const t0 = performance.now();
60
+ const result = await denoiseAsync(binding.graph, promptTokens, denoisingRequestOptions(options), options.signal);
61
+ const decodeMs = performance.now() - t0;
62
+ let index = 0;
63
+ let failure: { error: unknown } | undefined;
64
+ try {
65
+ for (const token of result.tokens) {
66
+ options.signal?.throwIfAborted();
67
+ yield { token, index: index++ };
68
+ }
69
+ } catch (error) { failure = { error }; }
70
+ finally {
71
+ // A stop parser may close delivery before the finished canvas is exhausted.
72
+ // Settle the emitted count on return(), without suppressing cancellation/errors.
73
+ if (failure) throw failure.error;
74
+ return {
75
+ promptTokens: promptTokens.length,
76
+ cachedTokens: 0,
77
+ generatedTokens: index,
78
+ prefillTps: 0,
79
+ decodeTps: index / Math.max(decodeMs / 1000, 1e-9),
80
+ prefillMs: 0,
81
+ decodeMs,
82
+ cacheTokens: [],
83
+ };
84
+ }
85
+ }