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,126 +0,0 @@
|
|
|
1
|
-
# ORPO-on-UF — results + testing-phase handoff
|
|
2
|
-
|
|
3
|
-
**Status:** training done (2026-06-20); **testing phase = next.** This doc is the
|
|
4
|
-
"where we are + what to run" so anyone (or a fresh session) can execute the measurements.
|
|
5
|
-
Companion: [trainer-validation-experiment.md](trainer-validation-experiment.md) (the
|
|
6
|
-
validation that got us here).
|
|
7
|
-
|
|
8
|
-
## The run that just finished
|
|
9
|
-
|
|
10
|
-
From-**base** ORPO on UltraFeedback, MiniCPM5-1B.
|
|
11
|
-
- **Base:** `mlx-community/MiniCPM5-1B-OptiQ-4bit` (the full post-trained model; optiq quant).
|
|
12
|
-
- **Data:** `~/.cache/mlx-bun/eval-data/uf-cpm5` — 14,691 train / 148 val, `{prompt,chosen,rejected}`.
|
|
13
|
-
- **Config:** ORPO, **1 epoch (14,691 iters)**, B=1, seq 2048, rank 16, **λ=0.1**, cosine LR
|
|
14
|
-
1e-5, **no-segment**. From base (no warm-start).
|
|
15
|
-
- **Command:** `SEQ=2048 EVAL_EVERY=500 RANK=16 SCHED=cosine LAMBDA=0.1
|
|
16
|
-
ADAPTER_DIR=./adapters/cpm5-uf-frombase bun scripts/experiments/pref-control.ts orpo
|
|
17
|
-
~/.cache/mlx-bun/eval-data/uf-cpm5 uf-frombase 14691 1e-5`
|
|
18
|
-
|
|
19
|
-
## Key result — the two ORPO halves decoupled
|
|
20
|
-
|
|
21
|
-
| half | metric | best | at step | final (14690) |
|
|
22
|
-
|---|---|---|---|---|
|
|
23
|
-
| **SFT** | loss (NLL+λOR) ↓ | **1.5057** | **14500** (the end) | 1.506 |
|
|
24
|
-
| **DPO** | margin ↑ | **0.143** | **6000** | 0.127 |
|
|
25
|
-
| — | accuracy | **81/148** | ~5500 | 80/148 |
|
|
26
|
-
|
|
27
|
-
- **SFT improved across the *whole* run** (loss bottomed at the end) → **final adapter = best SFT.**
|
|
28
|
-
- **DPO peaked at ~6000 and faded** → **step ~6000 = best DPO**, slightly worse SFT (loss 1.5077).
|
|
29
|
-
- **No single checkpoint has both.** Honest summary: a **small, early-peaking preference
|
|
30
|
-
signal** (~+6 questions, chance 74 → peak 81/148) that **drifted down in the tail**, while
|
|
31
|
-
SFT kept inching to its ~1.506 floor. Whether even that small lift **converts** on an
|
|
32
|
-
independent test is the open question the testing phase answers.
|
|
33
|
-
|
|
34
|
-
## Artifacts + baselines
|
|
35
|
-
|
|
36
|
-
- **Final adapter:** `./adapters/cpm5-uf-frombase/` (mountable: `eval.ts --adapter`).
|
|
37
|
-
- **Trajectory:** `runs/uf-frombase.{json,csv}`; **plot:** `runs/uf-frombase.png` via
|
|
38
|
-
`scripts/experiments/plot-runs.py` (panels: loss=val+train-EMA; questions-correct/148;
|
|
39
|
-
margin — each zoomed to its band).
|
|
40
|
-
- **x1 baseline** (base CPM5, full capability suite): **28.69** (in the eval DB; needs the
|
|
41
|
-
MMLU-argmax + HumanEval-python fixes — see Gotchas). optiq published is 30.28.
|
|
42
|
-
- **⚠ No intermediate checkpoints this run** — `pref-control.ts` lacked `saveCheckpoints`
|
|
43
|
-
(now **fixed**; future runs checkpoint every val eval + track best-margin). The ~6k peak
|
|
44
|
-
is recoverable by **deterministic replay** (same seed/order → same adapter).
|
|
45
|
-
|
|
46
|
-
## Testing plan
|
|
47
|
-
|
|
48
|
-
**PRIMARY — the headline (READY TO RUN):**
|
|
49
|
-
- **A. final adapter vs base** on x2 (capability) + Exp 2 (judge win-rate). Answers "did a
|
|
50
|
-
full epoch of ORPO-on-UF move a 1B, on an *independent* test?"
|
|
51
|
-
|
|
52
|
-
**SWEEP / SYNTHESIS:**
|
|
53
|
-
- **B. recover the ~6k peak** — re-run from base to ~7k (checkpoints now on), grab the
|
|
54
|
-
step-6000 (and neighbors, pick best-val). The early-stop peak arm.
|
|
55
|
-
- **C. four-way** — base / 6k-peak / final / final+6k on x2 + Exp 2 → traces the
|
|
56
|
-
early-stopping curve on an independent test.
|
|
57
|
-
- **D. DPO-boost (the day's synthesis) — keep best SFT, re-pressure the DPO.** Warm-start
|
|
58
|
-
from the **final** adapter (best SFT, NLL at floor), re-apply the **DPO-helpful examples
|
|
59
|
-
with HIGH λ** (or DPO-only). = dynamic-λ (ramp preference at SFT-saturation) + data-curation
|
|
60
|
-
in one move. Tests the fork: DPO stalled because of a **capacity ceiling** (won't help) or
|
|
61
|
-
**dilution / λ-too-gentle** (margin recovers past 0.143 while loss holds ~1.506 → better on
|
|
62
|
-
*both* axes than any single checkpoint).
|
|
63
|
-
- **E. data-valuation control** — `final + (0–6000)` vs `final + (6000–14691)`, same size.
|
|
64
|
-
First-half wins → those examples carry the DPO signal; tie → it's "more preference training,"
|
|
65
|
-
not *which* examples. (We control which pairs go in, so this generalizes to **curating** the
|
|
66
|
-
data with the model as the probe.)
|
|
67
|
-
|
|
68
|
-
## Commands
|
|
69
|
-
|
|
70
|
-
`ORC=/Users/joshrossi/Code/mlx-lm-example/.venv/bin/python` (HumanEval interpreter, this machine).
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
# A — x2 capability (final vs base; base x1=28.69 already recorded)
|
|
74
|
-
MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5 --adapter ./adapters/cpm5-uf-frombase
|
|
75
|
-
# A — Exp 2 (gen base+trained responses, then judge head-to-head)
|
|
76
|
-
bun scripts/experiments/prefbench.ts gen mtbench ./adapters/cpm5-uf-frombase mtbench-uf # GPU
|
|
77
|
-
bun scripts/experiments/prefbench.ts judge mtbench-uf # codex
|
|
78
|
-
# B — replay base→7k to recover the ~6k checkpoint (now checkpoints)
|
|
79
|
-
SEQ=2048 EVAL_EVERY=500 RANK=16 SCHED=cosine LAMBDA=0.1 ADAPTER_DIR=./adapters/cpm5-uf-replay \
|
|
80
|
-
bun scripts/experiments/pref-control.ts orpo ~/.cache/mlx-bun/eval-data/uf-cpm5 uf-replay 7000 1e-5
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Harness gaps to close for D / E
|
|
84
|
-
|
|
85
|
-
`pref-control.ts` does **not yet** support (needed for the DPO-boost + control arms):
|
|
86
|
-
1. **Warm-start from an adapter** (`--resume` / load a non-zero adapter before training) —
|
|
87
|
-
the trainer has `warm_start_adapter` (see `trainer.ts`); just not wired into pref-control.
|
|
88
|
-
2. **Data-subset selection** (feed a chosen subset / order of pairs, e.g. rows 0–6000) —
|
|
89
|
-
pref-control feeds the whole `train.jsonl`; needs a row-range / id-list option.
|
|
90
|
-
3. λ is already env-controllable (`LAMBDA=`), so high-λ is ready once 1+2 exist.
|
|
91
|
-
|
|
92
|
-
## Validated infrastructure (all green — see trainer-validation-experiment.md)
|
|
93
|
-
|
|
94
|
-
- **Trainer:** positive controls pass — DPO & ORPO drive prefer-uppercase val acc → 1.0;
|
|
95
|
-
grads match autograd. `scripts/experiments/pref-control.ts`.
|
|
96
|
-
- **Capability harness:** reproduces optiq across 6 tasks after two fixes (below).
|
|
97
|
-
`eval.ts capability --adapter` wired.
|
|
98
|
-
- **Judge:** `gpt-5.4-mini` via `codex exec`, **keyless**, structured, order-swapped,
|
|
99
|
-
3/3 positive control. `scripts/experiments/llm-judge.ts`.
|
|
100
|
-
- **Exp 2 harness:** `scripts/experiments/prefbench.ts` (gen/judge); prompts downloaded
|
|
101
|
-
(`mt_bench.jsonl` 80, `alpaca_eval.json` 805).
|
|
102
|
-
- **MMLU frozen set:** optiq's exact 969 questions + dev exemplars captured
|
|
103
|
-
(`mmlu_optiq_frozen.jsonl` / `mmlu_optiq_dev.jsonl`) for parity work.
|
|
104
|
-
|
|
105
|
-
## Gotchas / load-bearing facts
|
|
106
|
-
|
|
107
|
-
- **`AdapterManager.mount` affects the *serving* forward** (eval generation, chat) **but NOT
|
|
108
|
-
the *training* `branchLogpMean`.** Measure training metrics via the trainLora emit, not mount.
|
|
109
|
-
- **Eval env:** `MLX_BUN_ORACLE_PYTHON=$ORC` (HumanEval code-exec — wrong default path on this
|
|
110
|
-
machine); evals default to **non-thinking** (optiq parity; `MLX_BUN_EVAL_THINK=1` to re-enable).
|
|
111
|
-
- **MMLU parity:** our number (47.7 old / ~50 argmax) vs optiq 52.4 is **sampling + forward
|
|
112
|
-
parity**, not noise (both deterministic argmax). Use the frozen set; remaining gap = our
|
|
113
|
-
forward vs `mlx_lm` (logit-diff test on the frozen prompts — **queued, GPU**).
|
|
114
|
-
- **Determinism:** same seed/order → same adapter. Replay recovers any checkpoint.
|
|
115
|
-
- **Server adapter API** (`POST /v1/adapters` + per-request `"adapter":"id"`) is the clean way
|
|
116
|
-
to compare *many* adapters via chat; **raw eval (`--adapter`) is required for capability**
|
|
117
|
-
(MMLU is logit-argmax, not chat generation).
|
|
118
|
-
|
|
119
|
-
## Recommended order
|
|
120
|
-
|
|
121
|
-
1. **A** (final vs base) — the headline, READY. Run x2, then Exp 2.
|
|
122
|
-
2. **B** — replay to recover the 6k peak (cheap, ~45 min).
|
|
123
|
-
3. **C** — eval base/6k/final on the suite (four-way needs D for the +6k arm).
|
|
124
|
-
4. Close the **pref-control harness gaps** (warm-start + subset), then **D** (DPO-boost) and
|
|
125
|
-
**E** (data-valuation control) — the synthesis experiments.
|
|
126
|
-
5. (Parallel/queued) **MMLU forward-parity** logit-diff to nail x1 ≈ 30.28.
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# Pareto-specialized runtime findings
|
|
2
|
-
|
|
3
|
-
## Question
|
|
4
|
-
|
|
5
|
-
Which parts of mlx-bun should converge on shared infrastructure, and which parts should remain deliberately specialized so cleanup does not turn the runtime into a lowest-common-denominator model host?
|
|
6
|
-
|
|
7
|
-
This note compares three mature specialization clusters: the Colibri/GLM-5.2 runtime, the Qwen3.8 27B TurboQuant and MTP work, and ORPO training. The evidence says the same thing in all three places: share lifecycle and composition policy, but keep artifact layout and numerical work close to the model or method that owns them.
|
|
8
|
-
|
|
9
|
-
## Shared control-plane infrastructure
|
|
10
|
-
|
|
11
|
-
The shared layer decides what runs, owns resources, and records what happened. It does not rewrite the selected computation.
|
|
12
|
-
|
|
13
|
-
- **Model construction.** `openModel()` recognizes the direct Colibri artifact before ordinary safetensors loading. `createModel()` prefers dedicated and fingerprint-generated model classes before the universal fallback, and explicitly says the generic path must not shadow a dedicated port. This is shared dispatch with specialized implementations, not one universal graph. [Factory dispatch](../../../src/model/factory.ts#L30-L150)
|
|
14
|
-
- **Concurrency and request composition.** The target is one concurrency-driven engine. One active request uses the B=1 pipelined or compiled fast path; concurrent requests use the general step up to `--batch N`. B=1 is an internal specialization, not a permanent public lane. Features are stackable layers, and scheduling must not replace the selected KV scheme, adapter, draft method, grammar, or sampler. [Unified engine decision](../../design/unified-engine-frontier-plan.md#L333-L403) [Composition matrix](../../design/unified-engine-frontier-plan.md#L405-L424)
|
|
15
|
-
- **Cache lifecycle and capability.** `Cache` owns update, masks, state, rollback, accounting, and disposal. `BatchableCache` adds row merge, extraction, filtering, and byte projection. The scheduler can depend on those capabilities without knowing whether a row contains ordinary KV, recurrent state, TurboQuant tensors, or compressed GLM state. [Cache interface](../../../src/model/gemma4-base.ts#L264-L303) [Batchable cache interface](../../../src/model/gemma4-base.ts#L347-L357)
|
|
16
|
-
- **Resolved KV policy.** `KvScheme` preserves bf16, uniform affine, per-layer affine, and TurboQuant as distinct immutable schemes. It centralizes names, accounting, and current batch capability checks without pretending the schemes have identical storage or kernels. [KV scheme](../../../src/kv-scheme.ts#L84-L169)
|
|
17
|
-
- **Draft lifecycle.** `DraftProvider` owns server-lifetime machinery and opens a request-scoped `DraftSource`. The source interface carries prompt mode, target taps, draft, commit, rollback-related cache state, and disposal. Assistant, DSpark, Qwen MTP, and native GLM MTP can share speculative orchestration while retaining different state transitions. [Draft source](../../../src/spec/source.ts#L31-L101) [Draft provider](../../../src/spec/source.ts#L103-L118)
|
|
18
|
-
- **Expert residency policy.** The budget equation, stable expert union, lease state, backend contract, telemetry, and pressure correction are reusable. GLM supplies artifact geometry and byte segments to that policy. [Residency planning and union](../../../src/expert-residency.ts#L17-L155) [Residency backend](../../../src/expert-residency.ts#L157-L170)
|
|
19
|
-
- **Offline transform orchestration.** `WeightTransform` separates name/config planning from lazy tensor application. Llama, the Qwen3.5 trunk, and Qwen MTP are real adapters over the same conversion seam. [Weight transform interface](../../../src/quantize/weight-transform.ts#L40-L51) [Qwen transform adapters](../../../src/quantize/weight-transform.ts#L244-L268)
|
|
20
|
-
- **Training orchestration.** `TrainConfig` names independent techniques such as segmented backward, fused or flash CCE, prefix sharing, regularization, and ORPO semantics. `orpoLoop()` composes the selected techniques and chooses the model-specific backward implementation. [Training configuration](../../../src/train/trainer.ts#L42-L150) [ORPO composition](../../../src/train/trainer.ts#L821-L948)
|
|
21
|
-
|
|
22
|
-
## Deliberately specialized data-plane code
|
|
23
|
-
|
|
24
|
-
### Colibri and GLM-5.2
|
|
25
|
-
|
|
26
|
-
GLM-5.2 is not a descriptor-table variation of a dense transformer. Its graph has MLA, DSA, shared plus routed MoE, native MTP, and compressed cache state. Its public artifact also has a dedicated container and streamed expert layout. The design therefore calls for a dedicated `Glm52Model`, direct artifact support, and a one-read routed-expert kernel rather than repacking into generic projection-major tensors. [Dedicated graph and artifact contract](../../design/colibri-glm52-port.md#L323-L357)
|
|
27
|
-
|
|
28
|
-
The memory contract is also model and artifact specific. A header-only preflight reads the container, derives expert slot layouts, counts DSA and MTP state, and refuses startup when the exact resident weights, expert slabs, compressed KV, verification transients, allocator reserve, Bun reserve, and safety margin exceed the process limit. [GLM geometry and preflight](../../../src/model/glm52-memory.ts#L340-L500) The runtime then maps Colibri segments into generic residency leases, but retains GLM-specific slot layouts, MTP slabs, signed-int8 requirements, and routed-SwiGLU executors. [GLM residency binding](../../../src/model/glm52-residency.ts#L138-L230) [GLM executor construction](../../../src/model/glm52-residency.ts#L300-L459)
|
|
29
|
-
|
|
30
|
-
That split is intentional. Bun owns residency policy and observability; the native helper owns aligned slabs, `pread`, wiring, and completion fences; the GLM model owns tensor semantics and kernels. [Ownership map](../../design/colibri-glm52-port.md#L580-L600)
|
|
31
|
-
|
|
32
|
-
### Qwen3.8 27B, TurboQuant, and MTP
|
|
33
|
-
|
|
34
|
-
Qwen3.5/3.8 keeps a dedicated graph because gated DeltaNet recurrence, full attention, MRoPE, output gates, and recurrent speculative rollback are numerical behavior, not configuration decoration. [Qwen graph](../../../src/model/qwen3_5.ts#L128-L322) [Qwen model interface](../../../src/model/qwen3_5.ts#L512-L673)
|
|
35
|
-
|
|
36
|
-
Qwen MTP preserves its own artifact and state machine behind `DraftProvider` and `DraftSource`. The provider rejects a non-Qwen target or a hidden-size mismatch. The request source uses tapped pre-final-norm target state, maintains its own KV, samples through the target sampler, and rebuilds accepted rows from verified target hiddens. Those rules must not move into generic speculative orchestration. [Qwen MTP provider](../../../src/spec/qwen-mtp-source.ts#L193-L235) [Qwen MTP state machine](../../../src/spec/qwen-mtp-source.ts#L237-L430)
|
|
37
|
-
|
|
38
|
-
TurboQuant KV demonstrates the right form of specialization. `TurboQuantKVCache` implements the shared `Cache` lifecycle, while keeping packed indices, scales, zero points, FWHT-domain values, supported head dimensions, and conversion rules inside the class. [TurboQuant cache](../../../src/model/gemma4-base.ts#L1539-L1800) The weight pipeline follows the same rule. `WeightTransform` is shared, but the Qwen corridor map preserves the output gate, recurrent internals, vision-to-residual seam, untied 27B head, and companion MTP basis. [Qwen transform seam](../../design/turboquant-weights.md#L80-L87) [Qwen corridor map](../../design/turboquant-weights.md#L125-L174)
|
|
39
|
-
|
|
40
|
-
### ORPO training
|
|
41
|
-
|
|
42
|
-
ORPO benefits from composition, not one generic backward. The trainer combines prefix sharing, segmented recomputation, fused or flash CCE, LoRA regularization, and objective semantics. The data plane remains specialized where the model topology demands it. Gemma4 segmented ORPO threads per-layer inputs and cross-segment donor KV cotangents; MiniCPM5 uses a simpler segment graph. [Composed ORPO paths](../../design/orpo-training.md#L178-L218) [Gemma4 segmented backward](../../../src/train/segmented.ts#L1137-L1471)
|
|
43
|
-
|
|
44
|
-
Flash CCE is a shared quantized-head interface with specialized Metal kernels and explicit shape guards. Its implementation selects Steel, simdgroup, or scalar kernels from actual hidden, vocabulary, group, and tile geometry, and exposes exact-gradient escape hatches. Flattening this into a generic matrix-loss helper would lose the memory and watchdog constraints that justify it. [Flash CCE head](../../../src/train/flash-cce.ts#L42-L64) [Forward dispatch](../../../src/train/flash-cce.ts#L1033-L1132) [Backward dispatch](../../../src/train/flash-cce.ts#L1134-L1234)
|
|
45
|
-
|
|
46
|
-
Dynamic lambda is not implemented. Its design belongs in the ORPO control plane: validation metrics update a live lambda source in `orpoLoop()`, while every monolithic and segmented loss reads the same value. It should not create another family of backward classes. [Dynamic-lambda status and signals](../../design/orpo-dynamic-lambda.md#L1-L27) [Proposed wiring](../../design/orpo-dynamic-lambda.md#L163-L180)
|
|
47
|
-
|
|
48
|
-
## Interfaces that already preserve specialization
|
|
49
|
-
|
|
50
|
-
| Interface | Shared invariant | Specialization retained behind it |
|
|
51
|
-
|---|---|---|
|
|
52
|
-
| `RuntimeModel` plus factory dispatch | Construction and serving can hold one model type | Dedicated GLM, Qwen, Gemma, diffusion, MoE, and generated graphs |
|
|
53
|
-
| `Cache` / `BatchableCache` | Lifecycle, rollback, row operations, byte projection | Plain, rotating, quantized, TurboQuant, SSM, MLA, and DSA storage |
|
|
54
|
-
| `KvScheme` | One resolved KV choice and stable identity | Per-scheme accounting, conversion, persistence, and kernels |
|
|
55
|
-
| `DraftProvider` / `DraftSource` | Request lifecycle, target taps, draft and commit | Assistant, DSpark, Qwen MTP, and GLM MTP state machines |
|
|
56
|
-
| `ExpertResidencyBackend` | Lease and I/O lifecycle | Colibri container offsets, slot packing, expert kernels, and prediction policy inputs |
|
|
57
|
-
| `WeightTransform` | Plan first, apply lazily, record identity | Family-specific exact fold corridors and companion artifacts |
|
|
58
|
-
| ORPO trainer configuration | One run composes selected techniques | Model-specific masks, donor topology, VJPs, and Metal kernels |
|
|
59
|
-
|
|
60
|
-
## Declared profile seam (S2, 2026-08-21)
|
|
61
|
-
|
|
62
|
-
Model construction now resolves one `ResolvedModelProfile` before opening
|
|
63
|
-
weights. An exact artifact declaration binds an immutable external fingerprint,
|
|
64
|
-
config fingerprint, fidelity contract, required engine capabilities, and a
|
|
65
|
-
loader/graph/loop composition. Exact Qwen3.8 OptiQ and GLM-5.2 Colibri revisions
|
|
66
|
-
are pinned; other supported artifacts retain dedicated family resolution and
|
|
67
|
-
then the universal dense fallback.
|
|
68
|
-
|
|
69
|
-
The factory consumes the resolved composition, and the serving context retains
|
|
70
|
-
it for library callers. A matched exact declaration with a config or capability
|
|
71
|
-
mismatch refuses rather than taking another route. The profile seam does not
|
|
72
|
-
own request methods: MTP, KV schemes, adapters, grammar, and sampling remain
|
|
73
|
-
independently resolved inputs to completion execution. This keeps the control
|
|
74
|
-
plane declarative without turning a model profile into a feature preset.
|
|
75
|
-
|
|
76
|
-
These interfaces preserve specialization because they describe lifecycle or capability, not tensor algebra. They also have multiple real implementations. That is the useful test for whether an abstraction belongs.
|
|
77
|
-
|
|
78
|
-
## Rules for steady-state cleanup
|
|
79
|
-
|
|
80
|
-
1. **Unify control, not math.** Centralize admission, concurrency, cancellation, ownership, accounting, persistence, telemetry, and technique composition. Keep tensor layout, recurrence, cache encoding, model topology, and kernel selection with their owning model, artifact, or method.
|
|
81
|
-
2. **Keep one concurrency-driven engine.** B=1 and B>1 are internal step specializations in one engine. `--batch N` is a concurrency cap. Observed placement may be reported, but serial versus batch must not become a permanent public mode or feature-selection interface. Current feature-specific serial routing is capability debt.
|
|
82
|
-
3. **Never weaken a resolved composition to fit a path.** If batching lacks TurboQuant, MTP, adapters, grammar, or another selected method, close that capability gap or reject the unsupported composition. Do not silently substitute bf16 KV, disable drafting, or change sampling.
|
|
83
|
-
4. **Prefer capability interfaces over family checks.** Scheduling should ask caches whether they can merge or project bytes and draft sources what target state they require. Factory dispatch is the proper place for model identity checks.
|
|
84
|
-
5. **Let dedicated ports outrank generic fallbacks.** The universal model path is valuable for ordinary architectures. It must not absorb GLM MLA/DSA, Qwen recurrence, artifact-specific MTP, or another optimized graph merely to reduce class count.
|
|
85
|
-
6. **Treat artifacts as executable contracts.** Validate manifests, tensor families, layouts, quantization metadata, companion seeds, and memory equations before allocation. Keep artifact-specific loaders and transforms when repacking would add copies, lose reproducibility, or change arithmetic.
|
|
86
|
-
7. **Generalize only after the invariant is visible in two implementations.** Extract lifecycle and capability seams such as `DraftSource` or `WeightTransform`. Do not extract a common tensor algorithm from code that only looks similar but has different masks, state, accumulation order, or oracle.
|
|
87
|
-
8. **Compose optimizations at the orchestrator, then test the cross-product.** ORPO proves that prefix sharing, flash CCE, segmented backward, and regularization can stack while model-specific backward code remains intact. Serving needs the same discipline for model graph, KV scheme, MTP, adapters, grammar, sampling, and concurrency.
|
|
88
|
-
9. **Bind every specialized path to its own oracle and measured purpose.** A specialized module earns its place through parity, memory, quality, or throughput gates on the artifact and hardware it targets. If the benefit disappears, delete the specialization instead of preserving it as architecture folklore.
|
|
89
|
-
|
|
90
|
-
## Strongest conclusion
|
|
91
|
-
|
|
92
|
-
The steady state is not a generic engine with scattered exceptions. It is a shared control plane that carries authoritative compositions through one concurrency-driven engine, plus specialized data planes selected by model, artifact, and numerical method. That structure preserves the project's Pareto advantage: common serving and training behavior where sameness is real, and unapologetically specific code where the result depends on it.
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
# Investigation: pi as a "built-in" terminal for mlx-bun
|
|
2
|
-
|
|
3
|
-
*2026-06-12. Question (PRODUCT_ROADMAP "Harness UX" / PLAN direction A):
|
|
4
|
-
can `mlx-bun pi` drop the user into a working pi agent session against
|
|
5
|
-
the locally running model — and what's the best mechanism? Sources:
|
|
6
|
-
https://pi.dev/docs/latest (sdk, tui, rpc, custom-provider pages) plus
|
|
7
|
-
direct inspection of the installed packages
|
|
8
|
-
(`~/.bun/install/global/node_modules/@earendil-works/*`, v0.79.1).*
|
|
9
|
-
|
|
10
|
-
> **Outcome (2026-06-14, what actually shipped).** This investigation
|
|
11
|
-
> proposed shipping the subprocess launcher first and promoting to an
|
|
12
|
-
> embedded flagship later. We went straight to the embedded design and
|
|
13
|
-
> then **dropped the subprocess path entirely** (Option 2 + the
|
|
14
|
-
> `--external-pi` fallback in P4): `mlx-bun pi` runs pi's own
|
|
15
|
-
> `InteractiveMode` **in-process** (src/pi-terminal.ts) with a custom
|
|
16
|
-
> mlx-bun coding-agent prompt, full coding tools + web tools, and pi's
|
|
17
|
-
> native approval prompts — nothing to install. A user who already runs
|
|
18
|
-
> pi connects it to the local model with **`mlx-bun harness pi`**
|
|
19
|
-
> (Option 1, src/harness-pi.ts) — that's the only "their pi" path, since
|
|
20
|
-
> launching a pi they already have was pure duplication. The web-chat
|
|
21
|
-
> half (Option 4) ships via src/pi-web.ts. The analysis below is the
|
|
22
|
-
> point-in-time reasoning that led here.
|
|
23
|
-
|
|
24
|
-
## TL;DR
|
|
25
|
-
|
|
26
|
-
**Yes, and better than hoped.** pi is not just embeddable — it is a
|
|
27
|
-
Bun-native, MIT-licensed npm package whose own release binary is built
|
|
28
|
-
with `bun build --compile`, the exact toolchain mlx-bun's Phase 5
|
|
29
|
-
single-binary bundle already uses. The full interactive TUI (editor,
|
|
30
|
-
chat history, all built-in commands) is an exported SDK class
|
|
31
|
-
(`InteractiveMode`), not CLI-only internals. Four integration options
|
|
32
|
-
exist, they are not mutually exclusive, and the recommended path is:
|
|
33
|
-
ship the cheap subprocess launcher now, promote to a true in-binary
|
|
34
|
-
embed as the flagship. pi's RPC mode separately gives us the protocol
|
|
35
|
-
for the built-in web chat UI, so this investigation pays for direction
|
|
36
|
-
A's part 1 as well.
|
|
37
|
-
|
|
38
|
-
## What pi is, technically
|
|
39
|
-
|
|
40
|
-
- Four MIT-licensed packages, all v0.79.1, all from
|
|
41
|
-
`github.com/earendil-works/pi`:
|
|
42
|
-
`pi-coding-agent` (13 MB, the agent + CLI + SDK), `pi-ai` (4.9 MB,
|
|
43
|
-
provider/streaming layer), `pi-agent-core` (1.3 MB), `pi-tui`
|
|
44
|
-
(1.9 MB, differential-rendering TUI lib). ~21 MB total on disk
|
|
45
|
-
before tree-shaking — negligible next to model weights, modest next
|
|
46
|
-
to mlx-bun's current binary.
|
|
47
|
-
- **Bun-compile native**: `pi-coding-agent`'s `build:binary` script is
|
|
48
|
-
literally `bun build --compile ./dist/bun/cli.js ...` — upstream
|
|
49
|
-
ships a Bun single-file executable themselves. Embedding it in our
|
|
50
|
-
Bun bundle is a supported configuration, not an experiment.
|
|
51
|
-
- Engines: node ≥ 22.19 (pi-tui uses `/v`-flag regexes — fails under
|
|
52
|
-
node 18, fine under Bun ≥ 1.3.x, which mlx-bun already pins).
|
|
53
|
-
- Assets that must ride along in a binary (upstream's
|
|
54
|
-
`copy-binary-assets` is the manifest): theme JSONs, a few PNGs,
|
|
55
|
-
export-html templates, `photon_rs_bg.wasm` (image ops), and pi-tui's
|
|
56
|
-
prebuilt `.node` natives (`darwin-arm64`/`darwin-x64` ship in the
|
|
57
|
-
package).
|
|
58
|
-
- Local-model support is **already proven on this machine**:
|
|
59
|
-
`~/.pi/agent/models.json` has an `mlx` provider
|
|
60
|
-
(`api: "openai-completions"`, baseUrl + `sk-optiq-` key, compat
|
|
61
|
-
flags) serving Qwen quants. mlx-bun's OpenAI surface is what pi
|
|
62
|
-
expects.
|
|
63
|
-
|
|
64
|
-
## The four integration options
|
|
65
|
-
|
|
66
|
-
### Option 1 — `mlx-bun harness pi`: configure the user's existing pi
|
|
67
|
-
|
|
68
|
-
Write/merge the provider entry into `~/.pi/agent/models.json` (or drop
|
|
69
|
-
a tiny extension that calls `pi.registerProvider(...)` — the
|
|
70
|
-
documented programmatic route, which can even discover models
|
|
71
|
-
dynamically from our `/v1/models`). Validate with one tiny request,
|
|
72
|
-
print the launch command.
|
|
73
|
-
|
|
74
|
-
- **Effort**: hours. **Risk**: low (must merge, not clobber, user
|
|
75
|
-
config — the docs' extension route avoids touching models.json at
|
|
76
|
-
all). **Verdict**: do regardless; this is the harness-adapter
|
|
77
|
-
pattern from the roadmap and it's nearly free.
|
|
78
|
-
|
|
79
|
-
**Pros**: nearly free; respects the user's pi setup, sessions, themes,
|
|
80
|
-
extensions; zero version coupling; the dynamic-discovery extension
|
|
81
|
-
keeps the model list in sync with our server automatically.
|
|
82
|
-
**Cons**: requires pi to already be installed; not "built-in" — the
|
|
83
|
-
appliance story still has two moving parts; config-merge bugs are the
|
|
84
|
-
classic way to annoy users (the extension route mostly avoids this).
|
|
85
|
-
|
|
86
|
-
### Option 2 — `mlx-bun pi` (v1): spawn the user's installed pi
|
|
87
|
-
|
|
88
|
-
Start our server, then spawn `pi` with a session-scoped provider
|
|
89
|
-
config (extension dir or env) pointing at it. If pi isn't installed,
|
|
90
|
-
print the install one-liner.
|
|
91
|
-
|
|
92
|
-
- **Effort**: a day with polish. **Risk**: version skew with whatever
|
|
93
|
-
pi the user has; not "built-in" — two installs.
|
|
94
|
-
- **Verdict**: the right v1. Real UX win immediately, zero coupling.
|
|
95
|
-
- **Bonus**: unrecognized flags pass straight through, so
|
|
96
|
-
`mlx-bun pi -p "summarize @notes.md"` (pi's non-interactive print
|
|
97
|
-
mode), `--mode json/rpc`, `--continue`, `--resume` etc. all work on
|
|
98
|
-
day one without us implementing anything.
|
|
99
|
-
|
|
100
|
-
**Pros**: fast to ship; full pi feature surface via passthrough;
|
|
101
|
-
upgrades to pi arrive for free; failure modes are simple (no pi →
|
|
102
|
-
print install hint). **Cons**: still two installs; we can't control
|
|
103
|
-
the pi version (an upstream flag/behavior change can break our
|
|
104
|
-
launcher); per-run provider injection needs care so we don't pollute
|
|
105
|
-
the user's global config; process lifecycle (server + child TUI)
|
|
106
|
-
needs clean shutdown handling.
|
|
107
|
-
|
|
108
|
-
### Option 3 — SDK embed (the real "built-in"): pi inside the mlx-bun binary
|
|
109
|
-
|
|
110
|
-
This is the one the question was really about, and the SDK is
|
|
111
|
-
explicitly designed for it:
|
|
112
|
-
|
|
113
|
-
- `createAgentSession({...})` builds a session; the
|
|
114
|
-
`examples/sdk/12-full-control.ts` example shows **zero-discovery**
|
|
115
|
-
embedding: in-memory `SessionManager`/`SettingsManager`/
|
|
116
|
-
`ModelRegistry`, custom `ResourceLoader`, explicit tool list,
|
|
117
|
-
runtime API keys — nothing leaks from/to `~/.pi` unless we want it
|
|
118
|
-
to.
|
|
119
|
-
- `InteractiveMode` is exported: "full TUI interactive mode with
|
|
120
|
-
editor, chat history, and all built-in commands", constructed from
|
|
121
|
-
an `AgentSessionRuntime`. We do not rebuild a chat TUI from pi-tui
|
|
122
|
-
primitives (the tui docs are explicit that components are for
|
|
123
|
-
extensions, not a full-app kit) — we run *pi's own* TUI in-process.
|
|
124
|
-
- Provider wiring: register an `openai-completions` provider at our
|
|
125
|
-
own server's baseUrl (loopback HTTP into our already-running
|
|
126
|
-
`Bun.serve` — simplest and keeps one code path for external
|
|
127
|
-
clients), models listed from our registry with real context-window
|
|
128
|
-
numbers per device profile.
|
|
129
|
-
- Flow for `mlx-bun pi`: detect profile → ensure model → start server
|
|
130
|
-
in-process → `createAgentSession` against `localhost` →
|
|
131
|
-
`new InteractiveMode(runtime).run()`.
|
|
132
|
-
|
|
133
|
-
Open engineering questions (all look tractable, none look fatal):
|
|
134
|
-
|
|
135
|
-
1. **One process, two workloads**: the TUI event loop and the
|
|
136
|
-
server/generation queue share the JS thread; mlx compute happens in
|
|
137
|
-
native code but graph-build is JS-side (~ms-scale per decode step).
|
|
138
|
-
TUI rendering is differential and cheap; needs a smoke test for
|
|
139
|
-
input latency during decode, not a redesign.
|
|
140
|
-
2. **Bundle plumbing**: embed pi's asset list + pi-tui `.node`
|
|
141
|
-
prebuilds + photon wasm into the Phase 5 compile. Upstream's own
|
|
142
|
-
binary build proves each piece works under `bun build --compile`;
|
|
143
|
-
our work is making *their* asset-path resolution find files inside
|
|
144
|
-
*our* bundle.
|
|
145
|
-
3. **Version pinning**: pi moves fast (0.79.x); pin exact, upgrade
|
|
146
|
-
deliberately, keep Option 2 as the fallback path when upstream
|
|
147
|
-
breaks SDK surface.
|
|
148
|
-
4. **Identity**: embedded pi should read/write its own session dir
|
|
149
|
-
(`~/.mlx-bun/pi-sessions` or similar) and not fight a user's
|
|
150
|
-
standalone pi install. The full-control example shows every knob
|
|
151
|
-
needed (`agentDir`, custom storage paths).
|
|
152
|
-
|
|
153
|
-
- **Effort**: ~1–2 weeks including bundle work and latency testing.
|
|
154
|
-
- **Verdict**: feasible and high-value; this is the appliance moment —
|
|
155
|
-
one binary, one command, a real agent on a local model. `-p` and
|
|
156
|
-
`--mode rpc/json` remain supported natively: `runPrintMode` and
|
|
157
|
-
`runRpcMode` are SDK exports, so the embedded CLI keeps pi's
|
|
158
|
-
headless modes.
|
|
159
|
-
|
|
160
|
-
**Pros**: the true appliance — one binary, no prior installs; we pin
|
|
161
|
-
and test the exact pi version we ship; full control of defaults
|
|
162
|
-
(session dir, tools, system prompt, model list per device profile);
|
|
163
|
-
in-process events shared with the web UI; offline-clean.
|
|
164
|
-
**Cons**: most engineering (asset bundling, latency validation); we
|
|
165
|
-
own the upgrade treadmill for a fast-moving 0.x dependency; embedded
|
|
166
|
-
pi diverges from the user's own pi config/extensions unless we
|
|
167
|
-
deliberately opt into discovery; binary grows ~20 MB.
|
|
168
|
-
|
|
169
|
-
### Option 4 — RPC / JSON event-stream mode (not for the terminal — for the web UI)
|
|
170
|
-
|
|
171
|
-
`pi --mode rpc` speaks JSONL over stdin/stdout: `prompt`, `steer`,
|
|
172
|
-
`abort`, model control, state/stats queries, plus a streamed event
|
|
173
|
-
model (`message_update` deltas, `tool_execution_*`, `turn_*`) and even
|
|
174
|
-
an extension-UI sub-protocol. The docs name "custom frontends (web
|
|
175
|
-
dashboards…)" as a primary use case.
|
|
176
|
-
|
|
177
|
-
- **Verdict**: wrong tool for `mlx-bun pi` (we'd be rebuilding pi's
|
|
178
|
-
TUI on top of pi), but the **right backbone for the built-in web
|
|
179
|
-
chat UI**: `mlx-bun` serves a page; the server bridges
|
|
180
|
-
WebSocket ↔ RPC events (or drives `AgentSession.subscribe()`
|
|
181
|
-
in-process — same event shapes, no subprocess). Tool calls,
|
|
182
|
-
steering, and progress come for free instead of us re-implementing
|
|
183
|
-
an agent loop in the browser.
|
|
184
|
-
|
|
185
|
-
**Pros**: documented, versioned JSONL protocol; UI-agnostic (web,
|
|
186
|
-
IDE, bots); steering/abort/stats built in; works with either the
|
|
187
|
-
subprocess or the embedded session as the engine. **Cons**: not a
|
|
188
|
-
terminal UX at all; strict framing rules to honor; the extension-UI
|
|
189
|
-
sub-protocol must be bridged if extensions prompt the user.
|
|
190
|
-
|
|
191
|
-
## Does this make sense as a feature?
|
|
192
|
-
|
|
193
|
-
Yes — it is arguably the highest-leverage product move available:
|
|
194
|
-
|
|
195
|
-
- It converts mlx-bun from "a server you point things at" into a
|
|
196
|
-
complete local-AI appliance, which is the PRODUCT_ROADMAP north
|
|
197
|
-
star verbatim.
|
|
198
|
-
- The marginal cost is small because the hard parts are already done
|
|
199
|
-
on both sides: our OpenAI surface is SDK-verified, pi's SDK is
|
|
200
|
-
designed for embedding, and both projects compile with the same Bun
|
|
201
|
-
toolchain. MIT licensing removes the bundling question.
|
|
202
|
-
- One investigation, both deliverables: the same `AgentSession` event
|
|
203
|
-
stream powers the embedded TUI *and* the web chat UI, so direction
|
|
204
|
-
A's two halves share a core.
|
|
205
|
-
- Caveats worth stating: we take on pi's release cadence as a
|
|
206
|
-
dependency; the agent quality ceiling is the local model's (12B
|
|
207
|
-
OptiQ tool-calling is decent but this becomes the showcase — the
|
|
208
|
-
Lucien-direction evals would tell us exactly how good); and the
|
|
209
|
-
embedded TUI must not degrade decode throughput (measure, per house
|
|
210
|
-
rules).
|
|
211
|
-
|
|
212
|
-
## Implementation plan
|
|
213
|
-
|
|
214
|
-
To be explicit about the recommendation: **the locally installed pi is
|
|
215
|
-
the v1 stepping stone, not the destination.** Users who have their own
|
|
216
|
-
pi always get first-class support (P1); the flagship `mlx-bun pi` ends
|
|
217
|
-
as the embedded, single-binary experience (P3/P4).
|
|
218
|
-
|
|
219
|
-
### P1 — `mlx-bun harness pi` (hours–1 day)
|
|
220
|
-
|
|
221
|
-
1. Detect pi (`which pi`, `~/.bun/bin/pi`, npm global); report version.
|
|
222
|
-
2. Generate an extension file (e.g. `~/.pi/agent/extensions/mlx-bun.ts`)
|
|
223
|
-
that calls `pi.registerProvider("mlx-bun", ...)` with **dynamic
|
|
224
|
-
discovery**: fetch our `/v1/models` at pi startup so the model list
|
|
225
|
-
tracks the server. No models.json surgery; trivially reversible
|
|
226
|
-
(delete one file).
|
|
227
|
-
3. Validate: tiny completion against the running server through pi's
|
|
228
|
-
provider path; print `pi --provider mlx-bun` launch hint.
|
|
229
|
-
4. Failure modes: pi missing → print install one-liner; server down →
|
|
230
|
-
offer to start it.
|
|
231
|
-
|
|
232
|
-
### P2 — `mlx-bun pi` v1: subprocess launcher (~1–2 days)
|
|
233
|
-
|
|
234
|
-
1. Ensure server: reuse a running instance if healthy, else start
|
|
235
|
-
in-process and wait for readiness.
|
|
236
|
-
2. Resolve the pi binary; if absent, offer the installer.
|
|
237
|
-
3. Spawn pi with stdio inherited and a **session-scoped provider**: a
|
|
238
|
-
generated `-e <tmp-extension>.ts` registering the provider for this
|
|
239
|
-
run only (no global config writes), plus
|
|
240
|
-
`--provider mlx-bun --model <profile default>`.
|
|
241
|
-
4. **Pass through all remaining argv** — this is where `mlx-bun pi -p
|
|
242
|
-
"..."`, `--mode rpc`, `--continue`, `@file` args work for free.
|
|
243
|
-
5. Lifecycle: child exit → optionally keep the server warm (flag);
|
|
244
|
-
SIGINT goes to the child (pi handles double-ctrl-C), server shuts
|
|
245
|
-
down cleanly after.
|
|
246
|
-
|
|
247
|
-
### P3 — embed spike (≤1 week, run via `bun run`, no bundling yet)
|
|
248
|
-
|
|
249
|
-
1. Add pi packages as pinned deps (exact `0.79.x`).
|
|
250
|
-
2. Wire `createAgentSession` full-control style: in-memory
|
|
251
|
-
registry/settings, our provider at the loopback baseUrl, session
|
|
252
|
-
dir under `~/.mlx-bun/`, default tools, our system prompt.
|
|
253
|
-
3. Run `new InteractiveMode(runtime)` in the same process as the
|
|
254
|
-
server.
|
|
255
|
-
4. **Gates** (house rule — numbers on this machine): editor latency
|
|
256
|
-
during 12B decode subjectively clean + decode tok/s within noise
|
|
257
|
-
of server-only; tool-call round-trip (read/bash/edit) works against
|
|
258
|
-
the 12B; clean teardown.
|
|
259
|
-
5. Decide discovery policy: default isolated; `--pi-config` opt-in to
|
|
260
|
-
the user's `~/.pi` extensions/skills/themes.
|
|
261
|
-
|
|
262
|
-
### P4 — single binary + shared event plumbing (~1 week)
|
|
263
|
-
|
|
264
|
-
1. Fold pi's asset manifest (theme JSONs, PNGs, export-html templates,
|
|
265
|
-
photon wasm, pi-tui darwin `.node` prebuilds) into the Phase 5
|
|
266
|
-
`bun build --compile`; patch/verify pi's asset-path resolution
|
|
267
|
-
inside the bundle (upstream's own binary build is the existence
|
|
268
|
-
proof).
|
|
269
|
-
2. CLI surface: `mlx-bun pi [pi-args]` → embedded `InteractiveMode`;
|
|
270
|
-
`-p` → `runPrintMode`; `--mode rpc` → `runRpcMode`. Subprocess
|
|
271
|
-
path (P2) remains as `--external-pi` fallback.
|
|
272
|
-
3. Web chat UI rides the same `AgentSession.subscribe()` events over
|
|
273
|
-
WebSocket (Option 4 shape, in-process — no subprocess needed).
|
|
274
|
-
4. Upgrade policy: bump pi deliberately per release, re-run the P3
|
|
275
|
-
gates as the regression suite.
|
|
276
|
-
|
|
277
|
-
### First-run starter model (folds into P2/P4; model gated on Phase 14)
|
|
278
|
-
|
|
279
|
-
The first-run experience must not be "watch a progress bar for 10
|
|
280
|
-
minutes." Plan: a sub-gigabyte **starter model** downloads first and is
|
|
281
|
-
chatting within ~1 minute — with a docs-grounded "tour guide" system
|
|
282
|
-
prompt (README + server-api + pi guide preloaded, so a 1B doesn't
|
|
283
|
-
hallucinate about mlx-bun) and a banner: *"the ideal model for your Mac
|
|
284
|
-
is downloading in the background."* The profile model streams behind it
|
|
285
|
-
(sequenced, not parallel, so downloads don't split bandwidth); swap
|
|
286
|
-
when ready.
|
|
287
|
-
|
|
288
|
-
Measured sizes (HF tree API, 2026-06-12):
|
|
289
|
-
|
|
290
|
-
| Candidate | Download | Note |
|
|
291
|
-
|---|---|---|
|
|
292
|
-
| gemma-4-e2b-it-OptiQ-4bit | 5.26 GB | smallest Gemma — disqualifies the family for the starter slot |
|
|
293
|
-
| gemma-4-e4b / 12B OptiQ-4bit | 7.0 / 8.4 GB | profile models, not starters |
|
|
294
|
-
| **Qwen3.5-0.8B-OptiQ-4bit** | **0.89 GB** | **preferred**: rides the Phase 14 Qwen port; doubles as the first tier-a parity target |
|
|
295
|
-
| MiniCPM5-1B-OptiQ-4bit | 0.92 GB | strong (52% MMLU, +4.44 OptiQ delta) but a third architecture family — A/B later |
|
|
296
|
-
|
|
297
|
-
Decisions: starter is **downloaded, never bundled** (a ~900 MB binary
|
|
298
|
-
kills brew install); it stays on disk afterward (future
|
|
299
|
-
speculative-decoding draft + always-works fallback). Hot-swap (or
|
|
300
|
-
offer-to-swap) when the profile model lands is the only new runtime
|
|
301
|
-
work. Dependency: a runnable sub-GB model requires the Phase 14 Qwen
|
|
302
|
-
bring-up — the starter feature is the reason the 0.8B goes first there.
|
|
303
|
-
|
|
304
|
-
## Recommended sequence
|
|
305
|
-
|
|
306
|
-
P1 + P2 now (days, immediate demo value, zero coupling) → P3 spike
|
|
307
|
-
with its latency gate → P4 single-binary flagship, reusing the event
|
|
308
|
-
plumbing for the built-in web UI.
|