hugpy-engine 0.2.4__tar.gz → 0.2.6__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.
- {hugpy_engine-0.2.4/src/hugpy_engine.egg-info → hugpy_engine-0.2.6}/PKG-INFO +1 -1
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/catalog_bridge.py +8 -1
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/main.py +8 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/models_config.py +40 -7
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/activity.py +7 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/dispatch.py +48 -4
- hugpy_engine-0.2.6/src/hugpy_engine/fit/__init__.py +28 -0
- hugpy_engine-0.2.6/src/hugpy_engine/fit/flex.py +709 -0
- hugpy_engine-0.2.6/src/hugpy_engine/fit/gguf_need.py +203 -0
- hugpy_engine-0.2.6/src/hugpy_engine/fit/plan.py +769 -0
- hugpy_engine-0.2.6/src/hugpy_engine/fit/types.py +458 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/coder.py +27 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/config.py +77 -6
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/generate_runner.py +50 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/chat_runner.py +21 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/get.py +89 -9
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/base_runner.py +53 -2
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/ccp_runner.py +20 -1
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/python_runner.py +35 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_index/__init__.py +27 -1
- hugpy_engine-0.2.6/src/hugpy_engine/model_index/planner/__init__.py +5 -0
- hugpy_engine-0.2.6/src/hugpy_engine/model_index/planner/compute.py +714 -0
- hugpy_engine-0.2.6/src/hugpy_engine/model_index/planner/store.py +466 -0
- hugpy_engine-0.2.6/src/hugpy_engine/model_index/query_registry.py +1052 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_index/repositories.py +50 -8
- hugpy_engine-0.2.6/src/hugpy_engine/model_index/service.py +1025 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/peft_adapters.py +9 -2
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/assure_model_key.py +81 -39
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/remote.py +513 -36
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/chat_schemas.py +7 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/event_schemas.py +10 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/load_failure.py +84 -1
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/overrides.py +157 -76
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/profiles.py +70 -17
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/slot_agent.py +202 -20
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/slots.py +201 -118
- hugpy_engine-0.2.6/src/hugpy_engine/serve/tf_child.py +553 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/spill.py +183 -20
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6/src/hugpy_engine.egg-info}/PKG-INFO +1 -1
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/SOURCES.txt +33 -1
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/scm_file_list.json +32 -0
- hugpy_engine-0.2.6/src/hugpy_engine.egg-info/scm_version.json +8 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/conftest.py +18 -0
- hugpy_engine-0.2.6/tests/known_good/test_dependency_acquisition_contract.py +252 -0
- hugpy_engine-0.2.6/tests/known_good/test_key_equivalence_contract.py +99 -0
- hugpy_engine-0.2.6/tests/known_good/test_missing_dependency_contract.py +116 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_model_key_contract.py +114 -0
- hugpy_engine-0.2.6/tests/known_good/test_plan_fit_contract.py +765 -0
- hugpy_engine-0.2.6/tests/known_good/test_politeness_retired_contract.py +65 -0
- hugpy_engine-0.2.6/tests/known_good/test_prefill_progress_contract.py +99 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_relay_gate_allocation_contract.py +12 -7
- hugpy_engine-0.2.6/tests/known_good/test_relay_stream_stall_contract.py +279 -0
- hugpy_engine-0.2.6/tests/known_good/test_remote_error_structure_contract.py +133 -0
- hugpy_engine-0.2.6/tests/known_good/test_response_format_contract.py +104 -0
- hugpy_engine-0.2.6/tests/known_good/test_slot_seat_admission_contract.py +196 -0
- hugpy_engine-0.2.6/tests/known_good/test_slot_serialization_contract.py +159 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_central_cap_gating.py +21 -7
- hugpy_engine-0.2.6/tests/test_ctx_range_flex.py +31 -0
- hugpy_engine-0.2.6/tests/test_evict_releases_transformers_registry.py +51 -0
- hugpy_engine-0.2.6/tests/test_planner_encroachment.py +39 -0
- hugpy_engine-0.2.6/tests/test_planner_worker_totals.py +20 -0
- hugpy_engine-0.2.6/tests/test_profile_worker_base.py +25 -0
- hugpy_engine-0.2.6/tests/test_ram_residents_plan.py +50 -0
- hugpy_engine-0.2.6/tests/test_slot_agent_loading_state.py +75 -0
- hugpy_engine-0.2.6/tests/test_slot_parallel_kv.py +37 -0
- hugpy_engine-0.2.6/tests/test_slot_served_ctx.py +24 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_spill_ctx_reserve.py +20 -12
- hugpy_engine-0.2.6/tests/test_tf_child.py +111 -0
- hugpy_engine-0.2.6/tests/test_tf_slot_and_routing.py +57 -0
- hugpy_engine-0.2.6/tests/test_transformers_kv_geometry_hybrid_vl.py +30 -0
- hugpy_engine-0.2.4/src/hugpy_engine/model_index/query_registry.py +0 -399
- hugpy_engine-0.2.4/src/hugpy_engine/model_index/service.py +0 -281
- hugpy_engine-0.2.4/src/hugpy_engine.egg-info/scm_version.json +0 -8
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/LICENSE +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/README.md +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/docs/ALLOCATION-MODES.md +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/pyproject.toml +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/setup.cfg +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/alloc_modes.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/allocation.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/call_api.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/get_module.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/reclassify.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/reconcile.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/serve/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/serve/serve.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/serve/serve_cli.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/systemd_units.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/backend.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/backends/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/backends/local.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/catalog.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/categories.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/chat_context.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/context_budget.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/unbounded.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/model_meta.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/models_default.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/models_dict.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/contracts.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/acquire.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/draft_models.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/engines.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/eviction.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/gguf_election.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/config.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/constants.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/init_imports.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/utils.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/shard_server.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/serve.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/manifest.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_classifier.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_index/client.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/name_match.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/build.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/fetch.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/resolve.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/output_repair.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/placement.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/py.typed +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/query.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/allocator.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/categories/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/categories/builders.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/categories/frameworks.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/device_placement.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/groups.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/model_dict_resolver.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/model_resolver.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/routing_diagnostics.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/runtime.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/metadata_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/model_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/runner_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/task_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/chunksum_verify.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/hot_cache.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/model_cache.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/policy.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/serve.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/serve_cli.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/supervisor.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/task_deps.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/tasks.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/utils/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/utils/json_scavenge.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/utils/no_think.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/__init__.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/chat_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/config_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/install_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/model_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/request_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/specs_schemas.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/dependency_links.txt +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/entry_points.txt +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/requires.txt +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/top_level.txt +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_call_queue_contract.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_evict_fit_contract.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_model_format_contract.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_admission_gate_and_diagnostics.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_allocation_accuracy.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_budget_bar_spec.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_catalog_bridge.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chat_request_caller.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chat_role_alternation.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chat_tool_messages_schema.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chunksum_verify.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_comms_foundations.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_ctx_fit.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_device_placement.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_engine_boundary.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_engine_persisted_resolve.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_eviction_flow.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_feasible_distribution_engine.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_gguf_election.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_gguf_sharded_effective.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_hot_cache.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_image_task_classification.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_import_policy.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_load_failure_reason.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_mmproj_effective_bytes.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_model_aliases.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_no_makeroom.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_no_think.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_peft_adapter_load.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_per_device_slot.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_per_request_alloc.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_placement_defaults.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_provision_failure_honesty.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_registry_attribution.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_registry_symmetry.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_resolve_routing_key_reconcile.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_runner_registry_heartbeat_starvation.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_load_stall_health.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_moe_vram_preflight.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_placement_projection.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_port_guard.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_relaunch.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_spill_vision_fit.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_tasks_registry.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_tok_s_plausible_ceiling.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_transformers_placement.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_video_model_classification.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_vision_needs_slot.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_vram_cliff.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_worker_error_attribution.py +0 -0
- {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_worker_serve_path_central_only.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hugpy-engine
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: Hugpy engine: model discovery and classification, allocation and eviction, native llama.cpp and GGUF runners, and the prompt-to-reply inference path with task and placement seams
|
|
5
5
|
Author-email: putkoff <support@hugpy.ai>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -52,7 +52,14 @@ class EngineCatalogSource:
|
|
|
52
52
|
def canonical_key(self, model_key: str) -> Optional[str]:
|
|
53
53
|
from hugpy_engine.resolvers.assure_model_key import assure_model_key
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
# IDENTITY resolution only (operator rule 2026-09-29): this is the
|
|
56
|
+
# storage/provision seam a WORKER uses to re-resolve a key central
|
|
57
|
+
# already resolved (ensure_model_registered -> _assure_local_key). The
|
|
58
|
+
# shorthand fuzzy tier must never answer here — on ae it turned
|
|
59
|
+
# ``Qwen3.8-9B-GGUF`` into the resident ``Qwen3.8-9B-Distill-GGUF``
|
|
60
|
+
# (same file, different model) and served it (S3/F7). None means
|
|
61
|
+
# "learn the row from central", never "use the nearest sibling".
|
|
62
|
+
return assure_model_key(model_key, fuzzy=False)
|
|
56
63
|
|
|
57
64
|
def resolve_dir(self, model_key: str) -> Optional[str]:
|
|
58
65
|
from hugpy_engine.config.main import get_model_path
|
|
@@ -50,6 +50,14 @@ def _resolve_model_key(model_key, registry, prefer=None):
|
|
|
50
50
|
def _bare(k): # name without the "owner~" qualifier
|
|
51
51
|
return k.split("~", 1)[1] if "~" in k else k
|
|
52
52
|
candidates = sorted(k for k in registry if _bare(k) == model_key)
|
|
53
|
+
if not candidates:
|
|
54
|
+
# FORMAT EQUIVALENCE (operator rule 2026-09-29): ``X`` and ``X-GGUF``
|
|
55
|
+
# are one key, so either spelling resolves to the row on record under
|
|
56
|
+
# the other. Nothing else is folded — ``X-Distill-GGUF`` is a different
|
|
57
|
+
# model and never answers for ``X-GGUF`` (S3/F7). Lazy import keeps the
|
|
58
|
+
# config module's import graph unchanged.
|
|
59
|
+
from hugpy_engine.fit.types import key_equivalent
|
|
60
|
+
candidates = sorted(k for k in registry if key_equivalent(_bare(k), model_key))
|
|
53
61
|
if not candidates:
|
|
54
62
|
return None
|
|
55
63
|
if len(candidates) == 1:
|
|
@@ -1618,14 +1618,34 @@ def record_worker_models(worker_id: str, rows: dict) -> list[str]:
|
|
|
1618
1618
|
clean[key]["worker_location"] = location
|
|
1619
1619
|
old = (data.get(worker_id) or {}).get("models")
|
|
1620
1620
|
changed = old != clean
|
|
1621
|
-
|
|
1621
|
+
# DETACH STEP 2 (operator 2026-10-02): the catalog's home is the DB
|
|
1622
|
+
# (model_worker_presence, source 'discovered'); the JSON is written only
|
|
1623
|
+
# with HUGPY_WORKER_CATALOG_JSON=1 — or when the DB write did not land
|
|
1624
|
+
# (no DB / DB down): the JSON is the no-DB fallback the reader uses, so
|
|
1625
|
+
# a no-DB central must still persist its scan there (2026-10-02).
|
|
1626
|
+
db_changed = False
|
|
1627
|
+
db_ok = False
|
|
1628
|
+
try:
|
|
1629
|
+
from hugpy_engine.model_index import record_worker_presence
|
|
1630
|
+
rows = []
|
|
1631
|
+
for key, row in clean.items():
|
|
1632
|
+
r = dict(row); r["model_key"] = key
|
|
1633
|
+
if r.get("worker_location"):
|
|
1634
|
+
r["external_location"] = r["worker_location"]
|
|
1635
|
+
rows.append(r)
|
|
1636
|
+
st, det = record_worker_presence(worker_id, rows, source="discovered", complete=True)
|
|
1637
|
+
db_ok = st == "ok"
|
|
1638
|
+
db_changed = bool(db_ok and (det or {}).get("changed"))
|
|
1639
|
+
except Exception: # noqa: BLE001 — a DB miss never breaks a heartbeat
|
|
1640
|
+
db_changed = False
|
|
1641
|
+
if changed and (not db_ok or os.environ.get("HUGPY_WORKER_CATALOG_JSON", "0") == "1"):
|
|
1622
1642
|
data[worker_id] = {"at": time.time(), "models": clean}
|
|
1623
1643
|
tmp = path + f".{os.getpid()}.tmp"
|
|
1624
1644
|
with open(tmp, "w", encoding="utf-8") as fh:
|
|
1625
1645
|
json.dump(data, fh)
|
|
1626
1646
|
os.replace(tmp, path)
|
|
1627
1647
|
fcntl.flock(lock, fcntl.LOCK_UN)
|
|
1628
|
-
_apply_worker_catalog(force=changed)
|
|
1648
|
+
_apply_worker_catalog(force=(changed or db_changed))
|
|
1629
1649
|
# The canonical keys may differ from worker-local scan keys when central
|
|
1630
1650
|
# already has a same-named model from another hub. Return those identities
|
|
1631
1651
|
# so heartbeat placement uses the same keys as the shared model catalog.
|
|
@@ -1639,14 +1659,27 @@ def _apply_worker_catalog(force=False) -> None:
|
|
|
1639
1659
|
registry_dict = globals().get("MODEL_REGISTRY_DICT")
|
|
1640
1660
|
if registry is None or registry_dict is None:
|
|
1641
1661
|
return # import-time base build
|
|
1662
|
+
data = None
|
|
1663
|
+
# DB first (detach step 2): the discovered catalog lives in
|
|
1664
|
+
# model_worker_presence; the JSON file is the no-DB fallback only.
|
|
1642
1665
|
try:
|
|
1643
|
-
|
|
1666
|
+
from hugpy_engine.model_index import fetch_presence_catalog
|
|
1667
|
+
data = fetch_presence_catalog()
|
|
1668
|
+
except Exception: # noqa: BLE001
|
|
1669
|
+
data = None
|
|
1670
|
+
if data is not None:
|
|
1671
|
+
stamp = hash(json.dumps(data, sort_keys=True, default=str))
|
|
1644
1672
|
if not force and stamp == _WORKER_CATALOG_SEEN:
|
|
1645
1673
|
return
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1674
|
+
else:
|
|
1675
|
+
try:
|
|
1676
|
+
stamp = os.stat(_WORKER_CATALOG_PATH).st_mtime_ns
|
|
1677
|
+
if not force and stamp == _WORKER_CATALOG_SEEN:
|
|
1678
|
+
return
|
|
1679
|
+
with open(_WORKER_CATALOG_PATH, encoding="utf-8") as fh:
|
|
1680
|
+
data = json.load(fh)
|
|
1681
|
+
except (OSError, ValueError):
|
|
1682
|
+
return
|
|
1650
1683
|
locations: dict[str, dict[str, str]] = {}
|
|
1651
1684
|
external_apis: dict[str, dict[str, dict]] = {}
|
|
1652
1685
|
candidates: dict[str, dict] = {}
|
|
@@ -95,6 +95,13 @@ def snapshot() -> list:
|
|
|
95
95
|
"kind": d["kind"],
|
|
96
96
|
"prompt": d.get("prompt") or "",
|
|
97
97
|
"state": state,
|
|
98
|
+
# WHERE a processing call is (2026-09-29): "prefill" while the
|
|
99
|
+
# engine is still reading the prompt (n_past/n_prompt ride on
|
|
100
|
+
# progress/input_tokens), "" once tokens flow. Without this the
|
|
101
|
+
# queue read "answering, 0 tokens" for a 105 s legitimate prefill.
|
|
102
|
+
"stage": d.get("stage") or "",
|
|
103
|
+
"progress": d.get("progress"),
|
|
104
|
+
"input_tokens": d.get("input_tokens"),
|
|
98
105
|
"elapsed": d["elapsed"],
|
|
99
106
|
"wait": d["wait"],
|
|
100
107
|
"tokens": d["tokens"],
|
|
@@ -697,7 +697,25 @@ async def stream_runner(runner, req, cancel_event=None):
|
|
|
697
697
|
timings=getattr(result, "timings", None))
|
|
698
698
|
else:
|
|
699
699
|
yield ErrorEvent(request_id=req.request_id,
|
|
700
|
-
message=getattr(result, "error", None) or "run failed"
|
|
700
|
+
message=getattr(result, "error", None) or "run failed",
|
|
701
|
+
load_failure=(getattr(result, "load_failure", None)
|
|
702
|
+
if isinstance(getattr(result, "load_failure", None), dict)
|
|
703
|
+
else None))
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
def _rewrap_error_event(event, rid):
|
|
707
|
+
"""The ONE re-wrap of an inner ErrorEvent under the outer request id
|
|
708
|
+
(S5, 2026-09-29). It used to rebuild the event from ``message`` alone, so
|
|
709
|
+
the worker's structured ``load_failure`` (class + fit_failure + refusal —
|
|
710
|
+
F3) and ``code`` were dropped HERE, on central, between the relay and the
|
|
711
|
+
/v1 envelope: the client saw ``type: api_error`` with no ``fit_failure``
|
|
712
|
+
although the worker had logged kind=vram_fit. Carry both."""
|
|
713
|
+
return ErrorEvent(request_id=rid,
|
|
714
|
+
message=getattr(event, "message", None) or "run failed",
|
|
715
|
+
load_failure=(getattr(event, "load_failure", None)
|
|
716
|
+
if isinstance(getattr(event, "load_failure", None), dict)
|
|
717
|
+
else None),
|
|
718
|
+
code=(str(getattr(event, "code")) if getattr(event, "code", None) else None))
|
|
701
719
|
|
|
702
720
|
|
|
703
721
|
async def execute_prompt_stream(*args, cancel_event=None, **kwargs):
|
|
@@ -948,8 +966,7 @@ async def execute_chat_stream(*args, cancel_event=None, **kwargs):
|
|
|
948
966
|
output_chunks=1, finish_reason="stop",
|
|
949
967
|
usage=usage_totals, timings=timings_last)
|
|
950
968
|
else:
|
|
951
|
-
yield
|
|
952
|
-
message=getattr(event, "message", None) or "run failed")
|
|
969
|
+
yield _rewrap_error_event(event, rid)
|
|
953
970
|
errored = True
|
|
954
971
|
break
|
|
955
972
|
else:
|
|
@@ -1130,7 +1147,26 @@ def evict(model_key: str, task: Optional[str] = None) -> bool:
|
|
|
1130
1147
|
heavy = evict_llama_runner(model_key)
|
|
1131
1148
|
except Exception:
|
|
1132
1149
|
heavy = False
|
|
1133
|
-
|
|
1150
|
+
# TRANSFORMERS weights live in generate.coder.REGISTRY, not in the runner
|
|
1151
|
+
# wrapper: drop them too, then reclaim so the freed VRAM is visible to the
|
|
1152
|
+
# very next fit check (2026-10-02: an in-process eviction "freed 16 MB" of
|
|
1153
|
+
# a 17 GB model and stranded the rest on the card).
|
|
1154
|
+
tf = 0
|
|
1155
|
+
try:
|
|
1156
|
+
from hugpy_engine.generate.coder import REGISTRY as _TF_REGISTRY
|
|
1157
|
+
tf = _TF_REGISTRY.evict_model(model_key)
|
|
1158
|
+
except Exception:
|
|
1159
|
+
tf = 0
|
|
1160
|
+
if tf:
|
|
1161
|
+
try:
|
|
1162
|
+
import gc
|
|
1163
|
+
gc.collect()
|
|
1164
|
+
import torch
|
|
1165
|
+
if torch.cuda.is_available():
|
|
1166
|
+
torch.cuda.empty_cache()
|
|
1167
|
+
except Exception:
|
|
1168
|
+
pass
|
|
1169
|
+
return dropped or heavy or bool(tf)
|
|
1134
1170
|
|
|
1135
1171
|
|
|
1136
1172
|
def clear() -> None:
|
|
@@ -1142,6 +1178,14 @@ def clear() -> None:
|
|
|
1142
1178
|
clear_llama_runners()
|
|
1143
1179
|
except Exception:
|
|
1144
1180
|
pass
|
|
1181
|
+
try:
|
|
1182
|
+
from hugpy_engine.generate.coder import REGISTRY as _TF_REGISTRY
|
|
1183
|
+
for _k in {getattr(getattr(i, "cfg", None), "model_key", None) for i in list(_TF_REGISTRY._instances.values())}:
|
|
1184
|
+
if _k:
|
|
1185
|
+
_TF_REGISTRY.evict_model(_k)
|
|
1186
|
+
_TF_REGISTRY.clear()
|
|
1187
|
+
except Exception:
|
|
1188
|
+
pass
|
|
1145
1189
|
|
|
1146
1190
|
|
|
1147
1191
|
def supported_task_keys() -> List[Tuple[str, str]]:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""``hugpy_engine.fit`` — the pure, deterministic evict-to-fit core.
|
|
2
|
+
|
|
3
|
+
Standalone: imports only ``hugpy_engine`` siblings (``eviction``, ``spill``)
|
|
4
|
+
and the standard library — no torch, no nvml, no fleet. See ``plan.py``.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from hugpy_engine.fit.flex import ( # noqa: F401
|
|
9
|
+
FlexPlan, PartialPlan, band_bounds, band_ceiling, band_floor,
|
|
10
|
+
ctx_band_bounds, flex_priority_key, kv_at_ctx_pct, leniency_floor_pct,
|
|
11
|
+
plan_explicit_offload, plan_flex, plan_partial_offload,
|
|
12
|
+
)
|
|
13
|
+
from hugpy_engine.fit.plan import evict_order, need_split, plan_fit # noqa: F401
|
|
14
|
+
from hugpy_engine.fit.types import ( # noqa: F401
|
|
15
|
+
FAILURE_KINDS, DeviceVram, Eviction, FitFailure, FitPlan, FitPolicy,
|
|
16
|
+
FitRequest, MoeSplit, Resident, ResourceSnapshot, VramSnapshot,
|
|
17
|
+
canonical_key, key_equivalent,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"plan_fit", "evict_order", "need_split",
|
|
22
|
+
"ResourceSnapshot", "VramSnapshot", "DeviceVram", "FitPolicy", "Resident",
|
|
23
|
+
"FitRequest", "Eviction", "MoeSplit", "FitFailure", "FAILURE_KINDS", "FitPlan",
|
|
24
|
+
"canonical_key", "key_equivalent",
|
|
25
|
+
"FlexPlan", "PartialPlan", "band_bounds", "band_ceiling", "band_floor",
|
|
26
|
+
"ctx_band_bounds", "flex_priority_key", "kv_at_ctx_pct", "leniency_floor_pct",
|
|
27
|
+
"plan_explicit_offload", "plan_flex", "plan_partial_offload",
|
|
28
|
+
]
|