@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.
- package/LICENSE +21 -0
- package/README.md +1475 -2
- package/THIRD_PARTY_NOTICES.md +3404 -0
- package/dist/native/libmlx_bun_ane.dylib +0 -0
- package/dist/native/libmlx_bun_expert_io.dylib +0 -0
- package/dist/native/mlx-bun-frame-extract +0 -0
- package/examples/fit-model.ts +25 -0
- package/examples/qwen3-forward.ts +42 -0
- package/examples/qwen3-generate.ts +28 -0
- package/examples/trellis-expand.ts +23 -0
- package/package.json +129 -4
- package/src/adapters/available.ts +110 -0
- package/src/adapters/index.ts +3 -0
- package/src/adapters/manager.ts +316 -0
- package/src/artifacts/auxiliary-files.ts +45 -0
- package/src/artifacts/config-dialects.ts +94 -0
- package/src/artifacts/config.ts +341 -0
- package/src/artifacts/draft-vocabulary.ts +30 -0
- package/src/artifacts/expert-offload-build.ts +75 -0
- package/src/artifacts/expert-offload.ts +89 -0
- package/src/artifacts/experts/index.ts +3 -0
- package/src/artifacts/experts/io.ts +386 -0
- package/src/artifacts/experts/residency.ts +1134 -0
- package/src/artifacts/experts/usage.ts +415 -0
- package/src/artifacts/fingerprint.ts +44 -0
- package/src/artifacts/glm52/container.ts +305 -0
- package/src/artifacts/glm52/expert-layout.ts +249 -0
- package/src/artifacts/glm52/index.ts +7 -0
- package/src/artifacts/glm52/kernel-layout.ts +124 -0
- package/src/artifacts/glm52/layout.ts +152 -0
- package/src/artifacts/glm52/memory.ts +500 -0
- package/src/artifacts/glm52/resident-weights.ts +135 -0
- package/src/artifacts/glm52/weights.ts +503 -0
- package/src/artifacts/glm52-config.ts +262 -0
- package/src/artifacts/identity.ts +94 -0
- package/src/artifacts/index.ts +15 -0
- package/src/artifacts/mmap.ts +90 -0
- package/src/artifacts/safetensors-writer.ts +249 -0
- package/src/artifacts/safetensors.ts +164 -0
- package/src/artifacts/turboquant-fold.ts +42 -0
- package/src/artifacts/weight-audit.ts +43 -0
- package/src/artifacts/weights.ts +255 -0
- package/src/contracts/index.ts +2 -0
- package/src/contracts/mlx/attention.ts +8 -0
- package/src/contracts/mlx/cache.ts +510 -0
- package/src/contracts/mlx/checkpoint.ts +10 -0
- package/src/contracts/mlx/draft-checkpoint.ts +14 -0
- package/src/contracts/mlx/draft-projection.ts +27 -0
- package/src/contracts/mlx/draft-target.ts +84 -0
- package/src/contracts/mlx/drafter.ts +176 -0
- package/src/contracts/mlx/forward-work.ts +23 -0
- package/src/contracts/mlx/glm52-weights.ts +25 -0
- package/src/contracts/mlx/graph.ts +309 -0
- package/src/contracts/mlx/head.ts +6 -0
- package/src/contracts/mlx/index.ts +15 -0
- package/src/contracts/mlx/kv-codec.ts +9 -0
- package/src/contracts/mlx/media.ts +113 -0
- package/src/contracts/mlx/positions.ts +16 -0
- package/src/contracts/mlx/row-table.ts +2 -0
- package/src/contracts/mlx/trainable.ts +103 -0
- package/src/contracts/mlx/whisper.ts +96 -0
- package/src/contracts/portable/composition.ts +106 -0
- package/src/contracts/portable/denoising.ts +17 -0
- package/src/contracts/portable/execution.ts +79 -0
- package/src/contracts/portable/generation.ts +103 -0
- package/src/contracts/portable/graph.ts +80 -0
- package/src/contracts/portable/index.ts +15 -0
- package/src/contracts/portable/memory-plan.ts +26 -0
- package/src/contracts/portable/object-cache.ts +8 -0
- package/src/contracts/portable/prefill.ts +63 -0
- package/src/contracts/portable/prefix-cache.ts +33 -0
- package/src/contracts/portable/prompt.ts +2 -0
- package/src/contracts/portable/resources.ts +25 -0
- package/src/contracts/portable/rollback.ts +7 -0
- package/src/contracts/portable/sampling.ts +44 -0
- package/src/contracts/portable/scheduling.ts +54 -0
- package/src/contracts/portable/token-delivery.ts +4 -0
- package/src/contracts/portable/tsconfig.json +14 -0
- package/src/embeddings/index.ts +1 -0
- package/src/embeddings/text.ts +85 -0
- package/src/execution/admission.ts +59 -0
- package/src/execution/batch-group.ts +1240 -0
- package/src/execution/batch-types.ts +225 -0
- package/src/execution/cancellation.ts +38 -0
- package/src/execution/continuation-request.ts +45 -0
- package/src/execution/continuation-types.ts +10 -0
- package/src/execution/coordinator.ts +70 -0
- package/src/execution/denoising-group.ts +180 -0
- package/src/execution/engine.ts +56 -0
- package/src/execution/fill-group.ts +505 -0
- package/src/execution/fit.ts +184 -0
- package/src/execution/gateway-binding.ts +178 -0
- package/src/execution/grammar-group.ts +224 -0
- package/src/execution/index.ts +18 -0
- package/src/execution/methods.ts +75 -0
- package/src/execution/mixed-iteration.ts +96 -0
- package/src/execution/plan.ts +65 -0
- package/src/execution/prefill-cohort.ts +100 -0
- package/src/execution/prefill-rows.ts +263 -0
- package/src/execution/request-policy.ts +19 -0
- package/src/execution/row-sampling.ts +49 -0
- package/src/execution/scheduler.ts +92 -0
- package/src/execution/session.ts +247 -0
- package/src/execution/speculative-group.ts +797 -0
- package/src/execution/tasks.ts +44 -0
- package/src/generation/autoregressive.ts +840 -0
- package/src/generation/bindings/autoregressive.ts +104 -0
- package/src/generation/bindings/denoising.ts +60 -0
- package/src/generation/bindings/prefill-policy.ts +36 -0
- package/src/generation/checkpoint-identity.ts +60 -0
- package/src/generation/denoising.ts +85 -0
- package/src/generation/diffusion.ts +583 -0
- package/src/generation/fill/echo-index.ts +188 -0
- package/src/generation/fill/index.ts +3 -0
- package/src/generation/fill/proposal.ts +69 -0
- package/src/generation/fill/schema-rows.ts +506 -0
- package/src/generation/fill/session.ts +464 -0
- package/src/generation/fill/tool-boundary.ts +103 -0
- package/src/generation/fill-append.ts +58 -0
- package/src/generation/generate.ts +44 -0
- package/src/generation/grammar-step.ts +39 -0
- package/src/generation/index.ts +14 -0
- package/src/generation/phase-dispatch.ts +115 -0
- package/src/generation/prefill.ts +33 -0
- package/src/generation/result.ts +49 -0
- package/src/generation/scopes.ts +157 -0
- package/src/generation/speculative/acceptance.ts +41 -0
- package/src/generation/speculative/adaptive-draft-gate.ts +166 -0
- package/src/generation/speculative/bindings/assistant-rows.ts +102 -0
- package/src/generation/speculative/bindings/autoregressive-rows.ts +124 -0
- package/src/generation/speculative/bindings/binding.ts +106 -0
- package/src/generation/speculative/bindings/deepspec-rows.ts +33 -0
- package/src/generation/speculative/bindings/draft-target.ts +10 -0
- package/src/generation/speculative/bindings/glm52-mtp-rows.ts +128 -0
- package/src/generation/speculative/bindings/projected-context-rows.ts +78 -0
- package/src/generation/speculative/bindings/projected-draft-rows.ts +95 -0
- package/src/generation/speculative/bindings/qwen-mtp-rows.ts +336 -0
- package/src/generation/speculative/bindings/two-model-rows.ts +63 -0
- package/src/generation/speculative/cache-identity.ts +16 -0
- package/src/generation/speculative/draft-kind.ts +149 -0
- package/src/generation/speculative/draft-policy.ts +41 -0
- package/src/generation/speculative/draft-registry.ts +118 -0
- package/src/generation/speculative/draft-vocab.ts +110 -0
- package/src/generation/speculative/index.ts +17 -0
- package/src/generation/speculative/output.ts +49 -0
- package/src/generation/speculative/round.ts +307 -0
- package/src/generation/speculative/source.ts +144 -0
- package/src/generation/speculative/sources/assistant-source.ts +64 -0
- package/src/generation/speculative/sources/deepspec-source.ts +70 -0
- package/src/generation/speculative/sources/dflash-source.ts +84 -0
- package/src/generation/speculative/sources/dflash2-source.ts +86 -0
- package/src/generation/speculative/sources/glm52-mtp-source.ts +66 -0
- package/src/generation/speculative/sources/ngram-source.ts +165 -0
- package/src/generation/speculative/sources/qwen-mtp-source.ts +154 -0
- package/src/generation/speculative/sources/two-model.ts +75 -0
- package/src/generation/types.ts +194 -0
- package/src/index.ts +20 -0
- package/src/input/audio/audiotoolbox.ts +112 -0
- package/src/input/audio/decode.ts +133 -0
- package/src/input/audio/features.ts +202 -0
- package/src/input/audio/index.ts +6 -0
- package/src/input/audio/transcode.ts +67 -0
- package/src/input/audio/whisper-mel.ts +185 -0
- package/src/input/audio/whisper-tokenizer.ts +238 -0
- package/src/input/chat-template.ts +389 -0
- package/src/input/index.ts +6 -0
- package/src/input/media-fetch.ts +439 -0
- package/src/input/packed-mixed.ts +43 -0
- package/src/input/special-tokens.ts +75 -0
- package/src/input/token-groups.ts +49 -0
- package/src/input/tokenizer.ts +336 -0
- package/src/input/tool-call.ts +689 -0
- package/src/input/vision/index.ts +3 -0
- package/src/input/vision/preprocess.ts +247 -0
- package/src/input/vision/prompt.ts +398 -0
- package/src/input/vision/qwen3vl-preprocess.ts +409 -0
- package/src/input/vision/qwen3vl-prompt.ts +237 -0
- package/src/input/vision/video-frames.ts +100 -0
- package/src/kernels/ane/fill.ts +101 -0
- package/src/kernels/ane/linear.ts +416 -0
- package/src/kernels/attention/flash.ts +694 -0
- package/src/kernels/attention/kvq4-decode.ts +155 -0
- package/src/kernels/attention/masks.ts +40 -0
- package/src/kernels/attention/multi-query.ts +193 -0
- package/src/kernels/attention/paged.ts +130 -0
- package/src/kernels/delta/gated.ts +306 -0
- package/src/kernels/delta/index.ts +3 -0
- package/src/kernels/delta/silu-rms-heads.ts +69 -0
- package/src/kernels/delta/state.ts +74 -0
- package/src/kernels/gated-rms-norm.ts +64 -0
- package/src/kernels/glm52/layout.ts +37 -0
- package/src/kernels/glm52/streamed-experts.ts +360 -0
- package/src/kernels/logits.ts +38 -0
- package/src/kernels/quantization/affine-row.ts +154 -0
- package/src/kernels/quantization/affine-rows.ts +36 -0
- package/src/kernels/quantization/affine-split-mma.ts +144 -0
- package/src/kernels/quantization/affine3-mma.ts +117 -0
- package/src/kernels/quantization/affine3-rows.ts +103 -0
- package/src/kernels/quantization/affine4-mma.ts +113 -0
- package/src/kernels/quantization/affine4-rows.ts +102 -0
- package/src/kernels/residual-rms-norm.ts +65 -0
- package/src/kernels/sampling/index.ts +2 -0
- package/src/kernels/sampling/normalized-argmax.ts +116 -0
- package/src/kernels/sampling/token-bitmask.ts +52 -0
- package/src/kernels/softcap.ts +35 -0
- package/src/kernels/trellis/codebook.ts +123 -0
- package/src/kernels/trellis/down-codebook.ts +184 -0
- package/src/kernels/trellis/down-factored.ts +180 -0
- package/src/kernels/trellis/down-k3-interleaved-factored.ts +146 -0
- package/src/kernels/trellis/down-mma-wide.ts +195 -0
- package/src/kernels/trellis/down-mma.ts +145 -0
- package/src/kernels/trellis/expand.ts +42 -0
- package/src/kernels/trellis/gate-up-codebook-mma.ts +141 -0
- package/src/kernels/trellis/gate-up-codebook.ts +137 -0
- package/src/kernels/trellis/gate-up-factored.ts +197 -0
- package/src/kernels/trellis/gate-up-mma-wide.ts +147 -0
- package/src/kernels/trellis/gate-up-mma.ts +148 -0
- package/src/kernels/trellis/gate-up.ts +248 -0
- package/src/kernels/trellis/geometry.ts +22 -0
- package/src/kernels/trellis/index.ts +103 -0
- package/src/kernels/trellis/launch.ts +12 -0
- package/src/kernels/trellis/mixed-gate-up-factored.ts +119 -0
- package/src/kernels/trellis/mixed-gate-up.ts +146 -0
- package/src/kernels/trellis/qualified.ts +34 -0
- package/src/kernels/trellis/reduce.ts +150 -0
- package/src/kernels/trellis/scatter.ts +407 -0
- package/src/kernels/trellis/splitk-prefill.ts +152 -0
- package/src/kernels/trellis/tiled-prefill.ts +131 -0
- package/src/kernels/trellis/vector-expand.ts +58 -0
- package/src/kernels/trellis/wide-prefill.ts +89 -0
- package/src/kernels/turboquant/decode.ts +82 -0
- package/src/kernels/turboquant/index.ts +5 -0
- package/src/kernels/turboquant/inverse.ts +122 -0
- package/src/kernels/turboquant/ops.ts +860 -0
- package/src/kernels/turboquant/signs.ts +130 -0
- package/src/kernels/turboquant/tables.ts +124 -0
- package/src/layers/affine-verify-linear.ts +75 -0
- package/src/layers/ane-prefill-split.ts +283 -0
- package/src/layers/compiled-normalization.ts +41 -0
- package/src/layers/delta-heads.ts +23 -0
- package/src/layers/dense-embedding.ts +29 -0
- package/src/layers/dense-linear.ts +32 -0
- package/src/layers/dequantized-linear.ts +72 -0
- package/src/layers/folded-attention.ts +42 -0
- package/src/layers/geglu.ts +130 -0
- package/src/layers/helpers.ts +7 -0
- package/src/layers/index.ts +36 -0
- package/src/layers/kv4-decode-attention.ts +15 -0
- package/src/layers/layer-norm.ts +24 -0
- package/src/layers/loading.ts +92 -0
- package/src/layers/lora.ts +150 -0
- package/src/layers/normalization.ts +9 -0
- package/src/layers/prefix-layout.ts +33 -0
- package/src/layers/quantized-append-attention.ts +32 -0
- package/src/layers/quantized-attention.ts +353 -0
- package/src/layers/quantized-embedding.ts +39 -0
- package/src/layers/quantized-linear.ts +137 -0
- package/src/layers/quantized-switch-linear.ts +37 -0
- package/src/layers/qwen-append.ts +12 -0
- package/src/layers/qwen-mrope.ts +238 -0
- package/src/layers/rope-2d.ts +110 -0
- package/src/layers/rope.ts +389 -0
- package/src/layers/swiglu.ts +23 -0
- package/src/layers/trellis-codebook-down.ts +52 -0
- package/src/layers/trellis-codebook-gate-up.ts +42 -0
- package/src/layers/trellis-down.ts +117 -0
- package/src/layers/trellis-gate-up.ts +71 -0
- package/src/layers/trellis-linear.ts +211 -0
- package/src/layers/trellis-prompt.ts +102 -0
- package/src/layers/trellis-reduce-gate-up.ts +73 -0
- package/src/layers/trellis-scatter-down.ts +98 -0
- package/src/models/ane-install.ts +74 -0
- package/src/models/audio/conformer.ts +656 -0
- package/src/models/cache-composition.ts +44 -0
- package/src/models/capabilities.ts +89 -0
- package/src/models/chat-template.ts +10 -0
- package/src/models/composition.ts +107 -0
- package/src/models/diffusion-gemma/experts.ts +59 -0
- package/src/models/diffusion-gemma/family.ts +21 -0
- package/src/models/diffusion-gemma/model.ts +900 -0
- package/src/models/diffusion-gemma/vision.ts +549 -0
- package/src/models/drafter-loaders.ts +49 -0
- package/src/models/drafters.ts +39 -0
- package/src/models/factory.ts +351 -0
- package/src/models/families.ts +70 -0
- package/src/models/family.ts +125 -0
- package/src/models/gemma4/assistant-target.ts +46 -0
- package/src/models/gemma4/assistant.ts +327 -0
- package/src/models/gemma4/blocks.ts +755 -0
- package/src/models/gemma4/compiled-decode.ts +452 -0
- package/src/models/gemma4/family.ts +39 -0
- package/src/models/gemma4/gemma4-12b.ts +677 -0
- package/src/models/gemma4/gemma4-26b.ts +544 -0
- package/src/models/gemma4/gemma4-e4b.ts +599 -0
- package/src/models/gemma4/graphs.ts +147 -0
- package/src/models/gemma4/media.ts +88 -0
- package/src/models/gemma4/model.ts +860 -0
- package/src/models/gemma4/serving-blocks.ts +72 -0
- package/src/models/gemma4/trainable.ts +186 -0
- package/src/models/gemma4/written-blocks.ts +232 -0
- package/src/models/gemma4/written-forward.ts +159 -0
- package/src/models/gemma4/written-input.ts +29 -0
- package/src/models/glm52/atlas.ts +507 -0
- package/src/models/glm52/coupling.ts +388 -0
- package/src/models/glm52/dsa.ts +601 -0
- package/src/models/glm52/family.ts +20 -0
- package/src/models/glm52/mla.ts +812 -0
- package/src/models/glm52/model.ts +1127 -0
- package/src/models/glm52/moe.ts +223 -0
- package/src/models/glm52/mtp.ts +60 -0
- package/src/models/glm52/pilot.ts +537 -0
- package/src/models/glm52/reference.ts +445 -0
- package/src/models/glm52/residency.ts +557 -0
- package/src/models/glm52/streamed-experts.ts +447 -0
- package/src/models/graph.ts +59 -0
- package/src/models/implementation.ts +230 -0
- package/src/models/index.ts +15 -0
- package/src/models/media-input.ts +15 -0
- package/src/models/memory-plan.ts +39 -0
- package/src/models/minicpm5/family.ts +29 -0
- package/src/models/minicpm5/model.ts +394 -0
- package/src/models/minicpm5/trainable.ts +90 -0
- package/src/models/profile.ts +337 -0
- package/src/models/qwen/blocks.ts +658 -0
- package/src/models/qwen/checkpoint.ts +190 -0
- package/src/models/qwen/families.ts +57 -0
- package/src/models/qwen/media-input.ts +161 -0
- package/src/models/qwen/mtp.ts +101 -0
- package/src/models/qwen/qwen3-moe.ts +355 -0
- package/src/models/qwen/qwen3.ts +323 -0
- package/src/models/qwen/qwen38-27b-trellis-m1max.ts +1532 -0
- package/src/models/qwen/qwen38-27b-trellis-m4pro.ts +1092 -0
- package/src/models/qwen/qwen3_5.ts +433 -0
- package/src/models/qwen/written-layers.ts +285 -0
- package/src/models/row-table.ts +1 -0
- package/src/models/runtime.ts +73 -0
- package/src/models/speculative/deepspec-artifact.ts +10 -0
- package/src/models/speculative/deepspec.ts +744 -0
- package/src/models/speculative/dflash.ts +553 -0
- package/src/models/speculative/dflash2-artifact.ts +9 -0
- package/src/models/speculative/dflash2-operations.ts +1 -0
- package/src/models/speculative/dflash2.ts +576 -0
- package/src/models/speculative/loader.ts +29 -0
- package/src/models/support.ts +79 -0
- package/src/models/universal/archs.ts +365 -0
- package/src/models/universal/blocks.ts +479 -0
- package/src/models/universal/dense.ts +255 -0
- package/src/models/universal/family.ts +17 -0
- package/src/models/vision/qwen3vl.ts +566 -0
- package/src/models/vision/siglip.ts +520 -0
- package/src/models/vision/unified.ts +176 -0
- package/src/models/whisper/family.ts +19 -0
- package/src/models/whisper/fast.ts +734 -0
- package/src/models/whisper/model.ts +430 -0
- package/src/runtime/compiled-trace.ts +16 -0
- package/src/runtime/config.ts +77 -0
- package/src/runtime/expert-trace.ts +71 -0
- package/src/runtime/graph-forward.ts +65 -0
- package/src/runtime/integers.ts +6 -0
- package/src/runtime/native.ts +16 -0
- package/src/runtime/resources.ts +53 -0
- package/src/runtime/row-operations.ts +42 -0
- package/src/runtime/trace.ts +161 -0
- package/src/sampling/curve.ts +122 -0
- package/src/sampling/draft.ts +55 -0
- package/src/sampling/extras.ts +45 -0
- package/src/sampling/filters.ts +134 -0
- package/src/sampling/grammar.ts +630 -0
- package/src/sampling/hlg.ts +290 -0
- package/src/sampling/index.ts +9 -0
- package/src/sampling/processors.ts +142 -0
- package/src/sampling/sampler.ts +120 -0
- package/src/sampling/step.ts +343 -0
- package/src/sampling/types.ts +161 -0
- package/src/sampling/window-filters.ts +46 -0
- package/src/scoring/decisions.ts +96 -0
- package/src/scoring/full-sequence.ts +103 -0
- package/src/scoring/index.ts +9 -0
- package/src/scoring/kl.ts +29 -0
- package/src/scoring/perplexity.ts +165 -0
- package/src/scoring/response-logps.ts +65 -0
- package/src/state/affine-attention.ts +180 -0
- package/src/state/attachment.ts +68 -0
- package/src/state/attention-read.ts +215 -0
- package/src/state/batched-kv.ts +294 -0
- package/src/state/batched-mask.ts +445 -0
- package/src/state/batched-quant.ts +389 -0
- package/src/state/batched-quantized-kv.ts +209 -0
- package/src/state/batched-rotating-quant.ts +457 -0
- package/src/state/batched-rotating-state.ts +149 -0
- package/src/state/batched-rotating.ts +430 -0
- package/src/state/batched-row-storage.ts +179 -0
- package/src/state/batched-ssm.ts +54 -0
- package/src/state/batched-turboquant-kv.ts +144 -0
- package/src/state/bf16-first-kv.ts +663 -0
- package/src/state/cache-service.ts +592 -0
- package/src/state/capabilities.ts +65 -0
- package/src/state/checkpoint.ts +46 -0
- package/src/state/continuation-persistence.ts +126 -0
- package/src/state/decode-step-inputs.ts +31 -0
- package/src/state/decoded-kv-donor.ts +12 -0
- package/src/state/delayed-quantized-kv.ts +141 -0
- package/src/state/delayed-rotating-quantized-kv.ts +178 -0
- package/src/state/delayed-turboquant-kv.ts +123 -0
- package/src/state/durability.ts +214 -0
- package/src/state/encoder-cache.ts +26 -0
- package/src/state/full-kv-row-append.ts +33 -0
- package/src/state/full-kv-row-donor.ts +54 -0
- package/src/state/full-prefill-padding.ts +56 -0
- package/src/state/full-prefill-row.ts +112 -0
- package/src/state/full-transitioning-kv-rows.ts +70 -0
- package/src/state/glm52-cache.ts +783 -0
- package/src/state/grouped-heads-kv4-cache.ts +26 -0
- package/src/state/index.ts +38 -0
- package/src/state/kv-attention-view.ts +77 -0
- package/src/state/kv-budget.ts +14 -0
- package/src/state/kv-scheme.ts +315 -0
- package/src/state/kv-storage.ts +57 -0
- package/src/state/kv-tensor-rows.ts +212 -0
- package/src/state/kv.ts +324 -0
- package/src/state/kv4-head256-cache.ts +46 -0
- package/src/state/latent-legos.ts +895 -0
- package/src/state/layout.ts +277 -0
- package/src/state/leases.ts +26 -0
- package/src/state/paged/cache.ts +689 -0
- package/src/state/paged/codec.ts +36 -0
- package/src/state/paged/rows.ts +223 -0
- package/src/state/persistence-types.ts +173 -0
- package/src/state/persistence-worker.ts +83 -0
- package/src/state/persistence.ts +1036 -0
- package/src/state/persistence.worker.d.ts +3 -0
- package/src/state/persistence.worker.js +264 -0
- package/src/state/prefix-cache.ts +685 -0
- package/src/state/quantized-kv.ts +369 -0
- package/src/state/quantized-tensor.ts +26 -0
- package/src/state/request-policy.ts +48 -0
- package/src/state/retention-policy.ts +37 -0
- package/src/state/rollback.ts +131 -0
- package/src/state/rotating-kv-donor.ts +35 -0
- package/src/state/rotating-kv-layout.ts +341 -0
- package/src/state/rotating-kv.ts +529 -0
- package/src/state/rotating-quantized-kv.ts +616 -0
- package/src/state/rotating-row-transaction.ts +35 -0
- package/src/state/rows.ts +104 -0
- package/src/state/softcap-attention.ts +118 -0
- package/src/state/speculative/glm52-mtp-state.ts +38 -0
- package/src/state/speculative/qwen-mtp-state.ts +34 -0
- package/src/state/speculative-rotating-kv.ts +113 -0
- package/src/state/ssd-cache.ts +434 -0
- package/src/state/ssm-prefill-padding.ts +39 -0
- package/src/state/ssm.ts +422 -0
- package/src/state/target-layout.ts +7 -0
- package/src/state/tiered-prefix-cache.ts +45 -0
- package/src/state/training-cache.ts +300 -0
- package/src/state/transitioning-kv-rows.ts +267 -0
- package/src/state/turboquant-attention.ts +97 -0
- package/src/state/turboquant-codec.ts +90 -0
- package/src/state/turboquant-kv.ts +442 -0
- package/src/state/views.ts +26 -0
- package/src/transcription/index.ts +3 -0
- package/src/transcription/silero-vad.ts +379 -0
- package/src/transcription/whisper/decode.ts +773 -0
- package/src/transcription/whisper/format.ts +74 -0
- package/src/transcription/whisper/index.ts +4 -0
- package/src/transcription/whisper/timing.ts +274 -0
- package/src/transcription/whisper/transcribe.ts +394 -0
- package/src/transcription/whisper/types.ts +22 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { rowOperationFor } from "../../runtime/row-operations";
|
|
2
|
+
// Gemma-4 "-assistant" drafter — port of optiq's
|
|
3
|
+
// runtime/spec/drafters/gemma_assistant.py (itself a port of Ollama's
|
|
4
|
+
// x/models/gemma4/assistant.go, MIT).
|
|
5
|
+
//
|
|
6
|
+
// Q-only 4-layer transformer: K/V come from the TARGET's last sliding-
|
|
7
|
+
// and full-attention donor caches at call time; pre/post projections
|
|
8
|
+
// bridge target hidden space (backbone) <-> drafter space.
|
|
9
|
+
//
|
|
10
|
+
// Two output-head variants ship across the Gemma-4 drafter family — we
|
|
11
|
+
// pick by TENSOR PRESENCE, not config (the larger artifacts declare
|
|
12
|
+
// num_centroids in config.json but don't ship the centroid tensors —
|
|
13
|
+
// the field is vestigial):
|
|
14
|
+
// - CENTROID head (small E2B/E4B drafters, `gemma4_assistant`):
|
|
15
|
+
// 2048 centroids, top-32 × 128 tokens via a precomputed ordering.
|
|
16
|
+
// - TIED-EMBEDDING head (larger 12B/26B `gemma4_unified_assistant`):
|
|
17
|
+
// no centroids, no separate lm_head — logits = embed_tokens · h over
|
|
18
|
+
// the full vocab (the dense form the centroid head approximates).
|
|
19
|
+
//
|
|
20
|
+
// Implementation deviation (centroid path, argmax-equivalent): the
|
|
21
|
+
// reference scatters candidate scores into full-vocab logits initialised
|
|
22
|
+
// to -1e30 and argmaxes; we argmax over the 4096 candidate scores and map
|
|
23
|
+
// through candidate ids directly — same winner, no 262k materialisation.
|
|
24
|
+
// The drafter's numeric details only influence acceptance RATE, never
|
|
25
|
+
// output correctness (the target's verify decides every token).
|
|
26
|
+
|
|
27
|
+
import { MlxArray } from "@mlx-bun/mlx/array";
|
|
28
|
+
import { Dtype } from "@mlx-bun/mlx/ffi";
|
|
29
|
+
import * as ops from "@mlx-bun/mlx/ops";
|
|
30
|
+
import { Weights } from "../../artifacts/weights";
|
|
31
|
+
import type { AssistantDrafterModel, AssistantDraftStep, DrafterRowsStep } from "../../contracts/mlx/drafter";
|
|
32
|
+
import type { MlxRowTable } from "../../contracts/mlx/graph";
|
|
33
|
+
import { disposeResources } from "../../runtime/resources";
|
|
34
|
+
import { rowTable, rowTableFrom } from "../graph";
|
|
35
|
+
|
|
36
|
+
/** Legacy plain donor adapter. The common graph never reads cache geometry. */
|
|
37
|
+
export function plainAssistantDonors(shared: { sliding: [MlxArray, MlxArray]; full: [MlxArray, MlxArray] },
|
|
38
|
+
position: number): AssistantDonors {
|
|
39
|
+
const bind = ([keys, values]: [MlxArray, MlxArray]): AssistantAttention => ({
|
|
40
|
+
attend(query, scale, window) {
|
|
41
|
+
const length = keys.shape[2]!;
|
|
42
|
+
const from = window === null ? 0 : Math.max(0, Math.max(0, position - window + 1) - (position - length + 1));
|
|
43
|
+
using floats = from ? MlxArray.fromFloat32(Float32Array.from({ length }, (_, i) => i < from ? -1e9 : 0), [1,1,1,length]) : null;
|
|
44
|
+
using mask = floats?.astype(keys.dtype);
|
|
45
|
+
return ops.sdpa(query, keys, values, scale, mask ? "array" : "", mask ?? null);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return { sliding: bind(shared.sliding), full: bind(shared.full) };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type { DrafterRowsStep };
|
|
52
|
+
|
|
53
|
+
/** The head's token per row: the final hidden [B, 1, H] (borrowed) and B in, owned ids [B] out. */
|
|
54
|
+
type RowSelect = (h: MlxArray, rows: number) => MlxArray;
|
|
55
|
+
|
|
56
|
+
export interface DrafterStep {
|
|
57
|
+
/** Drafted token id. */
|
|
58
|
+
token: number;
|
|
59
|
+
/** Post-projected hidden (1,1,backbone) — feeds the next draft step. */
|
|
60
|
+
nextHidden: MlxArray;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface Block {
|
|
64
|
+
layerType: string;
|
|
65
|
+
headDim: number;
|
|
66
|
+
ropeBase: number | null;
|
|
67
|
+
ropeFreqs: MlxArray | null;
|
|
68
|
+
qProj: MlxArray;
|
|
69
|
+
oProj: MlxArray;
|
|
70
|
+
qNorm: MlxArray;
|
|
71
|
+
inputNorm: MlxArray;
|
|
72
|
+
postAttnNorm: MlxArray;
|
|
73
|
+
preFfNorm: MlxArray;
|
|
74
|
+
postFfNorm: MlxArray;
|
|
75
|
+
gateProj: MlxArray;
|
|
76
|
+
upProj: MlxArray;
|
|
77
|
+
downProj: MlxArray;
|
|
78
|
+
layerScalar: MlxArray;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export class GemmaAssistantDrafter implements AssistantDrafterModel {
|
|
82
|
+
readonly hidden: number;
|
|
83
|
+
readonly nHeads: number;
|
|
84
|
+
readonly slidingWindow: number;
|
|
85
|
+
readonly eps: number;
|
|
86
|
+
readonly numCentroids: number;
|
|
87
|
+
readonly topK: number;
|
|
88
|
+
readonly vocabPerCentroid: number;
|
|
89
|
+
#w: Weights;
|
|
90
|
+
#owned: MlxArray[] = [];
|
|
91
|
+
#blocks: Block[] = [];
|
|
92
|
+
readonly useCentroids: boolean;
|
|
93
|
+
#prePT: MlxArray; // pre_projection transposed [in, out]
|
|
94
|
+
#postPT: MlxArray;
|
|
95
|
+
#centroidsT: MlxArray | null = null; // [hidden, numCentroids]
|
|
96
|
+
#ordering: MlxArray | null = null; // [numCentroids, vocabPerCentroid] int32
|
|
97
|
+
#embed: MlxArray; // drafter token embeddings [vocab, hidden]
|
|
98
|
+
#norm: MlxArray;
|
|
99
|
+
readonly forwardRows: MlxRowTable<AssistantDraftStep>;
|
|
100
|
+
|
|
101
|
+
private constructor(w: Weights, cfg: Record<string, any>) {
|
|
102
|
+
const t = cfg.text_config ?? cfg;
|
|
103
|
+
this.hidden = t.hidden_size;
|
|
104
|
+
this.nHeads = t.num_attention_heads;
|
|
105
|
+
this.slidingWindow = t.sliding_window;
|
|
106
|
+
this.eps = t.rms_norm_eps;
|
|
107
|
+
this.numCentroids = cfg.num_centroids;
|
|
108
|
+
this.topK = cfg.centroid_intermediate_top_k;
|
|
109
|
+
this.vocabPerCentroid = Math.floor(t.vocab_size / this.numCentroids);
|
|
110
|
+
this.#w = w;
|
|
111
|
+
|
|
112
|
+
const own = (array: MlxArray) => { this.#owned.push(array); return array; };
|
|
113
|
+
try {
|
|
114
|
+
const T = (name: string) => w.tensor(name);
|
|
115
|
+
// Keep the oracle's strided weight.T: a contiguous transpose changes
|
|
116
|
+
// M4 matmul rounding and allocates a second copy of every linear weight.
|
|
117
|
+
const transposed = (name: string): MlxArray => {
|
|
118
|
+
const c = own(ops.transposeAxes(T(name), [1, 0]));
|
|
119
|
+
c.eval();
|
|
120
|
+
return c;
|
|
121
|
+
};
|
|
122
|
+
this.#prePT = transposed("pre_projection.weight");
|
|
123
|
+
this.#postPT = transposed("post_projection.weight");
|
|
124
|
+
this.#embed = T("model.embed_tokens.weight");
|
|
125
|
+
this.#norm = T("model.norm.weight");
|
|
126
|
+
// Head variant: only the small drafters ship the centroid tensors.
|
|
127
|
+
// The 12B/26B artifacts ship a tied embed_tokens head instead (their
|
|
128
|
+
// config still declares num_centroids — ignore it, trust the tensors).
|
|
129
|
+
this.useCentroids = w.has("masked_embedding.centroids.weight");
|
|
130
|
+
if (this.useCentroids) {
|
|
131
|
+
this.#centroidsT = transposed("masked_embedding.centroids.weight");
|
|
132
|
+
const ord64 = T("masked_embedding.token_ordering");
|
|
133
|
+
const ord32 = ord64.astype(Dtype.int32);
|
|
134
|
+
this.#ordering = own(ops.reshape(ord32, [this.numCentroids, this.vocabPerCentroid]));
|
|
135
|
+
this.#ordering.eval();
|
|
136
|
+
ord32.dispose();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const ropeP = t.rope_parameters ?? {};
|
|
140
|
+
for (let i = 0; i < t.num_hidden_layers; i++) {
|
|
141
|
+
const layerType = t.layer_types[i];
|
|
142
|
+
const isFull = layerType === "full_attention";
|
|
143
|
+
const headDim = isFull ? t.global_head_dim : t.head_dim;
|
|
144
|
+
const rp = ropeP[layerType] ?? {};
|
|
145
|
+
let ropeBase: number | null = rp.rope_theta ?? (isFull ? 1e6 : 1e4);
|
|
146
|
+
let ropeFreqs: MlxArray | null = null;
|
|
147
|
+
const partial = rp.partial_rotary_factor ?? 1.0;
|
|
148
|
+
if (isFull && partial < 1.0) {
|
|
149
|
+
// ProportionalRoPE freqs, matching the target's donor-K rope
|
|
150
|
+
const rotated = Math.floor(headDim * partial);
|
|
151
|
+
const n = headDim / 2;
|
|
152
|
+
const freqs = new Float32Array(n).fill(Infinity);
|
|
153
|
+
for (let k = 0; k < rotated / 2; k++)
|
|
154
|
+
freqs[k] = Math.pow(ropeBase!, (2 * k) / headDim);
|
|
155
|
+
ropeFreqs = own(MlxArray.fromFloat32(freqs, [n]));
|
|
156
|
+
ropeBase = null;
|
|
157
|
+
}
|
|
158
|
+
const p = `model.layers.${i}`;
|
|
159
|
+
this.#blocks.push({
|
|
160
|
+
layerType, headDim, ropeBase, ropeFreqs,
|
|
161
|
+
qProj: transposed(`${p}.self_attn.q_proj.weight`),
|
|
162
|
+
oProj: transposed(`${p}.self_attn.o_proj.weight`),
|
|
163
|
+
qNorm: T(`${p}.self_attn.q_norm.weight`),
|
|
164
|
+
inputNorm: T(`${p}.input_layernorm.weight`),
|
|
165
|
+
postAttnNorm: T(`${p}.post_attention_layernorm.weight`),
|
|
166
|
+
preFfNorm: T(`${p}.pre_feedforward_layernorm.weight`),
|
|
167
|
+
postFfNorm: T(`${p}.post_feedforward_layernorm.weight`),
|
|
168
|
+
gateProj: transposed(`${p}.mlp.gate_proj.weight`),
|
|
169
|
+
upProj: transposed(`${p}.mlp.up_proj.weight`),
|
|
170
|
+
downProj: transposed(`${p}.mlp.down_proj.weight`),
|
|
171
|
+
layerScalar: T(`${p}.layer_scalar`),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
} catch (error) { disposeResources(this.#owned.splice(0)); throw error; }
|
|
175
|
+
// The head's token selection, bound once: the centroid candidates at every
|
|
176
|
+
// width, or the tied embedding's full-vocabulary argmax, whose one-row form
|
|
177
|
+
// multiplies by the hidden column and whose wider form by the rows' transpose.
|
|
178
|
+
const select: MlxRowTable<RowSelect> = this.useCentroids
|
|
179
|
+
? rowTable((h, rows) => this.#centroidTokens(h, rows))
|
|
180
|
+
: rowTableFrom(width => width === 1 ? h => this.#embeddingTokensOne(h) : (h, rows) => this.#embeddingTokens(h, rows));
|
|
181
|
+
this.forwardRows = rowTableFrom(width => (lastTokenEmb, targetHidden, donors, position) =>
|
|
182
|
+
this.#forwardRows(lastTokenEmb, targetHidden, donors, position, select[width]!));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
static async load(modelDir: string): Promise<GemmaAssistantDrafter> {
|
|
186
|
+
const cfg = (await Bun.file(`${modelDir}/config.json`).json()) as Record<string, any>;
|
|
187
|
+
const weights = await Weights.open(modelDir);
|
|
188
|
+
try { return new GemmaAssistantDrafter(weights, cfg); }
|
|
189
|
+
catch (error) { weights.dispose(); throw error; }
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
dispose(): void { disposeResources([...this.#owned.splice(0), this.#w]); }
|
|
193
|
+
|
|
194
|
+
/** f32-internal RMSNorm (reference _RMSNorm casts through float32). */
|
|
195
|
+
#rms(x: MlxArray, weight: MlxArray): MlxArray {
|
|
196
|
+
const f = x.astype(Dtype.float32);
|
|
197
|
+
const n = ops.rmsNorm(f, weight, this.eps);
|
|
198
|
+
f.dispose();
|
|
199
|
+
const back = n.astype(x.dtype);
|
|
200
|
+
n.dispose();
|
|
201
|
+
return back;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** The request adapter consumes the same graph as a batch of one.
|
|
205
|
+
* Donors are chronological; position is the target's last position. */
|
|
206
|
+
forward(lastTokenEmb: MlxArray, targetHidden: MlxArray,
|
|
207
|
+
sharedKv: { sliding: [MlxArray, MlxArray]; full: [MlxArray, MlxArray] }, position: number): DrafterStep {
|
|
208
|
+
const result = rowOperationFor(this.forwardRows, 1)(lastTokenEmb, targetHidden, plainAssistantDonors(sharedKv, position), position);
|
|
209
|
+
try { return { token: ops.itemUint32(result.tokens), nextHidden: result.nextHidden }; }
|
|
210
|
+
catch (error) { result.nextHidden.dispose(); throw error; }
|
|
211
|
+
finally { result.tokens.dispose(); }
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** The centroid head's token per row: the top centroids' candidate tokens,
|
|
215
|
+
* scored against the final hidden [B, 1, H]. */
|
|
216
|
+
#centroidTokens(h: MlxArray, B: number): MlxArray {
|
|
217
|
+
using scores = ops.matmul(h, this.#centroidsT!);
|
|
218
|
+
using flat = ops.reshape(scores, [B, this.numCentroids]);
|
|
219
|
+
using neg = ops.neg(flat);
|
|
220
|
+
using partition = ops.argpartitionAxis(neg, this.topK - 1, -1);
|
|
221
|
+
using top = partition.slice([0, 0], [B, this.topK]);
|
|
222
|
+
using topFlat = ops.reshape(top, [B * this.topK]);
|
|
223
|
+
using candidates = ops.takeAxis(this.#ordering!, topFlat, 0);
|
|
224
|
+
const count = this.topK * this.vocabPerCentroid;
|
|
225
|
+
using ids = ops.reshape(candidates, [B, count]);
|
|
226
|
+
using flatIds = ops.reshape(ids, [B * count]);
|
|
227
|
+
using embeddings = ops.takeAxis(this.#embed, flatIds, 0);
|
|
228
|
+
using matrix = ops.reshape(embeddings, [B, count, this.hidden]);
|
|
229
|
+
using vector = ops.reshape(h, [B, 1, this.hidden]);
|
|
230
|
+
// The oracle rounds each bf16 product before reduction. Matmul's
|
|
231
|
+
// accumulation changes candidate rankings on M1, even at identical h.
|
|
232
|
+
using products = ops.mul(matrix, vector);
|
|
233
|
+
using candidateScores = ops.sumAxis(products, -1, false);
|
|
234
|
+
using maximum = ops.maxAxis(candidateScores, -1, true);
|
|
235
|
+
using winners = ops.equal(candidateScores, maximum);
|
|
236
|
+
// Sparse full-vocabulary argmax chooses the lowest token ID on a tie.
|
|
237
|
+
// Apply that rule directly to the candidates without a vocab-size scatter.
|
|
238
|
+
using sentinel = ops.fromInt32([this.#embed.shape[0]!], []);
|
|
239
|
+
using eligible = ops.where(winners, ids, sentinel);
|
|
240
|
+
using selected = ops.minAxis(eligible, -1, false);
|
|
241
|
+
return selected.astype(Dtype.uint32);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/** The tied embedding head's argmax for one row: the vocabulary times the hidden column. */
|
|
245
|
+
#embeddingTokensOne(h: MlxArray): MlxArray {
|
|
246
|
+
using vector = ops.reshape(h, [this.hidden, 1]);
|
|
247
|
+
using scores = ops.matmul(this.#embed, vector);
|
|
248
|
+
using flat = ops.reshape(scores, [1, this.#embed.shape[0]!]);
|
|
249
|
+
return ops.argmaxAxis(flat, -1);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** The tied embedding head's argmax for B rows: the vocabulary times the rows' transpose. */
|
|
253
|
+
#embeddingTokens(h: MlxArray, B: number): MlxArray {
|
|
254
|
+
using rows = ops.reshape(h, [B, this.hidden]);
|
|
255
|
+
using vector = ops.transposeAxes(rows, [1, 0]);
|
|
256
|
+
using scores = ops.matmul(this.#embed, vector);
|
|
257
|
+
using flat = ops.transposeAxes(scores, [1, 0]);
|
|
258
|
+
return ops.argmaxAxis(flat, -1);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Numerical graph only. Callers supply donor validity masks for different
|
|
262
|
+
* row positions; token selection remains on device across the draft chain. */
|
|
263
|
+
#forwardRows(lastTokenEmb: MlxArray, targetHidden: MlxArray,
|
|
264
|
+
donors: AssistantDonors, position: number | MlxArray, select: RowSelect): DrafterRowsStep {
|
|
265
|
+
const B = lastTokenEmb.shape[0]!;
|
|
266
|
+
let h = ops.concatAxis([lastTokenEmb, targetHidden], 2); // (B,1,2*backbone)
|
|
267
|
+
h = disposing(h, ops.matmul(h, this.#prePT)); // (B,1,256)
|
|
268
|
+
|
|
269
|
+
for (const blk of this.#blocks) {
|
|
270
|
+
const donor = blk.layerType === "sliding_attention" ? donors.sliding : donors.full;
|
|
271
|
+
const residual = h;
|
|
272
|
+
let x = this.#rms(h, blk.inputNorm);
|
|
273
|
+
// Q-only attention
|
|
274
|
+
let q = ops.matmul(x, blk.qProj);
|
|
275
|
+
x.dispose();
|
|
276
|
+
q = disposing(q, ops.reshape(q, [B, 1, this.nHeads, blk.headDim]));
|
|
277
|
+
q = disposing(q, this.#rms(q, blk.qNorm));
|
|
278
|
+
q = disposing(q, ops.transposeAxes(q, [0, 2, 1, 3]));
|
|
279
|
+
q = disposing(q, typeof position === "number"
|
|
280
|
+
? ops.rope(q, blk.headDim, blk.ropeBase, position, blk.ropeFreqs)
|
|
281
|
+
: ops.ropeDynamic(q, blk.headDim, blk.ropeBase, position, blk.ropeFreqs));
|
|
282
|
+
let attn = donor.attend(q, Math.pow(blk.headDim, -0.5),
|
|
283
|
+
blk.layerType === "sliding_attention" ? this.slidingWindow : null);
|
|
284
|
+
q.dispose();
|
|
285
|
+
attn = disposing(attn, ops.transposeAxes(attn, [0, 2, 1, 3]));
|
|
286
|
+
attn = disposing(attn, ops.reshape(attn, [B, 1, this.nHeads * blk.headDim]));
|
|
287
|
+
attn = disposing(attn, ops.matmul(attn, blk.oProj));
|
|
288
|
+
attn = disposing(attn, this.#rms(attn, blk.postAttnNorm));
|
|
289
|
+
h = ops.add(residual, attn);
|
|
290
|
+
residual.dispose();
|
|
291
|
+
attn.dispose();
|
|
292
|
+
|
|
293
|
+
const res2 = h;
|
|
294
|
+
let f = this.#rms(h, blk.preFfNorm);
|
|
295
|
+
const g = ops.matmul(f, blk.gateProj);
|
|
296
|
+
const u = ops.matmul(f, blk.upProj);
|
|
297
|
+
f.dispose();
|
|
298
|
+
const act = ops.geluApprox(g);
|
|
299
|
+
g.dispose();
|
|
300
|
+
let mlp = ops.mul(act, u);
|
|
301
|
+
act.dispose();
|
|
302
|
+
u.dispose();
|
|
303
|
+
mlp = disposing(mlp, ops.matmul(mlp, blk.downProj));
|
|
304
|
+
mlp = disposing(mlp, this.#rms(mlp, blk.postFfNorm));
|
|
305
|
+
h = ops.add(res2, mlp);
|
|
306
|
+
res2.dispose();
|
|
307
|
+
mlp.dispose();
|
|
308
|
+
|
|
309
|
+
h = disposing(h, ops.mul(h, blk.layerScalar));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
h = disposing(h, this.#rms(h, this.#norm));
|
|
313
|
+
|
|
314
|
+
const tokens = select(h, B);
|
|
315
|
+
const nextHidden = ops.matmul(h, this.#postPT); // (B,1,backbone)
|
|
316
|
+
h.dispose();
|
|
317
|
+
return { tokens, nextHidden };
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function disposing(old: MlxArray, next: MlxArray): MlxArray {
|
|
322
|
+
old.dispose();
|
|
323
|
+
return next;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
import { AssistantAttention,AssistantDonors } from "../../contracts/mlx/attention";
|
|
327
|
+
export { type AssistantAttention,type AssistantDonors } from "../../contracts/mlx/attention";
|