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,92 +0,0 @@
|
|
|
1
|
-
import type { SpeculativeTransaction } from "../../inference/rollback";
|
|
2
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
3
|
-
|
|
4
|
-
interface TransactionLayer<Acceptance> {
|
|
5
|
-
fits(drafts: number): boolean;
|
|
6
|
-
begin(drafts: number): void;
|
|
7
|
-
resolve(accepted: Acceptance, drafts: number): void;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** State storage that can retain a different verified prefix for each row.
|
|
11
|
-
* Both attention and recurrent layouts implement this same transaction. */
|
|
12
|
-
export interface RowSpeculativeState {
|
|
13
|
-
specRoundBegin(): void;
|
|
14
|
-
specRoundCommit(): void;
|
|
15
|
-
specRoundRollback(keep: number | readonly number[]): void;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function bindRowCacheRollback(
|
|
19
|
-
caches: readonly RowSpeculativeState[], rows: number,
|
|
20
|
-
): SpeculativeTransaction<readonly number[]> {
|
|
21
|
-
return bindTransaction(caches.map(cache => ({
|
|
22
|
-
fits: () => true,
|
|
23
|
-
// A zero-candidate round consumes only the committed pending token.
|
|
24
|
-
// It cannot reject any input, so retaining rollback state is unnecessary.
|
|
25
|
-
begin: drafts => { if (drafts > 0) cache.specRoundBegin(); },
|
|
26
|
-
resolve(accepted: readonly number[], drafts: number) {
|
|
27
|
-
if (drafts === 0) return;
|
|
28
|
-
if (accepted.every(count => count === drafts)) cache.specRoundCommit();
|
|
29
|
-
else cache.specRoundRollback(accepted.every(count => count === accepted[0])
|
|
30
|
-
? accepted[0]! + 1 : accepted.map(count => count + 1));
|
|
31
|
-
},
|
|
32
|
-
})), (accepted, drafts) => accepted.length === rows &&
|
|
33
|
-
accepted.every(count => Number.isSafeInteger(count) && count >= 0 && count <= drafts));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** Bind the recurrent transaction or the trim implementation once.
|
|
37
|
-
* Ring-capacity checks still happen at each safe boundary before any writes. */
|
|
38
|
-
export function bindCacheRollback(caches: readonly Cache[]): SpeculativeTransaction {
|
|
39
|
-
const layers = caches.map((cache) => {
|
|
40
|
-
const { specRoundBegin: begin, specRoundCommit: commit, specRoundRollback: rollback } = cache;
|
|
41
|
-
const hasRound = [begin, commit, rollback].some((method) => method !== undefined);
|
|
42
|
-
if (hasRound && !(typeof begin === "function" && typeof commit === "function" && typeof rollback === "function"))
|
|
43
|
-
throw new Error("cache exposes an incomplete speculative transaction");
|
|
44
|
-
return {
|
|
45
|
-
fits(drafts: number) {
|
|
46
|
-
if ("maxSize" in cache && typeof cache.maxSize === "number")
|
|
47
|
-
return cache.offset + drafts + 1 < cache.maxSize;
|
|
48
|
-
return hasRound || cache.isTrimmable();
|
|
49
|
-
},
|
|
50
|
-
begin: () => begin?.call(cache),
|
|
51
|
-
resolve(accepted: number, drafts: number) {
|
|
52
|
-
if (accepted < drafts) {
|
|
53
|
-
if (rollback) rollback.call(cache, accepted + 1);
|
|
54
|
-
else cache.trim(drafts - accepted);
|
|
55
|
-
} else commit?.call(cache);
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
});
|
|
59
|
-
return bindTransaction(layers, (accepted, drafts) =>
|
|
60
|
-
Number.isSafeInteger(accepted) && accepted >= 0 && accepted <= drafts);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** One transaction lifecycle for scalar and row-wise state bindings. */
|
|
64
|
-
function bindTransaction<Acceptance>(
|
|
65
|
-
layers: readonly TransactionLayer<Acceptance>[],
|
|
66
|
-
accepts: (accepted: Acceptance, drafts: number) => boolean,
|
|
67
|
-
): SpeculativeTransaction<Acceptance> {
|
|
68
|
-
let active: number | undefined;
|
|
69
|
-
let invalid = false;
|
|
70
|
-
const validate = (drafts: number) => {
|
|
71
|
-
if (invalid) throw new Error("speculative state is invalid and must be discarded");
|
|
72
|
-
if (!Number.isSafeInteger(drafts) || drafts < 0) throw new Error("invalid speculative draft count");
|
|
73
|
-
};
|
|
74
|
-
return {
|
|
75
|
-
canBegin(drafts) { validate(drafts); return active === undefined && layers.every((layer) => layer.fits(drafts)); },
|
|
76
|
-
begin(drafts) {
|
|
77
|
-
validate(drafts);
|
|
78
|
-
if (active !== undefined || !layers.every((layer) => layer.fits(drafts)))
|
|
79
|
-
throw new Error("speculative state cannot begin this round");
|
|
80
|
-
active = drafts;
|
|
81
|
-
try { for (const layer of layers) layer.begin(drafts); }
|
|
82
|
-
catch (error) { invalid = true; throw error; }
|
|
83
|
-
},
|
|
84
|
-
resolve(accepted) {
|
|
85
|
-
if (invalid) throw new Error("speculative state is invalid and must be discarded");
|
|
86
|
-
if (active === undefined || !accepts(accepted, active)) throw new Error("invalid speculative acceptance count");
|
|
87
|
-
try { for (const layer of layers) layer.resolve(accepted, active); }
|
|
88
|
-
catch (error) { invalid = true; throw error; }
|
|
89
|
-
active = undefined;
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../../mlx/array";
|
|
2
|
-
import * as ops from "../../mlx/ops";
|
|
3
|
-
import type { TokenLogprobs } from "../../contracts/generation";
|
|
4
|
-
import { readStepExtras, stepExtrasArrays, disposeStepExtras,
|
|
5
|
-
type DeviceStepSampler, type StepExtras } from "../../sampler";
|
|
6
|
-
import { disposeResources, cleanupFailure } from "../../engine/resources";
|
|
7
|
-
|
|
8
|
-
type TokenSink = (token: number, logprobs?: TokenLogprobs) => void | boolean | Promise<void | boolean>;
|
|
9
|
-
|
|
10
|
-
/** Request-owned sampling and output metadata. Execution groups receive token
|
|
11
|
-
* tensors and an output callback; they need no logprob or retention policy. */
|
|
12
|
-
export function createRowSampling(
|
|
13
|
-
sampler: DeviceStepSampler, onToken: TokenSink,
|
|
14
|
-
) {
|
|
15
|
-
if (!sampler.capturesLogprobs) return {
|
|
16
|
-
sample: (logits: MlxArray, step: number) => sampler.sample(logits, step).token,
|
|
17
|
-
plainGreedy: sampler.isPlainGreedy, onToken, dispose: () => sampler.dispose(),
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// A pipelined group can sample the next token before emitting the previous
|
|
21
|
-
// one. Keep captures by request-local step, independently of row position.
|
|
22
|
-
const pending = new Map<number, StepExtras>();
|
|
23
|
-
let emitted = 0;
|
|
24
|
-
return {
|
|
25
|
-
sample(logits: MlxArray, step: number): MlxArray {
|
|
26
|
-
const result = sampler.sample(logits, step);
|
|
27
|
-
try {
|
|
28
|
-
ops.asyncEvalAll([result.token, ...stepExtrasArrays(result.extras)]);
|
|
29
|
-
if (result.extras) pending.set(step, result.extras);
|
|
30
|
-
return result.token;
|
|
31
|
-
} catch (error) {
|
|
32
|
-
return cleanupFailure(error, () => disposeResources([result.token,
|
|
33
|
-
{ dispose: () => disposeStepExtras(result.extras) }]));
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
// The vectorized token-only shortcut bypasses the per-request sampler.
|
|
37
|
-
plainGreedy: false,
|
|
38
|
-
onToken(token: number) {
|
|
39
|
-
const extras = pending.get(emitted) ?? null;
|
|
40
|
-
pending.delete(emitted++);
|
|
41
|
-
return onToken(token, readStepExtras(extras));
|
|
42
|
-
},
|
|
43
|
-
dispose() {
|
|
44
|
-
const extras = [...pending.values()];
|
|
45
|
-
pending.clear();
|
|
46
|
-
disposeResources([sampler, ...extras.map(value => ({ dispose: () => disposeStepExtras(value) }))]);
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { pagedPrefixNamespace } from "./request-state-policy";
|
|
2
|
-
import type { SpecRunServices } from "../../spec/serve-loop";
|
|
3
|
-
import { cleanupFailure, disposeResources, ownResource } from "../../engine/resources";
|
|
4
|
-
import { bindGeneration } from "../../generate";
|
|
5
|
-
import type { RuntimeModel } from "../../model/factory";
|
|
6
|
-
import { Qwen35Model } from "../../model/qwen3_5";
|
|
7
|
-
import type { Cache } from "../../model/gemma4";
|
|
8
|
-
import type { MlxPrefixCache } from "./checkpoint-state";
|
|
9
|
-
import type { SsdCacheStore } from "../../ssd-cache";
|
|
10
|
-
import type { DraftProvider } from "../../spec/source";
|
|
11
|
-
import type { SerialRun, Vision } from "../../serve/generation-gateway";
|
|
12
|
-
import { bindContinuationPolicy } from "./continuation";
|
|
13
|
-
import { runtimeConfig, withRuntimeConfig, type RuntimeConfig } from "../../runtime-config";
|
|
14
|
-
import { bindLegacySpeculativeModel } from "./speculative";
|
|
15
|
-
|
|
16
|
-
/** Native serial execution depends on this bound port, never a model union.
|
|
17
|
-
* Weights remain borrowed. The gateway supplies the exclusive runtime lease. */
|
|
18
|
-
export interface MlxSerialBinding {
|
|
19
|
-
readonly runtime: RuntimeConfig;
|
|
20
|
-
readonly generate: ReturnType<typeof bindGeneration>;
|
|
21
|
-
readonly speculate?: (
|
|
22
|
-
promptIds: Parameters<SerialRun>[0], options: Parameters<SerialRun>[1],
|
|
23
|
-
onToken: Parameters<SerialRun>[2], services?: SpecRunServices,
|
|
24
|
-
) => ReturnType<SerialRun>;
|
|
25
|
-
makeCache(): Cache[];
|
|
26
|
-
enterMedia?(vision?: Vision): () => void;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Family-specific context is bound once at the compatibility boundary. */
|
|
30
|
-
export function bindLegacySerialModel(
|
|
31
|
-
model: RuntimeModel,
|
|
32
|
-
draft?: { provider: DraftProvider; numDraftTokens: number },
|
|
33
|
-
): MlxSerialBinding {
|
|
34
|
-
const speculative = draft ? bindLegacySpeculativeModel(model, draft.provider) : undefined;
|
|
35
|
-
return {
|
|
36
|
-
runtime: runtimeConfig(),
|
|
37
|
-
generate: bindGeneration(model),
|
|
38
|
-
makeCache: model.makeCache.bind(model),
|
|
39
|
-
...(speculative && draft ? { speculate: (async (prompt, options, onToken, services) => {
|
|
40
|
-
const { specRun } = await import("../../spec/serve-loop");
|
|
41
|
-
return specRun(speculative, draft.numDraftTokens, prompt, options, onToken, services);
|
|
42
|
-
}) satisfies NonNullable<MlxSerialBinding["speculate"]> } : {}),
|
|
43
|
-
...(model instanceof Qwen35Model ? { enterMedia(vision?: Vision) {
|
|
44
|
-
const previous = model.mrope;
|
|
45
|
-
if (vision?.mrope) model.mrope = vision.mrope;
|
|
46
|
-
return () => { model.mrope = previous; };
|
|
47
|
-
} } : {}),
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface MlxSerialServices {
|
|
52
|
-
readonly promptCache: MlxPrefixCache & { readonly maxBytes?: number };
|
|
53
|
-
readonly checkpoints: Pick<SsdCacheStore, "findGenerationCheckpoint" | "restore" |
|
|
54
|
-
"storeGenerationCheckpoint" | "removeGenerationCheckpoints"> | null;
|
|
55
|
-
readonly checkpointEveryTokens?: number;
|
|
56
|
-
readonly checkpointPersistence?: import("./continuation-persistence").ContinuationPersistence;
|
|
57
|
-
/** Artifact, implementation, state ABI and codec identity captured at load. */
|
|
58
|
-
readonly identity: unknown;
|
|
59
|
-
adapterNamespace(adapters: string[]): string;
|
|
60
|
-
cloneState(caches: Cache[]): Cache[];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Cache lookup, replay, prompt snapshots and checkpoint persistence belong to
|
|
64
|
-
* native execution. HTTP only composes this service and frames its output.
|
|
65
|
-
* The caller transfers prepared native inputs; caches created/taken here are
|
|
66
|
-
* owned until returned to the prefix store or disposed after execution. */
|
|
67
|
-
export function createMlxSerialExecutor(binding: MlxSerialBinding, services: MlxSerialServices): SerialRun {
|
|
68
|
-
const { promptCache, checkpoints: ssdStore } = services;
|
|
69
|
-
return (promptIds, options, onToken, vision, trace, execution) => withRuntimeConfig(binding.runtime, async () => {
|
|
70
|
-
if (promptCache.reclaim) {
|
|
71
|
-
const publish = onToken;
|
|
72
|
-
let steps = 0;
|
|
73
|
-
onToken = (token, logprobs) => {
|
|
74
|
-
if (steps++ % 256 === 0) promptCache.reclaim!();
|
|
75
|
-
return publish(token, logprobs);
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
let releaseContinuation: (() => void) | undefined;
|
|
79
|
-
let caches: Cache[] = [];
|
|
80
|
-
let retain: (() => void) | undefined;
|
|
81
|
-
let closeMedia: (() => void) | undefined;
|
|
82
|
-
const cleanup = ownResource(null, () => disposeResources([
|
|
83
|
-
{ dispose() {
|
|
84
|
-
disposeResources(caches);
|
|
85
|
-
retain?.(); // backing release requires successful cache disposal
|
|
86
|
-
} },
|
|
87
|
-
{ dispose: () => closeMedia?.() },
|
|
88
|
-
{ dispose: () => releaseContinuation?.() },
|
|
89
|
-
...[options.grammar, vision?.embeddings, vision?.imageMask,
|
|
90
|
-
vision?.multimodalMask, options.visionPixels].filter((value) => value != null),
|
|
91
|
-
]));
|
|
92
|
-
try {
|
|
93
|
-
options.signal?.throwIfAborted();
|
|
94
|
-
if (!execution) throw new Error("serial execution requires a resolved plan");
|
|
95
|
-
if (execution.method === "speculative") {
|
|
96
|
-
if (!binding.speculate) throw new Error("resolved speculation requires a bound verifier");
|
|
97
|
-
return await binding.speculate(promptIds, options, onToken, {
|
|
98
|
-
...(binding.runtime.flag("MLX_BUN_MTP_PROMPT_CACHE", true) && services.promptCache.maxBytes !== 0
|
|
99
|
-
? { prefixCache: services.promptCache } : {}),
|
|
100
|
-
cloneState: services.cloneState,
|
|
101
|
-
cacheNamespace: options.adapters?.length ? services.adapterNamespace(options.adapters) : "",
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
// Cache entries are adapter-specific: KV computed under one adapter
|
|
105
|
-
// must never seed another's (or the base's) prefill.
|
|
106
|
-
const baseNs = options.adapters?.length ? services.adapterNamespace(options.adapters) : "";
|
|
107
|
-
const cacheNs = execution.pagedKv ? pagedPrefixNamespace(options, baseNs) : baseNs;
|
|
108
|
-
// Paged-KV request scope (docs/design/kv-cache.md): media
|
|
109
|
-
// prompts (bidir overlay) and LoRA-adapter requests are v1 non-goals —
|
|
110
|
-
// they run the PLAIN cache path even under --paged-kv (scope the flag
|
|
111
|
-
// per request, never 400). Effective value computed ONCE so the
|
|
112
|
-
// prompt-cache bypass below and the generate() options can't disagree.
|
|
113
|
-
const pagedKv = execution.pagedKv ? options.pagedKv : undefined;
|
|
114
|
-
// The resolved policy controls reuse; paged layouts have their own
|
|
115
|
-
// numerical namespace and use the same RAM/SSD cache interface.
|
|
116
|
-
const skipPromptCache = !execution.promptCache;
|
|
117
|
-
const checkpointEvery = services.checkpointEveryTokens;
|
|
118
|
-
const checkpointEligible = execution.checkpoint;
|
|
119
|
-
const continuation = checkpointEligible ? bindContinuationPolicy({ store: ssdStore!,
|
|
120
|
-
restore: entry => ssdStore!.restore(entry, binding), prompt: promptIds,
|
|
121
|
-
options, execution, identity: services.identity, namespace: cacheNs, persistence: services.checkpointPersistence }) : null;
|
|
122
|
-
releaseContinuation = continuation?.release;
|
|
123
|
-
const checkpointKey = continuation?.key;
|
|
124
|
-
// Both tiers in one call (Layer 0): take() prefers a strictly-longer
|
|
125
|
-
// SSD prefix, restores it zero-copy, and trims — see PromptCache.take.
|
|
126
|
-
const closeCacheLookup = trace?.begin("cache.lookup_restore", {
|
|
127
|
-
mechanism: "serial",
|
|
128
|
-
bypassed: skipPromptCache,
|
|
129
|
-
});
|
|
130
|
-
const checkpoint = continuation?.restore();
|
|
131
|
-
caches = checkpoint?.caches ?? [];
|
|
132
|
-
const resuming = Boolean(checkpoint);
|
|
133
|
-
const generationPromptIds = checkpoint?.cacheTokens ?? promptIds;
|
|
134
|
-
const entry = skipPromptCache || resuming
|
|
135
|
-
? null
|
|
136
|
-
: promptCache.take(promptIds, cacheNs, options.cacheSessionId);
|
|
137
|
-
if (entry) { caches = entry.caches; retain = entry.retain; }
|
|
138
|
-
if (!checkpoint && !entry) caches = binding.makeCache();
|
|
139
|
-
closeCacheLookup?.();
|
|
140
|
-
// Prompt-boundary snapshot (the multi-turn agent fix, 2026-07-04): the
|
|
141
|
-
// prompt+gen entry put() below is UNTRIMMABLE at context > sliding
|
|
142
|
-
// window (wrapped rings) and under quantized KV (mid-group), so any
|
|
143
|
-
// decode→encode roundtrip drift in the reply the client sends back
|
|
144
|
-
// turns the next turn into a total miss (measured: 12B turn-2 TTFT
|
|
145
|
-
// 8.9 s instead of ~0.2 s). A prompt-ONLY entry is always an exact
|
|
146
|
-
// prefix of the next turn's rendering regardless of reply drift.
|
|
147
|
-
// Zero-copy (cloneKvCaches = slice views); only for substantial cold
|
|
148
|
-
// prefills, where the re-prefill it saves is worth an extra entry.
|
|
149
|
-
// The oracle invariant (mlx-lm insert_segments): a trim-free STRICT
|
|
150
|
-
// prefix of the prompt exists for EVERY substantial request — cap the
|
|
151
|
-
// boundary at len-1 so even a stableLen == len prompt (e4b: the
|
|
152
|
-
// template tail survives the probe render) snapshots prompt[:-1]. An
|
|
153
|
-
// exact repeat then matches with trimNeeded == 0, bypassing
|
|
154
|
-
// isTrimmable() entirely — the only reuse path a wrapped ring has.
|
|
155
|
-
const boundary = Math.min(options.snapshotAt ?? promptIds.length, promptIds.length - 1);
|
|
156
|
-
// Re-snapshot on EVERY substantial request whose stable boundary extends
|
|
157
|
-
// past the cached prefix; the clone is zero-copy views, so re-putting
|
|
158
|
-
// is ~free.
|
|
159
|
-
const snapshotBoundary =
|
|
160
|
-
!skipPromptCache && !resuming && boundary >= 256 &&
|
|
161
|
-
boundary > (entry?.tokens.length ?? 0);
|
|
162
|
-
closeMedia = binding.enterMedia?.(vision);
|
|
163
|
-
if (resuming) {
|
|
164
|
-
const replay = generationPromptIds.slice(promptIds.length);
|
|
165
|
-
console.log(
|
|
166
|
-
`[generation-checkpoint] resuming ${checkpointKey} at ` +
|
|
167
|
-
`${replay.length} emitted tokens`,
|
|
168
|
-
);
|
|
169
|
-
for (const token of replay) {
|
|
170
|
-
options.signal?.throwIfAborted();
|
|
171
|
-
if ((await onToken(token)) === false)
|
|
172
|
-
throw new Error("saved generation prefix triggered a terminal stop while replaying");
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const gen = binding.generate(generationPromptIds, {
|
|
176
|
-
...options,
|
|
177
|
-
decodePolicy: execution,
|
|
178
|
-
...(resuming ? { seed: checkpoint!.seed } : {}),
|
|
179
|
-
fill: execution.fill ? options.fill : undefined,
|
|
180
|
-
pagedKv, // request-scoped (undefined strips the server-wide flag)
|
|
181
|
-
cache: caches,
|
|
182
|
-
...(resuming
|
|
183
|
-
? {
|
|
184
|
-
initialPendingToken: checkpoint!.pendingToken,
|
|
185
|
-
initialGeneratedTokens: checkpoint!.generatedTokens,
|
|
186
|
-
originalPromptTokens: promptIds.length,
|
|
187
|
-
}
|
|
188
|
-
: {}),
|
|
189
|
-
...(checkpointEligible
|
|
190
|
-
? {
|
|
191
|
-
checkpointEveryTokens: checkpointEvery,
|
|
192
|
-
onDecodeCheckpoint: async (state: {
|
|
193
|
-
cacheTokens: number[];
|
|
194
|
-
caches: Cache[];
|
|
195
|
-
generatedTokens: number;
|
|
196
|
-
pendingToken: number;
|
|
197
|
-
}) => {
|
|
198
|
-
if (services.checkpointPersistence)
|
|
199
|
-
continuation!.captureOwned({ ...state, caches: services.cloneState(state.caches) });
|
|
200
|
-
else await continuation!.capture(state);
|
|
201
|
-
},
|
|
202
|
-
}
|
|
203
|
-
: {}),
|
|
204
|
-
...(snapshotBoundary
|
|
205
|
-
? {
|
|
206
|
-
// snapshotAt MUST travel with the hook: generate() splits the
|
|
207
|
-
// prefill at exactly this many tokens and fires the hook while
|
|
208
|
-
// the caches hold exactly that prefix — putting boundary
|
|
209
|
-
// tokens against caches at any other offset is silent KV
|
|
210
|
-
// corruption.
|
|
211
|
-
snapshotAt: boundary,
|
|
212
|
-
onPrefillDone: () => {
|
|
213
|
-
try {
|
|
214
|
-
const snapshot = ownResource(services.cloneState(caches), disposeResources);
|
|
215
|
-
try {
|
|
216
|
-
promptCache.put(promptIds.slice(0, boundary), snapshot.borrow(), cacheNs, undefined, undefined, options.cacheSessionId);
|
|
217
|
-
snapshot.transfer();
|
|
218
|
-
} finally { snapshot.close(); }
|
|
219
|
-
} catch (e) {
|
|
220
|
-
console.warn(`prompt-boundary snapshot skipped: ${(e as Error).message}`);
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
}
|
|
224
|
-
: {}),
|
|
225
|
-
...(vision
|
|
226
|
-
? {
|
|
227
|
-
promptEmbeddings: vision.embeddings,
|
|
228
|
-
...(vision.imageMask ? { imageMask: vision.imageMask } : {}),
|
|
229
|
-
...(vision.multimodalMask ? { multimodalMask: vision.multimodalMask } : {}),
|
|
230
|
-
}
|
|
231
|
-
: {}),
|
|
232
|
-
}, { trace, mechanism: "serial" });
|
|
233
|
-
for await (const t of gen) {
|
|
234
|
-
if ((await onToken(t.token, t.logprobs)) === false) break;
|
|
235
|
-
}
|
|
236
|
-
const s = gen.stats!; // set on completion AND on early break
|
|
237
|
-
continuation?.complete();
|
|
238
|
-
if (!skipPromptCache) {
|
|
239
|
-
// put() fires onPut → the debounced write-behind SSD snapshot
|
|
240
|
-
// (wired below), covering the batch lane's puts too.
|
|
241
|
-
promptCache.put(s.cacheTokens, caches, cacheNs, retain, undefined, options.cacheSessionId);
|
|
242
|
-
caches = []; retain = undefined; // ownership returned to the prefix store
|
|
243
|
-
}
|
|
244
|
-
return s;
|
|
245
|
-
} catch (error) {
|
|
246
|
-
cleanupFailure(error, () => cleanup.close());
|
|
247
|
-
} finally {
|
|
248
|
-
cleanup.close();
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
}
|