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,262 +0,0 @@
|
|
|
1
|
-
// Dedicated GLM-5.2 / glm_moe_dsa configuration.
|
|
2
|
-
//
|
|
3
|
-
// This intentionally does not extend the universal dense descriptor. GLM-5.2
|
|
4
|
-
// has a different attention state (compressed MLA + DSA), a correction-biased
|
|
5
|
-
// sigmoid router, a native MTP row, and a converted Colibri container whose
|
|
6
|
-
// quantization metadata is carried by tensor byte geometry rather than the
|
|
7
|
-
// source checkpoint's FP8 quantization_config.
|
|
8
|
-
|
|
9
|
-
export type Glm52IndexerType = "full" | "shared";
|
|
10
|
-
|
|
11
|
-
export interface Glm52Config {
|
|
12
|
-
readonly modelDir: string;
|
|
13
|
-
readonly modelType: "glm_moe_dsa";
|
|
14
|
-
readonly architectures: string[];
|
|
15
|
-
readonly hiddenSize: number;
|
|
16
|
-
readonly numHiddenLayers: number;
|
|
17
|
-
readonly numAttentionHeads: number;
|
|
18
|
-
readonly numKeyValueHeads: number;
|
|
19
|
-
readonly qLoraRank: number;
|
|
20
|
-
readonly kvLoraRank: number;
|
|
21
|
-
readonly qkNopeHeadDim: number;
|
|
22
|
-
readonly qkRopeHeadDim: number;
|
|
23
|
-
readonly qkHeadDim: number;
|
|
24
|
-
readonly vHeadDim: number;
|
|
25
|
-
readonly firstKDenseReplace: number;
|
|
26
|
-
readonly intermediateSize: number;
|
|
27
|
-
readonly moeIntermediateSize: number;
|
|
28
|
-
readonly numRoutedExperts: number;
|
|
29
|
-
readonly numExpertsPerToken: number;
|
|
30
|
-
readonly numSharedExperts: number;
|
|
31
|
-
readonly nGroup: number;
|
|
32
|
-
readonly topkGroup: number;
|
|
33
|
-
readonly normTopkProb: boolean;
|
|
34
|
-
readonly routedScalingFactor: number;
|
|
35
|
-
readonly rmsNormEps: number;
|
|
36
|
-
readonly ropeTheta: number;
|
|
37
|
-
readonly ropeInterleave: boolean;
|
|
38
|
-
readonly vocabSize: number;
|
|
39
|
-
readonly maxPositionEmbeddings: number;
|
|
40
|
-
readonly indexTopk: number;
|
|
41
|
-
readonly indexNumHeads: number;
|
|
42
|
-
readonly indexHeadDim: number;
|
|
43
|
-
readonly indexerRopeInterleave: boolean;
|
|
44
|
-
readonly indexerTypes: Glm52IndexerType[];
|
|
45
|
-
readonly numNextnPredictLayers: number;
|
|
46
|
-
readonly indexShareForMtpIteration: boolean;
|
|
47
|
-
readonly eosTokenIds: number[];
|
|
48
|
-
readonly padTokenId: number;
|
|
49
|
-
readonly raw: Record<string, unknown>;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function integer(
|
|
53
|
-
raw: Record<string, any>,
|
|
54
|
-
key: string,
|
|
55
|
-
options: { min?: number; max?: number; fallback?: number } = {},
|
|
56
|
-
): number {
|
|
57
|
-
const value = raw[key] ?? options.fallback;
|
|
58
|
-
if (!Number.isInteger(value))
|
|
59
|
-
throw new Error(`GLM-5.2 config: ${key} must be an integer (got ${String(value)})`);
|
|
60
|
-
if (options.min !== undefined && value < options.min)
|
|
61
|
-
throw new Error(`GLM-5.2 config: ${key}=${value} is below ${options.min}`);
|
|
62
|
-
if (options.max !== undefined && value > options.max)
|
|
63
|
-
throw new Error(`GLM-5.2 config: ${key}=${value} exceeds ${options.max}`);
|
|
64
|
-
return value;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function finite(
|
|
68
|
-
raw: Record<string, any>,
|
|
69
|
-
key: string,
|
|
70
|
-
options: { min?: number; fallback?: number } = {},
|
|
71
|
-
): number {
|
|
72
|
-
const value = raw[key] ?? options.fallback;
|
|
73
|
-
if (typeof value !== "number" || !Number.isFinite(value))
|
|
74
|
-
throw new Error(`GLM-5.2 config: ${key} must be finite (got ${String(value)})`);
|
|
75
|
-
if (options.min !== undefined && value < options.min)
|
|
76
|
-
throw new Error(`GLM-5.2 config: ${key}=${value} is below ${options.min}`);
|
|
77
|
-
return value;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function boolean(raw: Record<string, any>, key: string, fallback = false): boolean {
|
|
81
|
-
const value = raw[key] ?? fallback;
|
|
82
|
-
if (typeof value !== "boolean")
|
|
83
|
-
throw new Error(`GLM-5.2 config: ${key} must be boolean (got ${String(value)})`);
|
|
84
|
-
return value;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function tokenIds(value: unknown, source: string): number[] {
|
|
88
|
-
if (value === undefined || value === null) return [];
|
|
89
|
-
const values = Array.isArray(value) ? value : [value];
|
|
90
|
-
return values.map((id) => {
|
|
91
|
-
if (!Number.isInteger(id) || id < 0)
|
|
92
|
-
throw new Error(`GLM-5.2 config: ${source} contains invalid token id ${String(id)}`);
|
|
93
|
-
return id as number;
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function unionTokenIds(...groups: number[][]): number[] {
|
|
98
|
-
const seen = new Set<number>();
|
|
99
|
-
const out: number[] = [];
|
|
100
|
-
for (const group of groups) {
|
|
101
|
-
for (const id of group) {
|
|
102
|
-
if (seen.has(id)) continue;
|
|
103
|
-
seen.add(id);
|
|
104
|
-
out.push(id);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return out;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function indexerSchedule(raw: Record<string, any>, layers: number): Glm52IndexerType[] {
|
|
111
|
-
const explicit = raw.indexer_types;
|
|
112
|
-
if (explicit !== undefined) {
|
|
113
|
-
if (!Array.isArray(explicit) || explicit.length !== layers)
|
|
114
|
-
throw new Error(
|
|
115
|
-
`GLM-5.2 config: indexer_types must have ${layers} entries ` +
|
|
116
|
-
`(got ${Array.isArray(explicit) ? explicit.length : typeof explicit})`,
|
|
117
|
-
);
|
|
118
|
-
return explicit.map((entry, layer) => {
|
|
119
|
-
if (entry !== "full" && entry !== "shared")
|
|
120
|
-
throw new Error(`GLM-5.2 config: indexer_types[${layer}]=${String(entry)}`);
|
|
121
|
-
return entry;
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const frequency = integer(raw, "index_topk_freq", { min: 1, fallback: 1 });
|
|
126
|
-
const offset = integer(raw, "index_skip_topk_offset", { min: 0, fallback: 2 });
|
|
127
|
-
// Exact pinned-Colibri fallback:
|
|
128
|
-
// v = max(layer - offset + 1, 0); full iff v % frequency == 0.
|
|
129
|
-
return Array.from({ length: layers }, (_, layer) => {
|
|
130
|
-
const v = Math.max(layer - offset + 1, 0);
|
|
131
|
-
return v % frequency === 0 ? "full" : "shared";
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export function parseGlm52Config(
|
|
136
|
-
modelDir: string,
|
|
137
|
-
raw: Record<string, any>,
|
|
138
|
-
generation: Record<string, any> | null = null,
|
|
139
|
-
): Glm52Config {
|
|
140
|
-
if (raw.model_type !== "glm_moe_dsa")
|
|
141
|
-
throw new Error(`expected model_type "glm_moe_dsa" (got ${String(raw.model_type)})`);
|
|
142
|
-
|
|
143
|
-
const hiddenSize = integer(raw, "hidden_size", { min: 1, max: 1 << 20 });
|
|
144
|
-
const numHiddenLayers = integer(raw, "num_hidden_layers", { min: 1, max: 128 });
|
|
145
|
-
const numAttentionHeads = integer(raw, "num_attention_heads", { min: 1, max: 1024 });
|
|
146
|
-
const numKeyValueHeads = integer(raw, "num_key_value_heads", {
|
|
147
|
-
min: 1,
|
|
148
|
-
max: 1024,
|
|
149
|
-
fallback: numAttentionHeads,
|
|
150
|
-
});
|
|
151
|
-
const qLoraRank = integer(raw, "q_lora_rank", { min: 1, max: 1 << 20 });
|
|
152
|
-
const kvLoraRank = integer(raw, "kv_lora_rank", { min: 1, max: 1 << 20 });
|
|
153
|
-
const qkNopeHeadDim = integer(raw, "qk_nope_head_dim", { min: 1, max: 1 << 16 });
|
|
154
|
-
const qkRopeHeadDim = integer(raw, "qk_rope_head_dim", { min: 1, max: 1 << 16 });
|
|
155
|
-
const qkHeadDim = integer(raw, "qk_head_dim", {
|
|
156
|
-
min: 1,
|
|
157
|
-
max: 1 << 16,
|
|
158
|
-
fallback: qkNopeHeadDim + qkRopeHeadDim,
|
|
159
|
-
});
|
|
160
|
-
if (qkHeadDim !== qkNopeHeadDim + qkRopeHeadDim)
|
|
161
|
-
throw new Error(
|
|
162
|
-
`GLM-5.2 config: qk_head_dim=${qkHeadDim} != qk_nope_head_dim + ` +
|
|
163
|
-
`qk_rope_head_dim (${qkNopeHeadDim + qkRopeHeadDim})`,
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
const numRoutedExperts = integer(raw, "n_routed_experts", { min: 1, max: 4096 });
|
|
167
|
-
const numExpertsPerToken = integer(raw, "num_experts_per_tok", {
|
|
168
|
-
min: 1,
|
|
169
|
-
max: numRoutedExperts,
|
|
170
|
-
});
|
|
171
|
-
const nGroup = integer(raw, "n_group", { min: 1 });
|
|
172
|
-
const topkGroup = integer(raw, "topk_group", { min: 1 });
|
|
173
|
-
// The pinned GLM engine implements the n_group=1 noaux_tc router exactly.
|
|
174
|
-
// Refuse a future grouped-router architecture instead of silently selecting
|
|
175
|
-
// from the wrong candidate set.
|
|
176
|
-
if (nGroup !== 1 || topkGroup !== 1)
|
|
177
|
-
throw new Error(`GLM-5.2 config: only n_group=1/topk_group=1 is supported`);
|
|
178
|
-
|
|
179
|
-
const indexTopk = integer(raw, "index_topk", { min: 0, max: 1 << 20, fallback: 0 });
|
|
180
|
-
const indexNumHeads = integer(raw, "index_n_heads", { min: 0, max: 1024, fallback: 0 });
|
|
181
|
-
const indexHeadDim = integer(raw, "index_head_dim", { min: 0, max: 1 << 16, fallback: 0 });
|
|
182
|
-
if ((indexTopk === 0) !== (indexNumHeads === 0 || indexHeadDim === 0))
|
|
183
|
-
throw new Error(
|
|
184
|
-
`GLM-5.2 config: incomplete DSA geometry ` +
|
|
185
|
-
`(topk=${indexTopk}, heads=${indexNumHeads}, head_dim=${indexHeadDim})`,
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
const eosTokenIds = unionTokenIds(
|
|
189
|
-
tokenIds(raw.eos_token_id, "config.json:eos_token_id"),
|
|
190
|
-
tokenIds(generation?.eos_token_id, "generation_config.json:eos_token_id"),
|
|
191
|
-
);
|
|
192
|
-
if (eosTokenIds.length === 0)
|
|
193
|
-
throw new Error("GLM-5.2 config: no EOS token ids in config or generation config");
|
|
194
|
-
|
|
195
|
-
return {
|
|
196
|
-
modelDir,
|
|
197
|
-
modelType: "glm_moe_dsa",
|
|
198
|
-
architectures: Array.isArray(raw.architectures)
|
|
199
|
-
? raw.architectures.map((entry: unknown) => String(entry))
|
|
200
|
-
: [],
|
|
201
|
-
hiddenSize,
|
|
202
|
-
numHiddenLayers,
|
|
203
|
-
numAttentionHeads,
|
|
204
|
-
numKeyValueHeads,
|
|
205
|
-
qLoraRank,
|
|
206
|
-
kvLoraRank,
|
|
207
|
-
qkNopeHeadDim,
|
|
208
|
-
qkRopeHeadDim,
|
|
209
|
-
qkHeadDim,
|
|
210
|
-
vHeadDim: integer(raw, "v_head_dim", { min: 1, max: 1 << 16 }),
|
|
211
|
-
firstKDenseReplace: integer(raw, "first_k_dense_replace", {
|
|
212
|
-
min: 0,
|
|
213
|
-
max: numHiddenLayers,
|
|
214
|
-
}),
|
|
215
|
-
intermediateSize: integer(raw, "intermediate_size", { min: 1, max: 1 << 24 }),
|
|
216
|
-
moeIntermediateSize: integer(raw, "moe_intermediate_size", { min: 1, max: 1 << 20 }),
|
|
217
|
-
numRoutedExperts,
|
|
218
|
-
numExpertsPerToken,
|
|
219
|
-
numSharedExperts: integer(raw, "n_shared_experts", { min: 0, max: 64, fallback: 0 }),
|
|
220
|
-
nGroup,
|
|
221
|
-
topkGroup,
|
|
222
|
-
normTopkProb: boolean(raw, "norm_topk_prob", false),
|
|
223
|
-
routedScalingFactor: finite(raw, "routed_scaling_factor", { min: 0, fallback: 1 }),
|
|
224
|
-
rmsNormEps: finite(raw, "rms_norm_eps", { min: 0, fallback: 1e-5 }),
|
|
225
|
-
ropeTheta: finite(raw.rope_parameters ?? raw, "rope_theta", {
|
|
226
|
-
min: Number.MIN_VALUE,
|
|
227
|
-
fallback: 10000,
|
|
228
|
-
}),
|
|
229
|
-
ropeInterleave: boolean(raw, "rope_interleave", true),
|
|
230
|
-
vocabSize: integer(raw, "vocab_size", { min: 1, max: 1 << 24 }),
|
|
231
|
-
maxPositionEmbeddings: integer(raw, "max_position_embeddings", {
|
|
232
|
-
min: 1,
|
|
233
|
-
max: 1 << 30,
|
|
234
|
-
}),
|
|
235
|
-
indexTopk,
|
|
236
|
-
indexNumHeads,
|
|
237
|
-
indexHeadDim,
|
|
238
|
-
indexerRopeInterleave: boolean(raw, "indexer_rope_interleave", true),
|
|
239
|
-
indexerTypes: indexerSchedule(raw, numHiddenLayers),
|
|
240
|
-
numNextnPredictLayers: integer(raw, "num_nextn_predict_layers", {
|
|
241
|
-
min: 0,
|
|
242
|
-
max: 8,
|
|
243
|
-
fallback: 0,
|
|
244
|
-
}),
|
|
245
|
-
indexShareForMtpIteration: boolean(raw, "index_share_for_mtp_iteration", false),
|
|
246
|
-
eosTokenIds,
|
|
247
|
-
padTokenId: integer(raw, "pad_token_id", { min: 0, fallback: eosTokenIds[0] }),
|
|
248
|
-
raw,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export async function loadGlm52Config(modelDir: string): Promise<Glm52Config> {
|
|
253
|
-
const configFile = Bun.file(`${modelDir}/config.json`);
|
|
254
|
-
if (!(await configFile.exists()))
|
|
255
|
-
throw new Error(`${modelDir}: missing config.json`);
|
|
256
|
-
const raw = (await configFile.json()) as Record<string, any>;
|
|
257
|
-
const generationFile = Bun.file(`${modelDir}/generation_config.json`);
|
|
258
|
-
const generation = await generationFile.exists()
|
|
259
|
-
? await generationFile.json() as Record<string, any>
|
|
260
|
-
: null;
|
|
261
|
-
return parseGlm52Config(modelDir, raw, generation);
|
|
262
|
-
}
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
// Header-only reader and validator for Colibri's converted GLM-5.2 artifact.
|
|
2
|
-
//
|
|
3
|
-
// Colibri emits ordinary safetensors shards named out-*, out-mtp-* and
|
|
4
|
-
// optionally out-idx-*. There is no model.safetensors.index.json. Tensor byte
|
|
5
|
-
// geometry is authoritative: converted 2-D tensors are flattened U8 payloads
|
|
6
|
-
// with companion F32 `<name>.qs` scales. Reading only the headers avoids
|
|
7
|
-
// mapping hundreds of GiB merely to validate the artifact.
|
|
8
|
-
|
|
9
|
-
import { closeSync, fstatSync, openSync, readSync, readdirSync } from "node:fs";
|
|
10
|
-
import { basename, join } from "node:path";
|
|
11
|
-
import type { Glm52Config } from "./glm52-config";
|
|
12
|
-
|
|
13
|
-
export type ColibriShardFamily = "main" | "mtp" | "indexer";
|
|
14
|
-
export type ColibriDtype =
|
|
15
|
-
| "BOOL" | "U8" | "I8" | "U16" | "I16" | "U32" | "I32" | "U64" | "I64"
|
|
16
|
-
| "F16" | "BF16" | "F32" | "F64";
|
|
17
|
-
|
|
18
|
-
const DTYPE_BYTES: Record<ColibriDtype, number> = {
|
|
19
|
-
BOOL: 1, U8: 1, I8: 1, U16: 2, I16: 2, U32: 4, I32: 4,
|
|
20
|
-
U64: 8, I64: 8, F16: 2, BF16: 2, F32: 4, F64: 8,
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const GROUP_SIZES = [16, 32, 48, 64, 96, 128, 192, 256] as const;
|
|
24
|
-
// Match safetensors' own defensive ceiling: headers are metadata, never model
|
|
25
|
-
// payload. This prevents a corrupt multi-GiB shard from becoming a matching
|
|
26
|
-
// multi-GiB Bun allocation before JSON validation.
|
|
27
|
-
const MAX_SAFETENSORS_HEADER_BYTES = 100_000_000n;
|
|
28
|
-
|
|
29
|
-
interface HeaderTensor {
|
|
30
|
-
dtype: ColibriDtype;
|
|
31
|
-
shape: number[];
|
|
32
|
-
data_offsets: [number, number];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface ColibriTensorInfo {
|
|
36
|
-
readonly name: string;
|
|
37
|
-
readonly dtype: ColibriDtype;
|
|
38
|
-
readonly shape: number[];
|
|
39
|
-
readonly file: string;
|
|
40
|
-
readonly family: ColibriShardFamily;
|
|
41
|
-
readonly begin: number;
|
|
42
|
-
readonly end: number;
|
|
43
|
-
readonly absoluteBegin: number;
|
|
44
|
-
readonly absoluteEnd: number;
|
|
45
|
-
readonly byteLength: number;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface ColibriQuantTensorInfo {
|
|
49
|
-
readonly name: string;
|
|
50
|
-
readonly outputRows: number;
|
|
51
|
-
readonly inputColumns: number;
|
|
52
|
-
readonly bits: 4 | 8;
|
|
53
|
-
readonly groupSize: number | null;
|
|
54
|
-
readonly weight: ColibriTensorInfo;
|
|
55
|
-
readonly scales: ColibriTensorInfo;
|
|
56
|
-
readonly coalescedNextWeight: string | null;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface Glm52ContainerCapabilities {
|
|
60
|
-
readonly hasMtp: boolean;
|
|
61
|
-
readonly hasDsa: boolean;
|
|
62
|
-
readonly missingMtpTensors: string[];
|
|
63
|
-
readonly missingDsaTensors: string[];
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function product(shape: number[], label: string): number {
|
|
67
|
-
let value = 1;
|
|
68
|
-
for (const dim of shape) {
|
|
69
|
-
if (!Number.isSafeInteger(dim) || dim < 0)
|
|
70
|
-
throw new Error(`${label}: invalid shape ${JSON.stringify(shape)}`);
|
|
71
|
-
value *= dim;
|
|
72
|
-
if (!Number.isSafeInteger(value))
|
|
73
|
-
throw new Error(`${label}: shape product exceeds safe integer range`);
|
|
74
|
-
}
|
|
75
|
-
return value;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function readFully(fd: number, buffer: Uint8Array, position: number, label: string): void {
|
|
79
|
-
let offset = 0;
|
|
80
|
-
while (offset < buffer.byteLength) {
|
|
81
|
-
const got = readSync(fd, buffer, offset, buffer.byteLength - offset, position + offset);
|
|
82
|
-
if (got === 0)
|
|
83
|
-
throw new Error(`${label}: short read at ${position + offset}`);
|
|
84
|
-
offset += got;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function familyFor(filename: string): ColibriShardFamily | null {
|
|
89
|
-
if (/^out-mtp-\d+\.safetensors$/.test(filename)) return "mtp";
|
|
90
|
-
if (/^out-idx-\d+\.safetensors$/.test(filename)) return "indexer";
|
|
91
|
-
if (/^out-\d+\.safetensors$/.test(filename)) return "main";
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function parseHeader(path: string, family: ColibriShardFamily): ColibriTensorInfo[] {
|
|
96
|
-
const fd = openSync(path, "r");
|
|
97
|
-
try {
|
|
98
|
-
const stat = fstatSync(fd);
|
|
99
|
-
if (stat.size < 8) throw new Error(`${path}: too small for safetensors`);
|
|
100
|
-
const prefix = Buffer.allocUnsafe(8);
|
|
101
|
-
readFully(fd, prefix, 0, path);
|
|
102
|
-
const headerBig = prefix.readBigUInt64LE(0);
|
|
103
|
-
if (headerBig > MAX_SAFETENSORS_HEADER_BYTES) {
|
|
104
|
-
throw new Error(
|
|
105
|
-
`${path}: safetensors header ${headerBig} exceeds ` +
|
|
106
|
-
`${MAX_SAFETENSORS_HEADER_BYTES} byte limit`,
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
if (headerBig > BigInt(Number.MAX_SAFE_INTEGER))
|
|
110
|
-
throw new Error(`${path}: safetensors header is too large`);
|
|
111
|
-
const headerLength = Number(headerBig);
|
|
112
|
-
const dataStart = 8 + headerLength;
|
|
113
|
-
if (headerLength < 2 || dataStart > stat.size)
|
|
114
|
-
throw new Error(`${path}: invalid safetensors header length ${headerLength}`);
|
|
115
|
-
const bytes = Buffer.allocUnsafe(headerLength);
|
|
116
|
-
readFully(fd, bytes, 8, path);
|
|
117
|
-
let parsed: Record<string, HeaderTensor | Record<string, string>>;
|
|
118
|
-
try {
|
|
119
|
-
parsed = JSON.parse(bytes.toString("utf8"));
|
|
120
|
-
} catch (error) {
|
|
121
|
-
throw new Error(`${path}: invalid safetensors JSON: ${String(error)}`);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const out: ColibriTensorInfo[] = [];
|
|
125
|
-
for (const [name, raw] of Object.entries(parsed)) {
|
|
126
|
-
if (name === "__metadata__") continue;
|
|
127
|
-
const entry = raw as HeaderTensor;
|
|
128
|
-
if (!entry || !(entry.dtype in DTYPE_BYTES) || !Array.isArray(entry.shape) ||
|
|
129
|
-
!Array.isArray(entry.data_offsets) || entry.data_offsets.length !== 2)
|
|
130
|
-
throw new Error(`${path}: malformed tensor entry ${name}`);
|
|
131
|
-
const [begin, end] = entry.data_offsets;
|
|
132
|
-
if (!Number.isSafeInteger(begin) || !Number.isSafeInteger(end) || begin < 0 || end < begin)
|
|
133
|
-
throw new Error(`${path}: tensor ${name} has invalid offsets ${String(entry.data_offsets)}`);
|
|
134
|
-
const elements = product(entry.shape, `${path}:${name}`);
|
|
135
|
-
const expected = elements * DTYPE_BYTES[entry.dtype];
|
|
136
|
-
if (end - begin !== expected)
|
|
137
|
-
throw new Error(
|
|
138
|
-
`${path}: tensor ${name} byte range ${end - begin} != ` +
|
|
139
|
-
`${JSON.stringify(entry.shape)} × ${entry.dtype}`,
|
|
140
|
-
);
|
|
141
|
-
if (dataStart + end > stat.size)
|
|
142
|
-
throw new Error(`${path}: tensor ${name} extends past end of shard`);
|
|
143
|
-
out.push({
|
|
144
|
-
name,
|
|
145
|
-
dtype: entry.dtype,
|
|
146
|
-
shape: [...entry.shape],
|
|
147
|
-
file: path,
|
|
148
|
-
family,
|
|
149
|
-
begin,
|
|
150
|
-
end,
|
|
151
|
-
absoluteBegin: dataStart + begin,
|
|
152
|
-
absoluteEnd: dataStart + end,
|
|
153
|
-
byteLength: end - begin,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
return out;
|
|
157
|
-
} finally {
|
|
158
|
-
closeSync(fd);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export class ColibriGlm52Container {
|
|
163
|
-
readonly tensors = new Map<string, ColibriTensorInfo>();
|
|
164
|
-
readonly files: ReadonlyArray<{ path: string; family: ColibriShardFamily }>;
|
|
165
|
-
|
|
166
|
-
private constructor(files: Array<{ path: string; family: ColibriShardFamily }>) {
|
|
167
|
-
this.files = files;
|
|
168
|
-
for (const { path, family } of files) {
|
|
169
|
-
for (const tensor of parseHeader(path, family)) {
|
|
170
|
-
const prior = this.tensors.get(tensor.name);
|
|
171
|
-
if (prior)
|
|
172
|
-
throw new Error(
|
|
173
|
-
`duplicate Colibri tensor ${tensor.name} in ${basename(prior.file)} ` +
|
|
174
|
-
`and ${basename(tensor.file)}`,
|
|
175
|
-
);
|
|
176
|
-
this.tensors.set(tensor.name, tensor);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (this.tensors.size === 0)
|
|
180
|
-
throw new Error("Colibri container has no tensors");
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
static open(modelDir: string): ColibriGlm52Container {
|
|
184
|
-
const files = readdirSync(modelDir)
|
|
185
|
-
.map((name) => ({ name, family: familyFor(name) }))
|
|
186
|
-
.filter((entry): entry is { name: string; family: ColibriShardFamily } =>
|
|
187
|
-
entry.family !== null)
|
|
188
|
-
.sort((a, b) => a.name.localeCompare(b.name))
|
|
189
|
-
.map(({ name, family }) => ({ path: join(modelDir, name), family }));
|
|
190
|
-
if (!files.some((entry) => entry.family === "main"))
|
|
191
|
-
throw new Error(`${modelDir}: no out-NNNNN.safetensors Colibri shards`);
|
|
192
|
-
return new ColibriGlm52Container(files);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
has(name: string): boolean {
|
|
196
|
-
return this.tensors.has(name);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
info(name: string): ColibriTensorInfo {
|
|
200
|
-
const info = this.tensors.get(name);
|
|
201
|
-
if (!info) throw new Error(`Colibri container: missing tensor ${name}`);
|
|
202
|
-
return info;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/** Validate a converted 2-D tensor and infer int4 group geometry from scales. */
|
|
206
|
-
quantized(name: string, outputRows: number, inputColumns: number): ColibriQuantTensorInfo {
|
|
207
|
-
if (!Number.isSafeInteger(outputRows) || outputRows <= 0 ||
|
|
208
|
-
!Number.isSafeInteger(inputColumns) || inputColumns <= 0)
|
|
209
|
-
throw new Error(`${name}: invalid logical shape [${outputRows},${inputColumns}]`);
|
|
210
|
-
const weight = this.info(name);
|
|
211
|
-
const scales = this.info(`${name}.qs`);
|
|
212
|
-
if (weight.dtype !== "U8")
|
|
213
|
-
throw new Error(`${name}: converted weight must be U8 (got ${weight.dtype})`);
|
|
214
|
-
if (scales.dtype !== "F32")
|
|
215
|
-
throw new Error(`${name}.qs: scales must be F32 (got ${scales.dtype})`);
|
|
216
|
-
|
|
217
|
-
const int8Bytes = outputRows * inputColumns;
|
|
218
|
-
const int4Bytes = outputRows * Math.ceil(inputColumns / 2);
|
|
219
|
-
let bits: 4 | 8;
|
|
220
|
-
if (weight.byteLength === int8Bytes) bits = 8;
|
|
221
|
-
else if (weight.byteLength === int4Bytes) bits = 4;
|
|
222
|
-
else {
|
|
223
|
-
throw new Error(
|
|
224
|
-
`${name}: ${weight.byteLength} bytes do not encode logical ` +
|
|
225
|
-
`[${outputRows},${inputColumns}] as int8 (${int8Bytes}) or int4 (${int4Bytes})`,
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const scaleCount = scales.byteLength / 4;
|
|
230
|
-
let groupSize: number | null = null;
|
|
231
|
-
if (scaleCount !== outputRows) {
|
|
232
|
-
if (bits !== 4)
|
|
233
|
-
throw new Error(`${name}.qs: grouped scales are only valid for int4`);
|
|
234
|
-
groupSize = GROUP_SIZES.find(
|
|
235
|
-
(candidate) => scaleCount === outputRows * Math.ceil(inputColumns / candidate),
|
|
236
|
-
) ?? null;
|
|
237
|
-
if (groupSize === null)
|
|
238
|
-
throw new Error(
|
|
239
|
-
`${name}.qs: ${scaleCount} scales do not match per-row or a supported ` +
|
|
240
|
-
`group size for [${outputRows},${inputColumns}]`,
|
|
241
|
-
);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
let coalescedNextWeight: string | null = null;
|
|
245
|
-
for (const other of this.tensors.values()) {
|
|
246
|
-
if (other.dtype === "U8" && other.file === weight.file &&
|
|
247
|
-
other.absoluteBegin === weight.absoluteEnd) {
|
|
248
|
-
coalescedNextWeight = other.name;
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return {
|
|
253
|
-
name,
|
|
254
|
-
outputRows,
|
|
255
|
-
inputColumns,
|
|
256
|
-
bits,
|
|
257
|
-
groupSize,
|
|
258
|
-
weight,
|
|
259
|
-
scales,
|
|
260
|
-
coalescedNextWeight,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
capabilities(config: Glm52Config): Glm52ContainerCapabilities {
|
|
265
|
-
const mtpLayer = config.numHiddenLayers;
|
|
266
|
-
const mtpPrefix = `model.layers.${mtpLayer}`;
|
|
267
|
-
// G4 validates the full MTP family before enabling drafting. G2 records the
|
|
268
|
-
// architectural sentinels so a partial sidecar cannot masquerade as MTP.
|
|
269
|
-
const mtpRequired = config.numNextnPredictLayers > 0 ? [
|
|
270
|
-
`${mtpPrefix}.eh_proj.weight`,
|
|
271
|
-
`${mtpPrefix}.enorm.weight`,
|
|
272
|
-
`${mtpPrefix}.hnorm.weight`,
|
|
273
|
-
`${mtpPrefix}.shared_head.norm.weight`,
|
|
274
|
-
`${mtpPrefix}.input_layernorm.weight`,
|
|
275
|
-
`${mtpPrefix}.post_attention_layernorm.weight`,
|
|
276
|
-
`${mtpPrefix}.self_attn.q_a_proj.weight`,
|
|
277
|
-
`${mtpPrefix}.self_attn.kv_a_proj_with_mqa.weight`,
|
|
278
|
-
`${mtpPrefix}.mlp.gate.weight`,
|
|
279
|
-
`${mtpPrefix}.mlp.gate.e_score_correction_bias`,
|
|
280
|
-
] : [];
|
|
281
|
-
const missingMtpTensors = mtpRequired.filter((name) => !this.has(name));
|
|
282
|
-
|
|
283
|
-
const dsaRequired: string[] = [];
|
|
284
|
-
if (config.indexTopk > 0) {
|
|
285
|
-
for (let layer = 0; layer < config.numHiddenLayers; layer++) {
|
|
286
|
-
if (config.indexerTypes[layer] !== "full") continue;
|
|
287
|
-
const prefix = `model.layers.${layer}.self_attn.indexer`;
|
|
288
|
-
dsaRequired.push(
|
|
289
|
-
`${prefix}.wq_b.weight`,
|
|
290
|
-
`${prefix}.wk.weight`,
|
|
291
|
-
`${prefix}.weights_proj.weight`,
|
|
292
|
-
`${prefix}.k_norm.weight`,
|
|
293
|
-
`${prefix}.k_norm.bias`,
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
const missingDsaTensors = dsaRequired.filter((name) => !this.has(name));
|
|
298
|
-
return {
|
|
299
|
-
hasMtp: mtpRequired.length > 0 && missingMtpTensors.length === 0,
|
|
300
|
-
hasDsa: dsaRequired.length > 0 && missingDsaTensors.length === 0,
|
|
301
|
-
missingMtpTensors,
|
|
302
|
-
missingDsaTensors,
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
}
|