@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,388 @@
|
|
|
1
|
+
// Measurement-only GLM-5.2 cross-layer route coupling.
|
|
2
|
+
//
|
|
3
|
+
// The collector observes full router rows before expert-union deduplication.
|
|
4
|
+
// The offline model mirrors Colibri's raw coactivation voting, but never
|
|
5
|
+
// feeds a prediction back into residency or execution.
|
|
6
|
+
|
|
7
|
+
import type { ExpertUsageRoute } from "../../artifacts/experts/usage";
|
|
8
|
+
|
|
9
|
+
export interface Glm52RouteTraceRecord {
|
|
10
|
+
readonly segment: string;
|
|
11
|
+
readonly forward: number;
|
|
12
|
+
readonly row: number;
|
|
13
|
+
readonly layer: number;
|
|
14
|
+
readonly indices: readonly number[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class Glm52RouteTraceCollector {
|
|
18
|
+
#segment: string | null = null;
|
|
19
|
+
#forward = -1;
|
|
20
|
+
#lastLayer: number | null = null;
|
|
21
|
+
#records: Glm52RouteTraceRecord[] = [];
|
|
22
|
+
|
|
23
|
+
beginSegment(segment: string): void {
|
|
24
|
+
if (!segment.trim()) throw new Error("GLM route trace segment is empty");
|
|
25
|
+
this.#segment = segment;
|
|
26
|
+
this.#forward = -1;
|
|
27
|
+
this.#lastLayer = null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
observe(layer: number, routes: readonly ExpertUsageRoute[]): void {
|
|
31
|
+
if (this.#segment === null)
|
|
32
|
+
throw new Error("GLM route trace requires beginSegment() first");
|
|
33
|
+
if (!Number.isSafeInteger(layer) || layer < 0)
|
|
34
|
+
throw new RangeError(`invalid GLM route trace layer ${layer}`);
|
|
35
|
+
if (this.#lastLayer === null || layer <= this.#lastLayer) this.#forward++;
|
|
36
|
+
this.#lastLayer = layer;
|
|
37
|
+
for (let row = 0; row < routes.length; row++) {
|
|
38
|
+
const indices = Array.from(routes[row]!.indices, Number);
|
|
39
|
+
if (indices.length === 0 || new Set(indices).size !== indices.length ||
|
|
40
|
+
indices.some((expert) =>
|
|
41
|
+
!Number.isSafeInteger(expert) || expert < 0)) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`invalid GLM route trace row ${this.#segment}:${this.#forward}:${row}`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
this.#records.push(Object.freeze({
|
|
47
|
+
segment: this.#segment,
|
|
48
|
+
forward: this.#forward,
|
|
49
|
+
row,
|
|
50
|
+
layer,
|
|
51
|
+
indices: Object.freeze(indices),
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
snapshot(): readonly Glm52RouteTraceRecord[] {
|
|
57
|
+
return Object.freeze(this.#records.slice());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface RoutePosition {
|
|
62
|
+
readonly key: string;
|
|
63
|
+
readonly segment: string;
|
|
64
|
+
readonly forward: number;
|
|
65
|
+
readonly row: number;
|
|
66
|
+
readonly records: Glm52RouteTraceRecord[];
|
|
67
|
+
readonly layers: Map<number, readonly number[]>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function routePositions(
|
|
71
|
+
records: readonly Glm52RouteTraceRecord[],
|
|
72
|
+
): RoutePosition[] {
|
|
73
|
+
const positions = new Map<string, RoutePosition>();
|
|
74
|
+
for (const record of records) {
|
|
75
|
+
if (!record.segment || !Number.isSafeInteger(record.forward) ||
|
|
76
|
+
record.forward < 0 || !Number.isSafeInteger(record.row) ||
|
|
77
|
+
record.row < 0 || !Number.isSafeInteger(record.layer) ||
|
|
78
|
+
record.layer < 0 || record.indices.length === 0 ||
|
|
79
|
+
new Set(record.indices).size !== record.indices.length ||
|
|
80
|
+
record.indices.some((expert) =>
|
|
81
|
+
!Number.isSafeInteger(expert) || expert < 0)) {
|
|
82
|
+
throw new Error("invalid GLM route trace record");
|
|
83
|
+
}
|
|
84
|
+
const key = `${record.segment}\u0000${record.forward}\u0000${record.row}`;
|
|
85
|
+
let position = positions.get(key);
|
|
86
|
+
if (!position) {
|
|
87
|
+
position = {
|
|
88
|
+
key,
|
|
89
|
+
segment: record.segment,
|
|
90
|
+
forward: record.forward,
|
|
91
|
+
row: record.row,
|
|
92
|
+
records: [],
|
|
93
|
+
layers: new Map(),
|
|
94
|
+
};
|
|
95
|
+
positions.set(key, position);
|
|
96
|
+
}
|
|
97
|
+
if (position.layers.has(record.layer))
|
|
98
|
+
throw new Error(`duplicate GLM route trace layer ${record.layer} at ${key}`);
|
|
99
|
+
const indices = Object.freeze(Array.from(record.indices, Number));
|
|
100
|
+
position.layers.set(record.layer, indices);
|
|
101
|
+
position.records.push({ ...record, indices });
|
|
102
|
+
}
|
|
103
|
+
return [...positions.values()];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface Glm52CouplingTarget {
|
|
107
|
+
readonly expertId: number;
|
|
108
|
+
readonly count: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface Glm52CouplingEntry {
|
|
112
|
+
readonly sourceLayer: number;
|
|
113
|
+
readonly delta: 1 | 2;
|
|
114
|
+
readonly sourceExpert: number;
|
|
115
|
+
readonly targets: readonly Glm52CouplingTarget[];
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface Glm52CouplingMarginal {
|
|
119
|
+
readonly layer: number;
|
|
120
|
+
readonly targets: readonly Glm52CouplingTarget[];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export interface Glm52CouplingModel {
|
|
124
|
+
readonly maxCandidates: number;
|
|
125
|
+
readonly entries: readonly Glm52CouplingEntry[];
|
|
126
|
+
readonly marginals: readonly Glm52CouplingMarginal[];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function increment(
|
|
130
|
+
counts: Map<number, number>,
|
|
131
|
+
expertId: number,
|
|
132
|
+
): void {
|
|
133
|
+
counts.set(expertId, (counts.get(expertId) ?? 0) + 1);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function ranked(counts: Map<number, number>): Glm52CouplingTarget[] {
|
|
137
|
+
return [...counts.entries()]
|
|
138
|
+
.map(([expertId, count]) => ({ expertId, count }))
|
|
139
|
+
.sort((left, right) =>
|
|
140
|
+
right.count - left.count || left.expertId - right.expertId);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function buildGlm52CouplingModel(
|
|
144
|
+
records: readonly Glm52RouteTraceRecord[],
|
|
145
|
+
maxCandidates = 16,
|
|
146
|
+
): Glm52CouplingModel {
|
|
147
|
+
if (!Number.isSafeInteger(maxCandidates) || maxCandidates < 1)
|
|
148
|
+
throw new RangeError("GLM coupling maxCandidates must be positive");
|
|
149
|
+
const pairs = new Map<string, {
|
|
150
|
+
sourceLayer: number;
|
|
151
|
+
delta: 1 | 2;
|
|
152
|
+
sourceExpert: number;
|
|
153
|
+
counts: Map<number, number>;
|
|
154
|
+
}>();
|
|
155
|
+
const marginals = new Map<number, Map<number, number>>();
|
|
156
|
+
for (const position of routePositions(records)) {
|
|
157
|
+
for (const [layer, actual] of position.layers) {
|
|
158
|
+
let counts = marginals.get(layer);
|
|
159
|
+
if (!counts) {
|
|
160
|
+
counts = new Map();
|
|
161
|
+
marginals.set(layer, counts);
|
|
162
|
+
}
|
|
163
|
+
for (const expertId of actual) increment(counts, expertId);
|
|
164
|
+
}
|
|
165
|
+
for (const [sourceLayer, source] of position.layers) {
|
|
166
|
+
for (const delta of [1, 2] as const) {
|
|
167
|
+
const target = position.layers.get(sourceLayer + delta);
|
|
168
|
+
if (!target) continue;
|
|
169
|
+
for (const sourceExpert of source) {
|
|
170
|
+
const key = `${sourceLayer}:${delta}:${sourceExpert}`;
|
|
171
|
+
let pair = pairs.get(key);
|
|
172
|
+
if (!pair) {
|
|
173
|
+
pair = {
|
|
174
|
+
sourceLayer,
|
|
175
|
+
delta,
|
|
176
|
+
sourceExpert,
|
|
177
|
+
counts: new Map(),
|
|
178
|
+
};
|
|
179
|
+
pairs.set(key, pair);
|
|
180
|
+
}
|
|
181
|
+
for (const targetExpert of target)
|
|
182
|
+
increment(pair.counts, targetExpert);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return Object.freeze({
|
|
188
|
+
maxCandidates,
|
|
189
|
+
entries: Object.freeze([...pairs.values()]
|
|
190
|
+
.sort((left, right) =>
|
|
191
|
+
left.sourceLayer - right.sourceLayer ||
|
|
192
|
+
left.delta - right.delta ||
|
|
193
|
+
left.sourceExpert - right.sourceExpert)
|
|
194
|
+
.map((pair) => Object.freeze({
|
|
195
|
+
sourceLayer: pair.sourceLayer,
|
|
196
|
+
delta: pair.delta,
|
|
197
|
+
sourceExpert: pair.sourceExpert,
|
|
198
|
+
targets: Object.freeze(ranked(pair.counts).slice(0, maxCandidates)),
|
|
199
|
+
}))),
|
|
200
|
+
marginals: Object.freeze([...marginals.entries()]
|
|
201
|
+
.sort(([left], [right]) => left - right)
|
|
202
|
+
.map(([layer, counts]) => Object.freeze({
|
|
203
|
+
layer,
|
|
204
|
+
targets: Object.freeze(ranked(counts)),
|
|
205
|
+
}))),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
interface MutableScore {
|
|
210
|
+
rows: number;
|
|
211
|
+
predictedSelections: number;
|
|
212
|
+
actualSelections: number;
|
|
213
|
+
matchedSelections: number;
|
|
214
|
+
exactRows: number;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface Glm52CouplingScore {
|
|
218
|
+
readonly rows: number;
|
|
219
|
+
readonly predictedSelections: number;
|
|
220
|
+
readonly actualSelections: number;
|
|
221
|
+
readonly matchedSelections: number;
|
|
222
|
+
readonly exactRows: number;
|
|
223
|
+
readonly precision: number;
|
|
224
|
+
readonly recall: number;
|
|
225
|
+
readonly exactRowRate: number;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export interface Glm52CouplingEvaluation {
|
|
229
|
+
readonly delta: 1 | 2;
|
|
230
|
+
readonly budget: number;
|
|
231
|
+
readonly coupled: Glm52CouplingScore;
|
|
232
|
+
readonly marginal: Glm52CouplingScore;
|
|
233
|
+
readonly recallLift: number;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function scoreRow(
|
|
237
|
+
score: MutableScore,
|
|
238
|
+
predicted: readonly number[],
|
|
239
|
+
actual: readonly number[],
|
|
240
|
+
): void {
|
|
241
|
+
const actualSet = new Set(actual);
|
|
242
|
+
let matched = 0;
|
|
243
|
+
for (const expert of predicted)
|
|
244
|
+
if (actualSet.has(expert)) matched++;
|
|
245
|
+
score.rows++;
|
|
246
|
+
score.predictedSelections += predicted.length;
|
|
247
|
+
score.actualSelections += actual.length;
|
|
248
|
+
score.matchedSelections += matched;
|
|
249
|
+
if (predicted.length === actual.length && matched === actual.length)
|
|
250
|
+
score.exactRows++;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function publicScore(score: MutableScore): Glm52CouplingScore {
|
|
254
|
+
const ratio = (numerator: number, denominator: number): number =>
|
|
255
|
+
denominator === 0 ? 0 : numerator / denominator;
|
|
256
|
+
return {
|
|
257
|
+
...score,
|
|
258
|
+
precision: ratio(score.matchedSelections, score.predictedSelections),
|
|
259
|
+
recall: ratio(score.matchedSelections, score.actualSelections),
|
|
260
|
+
exactRowRate: ratio(score.exactRows, score.rows),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function evaluateGlm52Coupling(
|
|
265
|
+
model: Glm52CouplingModel,
|
|
266
|
+
records: readonly Glm52RouteTraceRecord[],
|
|
267
|
+
budgets: readonly number[] = [4, 8, 16, 32],
|
|
268
|
+
): readonly Glm52CouplingEvaluation[] {
|
|
269
|
+
const uniqueBudgets = [...new Set(budgets)];
|
|
270
|
+
if (!uniqueBudgets.length || uniqueBudgets.some((budget) =>
|
|
271
|
+
!Number.isSafeInteger(budget) || budget < 1)) {
|
|
272
|
+
throw new RangeError("GLM coupling budgets must be positive integers");
|
|
273
|
+
}
|
|
274
|
+
const table = new Map(
|
|
275
|
+
model.entries.map((entry) => [
|
|
276
|
+
`${entry.sourceLayer}:${entry.delta}:${entry.sourceExpert}`,
|
|
277
|
+
entry.targets,
|
|
278
|
+
]),
|
|
279
|
+
);
|
|
280
|
+
const marginals = new Map(
|
|
281
|
+
model.marginals.map((entry) => [entry.layer, entry.targets]),
|
|
282
|
+
);
|
|
283
|
+
const scores = new Map<string, {
|
|
284
|
+
delta: 1 | 2;
|
|
285
|
+
budget: number;
|
|
286
|
+
coupled: MutableScore;
|
|
287
|
+
marginal: MutableScore;
|
|
288
|
+
}>();
|
|
289
|
+
const empty = (): MutableScore => ({
|
|
290
|
+
rows: 0,
|
|
291
|
+
predictedSelections: 0,
|
|
292
|
+
actualSelections: 0,
|
|
293
|
+
matchedSelections: 0,
|
|
294
|
+
exactRows: 0,
|
|
295
|
+
});
|
|
296
|
+
for (const delta of [1, 2] as const) {
|
|
297
|
+
for (const budget of uniqueBudgets) {
|
|
298
|
+
scores.set(`${delta}:${budget}`, {
|
|
299
|
+
delta,
|
|
300
|
+
budget,
|
|
301
|
+
coupled: empty(),
|
|
302
|
+
marginal: empty(),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
for (const position of routePositions(records)) {
|
|
307
|
+
for (const [sourceLayer, source] of position.layers) {
|
|
308
|
+
for (const delta of [1, 2] as const) {
|
|
309
|
+
const actual = position.layers.get(sourceLayer + delta);
|
|
310
|
+
if (!actual) continue;
|
|
311
|
+
const votes = new Map<number, number>();
|
|
312
|
+
for (const sourceExpert of source) {
|
|
313
|
+
const targets = table.get(`${sourceLayer}:${delta}:${sourceExpert}`);
|
|
314
|
+
for (const target of targets ?? []) {
|
|
315
|
+
votes.set(
|
|
316
|
+
target.expertId,
|
|
317
|
+
(votes.get(target.expertId) ?? 0) + target.count,
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const coupled = ranked(votes).map((target) => target.expertId);
|
|
322
|
+
const marginal = (marginals.get(sourceLayer + delta) ?? [])
|
|
323
|
+
.map((target) => target.expertId);
|
|
324
|
+
for (const budget of uniqueBudgets) {
|
|
325
|
+
const score = scores.get(`${delta}:${budget}`)!;
|
|
326
|
+
// Runtime-faithful: an unseen source produces fewer candidates;
|
|
327
|
+
// unlike the reporting baseline, coupling never marginal-backfills.
|
|
328
|
+
scoreRow(score.coupled, coupled.slice(0, budget), actual);
|
|
329
|
+
scoreRow(score.marginal, marginal.slice(0, budget), actual);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return Object.freeze([...scores.values()]
|
|
335
|
+
.sort((left, right) =>
|
|
336
|
+
left.delta - right.delta || left.budget - right.budget)
|
|
337
|
+
.map((score) => {
|
|
338
|
+
const coupled = publicScore(score.coupled);
|
|
339
|
+
const marginal = publicScore(score.marginal);
|
|
340
|
+
return Object.freeze({
|
|
341
|
+
delta: score.delta,
|
|
342
|
+
budget: score.budget,
|
|
343
|
+
coupled,
|
|
344
|
+
marginal,
|
|
345
|
+
recallLift: coupled.recall - marginal.recall,
|
|
346
|
+
});
|
|
347
|
+
}));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export interface Glm52CouplingTraceSplit {
|
|
351
|
+
readonly segment: string;
|
|
352
|
+
readonly trainPositions: number;
|
|
353
|
+
readonly testPositions: number;
|
|
354
|
+
readonly train: readonly Glm52RouteTraceRecord[];
|
|
355
|
+
readonly test: readonly Glm52RouteTraceRecord[];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export function splitGlm52RouteTrace(
|
|
359
|
+
records: readonly Glm52RouteTraceRecord[],
|
|
360
|
+
options: { segment?: string; trainFraction?: number } = {},
|
|
361
|
+
): Glm52CouplingTraceSplit {
|
|
362
|
+
const segments = [...new Set(records.map((record) => record.segment))];
|
|
363
|
+
const segment = options.segment ?? segments[0];
|
|
364
|
+
if (!segment || !segments.includes(segment))
|
|
365
|
+
throw new Error(`GLM route trace segment ${segment ?? "<none>"} is absent`);
|
|
366
|
+
const fraction = options.trainFraction ?? 0.7;
|
|
367
|
+
if (!(fraction > 0 && fraction < 1))
|
|
368
|
+
throw new RangeError("GLM coupling trainFraction must be between 0 and 1");
|
|
369
|
+
const positions = routePositions(
|
|
370
|
+
records.filter((record) => record.segment === segment),
|
|
371
|
+
);
|
|
372
|
+
if (positions.length < 2)
|
|
373
|
+
throw new Error("GLM coupling split requires at least two route positions");
|
|
374
|
+
const trainPositions = Math.max(
|
|
375
|
+
1,
|
|
376
|
+
Math.min(positions.length - 1, Math.floor(positions.length * fraction)),
|
|
377
|
+
);
|
|
378
|
+
const flatten = (items: readonly RoutePosition[]) => Object.freeze(
|
|
379
|
+
items.flatMap((position) => position.records),
|
|
380
|
+
);
|
|
381
|
+
return Object.freeze({
|
|
382
|
+
segment,
|
|
383
|
+
trainPositions,
|
|
384
|
+
testPositions: positions.length - trainPositions,
|
|
385
|
+
train: flatten(positions.slice(0, trainPositions)),
|
|
386
|
+
test: flatten(positions.slice(trainPositions)),
|
|
387
|
+
});
|
|
388
|
+
}
|