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,593 +0,0 @@
|
|
|
1
|
-
# PRODUCT ROADMAP
|
|
2
|
-
|
|
3
|
-
Working notes for the product shape of mlx-bun. This is intentionally
|
|
4
|
-
less settled than PLAN.md: PLAN is the engineering contract; this file is
|
|
5
|
-
the evolving UI/UX/DX north star.
|
|
6
|
-
|
|
7
|
-
## Product north star
|
|
8
|
-
|
|
9
|
-
Josh's guiding principle for the entire project is "The absolute BEST local
|
|
10
|
-
AI experience on a mac". This governs installation, application development,
|
|
11
|
-
everyday use and inference performance.
|
|
12
|
-
|
|
13
|
-
Offer multiple simple installation methods without asking users to manage
|
|
14
|
-
a Python virtual environment. Let developers import local AI into their
|
|
15
|
-
applications without managing a separate inference sidecar. Make JavaScript
|
|
16
|
-
and TypeScript first-class ways to build with local AI, without requiring
|
|
17
|
-
Python. Make more capable models practical on the same Mac and reduce the
|
|
18
|
-
time users wait for successful results.
|
|
19
|
-
|
|
20
|
-
Every workstream must serve that experience. Evaluate engineering choices
|
|
21
|
-
by the setup, integration and operating burden they remove, as well as the
|
|
22
|
-
quality, reliability, speed and hardware efficiency they deliver. Research
|
|
23
|
-
and publication can support the project; user benefit determines priority.
|
|
24
|
-
|
|
25
|
-
Make the answer to "what is the best way to use local AI on my Mac?"
|
|
26
|
-
boringly simple:
|
|
27
|
-
|
|
28
|
-
```sh
|
|
29
|
-
mlx-bun
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
The user should not need to research Hugging Face variants, quantization
|
|
33
|
-
formats, context windows, Python environments, server commands, or agent
|
|
34
|
-
provider config before they can try local AI. They should install one
|
|
35
|
-
binary, run one command, wait for one resumable model download, and get a
|
|
36
|
-
working local chat UI plus a local AI server.
|
|
37
|
-
|
|
38
|
-
The intended first-run shape is product, not demo: start with the tiny
|
|
39
|
-
welcoming model quickly, begin the stronger recommended model download in the
|
|
40
|
-
background, and graduate the user into the best default profile for their
|
|
41
|
-
actual Mac without requiring them to learn the model zoo first.
|
|
42
|
-
|
|
43
|
-
The runtime can still expose every advanced knob. The default path should
|
|
44
|
-
not require them.
|
|
45
|
-
|
|
46
|
-
## Four product faces
|
|
47
|
-
|
|
48
|
-
The same runtime has to support four related but distinct jobs:
|
|
49
|
-
|
|
50
|
-
1. **Local AI product** — the one-command experience for someone who just wants
|
|
51
|
-
useful local AI. This path should be opinionated, benchmarked, and boringly
|
|
52
|
-
reliable.
|
|
53
|
-
2. **Library for app developers** — the embeddable TypeScript/MLX layer for
|
|
54
|
-
Bun, Tauri, Electron, and desktop tools that want local inference without a
|
|
55
|
-
Python sidecar.
|
|
56
|
-
3. **AI lab for researchers** — the place where parity, evals, kernels,
|
|
57
|
-
compiled graphs, ORPO, LoRA adapters, and model experiments can happen in
|
|
58
|
-
the same stack that serves the result.
|
|
59
|
-
4. **Autonomous background agent runtime** — the always-available local server
|
|
60
|
-
for scripts, recurring tasks, personal tools, and per-request adapter
|
|
61
|
-
routing.
|
|
62
|
-
|
|
63
|
-
These are not separate products. They are one runtime with progressive
|
|
64
|
-
disclosure: appliance defaults at the front, sharp instruments underneath.
|
|
65
|
-
|
|
66
|
-
## The three modes (the organizing design law)
|
|
67
|
-
|
|
68
|
-
mlx-bun is published. Existing commands, flags, and package exports are
|
|
69
|
-
compatibility commitments; changes need documented migration behavior.
|
|
70
|
-
Where an mlx-lm flag has matching semantics, prefer its established name.
|
|
71
|
-
The CLI serves three audiences through one set of verbs, with more explicit
|
|
72
|
-
configuration available as users need it:
|
|
73
|
-
|
|
74
|
-
1. **Automatic mode** — first-time local-AI users. `mlx-bun` (and bare
|
|
75
|
-
verbs) with zero flags. Smart, sane defaults from the device-profile
|
|
76
|
-
table (see Core idea). Typing to a chatbot in a web UI in under a
|
|
77
|
-
minute, with no knowledge of HF variants, quant formats, or context
|
|
78
|
-
windows required.
|
|
79
|
-
2. **Compat mode** — people moving over from mlx-lm. The same verbs,
|
|
80
|
-
plus dotted aliases (`mlx-bun.server` *is* `mlx-bun serve`), using
|
|
81
|
-
mlx-lm's flag vocabulary, so existing muscle memory and scripts port
|
|
82
|
-
with a one-token rename. mlx-lm is canonical because it is the
|
|
83
|
-
default Apple references at WWDC and outweighs the alternative by
|
|
84
|
-
~425× monthly installs (1.64M vs 3.85k; mlx-lm 5.8k stars / 765
|
|
85
|
-
forks; mlx-optiq has no public repo — measured 2026-06-12).
|
|
86
|
-
3. **Stick-shift mode** — power users and researchers. The full knob
|
|
87
|
-
surface: every mlx-lm flag, every optiq feature, plus our own
|
|
88
|
-
envelope-pushing ones, all exposed and composable. Build the exact
|
|
89
|
-
system you want.
|
|
90
|
-
|
|
91
|
-
### Laws that keep the three modes coherent
|
|
92
|
-
|
|
93
|
-
- **One surface, mlx-lm vocabulary.** The dotted form is a pure alias
|
|
94
|
-
of the space form. Adopt mlx-lm's flag names wherever they are the
|
|
95
|
-
standard; only name a flag ourselves where mlx-lm has no concept for
|
|
96
|
-
it (and there we are free to improve on optiq's name, not bound to
|
|
97
|
-
it).
|
|
98
|
-
- **Compatibility = superset, never intersection.** Every documented
|
|
99
|
-
mlx-lm flag/verb behaves faithfully so scripts drop in unchanged. We
|
|
100
|
-
never subtract or gate a capability we already have for free to
|
|
101
|
-
resemble an upstream — e.g. we serve OpenAI + Anthropic + Responses
|
|
102
|
-
from one server, and that stays on: it costs nothing and is invisible
|
|
103
|
-
to a beginner.
|
|
104
|
-
- **Gate only on conflict.** A capability is always on UNLESS leaving
|
|
105
|
-
it on would degrade the automatic or compat experience (it changes
|
|
106
|
-
output determinism, trades quality, or surprises a script). Only then
|
|
107
|
-
does it move behind a stick-shift flag. This is rule 3 yielding to
|
|
108
|
-
rules 1 and 2.
|
|
109
|
-
- **optiq is a feature set to absorb, not a flag dialect to honor.**
|
|
110
|
-
Its distinctive features (sensitivity mixed-precision convert,
|
|
111
|
-
per-layer KV sensitivity profiling, LoRA rank scaling, dual-protocol
|
|
112
|
-
serving, latency prediction, the Lab UI) graft onto the mlx-lm spine
|
|
113
|
-
as additive flags and a few new verbs.
|
|
114
|
-
|
|
115
|
-
### Status (2026-06-12; compat surface design remains open as of 2026-06-17)
|
|
116
|
-
|
|
117
|
-
The compat layer does not exist yet: today's commands (`serve`, `fit`,
|
|
118
|
-
`benchmark`, `evals`, `get`/`scan`/`ls`, `pi`, `harness`) are ad-hoc,
|
|
119
|
-
not a designed mlx-lm-matching surface — though their flags already
|
|
120
|
-
overlap mlx-lm/optiq heavily, so this is mostly rename-and-confirm, not
|
|
121
|
-
migration. The work: design the full surface against mlx-lm vocabulary,
|
|
122
|
-
reconcile the existing commands into it, and fill the capability matrix
|
|
123
|
-
behind it (convert/quantize, LoRA training, eval/perplexity, fuse,
|
|
124
|
-
cache_prompt, upload/share). Decomposed into phases in PLAN.md.
|
|
125
|
-
|
|
126
|
-
## Core idea: finite matrix runtime
|
|
127
|
-
|
|
128
|
-
The local-AI problem is not continuous for Mac users. MLX means Apple Silicon,
|
|
129
|
-
and Apple ships a finite set of real chip/RAM/bandwidth combinations. The
|
|
130
|
-
supported model universe is also curated. For each physical device profile and
|
|
131
|
-
model snapshot, we can research and preselect the best known model artifact,
|
|
132
|
-
context target, KV mode, memory budget, kernel route, graph route, and runtime
|
|
133
|
-
flags.
|
|
134
|
-
|
|
135
|
-
That means first-run behavior can be a measured lookup table, not a wizard or
|
|
136
|
-
an exploratory benchmark:
|
|
137
|
-
|
|
138
|
-
```text
|
|
139
|
-
detect exact Mac profile
|
|
140
|
-
fingerprint the model snapshot
|
|
141
|
-
choose the task mode: chat, vision, tool loop, adapter, training, eval
|
|
142
|
-
look up the measured execution plan
|
|
143
|
-
download/resume the exact model artifact
|
|
144
|
-
start the tuned local server
|
|
145
|
-
open the built-in UI
|
|
146
|
-
show how to connect external tools and harnesses
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
The current `fit` endpoint is the nucleus of this idea: it already reasons over
|
|
150
|
-
real Apple Silicon profiles, model bytes, KV bytes, context, and predicted
|
|
151
|
-
decode. The product version should evolve from "does this fit?" into:
|
|
152
|
-
|
|
153
|
-
```text
|
|
154
|
-
device profile + model checksum + task mode + live memory pressure
|
|
155
|
-
-> recommended execution plan
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
Execution plans can eventually include specialized graph variants, fused kernel
|
|
159
|
-
routes, prompt-cache policy, adapter policy, safe context limits, expected
|
|
160
|
-
decode/TTFT, and user-facing rationale. The research work feeds the table. The
|
|
161
|
-
table feeds the user.
|
|
162
|
-
|
|
163
|
-
## Recommended profiles
|
|
164
|
-
|
|
165
|
-
Initial profile work should stay narrow and excellent. Start with the
|
|
166
|
-
Gemma 4 OptiQ family and expand only when the project has a better answer.
|
|
167
|
-
|
|
168
|
-
Candidate shape:
|
|
169
|
-
|
|
170
|
-
| Device profile | Default model | Intent |
|
|
171
|
-
|---|---|---|
|
|
172
|
-
| MacBook Air / 16 GB | `mlx-community/gemma-4-e4b-it-OptiQ-4bit` | Fast first local-AI experience. |
|
|
173
|
-
| MacBook Pro / 24-32 GB | `mlx-community/gemma-4-12B-it-OptiQ-4bit` | Strong default chat/agent model. |
|
|
174
|
-
| Mac Studio / 64 GB | `mlx-community/gemma-4-26B-A4B-it-OptiQ-4bit` | Larger local-agent profile. |
|
|
175
|
-
|
|
176
|
-
Exact model choices, context lengths, and flags are not frozen here. They
|
|
177
|
-
should be updated from benchmarks, evals, fit predictions, and real use.
|
|
178
|
-
|
|
179
|
-
Each profile should eventually carry:
|
|
180
|
-
|
|
181
|
-
```ts
|
|
182
|
-
{
|
|
183
|
-
id: "macbook-pro-24gb",
|
|
184
|
-
model: "mlx-community/gemma-4-12B-it-OptiQ-4bit",
|
|
185
|
-
context: 65536,
|
|
186
|
-
kv: "mixed",
|
|
187
|
-
memoryBudgetBytes: "...",
|
|
188
|
-
compiledDecode: true,
|
|
189
|
-
expectedDecodeTps: 30,
|
|
190
|
-
expectedTtftMs: 100,
|
|
191
|
-
label: "Recommended for this Mac",
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
The important rule: an optimization matters for product defaults when it
|
|
196
|
-
changes a device-tier decision, unlocks a larger useful context window,
|
|
197
|
-
keeps decode above a user-visible threshold, improves quality at the same
|
|
198
|
-
budget, or prevents failure. Saving memory for its own sake is secondary.
|
|
199
|
-
|
|
200
|
-
## Specialization strategy
|
|
201
|
-
|
|
202
|
-
For the curated product path, it is acceptable to trade more work up front for a
|
|
203
|
-
better hot path later. The Mac is known, the model snapshot is known, and the
|
|
204
|
-
task mode is known. That lets us precompute or cache exact plans instead of
|
|
205
|
-
shipping every decision to runtime.
|
|
206
|
-
|
|
207
|
-
Candidate plan fields:
|
|
208
|
-
|
|
209
|
-
- Model checksum and architecture fingerprint.
|
|
210
|
-
- Apple Silicon profile: chip, unified memory, bandwidth tier, GPU/CPU shape.
|
|
211
|
-
- Context buckets and fixed-shape cache layouts.
|
|
212
|
-
- Kernel choices: MLX built-ins, MLX fast paths, custom Metal kernels, or
|
|
213
|
-
eager fallback.
|
|
214
|
-
- Graph choices: eager, compiled exact-shape graph, compiled bucketed graph,
|
|
215
|
-
or prebuilt graph table.
|
|
216
|
-
- Adapter choices: none, single LoRA, stacked LoRA, task-routed LoRA.
|
|
217
|
-
- Measured results: TTFT, decode tok/s, peak memory, failure envelope.
|
|
218
|
-
|
|
219
|
-
This is where loop unrolling, branch deletion, static DAG extraction, fused
|
|
220
|
-
kernels, and shape-specialized compiled graphs become product features rather
|
|
221
|
-
than abstract optimizations. They matter when they let the default profile be
|
|
222
|
-
faster, larger, more stable, or better aligned without asking the user to tune
|
|
223
|
-
anything.
|
|
224
|
-
|
|
225
|
-
## First-run UX
|
|
226
|
-
|
|
227
|
-
The no-args command should be the friendly path:
|
|
228
|
-
|
|
229
|
-
```sh
|
|
230
|
-
mlx-bun
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
Likely behavior:
|
|
234
|
-
|
|
235
|
-
1. Detect the hardware profile. *(not yet: `recommendedRepoId()` at `src/fit.ts:86` returns `DEFAULT_REPO_ID` unconditionally — device-profile lookup table is unimplemented)*
|
|
236
|
-
2. Pick the recommended runtime profile. *(same caveat as above)*
|
|
237
|
-
3. Show the selected model and why it was chosen. *(not yet: model is printed, rationale is not)*
|
|
238
|
-
4. Start or resume the background download. **Shipped** — auto-download on first run; resumable.
|
|
239
|
-
5. Start the local server when ready. **Shipped.**
|
|
240
|
-
6. Open or serve the built-in chat UI. **Shipped** — browser tab opened automatically; URL printed either way; `--no-open` skips the tab.
|
|
241
|
-
7. Show connection details for OpenAI/Anthropic-compatible clients. **Shipped** — printed at startup.
|
|
242
|
-
8. Offer harness setup actions for Pi, Hermes, OpenClaw, and others. *Partially shipped: `mlx-bun harness pi` configures an existing Pi install; Hermes and OpenClaw adapters do not exist.*
|
|
243
|
-
|
|
244
|
-
This should feel like an appliance, not a framework tutorial.
|
|
245
|
-
|
|
246
|
-
## Adapter catalog vision
|
|
247
|
-
|
|
248
|
-
The average user should not have to train adapters to benefit from them. The
|
|
249
|
-
product path can ship or offer a curated catalog of lightweight LoRA adapters:
|
|
250
|
-
assistant, coding, writing, research, planning, personal-ops, and other
|
|
251
|
-
well-scoped modes. A user can install one small adapter and get a better local
|
|
252
|
-
assistant without changing the base model.
|
|
253
|
-
|
|
254
|
-
Advanced users can still train their own adapters with mlx-bun. The broader
|
|
255
|
-
product loop is:
|
|
256
|
-
|
|
257
|
-
```text
|
|
258
|
-
curate conversations and task data
|
|
259
|
-
train / ORPO task adapters
|
|
260
|
-
publish small adapter artifacts
|
|
261
|
-
route requests through the right adapter per task
|
|
262
|
-
keep the base model resident
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
This makes ORPO performance directly product-relevant. If training is cheap and
|
|
266
|
-
repeatable enough, the project can keep improving small local models through
|
|
267
|
-
adapter updates instead of asking every user to download a larger base model.
|
|
268
|
-
|
|
269
|
-
## Built-in UI
|
|
270
|
-
|
|
271
|
-
Bun can serve the UI directly from the same executable. The default UI
|
|
272
|
-
does not need to be elaborate at first, but it should work immediately.
|
|
273
|
-
|
|
274
|
-
Expected surfaces:
|
|
275
|
-
|
|
276
|
-
- Chat UI backed by the local model server.
|
|
277
|
-
- Download progress, resume status, and model readiness.
|
|
278
|
-
- Current device profile and selected model.
|
|
279
|
-
- Server URL and API compatibility hints.
|
|
280
|
-
- Simple controls for common settings: context, temperature, max tokens.
|
|
281
|
-
- Advanced panel for explicit model/profile overrides.
|
|
282
|
-
- Integration panel for harnesses and external clients.
|
|
283
|
-
|
|
284
|
-
### Model hot-swap from the UI (candidate)
|
|
285
|
-
|
|
286
|
-
Let the user switch the served model at runtime — e.g. Gemma e4b →
|
|
287
|
-
MiniCPM5 — from a picker in the web UI, without restarting the server.
|
|
288
|
-
Weight load is cheap (mmap is lazy, load runs on the CPU stream; ~0.5 s
|
|
289
|
-
for a small model), so a swap can feel like changing a setting rather
|
|
290
|
-
than a relaunch. `/library` already enumerates every model on disk with
|
|
291
|
-
a per-machine fit assessment and flags the active one (`serving`), so the
|
|
292
|
-
menu and the "does it fit" data already exist — the missing pieces are a
|
|
293
|
-
swap action and a mutable served context.
|
|
294
|
-
|
|
295
|
-
Sketch:
|
|
296
|
-
- Today the server is single-model-per-process: `serve()` captures one
|
|
297
|
-
`ServerContext` as a const in the `Bun.serve` closure. Hot-swap needs a
|
|
298
|
-
mutable "current context" ref that all handlers and the generation
|
|
299
|
-
gateway read through.
|
|
300
|
-
- A swap endpoint (e.g. `POST /library/activate`) drains in-flight
|
|
301
|
-
generations, frees the old model's GPU buffers + KV/prompt caches,
|
|
302
|
-
`loadContext()`s the target, rebuilds the gateway, then atomically
|
|
303
|
-
swaps the ref. `/v1/models`, `/status`, and the Pi probe report the new
|
|
304
|
-
id afterward.
|
|
305
|
-
|
|
306
|
-
Constraints to honor:
|
|
307
|
-
- On a memory-bound Mac you can't hold two models at once — unload before
|
|
308
|
-
load. There is an unavoidable brief "swapping…" gap, not an instant
|
|
309
|
-
switch. Validate fit() before unloading the current model.
|
|
310
|
-
- Load time scales with model size; don't promise instant for large ones.
|
|
311
|
-
- Decide adapter behavior on swap (dropped vs. model-scoped) and surface
|
|
312
|
-
it. Active LoRA adapters are tied to the base model.
|
|
313
|
-
|
|
314
|
-
The UI should not hide that this is local. It should make "local" feel
|
|
315
|
-
easy: predictable memory, transparent downloads, offline-capable serving,
|
|
316
|
-
and clear integration instructions.
|
|
317
|
-
|
|
318
|
-
### SigLIP vision sidecar — image input for gemma e4b (shipped, 2026-06-17)
|
|
319
|
-
|
|
320
|
-
The Gemma 4 e4b vision encoder (`src/vision/siglip.ts`) is a faithful port
|
|
321
|
-
of the optiq SigLIP tower. It auto-loads on first image input and falls back
|
|
322
|
-
to text-only mode when no image is present, so the chat UI gains image support
|
|
323
|
-
with no startup cost. Features are within ~1% rel-RMSE of the optiq oracle;
|
|
324
|
-
every MLX primitive (rms_norm, gelu, matmul, SDPA, RoPE, pooling) is bit-exact.
|
|
325
|
-
The residual is sub-bf16 floating-point accumulation across the deep encoder,
|
|
326
|
-
not a porting gap. The L1 and L2 paths both work; vision falls back to the
|
|
327
|
-
monolith path on L1 and L2.
|
|
328
|
-
|
|
329
|
-
### Adapter web selector and CLI /v1/adapters (shipped)
|
|
330
|
-
|
|
331
|
-
Trained LoRA adapters can be selected from the chat UI via a per-conversation
|
|
332
|
-
picker (`#chat-adapter` in `src/web/app.html`). The picker lists adapters
|
|
333
|
-
discovered by `GET /v1/adapters/available`, mounts the chosen one via
|
|
334
|
-
`POST /v1/adapters`, and sends a `set_adapter` message to Pi-web so that
|
|
335
|
-
every subsequent turn is routed through the right adapter — including the
|
|
336
|
-
`before_provider_request` hook in `src/pi-web.ts`. Adapters are base-model-scoped
|
|
337
|
-
and dropped on model swap.
|
|
338
|
-
|
|
339
|
-
### The UI must never lag while the AI is busy (candidate, 2026-06-16)
|
|
340
|
-
|
|
341
|
-
A product guarantee: **the AI may crash, the UI never may** — and the UI
|
|
342
|
-
must stay responsive no matter how hard the model is working. Waiting for
|
|
343
|
-
a *chat reply* is fine and expected (local inference takes time). A laggy
|
|
344
|
-
web UI — slow refreshes, stalled `/status`, a frozen page while an agentic
|
|
345
|
-
pipeline hammers the GPU — is not.
|
|
346
|
-
|
|
347
|
-
One `mlx-bun` process plays three roles on one event-loop thread: it
|
|
348
|
-
serves the UI, serves the API, and runs the AI. The AI work is synchronous
|
|
349
|
-
blocking GPU/FFI (each `mlx_eval` is atomic and uninterruptible), so it
|
|
350
|
-
starves the loop — worst in the non-streaming path and during prefill,
|
|
351
|
-
where nothing hands a macrotask back. Yielding between tokens helps the
|
|
352
|
-
common case but cannot isolate the UI under sustained load.
|
|
353
|
-
|
|
354
|
-
Direction (decided: **subprocess**, not worker thread — only address-space
|
|
355
|
-
isolation survives the uncatchable GPU OOM): move the inference runtime
|
|
356
|
-
into its own persistent child process behind the existing
|
|
357
|
-
`GenerationGateway` seam. The main process becomes a pure reactor (UI +
|
|
358
|
-
API + routing, zero MLX calls); one GPU lease serializes all GPU consumers
|
|
359
|
-
(chat, API, quantize, finetune) — reusing the spawn/lease pattern jobs
|
|
360
|
-
already prove. Converges with model hot-swap (model lives off the main
|
|
361
|
-
thread either way). Full design + phasing: `docs/reference/server-config.md`.
|
|
362
|
-
|
|
363
|
-
## Harness UX
|
|
364
|
-
|
|
365
|
-
Harness setup should be executable, not just documented.
|
|
366
|
-
|
|
367
|
-
```sh
|
|
368
|
-
mlx-bun harness
|
|
369
|
-
mlx-bun harness pi
|
|
370
|
-
mlx-bun harness hermes
|
|
371
|
-
mlx-bun harness openclaw
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
`mlx-bun harness` should open an interactive picker. Direct subcommands
|
|
375
|
-
should configure a specific harness.
|
|
376
|
-
|
|
377
|
-
Each harness adapter can:
|
|
378
|
-
|
|
379
|
-
- Detect whether the harness is installed.
|
|
380
|
-
- Preserve existing user config.
|
|
381
|
-
- Add or update the local mlx-bun provider entry.
|
|
382
|
-
- Point it at the local server.
|
|
383
|
-
- Select the right API protocol.
|
|
384
|
-
- Validate the connection with a tiny request.
|
|
385
|
-
- Show the command to launch the harness.
|
|
386
|
-
|
|
387
|
-
Pi deserves a first-class path because it can be embedded through its SDK:
|
|
388
|
-
|
|
389
|
-
```sh
|
|
390
|
-
mlx-bun harness pi
|
|
391
|
-
mlx-bun pi
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
`mlx-bun harness pi` configures the user's existing Pi install. `mlx-bun
|
|
395
|
-
pi` should start the local mlx-bun runtime and launch Pi itself against
|
|
396
|
-
that runtime. If the Pi TUI is the right surface, use it. If an embedded
|
|
397
|
-
SDK session is the right surface, use that.
|
|
398
|
-
|
|
399
|
-
Other harnesses should follow the same adapter pattern.
|
|
400
|
-
|
|
401
|
-
Sketch:
|
|
402
|
-
|
|
403
|
-
```ts
|
|
404
|
-
interface HarnessAdapter {
|
|
405
|
-
id: "pi" | "hermes" | "openclaw";
|
|
406
|
-
label: string;
|
|
407
|
-
detect(): Promise<Detection>;
|
|
408
|
-
configure(profile: RuntimeProfile): Promise<ConfigureResult>;
|
|
409
|
-
validate(profile: RuntimeProfile): Promise<ValidationResult>;
|
|
410
|
-
launch?(profile: RuntimeProfile): Promise<void>;
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
## CLI shape
|
|
415
|
-
|
|
416
|
-
Possible command map:
|
|
417
|
-
|
|
418
|
-
```sh
|
|
419
|
-
mlx-bun # recommended model + server + UI
|
|
420
|
-
mlx-bun serve # server only
|
|
421
|
-
mlx-bun ui # UI only, connect to local/running server
|
|
422
|
-
mlx-bun repl # Bun REPL with a local AI client preloaded
|
|
423
|
-
mlx-bun pi # launch embedded Pi against mlx-bun
|
|
424
|
-
mlx-bun harness # interactive harness setup
|
|
425
|
-
mlx-bun harness pi # configure existing Pi
|
|
426
|
-
mlx-bun harness hermes # configure Hermes
|
|
427
|
-
mlx-bun harness openclaw # configure OpenClaw
|
|
428
|
-
mlx-bun models # installed and recommended models
|
|
429
|
-
mlx-bun fit # device/model fit information
|
|
430
|
-
mlx-bun doctor # diagnostics
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
Flags should compose with these modes. The default is opinionated, not
|
|
434
|
-
restrictive.
|
|
435
|
-
|
|
436
|
-
Examples:
|
|
437
|
-
|
|
438
|
-
```sh
|
|
439
|
-
mlx-bun --model gemma-4-12b --context 65536
|
|
440
|
-
mlx-bun serve --no-ui --port 8080
|
|
441
|
-
mlx-bun pi --model qwen-profile
|
|
442
|
-
mlx-bun harness pi --base-url http://localhost:8080/v1
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
## Research loop behind the product
|
|
446
|
-
|
|
447
|
-
The product table should be backed by the same research discipline as
|
|
448
|
-
PLAN.md:
|
|
449
|
-
|
|
450
|
-
1. Pick a small set of real target devices.
|
|
451
|
-
2. Pick a small set of candidate model artifacts.
|
|
452
|
-
3. Measure fit, context, decode speed, TTFT, memory, and quality.
|
|
453
|
-
4. Specialize the runtime for winning artifacts.
|
|
454
|
-
5. Promote only defaults that pass clean-machine measurements.
|
|
455
|
-
6. Keep fallback and explicit override paths for research and power users.
|
|
456
|
-
|
|
457
|
-
The first family is Gemma 4 OptiQ. Qwen is the next obvious family to
|
|
458
|
-
evaluate. The default model should be whichever gives the best experience
|
|
459
|
-
for a device profile and use case, not whichever family arrived first.
|
|
460
|
-
|
|
461
|
-
## Artifact design
|
|
462
|
-
|
|
463
|
-
Longer term, mlx-bun may not only choose among existing model artifacts.
|
|
464
|
-
It may create artifacts for exact device/use-case targets.
|
|
465
|
-
|
|
466
|
-
The useful question is not "can we save 1% RAM?" It is:
|
|
467
|
-
|
|
468
|
-
```text
|
|
469
|
-
Can this model fit on this device,
|
|
470
|
-
with this context window,
|
|
471
|
-
above this decode-speed floor,
|
|
472
|
-
while preserving enough quality for this use case?
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
TurboQuant plus sensitivity analysis fits this direction. The quantizer
|
|
476
|
-
can target concrete SKU boundaries and context tiers:
|
|
477
|
-
|
|
478
|
-
- Make a specific model fit on 16 GB with useful context.
|
|
479
|
-
- Make a 12B-class model hit 64k context on 24-32 GB.
|
|
480
|
-
- Keep decode above 30 tok/s on the recommended profile.
|
|
481
|
-
- Preserve tool/agent behavior under the chosen quantization.
|
|
482
|
-
|
|
483
|
-
This turns quantization from generic compression into product-driven
|
|
484
|
-
artifact design.
|
|
485
|
-
|
|
486
|
-
## Runtime specialization
|
|
487
|
-
|
|
488
|
-
When a user asks to run a specific model, there is no ambiguity in the hot
|
|
489
|
-
path. The artifact, config, tensor shapes, KV config, quantization layout,
|
|
490
|
-
chat template, and architectural quirks are known.
|
|
491
|
-
|
|
492
|
-
The generic runtime is scaffolding for research, portability, and
|
|
493
|
-
fallback. The served instance can be specialized:
|
|
494
|
-
|
|
495
|
-
- Generated per-model execution paths.
|
|
496
|
-
- Branches and loops removed where the model shape is fixed.
|
|
497
|
-
- Per-layer quant bits/group sizes baked in.
|
|
498
|
-
- Known cache layouts and attention patterns used directly.
|
|
499
|
-
- Custom kernels generated or selected for exact dispatch sites.
|
|
500
|
-
|
|
501
|
-
Compatibility paths remain the oracle. Specialized paths are promoted
|
|
502
|
-
only when they are correct, measured, and useful.
|
|
503
|
-
|
|
504
|
-
## Lucien / memory-system direction (candidate, 2026-06-12)
|
|
505
|
-
|
|
506
|
-
A second product direction under debate alongside the UI/harness work:
|
|
507
|
-
make mlx-bun the local-model engine for Lucien (the Dreaming memory
|
|
508
|
-
system), in two stages.
|
|
509
|
-
|
|
510
|
-
1. **Prove the models do real work.** Run Lucien's pipeline tasks
|
|
511
|
-
(session ingestion, synthesis into articles, recall-grounded chat)
|
|
512
|
-
against mlx-bun-served models. Measure quality and performance per
|
|
513
|
-
task — this is a real-workload eval, not a benchmark row, and it
|
|
514
|
-
feeds the profile table (which model tier can sustain synthesis
|
|
515
|
-
work? what context does recall actually need?).
|
|
516
|
-
2. **Package it.** If the models hold up: mlx-bun as a Lucien backend
|
|
517
|
-
option — one executable that creates the memory store, gathers
|
|
518
|
-
session transcripts, synthesizes them into articles, and serves
|
|
519
|
-
conversations grounded on those articles. Same appliance principle
|
|
520
|
-
as the chat default: one binary, one command, a working memory
|
|
521
|
-
system.
|
|
522
|
-
|
|
523
|
-
This stresses exactly the things the runtime is good at measuring:
|
|
524
|
-
long-context prefill, sustained batch-ish generation, prompt-cache
|
|
525
|
-
reuse across pipeline stages.
|
|
526
|
-
|
|
527
|
-
## Non-goals for the default UX
|
|
528
|
-
|
|
529
|
-
- Do not make the user choose from thousands of Hugging Face variants on
|
|
530
|
-
first run.
|
|
531
|
-
- Do not benchmark their machine before giving a recommendation.
|
|
532
|
-
- Do not require Python, a venv, or manual server setup.
|
|
533
|
-
- Do not require hand-editing harness config files.
|
|
534
|
-
- Do not expose every research flag before the user has a working local
|
|
535
|
-
AI experience.
|
|
536
|
-
|
|
537
|
-
## Open questions
|
|
538
|
-
|
|
539
|
-
- What exact profile table should ship first? *(The device-profile lookup
|
|
540
|
-
table is unimplemented — `recommendedRepoId()` returns `DEFAULT_REPO_ID`
|
|
541
|
-
for every SKU. The profile shape in this doc is the spec; the research
|
|
542
|
-
work and the fill remain open.)*
|
|
543
|
-
- How should background downloads interact with server startup and UI
|
|
544
|
-
readiness?
|
|
545
|
-
- How should profile recommendations be versioned as benchmarks improve?
|
|
546
|
-
- When Qwen lands, what evals decide whether it replaces a Gemma default?
|
|
547
|
-
|
|
548
|
-
### Resolved
|
|
549
|
-
|
|
550
|
-
- **Should no-args open the UI automatically, print a local URL, or both?**
|
|
551
|
-
Both: the browser tab is opened automatically on start; the URL is always
|
|
552
|
-
printed; `--no-open` suppresses the tab without hiding the URL.
|
|
553
|
-
- **Which UI stack should be embedded? / How much of Pi should be bundled?**
|
|
554
|
-
Resolved by harness-pi + pi-web shipping: the web UI is the bundled
|
|
555
|
-
`src/web/app.html` chat page talking to Pi via `pi-web.ts`; Pi is
|
|
556
|
-
configured externally via `mlx-bun harness pi`, or launched embedded via
|
|
557
|
-
`mlx-bun pi`.
|
|
558
|
-
- **What is the right install path?** All of the above — shipped: npm
|
|
559
|
-
publish (v0.0.4, `bunx mlx-bun`), Homebrew release pipeline (sign,
|
|
560
|
-
notarize, `joshuarossi/homebrew-tap`), and GitHub release binary.
|
|
561
|
-
|
|
562
|
-
## Vision notes (merged from IDEAS.md, 2026-08-23)
|
|
563
|
-
|
|
564
|
-
### Local in the deeper sense
|
|
565
|
-
|
|
566
|
-
Two phrases that capture the thesis — especially **mlx-bun × Lucien**:
|
|
567
|
-
|
|
568
|
-
1. **"A truly local model in a deeper sense."** Not just local *compute*
|
|
569
|
-
(runs on your Mac, nothing leaves it) — local to *you*: grounded in your
|
|
570
|
-
own context and memory, not only your hardware.
|
|
571
|
-
2. **"The best model at being yours."** Not the best model in the absolute /
|
|
572
|
-
benchmark sense — the best at *being yours*. A small local model,
|
|
573
|
-
fine-tuned and wired to your personal memory, can lose every general
|
|
574
|
-
benchmark and still win the only one that matters here.
|
|
575
|
-
|
|
576
|
-
Lucien (the Dreaming) is the synthesized, persistent memory of *you*;
|
|
577
|
-
mlx-bun is the local, private model runtime. Combined: a model that runs
|
|
578
|
-
entirely on your machine **and** is continuously grounded in your own
|
|
579
|
-
accumulated context — local in both senses, and yours in a way no hosted
|
|
580
|
-
frontier model can be.
|
|
581
|
-
|
|
582
|
-
### Library/app split (idea only — NOT planned, Josh 2026-07-05)
|
|
583
|
-
|
|
584
|
-
Two pulls: "one executable, everything you want to do with local AI" (the
|
|
585
|
-
product's charm) vs "some people just want a JS ML library — do they need
|
|
586
|
-
the rest?" The runtime-isolation work (2026-07-05) drew the exact boundary
|
|
587
|
-
either future needs: the engine child = the GPU stuff (src/model, src/mlx,
|
|
588
|
-
caches, scheduler, generate); the parent = the app (serve/UI/registry/
|
|
589
|
-
jobs/proxy). If a split ever happens it is a PACKAGING decision, not a
|
|
590
|
-
refactor — e.g. npm subpath exports (mlx-bun/model vs the full CLI bundle)
|
|
591
|
-
so library users import only the core. Library usage is unaffected by
|
|
592
|
-
isolation today (in-process generate(), no server involved). Revisit only
|
|
593
|
-
if Josh decides; both directions stay open from the current structure.
|