mlx-bun 0.5.0 → 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/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
package/src/spec/serve-loop.ts
DELETED
|
@@ -1,587 +0,0 @@
|
|
|
1
|
-
// Serve-time speculative decoding — the ONE verify/accept executor behind
|
|
2
|
-
// `serve --draft-model` (docs/reference/cli.md §7; sequenced
|
|
3
|
-
// by docs/design/batching.md Phase B).
|
|
4
|
-
//
|
|
5
|
-
// Faithful to mlx-lm's speculative_generate_step (generate.py:473-654, read
|
|
6
|
-
// from the oracle venv): per round, draft n tokens from the DraftSource, run
|
|
7
|
-
// ONE target forward over [pending, ...drafts] (n+1 positions), sample the
|
|
8
|
-
// target per position over the BATCHED lm-head logits (one matmul — matches
|
|
9
|
-
// both oracles; see src/spec/generate.ts header on why this legitimately
|
|
10
|
-
// diverges from stock decode at bf16 knife-edges), accept the longest prefix
|
|
11
|
-
// where target token == draft token (exact token-match acceptance, NOT
|
|
12
|
-
// distribution-level rejection sampling), emit the correction (or bonus)
|
|
13
|
-
// token, and trim the target caches by the rejected count.
|
|
14
|
-
//
|
|
15
|
-
// Deviations from upstream, deliberate and documented:
|
|
16
|
-
// - Rotating-cache ring wrap: upstream RAISES when a cache stops being
|
|
17
|
-
// trimmable mid-generation; a serve endpoint must not 500 mid-stream, so
|
|
18
|
-
// we STOP SPECULATING and finish the generation with plain single-token
|
|
19
|
-
// decode (bit-equivalent continuation — the target's own samples).
|
|
20
|
-
// - Sources with checkpoint support use the injected prefix-cache service.
|
|
21
|
-
// Target and companion state share the existing RAM/SSD lifecycle. Other
|
|
22
|
-
// sources begin with fresh state until they supply a checkpoint codec.
|
|
23
|
-
//
|
|
24
|
-
// Grammar × spec (Phase C, the constrained verify walk — novel: NO runtime
|
|
25
|
-
// serves both; mlx-lm has no grammar, oMLX no spec): the drafter runs FREE
|
|
26
|
-
// (drafts are proposals; a grammar-invalid draft is simply rejected at
|
|
27
|
-
// verify), and the grammar mask rides the per-position accept walk in
|
|
28
|
-
// samplePos — mask before sample, matcher advances on emitted tokens only,
|
|
29
|
-
// so rejected drafts never touch grammar state and no matcher rollback is
|
|
30
|
-
// needed. Grammar termination mid-burst truncates the round (the all--inf
|
|
31
|
-
// guarantee). Gates (no oracle): greedy grammar+spec ≡ greedy grammar-only
|
|
32
|
-
// long-prefix + 100% schema validity (tests/parity/spec-serve.test.ts).
|
|
33
|
-
//
|
|
34
|
-
// Emission discipline: tokens flow through the caller's onToken ONE AT A
|
|
35
|
-
// TIME, in order (bursts of ≤ n+1 per round) — the server's stop-sequence
|
|
36
|
-
// matcher and detokenizer see exactly the stream they'd see from generate().
|
|
37
|
-
// EOS is never emitted as content (generate() parity). onToken returning
|
|
38
|
-
// false halts the generation mid-burst.
|
|
39
|
-
|
|
40
|
-
import { MlxArray } from "../mlx/array";
|
|
41
|
-
import { sampleSpeculativeRows } from "../backends/mlx/speculative-round";
|
|
42
|
-
import * as ops from "../mlx/ops";
|
|
43
|
-
import { clearCache } from "../mlx/ffi";
|
|
44
|
-
import { cleanupFailure, disposeResources } from "../engine/resources";
|
|
45
|
-
import type { DisposableResource } from "../contracts/resources";
|
|
46
|
-
import { assertMlxSpeculativeBinding, bindLegacySpeculativeModel, type MlxSpeculativeBinding } from "../backends/mlx/speculative";
|
|
47
|
-
import type { RuntimeModel } from "../model/factory";
|
|
48
|
-
import { cloneKvCaches } from "../kv-store";
|
|
49
|
-
import { disposeAttachments, type CheckpointAttachment } from "../backends/mlx/checkpoint-state";
|
|
50
|
-
import type { Cache } from "../model/gemma4";
|
|
51
|
-
import { withModelUsageFlush, withModelWiredLimit, type GenerateOptions, type GenerateStats } from "../generate";
|
|
52
|
-
import { createKvMaintenance } from "../backends/mlx/kv-maintenance";
|
|
53
|
-
import { runtimeConfig, withRuntimeConfig } from "../runtime-config";
|
|
54
|
-
import { makeSampler, makeStepSampler } from "../sampler";
|
|
55
|
-
import type { OnToken } from "../serve/generation-gateway";
|
|
56
|
-
import type { DraftProvider } from "./source";
|
|
57
|
-
|
|
58
|
-
const PREFILL_CHUNK = 2048;
|
|
59
|
-
|
|
60
|
-
export interface SpecServeExtras {
|
|
61
|
-
drafted: number;
|
|
62
|
-
accepted: number;
|
|
63
|
-
rejected: number;
|
|
64
|
-
targetCalls: number;
|
|
65
|
-
rounds: number;
|
|
66
|
-
acceptanceLengths: number[];
|
|
67
|
-
tokensPerForward: number;
|
|
68
|
-
forwardsSaved: number;
|
|
69
|
-
/** Per-draft-position counters (index = position within a round's block,
|
|
70
|
-
* 0..γ-1): how many rounds drafted/accepted at that position. Drives the
|
|
71
|
-
* Phase-1c per-position acceptance report (scripts/dspark.ts ab)
|
|
72
|
-
* — near-zero cost, always populated. */
|
|
73
|
-
draftedByPos: number[];
|
|
74
|
-
acceptedByPos: number[];
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface SpecRunServices {
|
|
78
|
-
readonly prefixCache?: import("../backends/mlx/checkpoint-state").MlxPrefixCache;
|
|
79
|
-
/** Mounted adapter revision, resolved while the execution lease is held. */
|
|
80
|
-
readonly cacheNamespace?: string;
|
|
81
|
-
readonly cloneState?: (caches: Cache[]) => Cache[];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export async function specServeRun(
|
|
85
|
-
model: RuntimeModel,
|
|
86
|
-
provider: DraftProvider,
|
|
87
|
-
numDraftTokens: number,
|
|
88
|
-
promptIds: number[],
|
|
89
|
-
options: GenerateOptions & { stopSequences?: string[] },
|
|
90
|
-
onToken: OnToken,
|
|
91
|
-
services: SpecRunServices = {},
|
|
92
|
-
): Promise<GenerateStats> {
|
|
93
|
-
return specRun(bindLegacySpeculativeModel(model, provider), numDraftTokens, promptIds, options, onToken, services);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** The verifier consumes a bound target and source factory, independent of
|
|
97
|
-
* concrete model classes. Compatibility callers use specServeRun above. */
|
|
98
|
-
export async function specRun(
|
|
99
|
-
binding: MlxSpeculativeBinding,
|
|
100
|
-
numDraftTokens: number,
|
|
101
|
-
promptIds: number[],
|
|
102
|
-
options: GenerateOptions & { stopSequences?: string[] },
|
|
103
|
-
onToken: OnToken,
|
|
104
|
-
services: SpecRunServices = {},
|
|
105
|
-
): Promise<GenerateStats> {
|
|
106
|
-
return withRuntimeConfig(binding.runtime ?? runtimeConfig(), () => {
|
|
107
|
-
const run = () => specRunInner(binding, numDraftTokens, promptIds, options, onToken, services);
|
|
108
|
-
return binding.memory
|
|
109
|
-
? withModelWiredLimit(binding.memory, () => withModelUsageFlush(binding.memory!, run))
|
|
110
|
-
: run();
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async function specRunInner(
|
|
115
|
-
binding: MlxSpeculativeBinding,
|
|
116
|
-
numDraftTokens: number,
|
|
117
|
-
promptIds: number[],
|
|
118
|
-
options: GenerateOptions & { stopSequences?: string[] },
|
|
119
|
-
onToken: OnToken,
|
|
120
|
-
services: SpecRunServices = {},
|
|
121
|
-
): Promise<GenerateStats> {
|
|
122
|
-
const maxTokens = options.maxTokens ?? 512;
|
|
123
|
-
const maintainKv = createKvMaintenance(options);
|
|
124
|
-
const eos = options.eosTokenIds ?? [...binding.eosTokenIds];
|
|
125
|
-
const sampler = makeSampler(options);
|
|
126
|
-
const stepSampler = makeStepSampler(options, {
|
|
127
|
-
tokenRepresentation: "number",
|
|
128
|
-
grammarWait: "before-sample",
|
|
129
|
-
historyUpdate: "after-sample",
|
|
130
|
-
initialHistory: promptIds,
|
|
131
|
-
acceptGrammar: true,
|
|
132
|
-
eosTokenIds: eos,
|
|
133
|
-
sampler,
|
|
134
|
-
});
|
|
135
|
-
const gamma = Math.max(1, numDraftTokens);
|
|
136
|
-
const trace = runtimeConfig().value("MLX_BUN_SPEC_TRACE") === "1";
|
|
137
|
-
const prefillChunk = options.prefillChunkSize ??
|
|
138
|
-
binding.prefillPolicy?.chunkSize(promptIds.length) ??
|
|
139
|
-
runtimeConfig().number("MLX_BUN_RD_PREFILL_CHUNK", PREFILL_CHUNK);
|
|
140
|
-
|
|
141
|
-
// Allocated INSIDE the try below (2026-07-07 review): provider.open()
|
|
142
|
-
// throws on a mismatched (target, drafter) pairing — as pre-try consts a
|
|
143
|
-
// throw leaked options.grammar (a live WASM matcher) and the fresh caches,
|
|
144
|
-
// and turned a config error into a per-request 500. loadContext now
|
|
145
|
-
// probe-opens the pairing at startup, so a throw here is belt+suspenders.
|
|
146
|
-
let caches: Cache[] = [];
|
|
147
|
-
let prefixRetain: (() => void) | undefined;
|
|
148
|
-
let source: import("./source").DraftSource | null = null;
|
|
149
|
-
let tapLayers: number[] | undefined;
|
|
150
|
-
// Target final hidden [1,1,H] at the anchor position — the assistant source
|
|
151
|
-
// borrows it for its first draft step of each round; two-model/dflash ignore
|
|
152
|
-
// it. Retained across rounds, disposed in finally.
|
|
153
|
-
let anchorHidden: MlxArray | null = null;
|
|
154
|
-
// Round/prefill scratch tensors, hoisted so the finally disposes them on ANY
|
|
155
|
-
// throw mid-round/prefill (grammar WASM reject, awaited onToken reject, a GPU
|
|
156
|
-
// error). Each is nulled the instant its in-body disposal or ownership
|
|
157
|
-
// transfer runs, so the finally never double-frees. (A serve endpoint hits
|
|
158
|
-
// these throw seams per request; a try-body local would leak GPU memory.)
|
|
159
|
-
let lastLogits: MlxArray | null = null;
|
|
160
|
-
let prefillCtx: MlxArray | null = null;
|
|
161
|
-
const ctxParts: MlxArray[] = []; // per-chunk tapped context (DSpark only)
|
|
162
|
-
let vHidden: MlxArray | null = null;
|
|
163
|
-
let vCtxML: MlxArray | null = null;
|
|
164
|
-
let vLogits: MlxArray | null = null;
|
|
165
|
-
let roundRow: MlxArray | null = null; // the in-flight verify/continuation row
|
|
166
|
-
const extras: SpecServeExtras = {
|
|
167
|
-
drafted: 0,
|
|
168
|
-
accepted: 0,
|
|
169
|
-
rejected: 0,
|
|
170
|
-
targetCalls: 0,
|
|
171
|
-
rounds: 0,
|
|
172
|
-
acceptanceLengths: [],
|
|
173
|
-
tokensPerForward: 0,
|
|
174
|
-
forwardsSaved: 0,
|
|
175
|
-
draftedByPos: [],
|
|
176
|
-
acceptedByPos: [],
|
|
177
|
-
};
|
|
178
|
-
const stats: GenerateStats = {
|
|
179
|
-
promptTokens: promptIds.length,
|
|
180
|
-
cachedTokens: 0,
|
|
181
|
-
generatedTokens: 0,
|
|
182
|
-
prefillMs: 0, decodeMs: 0, prefillTps: 0, decodeTps: 0,
|
|
183
|
-
cacheTokens: [],
|
|
184
|
-
spec: extras,
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
/** The speculative walk needs eager token ids and waits for each grammar
|
|
188
|
-
* mask. StepSampler keeps its processor, mask, sample, and history ordering
|
|
189
|
-
* identical to the serial and batched lanes. */
|
|
190
|
-
const grammar = options.grammar;
|
|
191
|
-
const samplePos = async (logits1V: MlxArray, step: number): Promise<number> =>
|
|
192
|
-
(await stepSampler.sample(logits1V, step)).token;
|
|
193
|
-
|
|
194
|
-
const forwardTokens = async (tokens: number[], taps?: number[]) => {
|
|
195
|
-
const ids = ops.fromInt32(tokens, [1, tokens.length]);
|
|
196
|
-
try { return await binding.forward(ids, caches, taps); }
|
|
197
|
-
finally { ids.dispose(); }
|
|
198
|
-
};
|
|
199
|
-
let failure: { error: unknown } | undefined;
|
|
200
|
-
|
|
201
|
-
try {
|
|
202
|
-
options.signal?.throwIfAborted();
|
|
203
|
-
if (!Number.isSafeInteger(prefillChunk) || prefillChunk < 1)
|
|
204
|
-
throw new Error("speculative prefill chunk must be a positive integer");
|
|
205
|
-
assertMlxSpeculativeBinding(binding);
|
|
206
|
-
if (options.kvConfig?.length ||
|
|
207
|
-
(options.turboQuant && (options.quantizedKvStart ?? 0) !== 0) ||
|
|
208
|
-
(options.kvBits && ((options.kvBits !== 4 && options.kvBits !== 8) || options.quantizedKvStart !== 0)))
|
|
209
|
-
throw new Error("speculative KV requires uniform KV4/KV8 or TurboQuant start=0");
|
|
210
|
-
caches = binding.makeCache();
|
|
211
|
-
const src = binding.openDraft(sampler, caches);
|
|
212
|
-
source = src;
|
|
213
|
-
tapLayers = src.tapLayers;
|
|
214
|
-
const checkpoint = src.prefillMode === "full" ? src.checkpoint : undefined;
|
|
215
|
-
const prefixCache = checkpoint ? services.prefixCache : undefined;
|
|
216
|
-
const prefixNamespace = JSON.stringify({ method: checkpoint?.namespace,
|
|
217
|
-
adapters: services.cacheNamespace ?? options.adapters ?? [], kvBits: options.kvBits ?? null,
|
|
218
|
-
kvGroupSize: options.kvGroupSize ?? 64, quantizedKvStart: options.quantizedKvStart ?? null,
|
|
219
|
-
turboQuant: options.turboQuant ?? null });
|
|
220
|
-
let cached = 0;
|
|
221
|
-
const hit = prefixCache?.take(promptIds, prefixNamespace, options.cacheSessionId);
|
|
222
|
-
if (hit) {
|
|
223
|
-
try {
|
|
224
|
-
disposeResources(caches);
|
|
225
|
-
caches.splice(0, caches.length, ...hit.caches.splice(0));
|
|
226
|
-
prefixRetain = hit.retain;
|
|
227
|
-
hit.retain = undefined;
|
|
228
|
-
checkpoint!.restore(hit.tokens.length, hit.attachments![0]!);
|
|
229
|
-
cached = hit.tokens.length;
|
|
230
|
-
} finally {
|
|
231
|
-
disposeResources([...hit.caches, { dispose: () => disposeAttachments(hit.attachments) },
|
|
232
|
-
{ dispose: () => hit.retain?.() }]);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
stats.cachedTokens = cached;
|
|
236
|
-
const capture = (tokens: number[]) => {
|
|
237
|
-
let state: Cache[] = [];
|
|
238
|
-
let attachments: CheckpointAttachment[] = [];
|
|
239
|
-
try {
|
|
240
|
-
state = (services.cloneState ?? cloneKvCaches)(caches);
|
|
241
|
-
attachments.push(checkpoint!.capture(tokens.length));
|
|
242
|
-
prefixCache!.put(tokens, state, prefixNamespace, undefined, attachments, options.cacheSessionId);
|
|
243
|
-
state = []; attachments = [];
|
|
244
|
-
} finally {
|
|
245
|
-
disposeResources([...state, { dispose: () => disposeAttachments(attachments) }]);
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
const snapshotAt = prefixCache
|
|
249
|
-
? Math.min(options.snapshotAt ?? promptIds.length, promptIds.length - 1) : -1;
|
|
250
|
-
const seedSource = async (end: number) => {
|
|
251
|
-
if (ctxParts.length === 1) prefillCtx = ctxParts[0]!;
|
|
252
|
-
else if (ctxParts.length > 1) {
|
|
253
|
-
prefillCtx = ops.concatAxis(ctxParts, 1);
|
|
254
|
-
for (const part of ctxParts) part.dispose();
|
|
255
|
-
}
|
|
256
|
-
ctxParts.length = 0;
|
|
257
|
-
const context = prefillCtx;
|
|
258
|
-
prefillCtx = null; // source.prefill owns context on both success and failure
|
|
259
|
-
await src.prefill(promptIds.slice(0, end), context ?? undefined);
|
|
260
|
-
};
|
|
261
|
-
// ---- prefill (target, chunked; optionally tapped for DSpark), then seed
|
|
262
|
-
// the source. Order: the source's prefill needs the tapped context that the
|
|
263
|
-
// target prefill produces, so target-first (two-model's own draft prefill
|
|
264
|
-
// and the assistant no-op are order-independent). ----
|
|
265
|
-
//
|
|
266
|
-
// Oracle prefill convention (re-anchored 2026-07-07 after PR #18; then
|
|
267
|
-
// corrected to the SPEC oracle's true shape after a live gate vs
|
|
268
|
-
// speculative_generate_step still flipped a knife-edge): mlx-lm's
|
|
269
|
-
// speculative path drains BOTH models to len-1 (`_prefill: while y.size >
|
|
270
|
-
// 1`) and has NO separate step-0 at all — the un-drained last prompt
|
|
271
|
-
// token HEADS THE FIRST VERIFY WINDOW ([lastPromptToken, ...drafts]),
|
|
272
|
-
// and the first emitted token is that window's position-0 sample
|
|
273
|
-
// (generate.py:578-618). A separate L=1 step-0 (the serial-lane
|
|
274
|
-
// convention) is ulp-different from the (1+γ)-window GEMM head and still
|
|
275
|
-
// flips near-ties. So under the flag: drain to len-1, pending = the last
|
|
276
|
-
// prompt token, straight into the rounds. Gated live: 4/4 token-for-token
|
|
277
|
-
// vs the oracle venv (γ∈{2,3} × 2 prompts, incl. the knife-edge cell).
|
|
278
|
-
// MLX_BUN_PREFILL_TAIL_SPLIT=0 reverts to the legacy full-chunk + sampled
|
|
279
|
-
// token0 shape (kill switch; also the 1-token-prompt degenerate path).
|
|
280
|
-
//
|
|
281
|
-
// Seam interaction: the tapped seed covers rows 0..len-2 only — the last
|
|
282
|
-
// prompt token's row arrives via the FIRST verify round's vCtxML (it is
|
|
283
|
-
// that round's anchor row, which commit() appends) — so context sources
|
|
284
|
-
// stay in exact lockstep, and DSpark's round-1 anchor IS the last prompt
|
|
285
|
-
// token at position len-1, matching DeepSpec's reference loop. The
|
|
286
|
-
// assistant source's first-round anchor hidden = "the hidden that
|
|
287
|
-
// produced pending" = position len-2, the last drain chunk's final row.
|
|
288
|
-
const t0 = performance.now();
|
|
289
|
-
const tailSplit =
|
|
290
|
-
src.prefillMode !== "full" &&
|
|
291
|
-
binding.prefillTailSplit;
|
|
292
|
-
const oracleShape = tailSplit && promptIds.length > 1;
|
|
293
|
-
if (oracleShape) {
|
|
294
|
-
let pos = 0;
|
|
295
|
-
const end = promptIds.length - 1; // last prompt token NEVER prefilled
|
|
296
|
-
while (pos < end) {
|
|
297
|
-
options.signal?.throwIfAborted();
|
|
298
|
-
const n = Math.min(prefillChunk, end - pos);
|
|
299
|
-
const chunk = promptIds.slice(pos, pos + n);
|
|
300
|
-
const { hidden: h, ctxML } = await forwardTokens(chunk, tapLayers);
|
|
301
|
-
if (ctxML) ctxParts.push(ctxML);
|
|
302
|
-
try {
|
|
303
|
-
if (pos + n >= end) {
|
|
304
|
-
const L = h.shape[1]!;
|
|
305
|
-
const H = h.shape[2]!;
|
|
306
|
-
anchorHidden = h.slice([0, L - 1, 0], [1, L, H]); // position len-2
|
|
307
|
-
}
|
|
308
|
-
} finally { h.dispose(); } // no logits during the drain
|
|
309
|
-
maintainKv(caches);
|
|
310
|
-
clearCache();
|
|
311
|
-
pos += n;
|
|
312
|
-
if (pos < end) await new Promise<void>((resolve) => setImmediate(resolve));
|
|
313
|
-
}
|
|
314
|
-
} else {
|
|
315
|
-
// Legacy shape: full chunked prefill (final chunk included), token0
|
|
316
|
-
// sampled from the last position below.
|
|
317
|
-
for (let off = cached; off < promptIds.length;) {
|
|
318
|
-
options.signal?.throwIfAborted();
|
|
319
|
-
const end = Math.min(off + prefillChunk, promptIds.length,
|
|
320
|
-
snapshotAt > off ? snapshotAt : Infinity);
|
|
321
|
-
const chunk = promptIds.slice(off, end);
|
|
322
|
-
const { hidden: h, ctxML } = await forwardTokens(chunk, tapLayers);
|
|
323
|
-
if (ctxML) ctxParts.push(ctxML);
|
|
324
|
-
try { if (end >= promptIds.length) {
|
|
325
|
-
const L = h.shape[1]!;
|
|
326
|
-
const H = h.shape[2]!;
|
|
327
|
-
anchorHidden = h.slice([0, L - 1, 0], [1, L, H]); // [1,1,H], retained
|
|
328
|
-
const lg = binding.projectLogits(anchorHidden);
|
|
329
|
-
try {
|
|
330
|
-
const V = lg.shape[lg.shape.length - 1]!;
|
|
331
|
-
lastLogits = ops.reshape(lg, [1, V]);
|
|
332
|
-
} finally { lg.dispose(); }
|
|
333
|
-
} } finally { h.dispose(); }
|
|
334
|
-
maintainKv(caches);
|
|
335
|
-
if (end === snapshotAt && snapshotAt > cached) {
|
|
336
|
-
await seedSource(end);
|
|
337
|
-
capture(promptIds.slice(0, end));
|
|
338
|
-
}
|
|
339
|
-
clearCache();
|
|
340
|
-
off = end;
|
|
341
|
-
if (off < promptIds.length)
|
|
342
|
-
await new Promise<void>((resolve) => setImmediate(resolve));
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
extras.targetCalls++;
|
|
346
|
-
options.signal?.throwIfAborted();
|
|
347
|
-
// Seed the source: two-model prefills its own draft cache; DSpark seeds
|
|
348
|
-
// H_ctx from the tapped prompt context (ownership transfers to prefill);
|
|
349
|
-
// the assistant is a no-op.
|
|
350
|
-
await seedSource(promptIds.length);
|
|
351
|
-
// Conversion replaces plain cache objects. Bind only after prefill has
|
|
352
|
-
// converted every attention layer; rollback must own the active objects.
|
|
353
|
-
const rollback = binding.bindRollback(caches);
|
|
354
|
-
stats.prefillMs = performance.now() - t0;
|
|
355
|
-
stats.prefillTps = ((promptIds.length - cached) / Math.max(stats.prefillMs, 1e-6)) * 1000;
|
|
356
|
-
|
|
357
|
-
// ---- first pending token ----
|
|
358
|
-
// Oracle shape: pending = the UNPROCESSED last prompt token — never
|
|
359
|
-
// emitted (it's prompt), it heads the first verify window; the first
|
|
360
|
-
// generated token is that window's position-0 sample, inside the walk.
|
|
361
|
-
// Legacy shape: sample + emit token0 from the prefill logits (old
|
|
362
|
-
// convention, kill-switch / 1-token prompts).
|
|
363
|
-
const tDecode = performance.now();
|
|
364
|
-
let pending: number;
|
|
365
|
-
if (oracleShape) {
|
|
366
|
-
pending = promptIds[promptIds.length - 1]!;
|
|
367
|
-
} else {
|
|
368
|
-
pending = await samplePos(lastLogits!, 0);
|
|
369
|
-
lastLogits!.dispose();
|
|
370
|
-
lastLogits = null;
|
|
371
|
-
stats.generatedTokens++;
|
|
372
|
-
if (eos.includes(pending)) {
|
|
373
|
-
stats.finishReason = "stop";
|
|
374
|
-
stats.decodeMs = performance.now() - tDecode;
|
|
375
|
-
return stats;
|
|
376
|
-
}
|
|
377
|
-
if (
|
|
378
|
-
(await onToken(pending)) === false ||
|
|
379
|
-
stats.generatedTokens >= maxTokens ||
|
|
380
|
-
// grammar satisfied at token 0 (a 1-token grammar) — finish "stop"
|
|
381
|
-
grammar?.isTerminated
|
|
382
|
-
) {
|
|
383
|
-
stats.decodeMs = performance.now() - tDecode;
|
|
384
|
-
return stats;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
let feed: number[] = [pending];
|
|
389
|
-
let speculating = true;
|
|
390
|
-
|
|
391
|
-
// ---- rounds ----
|
|
392
|
-
decode: while (stats.generatedTokens < maxTokens) {
|
|
393
|
-
options.signal?.throwIfAborted();
|
|
394
|
-
if (!speculating) {
|
|
395
|
-
// plain single-token continuation (post-ring-wrap fallback)
|
|
396
|
-
const { hidden: h } = await forwardTokens([pending], undefined);
|
|
397
|
-
try {
|
|
398
|
-
const lg = binding.projectLogits(h);
|
|
399
|
-
try {
|
|
400
|
-
const V = lg.shape[lg.shape.length - 1]!;
|
|
401
|
-
roundRow = ops.reshape(lg, [1, V]);
|
|
402
|
-
} finally { lg.dispose(); }
|
|
403
|
-
} finally { h.dispose(); }
|
|
404
|
-
extras.targetCalls++;
|
|
405
|
-
const tok = await samplePos(roundRow, stats.generatedTokens);
|
|
406
|
-
roundRow.dispose();
|
|
407
|
-
roundRow = null;
|
|
408
|
-
clearCache();
|
|
409
|
-
stats.generatedTokens++;
|
|
410
|
-
if (eos.includes(tok)) { stats.finishReason = "stop"; break; }
|
|
411
|
-
pending = tok;
|
|
412
|
-
if ((await onToken(tok)) === false) break;
|
|
413
|
-
if (grammar?.isTerminated) break; // grammar closed — finish "stop"
|
|
414
|
-
continue;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const n = Math.min(gamma, Math.max(1, maxTokens - stats.generatedTokens));
|
|
418
|
-
|
|
419
|
-
// Ring-wrap gate, BEFORE the round writes anything: a rejected-draft
|
|
420
|
-
// rollback needs trim(), and a RotatingKVCache stops being trimmable
|
|
421
|
-
// once its ring wraps (offset ≥ maxSize) — at which point the rejected
|
|
422
|
-
// KV would be woven into the live window (unrecoverable, upstream
|
|
423
|
-
// RAISES here, generate.py:529-533). Degrade to plain decode while the
|
|
424
|
-
// caches are still clean instead of 500ing a stream.
|
|
425
|
-
// Non-trimmable recurrent caches (SSMCache — gated-DeltaNet state) are
|
|
426
|
-
// spec-eligible through the round snapshot/replay contract instead:
|
|
427
|
-
// specRoundBegin before the verify forward, then commit or a bit-exact
|
|
428
|
-
// rollback(keep) after the accept walk.
|
|
429
|
-
const roundFits = rollback.canBegin(n);
|
|
430
|
-
if (!roundFits) {
|
|
431
|
-
console.warn(
|
|
432
|
-
"spec: sliding window nearly wrapped — finishing without speculation",
|
|
433
|
-
);
|
|
434
|
-
speculating = false;
|
|
435
|
-
continue;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
// (a) draft UP TO n tokens (request sampler, mlx-lm parity). The return
|
|
439
|
-
// length d is authoritative — DSpark's confidence scheduler may prune the
|
|
440
|
-
// block short or skip it entirely. The assistant source
|
|
441
|
-
// borrows the target's anchor hidden; two-model/dflash ignore it.
|
|
442
|
-
const drafts = await src.draft(
|
|
443
|
-
feed,
|
|
444
|
-
n,
|
|
445
|
-
stats.generatedTokens,
|
|
446
|
-
anchorHidden ?? undefined,
|
|
447
|
-
);
|
|
448
|
-
const d = drafts.length;
|
|
449
|
-
if (d < 0 || d > n) throw new Error(`DraftSource returned ${d} drafts (contract: 0..${n})`);
|
|
450
|
-
if (trace) {
|
|
451
|
-
console.error(
|
|
452
|
-
`[SPEC_TRACE] round=${extras.rounds + 1} ` +
|
|
453
|
-
`feed=${feed.join(",")} drafts=${drafts.join(",")}`,
|
|
454
|
-
);
|
|
455
|
-
}
|
|
456
|
-
// d === 0 (a confidence scheduler skipping the round, DeepSpec ℓ=0
|
|
457
|
-
// semantics) needs NO special case: the verify window degenerates to
|
|
458
|
-
// [pending] alone, the accept walk to the single bonus position, commit
|
|
459
|
-
// to a 0-accept round (tapped sources still grow context by the anchor
|
|
460
|
-
// row — lockstep with the target cache).
|
|
461
|
-
extras.drafted += d;
|
|
462
|
-
for (let i = 0; i < d; i++)
|
|
463
|
-
extras.draftedByPos[i] = (extras.draftedByPos[i] ?? 0) + 1;
|
|
464
|
-
|
|
465
|
-
// (b) ONE target forward over [pending, ...drafts] (optionally tapped for
|
|
466
|
-
// DSpark's H_ctx). vHidden is retained past the accept walk: its slice at
|
|
467
|
-
// the emitted position is the next round's anchor hidden.
|
|
468
|
-
// Arm recurrent caches' spec round around the verify forward (no-op for
|
|
469
|
-
// trimmable caches, which roll back via trim() below).
|
|
470
|
-
rollback.begin(d);
|
|
471
|
-
const vIds = ops.fromInt32([pending, ...drafts], [1, d + 1]);
|
|
472
|
-
let pin: { close(): void } | undefined;
|
|
473
|
-
try {
|
|
474
|
-
pin = src.pinTargetKernelFamily ? binding.pinVerify?.() : undefined;
|
|
475
|
-
const ft = await binding.forward(vIds, caches, tapLayers);
|
|
476
|
-
// Assign these before the lm-head call so the outer cleanup owns them
|
|
477
|
-
// even if logits construction throws.
|
|
478
|
-
vHidden = ft.hidden;
|
|
479
|
-
vCtxML = ft.ctxML;
|
|
480
|
-
vLogits = binding.projectLogits(vHidden);
|
|
481
|
-
} finally {
|
|
482
|
-
vIds.dispose();
|
|
483
|
-
pin?.close();
|
|
484
|
-
}
|
|
485
|
-
extras.targetCalls++;
|
|
486
|
-
// The lm-head remains one logical batched operation. Native GLM MTP's
|
|
487
|
-
// SPEC_PIN implementation evaluates its rows through the same M=1
|
|
488
|
-
// quantized family before concatenating them.
|
|
489
|
-
|
|
490
|
-
// (c) per-position accept walk: sample the target at each position,
|
|
491
|
-
// accept while it reproduces the draft. Sampling is sequential because
|
|
492
|
-
// the processor history (and, in Phase C, the grammar mask) at position
|
|
493
|
-
// i depends on the tokens accepted at positions < i.
|
|
494
|
-
const [result] = await sampleSpeculativeRows([{
|
|
495
|
-
pending, step: stats.generatedTokens, remaining: maxTokens - stats.generatedTokens,
|
|
496
|
-
eosTokenIds: eos, sampling: stepSampler, grammarDone: () => grammar?.isTerminated ?? false,
|
|
497
|
-
}], [drafts], vLogits!);
|
|
498
|
-
const { accepted: kAccept, correction, sawEos, emitted, grammarDone } = result!.acceptance;
|
|
499
|
-
let halted = false;
|
|
500
|
-
vLogits!.dispose();
|
|
501
|
-
vLogits = null;
|
|
502
|
-
extras.accepted += kAccept;
|
|
503
|
-
extras.rejected = extras.drafted - extras.accepted;
|
|
504
|
-
extras.rounds++;
|
|
505
|
-
extras.acceptanceLengths.push(kAccept);
|
|
506
|
-
for (let i = 0; i < kAccept; i++)
|
|
507
|
-
extras.acceptedByPos[i] = (extras.acceptedByPos[i] ?? 0) + 1;
|
|
508
|
-
clearCache();
|
|
509
|
-
|
|
510
|
-
// (d) emit the round's tokens through onToken, one at a time
|
|
511
|
-
for (const tok of emitted) {
|
|
512
|
-
options.signal?.throwIfAborted();
|
|
513
|
-
stats.generatedTokens++;
|
|
514
|
-
if ((await onToken(tok)) === false) { halted = true; break; }
|
|
515
|
-
if (stats.generatedTokens >= maxTokens) break;
|
|
516
|
-
}
|
|
517
|
-
// Native generation and mlx-lm count the stopping EOS in usage while
|
|
518
|
-
// keeping it out of content. A callback or budget may stop earlier in
|
|
519
|
-
// this verified burst; that unused suffix must not enter usage.
|
|
520
|
-
if (sawEos && !halted && stats.generatedTokens < maxTokens) {
|
|
521
|
-
stats.generatedTokens++;
|
|
522
|
-
stats.finishReason = "stop";
|
|
523
|
-
}
|
|
524
|
-
extras.tokensPerForward = extras.rounds > 0
|
|
525
|
-
? stats.generatedTokens / extras.rounds
|
|
526
|
-
: 0;
|
|
527
|
-
extras.forwardsSaved = Math.max(
|
|
528
|
-
0,
|
|
529
|
-
Math.max(0, stats.generatedTokens - 1) - extras.rounds,
|
|
530
|
-
);
|
|
531
|
-
const stop = sawEos || halted || grammarDone || stats.generatedTokens >= maxTokens;
|
|
532
|
-
|
|
533
|
-
// (e) roll back the rejected suffix + commit to the source (skipped on
|
|
534
|
-
// stop — the target caches are about to be disposed). commit takes
|
|
535
|
-
// ownership of vCtxML (DSpark grows H_ctx by the accepted window; the
|
|
536
|
-
// others ignore it). The next anchor = the target hidden at the emitted
|
|
537
|
-
// position (the assistant borrows it; generate.ts:230 pattern — the slice
|
|
538
|
-
// outlives its parent's dispose).
|
|
539
|
-
if (!stop) {
|
|
540
|
-
// The verify window kept positions 0..kAccept (pending + accepted
|
|
541
|
-
// drafts). Trimmable caches drop the rejected tail; recurrent caches
|
|
542
|
-
// restore their pre-round snapshot and bit-exactly replay those
|
|
543
|
-
// kAccept+1 kept tokens. On full accept the round just commits.
|
|
544
|
-
rollback.resolve(kAccept);
|
|
545
|
-
await src.commit(
|
|
546
|
-
d,
|
|
547
|
-
kAccept,
|
|
548
|
-
vCtxML ?? undefined,
|
|
549
|
-
vHidden,
|
|
550
|
-
drafts.slice(0, kAccept),
|
|
551
|
-
); // takes ownership of vCtxML; verifiedHidden stays caller-owned
|
|
552
|
-
vCtxML = null;
|
|
553
|
-
const H = vHidden!.shape[2]!;
|
|
554
|
-
anchorHidden?.dispose();
|
|
555
|
-
anchorHidden = vHidden!.slice([0, kAccept, 0], [1, kAccept + 1, H]); // [1,1,H]
|
|
556
|
-
} else {
|
|
557
|
-
vCtxML?.dispose();
|
|
558
|
-
vCtxML = null;
|
|
559
|
-
}
|
|
560
|
-
vHidden!.dispose();
|
|
561
|
-
vHidden = null;
|
|
562
|
-
if (stop) break decode;
|
|
563
|
-
|
|
564
|
-
// (f) chain: mlx-lm's re-feed rule (generate.py:645-648)
|
|
565
|
-
const emit = correction!; // non-null: the walk always sets it unless it broke on EOS/max inside accepts
|
|
566
|
-
if (d > 0 && kAccept === d) feed = [drafts[d - 1]!, emit]; // d=0 has no last draft to re-feed
|
|
567
|
-
else feed = [emit];
|
|
568
|
-
pending = emit;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
stats.decodeMs = performance.now() - tDecode;
|
|
572
|
-
stats.decodeTps = stats.decodeMs
|
|
573
|
-
? (stats.generatedTokens / stats.decodeMs) * 1000
|
|
574
|
-
: 0;
|
|
575
|
-
return stats;
|
|
576
|
-
} catch (error) {
|
|
577
|
-
failure = { error };
|
|
578
|
-
throw error;
|
|
579
|
-
} finally {
|
|
580
|
-
const resources = [anchorHidden, lastLogits, prefillCtx, ...ctxParts,
|
|
581
|
-
vLogits, roundRow, vHidden, vCtxML, ...caches, source, stepSampler,
|
|
582
|
-
options.grammar, { dispose: () => prefixRetain?.() }, { dispose: clearCache }]
|
|
583
|
-
.filter((resource): resource is DisposableResource => resource != null);
|
|
584
|
-
if (failure) cleanupFailure(failure.error, () => disposeResources(resources));
|
|
585
|
-
else disposeResources(resources);
|
|
586
|
-
}
|
|
587
|
-
}
|