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
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
// Faithful DFlash decode loop — the draft attends to a GROWING multi-layer
|
|
2
|
-
// context H_ctx (the target's tapped hiddens over the accepted stream), per
|
|
3
|
-
// paper §3.1 / Eq 3 + §5.1 runtime. Parallel to generate.ts (v1 single-vector).
|
|
4
|
-
//
|
|
5
|
-
// Each verify pass is TAPPED (captures the m layers at the verified positions);
|
|
6
|
-
// after accepting kAccept drafts, the anchor + accepted tokens' m-layer hiddens
|
|
7
|
-
// are appended to H_ctx (rejected tips are never added — mirrors the KV trim).
|
|
8
|
-
// Losslessness is unchanged: greedy = longest-prefix match; temp>0 = min(1,p/q)
|
|
9
|
-
// + residual resample. H_ctx only affects WHICH tokens get drafted (τ), never
|
|
10
|
-
// what is emitted.
|
|
11
|
-
|
|
12
|
-
import { MlxArray } from "../../mlx/array";
|
|
13
|
-
import { Dtype } from "../../mlx/ffi";
|
|
14
|
-
import * as ops from "../../mlx/ops";
|
|
15
|
-
import { Gemma4Model } from "../../model/gemma4";
|
|
16
|
-
import type { DflashDrafter } from "./module-dflash";
|
|
17
|
-
import { KeyStream, processLogits, probsOf, probAtToken, sampleToken, sampleResidual, type DSparkSampleConfig } from "./sample";
|
|
18
|
-
import type { ConfSample } from "./calibration";
|
|
19
|
-
|
|
20
|
-
export interface DflashGenOptions {
|
|
21
|
-
gamma?: number;
|
|
22
|
-
maxTokens?: number;
|
|
23
|
-
eosTokenIds?: number[];
|
|
24
|
-
sample?: DSparkSampleConfig;
|
|
25
|
-
/** Confidence-scheduled draft-length pruning (Alg 1). Defaults to the
|
|
26
|
-
* checkpoint's STS thresholds (drafter.cfg.sts) when calibrated; pass
|
|
27
|
-
* minConf for a uniform manual override; pass thresholds:[] to disable. */
|
|
28
|
-
thresholds?: number[];
|
|
29
|
-
minConf?: number;
|
|
30
|
-
/** Calibration hook (scripts/dspark.ts calibrate): called once per draft
|
|
31
|
-
* round with that round's per-position (confidence, accepted) samples,
|
|
32
|
-
* AFTER kAccept is known. Not used by ordinary decode. */
|
|
33
|
-
onRound?: (samples: ConfSample[]) => void;
|
|
34
|
-
}
|
|
35
|
-
export interface DflashStats {
|
|
36
|
-
emitted: number; drafted: number; accepted: number; targetCalls: number;
|
|
37
|
-
decodeMs: number; prefillMs: number; acceptanceRate: number; meanAcceptLen: number; meanConf: number; decodeTps: number;
|
|
38
|
-
}
|
|
39
|
-
export interface DflashResult { tokens: number[]; stats: DflashStats }
|
|
40
|
-
|
|
41
|
-
/** Tapped forward: run the target over `ids`, returning the final post-norm
|
|
42
|
-
* hidden [1,L,H] AND the m-layer context [1,L,m*H] (tapLayers concatenated on
|
|
43
|
-
* the feature axis). */
|
|
44
|
-
function forwardTapped(model: Gemma4Model, ids: MlxArray, caches: import("../../model/gemma4").Cache[], tapLayers: number[]): { finalH: MlxArray; ctxML: MlxArray } {
|
|
45
|
-
const cap = new Map<number, MlxArray>();
|
|
46
|
-
model.hiddenTap = { layers: new Set(tapLayers), captured: cap };
|
|
47
|
-
let finalH: MlxArray | null = null;
|
|
48
|
-
let ctxML: MlxArray;
|
|
49
|
-
try {
|
|
50
|
-
finalH = model.forwardHidden(ids, caches);
|
|
51
|
-
const perLayer = tapLayers.map((li) => { const a = cap.get(li); if (!a) throw new Error(`layer ${li} not captured`); return a; });
|
|
52
|
-
ctxML = ops.concatAxis(perLayer, 2); // [1,L,m*H]
|
|
53
|
-
for (const [, a] of cap) a.dispose();
|
|
54
|
-
cap.clear(); // consumed — the finally must not double-dispose
|
|
55
|
-
const out = { finalH, ctxML };
|
|
56
|
-
finalH = null; // ownership returned to the caller
|
|
57
|
-
return out;
|
|
58
|
-
} finally {
|
|
59
|
-
// Free partial captures + an orphaned finalH on the throw path (on success
|
|
60
|
-
// both are already gone).
|
|
61
|
-
finalH?.dispose();
|
|
62
|
-
for (const [, a] of cap) a.dispose();
|
|
63
|
-
model.hiddenTap = null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function sampleFromHidden(model: Gemma4Model, hidden: MlxArray, pos: number, cfg: DSparkSampleConfig | null, keys: KeyStream): number {
|
|
68
|
-
const H = hidden.shape[2]!;
|
|
69
|
-
const hSl = hidden.slice([0, pos, 0], [1, pos + 1, H]);
|
|
70
|
-
const logits = model.logitsFromHidden(hSl); hSl.dispose();
|
|
71
|
-
const V = logits.shape[2]!;
|
|
72
|
-
const flat = ops.reshape(logits, [1, V]); logits.dispose();
|
|
73
|
-
let tok: number;
|
|
74
|
-
if (cfg) { const sc = processLogits(flat, cfg); tok = sampleToken(sc, keys.next()); sc.dispose(); }
|
|
75
|
-
else { const am = ops.argmaxAxis(flat, -1); tok = ops.itemUint32(am); am.dispose(); }
|
|
76
|
-
flat.dispose();
|
|
77
|
-
return tok;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function picksBatched(model: Gemma4Model, hidden: MlxArray, count: number): number[] {
|
|
81
|
-
const logits = model.logitsFromHidden(hidden);
|
|
82
|
-
const V = logits.shape[2]!;
|
|
83
|
-
const out: number[] = [];
|
|
84
|
-
for (let k = 0; k < count; k++) {
|
|
85
|
-
const sl = logits.slice([0, k, 0], [1, k + 1, V]);
|
|
86
|
-
const flat = ops.reshape(sl, [1, V]); sl.dispose();
|
|
87
|
-
const am = ops.argmaxAxis(flat, -1); flat.dispose();
|
|
88
|
-
out.push(ops.itemUint32(am)); am.dispose();
|
|
89
|
-
}
|
|
90
|
-
logits.dispose();
|
|
91
|
-
return out;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
interface Verdict { kAccept: number; emit: number }
|
|
95
|
-
|
|
96
|
-
function verifyGreedy(model: Gemma4Model, vHidden: MlxArray, drafts: number[], gamma: number): Verdict {
|
|
97
|
-
const gt = picksBatched(model, vHidden, gamma + 1);
|
|
98
|
-
let k = 0; while (k < gamma && drafts[k] === gt[k]) k++;
|
|
99
|
-
return { kAccept: k, emit: gt[k]! };
|
|
100
|
-
}
|
|
101
|
-
function verifySampling(model: Gemma4Model, vHidden: MlxArray, draftLogits: MlxArray, drafts: number[], gamma: number, cfg: DSparkSampleConfig, keys: KeyStream): Verdict {
|
|
102
|
-
const V = draftLogits.shape[2]!;
|
|
103
|
-
const tl = model.logitsFromHidden(vHidden);
|
|
104
|
-
const us = ops.randomUniform([gamma], Dtype.float32, 0, 1, keys.next());
|
|
105
|
-
const u = us.toFloat32(); us.dispose();
|
|
106
|
-
const slice = (a: MlxArray, i: number) => { const s = a.slice([0, i, 0], [1, i + 1, V]); const f = ops.reshape(s, [1, V]); s.dispose(); return f; };
|
|
107
|
-
let verdict: Verdict | null = null;
|
|
108
|
-
for (let k = 0; k < gamma; k++) {
|
|
109
|
-
const x = drafts[k]!;
|
|
110
|
-
// processLogits does not consume its input — bind each sliced row and
|
|
111
|
-
// dispose it after (an inline slice(...) here leaked one [1,V] per position).
|
|
112
|
-
const tRow = slice(tl, k);
|
|
113
|
-
const ps = processLogits(tRow, cfg); tRow.dispose(); const P = probsOf(ps); ps.dispose();
|
|
114
|
-
const qRow = slice(draftLogits, k);
|
|
115
|
-
const qs = processLogits(qRow, cfg); qRow.dispose(); const Q = probsOf(qs); qs.dispose();
|
|
116
|
-
const pX = probAtToken(P, x), qX = probAtToken(Q, x);
|
|
117
|
-
if (u[k]! < Math.min(1, qX > 0 ? pX / qX : 1)) { P.dispose(); Q.dispose(); continue; }
|
|
118
|
-
const corr = sampleResidual(P, Q, keys.next()); P.dispose(); Q.dispose();
|
|
119
|
-
verdict = { kAccept: k, emit: corr }; break;
|
|
120
|
-
}
|
|
121
|
-
if (!verdict) {
|
|
122
|
-
const bRow = slice(tl, gamma);
|
|
123
|
-
const bs = processLogits(bRow, cfg); bRow.dispose();
|
|
124
|
-
verdict = { kAccept: gamma, emit: sampleToken(bs, keys.next()) }; bs.dispose();
|
|
125
|
-
}
|
|
126
|
-
tl.dispose();
|
|
127
|
-
return verdict;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function dflashGenerate(model: Gemma4Model, drafter: DflashDrafter, promptTokens: number[], options: DflashGenOptions = {}): DflashResult {
|
|
131
|
-
const gamma = options.gamma ?? drafter.cfg.gamma;
|
|
132
|
-
const { maxTokens = 256, eosTokenIds = model.config.eosTokenIds } = options;
|
|
133
|
-
const sampleCfg = options.sample && options.sample.temperature > 0 ? options.sample : null;
|
|
134
|
-
const keys = new KeyStream(options.sample?.seed ?? 0);
|
|
135
|
-
const tapLayers = drafter.cfg.tapLayers;
|
|
136
|
-
|
|
137
|
-
const caches = model.makeCache();
|
|
138
|
-
const stats: DflashStats = { emitted: 0, drafted: 0, accepted: 0, targetCalls: 0, decodeMs: 0, prefillMs: 0, acceptanceRate: 0, meanAcceptLen: 0, meanConf: 0, decodeTps: 0 };
|
|
139
|
-
const out: number[] = [];
|
|
140
|
-
let confSum = 0, rounds = 0, acceptLenSum = 0;
|
|
141
|
-
let H_ctx: MlxArray | null = null;
|
|
142
|
-
// Round-local tensors, hoisted so the finally frees them on a mid-round
|
|
143
|
-
// throw (verify, sampling, concat); each is nulled at its normal disposal
|
|
144
|
-
// — the serve-loop discipline (src/spec/serve-loop.ts).
|
|
145
|
-
let vHidden: MlxArray | null = null;
|
|
146
|
-
let vCtxML: MlxArray | null = null;
|
|
147
|
-
let blockLogits: MlxArray | null = null;
|
|
148
|
-
|
|
149
|
-
try {
|
|
150
|
-
// 1. prefill (tapped): seed H_ctx with the prompt's m-layer hiddens.
|
|
151
|
-
const t0 = performance.now();
|
|
152
|
-
const ids = ops.fromInt32(promptTokens, [1, promptTokens.length]);
|
|
153
|
-
const { finalH, ctxML } = forwardTapped(model, ids, caches, tapLayers);
|
|
154
|
-
ids.dispose();
|
|
155
|
-
stats.targetCalls++;
|
|
156
|
-
H_ctx = ctxML; // [1, Lp, m*H]
|
|
157
|
-
const Lp = finalH.shape[1]!;
|
|
158
|
-
let next = sampleFromHidden(model, finalH, Lp - 1, sampleCfg, keys);
|
|
159
|
-
finalH.dispose();
|
|
160
|
-
stats.prefillMs = performance.now() - t0;
|
|
161
|
-
|
|
162
|
-
if (eosTokenIds.includes(next)) return finalize(stats, out, rounds, acceptLenSum, confSum);
|
|
163
|
-
out.push(next); stats.emitted++;
|
|
164
|
-
|
|
165
|
-
const tDecode = performance.now();
|
|
166
|
-
// Alg 1 thresholds: explicit option > checkpoint STS calibration > none.
|
|
167
|
-
const thresholds = options.thresholds ?? drafter.cfg.sts?.thresholds;
|
|
168
|
-
outer: while (stats.emitted < maxTokens) {
|
|
169
|
-
// 2a. draft against the current (growing) H_ctx. The scheduler may prune
|
|
170
|
-
// the block short (d ≤ γ) — verify then covers exactly d positions.
|
|
171
|
-
const block = drafter.forwardInfer(model, H_ctx!, next, gamma, {
|
|
172
|
-
sample: sampleCfg ?? undefined, keys, thresholds, minConf: options.minConf,
|
|
173
|
-
});
|
|
174
|
-
const drafts = block.tokens;
|
|
175
|
-
blockLogits = block.draftLogits ?? null;
|
|
176
|
-
const d = drafts.length;
|
|
177
|
-
stats.drafted += d;
|
|
178
|
-
for (const c of block.conf) confSum += c;
|
|
179
|
-
|
|
180
|
-
// 2b. verify (tapped) — get accepted tokens' m-layer hiddens to append.
|
|
181
|
-
const vIds = ops.fromInt32([next, ...drafts], [1, d + 1]);
|
|
182
|
-
const ft = forwardTapped(model, vIds, caches, tapLayers);
|
|
183
|
-
vHidden = ft.finalH;
|
|
184
|
-
vCtxML = ft.ctxML;
|
|
185
|
-
vIds.dispose();
|
|
186
|
-
stats.targetCalls++;
|
|
187
|
-
|
|
188
|
-
const { kAccept, emit } = sampleCfg
|
|
189
|
-
? verifySampling(model, vHidden, blockLogits!, drafts, d, sampleCfg, keys)
|
|
190
|
-
: verifyGreedy(model, vHidden, drafts, d);
|
|
191
|
-
blockLogits?.dispose();
|
|
192
|
-
blockLogits = null;
|
|
193
|
-
stats.accepted += kAccept; rounds++; acceptLenSum += kAccept + 1;
|
|
194
|
-
|
|
195
|
-
// Calibration hook (scripts/dspark.ts calibrate): report this round's
|
|
196
|
-
// per-position (confidence, accepted) outcomes now that kAccept is known.
|
|
197
|
-
if (options.onRound) {
|
|
198
|
-
const roundSamples: ConfSample[] = [];
|
|
199
|
-
for (let k = 0; k < drafts.length; k++) roundSamples.push({ pos: k, conf: block.conf[k]!, accepted: k < kAccept });
|
|
200
|
-
options.onRound(roundSamples);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// 2c. emit accepted drafts
|
|
204
|
-
for (let k = 0; k < kAccept; k++) {
|
|
205
|
-
const isEos = eosTokenIds.includes(drafts[k]!);
|
|
206
|
-
if (!isEos) out.push(drafts[k]!);
|
|
207
|
-
stats.emitted++;
|
|
208
|
-
if (isEos || stats.emitted >= maxTokens) break outer; // finally frees vHidden/vCtxML
|
|
209
|
-
}
|
|
210
|
-
const emitIsEos = eosTokenIds.includes(emit);
|
|
211
|
-
if (!emitIsEos) out.push(emit);
|
|
212
|
-
stats.emitted++;
|
|
213
|
-
|
|
214
|
-
// 2d. append accepted stream's m-layer hiddens (anchor + kAccept drafts =
|
|
215
|
-
// vCtxML[:, 0..kAccept]) to H_ctx; never the rejected tips.
|
|
216
|
-
const add = vCtxML!.slice([0, 0, 0], [1, kAccept + 1, vCtxML!.shape[2]!]);
|
|
217
|
-
const grown = ops.concatAxis([H_ctx!, add], 1);
|
|
218
|
-
H_ctx!.dispose(); add.dispose(); vCtxML!.dispose(); vCtxML = null;
|
|
219
|
-
H_ctx = grown;
|
|
220
|
-
|
|
221
|
-
// 2e. roll back rejected KV tips (bypass trim, past-window safe)
|
|
222
|
-
if (kAccept < d) { const nRej = d - kAccept; for (const c of caches) c.trim(nRej, true); }
|
|
223
|
-
|
|
224
|
-
vHidden!.dispose(); vHidden = null;
|
|
225
|
-
if (emitIsEos || stats.emitted >= maxTokens) break;
|
|
226
|
-
next = emit;
|
|
227
|
-
}
|
|
228
|
-
stats.decodeMs = performance.now() - tDecode;
|
|
229
|
-
} finally {
|
|
230
|
-
H_ctx?.dispose();
|
|
231
|
-
vHidden?.dispose();
|
|
232
|
-
vCtxML?.dispose();
|
|
233
|
-
blockLogits?.dispose();
|
|
234
|
-
for (const c of caches) c.dispose();
|
|
235
|
-
}
|
|
236
|
-
return finalize(stats, out, rounds, acceptLenSum, confSum);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
function finalize(stats: DflashStats, out: number[], rounds: number, acceptLenSum: number, confSum: number): DflashResult {
|
|
240
|
-
stats.acceptanceRate = stats.drafted ? stats.accepted / stats.drafted : 0;
|
|
241
|
-
stats.meanAcceptLen = rounds ? acceptLenSum / rounds : 0;
|
|
242
|
-
stats.meanConf = stats.drafted ? confSum / stats.drafted : 0;
|
|
243
|
-
stats.decodeTps = stats.decodeMs ? ((stats.emitted - 1) / stats.decodeMs) * 1000 : 0;
|
|
244
|
-
return { tokens: out, stats };
|
|
245
|
-
}
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
// DSpark speculative decode loop — a fork of src/spec/generate.ts
|
|
2
|
-
// (specGenerate). Same γ-draft / verify-in-one-pass / accept-longest-prefix /
|
|
3
|
-
// rollback spine, but the drafter is the trainable DSpark module: one PARALLEL
|
|
4
|
-
// backbone pass + a cheap SEQUENTIAL Markov head produce the γ-block, instead
|
|
5
|
-
// of γ sequential KV-borrowing drafter calls. DSpark needs only the target's
|
|
6
|
-
// final hidden as context (the tap), so the donor-K/V plumbing is gone.
|
|
7
|
-
//
|
|
8
|
-
// Two lossless verify modes — both leave the OUTPUT DISTRIBUTION exactly equal
|
|
9
|
-
// to vanilla e4b decode; the drafter only moves τ (speed), never WHAT is
|
|
10
|
-
// emitted:
|
|
11
|
-
// - GREEDY (temperature 0): accept a draft iff it equals the target's argmax
|
|
12
|
-
// (longest-prefix). Bit-identical to vanilla greedy e4b.
|
|
13
|
-
// - SAMPLING (temperature > 0): the speculative-sampling rule — accept x_k
|
|
14
|
-
// w.p. min(1, p_k(x_k)/q_k(x_k)); on rejection resample from the residual
|
|
15
|
-
// norm(relu(p−q)) and stop; if the whole block is accepted, sample a bonus
|
|
16
|
-
// from p_{γ+1}. p and q use the SAME top-p/top-k/temperature processing
|
|
17
|
-
// (sample.ts), so the emitted stream is distributed exactly as if e4b
|
|
18
|
-
// sampled token-by-token at that temperature — independent of draft quality.
|
|
19
|
-
//
|
|
20
|
-
// Verify the corresponding gate before chasing τ (dspark-ab.ts (deleted 2026-08-23; git history)): greedy
|
|
21
|
-
// output must match model.generate; the sampling rule's correctness is the
|
|
22
|
-
// statistical "emit distribution == target" check in dspark-smoke.ts (deleted 2026-08-23; git history).
|
|
23
|
-
// If a gate fails, the accept/reject or KV rollback is wrong — fix that first.
|
|
24
|
-
|
|
25
|
-
import { MlxArray } from "../../mlx/array";
|
|
26
|
-
import { Dtype } from "../../mlx/ffi";
|
|
27
|
-
import * as ops from "../../mlx/ops";
|
|
28
|
-
import { Gemma4Model } from "../../model/gemma4";
|
|
29
|
-
import type { DSparkDrafter } from "./module";
|
|
30
|
-
import { KeyStream, processLogits, probsOf, probAtToken, sampleToken, sampleResidual, type DSparkSampleConfig } from "./sample";
|
|
31
|
-
|
|
32
|
-
export interface DSparkOptions {
|
|
33
|
-
gamma?: number;
|
|
34
|
-
maxTokens?: number;
|
|
35
|
-
eosTokenIds?: number[];
|
|
36
|
-
/** Sampling config; omit (or temperature 0) ⇒ greedy. */
|
|
37
|
-
sample?: DSparkSampleConfig;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface DSparkStats {
|
|
41
|
-
emitted: number;
|
|
42
|
-
drafted: number;
|
|
43
|
-
accepted: number;
|
|
44
|
-
targetCalls: number;
|
|
45
|
-
decodeMs: number;
|
|
46
|
-
prefillMs: number;
|
|
47
|
-
acceptanceRate: number;
|
|
48
|
-
/** Mean accepted length per verify round (τ), incl. the bonus/correction token. */
|
|
49
|
-
meanAcceptLen: number;
|
|
50
|
-
/** Mean predicted confidence over drafted tokens (diagnostic). */
|
|
51
|
-
meanConf: number;
|
|
52
|
-
decodeTps: number;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface DSparkResult {
|
|
56
|
-
tokens: number[];
|
|
57
|
-
stats: DSparkStats;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Greedy pick from one hidden position [1,1,H]. */
|
|
61
|
-
function pickFromHidden(model: Gemma4Model, hidden: MlxArray, pos: number): number {
|
|
62
|
-
const H = hidden.shape[2]!;
|
|
63
|
-
const hSl = hidden.slice([0, pos, 0], [1, pos + 1, H]);
|
|
64
|
-
const logits = model.logitsFromHidden(hSl);
|
|
65
|
-
hSl.dispose();
|
|
66
|
-
const V = logits.shape[2]!;
|
|
67
|
-
const flat = ops.reshape(logits, [1, V]);
|
|
68
|
-
logits.dispose();
|
|
69
|
-
const am = ops.argmaxAxis(flat, -1);
|
|
70
|
-
flat.dispose();
|
|
71
|
-
const t = ops.itemUint32(am);
|
|
72
|
-
am.dispose();
|
|
73
|
-
return t;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** Batched verify: one lm-head over the γ+1 window, argmax per position. */
|
|
77
|
-
function picksBatched(model: Gemma4Model, hidden: MlxArray, count: number): number[] {
|
|
78
|
-
const logits = model.logitsFromHidden(hidden); // [1, L, V]
|
|
79
|
-
const V = logits.shape[2]!;
|
|
80
|
-
const out: number[] = [];
|
|
81
|
-
for (let k = 0; k < count; k++) {
|
|
82
|
-
const sl = logits.slice([0, k, 0], [1, k + 1, V]);
|
|
83
|
-
const flat = ops.reshape(sl, [1, V]);
|
|
84
|
-
sl.dispose();
|
|
85
|
-
const am = ops.argmaxAxis(flat, -1);
|
|
86
|
-
flat.dispose();
|
|
87
|
-
out.push(ops.itemUint32(am));
|
|
88
|
-
am.dispose();
|
|
89
|
-
}
|
|
90
|
-
logits.dispose();
|
|
91
|
-
return out;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** Result of one verify round: how many leading drafts were accepted, and the
|
|
95
|
-
* correction/bonus token to emit after them. */
|
|
96
|
-
interface RoundVerdict { kAccept: number; emit: number }
|
|
97
|
-
|
|
98
|
-
/** GREEDY verify: longest prefix where draft == target argmax. */
|
|
99
|
-
function verifyGreedy(model: Gemma4Model, vHidden: MlxArray, drafts: number[], gamma: number): RoundVerdict {
|
|
100
|
-
const gt = picksBatched(model, vHidden, gamma + 1);
|
|
101
|
-
let kAccept = 0;
|
|
102
|
-
while (kAccept < gamma && drafts[kAccept] === gt[kAccept]) kAccept++;
|
|
103
|
-
return { kAccept, emit: gt[kAccept]! };
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** SAMPLING verify (speculative sampling): accept x_k w.p. min(1, p/q); on the
|
|
107
|
-
* first rejection resample from norm(relu(p−q)); if all accepted sample a bonus
|
|
108
|
-
* from p_{γ+1}. p,q processed identically (top-p/top-k/temperature). */
|
|
109
|
-
function verifySampling(
|
|
110
|
-
model: Gemma4Model, vHidden: MlxArray, draftLogits: MlxArray, drafts: number[],
|
|
111
|
-
gamma: number, cfg: DSparkSampleConfig, keys: KeyStream,
|
|
112
|
-
): RoundVerdict {
|
|
113
|
-
const V = draftLogits.shape[2]!;
|
|
114
|
-
const targetLogits = model.logitsFromHidden(vHidden); // [1,γ+1,V]
|
|
115
|
-
// γ uniforms for the accept tests, drawn together.
|
|
116
|
-
const uArr = ops.randomUniform([gamma], Dtype.float32, 0, 1, keys.next());
|
|
117
|
-
const us = uArr.toFloat32();
|
|
118
|
-
uArr.dispose();
|
|
119
|
-
|
|
120
|
-
let verdict: RoundVerdict | null = null;
|
|
121
|
-
for (let k = 0; k < gamma; k++) {
|
|
122
|
-
const x = drafts[k]!;
|
|
123
|
-
const tScaled = processLogits(sliceTmp(targetLogits, k, V), cfg);
|
|
124
|
-
const P = probsOf(tScaled);
|
|
125
|
-
const dScaled = processLogits(sliceTmp(draftLogits, k, V), cfg);
|
|
126
|
-
const Q = probsOf(dScaled);
|
|
127
|
-
tScaled.dispose(); dScaled.dispose();
|
|
128
|
-
const pX = probAtToken(P, x);
|
|
129
|
-
const qX = probAtToken(Q, x);
|
|
130
|
-
const accept = us[k]! < Math.min(1, qX > 0 ? pX / qX : 1);
|
|
131
|
-
if (accept) {
|
|
132
|
-
P.dispose(); Q.dispose();
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
// reject at k → resample correction from the residual, stop.
|
|
136
|
-
const corrected = sampleResidual(P, Q, keys.next());
|
|
137
|
-
P.dispose(); Q.dispose();
|
|
138
|
-
verdict = { kAccept: k, emit: corrected };
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
if (!verdict) {
|
|
142
|
-
// all γ accepted → bonus from p_{γ+1}
|
|
143
|
-
const bScaled = processLogits(sliceTmp(targetLogits, gamma, V), cfg);
|
|
144
|
-
const bonus = sampleToken(bScaled, keys.next());
|
|
145
|
-
bScaled.dispose();
|
|
146
|
-
verdict = { kAccept: gamma, emit: bonus };
|
|
147
|
-
}
|
|
148
|
-
targetLogits.dispose();
|
|
149
|
-
return verdict;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/** [1,L,V] → [1,V] at position k (a fresh owned array). */
|
|
153
|
-
function sliceTmp(logits: MlxArray, k: number, V: number): MlxArray {
|
|
154
|
-
const sl = logits.slice([0, k, 0], [1, k + 1, V]);
|
|
155
|
-
const flat = ops.reshape(sl, [1, V]);
|
|
156
|
-
sl.dispose();
|
|
157
|
-
return flat;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function dsparkGenerate(
|
|
161
|
-
model: Gemma4Model,
|
|
162
|
-
drafter: DSparkDrafter,
|
|
163
|
-
promptTokens: number[],
|
|
164
|
-
options: DSparkOptions = {},
|
|
165
|
-
): DSparkResult {
|
|
166
|
-
const gamma = options.gamma ?? drafter.cfg.gamma;
|
|
167
|
-
const { maxTokens = 256, eosTokenIds = model.config.eosTokenIds } = options;
|
|
168
|
-
if (gamma < 1) throw new Error("gamma must be >= 1");
|
|
169
|
-
if (gamma > drafter.cfg.gamma)
|
|
170
|
-
throw new Error(`gamma ${gamma} exceeds drafter max ${drafter.cfg.gamma}`);
|
|
171
|
-
const sampleCfg = options.sample && options.sample.temperature > 0 ? options.sample : null;
|
|
172
|
-
const keys = new KeyStream(options.sample?.seed ?? 0);
|
|
173
|
-
|
|
174
|
-
const caches = model.makeCache();
|
|
175
|
-
const stats: DSparkStats = {
|
|
176
|
-
emitted: 0, drafted: 0, accepted: 0, targetCalls: 0,
|
|
177
|
-
decodeMs: 0, prefillMs: 0, acceptanceRate: 0,
|
|
178
|
-
meanAcceptLen: 0, meanConf: 0, decodeTps: 0,
|
|
179
|
-
};
|
|
180
|
-
const out: number[] = [];
|
|
181
|
-
let confSum = 0;
|
|
182
|
-
let rounds = 0;
|
|
183
|
-
let acceptLenSum = 0;
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
// 1. prefill → first token. For sampling, the first token must also be
|
|
187
|
-
// sampled from the target dist (not argmax) to stay lossless.
|
|
188
|
-
const t0 = performance.now();
|
|
189
|
-
const ids = ops.fromInt32(promptTokens, [1, promptTokens.length]);
|
|
190
|
-
const hidden = model.forwardHidden(ids, caches);
|
|
191
|
-
ids.dispose();
|
|
192
|
-
stats.targetCalls++;
|
|
193
|
-
const H = hidden.shape[2]!;
|
|
194
|
-
const Lp = hidden.shape[1]!;
|
|
195
|
-
let next: number;
|
|
196
|
-
if (sampleCfg) {
|
|
197
|
-
const hSl = hidden.slice([0, Lp - 1, 0], [1, Lp, H]);
|
|
198
|
-
const logits = model.logitsFromHidden(hSl);
|
|
199
|
-
hSl.dispose();
|
|
200
|
-
const flat = ops.reshape(logits, [1, logits.shape[2]!]);
|
|
201
|
-
logits.dispose();
|
|
202
|
-
const scaled = processLogits(flat, sampleCfg);
|
|
203
|
-
flat.dispose();
|
|
204
|
-
next = sampleToken(scaled, keys.next());
|
|
205
|
-
scaled.dispose();
|
|
206
|
-
} else {
|
|
207
|
-
next = pickFromHidden(model, hidden, Lp - 1);
|
|
208
|
-
}
|
|
209
|
-
let lastHidden = hidden.slice([0, Lp - 1, 0], [1, Lp, H]); // [1,1,H]
|
|
210
|
-
hidden.dispose();
|
|
211
|
-
stats.prefillMs = performance.now() - t0;
|
|
212
|
-
|
|
213
|
-
const nextIsEos = eosTokenIds.includes(next);
|
|
214
|
-
if (!nextIsEos) out.push(next);
|
|
215
|
-
stats.emitted++;
|
|
216
|
-
if (nextIsEos) { lastHidden.dispose(); return finalize(stats, out, rounds, acceptLenSum, confSum); }
|
|
217
|
-
|
|
218
|
-
// 2. outer loop
|
|
219
|
-
const tDecode = performance.now();
|
|
220
|
-
outer: while (stats.emitted < maxTokens) {
|
|
221
|
-
// 2a. draft the γ-block: one backbone pass + sequential Markov head
|
|
222
|
-
const hCtx = ops.reshape(lastHidden, [1, H]); // [1,H]
|
|
223
|
-
const block = drafter.forwardInfer(model, hCtx, next, gamma, { sample: sampleCfg ?? undefined, keys });
|
|
224
|
-
hCtx.dispose();
|
|
225
|
-
const drafts = block.tokens;
|
|
226
|
-
stats.drafted += gamma;
|
|
227
|
-
for (const c of block.conf) confSum += c;
|
|
228
|
-
|
|
229
|
-
// 2b. verify all γ drafts (+ the pending token) in one forward
|
|
230
|
-
const vIds = ops.fromInt32([next, ...drafts], [1, gamma + 1]);
|
|
231
|
-
const vHidden = model.forwardHidden(vIds, caches);
|
|
232
|
-
vIds.dispose();
|
|
233
|
-
stats.targetCalls++;
|
|
234
|
-
|
|
235
|
-
// 2c. accept (greedy longest-prefix OR speculative sampling)
|
|
236
|
-
const { kAccept, emit } = sampleCfg
|
|
237
|
-
? verifySampling(model, vHidden, block.draftLogits, drafts, gamma, sampleCfg, keys)
|
|
238
|
-
: verifyGreedy(model, vHidden, drafts, gamma);
|
|
239
|
-
block.draftLogits.dispose();
|
|
240
|
-
stats.accepted += kAccept;
|
|
241
|
-
rounds++;
|
|
242
|
-
acceptLenSum += kAccept + 1; // accepted drafts + bonus/correction token
|
|
243
|
-
|
|
244
|
-
// 2d. emit accepted drafts
|
|
245
|
-
for (let k = 0; k < kAccept; k++) {
|
|
246
|
-
const isEos = eosTokenIds.includes(drafts[k]!);
|
|
247
|
-
if (!isEos) out.push(drafts[k]!);
|
|
248
|
-
stats.emitted++;
|
|
249
|
-
if (isEos || stats.emitted >= maxTokens) { vHidden.dispose(); break outer; }
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// 2e. emit the correction (or bonus when all accepted)
|
|
253
|
-
const emitIsEos = eosTokenIds.includes(emit);
|
|
254
|
-
if (!emitIsEos) out.push(emit);
|
|
255
|
-
stats.emitted++;
|
|
256
|
-
|
|
257
|
-
// 2f. roll back rejected entries. bypass=true: we always trim the last
|
|
258
|
-
// n = gamma - kAccept (≤ γ) tips immediately after the verify concat
|
|
259
|
-
// write, which is the one case where trimming past the sliding window is
|
|
260
|
-
// sound (the newest tokens are intact at the buffer tail). See
|
|
261
|
-
// RotatingKVCache.trim.
|
|
262
|
-
if (kAccept < gamma) {
|
|
263
|
-
const n = gamma - kAccept;
|
|
264
|
-
for (const c of caches) c.trim(n, true);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
if (emitIsEos || stats.emitted >= maxTokens) { vHidden.dispose(); break; }
|
|
268
|
-
|
|
269
|
-
// 2g. chain state
|
|
270
|
-
next = emit;
|
|
271
|
-
lastHidden.dispose();
|
|
272
|
-
lastHidden = vHidden.slice([0, kAccept, 0], [1, kAccept + 1, H]);
|
|
273
|
-
vHidden.dispose();
|
|
274
|
-
}
|
|
275
|
-
stats.decodeMs = performance.now() - tDecode;
|
|
276
|
-
lastHidden.dispose();
|
|
277
|
-
} finally {
|
|
278
|
-
for (const c of caches) c.dispose();
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
return finalize(stats, out, rounds, acceptLenSum, confSum);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function finalize(stats: DSparkStats, out: number[], rounds: number, acceptLenSum: number, confSum: number): DSparkResult {
|
|
285
|
-
stats.acceptanceRate = stats.drafted ? stats.accepted / stats.drafted : 0;
|
|
286
|
-
stats.meanAcceptLen = rounds ? acceptLenSum / rounds : 0;
|
|
287
|
-
stats.meanConf = stats.drafted ? confSum / stats.drafted : 0;
|
|
288
|
-
stats.decodeTps = stats.decodeMs ? ((stats.emitted - 1) / stats.decodeMs) * 1000 : 0;
|
|
289
|
-
return { tokens: out, stats };
|
|
290
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// Central DSpark checkpoint loader — the variant dispatch the modules never
|
|
2
|
-
// had (scripts imported their class directly; the serve path needs one entry
|
|
3
|
-
// point). Reads dspark.json and returns the matching drafter:
|
|
4
|
-
// variant "dspark" — the faithful KV-injection module (canonical)
|
|
5
|
-
// variant "dflash" (legacy) — same module, pre-rename stamp
|
|
6
|
-
// variant absent — a v1 single-vector checkpoint (module.ts,
|
|
7
|
-
// superseded research baseline) — refused for
|
|
8
|
-
// serving with a pointer at the v2 trainer.
|
|
9
|
-
|
|
10
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import { DflashDrafter } from "./module-dflash";
|
|
13
|
-
|
|
14
|
-
export function loadDsparkDrafter(dir: string): DflashDrafter {
|
|
15
|
-
const metaPath = join(dir, "dspark.json");
|
|
16
|
-
if (!existsSync(metaPath)) throw new Error(`no dspark.json in ${dir} — not a DSpark checkpoint`);
|
|
17
|
-
const meta = JSON.parse(readFileSync(metaPath, "utf8")) as { variant?: string };
|
|
18
|
-
if (meta.variant === "dspark" || meta.variant === "dflash") return DflashDrafter.load(dir);
|
|
19
|
-
throw new Error(
|
|
20
|
-
`${dir} is a v1 single-vector DSpark checkpoint (variant=${meta.variant ?? "none"}) — ` +
|
|
21
|
-
`superseded, not serveable; retrain with scripts/dspark.ts train`,
|
|
22
|
-
);
|
|
23
|
-
}
|