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,139 +0,0 @@
|
|
|
1
|
-
// HashHop — long-context multi-hop key/value retrieval. Port of
|
|
2
|
-
// optiq/eval/hashhop.py. The generator (Magic AI's HashHop, codelion's
|
|
3
|
-
// `hashhop` package) isn't on PyPI, so we reconstruct MultiHopEval.make_one
|
|
4
|
-
// from the documented format: a chain h0=h1, h1=h2, …, h(N-1)='hN' (quoted
|
|
5
|
-
// terminal) buried in many distractor assignments, serialized as a shuffled
|
|
6
|
-
// dictionary. The model walks N lookups from h0 and reports hN.
|
|
7
|
-
//
|
|
8
|
-
// This is the long-context guard (≈12k-char dict → ~8–9k tokens): online-
|
|
9
|
-
// softmax / mixed-4/8-bit-KV error compounds across hops, so it's where the
|
|
10
|
-
// fused-attention kernel (opportunity A) has the most to prove.
|
|
11
|
-
|
|
12
|
-
import { generateText, loadJsonl, type TaskModel } from "../runner";
|
|
13
|
-
import { runtimeValue } from "../../runtime-config";
|
|
14
|
-
|
|
15
|
-
const INSTR =
|
|
16
|
-
"You will be given a list of hash assignments and a starting hash. " +
|
|
17
|
-
"Walk the chain by repeated key->value lookup until you hit a terminal " +
|
|
18
|
-
"value (written with single quotes, e.g. `KEY = 'VALUE'`). Output ONLY " +
|
|
19
|
-
"the final 16-character hash inside the quotes, with no extra words or " +
|
|
20
|
-
"punctuation.";
|
|
21
|
-
|
|
22
|
-
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
23
|
-
const HASH_LEN = 16;
|
|
24
|
-
|
|
25
|
-
function mulberry32(seed: number): () => number {
|
|
26
|
-
let s = seed >>> 0;
|
|
27
|
-
return () => {
|
|
28
|
-
s = (s + 0x6d2b79f5) | 0;
|
|
29
|
-
let t = Math.imul(s ^ (s >>> 15), 1 | s);
|
|
30
|
-
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
31
|
-
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function randHash(rand: () => number): string {
|
|
36
|
-
let h = "";
|
|
37
|
-
for (let i = 0; i < HASH_LEN; i++) h += ALPHABET[Math.floor(rand() * ALPHABET.length)];
|
|
38
|
-
return h;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
interface Sample { prompt: string; start: string; expected: string }
|
|
42
|
-
|
|
43
|
-
/** One multi-hop instance: a length-`hops` chain padded with distractors to
|
|
44
|
-
* ~`nChars`, lines shuffled. start = h0, expected = h(hops). */
|
|
45
|
-
function makeOne(rand: () => number, hops: number, nChars: number): Sample {
|
|
46
|
-
const chain: string[] = [];
|
|
47
|
-
for (let i = 0; i <= hops; i++) chain.push(randHash(rand));
|
|
48
|
-
const lines: string[] = [];
|
|
49
|
-
for (let i = 0; i < hops; i++)
|
|
50
|
-
lines.push(i === hops - 1 ? `${chain[i]} = '${chain[i + 1]}'` : `${chain[i]} = ${chain[i + 1]}`);
|
|
51
|
-
|
|
52
|
-
let chars = lines.reduce((a, l) => a + l.length + 1, 0);
|
|
53
|
-
while (chars < nChars) {
|
|
54
|
-
const a = randHash(rand);
|
|
55
|
-
const b = randHash(rand);
|
|
56
|
-
const line = rand() < 0.5 ? `${a} = '${b}'` : `${a} = ${b}`;
|
|
57
|
-
lines.push(line);
|
|
58
|
-
chars += line.length + 1;
|
|
59
|
-
}
|
|
60
|
-
for (let i = lines.length - 1; i > 0; i--) {
|
|
61
|
-
const j = Math.floor(rand() * (i + 1));
|
|
62
|
-
[lines[i], lines[j]] = [lines[j]!, lines[i]!];
|
|
63
|
-
}
|
|
64
|
-
return { prompt: lines.join("\n"), start: chain[0]!, expected: chain[hops]! };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function buildPrompt(s: Sample): string {
|
|
68
|
-
return `${INSTR}\n\nDictionary:\n${s.prompt}\n\nStarting hash: ${s.start}\nFinal hash:`;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/** First 16-char alphabetic run in the output (port of _extract_pred). */
|
|
72
|
-
function extractPred(out: string): string {
|
|
73
|
-
const m = out.match(/[A-Za-z]{16}/);
|
|
74
|
-
return m ? m[0] : out.trim();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface HashhopResult {
|
|
78
|
-
nTotal: number;
|
|
79
|
-
nCorrect: number;
|
|
80
|
-
accuracy: number; // overall, 0..1
|
|
81
|
-
byHops: Record<number, number>;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
interface HashhopFrozen { raw_problem: string; query: string; expected: string }
|
|
85
|
-
|
|
86
|
-
export async function evaluateHashhop(
|
|
87
|
-
tm: TaskModel,
|
|
88
|
-
opts: { nPerHop?: number; hopsList?: number[]; chars?: number; maxTokens?: number; seed?: number; frozen?: boolean } = {},
|
|
89
|
-
): Promise<HashhopResult> {
|
|
90
|
-
const nPerHop = opts.nPerHop ?? 25;
|
|
91
|
-
const hopsList = opts.hopsList ?? [1, 2, 3, 4];
|
|
92
|
-
const maxTokens = opts.maxTokens ?? 32;
|
|
93
|
-
|
|
94
|
-
// Optiq-parity mode (DEFAULT): use optiq's EXACT generated problems (his
|
|
95
|
-
// MultiHopEval samples — seed 42, 25/hop × hops 1-4 = 100, emitted in hop order),
|
|
96
|
-
// fed through OUR chat template + extractor. Our generator below is a
|
|
97
|
-
// RECONSTRUCTION producing DIFFERENT problems, so it cannot reproduce optiq's
|
|
98
|
-
// number — the frozen problems are the only way to match. MLX_BUN_HASHHOP_FROZEN=0
|
|
99
|
-
// uses our generator.
|
|
100
|
-
const useFrozen = opts.frozen ?? (runtimeValue("MLX_BUN_HASHHOP_FROZEN") !== "0");
|
|
101
|
-
if (useFrozen) {
|
|
102
|
-
const rows = loadJsonl<HashhopFrozen>("hashhop_optiq_frozen");
|
|
103
|
-
const hopCorrect: Record<number, number> = {};
|
|
104
|
-
let total = 0;
|
|
105
|
-
let correct = 0;
|
|
106
|
-
for (let k = 0; k < rows.length; k++) {
|
|
107
|
-
const item = rows[k]!;
|
|
108
|
-
const hops = hopsList[Math.floor(k / nPerHop)] ?? 0; // optiq emits in hop order
|
|
109
|
-
const out = await generateText(tm, item.raw_problem, { maxTokens, useChat: true });
|
|
110
|
-
if (extractPred(out) === item.expected) { correct++; hopCorrect[hops] = (hopCorrect[hops] ?? 0) + 1; }
|
|
111
|
-
total++;
|
|
112
|
-
process.stderr.write(`\r hashhop ${k + 1}/${rows.length} acc=${(correct / (k + 1) * 100).toFixed(0)}%`);
|
|
113
|
-
}
|
|
114
|
-
process.stderr.write("\n");
|
|
115
|
-
const byHops: Record<number, number> = {};
|
|
116
|
-
for (const h of hopsList) byHops[h] = (hopCorrect[h] ?? 0) / nPerHop;
|
|
117
|
-
return { nTotal: total, nCorrect: correct, accuracy: total ? correct / total : 0, byHops };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Fallback: our own reconstructed generator (produces DIFFERENT problems).
|
|
121
|
-
const chars = opts.chars ?? 12000;
|
|
122
|
-
const rand = mulberry32(opts.seed ?? 42);
|
|
123
|
-
const byHops: Record<number, number> = {};
|
|
124
|
-
let total = 0;
|
|
125
|
-
let correct = 0;
|
|
126
|
-
for (const hops of hopsList) {
|
|
127
|
-
let hc = 0;
|
|
128
|
-
for (let k = 0; k < nPerHop; k++) {
|
|
129
|
-
const s = makeOne(rand, hops, chars);
|
|
130
|
-
const out = await generateText(tm, buildPrompt(s), { maxTokens, useChat: true });
|
|
131
|
-
if (extractPred(out) === s.expected) { hc++; correct++; }
|
|
132
|
-
total++;
|
|
133
|
-
process.stderr.write(`\r hashhop hops=${hops} ${k + 1}/${nPerHop} acc=${(hc / (k + 1) * 100).toFixed(0)}%`);
|
|
134
|
-
}
|
|
135
|
-
byHops[hops] = nPerHop ? hc / nPerHop : 0;
|
|
136
|
-
process.stderr.write("\n");
|
|
137
|
-
}
|
|
138
|
-
return { nTotal: total, nCorrect: correct, accuracy: total ? correct / total : 0, byHops };
|
|
139
|
-
}
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
// HumanEval — code-generation pass@1. Port of optiq/eval/humaneval.py:
|
|
2
|
-
// raw function-completion (or instruct code-block when a chat template
|
|
3
|
-
// exists), greedy decode, stop-sequence truncation, then execute the
|
|
4
|
-
// assembled program (prompt + completion + test + check(entry)) in a
|
|
5
|
-
// macOS sandbox-exec jail (falls back to a plain subprocess) against the
|
|
6
|
-
// oracle venv python. A problem passes iff the program exits 0 within the
|
|
7
|
-
// timeout.
|
|
8
|
-
//
|
|
9
|
-
// SECURITY: generated code is UNTRUSTED model output. It is NEVER eval'd
|
|
10
|
-
// in-process — each candidate runs as a separate, sandboxed python
|
|
11
|
-
// subprocess with a hard wall-clock timeout and a memory cap, in a fresh
|
|
12
|
-
// temp dir that is removed afterwards.
|
|
13
|
-
|
|
14
|
-
import { spawnSync } from "node:child_process";
|
|
15
|
-
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
16
|
-
import { tmpdir } from "node:os";
|
|
17
|
-
import { join } from "node:path";
|
|
18
|
-
import { generateText, loadJsonl, sampleIndices, type TaskModel } from "../runner";
|
|
19
|
-
import { runtimeValue } from "../../runtime-config";
|
|
20
|
-
|
|
21
|
-
// Oracle venv python — the same interpreter the Python reference uses.
|
|
22
|
-
// Machine-specific: overridable via MLX_BUN_ORACLE_PYTHON (the committed default is
|
|
23
|
-
// the reference box; other laptops set the env, never re-commit the path).
|
|
24
|
-
const ORACLE_PYTHON = runtimeValue("MLX_BUN_ORACLE_PYTHON") ?? "/Users/joshrossi/Code/mlx-lm/.venv/bin/python";
|
|
25
|
-
|
|
26
|
-
interface HumanevalRow {
|
|
27
|
-
task_id: string;
|
|
28
|
-
prompt: string;
|
|
29
|
-
canonical_solution: string;
|
|
30
|
-
test: string;
|
|
31
|
-
entry_point: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface HumanevalResult {
|
|
35
|
-
nPass: number;
|
|
36
|
-
nTotal: number;
|
|
37
|
-
accuracy: number; // pass@1, 0..1
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Stop sequences — mirror humaneval.py's _STOP_SEQS exactly.
|
|
41
|
-
const STOP_SEQS = ["\nclass ", "\ndef ", "\n#", "\nif __name__", "\nprint(", "\n```"];
|
|
42
|
-
|
|
43
|
-
/** Last fenced ```python|py? ... ``` block, or null (port of _extract_code_block). */
|
|
44
|
-
function extractCodeBlock(text: string): string | null {
|
|
45
|
-
const re = /```(?:python|py)?\n([\s\S]*?)\n```/g;
|
|
46
|
-
let last: string | null = null;
|
|
47
|
-
for (const m of text.matchAll(re)) last = m[1]!;
|
|
48
|
-
return last;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Escape a string for use as a literal inside a RegExp (re.escape). */
|
|
52
|
-
function reEscape(s: string): string {
|
|
53
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Strip the `def entry_point(...):` header + docstring, keep just the body
|
|
58
|
-
* (port of _strip_function_def). Falls through if no such def is found.
|
|
59
|
-
*/
|
|
60
|
-
function stripFunctionDef(body: string, entryPoint: string): string {
|
|
61
|
-
const pat = new RegExp(`def\\s+${reEscape(entryPoint)}\\s*\\([^)]*\\)[^:]*:\\s*\\n`);
|
|
62
|
-
const m = body.match(pat);
|
|
63
|
-
if (!m || m.index === undefined) return body;
|
|
64
|
-
const after = body.slice(m.index + m[0].length);
|
|
65
|
-
// Skip leading blank lines + a possible docstring.
|
|
66
|
-
let rest = after.replace(/^\n+/, "");
|
|
67
|
-
const doc = rest.match(/^\s*(["']{3})([\s\S]*?)\1\s*\n/);
|
|
68
|
-
if (doc) rest = rest.slice(doc[0].length);
|
|
69
|
-
return rest;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Reduce the model response to a function body suitable for concatenating
|
|
74
|
-
* onto the HumanEval prompt (port of _truncate_completion).
|
|
75
|
-
*/
|
|
76
|
-
export function truncateCompletion(text: string, entryPoint = ""): string {
|
|
77
|
-
let out = text;
|
|
78
|
-
if (out.includes("</think>")) out = out.split("</think>").slice(1).join("</think>");
|
|
79
|
-
if (out.includes("<channel|>")) out = out.split("<channel|>").slice(1).join("<channel|>");
|
|
80
|
-
|
|
81
|
-
// Prefer the last fenced code block (conversational models).
|
|
82
|
-
const block = extractCodeBlock(out);
|
|
83
|
-
if (block !== null) {
|
|
84
|
-
return entryPoint ? stripFunctionDef(block, entryPoint) : block;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Legacy / completion-mode path: strip a leading fence, then cut at the
|
|
88
|
-
// first stop sequence.
|
|
89
|
-
out = out.replace(/^\s+/, "");
|
|
90
|
-
if (out.startsWith("```python\n")) out = out.slice("```python\n".length);
|
|
91
|
-
else if (out.startsWith("```\n")) out = out.slice("```\n".length);
|
|
92
|
-
|
|
93
|
-
let earliest = out.length;
|
|
94
|
-
for (const stop of STOP_SEQS) {
|
|
95
|
-
const i = out.indexOf(stop);
|
|
96
|
-
if (i !== -1 && i < earliest) earliest = i;
|
|
97
|
-
}
|
|
98
|
-
return out.slice(0, earliest);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** Concatenate prompt + completion + test driver (port of _build_program). */
|
|
102
|
-
function buildProgram(prompt: string, completion: string, test: string, entryPoint: string): string {
|
|
103
|
-
return prompt + completion + "\n\n" + test + "\n\n" + `check(${entryPoint})\n`;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// sandbox-exec SBPL profile (port of _SBPL_PROFILE): deny network, deny
|
|
107
|
-
// most filesystem writes except the temp dir; reads stay open so python
|
|
108
|
-
// can find its stdlib.
|
|
109
|
-
const SBPL_PROFILE = (tmp: string) => `(version 1)
|
|
110
|
-
(deny default)
|
|
111
|
-
(allow process-fork)
|
|
112
|
-
(allow process-exec)
|
|
113
|
-
(allow file-read*)
|
|
114
|
-
(allow file-write* (subpath "${tmp}"))
|
|
115
|
-
(allow file-write-data
|
|
116
|
-
(literal "/dev/null")
|
|
117
|
-
(literal "/dev/dtracehelper"))
|
|
118
|
-
(allow sysctl-read)
|
|
119
|
-
(allow mach-lookup)
|
|
120
|
-
(allow ipc-posix-shm)
|
|
121
|
-
`;
|
|
122
|
-
|
|
123
|
-
// rlimit + no-socket preamble prepended to the script (port of the
|
|
124
|
-
// sandbox-exec preamble). Caps address space / data segment and disables
|
|
125
|
-
// raw socket creation so a buggy program can't exhaust RAM or hit the net.
|
|
126
|
-
const preamble = (memoryMb: number) => `import resource
|
|
127
|
-
try:
|
|
128
|
-
resource.setrlimit(resource.RLIMIT_AS, (${memoryMb} * 1024 * 1024,) * 2)
|
|
129
|
-
except (ValueError, OSError):
|
|
130
|
-
pass
|
|
131
|
-
try:
|
|
132
|
-
resource.setrlimit(resource.RLIMIT_DATA, (${memoryMb} * 1024 * 1024,) * 2)
|
|
133
|
-
except (ValueError, OSError):
|
|
134
|
-
pass
|
|
135
|
-
import socket as _s
|
|
136
|
-
_orig_socket = _s.socket
|
|
137
|
-
def _no_socket(*a, **k):
|
|
138
|
-
raise OSError("network access disabled in sandbox")
|
|
139
|
-
_s.socket = _no_socket
|
|
140
|
-
`;
|
|
141
|
-
|
|
142
|
-
const HAS_SANDBOX_EXEC = (() => {
|
|
143
|
-
try {
|
|
144
|
-
return spawnSync("which", ["sandbox-exec"]).status === 0;
|
|
145
|
-
} catch {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
})();
|
|
149
|
-
|
|
150
|
-
interface RunResult { ok: boolean; timedOut: boolean; stderr?: string }
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Run `program` as a python script in a fresh temp dir, sandboxed if
|
|
154
|
-
* sandbox-exec is available (else a plain rlimit-capped subprocess), with
|
|
155
|
-
* a hard wall-clock timeout. Returns whether it exited 0 (pass). The code
|
|
156
|
-
* is NEVER eval'd in-process — always a separate subprocess.
|
|
157
|
-
*/
|
|
158
|
-
function runProgram(program: string, timeoutSec: number, memoryMb: number): RunResult {
|
|
159
|
-
const sbRoot = mkdtempSync(join(tmpdir(), "mlxbun_he_"));
|
|
160
|
-
try {
|
|
161
|
-
const scriptPath = join(sbRoot, "script.py");
|
|
162
|
-
writeFileSync(scriptPath, preamble(memoryMb) + "\n" + program);
|
|
163
|
-
|
|
164
|
-
const env = {
|
|
165
|
-
PATH: "/usr/bin:/bin",
|
|
166
|
-
PYTHONIOENCODING: "utf-8",
|
|
167
|
-
HOME: sbRoot,
|
|
168
|
-
TMPDIR: sbRoot,
|
|
169
|
-
MPLBACKEND: "Agg",
|
|
170
|
-
MPLCONFIGDIR: sbRoot,
|
|
171
|
-
XDG_CACHE_HOME: sbRoot,
|
|
172
|
-
XDG_CONFIG_HOME: sbRoot,
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
let argv: string[];
|
|
176
|
-
if (HAS_SANDBOX_EXEC) {
|
|
177
|
-
const profilePath = join(sbRoot, "policy.sb");
|
|
178
|
-
writeFileSync(profilePath, SBPL_PROFILE(sbRoot));
|
|
179
|
-
argv = ["sandbox-exec", "-f", profilePath, ORACLE_PYTHON, "-I", scriptPath];
|
|
180
|
-
} else {
|
|
181
|
-
argv = [ORACLE_PYTHON, "-I", scriptPath];
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const res = spawnSync(argv[0]!, argv.slice(1), {
|
|
185
|
-
cwd: sbRoot,
|
|
186
|
-
env,
|
|
187
|
-
timeout: timeoutSec * 1000, // hard wall-clock kill
|
|
188
|
-
killSignal: "SIGKILL",
|
|
189
|
-
stdio: ["ignore", "ignore", runtimeValue("MLX_BUN_EVAL_DEBUG") === "1" ? "pipe" : "ignore"],
|
|
190
|
-
encoding: "utf8",
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// spawnSync sets signal === "SIGKILL" (and status === null) when the
|
|
194
|
-
// timeout fires; ETIMEDOUT shows up in res.error on some platforms.
|
|
195
|
-
const timedOut =
|
|
196
|
-
res.signal === "SIGKILL" ||
|
|
197
|
-
(res.error as NodeJS.ErrnoException | undefined)?.code === "ETIMEDOUT";
|
|
198
|
-
const ok = !timedOut && res.status === 0;
|
|
199
|
-
return { ok, timedOut, stderr: typeof res.stderr === "string" ? res.stderr : undefined };
|
|
200
|
-
} finally {
|
|
201
|
-
rmSync(sbRoot, { recursive: true, force: true });
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export async function evaluateHumaneval(
|
|
206
|
-
tm: TaskModel,
|
|
207
|
-
opts: {
|
|
208
|
-
nSamples?: number;
|
|
209
|
-
maxTokens?: number;
|
|
210
|
-
seed?: number;
|
|
211
|
-
timeoutSec?: number;
|
|
212
|
-
memoryMb?: number;
|
|
213
|
-
frozen?: boolean;
|
|
214
|
-
} = {},
|
|
215
|
-
): Promise<HumanevalResult> {
|
|
216
|
-
const maxTokens = opts.maxTokens ?? 512;
|
|
217
|
-
const timeoutSec = opts.timeoutSec ?? 10;
|
|
218
|
-
const memoryMb = opts.memoryMb ?? 512;
|
|
219
|
-
|
|
220
|
-
// Optiq-parity mode (DEFAULT): optiq's EXACT 164-problem set (he runs the full
|
|
221
|
-
// HumanEval test split), scored through OUR pipeline. MLX_BUN_HUMANEVAL_FROZEN=0
|
|
222
|
-
// reverts to our own copy + optional sampling.
|
|
223
|
-
const useFrozen = opts.frozen ?? (runtimeValue("MLX_BUN_HUMANEVAL_FROZEN") !== "0");
|
|
224
|
-
const rows = loadJsonl<HumanevalRow>(useFrozen ? "humaneval_optiq_frozen" : "humaneval");
|
|
225
|
-
const idx = useFrozen
|
|
226
|
-
? Array.from({ length: rows.length }, (_, i) => i)
|
|
227
|
-
: sampleIndices(rows.length, opts.nSamples ?? rows.length, opts.seed ?? 42);
|
|
228
|
-
|
|
229
|
-
// When a chat template exists, ask the model (instruct-style) for the
|
|
230
|
-
// complete function inside a ```python block — humaneval.py's use_chat
|
|
231
|
-
// path. Otherwise feed the raw signature for completion.
|
|
232
|
-
const useChat = tm.template !== null;
|
|
233
|
-
|
|
234
|
-
let nPass = 0;
|
|
235
|
-
for (let k = 0; k < idx.length; k++) {
|
|
236
|
-
const ex = rows[idx[k]!]!;
|
|
237
|
-
|
|
238
|
-
let body: string;
|
|
239
|
-
if (useChat) {
|
|
240
|
-
body =
|
|
241
|
-
"Complete the following Python function. Output the " +
|
|
242
|
-
"complete function (header, docstring, body) inside a " +
|
|
243
|
-
"single ```python ... ``` code block. No commentary " +
|
|
244
|
-
"outside the code block.\n\n" +
|
|
245
|
-
"```python\n" + ex.prompt + "```";
|
|
246
|
-
} else {
|
|
247
|
-
body = ex.prompt;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const raw = await generateText(tm, body, { maxTokens, useChat });
|
|
251
|
-
const completion = truncateCompletion(raw, ex.entry_point);
|
|
252
|
-
const program = buildProgram(ex.prompt, completion, ex.test, ex.entry_point);
|
|
253
|
-
|
|
254
|
-
const rr = runProgram(program, timeoutSec, memoryMb);
|
|
255
|
-
if (rr.ok) nPass++;
|
|
256
|
-
else if (runtimeValue("MLX_BUN_EVAL_DEBUG") === "1") {
|
|
257
|
-
const err = rr.stderr ?? "";
|
|
258
|
-
const reason = rr.timedOut ? "TIMEOUT"
|
|
259
|
-
: completion.trim() === "" ? "EMPTY"
|
|
260
|
-
: /SyntaxError|IndentationError/.test(err) ? "SYNTAX"
|
|
261
|
-
: /AssertionError/.test(err) ? "WRONG-ANSWER"
|
|
262
|
-
: /Error|Exception|Traceback/.test(err) ? "RUNTIME-ERR"
|
|
263
|
-
: "OTHER";
|
|
264
|
-
const errSnip = err.trim().split("\n").slice(-1)[0]?.slice(0, 120) ?? "";
|
|
265
|
-
process.stderr.write(`\n [FAIL ${ex.entry_point}] ${reason} complen=${completion.length} :: ${errSnip}\n`);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
if ((k + 1) % 5 === 0 || k + 1 === idx.length)
|
|
269
|
-
process.stderr.write(
|
|
270
|
-
`\r humaneval ${k + 1}/${idx.length} pass@1=${((nPass / (k + 1)) * 100).toFixed(1)}%`,
|
|
271
|
-
);
|
|
272
|
-
}
|
|
273
|
-
process.stderr.write("\n");
|
|
274
|
-
return { nPass, nTotal: idx.length, accuracy: idx.length ? nPass / idx.length : 0 };
|
|
275
|
-
}
|