mlx-bun 0.4.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 +1453 -88
- 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 +10 -8
- 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 +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- 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 +42 -83
- package/src/server/generated-token-history.ts +57 -0
- 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 +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- 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 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- 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/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- 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 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- 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 -106
- 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/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- 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 -130
- 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 -133
- 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/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- 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 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- 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 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- 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 -452
- 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 -1346
- package/src/grammar.ts +0 -591
- 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 -39
- 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 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- 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-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- 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 -388
- 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 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- 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 -93
- 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 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- 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 -2351
- package/src/model/gemma4.ts +0 -1315
- 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 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- 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 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- 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 -102
- 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 -83
- 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/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- 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 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- 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 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- 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/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 -496
- 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 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- 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/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- 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 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- 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 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- 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 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- 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 -1057
- package/src/web/src/composer.ts +0 -959
- 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/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/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,92 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../mlx/array";
|
|
2
|
-
import * as ops from "../mlx/ops";
|
|
3
|
-
import { materializeCopy } from "../mlx/materialize";
|
|
4
|
-
import { disposeResources, applyStateChanges } from "../engine/resources";
|
|
5
|
-
import type { PreparedStateChange } from "../contracts/resources";
|
|
6
|
-
import type { AssistantRowsTarget, DraftPrefillGroup, DraftRowGroup, DraftRowCheckpoint, GroupedDraftProvider } from "./source";
|
|
7
|
-
import type { GemmaAssistantDrafter } from "./drafter";
|
|
8
|
-
|
|
9
|
-
/** The assistant owns only its last true target hidden and coverage. Donor
|
|
10
|
-
* attention stays with target storage; checkpoints contain no duplicate KV. */
|
|
11
|
-
class AssistantRows implements DraftPrefillGroup, DraftRowGroup {
|
|
12
|
-
readonly prefillMode = "tail-split" as const;
|
|
13
|
-
readonly tapLayers: readonly number[] = [];
|
|
14
|
-
#hidden: MlxArray | null = null;
|
|
15
|
-
#processed: number[] = [];
|
|
16
|
-
constructor(readonly target: AssistantRowsTarget, readonly drafter: GemmaAssistantDrafter,
|
|
17
|
-
readonly namespace: string, checkpoints: readonly (DraftRowCheckpoint | null)[]) { this.append(checkpoints); }
|
|
18
|
-
get rowCount(): number { return this.#processed.length; }
|
|
19
|
-
append(checkpoints: readonly (DraftRowCheckpoint | null)[]): void {
|
|
20
|
-
if (checkpoints.length) applyStateChanges([() => this.prepareAppend(checkpoints)]);
|
|
21
|
-
}
|
|
22
|
-
prepareAppend(checkpoints: readonly (DraftRowCheckpoint | null)[]): PreparedStateChange {
|
|
23
|
-
const processed = [...this.#processed, ...checkpoints.map(checkpoint => checkpoint?.processedTokens ?? 0)];
|
|
24
|
-
const example = this.#hidden ?? checkpoints.find(checkpoint => checkpoint !== null)?.attachment.tensors[0];
|
|
25
|
-
const held: MlxArray[] = []; let hidden: MlxArray | null = null;
|
|
26
|
-
try {
|
|
27
|
-
for (const checkpoint of checkpoints) if (checkpoint && (checkpoint.attachment.schema !== "gemma-assistant-v1" ||
|
|
28
|
-
checkpoint.attachment.metadata.processedTokens !== checkpoint.processedTokens))
|
|
29
|
-
throw new Error("invalid assistant checkpoint alignment");
|
|
30
|
-
if (example) {
|
|
31
|
-
const zero = (rows: number) => { const value = ops.zeros([rows,1,this.target.hiddenSize],example.dtype); held.push(value); return value; };
|
|
32
|
-
hidden = ops.concatAxis([...(this.rowCount ? [this.#hidden ?? zero(this.rowCount)] : []),
|
|
33
|
-
...checkpoints.map(checkpoint => checkpoint?.attachment.tensors[0] ?? zero(1))],0);
|
|
34
|
-
}
|
|
35
|
-
} finally { disposeResources(held); }
|
|
36
|
-
return { commit: () => { const old = this.#hidden; this.#hidden=hidden; hidden=old; this.#processed=processed; },
|
|
37
|
-
dispose: () => { hidden?.dispose(); hidden=null; } };
|
|
38
|
-
}
|
|
39
|
-
filterRows(keep: readonly number[]): void {
|
|
40
|
-
if (!keep.length) { this.dispose(); return; }
|
|
41
|
-
using indices = ops.fromInt32([...keep],[keep.length]);
|
|
42
|
-
const next = this.#hidden && keep.length ? ops.takeAxis(this.#hidden,indices,0) : null;
|
|
43
|
-
this.#hidden?.dispose(); this.#hidden=next; this.#processed=keep.map(row=>this.#processed[row]!);
|
|
44
|
-
}
|
|
45
|
-
prefill(tokens: MlxArray, context?: MlxArray): void {
|
|
46
|
-
const [B,N] = tokens.shape as [number,number];
|
|
47
|
-
using tail = context!.slice([0,N-1,0],[B,N,context!.shape[2]!]);
|
|
48
|
-
const hidden = materializeCopy(tail);
|
|
49
|
-
this.#hidden?.dispose(); this.#hidden=hidden; this.#processed=this.#processed.map(count=>count+N);
|
|
50
|
-
}
|
|
51
|
-
materialize(): void { this.#hidden?.eval(); }
|
|
52
|
-
capture(row: number): DraftRowCheckpoint {
|
|
53
|
-
const processedTokens=this.#processed[row]!;
|
|
54
|
-
const hidden=this.#hidden!.slice([row,0,0],[row+1,1,this.target.hiddenSize]);
|
|
55
|
-
return { processedTokens, attachment: { schema:"gemma-assistant-v1",metadata:{processedTokens},tensors:[hidden] } };
|
|
56
|
-
}
|
|
57
|
-
draft(pending: readonly number[], depth: number, _steps: readonly number[]): number[][] {
|
|
58
|
-
if (!depth) return pending.map(()=>[]);
|
|
59
|
-
const B=pending.length, owned: MlxArray[]=[];
|
|
60
|
-
const donors=this.target.readDonors();
|
|
61
|
-
let ids=ops.fromInt32([...pending],[B,1]), hidden=this.#hidden!;
|
|
62
|
-
const tokens: MlxArray[]=[];
|
|
63
|
-
try {
|
|
64
|
-
for(let step=0;step<depth;step++) {
|
|
65
|
-
using emb=this.target.embed(ids);
|
|
66
|
-
const positions=donors.positions.map(position=>position+step);
|
|
67
|
-
const common=positions.every(position=>position===positions[0]);
|
|
68
|
-
using offsets=common ? null : ops.fromInt32(positions,[B]);
|
|
69
|
-
const next=this.drafter.forwardRows(emb,hidden,donors,offsets ?? positions[0]!);
|
|
70
|
-
owned.push(next.nextHidden); tokens.push(next.tokens); hidden=next.nextHidden;
|
|
71
|
-
ids.dispose(); ids=ops.reshape(next.tokens,[B,1]);
|
|
72
|
-
}
|
|
73
|
-
using packed=ops.concatAxis(tokens,0);
|
|
74
|
-
const values=packed.toIntTokens();
|
|
75
|
-
return pending.map((_,row)=>Array.from({length:depth},(_,step)=>values[step*B+row]!));
|
|
76
|
-
} finally { ids.dispose(); donors.dispose(); disposeResources([...owned,...tokens]); }
|
|
77
|
-
}
|
|
78
|
-
commit(accepted: readonly number[], context: MlxArray): void {
|
|
79
|
-
using indices=ops.fromInt32([...accepted],[accepted.length,1,1]);
|
|
80
|
-
const hidden=ops.takeAlongAxis(context,indices,1);
|
|
81
|
-
this.#hidden?.dispose(); this.#hidden=hidden;
|
|
82
|
-
this.#processed=this.#processed.map((count,row)=>count+accepted[row]!+1);
|
|
83
|
-
}
|
|
84
|
-
dispose(): void { this.#hidden?.dispose(); this.#hidden=null; this.#processed=[]; }
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function assistantGroups(drafter: GemmaAssistantDrafter, namespace: string): GroupedDraftProvider {
|
|
88
|
-
return {
|
|
89
|
-
openPrefill: ({target,checkpoints}) => new AssistantRows(target.assistantRows!,drafter,namespace,checkpoints),
|
|
90
|
-
open: ({target,checkpoints}) => new AssistantRows(target.assistantRows!,drafter,namespace,checkpoints),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import * as ops from "../mlx/ops";
|
|
2
|
-
import { artifactIdentity } from "../model/artifact-identity";
|
|
3
|
-
import { assistantGroups } from "./assistant-rows";
|
|
4
|
-
// AssistantSource — the optiq KV-borrowing Gemma "-assistant" drafter
|
|
5
|
-
// (src/spec/drafter.ts) behind the serve-time DraftSource seam. L2 oracle:
|
|
6
|
-
// optiq spec_generate. This is the SAME drafter the standalone specGenerate
|
|
7
|
-
// loop (src/spec/generate.ts) drives; here it plugs into the shared
|
|
8
|
-
// verify/accept executor (src/spec/serve-loop.ts) so it composes with grammar,
|
|
9
|
-
// logits processors, admission accounting, and stats like any other source.
|
|
10
|
-
//
|
|
11
|
-
// KV-borrowing (why the seam carries a TargetView): the drafter has NO cache
|
|
12
|
-
// of its own — each draft step reads the target's donor K/V (last sliding +
|
|
13
|
-
// last full layer, in chronological order) and, for the block's first step,
|
|
14
|
-
// the target's hidden at the anchor position. Both arrive through the seam:
|
|
15
|
-
// donor views from `target.caches`, the anchor hidden from draft()'s
|
|
16
|
-
// `anchorHidden` argument (borrowed — never disposed here). See
|
|
17
|
-
// [[dspark-seam-kv-borrowing]].
|
|
18
|
-
//
|
|
19
|
-
// Drafting is GREEDY (the drafter's own argmax head), independent of the
|
|
20
|
-
// request sampler — drafts are only proposals; the target's verify (which does
|
|
21
|
-
// honor the sampler) decides every emitted token, so correctness holds at any
|
|
22
|
-
// temperature and only the acceptance RATE moves. Matches specGenerate.
|
|
23
|
-
|
|
24
|
-
import { readdirSync, statSync } from "node:fs";
|
|
25
|
-
import { join } from "node:path";
|
|
26
|
-
import type { MlxArray } from "../mlx/array";
|
|
27
|
-
import { GemmaAssistantDrafter } from "./drafter";
|
|
28
|
-
import type { DraftProvider, DraftSource, TargetView, AssistantRowsTarget } from "./source";
|
|
29
|
-
|
|
30
|
-
/** Sum of the drafter's on-disk safetensors — admission accounting only. */
|
|
31
|
-
function safetensorsBytes(dir: string): number {
|
|
32
|
-
let total = 0;
|
|
33
|
-
for (const f of readdirSync(dir))
|
|
34
|
-
if (f.endsWith(".safetensors")) total += statSync(join(dir, f)).size;
|
|
35
|
-
return total;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export class AssistantProvider implements DraftProvider {
|
|
39
|
-
readonly id: string;
|
|
40
|
-
readonly weightsBytes: number;
|
|
41
|
-
readonly grouped: import("./source").GroupedDraftProvider;
|
|
42
|
-
|
|
43
|
-
private constructor(
|
|
44
|
-
private readonly drafter: GemmaAssistantDrafter,
|
|
45
|
-
id: string,
|
|
46
|
-
weightsBytes: number, namespace: string,
|
|
47
|
-
) {
|
|
48
|
-
this.id = id;
|
|
49
|
-
this.weightsBytes = weightsBytes;
|
|
50
|
-
this.grouped = assistantGroups(drafter,namespace);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
static async load(modelDir: string): Promise<AssistantProvider> {
|
|
54
|
-
const drafter = await GemmaAssistantDrafter.load(modelDir);
|
|
55
|
-
const id = modelDir.split("/").filter(Boolean).at(-1)!;
|
|
56
|
-
try {
|
|
57
|
-
const identity = await artifactIdentity(await Bun.file(`${modelDir}/config.json`).text(),
|
|
58
|
-
readdirSync(modelDir).filter(file => file.endsWith(".safetensors"))
|
|
59
|
-
.map(name => ({ name, path: join(modelDir, name) })));
|
|
60
|
-
return new AssistantProvider(drafter, id, safetensorsBytes(modelDir), `gemma-assistant-v1:${identity}`);
|
|
61
|
-
} catch (error) { drafter.dispose(); throw error; }
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
open(opts: Parameters<DraftProvider["open"]>[0]): DraftSource {
|
|
65
|
-
return new AssistantSource(this.drafter, opts.target);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
dispose(): void {
|
|
69
|
-
this.drafter.dispose();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export class AssistantSource implements DraftSource {
|
|
74
|
-
readonly weightsBytes = 0; // provider-owned weights; per-request adds nothing
|
|
75
|
-
private readonly target: AssistantRowsTarget;
|
|
76
|
-
|
|
77
|
-
constructor(private readonly drafter: Pick<GemmaAssistantDrafter, "forwardRows">, target: TargetView) {
|
|
78
|
-
if (!target.assistantRows)
|
|
79
|
-
throw new Error("assistant drafter requires a Gemma4 target with donor views");
|
|
80
|
-
this.target = target.assistantRows;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** No own cache to prime — the drafter reads the target's live state. */
|
|
84
|
-
prefill(_promptIds: number[], _ctxML?: MlxArray): void {}
|
|
85
|
-
|
|
86
|
-
/** Draft n tokens against the target's donor K/V, conditioning the first
|
|
87
|
-
* step on the anchor (the last emitted token + its target hidden) and
|
|
88
|
-
* chaining the drafter's own post-projected hiddens after that — exactly
|
|
89
|
-
* specGenerate's 2a block. anchorHidden is borrowed; never disposed here. */
|
|
90
|
-
draft(feed: number[], n: number, _stepBase: number, anchorHidden?: MlxArray): number[] {
|
|
91
|
-
if (!anchorHidden) throw new Error("assistant drafter needs the target anchor hidden");
|
|
92
|
-
const shared = this.target.readDonors();
|
|
93
|
-
const position = shared.positions[0]!;
|
|
94
|
-
const drafts: number[] = [];
|
|
95
|
-
const ownedHiddens: MlxArray[] = [];
|
|
96
|
-
let dTok = feed[feed.length - 1]!; // the pending token (anchorHidden's token)
|
|
97
|
-
let dHid = anchorHidden; // borrowed for k=0
|
|
98
|
-
let emb: MlxArray | null = null; // hoisted so a mid-loop throw still frees it
|
|
99
|
-
try {
|
|
100
|
-
for (let k = 0; k < n; k++) {
|
|
101
|
-
using ids = ops.fromInt32([dTok], [1, 1]);
|
|
102
|
-
emb = this.target.embed(ids);
|
|
103
|
-
const step = this.drafter.forwardRows(emb, dHid, shared, position + k);
|
|
104
|
-
ownedHiddens.push(step.nextHidden);
|
|
105
|
-
let token: number;
|
|
106
|
-
try { token = ops.itemUint32(step.tokens); } finally { step.tokens.dispose(); }
|
|
107
|
-
emb.dispose();
|
|
108
|
-
emb = null;
|
|
109
|
-
drafts.push(token);
|
|
110
|
-
dTok = token;
|
|
111
|
-
dHid = step.nextHidden;
|
|
112
|
-
}
|
|
113
|
-
} finally {
|
|
114
|
-
emb?.dispose();
|
|
115
|
-
for (const a of ownedHiddens) a.dispose();
|
|
116
|
-
shared.dispose();
|
|
117
|
-
}
|
|
118
|
-
return drafts;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/** The serve loop already trims the target caches on rejection; the drafter
|
|
122
|
-
* borrows them, so it has nothing of its own to roll back. */
|
|
123
|
-
commit(_n: number, _kAccept: number, _vCtxML?: MlxArray): void {}
|
|
124
|
-
|
|
125
|
-
dispose(): void {}
|
|
126
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { GenerateOptions } from "../generate";
|
|
2
|
-
|
|
3
|
-
/** Snapshot numerical configuration when the request is bound. Caller-owned
|
|
4
|
-
* arrays must not change the graph or persistence identity after grouping. */
|
|
5
|
-
export function captureSpeculativeOptions(options: GenerateOptions): GenerateOptions {
|
|
6
|
-
return { ...options,
|
|
7
|
-
...(options.kvConfig ? { kvConfig: options.kvConfig.map(({ layerIdx, bits, groupSize }) =>
|
|
8
|
-
({ layerIdx, bits, groupSize })).sort((a, b) => a.layerIdx - b.layerIdx) } : {}),
|
|
9
|
-
...(options.turboQuant ? { turboQuant: { ...options.turboQuant } } : {}),
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** Existing namespaces remain byte-identical when no per-layer scheme is
|
|
14
|
-
* supplied. Execution and persistence consume the same captured settings. */
|
|
15
|
-
export function speculativePrefixNamespace(method: string | undefined, adapters: string | string[],
|
|
16
|
-
options: GenerateOptions): string {
|
|
17
|
-
return JSON.stringify({ method, adapters, kvBits: options.kvBits ?? null,
|
|
18
|
-
kvGroupSize: options.kvGroupSize ?? 64, quantizedKvStart: options.quantizedKvStart ?? null,
|
|
19
|
-
turboQuant: options.turboQuant ?? null,
|
|
20
|
-
...(options.kvConfig?.length ? { kvConfig: options.kvConfig } : {}),
|
|
21
|
-
});
|
|
22
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { projectedDraftGroups } from "./projected-draft-rows";
|
|
2
|
-
import type { GroupedDraftProvider, TargetView } from "./source";
|
|
3
|
-
import type { DeepspecDrafter } from "./dspark/deepspec-module";
|
|
4
|
-
|
|
5
|
-
/** Existing pairing requirements are checked once when the provider opens. */
|
|
6
|
-
export function bindDeepspecTarget(target: TargetView, drafter: Pick<DeepspecDrafter, "cfg">): void {
|
|
7
|
-
if (!target.gemmaTaps) throw new Error("DeepSpec drafter requires a Gemma4 target");
|
|
8
|
-
const layers = drafter.cfg.num_target_layers;
|
|
9
|
-
if (target.gemmaTaps.layerCount !== layers) throw new Error(
|
|
10
|
-
`DeepSpec drafter was trained for a ${layers}-layer target; ` +
|
|
11
|
-
`this model has ${target.gemmaTaps.layerCount} layers — wrong (target, drafter) pairing`);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function deepspecGroups(drafter: DeepspecDrafter, namespace: string): GroupedDraftProvider {
|
|
15
|
-
return projectedDraftGroups(target => {
|
|
16
|
-
bindDeepspecTarget(target, drafter);
|
|
17
|
-
return {
|
|
18
|
-
namespace, schema: "deepspec-context-v1",
|
|
19
|
-
layers: drafter.cfg.num_hidden_layers, tapLayers: drafter.tapLayers,
|
|
20
|
-
project(hidden, positions) {
|
|
21
|
-
using projected = drafter.projectContext(hidden);
|
|
22
|
-
return drafter.projectContextKVRows(projected, positions);
|
|
23
|
-
},
|
|
24
|
-
draft(context, pending, positions, depth) {
|
|
25
|
-
return drafter.draftRows(context, pending, positions).tokens.map(row => row.slice(0, depth));
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
// DeepspecSource — DeepSeek's released DSpark drafter checkpoints
|
|
2
|
-
// (Gemma4DSparkModel, e.g. deepseek-ai/dspark_gemma4_12b_block7) behind the
|
|
3
|
-
// serve-time DraftSource seam. The reference implementation is DeepSpec
|
|
4
|
-
// (github.com/deepseek-ai/DeepSpec, MIT); the module port with transcription
|
|
5
|
-
// notes lives in src/spec/dspark/deepspec-module.ts. Oracle: DeepSpec's eval
|
|
6
|
-
// at temperature 0 (RNG-free — verify degenerates to argmax token-match),
|
|
7
|
-
// scripts/oracle/oracle-dspark-deepspec.py → dspark-deepspec-compare.ts (deleted 2026-08-23; git history).
|
|
8
|
-
//
|
|
9
|
-
// Seam mapping (why this fits without serve-loop changes): the reference
|
|
10
|
-
// recycles target hidden states from each verify pass into the drafter's
|
|
11
|
-
// growing context — exactly the tapped ctxML/vCtxML flow the seam carries:
|
|
12
|
-
// prefill(ids, ctxML) → project the prompt's tapped hiddens into the
|
|
13
|
-
// per-layer context K/V cache (their DynamicCache
|
|
14
|
-
// of PROJECTED context rows, positions 0..Lp-1);
|
|
15
|
-
// draft(feed, n) → one block forward vs the cache (anchor = feed
|
|
16
|
-
// tail at position ctxLen); confidence truncation
|
|
17
|
-
// may return 0..n tokens (ℓ=0 = plain step);
|
|
18
|
-
// commit(d, kAccept, vCtxML)→ project + append ONLY the accepted rows
|
|
19
|
-
// [anchor + kAccept drafts] (their crop()
|
|
20
|
-
// semantics: rejected rows never enter the
|
|
21
|
-
// cache), positions ctxLen..ctxLen+kAccept.
|
|
22
|
-
// Context rows are cached post-norm-post-rope — bit-equivalent to their
|
|
23
|
-
// in-round concat (per-row RMSNorm/RoPE; argued in projectContextKV's doc).
|
|
24
|
-
|
|
25
|
-
import { artifactIdentity } from "../model/artifact-identity";
|
|
26
|
-
import { deepspecGroups, bindDeepspecTarget } from "./deepspec-rows";
|
|
27
|
-
import { readdirSync, statSync } from "node:fs";
|
|
28
|
-
import { join } from "node:path";
|
|
29
|
-
import type { MlxArray } from "../mlx/array";
|
|
30
|
-
import * as ops from "../mlx/ops";
|
|
31
|
-
import { DeepspecDrafter, type ContextKV } from "./dspark/deepspec-module";
|
|
32
|
-
import type { DraftProvider, DraftSource, TargetView } from "./source";
|
|
33
|
-
|
|
34
|
-
function safetensorsBytes(dir: string): number {
|
|
35
|
-
let total = 0;
|
|
36
|
-
for (const f of readdirSync(dir))
|
|
37
|
-
if (f.endsWith(".safetensors")) total += statSync(join(dir, f)).size;
|
|
38
|
-
return total;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export class DeepspecProvider implements DraftProvider {
|
|
42
|
-
readonly id: string;
|
|
43
|
-
readonly weightsBytes: number;
|
|
44
|
-
readonly grouped: import("./source").GroupedDraftProvider;
|
|
45
|
-
/** Trained block width (config block_size, e.g. 7) — the server pins
|
|
46
|
-
* numDraftTokens to this. */
|
|
47
|
-
readonly gamma: number;
|
|
48
|
-
|
|
49
|
-
private constructor(private readonly drafter: DeepspecDrafter, id: string, weightsBytes: number, namespace: string) {
|
|
50
|
-
this.id = id;
|
|
51
|
-
this.weightsBytes = weightsBytes;
|
|
52
|
-
this.gamma = drafter.gamma;
|
|
53
|
-
this.grouped = deepspecGroups(drafter, namespace);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
static async load(modelDir: string): Promise<DeepspecProvider> {
|
|
57
|
-
const drafter = await DeepspecDrafter.load(modelDir);
|
|
58
|
-
const id = modelDir.split("/").filter(Boolean).at(-1)!;
|
|
59
|
-
try {
|
|
60
|
-
const identity = await artifactIdentity(await Bun.file(`${modelDir}/config.json`).text(),
|
|
61
|
-
readdirSync(modelDir).filter(file => file.endsWith(".safetensors"))
|
|
62
|
-
.map(name => ({ name, path: join(modelDir, name) })));
|
|
63
|
-
return new DeepspecProvider(drafter, id, safetensorsBytes(modelDir), `deepspec-context-v1:${identity}`);
|
|
64
|
-
} catch (error) { drafter.dispose(); throw error; }
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
open(opts: Parameters<DraftProvider["open"]>[0]): DraftSource {
|
|
68
|
-
return new DeepspecSource(this.drafter, opts.target);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
dispose(): void {
|
|
72
|
-
this.drafter.dispose(); // owned MlxArrays (transpose views + mmap'd weights)
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export class DeepspecSource implements DraftSource {
|
|
77
|
-
readonly weightsBytes = 0; // provider-owned weights
|
|
78
|
-
readonly tapLayers: number[];
|
|
79
|
-
private ctxKV: ContextKV[] | null = null; // per-layer projected context rows
|
|
80
|
-
private ctxLen = 0; // context rows cached == the anchor's absolute position
|
|
81
|
-
|
|
82
|
-
constructor(private readonly drafter: Pick<DeepspecDrafter,
|
|
83
|
-
"cfg" | "tapLayers" | "projectContext" | "projectContextKV" | "draftBlock">, target: TargetView) {
|
|
84
|
-
bindDeepspecTarget(target, drafter);
|
|
85
|
-
this.tapLayers = drafter.tapLayers;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** Project the prompt's tapped hiddens into the context cache (ownership of
|
|
89
|
-
* ctxML transfers here). */
|
|
90
|
-
prefill(promptIds: number[], ctxML?: MlxArray): void {
|
|
91
|
-
if (!ctxML) throw new Error("DeepSpec drafter: prefill missing tapped context");
|
|
92
|
-
const Lp = ctxML.shape[1]!;
|
|
93
|
-
const projected = this.drafter.projectContext(ctxML);
|
|
94
|
-
ctxML.dispose();
|
|
95
|
-
const positions = Array.from({ length: Lp }, (_, i) => i);
|
|
96
|
-
this.ctxKV = this.drafter.projectContextKV(projected, positions);
|
|
97
|
-
projected.dispose();
|
|
98
|
-
this.ctxLen = Lp;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** One block forward against the cached context. Confidence truncation may
|
|
102
|
-
* return 0..n tokens (0 = skip drafting; the serve loop runs a plain
|
|
103
|
-
* tapped step and commit still grows the context by the anchor row). */
|
|
104
|
-
draft(feed: number[], n: number, _stepBase: number, _anchorHidden?: MlxArray): number[] {
|
|
105
|
-
if (!this.ctxKV) throw new Error("DeepSpec drafter: draft before prefill");
|
|
106
|
-
const anchorTok = feed[feed.length - 1]!;
|
|
107
|
-
const block = this.drafter.draftBlock(this.ctxKV, anchorTok, this.ctxLen);
|
|
108
|
-
block.baseLogits.dispose(); // serve loop runs its own verify lm-head
|
|
109
|
-
// n < gamma near maxTokens: the block always drafts full γ; hand back
|
|
110
|
-
// only what the round may verify.
|
|
111
|
-
return block.tokens.length > n ? block.tokens.slice(0, n) : block.tokens;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/** Grow the context cache by the ACCEPTED rows of the verify window —
|
|
115
|
-
* [anchor + kAccept drafts] from vCtxML [1,d+1,m*H] (ownership transfers
|
|
116
|
-
* here); rejected rows never enter (reference crop() semantics). */
|
|
117
|
-
commit(_d: number, kAccept: number, vCtxML?: MlxArray): void {
|
|
118
|
-
if (!vCtxML) throw new Error("DeepSpec drafter: commit missing tapped verify context");
|
|
119
|
-
if (!this.ctxKV) throw new Error("DeepSpec drafter: commit before prefill");
|
|
120
|
-
const mH = vCtxML.shape[2]!;
|
|
121
|
-
const keep = kAccept + 1; // anchor + accepted drafts
|
|
122
|
-
const rows = vCtxML.slice([0, 0, 0], [1, keep, mH]);
|
|
123
|
-
vCtxML.dispose();
|
|
124
|
-
const projected = this.drafter.projectContext(rows);
|
|
125
|
-
rows.dispose();
|
|
126
|
-
const positions = Array.from({ length: keep }, (_, i) => this.ctxLen + i);
|
|
127
|
-
const newKV = this.drafter.projectContextKV(projected, positions);
|
|
128
|
-
projected.dispose();
|
|
129
|
-
for (let i = 0; i < this.ctxKV.length; i++) {
|
|
130
|
-
const old = this.ctxKV[i]!;
|
|
131
|
-
const add = newKV[i]!;
|
|
132
|
-
const k = ops.concatAxis([old.k, add.k], 2);
|
|
133
|
-
const v = ops.concatAxis([old.v, add.v], 2);
|
|
134
|
-
old.k.dispose(); old.v.dispose();
|
|
135
|
-
add.k.dispose(); add.v.dispose();
|
|
136
|
-
this.ctxKV[i] = { k, v };
|
|
137
|
-
}
|
|
138
|
-
this.ctxLen += keep;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
dispose(): void {
|
|
142
|
-
if (this.ctxKV) for (const { k, v } of this.ctxKV) { k.dispose(); v.dispose(); }
|
|
143
|
-
this.ctxKV = null;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
// DflashSource — DSpark (faithful DFlash + Markov + confidence,
|
|
2
|
-
// src/spec/dspark/module-dflash.ts) behind the serve-time DraftSource seam.
|
|
3
|
-
// L3 (KL/quality-gated). The DRAFT half of the standalone dflashGenerate loop
|
|
4
|
-
// (src/spec/dspark/generate-dflash.ts) plugged into the shared verify/accept
|
|
5
|
-
// executor (src/spec/serve-loop.ts).
|
|
6
|
-
//
|
|
7
|
-
// H_ctx (why the seam taps): DSpark drafts by attending to a GROWING
|
|
8
|
-
// multi-layer context — the target's tapped hiddens over the accepted stream
|
|
9
|
-
// (paper Eq 2-3). The seam declares `tapLayers`, so the serve loop taps the
|
|
10
|
-
// target's prefill (→ seeds H_ctx here) and every verify forward (→ grown in
|
|
11
|
-
// commit by the accepted window; rejected tips are never appended, mirroring
|
|
12
|
-
// the target-cache trim). See [[dspark-seam-kv-borrowing]].
|
|
13
|
-
//
|
|
14
|
-
// v1 acceptance: the serve loop verifies with TOKEN-MATCH acceptance
|
|
15
|
-
// (mlx-lm/optiq style — lossless at any temperature), NOT the paper's
|
|
16
|
-
// distribution-level rejection-sampling verify. Greedy is identical; temp>0 is
|
|
17
|
-
// still lossless but lower-acceptance. Drafting here is greedy (proposals; the
|
|
18
|
-
// target verify decides). The richer rejection-sampling verify stays in the
|
|
19
|
-
// standalone dflashGenerate for the measure script.
|
|
20
|
-
|
|
21
|
-
import { artifactIdentity } from "../model/artifact-identity";
|
|
22
|
-
import { projectedDraftGroups } from "./projected-draft-rows";
|
|
23
|
-
import { readdirSync, statSync } from "node:fs";
|
|
24
|
-
import { join } from "node:path";
|
|
25
|
-
import type { MlxArray } from "../mlx/array";
|
|
26
|
-
import * as ops from "../mlx/ops";
|
|
27
|
-
import type { DflashDrafter } from "./dspark/module-dflash";
|
|
28
|
-
import { loadDsparkDrafter } from "./dspark/loader";
|
|
29
|
-
import type { DraftProvider, DraftSource, TargetView, DraftProjection } from "./source";
|
|
30
|
-
import { runtimeValue } from "../runtime-config";
|
|
31
|
-
|
|
32
|
-
function safetensorsBytes(dir: string): number {
|
|
33
|
-
let total = 0;
|
|
34
|
-
for (const f of readdirSync(dir))
|
|
35
|
-
if (f.endsWith(".safetensors")) total += statSync(join(dir, f)).size;
|
|
36
|
-
return total;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export class DflashProvider implements DraftProvider {
|
|
40
|
-
readonly id: string;
|
|
41
|
-
readonly weightsBytes: number;
|
|
42
|
-
readonly grouped: import("./source").GroupedDraftProvider;
|
|
43
|
-
/** The trained block width — the server pins numDraftTokens to this so the
|
|
44
|
-
* serve loop never asks for more positions than the block was trained for. */
|
|
45
|
-
readonly gamma: number;
|
|
46
|
-
|
|
47
|
-
private constructor(private readonly drafter: DflashDrafter, id: string, weightsBytes: number, namespace: string) {
|
|
48
|
-
this.id = id;
|
|
49
|
-
this.weightsBytes = weightsBytes;
|
|
50
|
-
this.gamma = drafter.cfg.gamma;
|
|
51
|
-
this.grouped = projectedDraftGroups(target => {
|
|
52
|
-
if (!target.gemmaTaps) throw new Error("DSpark drafter requires a Gemma4 target");
|
|
53
|
-
const projection = target.gemmaTaps.projection;
|
|
54
|
-
const minConf = runtimeValue("MLX_BUN_DSPARK_MINCONF");
|
|
55
|
-
return {
|
|
56
|
-
namespace, schema: "dflash-context-v1",
|
|
57
|
-
layers: drafter.cfg.nLayers, tapLayers: drafter.cfg.tapLayers,
|
|
58
|
-
project: hidden => drafter.projectContextRows(hidden),
|
|
59
|
-
draft(context, pending, _positions, depth) {
|
|
60
|
-
return drafter.forwardRows(projection, null, pending, depth, {
|
|
61
|
-
collectLogits: false, collectConfidence: false,
|
|
62
|
-
thresholds: drafter.cfg.sts?.thresholds,
|
|
63
|
-
...(minConf ? { minConf: Number(minConf) } : {}),
|
|
64
|
-
}, context).tokens;
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
static async load(modelDir: string): Promise<DflashProvider> {
|
|
71
|
-
const drafter = loadDsparkDrafter(modelDir); // variant dispatch (dspark|legacy dflash)
|
|
72
|
-
const id = modelDir.split("/").filter(Boolean).at(-1)!;
|
|
73
|
-
try {
|
|
74
|
-
const identity = await artifactIdentity(await Bun.file(`${modelDir}/dspark.json`).text(),
|
|
75
|
-
readdirSync(modelDir).filter(file => file.endsWith(".safetensors"))
|
|
76
|
-
.map(name => ({ name, path: join(modelDir, name) })));
|
|
77
|
-
return new DflashProvider(drafter, id, safetensorsBytes(modelDir), `dflash-context-v1:${identity}`);
|
|
78
|
-
} catch (error) { drafter.dispose(); throw error; }
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
open(opts: Parameters<DraftProvider["open"]>[0]): DraftSource {
|
|
82
|
-
return new DflashSource(this.drafter, opts.target);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
dispose(): void {
|
|
86
|
-
// Provider-owned weights are released when the mounted draft is closed.
|
|
87
|
-
this.drafter.dispose();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export class DflashSource implements DraftSource {
|
|
92
|
-
readonly weightsBytes = 0; // provider-owned weights
|
|
93
|
-
readonly tapLayers: number[];
|
|
94
|
-
private readonly model: DraftProjection;
|
|
95
|
-
private readonly minConf = runtimeValue("MLX_BUN_DSPARK_MINCONF");
|
|
96
|
-
private hCtx: MlxArray | null = null; // [1, L, m*H] — grows with the accepted stream
|
|
97
|
-
|
|
98
|
-
constructor(private readonly drafter: Pick<DflashDrafter, "cfg" | "forwardInfer">, target: TargetView) {
|
|
99
|
-
if (!target.gemmaTaps)
|
|
100
|
-
throw new Error("DSpark drafter requires a Gemma4 target");
|
|
101
|
-
this.model = target.gemmaTaps.projection;
|
|
102
|
-
this.tapLayers = drafter.cfg.tapLayers;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** Seed H_ctx from the tapped prompt context (ownership transfers here). */
|
|
106
|
-
prefill(_promptIds: number[], ctxML?: MlxArray): void {
|
|
107
|
-
if (!ctxML) throw new Error("DSpark drafter: prefill missing tapped context");
|
|
108
|
-
this.hCtx = ctxML;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** Draft up to n tokens against the current H_ctx, conditioned on the anchor
|
|
112
|
-
* token (the last emitted token = feed's tail). Greedy — the target verify
|
|
113
|
-
* decides. anchorHidden is unused (DSpark reads H_ctx, not the target
|
|
114
|
-
* hidden). Confidence-scheduled pruning (Alg 1) may return FEWER than n:
|
|
115
|
-
* active when the checkpoint carries STS thresholds (cfg.sts, §3.2.1) or
|
|
116
|
-
* via the MLX_BUN_DSPARK_MINCONF env override; uncalibrated checkpoints
|
|
117
|
-
* draft fixed-length exactly as before. The server pins n ≤ cfg.gamma. */
|
|
118
|
-
draft(feed: number[], n: number, _stepBase: number, _anchorHidden?: MlxArray): number[] {
|
|
119
|
-
if (!this.hCtx) throw new Error("DSpark drafter: draft before prefill");
|
|
120
|
-
const anchorTok = feed[feed.length - 1]!;
|
|
121
|
-
const envMin = this.minConf;
|
|
122
|
-
const block = this.drafter.forwardInfer(this.model, this.hCtx, anchorTok, n, {
|
|
123
|
-
thresholds: this.drafter.cfg.sts?.thresholds,
|
|
124
|
-
collectLogits: false, // serve loop runs its own verify lm-head, never reads this
|
|
125
|
-
...(envMin ? { minConf: Number(envMin) } : {}),
|
|
126
|
-
});
|
|
127
|
-
return block.tokens;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** Grow H_ctx by the accepted window [anchor + kAccept drafts] from the
|
|
131
|
-
* verified positions' tapped context [1,d+1,m*H]; drop the rejected tips
|
|
132
|
-
* (ownership of vCtxML transfers here). */
|
|
133
|
-
commit(_d: number, kAccept: number, vCtxML?: MlxArray): void {
|
|
134
|
-
if (!vCtxML) throw new Error("DSpark drafter: commit missing tapped verify context");
|
|
135
|
-
if (!this.hCtx) throw new Error("DSpark drafter: commit before prefill");
|
|
136
|
-
const mH = vCtxML.shape[2]!;
|
|
137
|
-
const add = vCtxML.slice([0, 0, 0], [1, kAccept + 1, mH]); // anchor + accepted
|
|
138
|
-
const grown = ops.concatAxis([this.hCtx, add], 1);
|
|
139
|
-
this.hCtx.dispose();
|
|
140
|
-
add.dispose();
|
|
141
|
-
vCtxML.dispose();
|
|
142
|
-
this.hCtx = grown;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
dispose(): void {
|
|
146
|
-
this.hCtx?.dispose();
|
|
147
|
-
this.hCtx = null;
|
|
148
|
-
}
|
|
149
|
-
}
|