mlx-bun 0.4.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 +1453 -88
- 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 +10 -8
- 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 +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- 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 +42 -83
- package/src/server/generated-token-history.ts +57 -0
- 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 +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- 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 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- 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/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- 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 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- 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 -106
- 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/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- 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 -130
- 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 -133
- 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/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- 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 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- 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 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- 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 -452
- 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 -1346
- package/src/grammar.ts +0 -591
- 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 -39
- 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 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- 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-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- 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 -388
- 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 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- 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 -93
- 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 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- 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 -2351
- package/src/model/gemma4.ts +0 -1315
- 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 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- 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 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- 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 -102
- 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 -83
- 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/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- 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 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- 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 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- 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/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 -496
- 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 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- 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/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- 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 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- 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 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- 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 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- 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 -1057
- package/src/web/src/composer.ts +0 -959
- 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/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/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,173 +0,0 @@
|
|
|
1
|
-
# Trainer validation experiment
|
|
2
|
-
|
|
3
|
-
**Status:** in progress (started 2026-06-20). **Goal:** prove the from-scratch
|
|
4
|
-
SFT/DPO/ORPO trainer actually works before trusting any downstream result — general
|
|
5
|
-
capability (Goal 1) or task-specific (Goal 2).
|
|
6
|
-
|
|
7
|
-
## Why this exists — the smoking gun
|
|
8
|
-
|
|
9
|
-
The margin/accuracy is recorded in `metrics.json` (`valTrajectory[].margin`,
|
|
10
|
-
`bestMargin`), not the stdout log. The prior `cpm5-uf` ORPO run (λ=0.1) shows:
|
|
11
|
-
|
|
12
|
-
| step | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 |
|
|
13
|
-
|---|---|---|---|---|---|---|---|---|
|
|
14
|
-
| accuracy | .507 | .514 | .534 | .541 | .534 | .520 | .547 | .547 |
|
|
15
|
-
| margin | .132 | .124 | .110 | .120 | .136 | .128 | .118 | .123 |
|
|
16
|
-
|
|
17
|
-
**Preference accuracy is ~0.52 (near the 0.50 coin-flip) and the margin is flat.**
|
|
18
|
-
ORPO's defining job is to push accuracy up and widen the margin. This is *not* a clean
|
|
19
|
-
"it works" signal. Caveats: 800 steps ≈ 0.05 epoch (undertrained), provenance
|
|
20
|
-
(from-base vs warm-start) unconfirmed. But it's enough to make validation mandatory:
|
|
21
|
-
**we cannot currently claim our ORPO learns the preference at all.**
|
|
22
|
-
|
|
23
|
-
## Method-decomposition (the validation key)
|
|
24
|
-
|
|
25
|
-
`ORPO_loss = NLL(chosen) + λ·L_OR`. NLL is exactly the SFT objective; L_OR is the
|
|
26
|
-
reference-free odds-ratio preference term. So we validate the building blocks, and ORPO
|
|
27
|
-
is covered by its parts plus a small ORPO-specific surface (the OR term + λ).
|
|
28
|
-
|
|
29
|
-
mlx-lm has **no DPO/ORPO** — so the oracle strategy is:
|
|
30
|
-
- **SFT/NLL** → numeric parity vs **mlx-lm tuner** (oracle env exists).
|
|
31
|
-
- **DPO + OR loss** → **numeric unit test vs the paper's equations** on a fixed tiny
|
|
32
|
-
input (hand-computed expected loss + grad). No external dep. Optional stronger
|
|
33
|
-
cross-check: **TRL** `DPOTrainer`/`ORPOTrainer` loss (PyTorch; multi-GB env →
|
|
34
|
-
approve-first, not default).
|
|
35
|
-
|
|
36
|
-
Every positive control is designed so "weak data / weak lever" is **not** an available
|
|
37
|
-
excuse — success must be unambiguous.
|
|
38
|
-
|
|
39
|
-
## PILLAR 1 — Prove the trainer (gate for everything)
|
|
40
|
-
|
|
41
|
-
- **1a · SFT positive control** *(infra GREEN, behavioral check WEAK)*. Train
|
|
42
|
-
`fixtures/adapters/data-upper` from scratch on MiniCPM5; assert generations are
|
|
43
|
-
actually uppercased (oracle: the repo's pre-trained `upper` adapter). Existing
|
|
44
|
-
`train-e2e.test.ts` only checks loss↓ — add the behavioral assert. *(seconds)*
|
|
45
|
-
- **1b · DPO positive control** *(MISSING)*. Trivial preference (chosen uppercase,
|
|
46
|
-
rejected lowercase). Assert **margin increases** and **preference accuracy → ~1.0**.
|
|
47
|
-
- **1c · ORPO positive control + the real question.** (i) Same trivial preference →
|
|
48
|
-
accuracy → ~1.0. (ii) **From-BASE ORPO on UF**, multiple epochs, watch margin widen
|
|
49
|
-
and accuracy climb well above chance — directly resolves the near-chance finding
|
|
50
|
-
(undertraining vs warm-start vs bug).
|
|
51
|
-
- **1d · Loss-formula parity.** SFT NLL vs mlx-lm; DPO/ORPO loss + grad vs hand-computed
|
|
52
|
-
paper equations (unit test). The training-side analogue of the inference logit-parity
|
|
53
|
-
oracle — currently MISSING.
|
|
54
|
-
- **1e · vs the paper.** Internal proxy first: preference accuracy robustly > chance on
|
|
55
|
-
UF. Then (approve-first, LLM-judge) AlpacaEval/MT-Bench **direction** vs base (not
|
|
56
|
-
absolute — paper used 7B). optiq suite (incl. IFEval) is an already-local downstream.
|
|
57
|
-
|
|
58
|
-
> **Gate:** until 1a–1c are green, Pillars 2 & 3 sit on an unverified trainer.
|
|
59
|
-
|
|
60
|
-
## PILLAR 2 — Measure general-capability impact (optiq suite)
|
|
61
|
-
|
|
62
|
-
All 6 datasets are present locally (`~/.cache/mlx-bun/eval-data/`: mmlu, gsm8k, ifeval,
|
|
63
|
-
bfcl, humaneval, hashhop); harness = `scripts/eval.ts capability`.
|
|
64
|
-
- **2a · Eval parity:** run on base CPM5, reproduce optiq's **30.28** within tolerance
|
|
65
|
-
(validates the *measurement* before trusting deltas; confirm the README's open BFCL
|
|
66
|
-
"no-calls" / MMLU "at-chance" flags aren't broken on our side).
|
|
67
|
-
- **2b · Delta:** trained checkpoint vs base, on the 6-task mean.
|
|
68
|
-
- **2c · Targeting:** mean is floored by **BFCL 0.0 / GSM8K 2.7 / HashHop 4.0**; UF hits
|
|
69
|
-
the already-strong IFEval, so expect small mean movement. Highest-leverage Goal-1 lever
|
|
70
|
-
is **BFCL** (0.0 is format-trainable; 0→30 = +5 on the mean).
|
|
71
|
-
|
|
72
|
-
## PILLAR 3 — Task-specific (separate; gated on Pillar 1)
|
|
73
|
-
|
|
74
|
-
Chunk segmenter via `scripts/chunk-eval.ts` (boundary/label accuracy), using the
|
|
75
|
-
hard-negative ORPO data (remove-a-cut / add-a-cut, balanced to kill the length
|
|
76
|
-
shortcut). Measured by chunk accuracy, not val loss / capability. Credibility depends on
|
|
77
|
-
Pillar 1.
|
|
78
|
-
|
|
79
|
-
## Sequencing & gates
|
|
80
|
-
|
|
81
|
-
1. Pillar 1 positive controls (1a→1b→1c-trivial) — fast, "does the machinery work."
|
|
82
|
-
2. Pillar 1 real replication (1c from-base UF) + 1d loss-formula parity.
|
|
83
|
-
3. Pillar 2a eval-parity (reproduce 30.28) → 2b deltas.
|
|
84
|
-
4. Pillar 3 — once the trainer is trusted.
|
|
85
|
-
|
|
86
|
-
## Execution log
|
|
87
|
-
|
|
88
|
-
### 2026-06-20 — Pillar 1 quick validations: PASS
|
|
89
|
-
|
|
90
|
-
**Machinery + gradient correctness — GREEN.** `MLX_BUN_TEST_TRAIN=1 bun test
|
|
91
|
-
train-autograd train-e2e train-orpo-e2e` → 8 pass / 0 fail, real training on
|
|
92
|
-
MiniCPM5 (11.3s). `train-autograd` confirms the backward matches autograd.
|
|
93
|
-
|
|
94
|
-
**ORPO positive control (prefer-uppercase, 12 train / 4 val, 120 iters, lr 1e-3) — PASS.**
|
|
95
|
-
Held-out preference accuracy **1.000 by step 10**, margin **5.5 → 4.0** (noisy at lr=1e-3
|
|
96
|
-
but accuracy solid). Logged: `runs/orpo-pc.{json,csv}`.
|
|
97
|
-
|
|
98
|
-
**DPO positive control (same data) — PASS, cleaner.** Accuracy **1.000 from step 10**,
|
|
99
|
-
margin **monotonic 6.46 → 9.67**. Logged: `runs/dpo-pc.{json,csv}`.
|
|
100
|
-
|
|
101
|
-
**Conclusion: the preference machinery is validated.** On a learnable preference both
|
|
102
|
-
DPO and ORPO drive accuracy to 1.0 and the margin wide open (vs UF's flat ~0.12). A
|
|
103
|
-
broken trainer could not. ⇒ **The UF near-chance result is the DATA, not a bug** — UF
|
|
104
|
-
pairs are genuinely subtle for a 1B (both responses plausible); "prefer uppercase" is
|
|
105
|
-
trivially separable. The smoking gun is explained: implementation sound, lever weak.
|
|
106
|
-
|
|
107
|
-
**Gotcha found (recorded so we don't repeat it):** `AdapterManager.mount` (the *serving*
|
|
108
|
-
hot-swap path) does **not** reflect into `branchLogpMean` (the *training* forward) — an
|
|
109
|
-
external base-vs-adapter `orpoMetrics` measurement via mount returns bit-identical
|
|
110
|
-
numbers (measured: 0.500/0.1463 both). Measure training-side metrics via the
|
|
111
|
-
`trainLora` emit / loraState path (`scripts/experiments/pref-control.ts`), not mount.
|
|
112
|
-
|
|
113
|
-
**Logging for plotting:** `runs/<stem>.{json,csv}` — per-step train `{loss, accuracy,
|
|
114
|
-
margin}` + per-eval val `{loss, accuracy, margin}`. CSV columns: `phase,step,loss,
|
|
115
|
-
accuracy,margin`. Tools: `scripts/experiments/pref-control.ts` (train+log),
|
|
116
|
-
`scripts/experiments/measure-pref.ts` (standalone adapter eval — superseded by the
|
|
117
|
-
emit path for training metrics; see gotcha).
|
|
118
|
-
|
|
119
|
-
### 2026-06-20 — Pillar 2a: capability-harness parity. Two bugs found + fixed.
|
|
120
|
-
|
|
121
|
-
**The first-measure step caught two harness bugs** (exactly its purpose — never trust a
|
|
122
|
-
delta until the harness reproduces the published baseline):
|
|
123
|
-
|
|
124
|
-
1. **Thinking mode.** The eval rendered the chat template's *default* (thinking-on for
|
|
125
|
-
MiniCPM5); optiq's numbers are **non-thinking** (HF card: IFEval 64.7 is non-thinking).
|
|
126
|
-
Symptom: IFEval **36.7%** vs 64.7. **Fix:** `src/eval/runner.ts` `generateText` now
|
|
127
|
-
renders `enableThinking: false` by default (env `MLX_BUN_EVAL_THINK=1` to re-enable).
|
|
128
|
-
→ IFEval **73.3%** (n=30), optiq ballpark.
|
|
129
|
-
2. **HumanEval oracle-python path.** `src/eval/tasks/humaneval.ts` hardcoded
|
|
130
|
-
`/Users/joshrossi/Code/mlx-lm/.venv/bin/python` — wrong on this machine (it's
|
|
131
|
-
`mlx-lm-example`), so every code-exec spawned a missing interpreter → **0%**. **Fix:**
|
|
132
|
-
env-overridable `MLX_BUN_ORACLE_PYTHON` (committed default = reference box; never
|
|
133
|
-
re-commit the path). → HumanEval **53.3%** (n=15), optiq 57.9.
|
|
134
|
-
|
|
135
|
-
**Post-fix parity (base CPM5, non-thinking, n=20 — all ballpark):**
|
|
136
|
-
|
|
137
|
-
| | MMLU | GSM8K | IFEval | BFCL | HumanEval | HashHop |
|
|
138
|
-
|---|---|---|---|---|---|---|
|
|
139
|
-
| ours | 55.0 | 10.0 | 75.0 | 0.0 | ~53 | 0.0 |
|
|
140
|
-
| optiq | 52.4 | 2.7 | 64.7 | 0.0 | 57.9 | 4.0 |
|
|
141
|
-
|
|
142
|
-
⇒ **harness reproduces optiq.** Small-n inflation on GSM8K/IFEval will settle toward
|
|
143
|
-
optiq on the full set. **Exp-1 baseline harness VALIDATED.**
|
|
144
|
-
|
|
145
|
-
### Ready-to-fire sequence (everything staged; only GPU time remains)
|
|
146
|
-
|
|
147
|
-
All measurement tools validated. `scripts/eval.ts` now takes `--adapter <dir>` (mounts the
|
|
148
|
-
trained LoRA → x2). `ORC=/Users/joshrossi/Code/mlx-lm-example/.venv/bin/python` below.
|
|
149
|
-
|
|
150
|
-
1. **x1** (running): `MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5`
|
|
151
|
-
2. **Train** (user): from-base ORPO/UF → `./adapters/cpm5-uf-frombase` (command in chat).
|
|
152
|
-
3. **x2 (Exp 1 after):** `MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5 --adapter ./adapters/cpm5-uf-frombase` → compare to x1.
|
|
153
|
-
4. **Exp 2 gen (GPU):** `bun scripts/experiments/prefbench.ts gen mtbench ./adapters/cpm5-uf-frombase mtbench-uf` (and `gen alpaca … alpaca-uf 200` for a subset).
|
|
154
|
-
5. **Exp 2 judge (codex, anytime):** `bun scripts/experiments/prefbench.ts judge mtbench-uf` → TRAINED win-rate vs BASE.
|
|
155
|
-
|
|
156
|
-
### Next
|
|
157
|
-
- **Full baseline:** see step 1 (running). **(long → user-launched)**
|
|
158
|
-
- **Train (the "do"):** from-base ORPO on UF (`pref-control.ts`, command in chat). **(long → user-launched)**
|
|
159
|
-
- **Re-measure → x2**, compare to x1. Exp 1 done.
|
|
160
|
-
- **Exp 2 judge — VALIDATED (keyless).** No OpenAI key needed: the judge shells out to
|
|
161
|
-
`codex exec -m gpt-5.4-mini` (codex's own auth), forcing structured `{"winner":...}` via
|
|
162
|
-
`--output-schema` and reading the clean verdict from `-o`. `scripts/experiments/llm-judge.ts`
|
|
163
|
-
— `judgeOnce` + `judgePair` (judges BOTH orders to cancel small-judge position bias).
|
|
164
|
-
Positive control: **3/3 obvious good-vs-bad pairs, good won both orders, zero flips.**
|
|
165
|
-
1bx vs 1bx1; consistency (same judge both sides), not absolute comparability to the paper's GPT-4.
|
|
166
|
-
- **Exp 2 harness — STAGED.** Prompts downloaded: `~/.cache/mlx-bun/eval-data/{mt_bench.jsonl
|
|
167
|
-
(80), alpaca_eval.json (805)}`. Two-phase runner `scripts/experiments/prefbench.ts`:
|
|
168
|
-
`gen <mtbench|alpaca> <adapterDir> <stem> [limit]` (GPU — base then trained, non-thinking)
|
|
169
|
-
→ `runs/<stem>.responses.jsonl`; `judge <stem> [limit]` (codex) → TRAINED win-rate vs BASE,
|
|
170
|
-
judging trained-vs-base **directly** (head-to-head, not vs a fixed reference). Only the `gen`
|
|
171
|
-
phase needs GPU; everything else is validated. Fire after the from-base training produces
|
|
172
|
-
`./adapters/cpm5-uf-frombase`.
|
|
173
|
-
- **1c real / 1d parity** — still open (lower priority now the positive controls + harness parity are green).
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
# Chat UI Vision: The Model That Knows You
|
|
2
|
-
|
|
3
|
-
**Stance: memory/personalization-first.** Every other axis in this
|
|
4
|
-
doc — speed, tools, LoRA routing, privacy — is real, but it is in
|
|
5
|
-
service of one idea: mlx-bun is the only local chat surface where the
|
|
6
|
-
model visibly, auditably gets better at being *yours* over time. If we
|
|
7
|
-
build a fast, private, tool-capable chat app that doesn't make that
|
|
8
|
-
tangible on screen, we've built LM Studio with worse artifacts. That is
|
|
9
|
-
not the plan.
|
|
10
|
-
|
|
11
|
-
## The feeling
|
|
12
|
-
|
|
13
|
-
Open the app. It's not a hero screen with generic suggestion chips —
|
|
14
|
-
it's a hero screen that already knows something. Not in a creepy way:
|
|
15
|
-
in the way a good assistant who's worked with you for months starts a
|
|
16
|
-
Monday with "want me to pick up the Lisbon itinerary thing from
|
|
17
|
-
Thursday?" instead of "How can I help you today?" It should feel like
|
|
18
|
-
walking into a room where someone has been quietly paying attention,
|
|
19
|
-
not opening a fresh terminal.
|
|
20
|
-
|
|
21
|
-
The tell, mechanically: a chat with mlx-bun after a month of use is a
|
|
22
|
-
*different product* from day one — not because we shipped a new model,
|
|
23
|
-
but because the sidebar, the hero, and the answers themselves carry
|
|
24
|
-
accumulated context the user can see, correct, and trust. Cloud
|
|
25
|
-
chatbots fake a version of this behind a black box on someone else's
|
|
26
|
-
server. Local competitors (LM Studio, Ollama, macMLX) don't attempt
|
|
27
|
-
it — stateless between chats by design. Open WebUI and AnythingLLM
|
|
28
|
-
attempt it as prompt-stuffing into a flat fact list. Odysseus gets
|
|
29
|
-
closest (memory + skills) but on vLLM/llama.cpp infra with no adapter
|
|
30
|
-
concept at all. **Nobody combines memory-as-training-artifact with
|
|
31
|
-
weight-level LoRA routing and native MLX speed. That combination is the
|
|
32
|
-
whole pitch, and today it's invisible in our own UI** — the vault, the
|
|
33
|
-
memory tools, and the adapter runtime already exist server-side; none
|
|
34
|
-
of it shows on screen.
|
|
35
|
-
|
|
36
|
-
## The five things that make this unmistakable
|
|
37
|
-
|
|
38
|
-
**1. Memory is a visible citizen of the chat, not a silent tool call.**
|
|
39
|
-
Today `memory_search`/`memory_read` fire invisibly inside a generic
|
|
40
|
-
tool-call card indistinguishable from a bash command. The redesign
|
|
41
|
-
gives memory its own visual language: when the model consults the
|
|
42
|
-
vault mid-answer, a small soft-colored chip appears inline — not a
|
|
43
|
-
context dump, not an approval gate (it's read-only, never needs
|
|
44
|
-
permission), just a quiet citation: **"grounded in: Photography,
|
|
45
|
-
Lisbon-2026"**. Click it, it expands to the exact section read. This
|
|
46
|
-
is the single highest-leverage UI change in the whole plan: it turns
|
|
47
|
-
an architectural property ("the model is grounded in your vault") into
|
|
48
|
-
a *felt* one, every single turn, for free, using tool-call
|
|
49
|
-
infrastructure that already exists.
|
|
50
|
-
|
|
51
|
-
**2. A real Memory surface — not a settings toggle, a workspace.** New
|
|
52
|
-
8th tab (or better: reachable via one click from the sidebar, since
|
|
53
|
-
memory is chat-adjacent, not admin-adjacent): a vault browser. Articles
|
|
54
|
-
+ categories on the left, a reading pane on the right, a wikilink graph
|
|
55
|
-
view (the backend already resolves `memory_links` — nobody has drawn
|
|
56
|
-
it). Critically: a **git-history scrubber** on every article, because
|
|
57
|
-
self-healing-through-correction (the wiki updates itself when you
|
|
58
|
-
contradict a prior claim) is our best differentiator-in-the-flesh and
|
|
59
|
-
today it happens with zero visible seam. Correct the model about your
|
|
60
|
-
camera body in a chat on Tuesday; open the Photography article on
|
|
61
|
-
Wednesday and see the diff, dated, with the source conversation linked.
|
|
62
|
-
This is the "watch it happen" answer to ChatGPT/Claude's opaque
|
|
63
|
-
"Manage Memories" list — we don't just show *what* is remembered, we
|
|
64
|
-
show *how it changed and why*, because the whole pipeline runs on the
|
|
65
|
-
user's own disk.
|
|
66
|
-
|
|
67
|
-
**3. LoRA adapters are a routing story, not a filename dropdown.** The
|
|
68
|
-
current `<select>` lists raw ids (`minicpm5-chunk-final · r16`). The
|
|
69
|
-
redesign gives every adapter a name, a one-line specialty, and a
|
|
70
|
-
*kind*: **memory adapters** (trained nightly from the vault — these are
|
|
71
|
-
the "gets to know you" adapters) versus **task adapters** (coding,
|
|
72
|
-
writing-voice, whatever a user trains deliberately). The composer shows
|
|
73
|
-
a small persistent chip: **"grounded in your Writing adapter"** with a
|
|
74
|
-
one-click swap, and — since the backend already supports it — a
|
|
75
|
-
**stacking** affordance (memory adapter + task adapter together,
|
|
76
|
-
visibly, not just via a hidden `a+b` string). This is where LoRA
|
|
77
|
-
routing and memory literally become the same feature in the UI: a
|
|
78
|
-
memory-LoRA *is* accumulated personalization made concrete in weights,
|
|
79
|
-
and that's a claim no competitor's "persona" or "preset" system
|
|
80
|
-
(LM Studio Presets, Msty Personas, Ollama Modelfiles) can make, because
|
|
81
|
-
none of them adapt weights per user.
|
|
82
|
-
|
|
83
|
-
**4. Speed is shown, not hidden, because it's the substrate memory runs
|
|
84
|
-
on.** A live perf strip near the composer — tok/s, TTFT, prompt-cache
|
|
85
|
-
hit (already computed server-side, never surfaced), a plain-English
|
|
86
|
-
serving-lane badge ("batched ×3" / "spec-decode active"). This isn't a
|
|
87
|
-
generic benchmarking flex: it's what makes "the model reads your whole
|
|
88
|
-
vault before answering, every time, and it's still instant" credible
|
|
89
|
-
instead of hopeful. Fast local retrieval is worthless if it feels slow.
|
|
90
|
-
|
|
91
|
-
**5. Tool-call and approval UI as a trust surface for an agent with
|
|
92
|
-
real disk access.** The approval gate is fully built (per-call
|
|
93
|
-
allow/deny, diff preview) but dead in web chat today — the browser
|
|
94
|
-
tool allowlist excludes bash/edit/write entirely. Ship a "Power" mode
|
|
95
|
-
that widens the toolset with the approval cards already built, styled
|
|
96
|
-
as inline code-review hunks (LM Studio's argument-editable pattern,
|
|
97
|
-
Jan's non-blocking inline cards). This matters to the memory thesis
|
|
98
|
-
specifically: a vault the model can *write* to, not just read, is the
|
|
99
|
-
next step after this redesign, and users need to already trust
|
|
100
|
-
approval before we get there.
|
|
101
|
-
|
|
102
|
-
## Making it tangible in the surface
|
|
103
|
-
|
|
104
|
-
**Layout.** Keep the two-pane shape (sidebar + thread) — it's not
|
|
105
|
-
broken, and Msty/Claude/ChatGPT converge on it. Change what the sidebar
|
|
106
|
-
*contains*: above the flat session list, a compact **Memory status
|
|
107
|
-
strip** — vault article count, "last synthesis: 6h ago, 3 articles
|
|
108
|
-
updated," a dot that goes amber if synthesis is overdue. This is
|
|
109
|
-
`vaultStatus()` (already returns exactly this data) surfaced for the
|
|
110
|
-
first time. One click opens the Memory workspace as a slide-over, not a
|
|
111
|
-
full tab switch — memory should feel adjacent to chat, not a separate
|
|
112
|
-
destination.
|
|
113
|
-
|
|
114
|
-
**Composer.** Left of Send: the adapter chip (kind-colored — memory
|
|
115
|
-
adapters warm, task adapters cool), click to open a compact router
|
|
116
|
-
panel (available/loaded/selected, RAM cost per loaded adapter, stack
|
|
117
|
-
toggle). Right of the textarea: the perf strip. Above the composer:
|
|
118
|
-
typing `#` surfaces both attached-file context AND vault articles in
|
|
119
|
-
one unified picker, because "attach a file" and "recall something I
|
|
120
|
-
told you" are the same retrieval gesture from the user's point of view.
|
|
121
|
-
Don't teach two mental models for "give the model context."
|
|
122
|
-
|
|
123
|
-
**Messages.** Each assistant bubble gets, for the first time, a real
|
|
124
|
-
action row (copy — currently missing outside code blocks, regenerate,
|
|
125
|
-
edit-and-branch with the ChatGPT/Claude convention of a lightweight
|
|
126
|
-
`< 1/2 >` sibling toggle rather than a full tree). The memory-citation
|
|
127
|
-
chip attaches only when memory tools actually fired that turn — never
|
|
128
|
-
fabricated, because false positives here destroy the trust the feature
|
|
129
|
-
depends on.
|
|
130
|
-
|
|
131
|
-
**Model & adapter switching.** The nav model label goes from a static
|
|
132
|
-
span to a real switcher (currently zero affordance, a stark gap for a
|
|
133
|
-
product built on per-model specialization). The adapter panel sits next
|
|
134
|
-
to it, not buried in a settings modal.
|
|
135
|
-
|
|
136
|
-
**Tool-call display.** Three visual tiers, not one generic card: (a)
|
|
137
|
-
read-only tools (file read, web fetch) render minimally, collapsed,
|
|
138
|
-
auto-allowed; (b) memory tools render as the soft citation chip from
|
|
139
|
-
differentiator #1 — deliberately *not* styled like a tool call; (c)
|
|
140
|
-
mutating tools (bash/edit/write, once Power mode exists) render as the
|
|
141
|
-
inline approve/deny code-review-hunk card with visible diff. Same
|
|
142
|
-
underlying `tool_call` event stream, three renderers — conflating "read
|
|
143
|
-
your camera preferences" with "wants to delete a file" in one visual
|
|
144
|
-
language is exactly what makes today's UI feel generic.
|
|
145
|
-
|
|
146
|
-
**Onboarding.** The <1-minute install-to-chat promise gets a second
|
|
147
|
-
clause: install-to-chat-*that-remembers*-under-two-minutes. First-run
|
|
148
|
-
hero adds one honest, skippable memory-consent step ("Let mlx-bun keep
|
|
149
|
-
a personal notes vault on your Mac? Read, edit, or delete it anytime —
|
|
150
|
-
it's just Markdown files") in the same breath as the first message, not
|
|
151
|
-
buried in a CLI-only `mlx-bun memory init`. Consent has to happen
|
|
152
|
-
*before* the flywheel can start proving itself.
|
|
153
|
-
|
|
154
|
-
## What we deliberately don't build
|
|
155
|
-
|
|
156
|
-
- **No enterprise/multi-user layer** — no RBAC, no Open-WebUI-style
|
|
157
|
-
Channels, no admin console. mlx-bun is single-user by identity.
|
|
158
|
-
- **No general-purpose agent-flow builder** (AnythingLLM's Agent Flows,
|
|
159
|
-
Msty's Turnstiles). Automation, if any, is scoped narrowly to what
|
|
160
|
-
the synthesis pipeline needs, not a drag-and-drop canvas.
|
|
161
|
-
- **No cloud tier, no hosted anything** — no Ollama-style `:cloud`
|
|
162
|
-
hybrid. "Escalate to a bigger model" means local spec-decode against
|
|
163
|
-
a larger local target, never a paid API.
|
|
164
|
-
- **No email/calendar/documents workspace clone** (Odysseus's scope
|
|
165
|
-
creep). Personal-context connectors, if they ever happen, are
|
|
166
|
-
read-only memory *feeders*, not a productivity suite to maintain.
|
|
167
|
-
- **No full conversation-tree graph view.** The lightweight
|
|
168
|
-
sibling-toggle branch UI (ChatGPT/Claude's convention) is the right
|
|
169
|
-
amount of investment; neither incumbent ships a real tree either.
|
|
170
|
-
- **No page-level PDF citation rendering as v1.** Filename + snippet
|
|
171
|
-
citation gets most of the trust benefit for a fraction of the
|
|
172
|
-
engineering; save PDF-aware rendering for later.
|
|
173
|
-
- **No speech-to-speech voice mode as a v1 commitment** — a bolt-on
|
|
174
|
-
STT→LLM→TTS pipeline reads as worse than what users now expect;
|
|
175
|
-
scope as future work, not parity-by-next-release.
|
|
176
|
-
- **No unsandboxed shell tool shipped quietly.** If Power mode widens
|
|
177
|
-
the toolset to bash/edit/write, the approval-gate trust surface
|
|
178
|
-
ships *with* it, not after — Odysseus's unsandboxed bash tool and
|
|
179
|
-
its 48-hour-patched CVEs are the cautionary tale.
|
|
180
|
-
- **No competing on raw model-catalog breadth** (Ollama's library,
|
|
181
|
-
LM Studio's HF browser). MLX-only by identity; a focused, well-labeled
|
|
182
|
-
local model/adapter list beats a sprawling catalog we'd have to
|
|
183
|
-
maintain against a moving target.
|
|
184
|
-
|
|
185
|
-
## Why this ordering, not another
|
|
186
|
-
|
|
187
|
-
Speed, tool UX, and multi-adapter composition are all worth building —
|
|
188
|
-
the research surfaces excellent, copyable patterns for each (Jan's
|
|
189
|
-
inline approval cards, LM Studio's hardware-fit indicator, Msty's
|
|
190
|
-
split-pane compare). But every one of those patterns is *matchable* by
|
|
191
|
-
a well-resourced competitor within a release cycle. The memory flywheel
|
|
192
|
-
is not: it requires a vault architecture, a synthesis pipeline, an
|
|
193
|
-
adapter-namespaced KV runtime, and a product culture willing to treat
|
|
194
|
-
"gets better at being yours" as the headline rather than a checkbox —
|
|
195
|
-
all of which mlx-bun already has built and simply hasn't surfaced. The
|
|
196
|
-
redesign's job is not to invent new backend capability. It's to stop
|
|
197
|
-
hiding the one capability nothing else in this market has, and frame
|
|
198
|
-
every other improvement (speed HUD, tool cards, adapter switching) as
|
|
199
|
-
infrastructure *for* that capability, not a parallel feature track.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# The mlx-bun chat surface: a vision
|
|
2
|
-
|
|
3
|
-
*Draft vision, product/design lead pass — 2026-07-06. Bold stance: reimagine the chat surface from scratch. Companion to the market research and current-state audit that produced it; see `docs/archive/planning/web-ui-pass-plan.md` for the tactical bug list and `docs/design/adapters-end-to-end.md` / `docs/design/memory-system.md` for the backend contracts this vision assumes.*
|
|
4
|
-
|
|
5
|
-
## The feeling
|
|
6
|
-
|
|
7
|
-
Open mlx-bun and it should feel like sitting down with someone who already knows you — not a search box you interrogate, not a terminal you configure, not a dashboard you administer. Every other local-AI chat UI (Open WebUI, LM Studio, Jan, Ollama's app) is, underneath the polish, the **same product**: a stateless request/response window in front of a model file. They compete on how many knobs they expose. We are not building a better knob panel. We are building the only chat surface where "it remembers what I told it three weeks ago, and it's faster than the thing it's replacing" is literally, verifiably true — and where the UI's job is to make that trust legible turn by turn, not assert it in marketing copy.
|
|
8
|
-
|
|
9
|
-
`src/web/app.html` has already solved the hard infrastructure problem (streaming, tool-calls, sessions, steering) and completely missed the product problem: memory is invisible, LoRA routing is a bare `<select>`, and the first thing a new user sees is marketing copy about privacy with zero proof of personalization on screen. The redesign's job is not "add more tabs." It's: collapse the surface to what a person actually touches every day (chat), and make the three things nobody else can build — memory that becomes weights, routed adapters, an engine fast enough to show its work — into things you can *see happen*.
|
|
10
|
-
|
|
11
|
-
## Five things that make this unmistakably not-Open-WebUI
|
|
12
|
-
|
|
13
|
-
**1. Memory has a face, and it's a citation, not a settings toggle.**
|
|
14
|
-
Every competitor's "memory" (ChatGPT, AnythingLLM, Odysseus) is a flat fact-list re-injected into a system prompt — legible after the fact, invisible during the conversation. We already run `memory_search`/`memory_read` silently on every turn (`src/memory/tools.ts`, wired into `webChatToolAllowlist`) and render them with the same generic wrench icon as `bash`. Instead: when a memory tool fires, render a distinct, quieter card — a small "📖 Photography" chip inline with the response — that expands on click to show the exact vault section that grounded that sentence. No context dump, no "as an AI with access to your notes" narration, just a footnote that proves the flywheel is real. This costs almost nothing: the event stream already distinguishes memory calls; we just have to stop rendering them like `bash`.
|
|
15
|
-
|
|
16
|
-
**2. Adapters are personas you route to, not files you pick.**
|
|
17
|
-
Nobody else has hot-swappable LoRA adapters with adapter-namespaced KV — not LM Studio, not Ollama, not Msty (whose "Persona Studio" is prompt-only). We already have `/v1/adapters`, three-tier state, and per-request injection; the UI throws it away on a `<select>` full of raw filenames. Instead: a **persona rail** above the composer, one pill per named persona (adapter + system prompt + tool allowlist + memory scope bundled, a richer Ollama Modelfile), each with a one-line specialty, a resident/cold dot, and RAM cost on hover. Switching shows a "new context segment" micro-transition (genuine, not cosmetic — that's what adapter-namespaced KV means), and a Msty-style split-compare fires one prompt at two personas side by side to *prove* the adapter earns its keep.
|
|
18
|
-
|
|
19
|
-
**3. Speed is a HUD, not a footnote.**
|
|
20
|
-
Today tok/s is a dim gray number after the message finishes. Every other local tool either hides serving mechanics (Open WebUI) or shows only tok/s (Ollama `ps`, LM Studio). We control the whole stack down to spec-decode and batch slots. A persistent strip near the composer: live tok/s *during* the stream, TTFT, a context-fullness ring, and a lane badge — "draft+verify (dspark)" vs "batched ×3" vs "serial" — since mlx-lm's own architecture treats these as mutually exclusive lanes and users should see which one they're in. An internal engineering decision becomes a felt, screenshot-able proof point.
|
|
21
|
-
|
|
22
|
-
**4. Tool-calls are a code-review hunk, not a permission dialog.**
|
|
23
|
-
We already have per-call approve/deny in `pi-web.ts` with a diff-style card; Jan and LM Studio validate the pattern (inline, non-blocking, argument-editable), nobody's pushed it further. Ours should feel like reviewing a PR: syntax-highlighted args, a blast-radius line ("will write 40 lines to `src/foo.ts`"), three-state approval (once / always-this-session / deny) persisted to disk so it survives restarts (Claude Desktop and Cowork visibly get this wrong), and read-only tools pre-approved by default so fatigue only hits tools that deserve scrutiny.
|
|
24
|
-
|
|
25
|
-
**5. The whole thing installs to a felt "it knows me" moment in under a minute.**
|
|
26
|
-
Every competitor's onboarding ends at "chat works." Ours ends at "chat works, and it already asked, gently, whether it can start learning from you." First run: pick a hardware-fit-scored starter model, land in chat, and the hero screen's first chip isn't "what is mlx-bun?" — it's a dismissible memory-consent card ("Let mlx-bun remember what matters across chats? Nightly, local, git-tracked, editable any time.") where a philosophy statement used to be. Say yes and the vault seeds; say no and it never mentions it again — the one screen where "local-to-you" becomes an action instead of a claim.
|
|
27
|
-
|
|
28
|
-
## Making the differentiators tangible, in one line each
|
|
29
|
-
|
|
30
|
-
**Privacy** = a one-click "Temporary chat" pill, honestly stronger than ChatGPT/Claude's (theirs retains 30 days server-side; ours touches no third party, ever) — stated once in a tooltip, otherwise proven by the UI's total silence about accounts or "sync." **Memory** = the citation chips plus a **Memory panel** (slide-over, not a 6th tab): vault search, per-article git-diff so a user can *watch* an article self-correct, and a nightly synthesis changelog — the mechanism shown, not asserted. **LoRA routing** = the persona rail plus a routing table in settings (which surface defaults to which persona) with the three-tier lifecycle (available/loaded/selected) shown honestly, RAM cost visible before it's spent. **Speed** = the always-on HUD plus a Benchmark strip in Status (live prefill/decode tok/s, TTFT, peak RSS, spec-decode acceptance rate, cold-start — macMLX's pattern, extended with what only dspark can show). **Local tools** = the code-review-hunk approval cards plus a curated first-run toolset (file read, web fetch, our own `memory_search`) so day one isn't a JSON config exercise.
|
|
31
|
-
|
|
32
|
-
## Concrete screens
|
|
33
|
-
|
|
34
|
-
**Layout.** Kill the 7-tab flat nav. One primary surface (Chat), with Quantize / Fine-tune / Build Dataset / Curves / Routes / Status collapsed behind a single **Developer** toggle (LM Studio's User/Power-User/Developer pattern, flattened to two states). A new user's day-one mental model: sidebar, thread, composer, persona rail, speed HUD — not seven tabs including a fine-tuning dashboard before they've sent one message.
|
|
35
|
-
|
|
36
|
-
**Sidebar.** Full-text session search (not just title — unlike Claude's well-known gap), and a real mobile treatment: a slide-over drawer behind a hamburger, not today's "delete the sidebar at 760px with no replacement."
|
|
37
|
-
|
|
38
|
-
**Thread.** Actions that don't exist today: copy on any assistant message, edit-and-resend that forks non-destructively with an inline `< 1/2 >` branch switcher (a linear toggle, not a tree — both cloud incumbents prove that's the right ceiling), regenerate, and "regenerate with a different persona." Streaming gets fixed architecturally: block-level memoization (only the live tail re-parses) instead of today's `innerHTML = mdToHtml(fullText)` on every token — O(n²) over a response, and the thing most likely to make a spec-decode-accelerated model *feel* slow because the frontend can't keep up with its own backend. Code fences get real syntax highlighting; math gets KaTeX — both zero today.
|
|
39
|
-
|
|
40
|
-
**Composer.** Autosize textarea, file/image attach (existing), a persona pill, live steering (existing — keep it), and the sampling popover expanded from three sliders to the full server-supported set (min_p, XTC, penalties, logit_bias) behind an "Advanced" disclosure — closing a plain parity gap against the mlx-lm oracle.
|
|
41
|
-
|
|
42
|
-
**Memory & model switching.** A slide-over Memory panel (vault search, git-diff per article, synthesis changelog) plus a vault-status chip in the composer, and a real model switcher — today's `#nav-model` is a read-only label with no click handler, an odd miss given the pitch is fast tier-switching between e4b/12B/26B.
|
|
43
|
-
|
|
44
|
-
**Tool-call display.** Inline, non-blocking approval cards (Jan's pattern) with argument diffs, blast-radius text, three-tier persistence, and pre-approved read-only defaults.
|
|
45
|
-
|
|
46
|
-
## What we deliberately do not build
|
|
47
|
-
|
|
48
|
-
No Channels or multi-user/Slack-style shared spaces (Open WebUI's most enterprise-flavored feature) — mlx-bun is single-user by identity. No RBAC, org admin, or plugin marketplace — there is no "org" to administer. No general-purpose no-code agent-flow canvas (AnythingLLM's Agent Flows, Msty's Turnstiles) — if one ever justifies itself, scope it to the memory/synthesis pipeline, not general automation. No speech-to-speech voice mode as a v1 commitment — it would visibly disappoint next to Advanced Voice Mode if half-built; an honest stretch goal, not table stakes. No paid cloud escalation tier (Ollama Cloud) — any "bigger model" story stays local (dspark spec-decode against a larger local target). No email/calendar/document-suite bloat (Odysseus), even reframed as "memory feeders," until the core loop is airtight. And no sandbox-theater for a shell tool we can't actually sandbox — if we ship tool execution, we say plainly it runs on your machine with your permissions.
|
|
49
|
-
|
|
50
|
-
The through-line: every screen either makes local-to-you *provable* or it doesn't ship. Speed you can see. Memory you can read and correct. Adapters you can name, compare, and trust. Everything else is Open WebUI's problem to solve, not ours.
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# Chunk-task quality roadmap (2026-06-17)
|
|
2
|
-
|
|
3
|
-
Where the MiniCPM5 chunking adapter stands and what raises real segmentation
|
|
4
|
-
quality. Companion to the chunk-eval metric vs. accuracy finding (score = well-formedness, not gold accuracy) and
|
|
5
|
-
[`docs/archive/investigations/chunk-finetune-experiment.md`](../investigations/chunk-finetune-experiment.md).
|
|
6
|
-
|
|
7
|
-
## Where we are
|
|
8
|
-
|
|
9
|
-
- Adapter **solved the output contract**: 0/25 invalid JSON (base model: 22/25
|
|
10
|
-
invalid — unusable). That's the entire 95.10 well-formedness score.
|
|
11
|
-
- Adapter is **mediocre at the actual task**: vs-gold boundary ~35.6, label ~52.0,
|
|
12
|
-
all 25 cases in disagreement (`reports/chunk-eval-cpm-2026-06-17.html`).
|
|
13
|
-
- Dominant failures: `under_split` 17/25, TAIL GAP / `missed_content` 9,
|
|
14
|
-
hallucinated anchors 4 — explained by the training-data bias below.
|
|
15
|
-
|
|
16
|
-
## Step 1 (the lever): fix the training data
|
|
17
|
-
|
|
18
|
-
The data (`chunk-data-le4000`) is **86% single-chunk** (626/730 examples = 1 chunk,
|
|
19
|
-
mean 1.16, max 4). The model learned a strong "one short chunk" prior → it
|
|
20
|
-
under-splits and truncates coverage. A 1B model on this diet isn't at its capacity
|
|
21
|
-
ceiling, it's mimicking its data.
|
|
22
|
-
|
|
23
|
-
- Rebuild the dataset so the **chunk-count distribution matches real operational
|
|
24
|
-
segmentation**, not a single-topic majority.
|
|
25
|
-
- Teach **full-transcript coverage** (spans that reach the end — kill the tail gaps).
|
|
26
|
-
- This is the #1 lever. Do it before touching capacity or iters.
|
|
27
|
-
|
|
28
|
-
## Eval methodology: do NOT judge against codex's gold
|
|
29
|
-
|
|
30
|
-
**Codex over-segments — it splits articles ~2× what we actually do in operations.**
|
|
31
|
-
So the current gold is inflated: judging the adapter as `under_split` is partly an
|
|
32
|
-
artifact of a gold that over-splits. The under-split signal is real but smaller than
|
|
33
|
-
the verdict count suggests.
|
|
34
|
-
|
|
35
|
-
- Recalibrate the gold to **operational granularity** (use real-ops segmentations as
|
|
36
|
-
the reference, or down-weight codex's extra splits) before trusting `bs`/`ls`.
|
|
37
|
-
- Until the gold matches ops, the report **understates** the adapter.
|
|
38
|
-
- Going forward, optimize against operational gold, not codex, and not the saturated
|
|
39
|
-
well-formedness score.
|
|
40
|
-
|
|
41
|
-
## rank / scale: tune for a single narrow task
|
|
42
|
-
|
|
43
|
-
We are telling CPM to do exactly **one** thing: take a sequence of messages and find
|
|
44
|
-
the topic seams. That narrowness should drive the LoRA capacity knobs deliberately —
|
|
45
|
-
revisit the inherited rank 16 / scale 1 rather than carrying old defaults. Folds into
|
|
46
|
-
the "configurable training params with mlx-lm defaults" task (rank / scale / num_layers
|
|
47
|
-
/ LR / dropout selectable at run start). The question to answer empirically: how little
|
|
48
|
-
rank does this one transformation need, and what scale/LR pairs with it.
|
|
49
|
-
|
|
50
|
-
## Streaming / windowed segmentation mode
|
|
51
|
-
|
|
52
|
-
Whole-transcript-at-once is one framing; it likely isn't the operational one. Explore:
|
|
53
|
-
|
|
54
|
-
- A **sliding message window** — segment incrementally as messages arrive, over a
|
|
55
|
-
bounded window, rather than ingesting the entire conversation.
|
|
56
|
-
- "Lots of different ways to segment these conversations" — try multiple task
|
|
57
|
-
formulations (whole-transcript vs windowed vs streaming/online) and measure which
|
|
58
|
-
matches operations and trains best on a small model.
|
|
59
|
-
- Implications for training data shape (windowed targets) and for serving (a streaming
|
|
60
|
-
endpoint / incremental decode).
|
|
61
|
-
|
|
62
|
-
## Evaluate other base models
|
|
63
|
-
|
|
64
|
-
CPM5-1B is tiny and was a memory-driven pick. Run a **bake-off**: score other base
|
|
65
|
-
models on the chunk task (same gold, same harness) to find the best base for the
|
|
66
|
-
chunking adapter. Capacity is the second lever after data — and the e4b +
|
|
67
|
-
segmented-backward work exists precisely to train bigger models at long context. See
|
|
68
|
-
[[e4b-lora-training-seqlen-ceiling]], [[segmented-backward-landed]].
|
|
69
|
-
|
|
70
|
-
## Ordered plan
|
|
71
|
-
|
|
72
|
-
1. **Fix the training data** (multi-chunk + full coverage, operational granularity).
|
|
73
|
-
2. **Recalibrate the eval gold** off codex toward operational segmentation.
|
|
74
|
-
3. **Tune rank/scale** for the single narrow task (with configurable params).
|
|
75
|
-
4. **Prototype streaming/windowed** segmentation; pick the framing that fits ops.
|
|
76
|
-
5. **Model bake-off**; move up in capacity (e4b via segmented backward) if data alone
|
|
77
|
-
plateaus.
|