hypernix 0.72.4__tar.gz → 0.72.4.post3__tar.gz
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.
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/ci.yml +101 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/PKG-INFO +2 -2
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/README.md +1 -1
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/pyproject.toml +1 -1
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/setup.cfg +1 -1
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/__init__.py +1 -1
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix.egg-info/SOURCES.txt +1 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ggml_hnx.py +180 -2
- hypernix-0.72.4.post3/tests/test_studio_local.py +253 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Changelog.md +159 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Release-Timeline.md +32 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/build.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/codacy.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/codeql.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/deploy-docs.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/ios.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/public-release.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/release.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/update-json-stats.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/update-readme.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/LICENSE +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/MANIFEST.in +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/banner-hero.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd-removebg-preview.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/apple-touch-icon.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/favicon-16.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/favicon-32.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/favicon-48.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-favicon.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-dark.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-mono.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-ondark.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-white.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-lockup-dark.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-lockup-light.svg +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/icon-192.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/icon-512.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo1.png +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/_hypernix_python.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hyped+ +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hyped-pro +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hyped-pro-gui +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hypernix-t1 +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/curriculum_eval_v0_70_4.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/custom_arch.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hypernix_run.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hyprslug-headers/README.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hyprslug-headers/serve.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hyprslug-headers/wrap-for-lmstudio.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/quickstart.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/resilient_finetune_v0_70_4.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/run_hypernix.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/.env.example +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/API-EXAMPLES.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/Dockerfile +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/README.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/config/.gitkeep +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/docker-compose.yml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/hypernix-t1api.service +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/nginx.conf +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/openapi.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/run_local.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/run_tailscale.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/train hypernix 1 5 gtx1080.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/train_hypernix_0_1_5_evaluator.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/train_hypernix_1_5_gtx1080.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/README.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/dracula.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/gruvbox-dark.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/hypernix.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/mono.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/monokai.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/nord.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/tokyo-night.theme +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/upload_to_hub.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/install-t1.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/pytest.ini +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/ruff.toml +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/README.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/apply_hypernix_fixes.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix-B +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix-E +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix-F +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix_scope.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/benchmark_v5.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/benchmark_v5s.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/benchmark_v6.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/ci/fake_model_server.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/ci/integration_probe.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/ci/wait_for_http.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/install_deps.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/install_macos_legacy.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/measure_optimizer_memory.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/quantize_i7_7660u.sh +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/t1api_examples.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/update_json_stats.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/setup.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/__main__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/audiofile.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/features.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/wakeup.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/wakeup_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/bridge/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/bridge/lmstudio.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/cookbook.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/countertop.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/flour.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/injection.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/menu.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/blender.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/cardboard_box.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/cutting_board.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/food_processor.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/gather.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/gather_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/lunchbox.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/mediocre_fridge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/pans.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/pepper_shaker.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/qa.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/salt_shaker.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/scavenger.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/sink.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/strainer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/toaster.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/tupperware.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/espresso_maker.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/industrial_range.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/new_fridge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/new_range.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/old_range.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/vera.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyped_pro.js +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/discovery.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/files.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/hfdownload.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/hfmerge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/identity.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/pairing.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/peers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/sessions.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/assistant.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_bridge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_core.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_gui.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_tools.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/agent.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/hpo.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/providers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/swarm.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/tools.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/validate.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/version_launcher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/websearch.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/wiki_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/arch.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/brewer_adapter.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/download.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/generate.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/ggufrun.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxdevice.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxrun.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxtokenizer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxtorch.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/microwave.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/multilama.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/nano_nano.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/neo_oven.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/old_oven.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/stml.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/whisk.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/workshop.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/cctvtop.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/hyper_log.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/livestream.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/map.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/plasma.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/table.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/thermometer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tv.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tvtop.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tvtop_plus_plus.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tvtoppro.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/optimizer_framework.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v3.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v4.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v5.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v5s.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v6.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v6v.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/sixbit.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/package-lock.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/package.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/py.typed +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/convert.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/dflash2.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/dflash2_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/fetcher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/formats.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/gguf.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_headers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_headers_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_server.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/imatrix.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/imatrix_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/llamaquants.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/lowbit.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/quantize.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/steamroller.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/steamroller_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/subbit.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/upload.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/app.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/params.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/templates.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/theme.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/widgets.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/gatekeeper.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/gkey_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/keyconfig.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/keymaster.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/keyversions.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/t2keys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/compactor.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/config.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/deps.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/dishwasher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/doctor.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/ethanol.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/freezer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/fusebox.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/fusebox_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/gpus.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/launcher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/net.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/nettrust.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/old_fridge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/outage.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/pascal.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/pathfix.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/protect.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/release.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/torch_compat.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/ups.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/utils.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/vram.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/app.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/audit.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/auth.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/authhistory.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/backup.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/billing.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/billingkeys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/bootstrap.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/config.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/cost.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/data/model_registry.example.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/data/routing_policies.example.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/db.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/deploy.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/deps.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/errors.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/events.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/jobs.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/keys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/launchscript_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/modelindex.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/modelindex_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/modules.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/mtls.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/netpolicy.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/ratelimit.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/registry.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/audit.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/auth.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/authundo.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/backup.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/billing.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/bridge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/config.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/events.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/health.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/hyperlink.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/inference.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/jobs.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/keys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/models.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/modules.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/security.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/servers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/training.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/usage.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routing.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/schemas.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/security.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/servers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/storage.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/training_cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/transport.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/usage.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/version.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/client.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/errors.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/models.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/transport.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/bell.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/coffee_maker.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/smoke_alarm.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/spinner.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/timer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/abbicus.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/apron.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/brewer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/cake_pan.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/camouflage.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/compute_framework.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/deep_fryer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/fizzle.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/instant_pot.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/lazy_suzan.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/monitor.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/mtp.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/recipe_book.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/smoker.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/train.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/tsconfig.json +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/__init__.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/cli.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/client.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/diagnose.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/discovery.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/local_config.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/smoke.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/tui.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/shell_support.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_alarms_and_presets.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_arch_mapping.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_assistant.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_autofix_scripts.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_billing_keys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_bootstrap_key.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_brewer_adapter.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ci_integration_jobs.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_cli_integration.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_cli_json_output.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_coverage_beef.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_deps_and_windows.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_dflash2.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ethanol.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_fetcher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_freezer.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_fridges.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_fusebox.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gather.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gguf_inference.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gkey_key_versions.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gpu_migration.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gpus.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hnx_device_placement.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hnx_devices.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hnxrun.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyped_pro_bridge_cancel.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyped_pro_t1api.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyperlink_discovery.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyperlink_reachability.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hypernix_t1_service.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyprslug_field_reports.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyprslug_headers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyprslug_recipes.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_imatrix.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_inference_endpoints.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_install_pin.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_install_script.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ios_appicon.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ios_version_wiring.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_kitchen_v044.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_kitchen_v045.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_launch_script.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_lazy_suzan.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_lint_regressions.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_llama_quants.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_low_bit_types.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_lunchbox.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_map.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_model_registry_discovery.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_module_layout.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_neo_oven.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_neo_oven_generation.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_nettrust.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_new_archs_v035.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_nix_fallback.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_old_oven.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pathfix.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pressure_cooker_v048.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pressure_cooker_v3.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pressure_cooker_v6.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_quantize_v0703.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ranges.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_shakers_and_torchcompat.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_snapshot_roundtrip.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_sspkid_and_key_config.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_studio_core.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_subbit_quantization.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_model_index.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_v1_0_26_8_1_1.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_v1_0_26_core.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_v1_0_26_http.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_auth.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta3_core.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta3_http.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta3_security.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta4_usage_report.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_billing.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_core.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_events.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_example_scripts.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_http.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_http_beta2.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_jobs.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_modules.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_routing.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_security.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_servers.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t2s_errors.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tool_consent_gate.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_training_admin.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_trusted_network.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tupperware.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tvtop_plus_plus_comprehensive.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tvtoppro.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ups.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v031_chat_and_archs.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v047_deep_fryer_cake_pan_presets.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v050.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051_1.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051_3.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051_4.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v052_5.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v052_6.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v060.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v061_1.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v061_2.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v061_b1.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0703_additional.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704_features.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704_tvtop_plus_plus.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704b11_features.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704b12_cctvtop.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0705_all.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0710_gatekeeper_keymaster.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0711_border_fix.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0712_hyped_countertop.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_config_provider_keys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_cpu_presets.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_bridge.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_core.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_launcher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_tools.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_multilama.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0721_api_waiter.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0721_modules.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0721_t2_keys.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_vera.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_version_launcher.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_vram_optimizations.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_waiter.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_waiter_diagnose.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_wakeup.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_website_mobile.py +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Abbicus.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Alarms.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Apron.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Architectures.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Bell.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Blender.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CLI.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CakePan.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Camouflage.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CoffeeMaker.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Convert.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Cookbook.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Countertop.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CuttingBoard.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Dashboards.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/DeepFryer.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Devices.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Dflash2.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Download.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/EspressoMaker.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Flour.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/FoodProcessor.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Frameworks.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Freezer.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Fridges.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/FuseBox.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Gather.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HnxRun.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Home.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HuggingFace-Models.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HyperLog.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HyprSlug-Headers.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HyprSlug.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Imatrix.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Kitchen.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/LowBit.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Lunchbox.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/MTP.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Menu.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Microwave.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/ModelIndex.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Optimizers.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Ovens.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pans.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pascal.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/PipelineMechanics.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V3.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V4.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V5.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V6.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Quantization.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Ranges.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/RecipeBook.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Roadmap.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/STML.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Scavenger.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Shakers.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Smoker.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/T1-API-Security-Checklist.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/T1-API.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Toaster.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Training.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Tupperware.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/TvTopPro.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/VRAM.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Vera.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Waiter-TUI.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/WakeUp.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Whisk.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Workshop.md +0 -0
- {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/macOS-legacy.md +0 -0
|
@@ -395,6 +395,107 @@ jobs:
|
|
|
395
395
|
exit 1
|
|
396
396
|
fi
|
|
397
397
|
|
|
398
|
+
# The patcher against a real llama.cpp, which is the only thing that
|
|
399
|
+
# would have caught what shipped broken: the fake tree in
|
|
400
|
+
# tests/test_ggml_hnx.py modelled one type_traits table, upstream has
|
|
401
|
+
# had two for a while, and every test passed while no real checkout
|
|
402
|
+
# compiled. A fake can only be as right as the person who wrote it.
|
|
403
|
+
#
|
|
404
|
+
# Separate job, and only ggml-base + ggml-cpu rather than all of
|
|
405
|
+
# llama.cpp: those two are where the registration lands, so they are
|
|
406
|
+
# where a bad patch fails, and stopping there is about two minutes
|
|
407
|
+
# instead of eight.
|
|
408
|
+
llamacpp:
|
|
409
|
+
name: patcher against real llama.cpp
|
|
410
|
+
needs: triage
|
|
411
|
+
if: needs.triage.outputs.narrow != 'true'
|
|
412
|
+
runs-on: ubuntu-latest
|
|
413
|
+
steps:
|
|
414
|
+
- uses: actions/checkout@v4
|
|
415
|
+
- uses: actions/setup-python@v5
|
|
416
|
+
with:
|
|
417
|
+
python-version: "3.12"
|
|
418
|
+
|
|
419
|
+
- name: Clone llama.cpp
|
|
420
|
+
run: git clone --depth 1 https://github.com/ggml-org/llama.cpp /tmp/llama.cpp
|
|
421
|
+
|
|
422
|
+
- name: Patch it
|
|
423
|
+
run: |
|
|
424
|
+
set -euo pipefail
|
|
425
|
+
python native/ggml-hnx/tools/patch_llamacpp.py /tmp/llama.cpp --check
|
|
426
|
+
python native/ggml-hnx/tools/patch_llamacpp.py /tmp/llama.cpp
|
|
427
|
+
|
|
428
|
+
- name: Build the parts the registration lands in
|
|
429
|
+
run: |
|
|
430
|
+
set -euo pipefail
|
|
431
|
+
cmake -S /tmp/llama.cpp -B /tmp/llama.cpp/build \
|
|
432
|
+
-DCMAKE_BUILD_TYPE=Release -DLLAMA_CURL=OFF -DGGML_CCACHE=OFF \
|
|
433
|
+
-DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_EXAMPLES=OFF \
|
|
434
|
+
-DLLAMA_BUILD_TOOLS=OFF
|
|
435
|
+
cmake --build /tmp/llama.cpp/build --target ggml-base ggml-cpu \
|
|
436
|
+
-j"$(nproc)"
|
|
437
|
+
|
|
438
|
+
# Compiling is not the same as registering. This asks the built
|
|
439
|
+
# ggml what it thinks the five types are, which is what a model
|
|
440
|
+
# loader will ask.
|
|
441
|
+
- name: Ask ggml about the types
|
|
442
|
+
run: |
|
|
443
|
+
set -euo pipefail
|
|
444
|
+
cat > /tmp/typecheck.c <<'EOF'
|
|
445
|
+
#include <stdio.h>
|
|
446
|
+
#include <string.h>
|
|
447
|
+
#include "ggml.h"
|
|
448
|
+
int main(void) {
|
|
449
|
+
struct { int id; const char *name; size_t size; } want[] = {
|
|
450
|
+
{200, "IQ0.9_L", 30}, {201, "IQ0.75_M", 26},
|
|
451
|
+
{202, "IQ0.5_XXXL", 18}, {203, "IQ0.25_UXL", 8},
|
|
452
|
+
{204, "INT1", 34},
|
|
453
|
+
};
|
|
454
|
+
int bad = 0;
|
|
455
|
+
for (unsigned i = 0; i < sizeof(want)/sizeof(want[0]); ++i) {
|
|
456
|
+
enum ggml_type t = (enum ggml_type) want[i].id;
|
|
457
|
+
const char *n = ggml_type_name(t);
|
|
458
|
+
int ok = n && !strcmp(n, want[i].name)
|
|
459
|
+
&& ggml_type_size(t) == want[i].size
|
|
460
|
+
&& ggml_blck_size(t) == 256 && ggml_is_quantized(t);
|
|
461
|
+
printf(" %-3d %-12s %s\n", want[i].id, n ? n : "(null)",
|
|
462
|
+
ok ? "ok" : "MISMATCH");
|
|
463
|
+
if (!ok) bad = 1;
|
|
464
|
+
}
|
|
465
|
+
if (strcmp(ggml_type_name(GGML_TYPE_Q4_0), "q4_0") != 0) {
|
|
466
|
+
printf(" upstream Q4_0 was disturbed\n");
|
|
467
|
+
bad = 1;
|
|
468
|
+
}
|
|
469
|
+
return bad;
|
|
470
|
+
}
|
|
471
|
+
EOF
|
|
472
|
+
cc -I/tmp/llama.cpp/ggml/include -o /tmp/typecheck /tmp/typecheck.c \
|
|
473
|
+
-L/tmp/llama.cpp/build/bin -lggml-base \
|
|
474
|
+
-Wl,-rpath,/tmp/llama.cpp/build/bin
|
|
475
|
+
/tmp/typecheck
|
|
476
|
+
|
|
477
|
+
# Studio's local engine, against the llama.cpp that is now here.
|
|
478
|
+
# The stub build is covered by ctest in the `native` job; this is
|
|
479
|
+
# the other configuration, and it is the one with a real API to
|
|
480
|
+
# drift against.
|
|
481
|
+
- name: Studio — compile the local engine against it
|
|
482
|
+
run: |
|
|
483
|
+
set -euo pipefail
|
|
484
|
+
c++ -std=c++17 -Wall -Wextra -Werror -DHNX_STUDIO_LOCAL_LLAMA \
|
|
485
|
+
-Idesktop/src -I/tmp/llama.cpp/include -I/tmp/llama.cpp/ggml/include \
|
|
486
|
+
-c desktop/src/LocalEngine.cpp -o /tmp/LocalEngine.o
|
|
487
|
+
|
|
488
|
+
- name: And revert cleanly
|
|
489
|
+
run: |
|
|
490
|
+
set -euo pipefail
|
|
491
|
+
python native/ggml-hnx/tools/patch_llamacpp.py /tmp/llama.cpp --revert
|
|
492
|
+
cd /tmp/llama.cpp
|
|
493
|
+
if [ -n "$(git status --porcelain)" ]; then
|
|
494
|
+
echo "::error::--revert did not restore the tree"
|
|
495
|
+
git status --porcelain
|
|
496
|
+
exit 1
|
|
497
|
+
fi
|
|
498
|
+
|
|
398
499
|
# The CUDA kernels, compiled. Separate from `native` on purpose: the
|
|
399
500
|
# toolkit is ~2 GB and `native` runs on every full pass, so folding it
|
|
400
501
|
# in would add minutes to every run for a file that changes rarely.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hypernix
|
|
3
|
-
Version: 0.72.4
|
|
3
|
+
Version: 0.72.4.post3
|
|
4
4
|
Summary: Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M).
|
|
5
5
|
Home-page: https://github.com/trail-b1az3r/hypernix-pip
|
|
6
6
|
Author: HyperNix contributors
|
|
@@ -78,7 +78,7 @@ Dynamic: license-file
|
|
|
78
78
|
</p>
|
|
79
79
|
|
|
80
80
|
<p align="center">
|
|
81
|
-
<img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.
|
|
81
|
+
<img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.4.post1-ff2d55?style=for-the-badge&logo=pypi&logoColor=white" />
|
|
82
82
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10--3.14-00c9ff?style=for-the-badge&logo=python&logoColor=white" />
|
|
83
83
|
<img alt="License" src="https://img.shields.io/badge/License-HOS%20/%20LLU-00c853?style=for-the-badge" />
|
|
84
84
|
</p>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
</p>
|
|
5
5
|
|
|
6
6
|
<p align="center">
|
|
7
|
-
<img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.
|
|
7
|
+
<img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.4.post1-ff2d55?style=for-the-badge&logo=pypi&logoColor=white" />
|
|
8
8
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10--3.14-00c9ff?style=for-the-badge&logo=python&logoColor=white" />
|
|
9
9
|
<img alt="License" src="https://img.shields.io/badge/License-HOS%20/%20LLU-00c853?style=for-the-badge" />
|
|
10
10
|
</p>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "hypernix"
|
|
7
|
-
version = "0.72.4"
|
|
7
|
+
version = "0.72.4.post3"
|
|
8
8
|
description = "Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M)."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = { text = "HOL-1.0" }
|
|
@@ -426,6 +426,7 @@ tests/test_shakers_and_torchcompat.py
|
|
|
426
426
|
tests/test_snapshot_roundtrip.py
|
|
427
427
|
tests/test_sspkid_and_key_config.py
|
|
428
428
|
tests/test_studio_core.py
|
|
429
|
+
tests/test_studio_local.py
|
|
429
430
|
tests/test_subbit_quantization.py
|
|
430
431
|
tests/test_t1_model_index.py
|
|
431
432
|
tests/test_t1_v1_0_26_8_1_1.py
|
|
@@ -210,16 +210,33 @@ def _fake_llamacpp(root: Path) -> Path:
|
|
|
210
210
|
Deliberately not a real clone: the point is to test the patcher's
|
|
211
211
|
edits, and a 200 MB download to do that would mean this test only
|
|
212
212
|
ever ran somewhere with a network.
|
|
213
|
+
|
|
214
|
+
It has to be shaped like the *current* upstream, though, and the
|
|
215
|
+
first version of it was not. It modelled one ``type_traits`` table
|
|
216
|
+
holding every field, which is how ggml looked once and has not
|
|
217
|
+
looked for a while: upstream split it, leaving the format
|
|
218
|
+
description (``type_name``, ``blck_size``, ``to_float``) in
|
|
219
|
+
``ggml.c`` and moving everything the CPU computes with
|
|
220
|
+
(``from_float``, ``vec_dot``, ``vec_dot_type``, ``nrows``) into
|
|
221
|
+
``ggml_type_traits_cpu`` in ``ggml-cpu/ggml-cpu.c``. A fake with one
|
|
222
|
+
table let the patcher write ``.vec_dot`` into ``ggml.c`` and every
|
|
223
|
+
test here pass, while a real build failed with "no member named
|
|
224
|
+
vec_dot" and "ggml_vec_dot_t undeclared".
|
|
225
|
+
|
|
226
|
+
``GGML_TYPE_COUNT`` is likewise a literal here, because it is one
|
|
227
|
+
upstream -- not a value that falls out of the enum's length. Adding
|
|
228
|
+
members before it does not grow it, so the patcher has to rewrite
|
|
229
|
+
it, and a fake that let it grow on its own would hide that.
|
|
213
230
|
"""
|
|
214
231
|
(root / "ggml" / "include").mkdir(parents=True)
|
|
215
|
-
(root / "ggml" / "src").mkdir(parents=True)
|
|
232
|
+
(root / "ggml" / "src" / "ggml-cpu").mkdir(parents=True)
|
|
216
233
|
(root / "src").mkdir(parents=True)
|
|
217
234
|
|
|
218
235
|
(root / "ggml" / "include" / "ggml.h").write_text(
|
|
219
236
|
"enum ggml_type {\n"
|
|
220
237
|
" GGML_TYPE_F32 = 0,\n"
|
|
221
238
|
" GGML_TYPE_Q4_0 = 2,\n"
|
|
222
|
-
" GGML_TYPE_COUNT
|
|
239
|
+
" GGML_TYPE_COUNT = 43,\n"
|
|
223
240
|
"};\n",
|
|
224
241
|
encoding="utf-8",
|
|
225
242
|
)
|
|
@@ -231,12 +248,32 @@ def _fake_llamacpp(root: Path) -> Path:
|
|
|
231
248
|
"};\n",
|
|
232
249
|
encoding="utf-8",
|
|
233
250
|
)
|
|
251
|
+
(root / "ggml" / "src" / "ggml-cpu" / "ggml-cpu.c").write_text(
|
|
252
|
+
'#include "ggml-impl.h"\n'
|
|
253
|
+
"\n"
|
|
254
|
+
"static const struct ggml_type_traits_cpu "
|
|
255
|
+
"type_traits_cpu[GGML_TYPE_COUNT] = {\n"
|
|
256
|
+
" [GGML_TYPE_F32] = { .vec_dot_type = GGML_TYPE_F32 },\n"
|
|
257
|
+
"};\n",
|
|
258
|
+
encoding="utf-8",
|
|
259
|
+
)
|
|
234
260
|
(root / "ggml" / "src" / "CMakeLists.txt").write_text(
|
|
235
261
|
"add_library(ggml\n ggml.c\n ggml-alloc.c\n)\n", encoding="utf-8"
|
|
236
262
|
)
|
|
237
263
|
return root
|
|
238
264
|
|
|
239
265
|
|
|
266
|
+
def _patcher():
|
|
267
|
+
"""The patcher module, imported from tools/ without installing it."""
|
|
268
|
+
sys.path.insert(0, str(TOOLS))
|
|
269
|
+
try:
|
|
270
|
+
import patch_llamacpp
|
|
271
|
+
|
|
272
|
+
return patch_llamacpp
|
|
273
|
+
finally:
|
|
274
|
+
sys.path.pop(0)
|
|
275
|
+
|
|
276
|
+
|
|
240
277
|
class TestThePatcher:
|
|
241
278
|
def test_check_reports_a_clean_tree_as_ready(self, tmp_path, capsys):
|
|
242
279
|
sys.path.insert(0, str(TOOLS))
|
|
@@ -283,6 +320,88 @@ class TestThePatcher:
|
|
|
283
320
|
after = (root / "ggml" / "src" / "ggml.c").read_text(encoding="utf-8")
|
|
284
321
|
assert after == before
|
|
285
322
|
|
|
323
|
+
def test_the_type_count_is_raised_past_the_new_ids(self, tmp_path):
|
|
324
|
+
"""The bug that made a real build fail while every test passed.
|
|
325
|
+
|
|
326
|
+
Upstream pins ``GGML_TYPE_COUNT`` to a literal instead of letting
|
|
327
|
+
it fall out of the enum, and it sizes both trait tables. Insert
|
|
328
|
+
ids at 200 without raising it and ``[GGML_TYPE_HNX_IQ0_9]`` is
|
|
329
|
+
initialising element 200 of a 43-element array -- "array index in
|
|
330
|
+
initializer exceeds array bounds", before the compiler even gets
|
|
331
|
+
to the interesting error.
|
|
332
|
+
"""
|
|
333
|
+
patcher = _patcher()
|
|
334
|
+
root = _fake_llamacpp(tmp_path / "llama.cpp")
|
|
335
|
+
assert patcher.main([str(root)]) == 0
|
|
336
|
+
|
|
337
|
+
header = (root / "ggml" / "include" / "ggml.h").read_text(encoding="utf-8")
|
|
338
|
+
# The declaring line, not the "was:" comment that records the
|
|
339
|
+
# old one -- a plain search finds the comment first, which is
|
|
340
|
+
# how the first version of this test managed to fail on a
|
|
341
|
+
# correctly patched tree.
|
|
342
|
+
declarations = [
|
|
343
|
+
line for line in header.splitlines()
|
|
344
|
+
if "GGML_TYPE_COUNT" in line and not line.lstrip().startswith("//")
|
|
345
|
+
]
|
|
346
|
+
|
|
347
|
+
assert len(declarations) == 1, declarations
|
|
348
|
+
count = re.search(r"GGML_TYPE_COUNT\s*=\s*(\d+)", declarations[0])
|
|
349
|
+
assert count is not None
|
|
350
|
+
assert int(count.group(1)) == patcher.HNX_TYPE_COUNT
|
|
351
|
+
assert int(count.group(1)) > 204, "the highest HyperNix id"
|
|
352
|
+
|
|
353
|
+
def test_vec_dot_goes_in_the_cpu_table_not_the_format_one(self, tmp_path):
|
|
354
|
+
"""The other half of the same failure.
|
|
355
|
+
|
|
356
|
+
``ggml_type_traits`` in ggml.c has no ``vec_dot`` member and
|
|
357
|
+
cannot see ``ggml_vec_dot_t`` at all -- both moved to
|
|
358
|
+
``ggml_type_traits_cpu`` in ggml-cpu/ggml-cpu.c. Writing them
|
|
359
|
+
into the wrong table is not a warning, it is four errors per
|
|
360
|
+
type.
|
|
361
|
+
"""
|
|
362
|
+
patcher = _patcher()
|
|
363
|
+
root = _fake_llamacpp(tmp_path / "llama.cpp")
|
|
364
|
+
assert patcher.main([str(root)]) == 0
|
|
365
|
+
|
|
366
|
+
base = (root / "ggml" / "src" / "ggml.c").read_text(encoding="utf-8")
|
|
367
|
+
cpu = (root / "ggml" / "src" / "ggml-cpu" / "ggml-cpu.c").read_text(
|
|
368
|
+
encoding="utf-8")
|
|
369
|
+
|
|
370
|
+
assert ".vec_dot" not in base, "vec_dot must not go in ggml.c"
|
|
371
|
+
assert "ggml_vec_dot_t" not in base
|
|
372
|
+
assert ".to_float" in base, "but to_float belongs there"
|
|
373
|
+
|
|
374
|
+
assert ".vec_dot" in cpu
|
|
375
|
+
assert ".vec_dot_type" in cpu
|
|
376
|
+
assert ".to_float" not in cpu, "to_float must not go in the cpu table"
|
|
377
|
+
for suffix in ("iq0_9", "iq0_75", "iq0_5", "iq0_25", "int1"):
|
|
378
|
+
assert f"hnx_ggml_vec_dot_{suffix}" in cpu
|
|
379
|
+
assert f"hnx_ggml_to_float_{suffix}" in base
|
|
380
|
+
|
|
381
|
+
def test_both_files_get_the_shim_include(self, tmp_path):
|
|
382
|
+
"""Each table names functions the other file does not declare."""
|
|
383
|
+
patcher = _patcher()
|
|
384
|
+
root = _fake_llamacpp(tmp_path / "llama.cpp")
|
|
385
|
+
assert patcher.main([str(root)]) == 0
|
|
386
|
+
|
|
387
|
+
for path in (root / "ggml" / "src" / "ggml.c",
|
|
388
|
+
root / "ggml" / "src" / "ggml-cpu" / "ggml-cpu.c"):
|
|
389
|
+
assert '#include "ggml-hnx-shim.h"' in path.read_text(encoding="utf-8")
|
|
390
|
+
|
|
391
|
+
def test_reverting_the_count_restores_upstreams_value(self, tmp_path):
|
|
392
|
+
"""Not a guess at what it used to be: the original line is
|
|
393
|
+
carried in the marker comment, so a checkout whose count is 43
|
|
394
|
+
goes back to 43 and one at 51 goes back to 51."""
|
|
395
|
+
patcher = _patcher()
|
|
396
|
+
root = _fake_llamacpp(tmp_path / "llama.cpp")
|
|
397
|
+
header = root / "ggml" / "include" / "ggml.h"
|
|
398
|
+
before = header.read_text(encoding="utf-8")
|
|
399
|
+
|
|
400
|
+
assert patcher.main([str(root)]) == 0
|
|
401
|
+
assert patcher.main([str(root), "--revert"]) == 0
|
|
402
|
+
|
|
403
|
+
assert header.read_text(encoding="utf-8") == before
|
|
404
|
+
|
|
286
405
|
def test_a_moved_anchor_changes_nothing(self, tmp_path, capsys):
|
|
287
406
|
"""The failure mode a .patch file has and this must not: a
|
|
288
407
|
half-applied patch that still compiles. Everything is read and
|
|
@@ -348,6 +467,65 @@ class TestThePatcher:
|
|
|
348
467
|
patch_llamacpp.main([str(tmp_path)])
|
|
349
468
|
|
|
350
469
|
|
|
470
|
+
class TestTheBuildScript:
|
|
471
|
+
"""`build.sh` is the thing people actually run.
|
|
472
|
+
|
|
473
|
+
It pins a llama.cpp revision, and a pin is a promise that the
|
|
474
|
+
revision builds. b4585 stopped keeping that promise: its
|
|
475
|
+
src/llama-mmap.h uses uint32_t without including <cstdint>, which
|
|
476
|
+
worked only while libstdc++ handed <cstdint> out behind <vector> and
|
|
477
|
+
<memory>. GCC 15 and 16 stopped, and `./build.sh` on a current
|
|
478
|
+
toolchain died with "'uint32_t' does not name a type" -- in a file
|
|
479
|
+
the patcher never touches.
|
|
480
|
+
"""
|
|
481
|
+
|
|
482
|
+
SCRIPT = NATIVE / "build.sh"
|
|
483
|
+
|
|
484
|
+
def test_the_pin_is_not_the_one_that_stopped_building(self):
|
|
485
|
+
text = self.SCRIPT.read_text(encoding="utf-8")
|
|
486
|
+
pin = re.search(r'LLAMA_REF="\$\{LLAMA_REF:-([^}"]+)\}"', text)
|
|
487
|
+
|
|
488
|
+
assert pin is not None, "LLAMA_REF is no longer set the way this reads"
|
|
489
|
+
assert pin.group(1) != "b4585", (
|
|
490
|
+
"b4585 does not compile on GCC 15+; see the comment above the pin"
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
def test_it_forces_cstdint_ahead_of_every_translation_unit(self):
|
|
494
|
+
"""The durable half. Moving the pin fixes the one file upstream
|
|
495
|
+
fixed; hundreds more still get their fixed-width integer types
|
|
496
|
+
from somebody else's header, so the next compiler to tighten its
|
|
497
|
+
transitive includes breaks a different one. `-include` costs
|
|
498
|
+
nothing and edits no upstream source.
|
|
499
|
+
"""
|
|
500
|
+
text = self.SCRIPT.read_text(encoding="utf-8")
|
|
501
|
+
|
|
502
|
+
assert "-include cstdint" in text
|
|
503
|
+
assert "-include stdint.h" in text
|
|
504
|
+
assert "CMAKE_CXX_FLAGS" in text and "CMAKE_C_FLAGS" in text
|
|
505
|
+
|
|
506
|
+
def test_forcing_it_can_be_turned_off(self):
|
|
507
|
+
"""MSVC spells it /FI. A flag no compiler has to accept should
|
|
508
|
+
not be the thing that stops a build."""
|
|
509
|
+
text = self.SCRIPT.read_text(encoding="utf-8")
|
|
510
|
+
|
|
511
|
+
assert "HNX_FORCE_STDINT" in text
|
|
512
|
+
|
|
513
|
+
def test_an_existing_checkout_is_reported_not_silently_reused(self):
|
|
514
|
+
"""How somebody pulls a patcher fix, re-runs this, and rebuilds
|
|
515
|
+
the same stale tree: the clone step is skipped when the
|
|
516
|
+
directory is there, and nothing said so."""
|
|
517
|
+
text = self.SCRIPT.read_text(encoding="utf-8")
|
|
518
|
+
|
|
519
|
+
assert "using the checkout already at" in text
|
|
520
|
+
assert "this script pins" in text
|
|
521
|
+
|
|
522
|
+
def test_it_is_still_valid_shell(self):
|
|
523
|
+
result = subprocess.run(["bash", "-n", str(self.SCRIPT)],
|
|
524
|
+
capture_output=True, text=True, check=False)
|
|
525
|
+
|
|
526
|
+
assert result.returncode == 0, result.stderr
|
|
527
|
+
|
|
528
|
+
|
|
351
529
|
class TestTheCudaKernels:
|
|
352
530
|
"""Beta 1 shipped these types CPU-only. These are the GPU kernels.
|
|
353
531
|
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"""HyperNix Studio running a model on this machine, with no server.
|
|
2
|
+
|
|
3
|
+
Studio began as a client: chat went over HTTP to a HyperNix server, and
|
|
4
|
+
a laptop with a GGUF sitting on it still needed something running
|
|
5
|
+
somewhere. This covers the other path.
|
|
6
|
+
|
|
7
|
+
Three things get checked here that the C++ suites cannot check alone:
|
|
8
|
+
|
|
9
|
+
**The build without llama.cpp is the one most people get**, and it has
|
|
10
|
+
to be honest rather than broken. `local_engine_test` is compiled and run
|
|
11
|
+
in that configuration on every pass.
|
|
12
|
+
|
|
13
|
+
**The GGUF parser's input is hostile.** A model file is something
|
|
14
|
+
somebody downloaded, and every length in its header is a 64-bit number
|
|
15
|
+
the parser would otherwise be told to allocate. `model_catalogue_test`
|
|
16
|
+
builds headers that lie and checks each one is refused.
|
|
17
|
+
|
|
18
|
+
**The tool boundary does not move.** A local model gets exactly the
|
|
19
|
+
reach a remote one had -- file operations inside the workspace, each
|
|
20
|
+
approved -- so the source scan for process spawning covers the new files
|
|
21
|
+
too, and the C++ that runs the model must not have acquired a way to run
|
|
22
|
+
anything else.
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import shutil
|
|
27
|
+
import subprocess
|
|
28
|
+
import sys
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
|
|
31
|
+
import pytest
|
|
32
|
+
|
|
33
|
+
DESKTOP = Path(__file__).resolve().parent.parent / "desktop"
|
|
34
|
+
SRC = DESKTOP / "src"
|
|
35
|
+
TESTS = DESKTOP / "tests"
|
|
36
|
+
QML = DESKTOP / "qml"
|
|
37
|
+
|
|
38
|
+
_POSIX_ONLY = pytest.mark.skipif(
|
|
39
|
+
sys.platform == "win32",
|
|
40
|
+
reason="Studio ships on Linux; see tests/test_studio_core.py for why the "
|
|
41
|
+
"compile-and-run halves are POSIX-only.",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _compiler() -> str | None:
|
|
46
|
+
for name in ("c++", "g++", "clang++"):
|
|
47
|
+
found = shutil.which(name)
|
|
48
|
+
if found:
|
|
49
|
+
return found
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _build(name: str, sources: list[str], tmp_path: Path) -> Path:
|
|
54
|
+
compiler = _compiler()
|
|
55
|
+
if compiler is None:
|
|
56
|
+
pytest.skip("no C++ compiler on this machine")
|
|
57
|
+
out = tmp_path / name
|
|
58
|
+
result = subprocess.run(
|
|
59
|
+
[compiler, "-std=c++17", "-O1", "-Wall", "-Wextra", "-Werror",
|
|
60
|
+
str(TESTS / f"{name}.cpp"),
|
|
61
|
+
*[str(SRC / s) for s in sources],
|
|
62
|
+
"-pthread", "-o", str(out)],
|
|
63
|
+
capture_output=True, text=True, check=False,
|
|
64
|
+
)
|
|
65
|
+
if result.returncode != 0:
|
|
66
|
+
pytest.fail(f"{name} does not compile cleanly:\n{result.stderr}")
|
|
67
|
+
return out
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@_POSIX_ONLY
|
|
71
|
+
class TestTheCatalogue:
|
|
72
|
+
"""Reading a GGUF header without loading the model."""
|
|
73
|
+
|
|
74
|
+
def test_it_compiles_and_every_check_passes(self, tmp_path):
|
|
75
|
+
binary = _build("model_catalogue_test", ["ModelCatalogue.cpp"], tmp_path)
|
|
76
|
+
result = subprocess.run([str(binary)], capture_output=True, text=True,
|
|
77
|
+
check=False)
|
|
78
|
+
|
|
79
|
+
assert result.returncode == 0, result.stdout + result.stderr
|
|
80
|
+
assert "0 failures" in result.stdout
|
|
81
|
+
|
|
82
|
+
def test_it_needs_neither_qt_nor_llama_cpp(self):
|
|
83
|
+
"""The point of it being separate.
|
|
84
|
+
|
|
85
|
+
A person browsing models on a machine with no llama.cpp should
|
|
86
|
+
still be told what is on the disk, and told that an IQ0.5_XXXL
|
|
87
|
+
file is an IQ0.5_XXXL file -- the build that cannot run it is
|
|
88
|
+
exactly the build where a bare "type 202" is least useful.
|
|
89
|
+
"""
|
|
90
|
+
source = (SRC / "ModelCatalogue.cpp").read_text(encoding="utf-8")
|
|
91
|
+
header = (SRC / "ModelCatalogue.h").read_text(encoding="utf-8")
|
|
92
|
+
|
|
93
|
+
for banned in ("<QtCore", "<QString", "llama.h", "ggml.h", "QObject"):
|
|
94
|
+
assert banned not in source, f"{banned} in ModelCatalogue.cpp"
|
|
95
|
+
assert banned not in header, f"{banned} in ModelCatalogue.h"
|
|
96
|
+
|
|
97
|
+
def test_it_names_the_hypernix_types_itself(self):
|
|
98
|
+
"""Not by asking ggml, which may not be linked in."""
|
|
99
|
+
source = (SRC / "ModelCatalogue.cpp").read_text(encoding="utf-8")
|
|
100
|
+
|
|
101
|
+
for name in ("IQ0.9_L", "IQ0.75_M", "IQ0.5_XXXL", "IQ0.25_UXL", "INT1"):
|
|
102
|
+
assert f'"{name}"' in source, name
|
|
103
|
+
|
|
104
|
+
def test_every_header_number_is_bounded_before_it_is_used(self):
|
|
105
|
+
"""The property the hostile-header tests exercise, asserted from
|
|
106
|
+
the other side: the constants that bound it are actually there.
|
|
107
|
+
|
|
108
|
+
A parser that reserved on the strength of a length in the file
|
|
109
|
+
could be made to allocate 16 exabytes by a malformed download.
|
|
110
|
+
"""
|
|
111
|
+
source = (SRC / "ModelCatalogue.cpp").read_text(encoding="utf-8")
|
|
112
|
+
|
|
113
|
+
for limit in ("kMaxHeaderBytes", "kMaxTensors", "kMaxKeys",
|
|
114
|
+
"kMaxStringBytes", "kMaxArrayItems"):
|
|
115
|
+
assert limit in source, limit
|
|
116
|
+
# And the string read is checked against what is *left* of the
|
|
117
|
+
# buffer, not only against a constant -- "longer than this file"
|
|
118
|
+
# and "2^63" are the same mistake.
|
|
119
|
+
assert "size_ - pos_" in source
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@_POSIX_ONLY
|
|
123
|
+
class TestTheEngineWithoutLlamaCpp:
|
|
124
|
+
"""The build nearly every machine gets."""
|
|
125
|
+
|
|
126
|
+
def test_it_compiles_and_the_stub_is_honest(self, tmp_path):
|
|
127
|
+
binary = _build("local_engine_test",
|
|
128
|
+
["LocalEngine.cpp", "ModelCatalogue.cpp"], tmp_path)
|
|
129
|
+
result = subprocess.run([str(binary)], capture_output=True, text=True,
|
|
130
|
+
check=False)
|
|
131
|
+
|
|
132
|
+
assert result.returncode == 0, result.stdout + result.stderr
|
|
133
|
+
assert "0 failures" in result.stdout
|
|
134
|
+
assert "local inference is OFF" in result.stdout
|
|
135
|
+
|
|
136
|
+
def test_the_reason_says_what_to_do(self):
|
|
137
|
+
""""Not available" on its own sends someone to the issue tracker."""
|
|
138
|
+
source = (SRC / "LocalEngine.cpp").read_text(encoding="utf-8")
|
|
139
|
+
|
|
140
|
+
assert "STUDIO_LOCAL_LLAMA" in source
|
|
141
|
+
assert "LLAMA_ROOT" in source
|
|
142
|
+
|
|
143
|
+
def test_local_inference_is_off_by_default(self):
|
|
144
|
+
"""The server path does not need llama.cpp. Making the harder
|
|
145
|
+
dependency mandatory would stop Studio building for everyone who
|
|
146
|
+
only wants to connect to a HyperNix box."""
|
|
147
|
+
cmake = (DESKTOP / "CMakeLists.txt").read_text(encoding="utf-8")
|
|
148
|
+
|
|
149
|
+
assert 'option(STUDIO_LOCAL_LLAMA' in cmake
|
|
150
|
+
block = cmake.split("option(STUDIO_LOCAL_LLAMA", 1)[1][:200]
|
|
151
|
+
assert "OFF)" in block
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class TestTheToolBoundaryDidNotMove:
|
|
155
|
+
"""A local model gets no more reach than a remote one had."""
|
|
156
|
+
|
|
157
|
+
def test_the_new_files_cannot_run_a_command(self):
|
|
158
|
+
"""test_studio_core.py sweeps src/*.cpp already; this says out
|
|
159
|
+
loud that the files added for local models are in that sweep,
|
|
160
|
+
so removing them from it would fail here rather than silently."""
|
|
161
|
+
forbidden = ("system(", "popen(", "execv", "execl", "execp", "fork(",
|
|
162
|
+
"QProcess", "posix_spawn")
|
|
163
|
+
for name in ("LocalEngine.cpp", "LocalEngine.h", "ModelCatalogue.cpp",
|
|
164
|
+
"ModelCatalogue.h", "LocalSession.cpp", "LocalSession.h"):
|
|
165
|
+
text = (SRC / name).read_text(encoding="utf-8")
|
|
166
|
+
for token in forbidden:
|
|
167
|
+
assert token not in text, f"{name} contains {token!r}"
|
|
168
|
+
|
|
169
|
+
def test_running_a_model_locally_still_goes_through_the_policy(self):
|
|
170
|
+
"""The approval flow is untouched: onToolCall and runApproved are
|
|
171
|
+
the only route to a mutating tool, whichever end the model is
|
|
172
|
+
at. A second path for local models would be a second place to
|
|
173
|
+
get the boundary wrong."""
|
|
174
|
+
bridge = (SRC / "StudioBridge.cpp").read_text(encoding="utf-8")
|
|
175
|
+
|
|
176
|
+
assert bridge.count("runner_->policy().Decide(") == 1
|
|
177
|
+
assert "sendToLocal" in bridge
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class TestTheBridgeRoutes:
|
|
181
|
+
def test_send_dispatches_on_the_source(self):
|
|
182
|
+
bridge = (SRC / "StudioBridge.cpp").read_text(encoding="utf-8")
|
|
183
|
+
|
|
184
|
+
assert "void StudioBridge::send(" in bridge
|
|
185
|
+
assert "sendToLocal(text)" in bridge
|
|
186
|
+
assert "sendToServer(text)" in bridge
|
|
187
|
+
|
|
188
|
+
def test_the_engine_runs_off_the_gui_thread(self):
|
|
189
|
+
"""Loading a 7B model takes seconds and generating takes as long
|
|
190
|
+
as it takes. On the GUI thread the window stops repainting and
|
|
191
|
+
the desktop offers to kill it."""
|
|
192
|
+
session = (SRC / "LocalSession.cpp").read_text(encoding="utf-8")
|
|
193
|
+
|
|
194
|
+
assert "moveToThread" in session
|
|
195
|
+
assert "Qt::QueuedConnection" in session
|
|
196
|
+
|
|
197
|
+
def test_cancel_is_not_queued(self):
|
|
198
|
+
"""The one call that must not be. The worker thread is *inside*
|
|
199
|
+
Generate, so a queued cancel would sit in its event queue until
|
|
200
|
+
the generation it is meant to stop had finished."""
|
|
201
|
+
session = (SRC / "LocalSession.cpp").read_text(encoding="utf-8")
|
|
202
|
+
body = session.split("void LocalSession::cancel()", 1)[1][:400]
|
|
203
|
+
|
|
204
|
+
assert "QueuedConnection" not in body
|
|
205
|
+
assert "worker_->cancel()" in body
|
|
206
|
+
|
|
207
|
+
def test_the_streaming_index_is_bounds_checked(self):
|
|
208
|
+
"""The conversation can be cleared while a generation is in
|
|
209
|
+
flight. Writing past the end of the list would be the last thing
|
|
210
|
+
this process did."""
|
|
211
|
+
bridge = (SRC / "StudioBridge.cpp").read_text(encoding="utf-8")
|
|
212
|
+
|
|
213
|
+
assert "streamingIndex_ >= messages_.size()" in bridge
|
|
214
|
+
assert "streamingIndex_ = -1;" in bridge
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class TestTheUiDoesNotAskForAServerItDoesNotNeed:
|
|
218
|
+
def test_the_composer_gates_on_ready_not_connected(self):
|
|
219
|
+
"""`connected` is false forever in local mode. Gating the input
|
|
220
|
+
on it left the composer dead with a model loaded and running."""
|
|
221
|
+
chat = (QML / "ChatView.qml").read_text(encoding="utf-8")
|
|
222
|
+
|
|
223
|
+
assert "studio.ready && !studio.busy" in chat
|
|
224
|
+
assert "enabled: studio.connected && !studio.busy" not in chat
|
|
225
|
+
|
|
226
|
+
def test_the_connect_form_is_hidden_in_local_mode(self):
|
|
227
|
+
sidebar = (QML / "Sidebar.qml").read_text(encoding="utf-8")
|
|
228
|
+
|
|
229
|
+
assert 'studio.source !== "local"' in sidebar
|
|
230
|
+
|
|
231
|
+
def test_a_generating_model_can_be_stopped(self):
|
|
232
|
+
"""A long answer on a slow machine is a minute of watching, and
|
|
233
|
+
closing the window should not be the way out."""
|
|
234
|
+
chat = (QML / "ChatView.qml").read_text(encoding="utf-8")
|
|
235
|
+
|
|
236
|
+
assert "studio.stopGenerating()" in chat
|
|
237
|
+
|
|
238
|
+
def test_the_models_view_reads_both_shapes(self):
|
|
239
|
+
"""A server model calls it displayName and a local one calls it
|
|
240
|
+
name. An undefined binding here does not throw -- it leaves the
|
|
241
|
+
property at its *previous* value, which is how a list showed the
|
|
242
|
+
last model's name against this model's row."""
|
|
243
|
+
models = (QML / "ModelsView.qml").read_text(encoding="utf-8")
|
|
244
|
+
|
|
245
|
+
assert "modelData.displayName !== undefined" in models
|
|
246
|
+
assert "studio.localModels" in models
|
|
247
|
+
|
|
248
|
+
def test_an_unreadable_model_is_shown_not_hidden(self):
|
|
249
|
+
"""A file that is there and broken is something you want to see."""
|
|
250
|
+
models = (QML / "ModelsView.qml").read_text(encoding="utf-8")
|
|
251
|
+
|
|
252
|
+
assert "modelData.ok === false" in models
|
|
253
|
+
assert "unreadable" in models
|