@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,188 @@
|
|
|
1
|
+
// The echo source (K3c, Lab tier) — a growing per-request k-gram index over
|
|
2
|
+
// the session's own tokens, and the branch-point rule that decides how far a
|
|
3
|
+
// copied span may run.
|
|
4
|
+
//
|
|
5
|
+
// PORT. The index is the TS port of `GrowingMatcher` from the corpus study
|
|
6
|
+
// (reports/k3-replication/analyze.py): a sequence plus a k-gram → [start
|
|
7
|
+
// positions] map, appended incrementally so a lookup never rescans the prefix,
|
|
8
|
+
// with the bucket scan capped at the NEAREST candidates. The corpus tool ran
|
|
9
|
+
// it offline over recorded turns to measure how much of an agent's output is
|
|
10
|
+
// copy-determined; this runs the same structure online, over promptIds plus
|
|
11
|
+
// everything emitted (injected tokens included — the model cannot tell them
|
|
12
|
+
// apart, so neither does the index).
|
|
13
|
+
//
|
|
14
|
+
// THE INTERESTING PART is not the lookup, it is the STOPPING RULE. A match
|
|
15
|
+
// tells you where this exact k-gram occurred before; it does not tell you how
|
|
16
|
+
// far the future agrees with the past. So the span extends only while EVERY
|
|
17
|
+
// nearby occurrence continues the same way. The moment two occurrences
|
|
18
|
+
// disagree — the session history forks — the span stops. That is where
|
|
19
|
+
// old-query-vs-new-query divergence lives, and delimiters fall out of it for
|
|
20
|
+
// free: a closing quote is where histories fork.
|
|
21
|
+
//
|
|
22
|
+
// DOCTRINE. An echo span is a GUESS, unlike the schema rows. It ships under
|
|
23
|
+
// policy "verify" unless it is unambiguous all the way to a delimiter-class
|
|
24
|
+
// token — the engine then keeps only the prefix the model itself agrees with.
|
|
25
|
+
// Lab tier: default off, and a paired A/B decides whether it ever becomes a
|
|
26
|
+
// default.
|
|
27
|
+
import type { Proposal, ProposalSource, TokenView } from "./proposal";
|
|
28
|
+
|
|
29
|
+
export interface EchoConfig {
|
|
30
|
+
/** Anchor length: the k-gram that has to match for a span to be proposed. */
|
|
31
|
+
k: number;
|
|
32
|
+
/** Longest span the source will propose (the session clamps again). */
|
|
33
|
+
maxSpan: number;
|
|
34
|
+
/** Bucket scan cap — the NEAREST occurrences win (recency is the signal;
|
|
35
|
+
* an unbounded scan is also the only quadratic risk here). */
|
|
36
|
+
maxCandidates: number;
|
|
37
|
+
/** Stop growing the index past this many tokens (memory cap). */
|
|
38
|
+
indexMax: number;
|
|
39
|
+
/** Token ids that legitimately END a copied span (a closing quote, the
|
|
40
|
+
* markup that follows an argument value). Derived from the template by the
|
|
41
|
+
* strict-row compiler; empty means "no span can be asserted". */
|
|
42
|
+
delimiters: ReadonlySet<number>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Growing k-gram index over one request's token sequence. */
|
|
46
|
+
export class EchoIndex {
|
|
47
|
+
readonly #k: number;
|
|
48
|
+
readonly #indexMax: number;
|
|
49
|
+
readonly #seq: number[] = [];
|
|
50
|
+
/** hash(k-gram) → start positions, oldest first. Hash collisions are
|
|
51
|
+
* harmless: every candidate's gram is compared id-for-id before use. */
|
|
52
|
+
readonly #buckets = new Map<number, number[]>();
|
|
53
|
+
#frozen = false;
|
|
54
|
+
|
|
55
|
+
constructor(k: number, indexMax: number) {
|
|
56
|
+
this.#k = Math.max(1, Math.floor(k));
|
|
57
|
+
this.#indexMax = Math.max(this.#k, Math.floor(indexMax));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get length(): number { return this.#seq.length; }
|
|
61
|
+
/** True once the memory cap stopped the index from growing. */
|
|
62
|
+
get frozen(): boolean { return this.#frozen; }
|
|
63
|
+
|
|
64
|
+
append(ids: readonly number[]): void {
|
|
65
|
+
for (const id of ids) {
|
|
66
|
+
if (this.#seq.length >= this.#indexMax) { this.#frozen = true; return; }
|
|
67
|
+
this.#seq.push(id);
|
|
68
|
+
const start = this.#seq.length - this.#k;
|
|
69
|
+
if (start < 0) continue;
|
|
70
|
+
const h = this.#hash(start);
|
|
71
|
+
const bucket = this.#buckets.get(h);
|
|
72
|
+
if (bucket) bucket.push(start);
|
|
73
|
+
else this.#buckets.set(h, [start]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Start positions whose k-gram equals `gram` AND which have at least one
|
|
78
|
+
* token after it, nearest (most recent) first. */
|
|
79
|
+
candidates(gram: readonly number[], cap: number): number[] {
|
|
80
|
+
if (gram.length !== this.#k) return [];
|
|
81
|
+
let h = 0x811c9dc5;
|
|
82
|
+
for (const id of gram) h = this.#mix(h, id);
|
|
83
|
+
const bucket = this.#buckets.get(h >>> 0);
|
|
84
|
+
if (!bucket) return [];
|
|
85
|
+
const out: number[] = [];
|
|
86
|
+
for (let i = bucket.length - 1; i >= 0 && out.length < cap; i--) {
|
|
87
|
+
const pos = bucket[i]!;
|
|
88
|
+
if (pos + this.#k >= this.#seq.length) continue; // no continuation yet
|
|
89
|
+
let ok = true;
|
|
90
|
+
for (let j = 0; j < this.#k; j++) {
|
|
91
|
+
if (this.#seq[pos + j] !== gram[j]) { ok = false; break; } // collision
|
|
92
|
+
}
|
|
93
|
+
if (ok) out.push(pos);
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Extend forward from the given anchors while EVERY anchor agrees.
|
|
99
|
+
* Returns the agreed continuation, whether it stopped at a fork, and how
|
|
100
|
+
* many occurrences corroborated the WHOLE span (survivors at the last
|
|
101
|
+
* accepted token) — one occurrence is a copy, several are a pattern. */
|
|
102
|
+
extend(
|
|
103
|
+
anchors: readonly number[], maxSpan: number, delimiters: ReadonlySet<number>,
|
|
104
|
+
): { ids: number[]; branchStop: boolean; agreed: number } {
|
|
105
|
+
const ids: number[] = [];
|
|
106
|
+
let agreed = 0;
|
|
107
|
+
let live = anchors.map((p) => p + this.#k);
|
|
108
|
+
while (ids.length < maxSpan) {
|
|
109
|
+
let next: number | undefined;
|
|
110
|
+
let forked = false;
|
|
111
|
+
const stillLive: number[] = [];
|
|
112
|
+
for (const p of live) {
|
|
113
|
+
const v = this.#seq[p];
|
|
114
|
+
// An occurrence that ran out of history simply drops out: a prefix
|
|
115
|
+
// that ends is not evidence of disagreement.
|
|
116
|
+
if (v === undefined) continue;
|
|
117
|
+
if (next === undefined) next = v;
|
|
118
|
+
else if (v !== next) { forked = true; break; }
|
|
119
|
+
stillLive.push(p + 1);
|
|
120
|
+
}
|
|
121
|
+
// A fork means the session's own history disagrees about what comes
|
|
122
|
+
// next. That is exactly the position the model must decide for itself.
|
|
123
|
+
if (forked) return { ids, branchStop: true, agreed };
|
|
124
|
+
if (next === undefined) break; // every occurrence exhausted
|
|
125
|
+
ids.push(next);
|
|
126
|
+
agreed = stillLive.length;
|
|
127
|
+
live = stillLive;
|
|
128
|
+
// A delimiter is a legitimate END: injecting the closing quote is the
|
|
129
|
+
// point, continuing past it is not.
|
|
130
|
+
if (delimiters.has(next)) break;
|
|
131
|
+
}
|
|
132
|
+
return { ids, branchStop: false, agreed };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
#hash(start: number): number {
|
|
136
|
+
let h = 0x811c9dc5;
|
|
137
|
+
for (let j = 0; j < this.#k; j++) h = this.#mix(h, this.#seq[start + j]!);
|
|
138
|
+
return h >>> 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
#mix(h: number, id: number): number {
|
|
142
|
+
let x = h ^ id;
|
|
143
|
+
x = Math.imul(x, 0x01000193);
|
|
144
|
+
return x >>> 0;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** ProposalSource over the echo index. */
|
|
149
|
+
export class EchoSource implements ProposalSource {
|
|
150
|
+
readonly name = "echo";
|
|
151
|
+
readonly windowNeeded: number;
|
|
152
|
+
readonly index: EchoIndex;
|
|
153
|
+
|
|
154
|
+
constructor(private readonly config: EchoConfig, promptIds: readonly number[]) {
|
|
155
|
+
this.windowNeeded = config.k;
|
|
156
|
+
this.index = new EchoIndex(config.k, config.indexMax);
|
|
157
|
+
this.index.append(promptIds);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
observe(ids: readonly number[]): void {
|
|
161
|
+
this.index.append(ids);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
propose(view: TokenView): Proposal | null {
|
|
165
|
+
const { k, maxSpan, maxCandidates, delimiters } = this.config;
|
|
166
|
+
const gram = view.tail(k);
|
|
167
|
+
if (gram.length < k) return null;
|
|
168
|
+
const anchors = this.index.candidates(gram, maxCandidates);
|
|
169
|
+
if (anchors.length === 0) return null;
|
|
170
|
+
const { ids, branchStop, agreed } = this.index.extend(anchors, maxSpan, delimiters);
|
|
171
|
+
if (ids.length < 2) return null;
|
|
172
|
+
// POLICY. Assert only with CORROBORATION: several occurrences of this
|
|
173
|
+
// context all continued the same way, nothing forked, and the span stops
|
|
174
|
+
// at a delimiter-class token. A single occurrence is just a copy — and a
|
|
175
|
+
// copy will happily replay whatever followed it in the transcript,
|
|
176
|
+
// including another role's turn, so it has to be the model's call.
|
|
177
|
+
// Everything else rides policy "verify", where a wrong guess costs a
|
|
178
|
+
// rewound forward, never a wrong token.
|
|
179
|
+
const endsAtDelimiter = delimiters.has(ids[ids.length - 1]!);
|
|
180
|
+
const corroborated = agreed >= 2;
|
|
181
|
+
return {
|
|
182
|
+
ids,
|
|
183
|
+
policy: !branchStop && endsAtDelimiter && corroborated ? "assert" : "verify",
|
|
184
|
+
origin: "echo",
|
|
185
|
+
branchStop,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// One interface for every source that can propose the next tokens.
|
|
2
|
+
//
|
|
3
|
+
// A proposal is a claim about the sequence, plus how strongly it is held:
|
|
4
|
+
//
|
|
5
|
+
// assert — the tokens are DETERMINED (a chat template's tool-call scaffold
|
|
6
|
+
// is a function of the request's `tools`). The engine appends them
|
|
7
|
+
// and moves on: no readback, no rewind, no checkpoint. This is
|
|
8
|
+
// context extension, not speculation.
|
|
9
|
+
// verify — the tokens are LIKELY (a span copied from earlier in the same
|
|
10
|
+
// session). The engine appends them in the same single forward,
|
|
11
|
+
// then reads the argmax already sitting in that forward's logits
|
|
12
|
+
// at every span position — free, no extra pass — keeps the agreed
|
|
13
|
+
// prefix, rewinds the rest, and resumes decode at the first
|
|
14
|
+
// disagreement.
|
|
15
|
+
//
|
|
16
|
+
// Both policies share the expensive half: ONE chunked forward that advances
|
|
17
|
+
// the KV (and recurrent SSM state) over the whole span. That shared primitive
|
|
18
|
+
// lives in generate.ts; everything here is bookkeeping.
|
|
19
|
+
//
|
|
20
|
+
// MIGRATION NOTE. The shipped speculative lane
|
|
21
|
+
// (packages/inference/src/generation/speculative/) has its own
|
|
22
|
+
// grouped draft rows with a verify/rollback executor of their own (ngram, MTP,
|
|
23
|
+
// two-model, DSpark). Those are NOT rewired onto this interface in this phase
|
|
24
|
+
// — the adapter (draft rows wrapped as a `verify`-policy ProposalSource, so
|
|
25
|
+
// one apply primitive serves both lanes) is future work, deliberately deferred
|
|
26
|
+
// so the spec lane's oracles stay untouched.
|
|
27
|
+
|
|
28
|
+
/** What a source can see of the sequence so far. */
|
|
29
|
+
export interface TokenView {
|
|
30
|
+
/** Tokens seen: prompt + everything emitted (injected tokens included). */
|
|
31
|
+
readonly length: number;
|
|
32
|
+
/** The last `n` ids, oldest first. Shorter near the start of a request, and
|
|
33
|
+
* bounded by the session's retained window — a source that needs more
|
|
34
|
+
* history keeps its own copy (see observe()). */
|
|
35
|
+
tail(n: number): readonly number[];
|
|
36
|
+
/** Tokens the caller may still emit (max_tokens − generated). */
|
|
37
|
+
readonly budget: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** How strongly a proposal is held — see the file header. */
|
|
41
|
+
export type ProposalPolicy = "assert" | "verify";
|
|
42
|
+
|
|
43
|
+
/** Where a proposal came from. `ngram`/`mtp` are reserved for the spec-lane
|
|
44
|
+
* adapter that does not exist yet (see MIGRATION NOTE). */
|
|
45
|
+
export type ProposalOrigin = "schema" | "template" | "echo" | "ngram" | "mtp";
|
|
46
|
+
|
|
47
|
+
export interface Proposal {
|
|
48
|
+
ids: number[];
|
|
49
|
+
policy: ProposalPolicy;
|
|
50
|
+
origin: ProposalOrigin;
|
|
51
|
+
/** Echo only: the span stopped because the session history forked here
|
|
52
|
+
* (multiple distinct continuations). Telemetry + policy input. */
|
|
53
|
+
branchStop?: boolean;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ProposalSource {
|
|
57
|
+
readonly name: string;
|
|
58
|
+
/** How many trailing tokens this source needs to see in `TokenView.tail`.
|
|
59
|
+
* The session retains the maximum across its sources; a source that needs
|
|
60
|
+
* more history than that keeps its own copy (see observe()). */
|
|
61
|
+
readonly windowNeeded?: number;
|
|
62
|
+
/** Propose the tokens that follow `tail`, or null. The caller clamps
|
|
63
|
+
* (EOS / delimiter / max span / budget), so a source may return more than
|
|
64
|
+
* the budget allows. */
|
|
65
|
+
propose(tail: TokenView): Proposal | null;
|
|
66
|
+
/** Every token that actually entered the sequence — sampled or injected —
|
|
67
|
+
* in order. Sources that maintain an index grow it here. */
|
|
68
|
+
observe?(ids: readonly number[]): void;
|
|
69
|
+
}
|