mlx-bun 0.2.0 → 0.4.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 +71 -588
- package/docs/README.md +94 -0
- package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
- package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
- package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
- package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
- package/docs/archive/investigations/openjarvis-fit.md +198 -0
- package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
- package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +1092 -0
- package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
- package/docs/archive/planning/release-notes-v0.3.0.md +35 -0
- package/docs/design/batching.md +1841 -0
- package/docs/design/decode-speed-program.md +2346 -169
- package/docs/design/dreaming-nightly-pipeline.md +675 -282
- package/docs/design/generic-model-support.md +655 -334
- package/docs/design/kv-cache.md +824 -0
- package/docs/design/orpo-training.md +673 -1239
- package/docs/design/speculative-decoding.md +1990 -0
- package/docs/design/turboquant.md +2212 -0
- package/docs/design/unified-engine-frontier-plan.md +1833 -727
- package/docs/design/web-chat-redesign.md +666 -1083
- package/docs/planning/PRODUCT_ROADMAP.md +50 -1
- package/docs/planning/release-notes-v0.4.0.md +45 -0
- package/docs/planning/video-series.md +2 -2
- package/docs/reference/benchmarks.md +3613 -0
- package/docs/reference/cli.md +434 -160
- package/docs/reference/distribution.md +328 -182
- package/docs/reference/environment.md +398 -0
- package/docs/reference/glossary.md +39 -0
- package/docs/reference/library-api.md +566 -168
- package/docs/reference/memory.md +227 -64
- package/docs/reference/models.md +113 -6
- package/docs/reference/server-api.md +944 -429
- package/docs/reference/server-config.md +740 -338
- package/docs/reference/training.md +393 -254
- package/docs/reference/troubleshooting.md +158 -0
- package/package.json +9 -4
- package/src/audio/decode.ts +2 -2
- package/src/audio/features.ts +2 -2
- package/src/backends/mlx/assistant-target.ts +46 -0
- package/src/backends/mlx/autoregressive-draft-rows.ts +120 -0
- package/src/backends/mlx/autoregressive.ts +108 -0
- package/src/backends/mlx/batch-group.ts +1790 -0
- package/src/backends/mlx/cache-attachment.ts +67 -0
- package/src/backends/mlx/cache-layout.ts +31 -0
- package/src/backends/mlx/checkpoint-state.ts +53 -0
- package/src/backends/mlx/continuation-persistence.ts +106 -0
- package/src/backends/mlx/continuation-request.ts +43 -0
- package/src/backends/mlx/continuation.ts +77 -0
- package/src/backends/mlx/diffusion.ts +39 -0
- package/src/backends/mlx/draft-target.ts +32 -0
- package/src/backends/mlx/evaluation.ts +105 -0
- package/src/backends/mlx/fill-append.ts +45 -0
- package/src/backends/mlx/full-kv-row-append.ts +32 -0
- package/src/backends/mlx/full-kv-row-donor.ts +54 -0
- package/src/backends/mlx/full-transitioning-kv-rows.ts +65 -0
- package/src/backends/mlx/gateway-binding.ts +130 -0
- package/src/backends/mlx/graph.ts +38 -0
- package/src/backends/mlx/kv-codec.ts +9 -0
- package/src/backends/mlx/kv-maintenance.ts +133 -0
- package/src/backends/mlx/kv-tensor-rows.ts +212 -0
- package/src/backends/mlx/memory-client.ts +189 -0
- package/src/backends/mlx/methods.ts +90 -0
- package/src/backends/mlx/model-prompt.ts +164 -0
- package/src/backends/mlx/model-serving.ts +79 -0
- package/src/backends/mlx/prefill-cohort.ts +89 -0
- package/src/backends/mlx/prefill-rows.ts +200 -0
- package/src/backends/mlx/prefill.ts +33 -0
- package/src/backends/mlx/projected-context-rows.ts +72 -0
- package/src/backends/mlx/request-policy.ts +20 -0
- package/src/backends/mlx/request-state-policy.ts +41 -0
- package/src/backends/mlx/rollback.ts +89 -0
- package/src/backends/mlx/row-sampling.ts +49 -0
- package/src/backends/mlx/serial-executor.ts +242 -0
- package/src/backends/mlx/speculative-group.ts +359 -0
- package/src/backends/mlx/speculative-round.ts +161 -0
- package/src/backends/mlx/speculative.ts +114 -0
- package/src/backends/mlx/state-rows.ts +104 -0
- package/src/backends/mlx/state-views.ts +46 -0
- package/src/backends/mlx/target-layout-capability.ts +35 -0
- package/src/backends/mlx/text-engine.ts +73 -0
- package/src/backends/mlx/transitioning-kv-rows.ts +165 -0
- package/src/cli.ts +66 -58
- package/src/client.ts +66 -0
- package/src/config.ts +21 -4
- package/src/contracts/completion.ts +16 -0
- package/src/contracts/execution.ts +60 -0
- package/src/contracts/generation.ts +103 -0
- package/src/contracts/host.ts +7 -0
- package/src/contracts/jobs.ts +66 -0
- package/src/contracts/pi-provider.ts +30 -0
- package/src/contracts/pi.ts +259 -0
- package/src/contracts/prefix-cache.ts +23 -0
- package/src/contracts/resources.ts +25 -0
- package/src/contracts/sampling.ts +23 -0
- package/src/contracts/scheduling.ts +45 -0
- package/src/contracts/tsconfig.json +14 -0
- package/src/diffusion/diffusion-generate.ts +218 -153
- package/src/embed.ts +1 -1
- package/src/engine/admission.ts +59 -0
- package/src/engine/cancellation.ts +38 -0
- package/src/engine/engine.ts +56 -0
- package/src/engine/execution-coordinator.ts +70 -0
- package/src/engine/execution-plan.ts +53 -0
- package/src/engine/resources.ts +53 -0
- package/src/engine/scheduler.ts +72 -0
- package/src/engine/session.ts +247 -0
- package/src/eval/README.md +44 -1
- package/src/eval/kl.ts +236 -3
- package/src/eval/reference-logits.ts +207 -0
- package/src/eval/runner.ts +8 -96
- package/src/fill/echo-index.ts +188 -0
- package/src/fill/fill-session.ts +452 -0
- package/src/fill/proposal.ts +68 -0
- package/src/fill/schema-rows.ts +506 -0
- package/src/fill/tool-boundary.ts +103 -0
- package/src/fit.ts +30 -16
- package/src/generate.ts +709 -417
- package/src/grammar.ts +12 -7
- package/src/harness-pi.ts +14 -33
- package/src/hub-rest.ts +4 -4
- package/src/index.ts +7 -0
- package/src/inference/denoising.ts +17 -0
- package/src/inference/draft-acceptance.ts +41 -0
- package/src/inference/draft-output.ts +49 -0
- package/src/inference/graph.ts +33 -0
- package/src/inference/prefill.ts +39 -0
- package/src/inference/rollback.ts +7 -0
- package/src/jobs/db.ts +4 -0
- package/src/jobs/index.ts +2 -0
- package/src/jobs/job-entry.ts +12 -12
- package/src/jobs/runner.ts +98 -13
- package/src/jobs/task-client.ts +19 -0
- package/src/jobs/types.ts +2 -58
- package/src/kv-scheme.ts +70 -12
- package/src/kv-store.ts +177 -63
- package/src/lab/README.md +18 -0
- package/src/{assets → lab/curve}/curve-designer.html +2 -2
- package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
- package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
- package/src/lab/paged-kv/paged-kv-rows.ts +83 -0
- package/src/{model → lab/paged-kv}/paged-kv.ts +32 -15
- package/src/library.ts +40 -0
- package/src/lora.ts +18 -0
- package/src/media-fetch.ts +1 -1
- package/src/memory/article.ts +1 -1
- package/src/memory/chunk.ts +1 -1
- package/src/memory/model.ts +30 -169
- package/src/memory/prompts.ts +1 -1
- package/src/memory/rest.ts +1 -1
- package/src/memory/schedule.ts +1 -1
- package/src/memory/stages.ts +4 -1
- package/src/memory/vault.ts +1 -3
- package/src/mlx/array.ts +11 -11
- package/src/mlx/compile.ts +12 -2
- package/src/mlx/ffi.ts +58 -11
- package/src/mlx/materialize.ts +23 -0
- package/src/mlx/metal-kernel.ts +10 -11
- package/src/mlx/ops.ts +33 -13
- package/src/mlx/quantized-rows.ts +36 -0
- package/src/mlx/token-bitmask.ts +52 -0
- package/src/mlx/turboquant-kv-decode.ts +82 -0
- package/src/mlx/turboquant-kv-inverse.ts +122 -0
- package/src/mlx/turboquant-ops.ts +33 -3
- package/src/mlx/turboquant-tables.ts +2 -2
- package/src/model/artifact-identity.ts +73 -0
- package/src/model/batched-kv.ts +235 -0
- package/src/model/batched-mask.ts +20 -6
- package/src/model/batched-quant.ts +9 -3
- package/src/model/batched-quantized-kv.ts +144 -0
- package/src/model/batched-rotating-quant.ts +78 -17
- package/src/model/batched-rotating-state.ts +76 -0
- package/src/model/batched-rotating.ts +65 -23
- package/src/model/batched-row-storage.ts +52 -0
- package/src/model/batched-ssm.ts +52 -0
- package/src/model/batched-turboquant-kv.ts +93 -0
- package/src/model/compiled-decode.ts +8 -2
- package/src/model/decoded-kv-donor.ts +12 -0
- package/src/model/delayed-quantized-kv.ts +72 -0
- package/src/model/delayed-rotating-quantized-kv.ts +93 -0
- package/src/model/delayed-turboquant-kv.ts +55 -0
- package/src/model/diffusion-gemma.ts +8 -8
- package/src/model/factory.ts +76 -33
- package/src/model/fingerprint.ts +1 -1
- package/src/model/flash-attention.ts +3 -3
- package/src/model/full-prefill-padding.ts +56 -0
- package/src/model/full-prefill-row.ts +105 -0
- package/src/model/gemma4-base.ts +179 -80
- package/src/model/gemma4.ts +40 -32
- package/src/model/generated/gemma4-12b.ts +6 -3
- package/src/model/generated/gemma4-26b.ts +6 -3
- package/src/model/generated/gemma4-e4b.ts +6 -3
- package/src/model/glm52-cache.ts +80 -4
- package/src/model/glm52-dsa.ts +13 -9
- package/src/model/glm52-memory.ts +1 -1
- package/src/model/glm52-mla.ts +12 -6
- package/src/model/glm52.ts +19 -40
- package/src/model/implementation.ts +69 -0
- package/src/model/kv-attention-view.ts +67 -0
- package/src/model/minicpm5.ts +17 -15
- package/src/model/profile.ts +12 -2
- package/src/model/qwen-append.ts +12 -0
- package/src/model/qwen-conv.ts +52 -0
- package/src/model/qwen3-delta-state.ts +74 -0
- package/src/model/qwen3-delta.ts +59 -36
- package/src/model/qwen3_5-checkpoint.ts +164 -0
- package/src/model/qwen3_5.ts +202 -78
- package/src/model/rotating-kv-donor.ts +35 -0
- package/src/model/rotating-kv-layout.ts +262 -0
- package/src/model/rotating-row-transaction.ts +35 -0
- package/src/model/speculative-rotating-kv.ts +101 -0
- package/src/model/ssm-prefill-padding.ts +39 -0
- package/src/model/support.ts +1 -1
- package/src/model/trellis-balanced-scatter.ts +51 -0
- package/src/model/trellis-linear.ts +672 -0
- package/src/model/trellis-shared-m.ts +151 -0
- package/src/model/trellis-shared-scatter.ts +144 -0
- package/src/model/trellis-splitk-prefill.ts +158 -0
- package/src/model/trellis-tiled-prefill.ts +136 -0
- package/src/model/trellis-vector-expand.ts +62 -0
- package/src/model/trellis-wide-prefill.ts +94 -0
- package/src/model/turboquant-codec.ts +83 -0
- package/src/model/universal/dense.ts +15 -14
- package/src/model/universal/modules.ts +8 -1
- package/src/native-pack.ts +6 -5
- package/src/pi-provider.ts +6 -64
- package/src/pi-web.ts +8 -315
- package/src/preflight.ts +31 -15
- package/src/prompt-cache.ts +110 -69
- package/src/quantize/allocator.ts +1 -1
- package/src/quantize/config-writer.ts +10 -3
- package/src/quantize/rotate.ts +4 -4
- package/src/quantize/trellis.ts +586 -0
- package/src/responses.ts +28 -1
- package/src/runtime-config.ts +18 -4
- package/src/sampler.ts +40 -29
- package/src/serve/batch-scheduler.ts +8 -1671
- package/src/serve/chat-request.ts +391 -0
- package/src/serve/chat-stage.ts +195 -0
- package/src/serve/checkpoint-identity.ts +64 -0
- package/src/serve/completion-executor.ts +15 -7
- package/src/serve/discovery-routes.ts +12 -13
- package/src/serve/generation-gateway.ts +183 -213
- package/src/serve/http.ts +159 -0
- package/src/serve/inference-request.ts +79 -0
- package/src/serve/isolate.ts +297 -105
- package/src/serve/lab-routes.ts +3 -0
- package/src/serve/lane-registry.ts +2 -1
- package/src/serve/model-admin-routes.ts +7 -5
- package/src/serve/model-binding.ts +43 -0
- package/src/serve/model-host.ts +511 -0
- package/src/serve/openai-wire.ts +103 -0
- package/src/serve/parent-application.ts +56 -0
- package/src/serve/pipeline.ts +33 -0
- package/src/serve/preparation.ts +33 -0
- package/src/serve/request-plan.ts +23 -18
- package/src/serve/request-prep.ts +344 -0
- package/src/serve/response-lease.ts +24 -0
- package/src/serve/responses-client.ts +69 -0
- package/src/serve/session-completion-engine.ts +110 -0
- package/src/serve/session-search.ts +1 -1
- package/src/serve/static-routes.ts +5 -5
- package/src/serve/text-completion-stage.ts +104 -0
- package/src/serve/token-streams.ts +519 -0
- package/src/server.ts +335 -2711
- package/src/spec/assistant-rows.ts +92 -0
- package/src/spec/assistant-source.ts +31 -55
- package/src/spec/cache-identity.ts +22 -0
- package/src/spec/deepspec-rows.ts +29 -0
- package/src/spec/deepspec-source.ts +16 -14
- package/src/spec/dflash-source.ts +36 -12
- package/src/spec/drafter.ts +153 -142
- package/src/spec/dspark/ab-stats.ts +3 -3
- package/src/spec/dspark/calibration.ts +2 -2
- package/src/spec/dspark/deepspec-module.ts +97 -122
- package/src/spec/dspark/generate-dflash.ts +2 -2
- package/src/spec/dspark/generate.ts +2 -2
- package/src/spec/dspark/loader.ts +1 -1
- package/src/spec/dspark/module-dflash.ts +129 -172
- package/src/spec/dspark/module.ts +3 -3
- package/src/spec/dspark/quantize-drafter.ts +1 -1
- package/src/spec/generate.ts +1 -1
- package/src/spec/glm52-mtp-graph.ts +29 -0
- package/src/spec/glm52-mtp-rows.ts +132 -0
- package/src/spec/glm52-mtp-source.ts +54 -137
- package/src/spec/glm52-mtp-state.ts +33 -0
- package/src/spec/ngram-source.ts +93 -21
- package/src/spec/projected-draft-rows.ts +73 -0
- package/src/spec/qwen-mtp-module.ts +171 -0
- package/src/spec/qwen-mtp-rows.ts +219 -0
- package/src/spec/qwen-mtp-source.ts +147 -195
- package/src/spec/qwen-mtp-state.ts +30 -0
- package/src/spec/serve-loop.ts +201 -201
- package/src/spec/source.ts +110 -13
- package/src/spec/two-model-rows.ts +61 -0
- package/src/spec/two-model.ts +44 -102
- package/src/ssd-cache.ts +99 -19
- package/src/ssd-durability.ts +36 -20
- package/src/tool-call.ts +51 -14
- package/src/train/flash-cce.ts +2 -2
- package/src/train/forward.ts +6 -0
- package/src/train/loss.ts +1 -1
- package/src/train/prefix-shared.ts +5 -1
- package/src/train/segmented.ts +5 -3
- package/src/train/trainer.ts +6 -6
- package/src/vision/prompt.ts +1 -1
- package/src/vision/qwen3vl-tower.ts +52 -10
- package/src/web/app.html +1 -1
- package/src/web/app.js +62 -60
- package/src/web/src/adapters-panel.ts +3 -3
- package/src/web/src/assistant.ts +2 -36
- package/src/web/src/chat.ts +4 -4
- package/src/web/src/composer.ts +4 -4
- package/src/web/src/hub.ts +1 -1
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +1 -1
- package/src/web/src/model-picker.ts +1 -1
- package/src/web/src/palette.ts +1 -1
- package/src/web/src/protocol.ts +3 -39
- package/src/web/src/sessions.ts +1 -1
- package/src/web/src/ui-catalog.ts +4 -18
- package/src/web-assets.ts +47 -0
- package/src/weights.ts +55 -9
- package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
- package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
- package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
- package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
- package/docs/archive/investigations/hlg-ab.html +0 -34
- package/docs/archive/investigations/hlg-explorer.html +0 -238
- package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
- package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
- package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
- package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
- package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
- package/docs/archive/investigations/hlg-report.html +0 -262
- package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
- package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
- package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
- package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
- package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
- package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
- package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
- package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
- package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
- package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
- package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
- package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
- package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
- package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
- package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
- package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
- package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
- package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
- package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
- package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
- package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
- package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
- package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
- package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
- package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
- package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
- package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
- package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
- package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
- package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
- package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
- package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
- package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
- package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
- package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
- package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
- package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
- package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
- package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
- package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
- package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
- package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
- package/docs/archive/mlx-bun-lab-report.html +0 -275
- package/docs/archive/wwdc-mlx-bun.html +0 -848
- package/docs/design/adapters-end-to-end.md +0 -205
- package/docs/design/batching-perf-path.md +0 -255
- package/docs/design/batching-v2-plan.md +0 -529
- package/docs/design/bucketing-stage.md +0 -197
- package/docs/design/compat-cli-surface-design.md +0 -230
- package/docs/design/docs-reorg-plan.md +0 -165
- package/docs/design/dspark-serving-program.md +0 -371
- package/docs/design/dspark-speculative-decoding.md +0 -318
- package/docs/design/grammar-spec-batching-integration.md +0 -301
- package/docs/design/memory-inference-path.md +0 -422
- package/docs/design/memory-synthesis.md +0 -287
- package/docs/design/memory-system.md +0 -237
- package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
- package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
- package/docs/design/omlx-adoption-map.md +0 -98
- package/docs/design/orpo-dynamic-lambda.md +0 -220
- package/docs/design/orpo-future-enhancements.md +0 -340
- package/docs/design/paged-kv-cache.md +0 -214
- package/docs/design/parallel-slots.md +0 -567
- package/docs/design/parity-tier-dag.md +0 -161
- package/docs/design/repo-cleanup-plan.md +0 -231
- package/docs/design/runtime-isolation.md +0 -263
- package/docs/design/segmented-backward-training.md +0 -543
- package/docs/design/spec-decode-larger-targets.md +0 -229
- package/docs/design/ssd-kv-cold-tier.md +0 -415
- package/docs/design/structured-output.md +0 -484
- package/docs/design/tauri-desktop-app.md +0 -127
- package/docs/design/the-dreaming-master-plan.md +0 -445
- package/docs/design/turboquant-kv.md +0 -235
- package/docs/design/turboquant-weights.md +0 -467
- package/docs/design/w4a16-compute-precision-spike.md +0 -232
- package/docs/design/web-chat-beat-matrix.md +0 -315
- package/docs/design/write-pipeline-entity.md +0 -468
- package/docs/planning/IDEAS.md +0 -69
- package/docs/reference/embedding.md +0 -197
- package/docs/reference/features-matrix.md +0 -101
- package/docs/reference/orpo-quickstart.md +0 -135
- package/src/flags.ts +0 -11
- /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
- /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
- /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
- /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
- /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
- /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
- /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
- /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { cleanupFailure } from "../engine/resources";
|
|
2
|
+
import type { ExecutionPlan, InferenceMethod, Timer } from "../contracts/generation";
|
|
3
|
+
import { CancellationSource, throwIfCancelled } from "../engine/cancellation";
|
|
4
|
+
import { createInferenceEngine } from "../engine/engine";
|
|
5
|
+
import type { GenerateStats } from "../generate";
|
|
6
|
+
import type { CompletionEngine } from "./completion-executor";
|
|
7
|
+
|
|
8
|
+
const timer: Timer = {
|
|
9
|
+
after(ms, callback) {
|
|
10
|
+
const handle = setTimeout(callback, ms);
|
|
11
|
+
return () => clearTimeout(handle);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type RuntimeArguments = Parameters<CompletionEngine["run"]>;
|
|
16
|
+
|
|
17
|
+
export interface CompletionRunRequest {
|
|
18
|
+
prompt: RuntimeArguments[0]; options: RuntimeArguments[1]; vision?: RuntimeArguments[3];
|
|
19
|
+
shape: RuntimeArguments[4]; placement: RuntimeArguments[5];
|
|
20
|
+
signal?: RuntimeArguments[6]; trace?: RuntimeArguments[7];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Bind one selected runtime operation to the method-neutral session. */
|
|
24
|
+
export function createCompletionMethod(
|
|
25
|
+
runtime: CompletionEngine, request: CompletionRunRequest,
|
|
26
|
+
onStarted?: () => void, onFailure?: (error: unknown) => void,
|
|
27
|
+
): InferenceMethod<GenerateStats> {
|
|
28
|
+
const { prompt, options, vision, shape, placement, signal, trace } = request;
|
|
29
|
+
const maxTokens = options.maxTokens ?? 512;
|
|
30
|
+
return {
|
|
31
|
+
id: placement.execution?.method ?? placement.mechanism,
|
|
32
|
+
async createRun(cancel) {
|
|
33
|
+
throwIfCancelled(cancel);
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const unsubscribe = cancel.subscribe(() => controller.abort(
|
|
36
|
+
signal?.reason ?? new DOMException("generation cancelled", "AbortError"),
|
|
37
|
+
));
|
|
38
|
+
return {
|
|
39
|
+
async execute(output) {
|
|
40
|
+
onStarted?.();
|
|
41
|
+
try {
|
|
42
|
+
const stats = await runtime.run(prompt, options,
|
|
43
|
+
(token, logprobs) => output.commit([token], logprobs ? [logprobs] : undefined),
|
|
44
|
+
vision, shape, placement, controller.signal, trace);
|
|
45
|
+
return {
|
|
46
|
+
finishReason: stats.finishReason ?? (stats.generatedTokens >= maxTokens ? "length" : "stop"),
|
|
47
|
+
metrics: stats,
|
|
48
|
+
};
|
|
49
|
+
} catch (error) { onFailure?.(error); throw error; }
|
|
50
|
+
},
|
|
51
|
+
async close() { unsubscribe(); },
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** HTTP already bounds its output in CompletionSink. Deliver through the same
|
|
58
|
+
* session lifecycle without inserting another queue between sampling and the
|
|
59
|
+
* stop/tool parser. The runtime retains scheduling and native resource ownership. */
|
|
60
|
+
export function createSessionCompletionEngine(
|
|
61
|
+
runtime: CompletionEngine,
|
|
62
|
+
releaseUnstarted: (options: Parameters<CompletionEngine["run"]>[1],
|
|
63
|
+
vision: Parameters<CompletionEngine["run"]>[3]) => void,
|
|
64
|
+
): CompletionEngine & { close(): Promise<void> } {
|
|
65
|
+
const engine = createInferenceEngine<ExecutionPlan<GenerateStats>, GenerateStats>({
|
|
66
|
+
async plan(plan, cancellation) { throwIfCancelled(cancellation); return plan; },
|
|
67
|
+
}, { timer });
|
|
68
|
+
return {
|
|
69
|
+
place: (shape, options) => runtime.place(shape, options),
|
|
70
|
+
async run(prompt, options, onToken, vision, shape, placement, signal, trace) {
|
|
71
|
+
const cancellation = new CancellationSource();
|
|
72
|
+
const abort = () => cancellation.cancel("requested");
|
|
73
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
74
|
+
if (signal?.aborted) abort();
|
|
75
|
+
let started = false;
|
|
76
|
+
let failure: unknown;
|
|
77
|
+
let failed = false;
|
|
78
|
+
const maxTokens = options.maxTokens ?? 512;
|
|
79
|
+
const method = createCompletionMethod(runtime,
|
|
80
|
+
{ prompt, options, vision, shape, placement, signal, trace },
|
|
81
|
+
() => { started = true; },
|
|
82
|
+
(error) => { failed = true; failure = error; });
|
|
83
|
+
try {
|
|
84
|
+
const session = await engine.open({ id: method.id, method, outputTokenLimit: maxTokens }, {
|
|
85
|
+
output: "callback", cancellation,
|
|
86
|
+
async onTokens(ids, logprobs) {
|
|
87
|
+
for (let i = 0; i < ids.length; i++)
|
|
88
|
+
if (await onToken(ids[i]!, logprobs?.[i]) === false) return false;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
const outcome = await session.result;
|
|
92
|
+
if (outcome.status === "completed") return outcome.result.metrics;
|
|
93
|
+
if (failed) throw failure; // preserve native/HTTP error identity and stack
|
|
94
|
+
if (outcome.status === "cancelled")
|
|
95
|
+
throw signal?.reason ?? new DOMException("generation cancelled", "AbortError");
|
|
96
|
+
throw new Error(outcome.error.message);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (!started) {
|
|
99
|
+
started = true; // release once, preserving the original execution error
|
|
100
|
+
cleanupFailure(error, () => releaseUnstarted(options, vision));
|
|
101
|
+
}
|
|
102
|
+
throw error;
|
|
103
|
+
} finally {
|
|
104
|
+
signal?.removeEventListener("abort", abort);
|
|
105
|
+
if (!started) releaseUnstarted(options, vision);
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
close: () => engine.close(),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -258,7 +258,7 @@ export async function searchSessions(sessionDir: string, query: string): Promise
|
|
|
258
258
|
REST handlers — pure (URL) => Response, no `ctx` dependency, same
|
|
259
259
|
convention as src/memory/rest.ts / src/hub-rest.ts (dispatched from
|
|
260
260
|
server.ts by path+method; unit-tested directly in
|
|
261
|
-
tests/session-search.test.ts without booting a model context).
|
|
261
|
+
tests/serve/session-search.test.ts without booting a model context).
|
|
262
262
|
──────────────────────────────────────────────────────────────────── */
|
|
263
263
|
|
|
264
264
|
function jsonOk<T extends object>(body: T, init?: ResponseInit): Response {
|
|
@@ -55,7 +55,7 @@ export function handleStaticRoute(
|
|
|
55
55
|
case "/curves": {
|
|
56
56
|
let html = assets.curvePage;
|
|
57
57
|
try {
|
|
58
|
-
html = readFileSync(new URL("../
|
|
58
|
+
html = readFileSync(new URL("../lab/curve/curve-designer.html", import.meta.url), "utf8");
|
|
59
59
|
} catch {
|
|
60
60
|
// Compiled binaries use the embedded copy.
|
|
61
61
|
}
|
|
@@ -66,7 +66,7 @@ export function handleStaticRoute(
|
|
|
66
66
|
case "/dag":
|
|
67
67
|
try {
|
|
68
68
|
const html = readFileSync(
|
|
69
|
-
new URL("
|
|
69
|
+
new URL("./assets/training-inference-map.html", import.meta.url),
|
|
70
70
|
"utf8",
|
|
71
71
|
);
|
|
72
72
|
return new Response(html, {
|
|
@@ -74,14 +74,14 @@ export function handleStaticRoute(
|
|
|
74
74
|
});
|
|
75
75
|
} catch {
|
|
76
76
|
return new Response(
|
|
77
|
-
"DAG map artifact not found
|
|
77
|
+
"DAG map artifact not found",
|
|
78
78
|
{ status: 404 },
|
|
79
79
|
);
|
|
80
80
|
}
|
|
81
81
|
case "/curve-terrain":
|
|
82
82
|
try {
|
|
83
83
|
const html = readFileSync(
|
|
84
|
-
new URL("
|
|
84
|
+
new URL("./assets/curve-terrain.html", import.meta.url),
|
|
85
85
|
"utf8",
|
|
86
86
|
);
|
|
87
87
|
return new Response(html, {
|
|
@@ -89,7 +89,7 @@ export function handleStaticRoute(
|
|
|
89
89
|
});
|
|
90
90
|
} catch {
|
|
91
91
|
return new Response(
|
|
92
|
-
"curve terrain artifact not found
|
|
92
|
+
"curve terrain artifact not found",
|
|
93
93
|
{ status: 404 },
|
|
94
94
|
);
|
|
95
95
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// TextCompletionStage: TextCompletionRequest in, InferenceRequest out.
|
|
2
|
+
// mlx_lm.server's raw text completion: NO chat template — the prompt string
|
|
3
|
+
// is tokenized directly (tokenizer.encode with the tokenizer's own
|
|
4
|
+
// special-token handling, exactly mlx-lm's `tokenizer.encode(request.prompt)`).
|
|
5
|
+
// Same admission / adapter / lane path as chat; no tool router or thinking
|
|
6
|
+
// splitter (raw text in, raw text out).
|
|
7
|
+
import type { ServingContext } from "./model-host";
|
|
8
|
+
import type { TextCompletionRequest } from "./chat-request";
|
|
9
|
+
import type { InferenceRequest } from "./inference-request";
|
|
10
|
+
import { RequestError } from "./pipeline";
|
|
11
|
+
import { RequestOwnership } from "./request-plan";
|
|
12
|
+
import type { RequestPrep } from "./request-prep";
|
|
13
|
+
import { StopMatcher, ThinkingTagSplitter, ToolAwareStream } from "./token-streams";
|
|
14
|
+
|
|
15
|
+
export class TextCompletionStage {
|
|
16
|
+
constructor(
|
|
17
|
+
private readonly ctx: ServingContext,
|
|
18
|
+
private readonly prep: RequestPrep,
|
|
19
|
+
private readonly contextLimit: number | null,
|
|
20
|
+
/** `--max-tokens` / the GLM plan's reservation. No invented fallback:
|
|
21
|
+
* unset runs to EOS or the admitted context (with no template an EOS
|
|
22
|
+
* may never come — that run is bounded by admission, the real limit). */
|
|
23
|
+
private readonly defaultGeneratedTokens: number | undefined,
|
|
24
|
+
private readonly defaultAdapter?: string,
|
|
25
|
+
) {}
|
|
26
|
+
|
|
27
|
+
async run(request: TextCompletionRequest, requestId?: string): Promise<InferenceRequest> {
|
|
28
|
+
const { ctx, prep } = this;
|
|
29
|
+
const body = request.params;
|
|
30
|
+
const id = requestId ?? `cmpl-${crypto.randomUUID()}`;
|
|
31
|
+
const promptIds = ctx.tokenizer.encode(body.prompt);
|
|
32
|
+
const ownership = new RequestOwnership();
|
|
33
|
+
const warnings: string[] = [];
|
|
34
|
+
const reject = (message: string): never => {
|
|
35
|
+
ownership.dispose();
|
|
36
|
+
throw new RequestError(400, message);
|
|
37
|
+
};
|
|
38
|
+
let options: ReturnType<RequestPrep["toOptions"]>;
|
|
39
|
+
try {
|
|
40
|
+
options = prep.toOptions(body as never);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
// bad logit_bias (non-numeric keys/values) — mlx-lm's coercion error
|
|
43
|
+
return reject((e as Error).message);
|
|
44
|
+
}
|
|
45
|
+
// Grammar-constrained decoding on raw completions too (response_format /
|
|
46
|
+
// guided_* / structured_outputs). The degrade path has no chat template
|
|
47
|
+
// to inject a system message into, so a degrade only emits the Warning
|
|
48
|
+
// header (no prompt injection) — documented gap vs the chat lane, which
|
|
49
|
+
// mirrors oMLX's text-completions behavior.
|
|
50
|
+
const grammarReq =
|
|
51
|
+
body.response_format != null || !!body.guided_grammar ||
|
|
52
|
+
!!body.guided_regex || !!body.guided_choice?.length ||
|
|
53
|
+
body.structured_outputs != null;
|
|
54
|
+
if (grammarReq) {
|
|
55
|
+
const g = await prep.compileGrammarForRequest(body as never);
|
|
56
|
+
if (g.controller) options.grammar = ownership.own(g.controller);
|
|
57
|
+
else if (g.degradeHint)
|
|
58
|
+
warnings.push(
|
|
59
|
+
`grammar not enforced: ${g.degradeHint} - no prompt injection on /v1/completions`);
|
|
60
|
+
}
|
|
61
|
+
// Unset = no request-level ceiling; admission clamps to the admitted
|
|
62
|
+
// context. DEVIATION from mlx_lm.server (which stops a defaulted
|
|
63
|
+
// request at 512): pass --max-tokens 512 to reproduce the reference.
|
|
64
|
+
const requestedMaxTokens = body.max_completion_tokens ?? body.max_tokens ??
|
|
65
|
+
this.defaultGeneratedTokens ?? Infinity;
|
|
66
|
+
let adapterIds: string[];
|
|
67
|
+
try {
|
|
68
|
+
adapterIds = ctx.adapters.resolveSpec(body.adapter ?? this.defaultAdapter);
|
|
69
|
+
} catch (e) {
|
|
70
|
+
return reject((e as Error).message);
|
|
71
|
+
}
|
|
72
|
+
const wantLogprobs = body.logprobs === true;
|
|
73
|
+
const topLogprobs =
|
|
74
|
+
typeof body.top_logprobs === "number" && body.top_logprobs > 0
|
|
75
|
+
? body.top_logprobs : 0;
|
|
76
|
+
return {
|
|
77
|
+
requestId: id,
|
|
78
|
+
stream: request.stream,
|
|
79
|
+
warnings,
|
|
80
|
+
plan: {
|
|
81
|
+
promptIds,
|
|
82
|
+
options,
|
|
83
|
+
requestedMaxTokens,
|
|
84
|
+
contextLimit: this.contextLimit,
|
|
85
|
+
stream: request.stream,
|
|
86
|
+
wantLogprobs,
|
|
87
|
+
topLogprobs,
|
|
88
|
+
adapterIds,
|
|
89
|
+
hasVision: false,
|
|
90
|
+
userSeed: body.seed !== undefined,
|
|
91
|
+
hasGrammar: !!options.grammar,
|
|
92
|
+
hasDraft: !!ctx.draft,
|
|
93
|
+
ownership,
|
|
94
|
+
},
|
|
95
|
+
pipeline: {
|
|
96
|
+
router: new ToolAwareStream(ctx.tokenizer, "plain", null),
|
|
97
|
+
stopper: new StopMatcher(options.stopSequences),
|
|
98
|
+
thinking: new ThinkingTagSplitter(false),
|
|
99
|
+
collectToolCalls: false,
|
|
100
|
+
},
|
|
101
|
+
idToToken: (tokenId) => ctx.tokenizer.idToToken(tokenId),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|