@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,337 @@
|
|
|
1
|
+
import type { ModelConfig } from "../artifacts/config";
|
|
2
|
+
import { configFingerprint } from "../artifacts/fingerprint";
|
|
3
|
+
import type { TemplateFallback } from "../input/chat-template";
|
|
4
|
+
import type { MediaTokenTexts, SentinelTokenTexts } from "../input/special-tokens";
|
|
5
|
+
import { ENGINE_CAPABILITIES, MODEL_FAMILIES, familyForGraph, familyOf, unsupportedModelMessage } from "./families";
|
|
6
|
+
import {
|
|
7
|
+
GENERIC_GENERATION_DEFAULTS,
|
|
8
|
+
GENERIC_TRAINING_DEFAULTS,
|
|
9
|
+
L1,
|
|
10
|
+
L3,
|
|
11
|
+
type EmbeddingDeclaration,
|
|
12
|
+
type EngineCapability,
|
|
13
|
+
type FidelityTarget,
|
|
14
|
+
type GenerationDefaults,
|
|
15
|
+
type GenerationLoop,
|
|
16
|
+
type ModelFamily,
|
|
17
|
+
type ModelGraph,
|
|
18
|
+
type ModelLoader,
|
|
19
|
+
type ModelSpecialization,
|
|
20
|
+
type TrainingDefaults,
|
|
21
|
+
} from "./family";
|
|
22
|
+
|
|
23
|
+
export { ENGINE_CAPABILITIES, GENERIC_GENERATION_DEFAULTS, GENERIC_TRAINING_DEFAULTS };
|
|
24
|
+
export type {
|
|
25
|
+
EmbeddingDeclaration, EngineCapability, FidelityTarget, FidelityTier, GenerationDefaults, GenerationLoop, ModelGraph, ModelLoader,
|
|
26
|
+
ModelSpecialization, TrainingDefaults,
|
|
27
|
+
} from "./family";
|
|
28
|
+
|
|
29
|
+
export interface ModelExecutionComposition {
|
|
30
|
+
readonly loader: ModelLoader;
|
|
31
|
+
readonly graph: ModelGraph;
|
|
32
|
+
readonly loop: GenerationLoop;
|
|
33
|
+
readonly specialization: ModelSpecialization;
|
|
34
|
+
/** Engine-owned code registration. Model files never supply executable code.
|
|
35
|
+
* Omit to retain the existing graph implementation. */
|
|
36
|
+
readonly implementation?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** A profile declares construction only. Request methods such as MTP, KV
|
|
40
|
+
* schemes, adapters, grammar, and sampling are resolved independently and
|
|
41
|
+
* cannot be rewritten by profile selection. */
|
|
42
|
+
export interface ModelProfile {
|
|
43
|
+
readonly id: string;
|
|
44
|
+
/** Exact external identity. Family profiles omit this field. */
|
|
45
|
+
readonly artifactFingerprint?: string;
|
|
46
|
+
/** Structural guard for an exact artifact declaration. */
|
|
47
|
+
readonly configFingerprint?: string;
|
|
48
|
+
readonly fidelity: FidelityTarget;
|
|
49
|
+
readonly requiredCapabilities: readonly EngineCapability[];
|
|
50
|
+
readonly execution: ModelExecutionComposition;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface ArtifactModelProfile extends ModelProfile {
|
|
54
|
+
readonly artifactFingerprint: string;
|
|
55
|
+
readonly configFingerprint: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface ModelArtifactIdentity {
|
|
59
|
+
readonly fingerprint: string | null;
|
|
60
|
+
readonly configFingerprint: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface ResolvedModelProfile {
|
|
64
|
+
readonly profile: ModelProfile;
|
|
65
|
+
readonly artifact: ModelArtifactIdentity;
|
|
66
|
+
readonly exactArtifact: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ResolveModelProfileOptions {
|
|
70
|
+
/** Explicit identity for a non-Hugging-Face artifact. The caller owns its
|
|
71
|
+
* provenance; mlx-bun never mistakes a local path for a content identity. */
|
|
72
|
+
readonly artifactFingerprint?: string | null;
|
|
73
|
+
/** Additional exact declarations composed with the shipped profiles. */
|
|
74
|
+
readonly artifactProfiles?: readonly ArtifactModelProfile[];
|
|
75
|
+
readonly engineCapabilities?: readonly EngineCapability[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function freezeProfile<T extends ModelProfile>(profile: T): T {
|
|
79
|
+
Object.freeze(profile.fidelity);
|
|
80
|
+
Object.freeze(profile.requiredCapabilities);
|
|
81
|
+
Object.freeze(profile.execution);
|
|
82
|
+
return Object.freeze(profile);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function snapshotProfile(profile: ModelProfile): ModelProfile {
|
|
86
|
+
return freezeProfile({
|
|
87
|
+
...profile,
|
|
88
|
+
fidelity: { ...profile.fidelity },
|
|
89
|
+
requiredCapabilities: [...profile.requiredCapabilities],
|
|
90
|
+
execution: { ...profile.execution },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Exact artifact declarations already backed by this repository's parity or
|
|
95
|
+
* measured evidence. A new revision gets the family profile until it earns a
|
|
96
|
+
* declaration of its own. */
|
|
97
|
+
export const BUILTIN_ARTIFACT_PROFILES: readonly ArtifactModelProfile[] = Object.freeze([
|
|
98
|
+
freezeProfile({
|
|
99
|
+
id: "qwen3.8-27b-optiq-4bit",
|
|
100
|
+
artifactFingerprint:
|
|
101
|
+
"hf:mlx-community/Qwen3.8-27B-OptiQ-4bit@b04599de95d7a9bfbd7f208d347c0f10d9432a42",
|
|
102
|
+
configFingerprint: "50117975cb405944",
|
|
103
|
+
fidelity: L1,
|
|
104
|
+
requiredCapabilities: Object.freeze([
|
|
105
|
+
"safetensors", "autoregressive", "qwen3.5-graph", "recurrent-state", "vision-sidecar",
|
|
106
|
+
]),
|
|
107
|
+
execution: Object.freeze({
|
|
108
|
+
loader: "safetensors",
|
|
109
|
+
graph: "qwen3.5",
|
|
110
|
+
loop: "autoregressive",
|
|
111
|
+
specialization: "artifact",
|
|
112
|
+
}),
|
|
113
|
+
}),
|
|
114
|
+
freezeProfile({
|
|
115
|
+
id: "glm5.2-colibri-int4-int8-mtp",
|
|
116
|
+
artifactFingerprint:
|
|
117
|
+
"hf:mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp@3cc8db99b1b13fc79325d987ba3c1c430766b3b8",
|
|
118
|
+
configFingerprint: "8b49d0941e18f1b9",
|
|
119
|
+
fidelity: L3,
|
|
120
|
+
requiredCapabilities: Object.freeze([
|
|
121
|
+
"colibri-container", "autoregressive", "glm5.2-graph", "streamed-experts",
|
|
122
|
+
]),
|
|
123
|
+
execution: Object.freeze({
|
|
124
|
+
loader: "colibri",
|
|
125
|
+
graph: "glm5.2",
|
|
126
|
+
loop: "autoregressive",
|
|
127
|
+
specialization: "artifact",
|
|
128
|
+
}),
|
|
129
|
+
}),
|
|
130
|
+
]);
|
|
131
|
+
|
|
132
|
+
/** The engine capability each generation loop needs. */
|
|
133
|
+
const loopCapability: Readonly<Record<GenerationLoop, EngineCapability>> = {
|
|
134
|
+
autoregressive: "autoregressive", diffusion: "diffusion", "encoder-decoder": "encoder-decoder",
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/** What the engine must provide to run a composition: its loader, its loop, and its graph's own capabilities. */
|
|
138
|
+
function executionCapabilities(execution: ModelExecutionComposition, family: ModelFamily): EngineCapability[] {
|
|
139
|
+
const required: EngineCapability[] = [execution.loader === "colibri" ? "colibri-container" : "safetensors"];
|
|
140
|
+
required.push(loopCapability[execution.loop]);
|
|
141
|
+
required.push(...family.capabilities);
|
|
142
|
+
return required;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function familyProfile(family: ModelFamily, specialization: ModelSpecialization, id: string): ModelProfile {
|
|
146
|
+
const execution = { loader: family.loader, graph: family.graph, loop: family.loop, specialization };
|
|
147
|
+
return freezeProfile({
|
|
148
|
+
id, fidelity: family.fidelity, requiredCapabilities: executionCapabilities(execution, family), execution,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Return a stable external fingerprint only when the directory is an exact HF
|
|
153
|
+
* snapshot revision. Relocation does not change the identity. Arbitrary local
|
|
154
|
+
* directories and mutable aliases intentionally return null. */
|
|
155
|
+
export function externalArtifactFingerprint(modelDir: string): string | null {
|
|
156
|
+
const match = modelDir.replaceAll("\\", "/").match(
|
|
157
|
+
/(?:^|\/)models--([^/]+)\/snapshots\/([0-9a-f]{40,64})(?:\/|$)/i,
|
|
158
|
+
);
|
|
159
|
+
if (!match) return null;
|
|
160
|
+
const encodedRepo = match[1]!;
|
|
161
|
+
const separator = encodedRepo.indexOf("--");
|
|
162
|
+
if (separator <= 0 || separator === encodedRepo.length - 2) return null;
|
|
163
|
+
const repo = `${encodedRepo.slice(0, separator)}/${encodedRepo.slice(separator + 2)}`;
|
|
164
|
+
return `hf:${repo}@${match[2]!.toLowerCase()}`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const FAMILY_PROFILES: ReadonlyMap<ModelGraph, ModelProfile> = new Map(
|
|
168
|
+
MODEL_FAMILIES.map(family => [family.graph, familyProfile(family, family.specialization, family.profileId)] as const));
|
|
169
|
+
|
|
170
|
+
/** The profile the config's family declares. It names the family; which of the
|
|
171
|
+
* family's graphs a load builds for its composition is the graph table's choice
|
|
172
|
+
* (`MLX_GRAPH_TABLES` in `models/factory.ts`), labeled by the selected entry. */
|
|
173
|
+
function selectFamilyProfile(config: ModelConfig): ModelProfile {
|
|
174
|
+
const family = familyOf(config);
|
|
175
|
+
if (!family) throw new Error(unsupportedModelMessage(config));
|
|
176
|
+
return FAMILY_PROFILES.get(family.graph)!;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function declaredBy(resolved: ResolvedModelProfile): ModelFamily | null {
|
|
180
|
+
return familyForGraph(resolved.profile.execution.graph);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** The fine-tuning defaults the resolved model's graph declares, else the
|
|
184
|
+
* generic ones. */
|
|
185
|
+
export function trainingDefaultsFor(resolved: ResolvedModelProfile): TrainingDefaults {
|
|
186
|
+
return declaredBy(resolved)?.trainingDefaults ?? GENERIC_TRAINING_DEFAULTS;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** The tool-call and reasoning-channel marker tokens the resolved model's graph declares, or null. */
|
|
190
|
+
export function sentinelDeclarationFor(resolved: ResolvedModelProfile): SentinelTokenTexts | null {
|
|
191
|
+
return declaredBy(resolved)?.sentinels ?? null;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** The tower-prompt soft-token markers the resolved model's graph declares, or null. */
|
|
195
|
+
export function mediaTokenDeclarationFor(resolved: ResolvedModelProfile): MediaTokenTexts | null {
|
|
196
|
+
return declaredBy(resolved)?.mediaTokens ?? null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** The chat-generation defaults the resolved model's graph declares, else the generic ones. */
|
|
200
|
+
export function generationDefaultsFor(resolved: ResolvedModelProfile): GenerationDefaults {
|
|
201
|
+
return declaredBy(resolved)?.generationDefaults ?? GENERIC_GENERATION_DEFAULTS;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** The renderer for artifacts that ship no chat template, or null when they must ship one. */
|
|
205
|
+
export function chatTemplateFallbackFor(resolved: ResolvedModelProfile): TemplateFallback | null {
|
|
206
|
+
return declaredBy(resolved)?.chatTemplateFallback ?? null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** The pooled-embedding recipe the resolved model's graph declares, or null. */
|
|
210
|
+
export function embeddingDeclarationFor(resolved: ResolvedModelProfile): EmbeddingDeclaration | null {
|
|
211
|
+
return declaredBy(resolved)?.embedding ?? null;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function graphAccepts(profile: ModelProfile, config: ModelConfig): boolean {
|
|
215
|
+
const family = familyForGraph(profile.execution.graph);
|
|
216
|
+
if (!family) return false;
|
|
217
|
+
try { return family.accepts(config); } catch { return false; }
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function validateProfile(profile: ModelProfile): void {
|
|
221
|
+
if (!profile.id) throw new Error("model profile id must not be empty");
|
|
222
|
+
if (profile.execution.implementation !== undefined &&
|
|
223
|
+
(!profile.execution.implementation.trim() || !profile.artifactFingerprint ||
|
|
224
|
+
profile.execution.specialization !== "artifact"))
|
|
225
|
+
throw new Error(`model profile ${profile.id} must bind a named implementation to an exact artifact`);
|
|
226
|
+
if ((profile.artifactFingerprint === undefined) !== (profile.configFingerprint === undefined))
|
|
227
|
+
throw new Error(
|
|
228
|
+
`model profile ${profile.id} must declare artifactFingerprint and configFingerprint together`,
|
|
229
|
+
);
|
|
230
|
+
const family = familyForGraph(profile.execution.graph);
|
|
231
|
+
if (!family)
|
|
232
|
+
throw new Error(`model profile ${profile.id} selects unknown graph ${profile.execution.graph}`);
|
|
233
|
+
const fidelityOk =
|
|
234
|
+
(profile.fidelity.tier === "l1" && profile.fidelity.oracle === "mlx-lm" &&
|
|
235
|
+
profile.fidelity.claim === "bit-exact") ||
|
|
236
|
+
(profile.fidelity.tier === "l1" && profile.fidelity.oracle === "mlx-whisper" &&
|
|
237
|
+
profile.fidelity.claim === "bit-exact" && family.fidelity.oracle === "mlx-whisper") ||
|
|
238
|
+
(profile.fidelity.tier === "l2" && profile.fidelity.oracle === "mlx-optiq" &&
|
|
239
|
+
profile.fidelity.claim === "bit-exact") ||
|
|
240
|
+
(profile.fidelity.tier === "l3" && profile.fidelity.oracle === null &&
|
|
241
|
+
profile.fidelity.claim === "measured");
|
|
242
|
+
if (!fidelityOk) throw new Error(`model profile ${profile.id} has an invalid fidelity contract`);
|
|
243
|
+
if (profile.execution.loader !== family.loader || profile.execution.loop !== family.loop)
|
|
244
|
+
throw new Error(
|
|
245
|
+
`model profile ${profile.id} has an invalid execution composition for ` +
|
|
246
|
+
`${profile.execution.graph}`,
|
|
247
|
+
);
|
|
248
|
+
const declared = new Set(profile.requiredCapabilities);
|
|
249
|
+
const underdeclared = executionCapabilities(profile.execution, family).filter((capability) => !declared.has(capability));
|
|
250
|
+
if (underdeclared.length)
|
|
251
|
+
throw new Error(
|
|
252
|
+
`model profile ${profile.id} does not declare execution capabilities: ` +
|
|
253
|
+
`${underdeclared.join(", ")}`,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function resolveModelProfile(
|
|
258
|
+
config: ModelConfig,
|
|
259
|
+
options: ResolveModelProfileOptions = {},
|
|
260
|
+
): ResolvedModelProfile {
|
|
261
|
+
const fingerprint = configFingerprint(config);
|
|
262
|
+
const artifactFingerprint = options.artifactFingerprint === undefined
|
|
263
|
+
? externalArtifactFingerprint(config.modelDir)
|
|
264
|
+
: options.artifactFingerprint;
|
|
265
|
+
const artifactProfiles = options.artifactProfiles
|
|
266
|
+
? [...BUILTIN_ARTIFACT_PROFILES, ...options.artifactProfiles]
|
|
267
|
+
: BUILTIN_ARTIFACT_PROFILES;
|
|
268
|
+
const capabilities = new Set(options.engineCapabilities ?? ENGINE_CAPABILITIES);
|
|
269
|
+
|
|
270
|
+
let profile: ModelProfile | undefined;
|
|
271
|
+
let exactArtifact = false;
|
|
272
|
+
if (artifactFingerprint) {
|
|
273
|
+
const matches = artifactProfiles.filter((entry) => {
|
|
274
|
+
validateProfile(entry);
|
|
275
|
+
return entry.artifactFingerprint === artifactFingerprint;
|
|
276
|
+
});
|
|
277
|
+
if (matches.length > 1)
|
|
278
|
+
throw new Error(`multiple model profiles declare artifact ${artifactFingerprint}`);
|
|
279
|
+
profile = matches[0];
|
|
280
|
+
if (profile) {
|
|
281
|
+
exactArtifact = true;
|
|
282
|
+
if (profile.configFingerprint !== fingerprint)
|
|
283
|
+
throw new Error(
|
|
284
|
+
`model profile ${profile.id} matched artifact ${artifactFingerprint}, but config fingerprint ` +
|
|
285
|
+
`${fingerprint} != declared ${profile.configFingerprint}; refusing to fall back`,
|
|
286
|
+
);
|
|
287
|
+
if (!graphAccepts(profile, config))
|
|
288
|
+
throw new Error(
|
|
289
|
+
`model profile ${profile.id} selects ${profile.execution.graph}, which is incompatible with ` +
|
|
290
|
+
`${config.modelType}; refusing to fall back`,
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
profile ??= selectFamilyProfile(config);
|
|
295
|
+
validateProfile(profile);
|
|
296
|
+
profile = snapshotProfile(profile);
|
|
297
|
+
|
|
298
|
+
const missing = profile.requiredCapabilities.filter((capability) => !capabilities.has(capability));
|
|
299
|
+
if (missing.length)
|
|
300
|
+
throw new Error(
|
|
301
|
+
`model profile ${profile.id} requires missing engine capabilities: ${missing.join(", ")}; ` +
|
|
302
|
+
`refusing to fall back`,
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
return Object.freeze({
|
|
306
|
+
profile,
|
|
307
|
+
artifact: Object.freeze({ fingerprint: artifactFingerprint, configFingerprint: fingerprint }),
|
|
308
|
+
exactArtifact,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Guard the factory seam when a caller passes a previously resolved profile. */
|
|
313
|
+
export function assertResolvedModelProfile(
|
|
314
|
+
config: ModelConfig,
|
|
315
|
+
resolved: ResolvedModelProfile,
|
|
316
|
+
): void {
|
|
317
|
+
validateProfile(resolved.profile);
|
|
318
|
+
const fingerprint = configFingerprint(config);
|
|
319
|
+
if (resolved.artifact.configFingerprint !== fingerprint)
|
|
320
|
+
throw new Error(
|
|
321
|
+
`model profile ${resolved.profile.id} was resolved for config ` +
|
|
322
|
+
`${resolved.artifact.configFingerprint}, not ${fingerprint}`,
|
|
323
|
+
);
|
|
324
|
+
if (!graphAccepts(resolved.profile, config))
|
|
325
|
+
throw new Error(
|
|
326
|
+
`model profile ${resolved.profile.id} selects ${resolved.profile.execution.graph}, ` +
|
|
327
|
+
`which is incompatible with ${config.modelType}`,
|
|
328
|
+
);
|
|
329
|
+
if (resolved.exactArtifact !== (resolved.profile.artifactFingerprint !== undefined) ||
|
|
330
|
+
(resolved.exactArtifact &&
|
|
331
|
+
(resolved.profile.artifactFingerprint !== resolved.artifact.fingerprint ||
|
|
332
|
+
resolved.profile.configFingerprint !== fingerprint)))
|
|
333
|
+
throw new Error(
|
|
334
|
+
`model profile ${resolved.profile.id} does not match artifact ` +
|
|
335
|
+
`${resolved.artifact.fingerprint ?? "<unidentified>"}`,
|
|
336
|
+
);
|
|
337
|
+
}
|