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
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// Family media preparation, bound once when a model loads. The server owns
|
|
2
|
+
// request validation, HTTP errors and ownership of what it receives; each
|
|
3
|
+
// route here borrows the loaded context's tokenizer, template, token ids and
|
|
4
|
+
// lazily-loaded towers, and calls the existing numerical prompt builders.
|
|
5
|
+
import type { MlxArray } from "@mlx-bun/mlx/array";
|
|
6
|
+
import type { ObjectCache, PromptNativeWork } from "@mlx-bun/inference/contracts/portable";
|
|
7
|
+
import type { AudioEncoder, PixelInput, TextEmbeddingModel, Vision } from "@mlx-bun/inference/contracts/mlx";
|
|
8
|
+
import type { ChatMessage, ChatTemplate, LoadedTokenizer, RenderOptions, ToolDefinition } from "@mlx-bun/inference/input";
|
|
9
|
+
import type { AudioTokenIds, MultimodalTowers, VisionEncoder, VisionTokenIds } from "@mlx-bun/inference/input/vision";
|
|
10
|
+
import type { QwenVisionEncoder } from "@mlx-bun/inference/input/vision/qwen3vl-prompt";
|
|
11
|
+
import { declaredGraph, type RuntimeModel } from "@mlx-bun/inference/models";
|
|
12
|
+
import type { CheckpointAttachment } from "@mlx-bun/inference/state";
|
|
13
|
+
import { ensureWav } from "@mlx-bun/inference/input/audio";
|
|
14
|
+
import { buildMultimodalPrompt, buildVisionPrompt, extractAudio, extractImages, extractVideos } from "@mlx-bun/inference/input/vision";
|
|
15
|
+
import { buildQwen3VLVisionPrompt } from "@mlx-bun/inference/input/vision/qwen3vl-prompt";
|
|
16
|
+
import { EncoderCache } from "@mlx-bun/inference/state";
|
|
17
|
+
|
|
18
|
+
/** What a route borrows from the loaded context. The context owns the towers;
|
|
19
|
+
* `visionTower`/`audioTower` load them lazily through its own slots. */
|
|
20
|
+
export interface MediaSource {
|
|
21
|
+
readonly modelId: string;
|
|
22
|
+
readonly tokenizer: LoadedTokenizer;
|
|
23
|
+
readonly template: ChatTemplate | null;
|
|
24
|
+
/** Null when the model supplies no image soft tokens; the routes that splice them refuse then. */
|
|
25
|
+
readonly visionTokenIds: VisionTokenIds | null;
|
|
26
|
+
readonly audioTokenIds: AudioTokenIds | null;
|
|
27
|
+
visionTower(): VisionEncoder | null;
|
|
28
|
+
audioTower(): AudioEncoder | null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface MediaParts { readonly images: boolean; readonly audio: boolean; readonly videos: boolean }
|
|
32
|
+
|
|
33
|
+
export interface MediaRequest {
|
|
34
|
+
/** Already normalized by the server. */
|
|
35
|
+
readonly messages: ChatMessage[];
|
|
36
|
+
readonly parts: MediaParts;
|
|
37
|
+
readonly tools: ToolDefinition[] | null;
|
|
38
|
+
/** The request's chat-template options; read only by routes that render with them. */
|
|
39
|
+
readonly templateOptions: () => RenderOptions;
|
|
40
|
+
readonly nativeWork: PromptNativeWork;
|
|
41
|
+
readonly objects?: ObjectCache<CheckpointAttachment[]>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type MediaRejection =
|
|
45
|
+
| "audio-tower-unavailable" | "vision-sidecar-unavailable" | "vision-tower-absent" | "single-image-only"
|
|
46
|
+
| "vision-tokens-undeclared";
|
|
47
|
+
|
|
48
|
+
/** The 400 text each refusal answers with. The routes here are the ones that
|
|
49
|
+
* know which checkpoints supply what they need. */
|
|
50
|
+
const refusals: Record<MediaRejection | "video-with-audio" | "video-unsupported", (modelId: string) => string> = {
|
|
51
|
+
"audio-tower-unavailable": (modelId) =>
|
|
52
|
+
`model ${modelId} has no audio tower — audio input needs ` +
|
|
53
|
+
`a model whose config.json carries audio_config and whose ` +
|
|
54
|
+
`sidecar ships the audio tensors (e.g. gemma-4 e4b OptiQ)`,
|
|
55
|
+
"vision-sidecar-unavailable": () => "model has no vision sidecar",
|
|
56
|
+
"vision-tower-absent": () => "this checkpoint has no vision tower",
|
|
57
|
+
"single-image-only": () => "DiffusionGemma image input supports exactly one image",
|
|
58
|
+
"vision-tokens-undeclared": (modelId) => `model ${modelId} declares no image soft tokens`,
|
|
59
|
+
"video-with-audio": () => "video and audio content parts cannot be combined",
|
|
60
|
+
"video-unsupported": (modelId) => `model ${modelId} does not accept video input — video ` +
|
|
61
|
+
`content parts need a Qwen3.5-family model (e.g. Qwen3.8-27B)`,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export function mediaRefusalMessage(reason: keyof typeof refusals, modelId: string): string {
|
|
65
|
+
return refusals[reason](modelId);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Every tensor here belongs to the caller once `prepare` resolves. */
|
|
69
|
+
export interface PreparedMedia { readonly promptIds: number[]; readonly vision?: Vision; readonly pixels?: MlxArray }
|
|
70
|
+
|
|
71
|
+
export interface MediaPreparation {
|
|
72
|
+
/** Video content parts are accepted (Qwen3.5 family only). */
|
|
73
|
+
readonly video: boolean;
|
|
74
|
+
prepare(request: MediaRequest): Promise<PreparedMedia | { readonly rejected: MediaRejection }>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
type Prepared = Promise<PreparedMedia | { readonly rejected: MediaRejection }>;
|
|
78
|
+
|
|
79
|
+
/** Select the route the graph's declared media input calls for, once, at load.
|
|
80
|
+
* Audio requests share one route for every graph; its towers are only ever
|
|
81
|
+
* non-null for a graph that ships them. */
|
|
82
|
+
export function bindMediaPreparation(source: MediaSource, model: RuntimeModel): MediaPreparation {
|
|
83
|
+
const graph = declaredGraph(model);
|
|
84
|
+
const media = graph.graphCapabilities.media;
|
|
85
|
+
// The graph's own token embeddings, read when a request splices them.
|
|
86
|
+
const tokens: TextEmbeddingModel & { readonly config: RuntimeModel["config"] } = {
|
|
87
|
+
get embed() { return graph.embed!; }, config: model.config,
|
|
88
|
+
};
|
|
89
|
+
const embeddings = media?.input === "embeddings" ? tokens : null;
|
|
90
|
+
const withAudio = (images: (request: MediaRequest) => Prepared) => (request: MediaRequest) =>
|
|
91
|
+
request.parts.audio ? prepareAudio(source, embeddings, request) : images(request);
|
|
92
|
+
const video = media?.video ?? false;
|
|
93
|
+
if (media?.input === "pixels")
|
|
94
|
+
return { video, prepare: withAudio(request => prepareDiffusionImage(source, () => graph.pixelInput?.(), request)) };
|
|
95
|
+
if (media?.input === "embeddings+positions")
|
|
96
|
+
return { video, prepare: withAudio(request => prepareQwenMedia(source, tokens, request)) };
|
|
97
|
+
return { video, prepare: withAudio(request => prepareTowerImages(source, embeddings, request)) };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function template(source: MediaSource): ChatTemplate {
|
|
101
|
+
if (!source.template) throw new Error(`model ${source.modelId} has no chat template`);
|
|
102
|
+
return source.template;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Audio (and MIXED image+audio) input (`02d723a:docs/design/generic-model-support.md`
|
|
106
|
+
* §6.6). One buildMultimodalPrompt call
|
|
107
|
+
* splices both media kinds in document order. A request WITH
|
|
108
|
+
* audio on a model whose tower is unavailable is an explicit 400
|
|
109
|
+
* — never a silent text-only degrade (that leniency is only for
|
|
110
|
+
* requests without the media, getVisionTower's contract). */
|
|
111
|
+
export async function prepareAudio(source: MediaSource, model: TextEmbeddingModel | null, request: MediaRequest): Prepared {
|
|
112
|
+
const { objects, nativeWork } = request;
|
|
113
|
+
const { messages: withAudioParts, images } = await extractImages(request.messages);
|
|
114
|
+
const { messages, audio } = await extractAudio(withAudioParts);
|
|
115
|
+
// Non-WAV containers (mp3/m4a/flac/ogg/aiff/…) transcode to
|
|
116
|
+
// 16 kHz WAV via CoreAudio; RIFF bytes pass through untouched.
|
|
117
|
+
// Failures throw into the prompt-build 400.
|
|
118
|
+
const wavs = await Promise.all(audio.map(ensureWav));
|
|
119
|
+
const loaded = await nativeWork(async (): Promise<
|
|
120
|
+
{ model: TextEmbeddingModel; towers: MultimodalTowers<{ softTokens: number }> } | { rejected: MediaRejection }> => {
|
|
121
|
+
const audioTower = source.audioTower();
|
|
122
|
+
if (!audioTower || !source.audioTokenIds || !model) return { rejected: "audio-tower-unavailable" };
|
|
123
|
+
let visionSide: MultimodalTowers<{ softTokens: number }>["vision"];
|
|
124
|
+
if (request.parts.images) {
|
|
125
|
+
const tower = source.visionTower();
|
|
126
|
+
if (!tower) return { rejected: "vision-sidecar-unavailable" };
|
|
127
|
+
if (!source.visionTokenIds) return { rejected: "vision-tokens-undeclared" };
|
|
128
|
+
visionSide = { tower, tokenIds: source.visionTokenIds,
|
|
129
|
+
cache: objects && tower.cacheIdentity ? new EncoderCache(objects, tower.cacheIdentity) : undefined };
|
|
130
|
+
}
|
|
131
|
+
return { model, towers: {
|
|
132
|
+
...(visionSide ? { vision: visionSide } : {}),
|
|
133
|
+
audio: { tower: audioTower, tokenIds: source.audioTokenIds,
|
|
134
|
+
cache: objects && audioTower.cacheIdentity ? new EncoderCache(objects, audioTower.cacheIdentity) : undefined },
|
|
135
|
+
} };
|
|
136
|
+
});
|
|
137
|
+
if ("rejected" in loaded) return loaded;
|
|
138
|
+
const mp = await buildMultimodalPrompt(
|
|
139
|
+
loaded.model, loaded.towers, source.tokenizer, template(source),
|
|
140
|
+
messages, images, wavs, request.tools, nativeWork,
|
|
141
|
+
);
|
|
142
|
+
// bidirMask is null whenever audio is present (mixed prompts run
|
|
143
|
+
// fully causal, `02d723a:docs/design/generic-model-support.md` §6.6);
|
|
144
|
+
// the union mask does the per-layer id zeroing either way.
|
|
145
|
+
return {
|
|
146
|
+
promptIds: mp.ids,
|
|
147
|
+
vision: {
|
|
148
|
+
embeddings: mp.embeddings, prefixIdentity: mp.prefixIdentity,
|
|
149
|
+
...(mp.bidirMask ? { imageMask: mp.bidirMask } : {}),
|
|
150
|
+
multimodalMask: mp.multimodalMask,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Pixel-input image-text-to-text (the denoising graph): its own dedicated tower
|
|
156
|
+
* and encoder vision merge feed the denoising engine, not the AR embeddings
|
|
157
|
+
* path. Pixels are the denoising engine's once returned. v1 supports a single
|
|
158
|
+
* image. */
|
|
159
|
+
export async function prepareDiffusionImage(
|
|
160
|
+
source: MediaSource, pixelInput: () => PixelInput | null | undefined, request: MediaRequest,
|
|
161
|
+
): Prepared {
|
|
162
|
+
const tower = pixelInput();
|
|
163
|
+
if (!tower) return { rejected: "vision-tower-absent" };
|
|
164
|
+
const tokenIds = source.visionTokenIds;
|
|
165
|
+
if (!tokenIds) return { rejected: "vision-tokens-undeclared" };
|
|
166
|
+
const { messages, images } = await extractImages(request.messages);
|
|
167
|
+
if (images.length !== 1) return { rejected: "single-image-only" };
|
|
168
|
+
const rendered = template(source).render(messages, { tools: request.tools, addGenerationPrompt: true });
|
|
169
|
+
const rawIds = source.tokenizer.encode(rendered, /* addSpecialTokens */ false);
|
|
170
|
+
const { pixels, softTokens } = await request.nativeWork(() => tower.preprocess(images[0]!));
|
|
171
|
+
try {
|
|
172
|
+
const promptIds = tower.spliceTokens(rawIds, softTokens, {
|
|
173
|
+
image: tokenIds.imageTokenId,
|
|
174
|
+
boi: tokenIds.boiTokenId,
|
|
175
|
+
eoi: tokenIds.eoiTokenId,
|
|
176
|
+
});
|
|
177
|
+
return { promptIds, pixels };
|
|
178
|
+
} catch (error) { pixels.dispose(); throw error; }
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** Embeddings-with-positions vision + video: the encoder rides the shared lazy
|
|
182
|
+
* slot; image/video spans splice into input embeddings and the request
|
|
183
|
+
* carries the mRoPE positions and delta that the graph's media prompt
|
|
184
|
+
* input consumes. Videos decode to sampled frames via the
|
|
185
|
+
* AVFoundation sidecar. */
|
|
186
|
+
export async function prepareQwenMedia(
|
|
187
|
+
source: MediaSource, model: TextEmbeddingModel & { readonly config: { readonly raw: Record<string, unknown> } },
|
|
188
|
+
request: MediaRequest,
|
|
189
|
+
): Prepared {
|
|
190
|
+
const { objects, nativeWork } = request;
|
|
191
|
+
const { messages: withVideos, images } = await extractImages(request.messages);
|
|
192
|
+
const { messages, videos } = await extractVideos(withVideos);
|
|
193
|
+
const towers = await nativeWork(async () => {
|
|
194
|
+
const tower = source.visionTower() as unknown as (QwenVisionEncoder & { readonly cacheIdentity: string }) | null;
|
|
195
|
+
if (!tower) return null;
|
|
196
|
+
return { tower, encoderCache: objects ? new EncoderCache(objects, tower.cacheIdentity) : undefined };
|
|
197
|
+
});
|
|
198
|
+
if (!towers) return { rejected: "vision-sidecar-unavailable" };
|
|
199
|
+
const vp = await buildQwen3VLVisionPrompt(
|
|
200
|
+
model, towers.tower, source.tokenizer, template(source), messages, images,
|
|
201
|
+
{
|
|
202
|
+
imageTokenId: (model.config.raw.image_token_id as number) ?? 248056,
|
|
203
|
+
videoTokenId: (model.config.raw.video_token_id as number) ?? 248057,
|
|
204
|
+
visionStartId: (model.config.raw.vision_start_token_id as number) ?? 248053,
|
|
205
|
+
visionEndId: (model.config.raw.vision_end_token_id as number) ?? 248054,
|
|
206
|
+
},
|
|
207
|
+
request.templateOptions(),
|
|
208
|
+
videos, nativeWork, towers.encoderCache,
|
|
209
|
+
);
|
|
210
|
+
return { promptIds: vp.ids, vision: { embeddings: vp.embeddings, mrope: vp.mrope, prefixIdentity: vp.prefixIdentity } };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** Loads (and caches) the tower on first image request — text-only
|
|
214
|
+
* sessions never pay for it. The tower is only ever non-null for a graph
|
|
215
|
+
* that ships one (its mediaEncoders). */
|
|
216
|
+
export async function prepareTowerImages(source: MediaSource, model: TextEmbeddingModel | null, request: MediaRequest): Prepared {
|
|
217
|
+
const { objects, nativeWork } = request;
|
|
218
|
+
const { messages, images } = await extractImages(request.messages);
|
|
219
|
+
const towers = await nativeWork(async () => {
|
|
220
|
+
const tower = source.visionTower();
|
|
221
|
+
if (!tower || !model) return null;
|
|
222
|
+
return { model, tower, encoderCache: objects && tower.cacheIdentity
|
|
223
|
+
? new EncoderCache(objects, tower.cacheIdentity) : undefined };
|
|
224
|
+
});
|
|
225
|
+
if (!towers) return { rejected: "vision-sidecar-unavailable" };
|
|
226
|
+
if (!source.visionTokenIds) return { rejected: "vision-tokens-undeclared" };
|
|
227
|
+
const vp = await buildVisionPrompt(
|
|
228
|
+
towers.model, towers.tower, source.tokenizer, template(source),
|
|
229
|
+
messages, images, source.visionTokenIds, request.tools, nativeWork, towers.encoderCache,
|
|
230
|
+
);
|
|
231
|
+
return { promptIds: vp.ids, vision: { embeddings: vp.embeddings, imageMask: vp.imageMask, prefixIdentity: vp.prefixIdentity } };
|
|
232
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MlxGatewayBinding } from "@mlx-bun/inference/execution";
|
|
2
|
+
import type { embedMany } from "@mlx-bun/inference/embeddings";
|
|
3
|
+
|
|
4
|
+
/** Numerical services supplied by one loaded model. HTTP requests and prompt
|
|
5
|
+
* policy are not part of this boundary; replacement models supply it directly.
|
|
6
|
+
* Saved state restores through the cache service, into the caches the loaded
|
|
7
|
+
* graph composes. */
|
|
8
|
+
export interface ModelBinding {
|
|
9
|
+
readonly stateCompatibility: string;
|
|
10
|
+
readonly gateway: MlxGatewayBinding;
|
|
11
|
+
signal(promptIds: number[], bins: number, minimum: number): Promise<{ bins: number[]; vocab: number }>;
|
|
12
|
+
diagnostics(): Record<string, unknown>;
|
|
13
|
+
readonly discovery: { readonly adapters: boolean; readonly training: boolean;
|
|
14
|
+
readonly dsa: unknown; readonly embeddings: boolean; readonly decisions?: boolean };
|
|
15
|
+
embed?(inputs: string[], instruction?: string): ReturnType<typeof embedMany>;
|
|
16
|
+
/** Teacher-forced answer scoring, no generated tokens. Borrows prepared
|
|
17
|
+
* media. When execute is supplied, every candidate's native work and cleanup
|
|
18
|
+
* must settle inside that boundary; otherwise the caller owns graph access. */
|
|
19
|
+
decide?(input: { prompt: number[]; candidates: number[][];
|
|
20
|
+
vision?: import("@mlx-bun/inference/contracts/mlx").Vision; signal?: AbortSignal;
|
|
21
|
+
/** Schedule one candidate at a time beside live generation rows. */
|
|
22
|
+
execute?: <T>(work: () => Promise<T>) => Promise<T>;
|
|
23
|
+
}): Promise<number[]>;
|
|
24
|
+
}
|