mlx-bun 0.0.13 → 0.3.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 -578
- package/bin/mlx-bun.mjs +1 -1
- package/docs/README.md +91 -0
- package/docs/{design → archive}/hlg-sampling.md +3 -3
- package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
- package/docs/{design → archive/investigations}/colibri-glm52-port.md +1 -1
- package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
- package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
- package/docs/{investigations → archive/investigations}/hlg-sampling-investigation.md +1 -1
- package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
- package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +92 -0
- package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
- package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
- package/docs/{planning → archive/planning}/chat-ui-vision.md +1 -1
- package/docs/{planning → archive/planning}/chunk-task-roadmap.md +1 -1
- package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +4 -4
- package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +1 -1
- package/docs/{planning → archive/planning}/release-notes-v0.0.9.md +1 -1
- package/docs/archive/planning/release-notes-v0.2.0.md +49 -0
- package/docs/{planning → archive/planning}/website-readme-pass-plan.md +1 -1
- package/docs/design/batching.md +569 -0
- package/docs/design/decode-speed-program.md +3178 -169
- package/docs/design/dreaming-nightly-pipeline.md +675 -282
- package/docs/design/generic-model-support.md +579 -334
- package/docs/design/kv-cache.md +680 -0
- package/docs/design/orpo-training.md +673 -1239
- package/docs/design/speculative-decoding.md +1627 -0
- package/docs/design/turboquant.md +2102 -0
- package/docs/design/unified-engine-frontier-plan.md +1831 -727
- package/docs/design/web-chat-redesign.md +666 -1083
- package/docs/planning/PRODUCT_ROADMAP.md +34 -1
- package/docs/planning/release-notes-v0.3.0.md +35 -0
- package/docs/planning/video-series.md +421 -0
- package/docs/reference/benchmarks.md +1162 -0
- package/docs/reference/cli.md +395 -149
- package/docs/reference/distribution.md +321 -181
- package/docs/reference/environment.md +348 -0
- package/docs/reference/glossary.md +39 -0
- package/docs/reference/library-api.md +580 -142
- package/docs/reference/memory.md +227 -64
- package/docs/reference/models.md +137 -6
- package/docs/reference/server-api.md +938 -422
- package/docs/reference/server-config.md +652 -320
- package/docs/reference/training.md +393 -254
- package/docs/reference/troubleshooting.md +166 -0
- package/package.json +10 -5
- package/src/admission-plan.ts +18 -0
- package/src/anthropic.ts +92 -3
- package/src/audio/decode.ts +2 -2
- package/src/audio/features.ts +2 -2
- package/src/backends/mlx/autoregressive.ts +108 -0
- package/src/backends/mlx/batch-group.ts +1646 -0
- package/src/backends/mlx/diffusion.ts +39 -0
- package/src/backends/mlx/draft-target.ts +47 -0
- package/src/backends/mlx/evaluation.ts +105 -0
- package/src/backends/mlx/fill-append.ts +45 -0
- package/src/backends/mlx/gateway-binding.ts +71 -0
- package/src/backends/mlx/graph.ts +38 -0
- package/src/backends/mlx/memory-client.ts +189 -0
- package/src/backends/mlx/memory-guard.ts +40 -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.ts +33 -0
- package/src/backends/mlx/request-policy.ts +20 -0
- package/src/backends/mlx/rollback.ts +51 -0
- package/src/backends/mlx/serial-executor.ts +273 -0
- package/src/backends/mlx/speculative.ts +114 -0
- package/src/backends/mlx/state-views.ts +26 -0
- package/src/backends/mlx/text-engine.ts +73 -0
- package/src/cli.ts +189 -61
- package/src/client.ts +66 -0
- package/src/config.ts +21 -4
- package/src/contracts/completion.ts +16 -0
- package/src/contracts/execution.ts +49 -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/resources.ts +18 -0
- package/src/contracts/scheduling.ts +27 -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 +51 -0
- package/src/engine/resources.ts +42 -0
- package/src/engine/scheduler.ts +67 -0
- package/src/engine/session.ts +247 -0
- package/src/eval/README.md +44 -1
- package/src/eval/kl.ts +263 -23
- package/src/eval/reference-logits.ts +207 -0
- package/src/eval/runner.ts +10 -79
- package/src/eval/tasks/bfcl.ts +2 -1
- package/src/eval/tasks/gsm8k.ts +2 -1
- package/src/eval/tasks/hashhop.ts +2 -1
- package/src/eval/tasks/humaneval.ts +5 -4
- package/src/eval/tasks/ifeval.ts +2 -1
- package/src/eval/tasks/mmlu.ts +2 -1
- package/src/expert-io.ts +3 -1
- package/src/expert-offload.ts +3 -1
- 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 +24 -43
- package/src/generate.ts +740 -337
- package/src/grammar.ts +14 -8
- package/src/harness-pi.ts +15 -34
- package/src/hub-rest.ts +4 -4
- package/src/index.ts +27 -0
- package/src/inference/denoising.ts +17 -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 +15 -14
- 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 +199 -0
- package/src/kv-store.ts +459 -234
- 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} +7 -5
- package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
- package/src/library.ts +40 -0
- package/src/lora.ts +18 -0
- package/src/media-fetch.ts +20 -4
- package/src/memory/article.ts +1 -1
- package/src/memory/chunk.ts +1 -1
- package/src/memory/model.ts +32 -170
- 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 +3 -4
- package/src/mlx/array.ts +9 -10
- package/src/mlx/compile.ts +12 -2
- package/src/mlx/ffi.ts +66 -22
- package/src/mlx/materialize.ts +23 -0
- package/src/mlx/metal-kernel.ts +10 -11
- package/src/mlx/ops.ts +64 -19
- 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/batched-mask.ts +9 -3
- package/src/model/batched-quant.ts +2 -2
- package/src/model/batched-rotating-quant.ts +45 -99
- package/src/model/batched-rotating-state.ts +73 -0
- package/src/model/batched-rotating.ts +57 -106
- package/src/model/batched-row-storage.ts +127 -0
- package/src/model/compiled-decode.ts +4 -3
- package/src/model/diffusion-gemma.ts +8 -8
- package/src/model/factory.ts +87 -49
- package/src/model/fingerprint.ts +1 -1
- package/src/model/flash-attention.ts +3 -3
- package/src/model/gemma4-base.ts +187 -17
- package/src/model/gemma4.ts +6 -6
- package/src/model/generated/gemma4-12b.ts +52 -148
- package/src/model/generated/gemma4-26b.ts +34 -94
- package/src/model/generated/gemma4-e4b.ts +28 -76
- package/src/model/glm52-cache.ts +19 -9
- package/src/model/glm52-dsa.ts +13 -9
- package/src/model/glm52-memory.ts +28 -1
- package/src/model/implementation.ts +69 -0
- package/src/model/minicpm5.ts +7 -8
- package/src/model/profile.ts +443 -0
- package/src/model/qwen-append.ts +12 -0
- package/src/model/qwen-conv.ts +52 -0
- package/src/model/qwen3-delta.ts +98 -2
- package/src/model/qwen3-mrope.ts +252 -0
- package/src/model/qwen3_5-checkpoint.ts +164 -0
- package/src/model/qwen3_5.ts +336 -60
- 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/universal/dense.ts +1 -1
- package/src/model/universal/modules.ts +8 -1
- package/src/native/frame_extract.swift +140 -0
- package/src/native-pack.ts +15 -7
- package/src/pi-provider.ts +6 -64
- package/src/pi-web.ts +14 -320
- package/src/prompt-cache.ts +97 -54
- package/src/quantize/allocator.ts +1 -1
- package/src/quantize/atomic-output.ts +38 -0
- package/src/quantize/calibration.ts +2 -1
- package/src/quantize/config-writer.ts +16 -3
- package/src/quantize/index.ts +28 -1
- package/src/quantize/job.ts +11 -0
- package/src/quantize/quantizer.ts +265 -100
- package/src/quantize/rotate.ts +603 -0
- package/src/quantize/safetensors-writer.ts +79 -1
- package/src/quantize/sensitivity.ts +41 -59
- package/src/quantize/trellis.ts +586 -0
- package/src/quantize/weight-transform.ts +292 -0
- package/src/responses.ts +130 -3
- package/src/runtime-config.ts +81 -0
- package/src/sampler.ts +276 -4
- package/src/serve/admin-routes.ts +184 -0
- package/src/serve/aux-routes.ts +132 -0
- package/src/serve/batch-scheduler.ts +8 -1558
- 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 +354 -0
- package/src/serve/completion-sink.ts +157 -0
- package/src/serve/discovery-routes.ts +204 -0
- package/src/serve/generation-gateway.ts +211 -243
- 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/kv-budget.ts +14 -0
- package/src/serve/lab-routes.ts +341 -0
- package/src/serve/lane-registry.ts +2 -1
- package/src/serve/model-admin-routes.ts +155 -0
- package/src/serve/model-binding.ts +43 -0
- package/src/serve/model-host.ts +512 -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/prompt-response-trace.ts +147 -0
- package/src/serve/request-plan.ts +162 -0
- package/src/serve/request-prep.ts +346 -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 +101 -0
- package/src/serve/text-completion-stage.ts +104 -0
- package/src/serve/token-streams.ts +519 -0
- package/src/server.ts +523 -3551
- package/src/spec/assistant-source.ts +10 -44
- package/src/spec/deepspec-source.ts +6 -6
- package/src/spec/dflash-source.ts +9 -8
- package/src/spec/dspark/ab-stats.ts +3 -3
- package/src/spec/dspark/calibration.ts +2 -2
- package/src/spec/dspark/deepspec-module.ts +2 -2
- 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 +5 -4
- 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-source.ts +9 -1
- package/src/spec/ngram-source.ts +1 -1
- package/src/spec/prefix-state.ts +45 -0
- package/src/spec/qwen-mtp-source.ts +528 -0
- package/src/spec/serve-loop.ts +179 -213
- package/src/spec/source.ts +42 -10
- package/src/spec/two-model.ts +1 -1
- package/src/ssd-cache.ts +95 -24
- package/src/ssd-durability.ts +207 -0
- package/src/tool-call.ts +51 -14
- package/src/train/flash-cce.ts +14 -13
- package/src/train/forward.ts +38 -1
- package/src/train/loss.ts +3 -2
- package/src/train/prefix-shared.ts +5 -1
- package/src/train/segmented.ts +9 -6
- package/src/train/trainer.ts +9 -8
- package/src/vision/preprocess.ts +1 -1
- package/src/vision/prompt.ts +48 -2
- package/src/vision/qwen3vl-preprocess.ts +409 -0
- package/src/vision/qwen3vl-prompt.ts +196 -0
- package/src/vision/qwen3vl-tower.ts +555 -0
- package/src/vision/video-frames.ts +148 -0
- package/src/web/app.html +1 -1
- package/src/web/app.js +15 -6
- package/src/web/src/adapters-panel.ts +3 -3
- package/src/web/src/assistant.ts +2 -36
- package/src/web/src/chat.ts +16 -9
- 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 +134 -33
- 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 -268
- 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-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 -189
- 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 -288
- 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/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/investigations/curve-runs/bisector-route.json +0 -98
- package/docs/investigations/curve-runs/bisector-trace.json +0 -1393
- package/docs/investigations/curve-runs/curve-terrain.json +0 -1179
- package/docs/investigations/curve-runs/curve-terrain.svg +0 -42
- package/docs/investigations/hlg-ab.html +0 -34
- package/docs/investigations/hlg-explorer.html +0 -238
- package/docs/investigations/hlg-figs/cliff.svg +0 -1
- package/docs/investigations/hlg-figs/cross.svg +0 -1
- package/docs/investigations/hlg-figs/edges.svg +0 -1
- package/docs/investigations/hlg-figs/k20-grids.svg +0 -1
- package/docs/investigations/hlg-figs/k20-peaks.svg +0 -1
- package/docs/investigations/hlg-figs/lw-curve.svg +0 -1
- package/docs/investigations/hlg-figs/terrain.svg +0 -1
- package/docs/investigations/hlg-report.html +0 -262
- package/docs/investigations/hlg-runs/hlg-ab.json +0 -149
- package/docs/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
- package/docs/investigations/hlg-runs/hlg-blind.json +0 -107
- package/docs/investigations/hlg-runs/hlg-cliff.json +0 -197
- package/docs/investigations/hlg-runs/hlg-cross.json +0 -505
- package/docs/investigations/hlg-runs/hlg-edge.json +0 -388
- package/docs/investigations/hlg-runs/hlg-eval1.json +0 -25
- package/docs/investigations/hlg-runs/hlg-frontier.json +0 -86
- package/docs/investigations/hlg-runs/hlg-grid.json +0 -242
- package/docs/investigations/hlg-runs/hlg-grid2.json +0 -343
- package/docs/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
- package/docs/investigations/hlg-runs/hlg-map.json +0 -383
- package/docs/investigations/hlg-runs/run0-original.log +0 -159
- package/docs/investigations/hlg-runs/runA-recommended.log +0 -131
- package/docs/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
- package/docs/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
- package/docs/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
- package/docs/investigations/hlg-runs/runAD-ab-samples.log +0 -8
- package/docs/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
- package/docs/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
- package/docs/investigations/hlg-runs/runAG-eval-config2.log +0 -16
- package/docs/investigations/hlg-runs/runB-gain-variants.log +0 -192
- package/docs/investigations/hlg-runs/runC-pivots.log +0 -162
- package/docs/investigations/hlg-runs/runD-oetf.log +0 -132
- package/docs/investigations/hlg-runs/runE-eotf.log +0 -162
- package/docs/investigations/hlg-runs/runF-shaper-working.log +0 -86
- package/docs/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
- package/docs/investigations/hlg-runs/runH-wsweep.log +0 -176
- package/docs/investigations/hlg-runs/runI-asweep.log +0 -176
- package/docs/investigations/hlg-runs/runJ-knobmap.log +0 -49
- package/docs/investigations/hlg-runs/runK-frontier.log +0 -19
- package/docs/investigations/hlg-runs/runL-widemap.log +0 -65
- package/docs/investigations/hlg-runs/runM-frontier-emb.log +0 -15
- package/docs/investigations/hlg-runs/runN-verify.log +0 -116
- package/docs/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
- package/docs/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
- package/docs/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
- package/docs/investigations/hlg-runs/runR-blind-transcript.log +0 -79
- package/docs/investigations/hlg-runs/runS-cross-coherence.log +0 -33
- package/docs/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
- package/docs/investigations/hlg-runs/runU-cross-12b.log +0 -33
- package/docs/investigations/hlg-runs/runV-lw-e4b.log +0 -22
- package/docs/investigations/hlg-runs/runW-lw-12b.log +0 -22
- package/docs/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
- package/docs/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
- package/docs/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
- package/docs/planning/IDEAS.md +0 -69
- package/docs/reference/embedding.md +0 -197
- package/docs/reference/features-matrix.md +0 -100
- package/docs/reference/orpo-quickstart.md +0 -135
- package/src/flags.ts +0 -13
- /package/docs/{investigations → archive/investigations}/chunk-finetune-experiment.md +0 -0
- /package/docs/{investigations → archive/investigations}/colibri-oracle-pin.md +0 -0
- /package/docs/{investigations → archive/investigations}/curve-bisector-routing.md +0 -0
- /package/docs/{investigations → archive/investigations}/decode-roofline-lookagain.md +0 -0
- /package/docs/{investigations → archive/investigations}/dspark-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/expert-offload-single-user-moe.md +0 -0
- /package/docs/{investigations → archive/investigations}/indexshare-performance-spike.md +0 -0
- /package/docs/{investigations → archive/investigations}/kernel-perf-review-2026-07.md +0 -0
- /package/docs/{investigations → archive/investigations}/lab-build-journal.md +0 -0
- /package/docs/{investigations → archive/investigations}/openwiki-evaluation.md +0 -0
- /package/docs/{investigations → archive/investigations}/orpo-base-uf-experiment-and-directions.md +0 -0
- /package/docs/{investigations → archive/investigations}/orpo-flash-cce-pin-leak.md +0 -0
- /package/docs/{investigations → archive/investigations}/orpo-uf-testing-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/pi-builtin-investigation.md +0 -0
- /package/docs/{investigations → archive/investigations}/segmented-backward-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/starter-model-port-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/steel-flash-cce-handoff.md +0 -0
- /package/docs/{investigations → archive/investigations}/trainer-validation-experiment.md +0 -0
- /package/docs/{planning → archive/planning}/chat-ui-vision-memory-first.md +0 -0
- /package/docs/{planning → archive/planning}/journal.md +0 -0
- /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.10.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.11.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.12.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.0.13.md +0 -0
- /package/docs/{planning → archive/planning}/web-ui-pass-plan.md +0 -0
- /package/{docs/investigations → src/serve/assets}/curve-terrain.html +0 -0
- /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { AdmissionRejected } from "../engine/admission";
|
|
2
|
+
// The HTTP end of the pipeline: build + admit a request (errors → a JSON
|
|
3
|
+
// error response in the surface's own shape), then run it and write the
|
|
4
|
+
// result as JSON, or as protocol frames while events arrive. One writer for
|
|
5
|
+
// every surface — the protocol object (OpenAI chat / text, Anthropic,
|
|
6
|
+
// Responses) and the error formatter are the only things that differ.
|
|
7
|
+
import type { CompletionStreamProtocol } from "./completion-sink";
|
|
8
|
+
import type { CompletionUsage } from "./completion-executor";
|
|
9
|
+
import type {
|
|
10
|
+
AdmittedRequest, InferenceRequest, InferenceResult, InferenceStage,
|
|
11
|
+
} from "./inference-request";
|
|
12
|
+
import { openAiSummaryUsage, openAiUsage } from "./openai-wire";
|
|
13
|
+
import { RequestError } from "./pipeline";
|
|
14
|
+
import type { PromptResponseTrace } from "./prompt-response-trace";
|
|
15
|
+
|
|
16
|
+
export type ErrorFormatter = (status: number, message: string, body: Record<string, unknown>) => Response;
|
|
17
|
+
|
|
18
|
+
/** OpenAI-shaped error body: `{error: {message, …}}`. */
|
|
19
|
+
export const openAiError: ErrorFormatter = (status, _message, body) =>
|
|
20
|
+
Response.json({ error: body }, { status });
|
|
21
|
+
|
|
22
|
+
/** RequestError → the surface's error response; anything else is a 500 with
|
|
23
|
+
* its stack logged (a 500 with no server-side trace is undebuggable). */
|
|
24
|
+
export function errorResponse(e: unknown, context: string, format: ErrorFormatter = openAiError): Response {
|
|
25
|
+
if (e instanceof AdmissionRejected) return format(429, e.message, { message: e.message, type: "resource_admission", code: "queue_full" });
|
|
26
|
+
if (e instanceof RequestError) return format(e.status, e.message, e.body);
|
|
27
|
+
console.error(`[serve] 500 on ${context}:\n${(e as Error).stack ?? e}`);
|
|
28
|
+
const message = (e as Error).message;
|
|
29
|
+
return format(500, message, { message });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Build the InferenceRequest (a stage's `run`) and admit it, under the
|
|
33
|
+
* request's prompt-prepare trace span. A refusal at either step is the
|
|
34
|
+
* surface's error response, never a thrown exception past this point. */
|
|
35
|
+
export async function admit(
|
|
36
|
+
stage: InferenceStage,
|
|
37
|
+
build: () => Promise<InferenceRequest>,
|
|
38
|
+
trace: PromptResponseTrace | undefined,
|
|
39
|
+
context: string,
|
|
40
|
+
format: ErrorFormatter = openAiError,
|
|
41
|
+
): Promise<{ admitted: AdmittedRequest } | { response: Response }> {
|
|
42
|
+
const closePrepare = trace?.begin("request.prompt_prepare");
|
|
43
|
+
try {
|
|
44
|
+
const admitted = stage.admit(await build());
|
|
45
|
+
closePrepare?.();
|
|
46
|
+
return { admitted };
|
|
47
|
+
} catch (e) {
|
|
48
|
+
closePrepare?.();
|
|
49
|
+
trace?.finish("error", { stage: "prepare_completion" });
|
|
50
|
+
return { response: errorResponse(e, context, format) };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const warningHeaders = (admitted: AdmittedRequest): Record<string, string> =>
|
|
55
|
+
admitted.warnings.length ? { Warning: admitted.warnings.join(", ") } : {};
|
|
56
|
+
|
|
57
|
+
/** Run to completion, answer with `json(result)`. */
|
|
58
|
+
export async function respondJson(
|
|
59
|
+
stage: InferenceStage,
|
|
60
|
+
admitted: AdmittedRequest,
|
|
61
|
+
json: (result: InferenceResult) => unknown,
|
|
62
|
+
signal: AbortSignal,
|
|
63
|
+
trace?: PromptResponseTrace,
|
|
64
|
+
format: ErrorFormatter = openAiError,
|
|
65
|
+
): Promise<Response> {
|
|
66
|
+
try {
|
|
67
|
+
const result = await stage.run(admitted, { signal, ...(trace ? { trace } : {}) });
|
|
68
|
+
trace?.mark("response.final_write");
|
|
69
|
+
const response = Response.json(json(result), { headers: warningHeaders(admitted) });
|
|
70
|
+
trace?.finish("success");
|
|
71
|
+
return response;
|
|
72
|
+
} catch (e) {
|
|
73
|
+
trace?.finish(signal.aborted ? "abort" : "error");
|
|
74
|
+
return errorResponse(e, `request ${admitted.requestId}`, format);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Stream protocol frames as the model produces events. An error after the
|
|
79
|
+
* stream opened is the protocol's error frame(s) (the OpenAI protocols end
|
|
80
|
+
* the stream there; Anthropic/Responses also emit a terminal frame with
|
|
81
|
+
* the usage accumulated so far). */
|
|
82
|
+
export function respondStream(
|
|
83
|
+
stage: InferenceStage,
|
|
84
|
+
admitted: AdmittedRequest,
|
|
85
|
+
protocol: CompletionStreamProtocol,
|
|
86
|
+
signal: AbortSignal,
|
|
87
|
+
trace?: PromptResponseTrace,
|
|
88
|
+
heartbeatMs = 15_000,
|
|
89
|
+
): Response {
|
|
90
|
+
const streamAbort = new AbortController();
|
|
91
|
+
const generationSignal = AbortSignal.any([signal, streamAbort.signal]);
|
|
92
|
+
let cancelled = false;
|
|
93
|
+
const stream = new ReadableStream<Uint8Array>({
|
|
94
|
+
start(controller) {
|
|
95
|
+
const enc = new TextEncoder();
|
|
96
|
+
const emit = (frames: string[]) => {
|
|
97
|
+
if (generationSignal.aborted) return;
|
|
98
|
+
for (const frame of frames) controller.enqueue(enc.encode(frame));
|
|
99
|
+
};
|
|
100
|
+
let latestUsage: Readonly<CompletionUsage> | null = null;
|
|
101
|
+
let wroteFirstEvent = false;
|
|
102
|
+
let outcome: "success" | "error" | "abort" = "success";
|
|
103
|
+
void (async () => {
|
|
104
|
+
// Tool-aware streams can intentionally buffer a large tool-call JSON
|
|
105
|
+
// body until it parses as one complete call. Keep the HTTP connection
|
|
106
|
+
// active during that otherwise silent interval; SSE comments are
|
|
107
|
+
// ignored by clients and do not alter the completion event stream.
|
|
108
|
+
const heartbeat = setInterval(() => emit([": keep-alive\n\n"]), heartbeatMs);
|
|
109
|
+
try {
|
|
110
|
+
// The gateway owns lane selection + GPU exclusivity; this body
|
|
111
|
+
// runs per-request (concurrently in batched mode, each writing
|
|
112
|
+
// its own stream — the per-row fan-out).
|
|
113
|
+
emit(protocol.start());
|
|
114
|
+
const result = await stage.run(admitted, {
|
|
115
|
+
signal: generationSignal,
|
|
116
|
+
...(trace ? { trace } : {}),
|
|
117
|
+
onEvents: (events) => {
|
|
118
|
+
if (events.length && !wroteFirstEvent) {
|
|
119
|
+
wroteFirstEvent = true;
|
|
120
|
+
trace?.mark("response.first_write");
|
|
121
|
+
}
|
|
122
|
+
emit(protocol.addEvents([...events]));
|
|
123
|
+
},
|
|
124
|
+
onUsageProgress: (usage) => { latestUsage = usage; },
|
|
125
|
+
});
|
|
126
|
+
emit(protocol.finish(result.finishReason, openAiSummaryUsage(result)));
|
|
127
|
+
trace?.mark("response.final_write");
|
|
128
|
+
} catch (e) {
|
|
129
|
+
outcome = generationSignal.aborted ? "abort" : "error";
|
|
130
|
+
if (!generationSignal.aborted) {
|
|
131
|
+
emit([
|
|
132
|
+
...protocol.error((e as Error).message),
|
|
133
|
+
...protocol.finish("stop", latestUsage ? openAiUsage(latestUsage) : {}),
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
} finally {
|
|
137
|
+
clearInterval(heartbeat);
|
|
138
|
+
trace?.finish(outcome);
|
|
139
|
+
if (!cancelled) {
|
|
140
|
+
if (generationSignal.aborted) controller.error(generationSignal.reason);
|
|
141
|
+
else controller.close();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
})();
|
|
145
|
+
},
|
|
146
|
+
cancel(reason) {
|
|
147
|
+
cancelled = true;
|
|
148
|
+
streamAbort.abort(reason);
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
return new Response(stream, {
|
|
152
|
+
headers: {
|
|
153
|
+
"content-type": "text/event-stream",
|
|
154
|
+
"cache-control": "no-cache",
|
|
155
|
+
connection: "keep-alive",
|
|
156
|
+
...warningHeaders(admitted),
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// InferenceRequest: a prompt (token ids + optional media embeddings) with
|
|
2
|
+
// resolved generation settings, ready for a model. InferenceStage first
|
|
3
|
+
// ADMITS it (memory ceiling → reject or clamp; the resolved settings become
|
|
4
|
+
// an opaque, single-use plan) and then RUNS it — the gateway routes it to
|
|
5
|
+
// the lane it belongs to (serial / batch / spec) and the executor returns
|
|
6
|
+
// the terminal InferenceResult. Every completion surface — chat, raw text,
|
|
7
|
+
// Anthropic, Responses — produces one of these and reads one of those.
|
|
8
|
+
import {
|
|
9
|
+
CompletionRejected,
|
|
10
|
+
prepareCompletion,
|
|
11
|
+
type CompletionExecutor,
|
|
12
|
+
type CompletionPreparation,
|
|
13
|
+
type CompletionSummary,
|
|
14
|
+
type PreparedCompletion,
|
|
15
|
+
} from "./completion-executor";
|
|
16
|
+
import { createTimedFlowControl } from "./completion-sink";
|
|
17
|
+
import { runtimeValue } from "../runtime-config";
|
|
18
|
+
import { RequestError, type RunControl } from "./pipeline";
|
|
19
|
+
|
|
20
|
+
export interface InferenceRequest
|
|
21
|
+
extends Omit<CompletionPreparation, "createFlowControl" | "onPlacement"> {
|
|
22
|
+
/** SSE consumers pace event delivery (timed flow control); JSON consumers
|
|
23
|
+
* take the whole result at the end. */
|
|
24
|
+
stream: boolean;
|
|
25
|
+
/** Non-fatal notes for the response (`Warning` header): e.g. a grammar
|
|
26
|
+
* that failed to compile and degraded to prompt injection. */
|
|
27
|
+
warnings: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** An admitted request: its plan is sealed and it can run exactly once. */
|
|
31
|
+
export interface AdmittedRequest {
|
|
32
|
+
requestId: string;
|
|
33
|
+
warnings: string[];
|
|
34
|
+
prepared: PreparedCompletion;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type InferenceResult = CompletionSummary;
|
|
38
|
+
|
|
39
|
+
export class InferenceStage {
|
|
40
|
+
constructor(private readonly executor: Pick<CompletionExecutor, "execute">) {}
|
|
41
|
+
|
|
42
|
+
/** Admission: throws RequestError(400, memory_admission) when the prompt
|
|
43
|
+
* leaves no room to generate inside the safe context; otherwise clamps
|
|
44
|
+
* and seals the plan. Owned resources dispose on rejection. */
|
|
45
|
+
admit(request: InferenceRequest): AdmittedRequest {
|
|
46
|
+
const { stream, warnings, ...preparation } = request;
|
|
47
|
+
try {
|
|
48
|
+
const prepared = prepareCompletion({
|
|
49
|
+
...preparation,
|
|
50
|
+
...(stream
|
|
51
|
+
? {
|
|
52
|
+
createFlowControl: ({ mechanism }: { mechanism: string }) =>
|
|
53
|
+
createTimedFlowControl(mechanism === "serial"),
|
|
54
|
+
}
|
|
55
|
+
: {}),
|
|
56
|
+
onPlacement: ({ mechanism, shape }) => {
|
|
57
|
+
if (runtimeValue("MLX_BUN_LANE_DEBUG") === "1")
|
|
58
|
+
console.error(
|
|
59
|
+
`[scheduling] mechanism=${mechanism} shape=${JSON.stringify(shape)} ` +
|
|
60
|
+
`t=${Date.now() % 100000}`,
|
|
61
|
+
);
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
return { requestId: request.requestId, warnings, prepared };
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (!(error instanceof CompletionRejected)) throw error;
|
|
67
|
+
throw new RequestError(error.status, error.error.message, error.error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
run(admitted: AdmittedRequest, control: RunControl = {}): Promise<InferenceResult> {
|
|
72
|
+
return this.executor.execute(admitted.prepared, {
|
|
73
|
+
...(control.signal ? { signal: control.signal } : {}),
|
|
74
|
+
...(control.trace ? { trace: control.trace } : {}),
|
|
75
|
+
...(control.onEvents ? { onEvents: control.onEvents } : {}),
|
|
76
|
+
...(control.onUsageProgress ? { onUsageProgress: control.onUsageProgress } : {}),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|