mlx-bun 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
// OpenAI-compatible speech-to-text routes:
|
|
2
|
-
// POST /v1/audio/transcriptions (task transcribe)
|
|
3
|
-
// POST /v1/audio/translations (task translate → English)
|
|
4
|
-
// POST /admin/transcription/unload (explicit page-out of the Whisper weights)
|
|
5
|
-
// POST /v1/audio/sessions · POST /v1/audio/sessions/:id/audio ·
|
|
6
|
-
// POST /v1/audio/sessions/:id/finish · DELETE /v1/audio/sessions/:id
|
|
7
|
-
// (streaming dictation: chunks arrive during capture, each finished 30 s
|
|
8
|
-
// window transcribes immediately, finish returns the whole transcript)
|
|
9
|
-
// Bodies: multipart/form-data (OpenAI: file, model, language, prompt,
|
|
10
|
-
// response_format, temperature, stream, timestamp_granularities[]) or JSON
|
|
11
|
-
// ({ file: <base64 | data: URL>, ...same fields }). Non-standard fields:
|
|
12
|
-
// beam_size, condition_on_previous_text, no_speech_threshold, vocabulary
|
|
13
|
-
// (array of hint terms fitted into the prompt budget; usage reported),
|
|
14
|
-
// faithful (oracle graph instead of the fast path), audio_ctx (Lab), vad /
|
|
15
|
-
// vad_threshold / vad_min_speech_ms / vad_trim (Silero gate: silence returns
|
|
16
|
-
// an empty transcript without running Whisper).
|
|
17
|
-
// Streaming (`stream=true`): SSE `transcript.text.delta` per segment,
|
|
18
|
-
// then `transcript.text.done` carrying the final body.
|
|
19
|
-
|
|
20
|
-
import { formatTranscription, TRANSCRIPTION_FORMATS, toVerboseJson, type TranscriptionFormat } from "../audio/whisper-format";
|
|
21
|
-
import type { WhisperSegment } from "../audio/whisper-transcribe";
|
|
22
|
-
import { TranscriptionError, TranscriptionService, type TranscriptionOutcome, type TranscriptionParams } from "./transcription-service";
|
|
23
|
-
|
|
24
|
-
export type AudioRoute =
|
|
25
|
-
| { kind: "transcriptions"; task: "transcribe" | "translate" }
|
|
26
|
-
| { kind: "unload" }
|
|
27
|
-
| { kind: "session-create" }
|
|
28
|
-
| { kind: "session-audio"; id: string }
|
|
29
|
-
| { kind: "session-finish"; id: string }
|
|
30
|
-
| { kind: "session-delete"; id: string };
|
|
31
|
-
|
|
32
|
-
export function matchAudioRoute(method: string, pathname: string): AudioRoute | null {
|
|
33
|
-
switch (`${method} ${pathname}`) {
|
|
34
|
-
case "POST /v1/audio/transcriptions": return { kind: "transcriptions", task: "transcribe" };
|
|
35
|
-
case "POST /v1/audio/translations": return { kind: "transcriptions", task: "translate" };
|
|
36
|
-
case "POST /admin/transcription/unload": return { kind: "unload" };
|
|
37
|
-
case "POST /v1/audio/sessions": return { kind: "session-create" };
|
|
38
|
-
}
|
|
39
|
-
if (pathname.startsWith("/v1/audio/sessions/")) {
|
|
40
|
-
const rest = pathname.slice("/v1/audio/sessions/".length).split("/");
|
|
41
|
-
const id = decodeURIComponent(rest[0] ?? "");
|
|
42
|
-
if (!id) return null;
|
|
43
|
-
if (method === "POST" && rest[1] === "audio" && rest.length === 2) return { kind: "session-audio", id };
|
|
44
|
-
if (method === "POST" && rest[1] === "finish" && rest.length === 2) return { kind: "session-finish", id };
|
|
45
|
-
if (method === "DELETE" && rest.length === 1) return { kind: "session-delete", id };
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Everything the route needs from the host: a service (or a reason there is none). */
|
|
51
|
-
export interface AudioRouteHost {
|
|
52
|
-
service(): Promise<TranscriptionService | null>;
|
|
53
|
-
/** Message for the 503 when no Whisper model is available. */
|
|
54
|
-
unavailableMessage?: string;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface ParsedAudioRequest {
|
|
58
|
-
audio: Uint8Array;
|
|
59
|
-
format: TranscriptionFormat;
|
|
60
|
-
stream: boolean;
|
|
61
|
-
params: TranscriptionParams;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const sessionFormats = new Map<string, TranscriptionFormat>();
|
|
65
|
-
|
|
66
|
-
const segmentJson = (s: WhisperSegment) => ({ id: s.id, seek: s.seek, start: s.start, end: s.end, text: s.text, tokens: s.tokens, temperature: s.temperature, avg_logprob: s.avgLogprob, compression_ratio: s.compressionRatio, no_speech_prob: s.noSpeechProb, ...(s.words ? { words: s.words } : {}) });
|
|
67
|
-
|
|
68
|
-
function errorJson(message: string, status: number, type = "invalid_request_error"): Response {
|
|
69
|
-
return Response.json({ error: { message, type } }, { status });
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const B64_MAX = 200 * 1024 * 1024;
|
|
73
|
-
|
|
74
|
-
function decodeBase64Audio(v: unknown): Uint8Array | null {
|
|
75
|
-
if (typeof v !== "string" || v.length === 0 || v.length > B64_MAX * 1.4) return null;
|
|
76
|
-
const data = v.startsWith("data:") ? v.slice(v.indexOf(",") + 1) : v;
|
|
77
|
-
try {
|
|
78
|
-
return new Uint8Array(Buffer.from(data, "base64"));
|
|
79
|
-
} catch {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function num(v: unknown): number | null {
|
|
85
|
-
if (v === null || v === undefined || v === "") return null;
|
|
86
|
-
const n = typeof v === "number" ? v : Number(v);
|
|
87
|
-
return Number.isFinite(n) ? n : null;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function bool(v: unknown): boolean | null {
|
|
91
|
-
if (typeof v === "boolean") return v;
|
|
92
|
-
if (v === "true" || v === "1") return true;
|
|
93
|
-
if (v === "false" || v === "0") return false;
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/** Decoding params shared by one-shot requests and sessions (no audio). */
|
|
98
|
-
function parseParams(fields: Record<string, unknown>, task: "transcribe" | "translate"): TranscriptionParams | Response {
|
|
99
|
-
const language = typeof fields.language === "string" && fields.language.trim() ? fields.language.trim() : null;
|
|
100
|
-
const temperature = num(fields.temperature);
|
|
101
|
-
if (temperature !== null && (temperature < 0 || temperature > 1)) return errorJson("temperature must be in [0, 1]", 400);
|
|
102
|
-
const beamSize = num(fields.beam_size);
|
|
103
|
-
if (beamSize !== null && (!Number.isInteger(beamSize) || beamSize < 1 || beamSize > 16))
|
|
104
|
-
return errorJson("beam_size must be an integer in [1, 16]", 400);
|
|
105
|
-
if (temperature !== null && temperature > 0 && beamSize !== null && beamSize > 1)
|
|
106
|
-
return errorJson("beam_size requires temperature 0", 400);
|
|
107
|
-
const vocabulary = Array.isArray(fields.vocabulary)
|
|
108
|
-
? (fields.vocabulary as unknown[]).map(String)
|
|
109
|
-
: typeof fields.vocabulary === "string" && fields.vocabulary.trim()
|
|
110
|
-
? fields.vocabulary.split(",").map((s) => s.trim()).filter(Boolean)
|
|
111
|
-
: undefined;
|
|
112
|
-
if (vocabulary && (vocabulary.length > 8192 || vocabulary.some((t) => t.length > 16384)))
|
|
113
|
-
return errorJson("vocabulary: at most 8192 terms of at most 16 KiB each", 400);
|
|
114
|
-
const noSpeech = num(fields.no_speech_threshold);
|
|
115
|
-
const vadOn = bool(fields.vad) ?? false;
|
|
116
|
-
const vadThreshold = num(fields.vad_threshold);
|
|
117
|
-
if (vadThreshold !== null && (vadThreshold <= 0 || vadThreshold >= 1)) return errorJson("vad_threshold must be in (0, 1)", 400);
|
|
118
|
-
const vadMinSpeech = num(fields.vad_min_speech_ms);
|
|
119
|
-
const audioCtx = num(fields.audio_ctx);
|
|
120
|
-
if (audioCtx !== null && (!Number.isInteger(audioCtx) || audioCtx < 64 || audioCtx > 1500))
|
|
121
|
-
return errorJson("audio_ctx must be an integer in [64, 1500]", 400);
|
|
122
|
-
const granularities = Array.isArray(fields.timestamp_granularities) ? (fields.timestamp_granularities as string[]) : [];
|
|
123
|
-
return {
|
|
124
|
-
task, language,
|
|
125
|
-
prompt: typeof fields.prompt === "string" && fields.prompt.trim() ? fields.prompt : null,
|
|
126
|
-
vocabulary, temperature, beamSize,
|
|
127
|
-
conditionOnPreviousText: bool(fields.condition_on_previous_text) ?? true,
|
|
128
|
-
...(noSpeech !== null ? { noSpeechThreshold: noSpeech } : {}),
|
|
129
|
-
withoutTimestamps: bool(fields.without_timestamps) ?? false,
|
|
130
|
-
vad: vadOn ? { threshold: vadThreshold ?? undefined, minSpeechMs: vadMinSpeech ?? undefined, trim: bool(fields.vad_trim) ?? false } : null,
|
|
131
|
-
wordTimestamps: granularities.includes("word"),
|
|
132
|
-
faithful: bool(fields.faithful) ?? false,
|
|
133
|
-
audioCtx,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/** Parse a multipart or JSON transcription request into audio bytes + params. */
|
|
138
|
-
export async function parseAudioRequest(request: Request, task: "transcribe" | "translate"): Promise<ParsedAudioRequest | Response> {
|
|
139
|
-
const ct = request.headers.get("content-type") ?? "";
|
|
140
|
-
let fields: Record<string, unknown> = {};
|
|
141
|
-
let audio: Uint8Array | null = null;
|
|
142
|
-
if (ct.includes("multipart/form-data")) {
|
|
143
|
-
let form: FormData;
|
|
144
|
-
try { form = await request.formData(); }
|
|
145
|
-
catch (e) { return errorJson(`invalid multipart body: ${(e as Error).message}`, 400); }
|
|
146
|
-
const file = form.get("file");
|
|
147
|
-
if (!(file instanceof Blob)) return errorJson("`file` (audio upload) is required", 400);
|
|
148
|
-
audio = new Uint8Array(await file.arrayBuffer());
|
|
149
|
-
for (const [k, v] of form.entries()) {
|
|
150
|
-
if (k === "file") continue;
|
|
151
|
-
if (k.endsWith("[]")) {
|
|
152
|
-
const key = k.slice(0, -2);
|
|
153
|
-
(fields[key] ??= [] as string[]);
|
|
154
|
-
(fields[key] as string[]).push(String(v));
|
|
155
|
-
} else fields[k] = typeof v === "string" ? v : String(v);
|
|
156
|
-
}
|
|
157
|
-
} else if (ct.includes("application/json")) {
|
|
158
|
-
try { fields = (await request.json()) as Record<string, unknown>; }
|
|
159
|
-
catch { return errorJson("invalid JSON body", 400); }
|
|
160
|
-
const raw = fields.file ?? (fields.input_audio as { data?: unknown } | undefined)?.data ?? fields.audio;
|
|
161
|
-
audio = decodeBase64Audio(raw);
|
|
162
|
-
if (!audio) return errorJson("`file` must be base64 audio (optionally a data: URL)", 400);
|
|
163
|
-
} else {
|
|
164
|
-
return errorJson("content-type must be multipart/form-data or application/json", 415);
|
|
165
|
-
}
|
|
166
|
-
if (audio.length === 0) return errorJson("empty audio upload", 400);
|
|
167
|
-
const format = (fields.response_format as string | undefined) ?? "json";
|
|
168
|
-
if (!TRANSCRIPTION_FORMATS.includes(format as TranscriptionFormat))
|
|
169
|
-
return errorJson(`response_format must be one of ${TRANSCRIPTION_FORMATS.join(", ")}`, 400);
|
|
170
|
-
const params = parseParams(fields, task);
|
|
171
|
-
if (params instanceof Response) return params;
|
|
172
|
-
const stream = bool(fields.stream) ?? false;
|
|
173
|
-
if (params.wordTimestamps && format !== "verbose_json" && !stream)
|
|
174
|
-
return errorJson("timestamp_granularities[]=word requires response_format=verbose_json", 400);
|
|
175
|
-
return { audio, format: format as TranscriptionFormat, stream, params };
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/** Body for a finished transcription in the requested format. */
|
|
179
|
-
export function transcriptionResponse(outcome: TranscriptionOutcome, format: TranscriptionFormat, task: string): Response {
|
|
180
|
-
const extra = {
|
|
181
|
-
model: outcome.modelId,
|
|
182
|
-
language: outcome.result.language,
|
|
183
|
-
duration: outcome.durationSeconds,
|
|
184
|
-
timings: outcome.timings,
|
|
185
|
-
...(outcome.vocabulary ? { vocabulary: outcome.vocabulary } : {}),
|
|
186
|
-
...(outcome.vad ? { vad: outcome.vad } : {}),
|
|
187
|
-
};
|
|
188
|
-
const headers: Record<string, string> = {
|
|
189
|
-
"x-mlx-bun-language": outcome.result.language,
|
|
190
|
-
"x-mlx-bun-timings": JSON.stringify(outcome.timings),
|
|
191
|
-
};
|
|
192
|
-
if (format === "json")
|
|
193
|
-
return Response.json({ text: outcome.result.text.trim(), mlx_bun: extra }, { headers });
|
|
194
|
-
if (format === "verbose_json")
|
|
195
|
-
return Response.json({ ...toVerboseJson(outcome.result, outcome.durationSeconds, task), mlx_bun: extra }, { headers });
|
|
196
|
-
const body = formatTranscription(outcome.result, format, outcome.durationSeconds, task);
|
|
197
|
-
const type = format === "srt" ? "application/x-subrip" : format === "vtt" ? "text/vtt" : "text/plain";
|
|
198
|
-
return new Response(body, { headers: { ...headers, "content-type": `${type}; charset=utf-8` } });
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export async function handleAudioRoute(url: URL, request: Request, host: AudioRouteHost): Promise<Response | null> {
|
|
202
|
-
const route = matchAudioRoute(request.method, url.pathname);
|
|
203
|
-
if (!route) return null;
|
|
204
|
-
const service = await host.service();
|
|
205
|
-
if (!service)
|
|
206
|
-
return errorJson(
|
|
207
|
-
host.unavailableMessage ??
|
|
208
|
-
"no Whisper model is available — download one (mlx-bun get mlx-community/whisper-large-v3-turbo) or pass --whisper-model",
|
|
209
|
-
503, "model_unavailable",
|
|
210
|
-
);
|
|
211
|
-
if (route.kind === "unload") {
|
|
212
|
-
const unloaded = service.unload();
|
|
213
|
-
return Response.json({ unloaded, ...service.stats });
|
|
214
|
-
}
|
|
215
|
-
if (route.kind === "session-create") {
|
|
216
|
-
let fields: Record<string, unknown> = {};
|
|
217
|
-
if ((request.headers.get("content-type") ?? "").includes("application/json")) {
|
|
218
|
-
try { fields = (await request.json()) as Record<string, unknown>; }
|
|
219
|
-
catch { return errorJson("invalid JSON body", 400); }
|
|
220
|
-
}
|
|
221
|
-
const params = parseParams(fields, fields.task === "translate" ? "translate" : "transcribe");
|
|
222
|
-
if (params instanceof Response) return params;
|
|
223
|
-
const format = (fields.response_format as string | undefined) ?? "json";
|
|
224
|
-
if (!["json", "verbose_json"].includes(format)) return errorJson("sessions return json or verbose_json", 400);
|
|
225
|
-
try {
|
|
226
|
-
const session = await service.createSession(params);
|
|
227
|
-
sessionFormats.set(session.id, format as TranscriptionFormat);
|
|
228
|
-
return Response.json({ id: session.id, model: service.modelId, vocabulary: session.vocabulary ?? null });
|
|
229
|
-
} catch (e) {
|
|
230
|
-
return transcriptionFailure(e);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
if (route.kind === "session-audio" || route.kind === "session-finish" || route.kind === "session-delete") {
|
|
234
|
-
const session = service.session(route.id);
|
|
235
|
-
if (!session) return errorJson("unknown transcription session", 404);
|
|
236
|
-
if (route.kind === "session-delete") {
|
|
237
|
-
session.close();
|
|
238
|
-
sessionFormats.delete(route.id);
|
|
239
|
-
return new Response(null, { status: 204 });
|
|
240
|
-
}
|
|
241
|
-
if (route.kind === "session-audio") {
|
|
242
|
-
const ct = request.headers.get("content-type") ?? "";
|
|
243
|
-
const bytes = new Uint8Array(await request.arrayBuffer());
|
|
244
|
-
if (bytes.length === 0) return errorJson("empty audio chunk", 400);
|
|
245
|
-
let pcm: Float32Array;
|
|
246
|
-
try {
|
|
247
|
-
if (ct.startsWith("audio/pcm") || ct.startsWith("audio/l32") || ct.includes("float32")) {
|
|
248
|
-
if (bytes.length % 4 !== 0) return errorJson("float32 PCM chunk length must be a multiple of 4", 400);
|
|
249
|
-
pcm = new Float32Array(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength));
|
|
250
|
-
const rate = Number(/rate=(\d+)/.exec(ct)?.[1] ?? 16000);
|
|
251
|
-
if (rate !== 16000) return errorJson("float32 PCM chunks must be 16 kHz mono", 400);
|
|
252
|
-
} else pcm = await (service.constructor as typeof TranscriptionService).decodeAudio(bytes);
|
|
253
|
-
} catch (e) {
|
|
254
|
-
return transcriptionFailure(e);
|
|
255
|
-
}
|
|
256
|
-
try {
|
|
257
|
-
const r = await session.append(pcm);
|
|
258
|
-
return Response.json({ id: session.id, samples: session.samples, duration: session.durationSeconds, speech: r.speech, segments: r.segments.map(segmentJson) });
|
|
259
|
-
} catch (e) {
|
|
260
|
-
return transcriptionFailure(e);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
try {
|
|
264
|
-
const outcome = await session.finish();
|
|
265
|
-
sessionFormats.delete(route.id);
|
|
266
|
-
return transcriptionResponse(outcome, sessionFormats.get(route.id) ?? "json", session.params.task ?? "transcribe");
|
|
267
|
-
} catch (e) {
|
|
268
|
-
sessionFormats.delete(route.id);
|
|
269
|
-
return transcriptionFailure(e);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
const parsed = await parseAudioRequest(request, route.task);
|
|
273
|
-
if (parsed instanceof Response) return parsed;
|
|
274
|
-
const taskName = route.task;
|
|
275
|
-
if (!parsed.stream) {
|
|
276
|
-
try {
|
|
277
|
-
const outcome = await service.transcribe(parsed.audio, { ...parsed.params, signal: request.signal });
|
|
278
|
-
return transcriptionResponse(outcome, parsed.format, taskName);
|
|
279
|
-
} catch (e) {
|
|
280
|
-
return transcriptionFailure(e);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
// Streaming: one SSE event per finalized segment, then the final body.
|
|
284
|
-
const encoder = new TextEncoder();
|
|
285
|
-
const stream = new ReadableStream<Uint8Array>({
|
|
286
|
-
start: async (controller) => {
|
|
287
|
-
const send = (event: string, data: unknown) =>
|
|
288
|
-
controller.enqueue(encoder.encode(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`));
|
|
289
|
-
try {
|
|
290
|
-
const outcome = await service.transcribe(parsed.audio, {
|
|
291
|
-
...parsed.params,
|
|
292
|
-
signal: request.signal,
|
|
293
|
-
onSegment: (s: WhisperSegment) => {
|
|
294
|
-
if (s.text) send("transcript.text.delta", { delta: s.text, segment: { id: s.id, start: s.start, end: s.end } });
|
|
295
|
-
},
|
|
296
|
-
onProgress: (done, total) => send("transcript.progress", { done, total }),
|
|
297
|
-
});
|
|
298
|
-
const body = parsed.format === "verbose_json"
|
|
299
|
-
? toVerboseJson(outcome.result, outcome.durationSeconds, taskName)
|
|
300
|
-
: { text: outcome.result.text.trim() };
|
|
301
|
-
send("transcript.text.done", {
|
|
302
|
-
...body,
|
|
303
|
-
mlx_bun: { model: outcome.modelId, language: outcome.result.language, duration: outcome.durationSeconds, timings: outcome.timings, ...(outcome.vocabulary ? { vocabulary: outcome.vocabulary } : {}) },
|
|
304
|
-
});
|
|
305
|
-
} catch (e) {
|
|
306
|
-
send("error", { message: (e as Error).message });
|
|
307
|
-
} finally {
|
|
308
|
-
controller.close();
|
|
309
|
-
}
|
|
310
|
-
},
|
|
311
|
-
});
|
|
312
|
-
return new Response(stream, {
|
|
313
|
-
headers: { "content-type": "text/event-stream", "cache-control": "no-cache", connection: "keep-alive" },
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
function transcriptionFailure(e: unknown): Response {
|
|
318
|
-
if (e instanceof TranscriptionError) return errorJson(e.message, e.status);
|
|
319
|
-
const message = (e as Error).message ?? String(e);
|
|
320
|
-
if (/cancelled/.test(message)) return errorJson("request cancelled", 499);
|
|
321
|
-
if (/WAV|afconvert|transcode|audio|RIFF/i.test(message)) return errorJson(`undecodable audio: ${message}`, 400);
|
|
322
|
-
return errorJson(message, 500, "server_error");
|
|
323
|
-
}
|
package/src/serve/aux-routes.ts
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
export type AuxiliaryRoute =
|
|
2
|
-
| "memory-status"
|
|
3
|
-
| "memory-list"
|
|
4
|
-
| "memory-search"
|
|
5
|
-
| "memory-article"
|
|
6
|
-
| "memory-links"
|
|
7
|
-
| "memory-history"
|
|
8
|
-
| "memory-diff"
|
|
9
|
-
| "memory-init"
|
|
10
|
-
| "memory-synthesize"
|
|
11
|
-
| "hub-local"
|
|
12
|
-
| "hub-search"
|
|
13
|
-
| "hub-download"
|
|
14
|
-
| "hub-serve"
|
|
15
|
-
| "sessions-search"
|
|
16
|
-
| "sessions-export";
|
|
17
|
-
|
|
18
|
-
/** Match request-only routes that do not depend on the loaded model or
|
|
19
|
-
* createServer's live generation state. */
|
|
20
|
-
export function matchAuxiliaryRoute(method: string, pathname: string): AuxiliaryRoute | null {
|
|
21
|
-
switch (`${method} ${pathname}`) {
|
|
22
|
-
case "GET /api/memory/status": return "memory-status";
|
|
23
|
-
case "GET /api/memory/list": return "memory-list";
|
|
24
|
-
case "GET /api/memory/search": return "memory-search";
|
|
25
|
-
case "GET /api/memory/article": return "memory-article";
|
|
26
|
-
case "GET /api/memory/links": return "memory-links";
|
|
27
|
-
case "GET /api/memory/history": return "memory-history";
|
|
28
|
-
case "GET /api/memory/diff": return "memory-diff";
|
|
29
|
-
case "POST /api/memory/init": return "memory-init";
|
|
30
|
-
case "GET /v1/memory/synthesize": return "memory-synthesize";
|
|
31
|
-
case "GET /api/hub/local": return "hub-local";
|
|
32
|
-
case "GET /api/hub/search": return "hub-search";
|
|
33
|
-
case "POST /api/hub/download": return "hub-download";
|
|
34
|
-
case "POST /api/hub/serve": return "hub-serve";
|
|
35
|
-
case "GET /api/sessions/search": return "sessions-search";
|
|
36
|
-
case "GET /api/sessions/export": return "sessions-export";
|
|
37
|
-
default: return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export async function handleAuxiliaryRoute(
|
|
42
|
-
url: URL,
|
|
43
|
-
request: Request,
|
|
44
|
-
): Promise<Response | null> {
|
|
45
|
-
switch (matchAuxiliaryRoute(request.method, url.pathname)) {
|
|
46
|
-
case "memory-status": {
|
|
47
|
-
const { handleMemoryStatus } = await import("../memory/rest");
|
|
48
|
-
return handleMemoryStatus();
|
|
49
|
-
}
|
|
50
|
-
case "memory-list": {
|
|
51
|
-
const { handleMemoryList } = await import("../memory/rest");
|
|
52
|
-
return handleMemoryList();
|
|
53
|
-
}
|
|
54
|
-
case "memory-search": {
|
|
55
|
-
const { handleMemorySearch } = await import("../memory/rest");
|
|
56
|
-
return handleMemorySearch(url);
|
|
57
|
-
}
|
|
58
|
-
case "memory-article": {
|
|
59
|
-
const { handleMemoryArticle } = await import("../memory/rest");
|
|
60
|
-
return handleMemoryArticle(url);
|
|
61
|
-
}
|
|
62
|
-
case "memory-links": {
|
|
63
|
-
const { handleMemoryLinks } = await import("../memory/rest");
|
|
64
|
-
return handleMemoryLinks(url);
|
|
65
|
-
}
|
|
66
|
-
case "memory-history": {
|
|
67
|
-
const { handleMemoryHistory } = await import("../memory/rest");
|
|
68
|
-
return handleMemoryHistory(url);
|
|
69
|
-
}
|
|
70
|
-
case "memory-diff": {
|
|
71
|
-
const { handleMemoryDiff } = await import("../memory/rest");
|
|
72
|
-
return handleMemoryDiff(url);
|
|
73
|
-
}
|
|
74
|
-
case "memory-init": {
|
|
75
|
-
const { handleMemoryInit } = await import("../memory/rest");
|
|
76
|
-
return handleMemoryInit(request);
|
|
77
|
-
}
|
|
78
|
-
case "memory-synthesize": {
|
|
79
|
-
const dryRun = url.searchParams.get("dry") === "1";
|
|
80
|
-
const { runSynthesis } = await import("../memory/pipeline");
|
|
81
|
-
const encoder = new TextEncoder();
|
|
82
|
-
const stream = new ReadableStream({
|
|
83
|
-
async start(controller) {
|
|
84
|
-
const send = (event: unknown) =>
|
|
85
|
-
controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\n\n`));
|
|
86
|
-
try {
|
|
87
|
-
const summary = await runSynthesis({ dryRun }, (event) => send(event));
|
|
88
|
-
send({ type: "summary", ...summary });
|
|
89
|
-
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
90
|
-
} catch (error) {
|
|
91
|
-
send({ type: "error", message: (error as Error).message });
|
|
92
|
-
} finally {
|
|
93
|
-
controller.close();
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
return new Response(stream, {
|
|
98
|
-
headers: {
|
|
99
|
-
"content-type": "text/event-stream",
|
|
100
|
-
"cache-control": "no-cache",
|
|
101
|
-
connection: "keep-alive",
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
case "hub-local": {
|
|
106
|
-
const { handleHubLocal } = await import("../hub-rest");
|
|
107
|
-
return handleHubLocal();
|
|
108
|
-
}
|
|
109
|
-
case "hub-search": {
|
|
110
|
-
const { handleHubSearch } = await import("../hub-rest");
|
|
111
|
-
return handleHubSearch(url);
|
|
112
|
-
}
|
|
113
|
-
case "hub-download": {
|
|
114
|
-
const { handleHubDownload } = await import("../hub-rest");
|
|
115
|
-
return handleHubDownload(request);
|
|
116
|
-
}
|
|
117
|
-
case "hub-serve": {
|
|
118
|
-
const { handleHubServe } = await import("../hub-rest");
|
|
119
|
-
return handleHubServe(request);
|
|
120
|
-
}
|
|
121
|
-
case "sessions-search": {
|
|
122
|
-
const { handleSessionsSearch } = await import("./session-search");
|
|
123
|
-
return handleSessionsSearch(url);
|
|
124
|
-
}
|
|
125
|
-
case "sessions-export": {
|
|
126
|
-
const { handleSessionsExport } = await import("./session-search");
|
|
127
|
-
return handleSessionsExport(url);
|
|
128
|
-
}
|
|
129
|
-
default:
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// Compatibility import. Scheduling policy lives in engine/scheduler; MLX
|
|
2
|
-
// batch state and numerical execution belong to the backend group.
|
|
3
|
-
export {
|
|
4
|
-
MlxBatchExecutionGroup as BatchScheduler,
|
|
5
|
-
stepTraceReport,
|
|
6
|
-
type MlxBatchExecutionGroupOptions as BatchSchedulerOptions,
|
|
7
|
-
type BatchRequest, type BatchStats, type RowSampler, type RowPromptCache, type ExclusiveLock,
|
|
8
|
-
} from "../backends/mlx/batch-group";
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { GenerateOptions } from "../generate";
|
|
2
|
-
import type { ResolvedExecution } from "../contracts/execution";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
4
|
-
|
|
5
|
-
/** Sort object fields only; array order is meaningful for adapter composition,
|
|
6
|
-
* stop handling and quantization recipes. */
|
|
7
|
-
function canonical(value: unknown): unknown {
|
|
8
|
-
if (Array.isArray(value)) return value.map(canonical);
|
|
9
|
-
if (value && typeof value === "object")
|
|
10
|
-
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))
|
|
11
|
-
.map(([key, item]) => [key, canonical(item)]));
|
|
12
|
-
return value;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Stable identity for an exactly resumable generation. The prompt already
|
|
16
|
-
* includes rendered messages and tool schemas; the remaining fields cover
|
|
17
|
-
* every sampling policy that can change the continuation. */
|
|
18
|
-
export function generationCheckpointKey(
|
|
19
|
-
promptIds: number[], options: GenerateOptions & { stopSequences?: readonly string[] }, cacheNs = "",
|
|
20
|
-
execution?: ResolvedExecution, bindingIdentity?: unknown,
|
|
21
|
-
): string {
|
|
22
|
-
const policy = {
|
|
23
|
-
version: 4,
|
|
24
|
-
execution: execution && { method: execution.method, mechanism: execution.mechanism,
|
|
25
|
-
pagedKv: execution.pagedKv, fill: execution.fill,
|
|
26
|
-
compiledDecode: execution.compiledDecode, grammarJump: execution.grammarJump },
|
|
27
|
-
bindingIdentity,
|
|
28
|
-
stopSequences: options.stopSequences ?? [],
|
|
29
|
-
cacheNs,
|
|
30
|
-
promptIds,
|
|
31
|
-
maxTokens: options.maxTokens,
|
|
32
|
-
eosTokenIds: options.eosTokenIds,
|
|
33
|
-
temperature: options.temperature,
|
|
34
|
-
topP: options.topP,
|
|
35
|
-
topK: options.topK,
|
|
36
|
-
minP: options.minP,
|
|
37
|
-
minTokensToKeep: options.minTokensToKeep,
|
|
38
|
-
xtcProbability: options.xtcProbability,
|
|
39
|
-
xtcThreshold: options.xtcThreshold,
|
|
40
|
-
xtcSpecialTokens: options.xtcSpecialTokens,
|
|
41
|
-
// A missing client seed means "fresh randomness" for a new request, but
|
|
42
|
-
// an identical RETRY must find the durable checkpoint and restore the
|
|
43
|
-
// original random stream. Keep the generated seed out of request identity;
|
|
44
|
-
// it travels in checkpoint metadata instead. Explicit seeds remain part of
|
|
45
|
-
// the policy, so changing one cannot select an incompatible checkpoint.
|
|
46
|
-
seedMode: options.seedWasExplicit ? "explicit" : "server-default",
|
|
47
|
-
seed: options.seedWasExplicit ? options.seed : undefined,
|
|
48
|
-
hlg: options.hlg,
|
|
49
|
-
curve: options.curve,
|
|
50
|
-
logitBias: options.logitBias,
|
|
51
|
-
repetitionPenalty: options.repetitionPenalty,
|
|
52
|
-
repetitionContextSize: options.repetitionContextSize,
|
|
53
|
-
presencePenalty: options.presencePenalty,
|
|
54
|
-
presenceContextSize: options.presenceContextSize,
|
|
55
|
-
frequencyPenalty: options.frequencyPenalty,
|
|
56
|
-
frequencyContextSize: options.frequencyContextSize,
|
|
57
|
-
kvBits: options.kvBits,
|
|
58
|
-
kvGroupSize: options.kvGroupSize,
|
|
59
|
-
quantizedKvStart: options.quantizedKvStart,
|
|
60
|
-
kvConfig: options.kvConfig,
|
|
61
|
-
turboQuant: options.turboQuant,
|
|
62
|
-
};
|
|
63
|
-
return createHash("sha256").update(JSON.stringify(canonical(policy))).digest("hex");
|
|
64
|
-
}
|