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.
Files changed (225) hide show
  1. {hugpy_engine-0.2.4/src/hugpy_engine.egg-info → hugpy_engine-0.2.6}/PKG-INFO +1 -1
  2. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/catalog_bridge.py +8 -1
  3. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/main.py +8 -0
  4. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/models_config.py +40 -7
  5. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/activity.py +7 -0
  6. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/dispatch.py +48 -4
  7. hugpy_engine-0.2.6/src/hugpy_engine/fit/__init__.py +28 -0
  8. hugpy_engine-0.2.6/src/hugpy_engine/fit/flex.py +709 -0
  9. hugpy_engine-0.2.6/src/hugpy_engine/fit/gguf_need.py +203 -0
  10. hugpy_engine-0.2.6/src/hugpy_engine/fit/plan.py +769 -0
  11. hugpy_engine-0.2.6/src/hugpy_engine/fit/types.py +458 -0
  12. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/coder.py +27 -0
  13. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/config.py +77 -6
  14. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/generate_runner.py +50 -0
  15. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/chat_runner.py +21 -0
  16. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/get.py +89 -9
  17. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/base_runner.py +53 -2
  18. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/ccp_runner.py +20 -1
  19. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/python_runner.py +35 -0
  20. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_index/__init__.py +27 -1
  21. hugpy_engine-0.2.6/src/hugpy_engine/model_index/planner/__init__.py +5 -0
  22. hugpy_engine-0.2.6/src/hugpy_engine/model_index/planner/compute.py +714 -0
  23. hugpy_engine-0.2.6/src/hugpy_engine/model_index/planner/store.py +466 -0
  24. hugpy_engine-0.2.6/src/hugpy_engine/model_index/query_registry.py +1052 -0
  25. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_index/repositories.py +50 -8
  26. hugpy_engine-0.2.6/src/hugpy_engine/model_index/service.py +1025 -0
  27. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/peft_adapters.py +9 -2
  28. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/assure_model_key.py +81 -39
  29. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/remote.py +513 -36
  30. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/chat_schemas.py +7 -0
  31. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/event_schemas.py +10 -0
  32. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/load_failure.py +84 -1
  33. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/overrides.py +157 -76
  34. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/profiles.py +70 -17
  35. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/slot_agent.py +202 -20
  36. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/slots.py +201 -118
  37. hugpy_engine-0.2.6/src/hugpy_engine/serve/tf_child.py +553 -0
  38. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/spill.py +183 -20
  39. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6/src/hugpy_engine.egg-info}/PKG-INFO +1 -1
  40. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/SOURCES.txt +33 -1
  41. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/scm_file_list.json +32 -0
  42. hugpy_engine-0.2.6/src/hugpy_engine.egg-info/scm_version.json +8 -0
  43. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/conftest.py +18 -0
  44. hugpy_engine-0.2.6/tests/known_good/test_dependency_acquisition_contract.py +252 -0
  45. hugpy_engine-0.2.6/tests/known_good/test_key_equivalence_contract.py +99 -0
  46. hugpy_engine-0.2.6/tests/known_good/test_missing_dependency_contract.py +116 -0
  47. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_model_key_contract.py +114 -0
  48. hugpy_engine-0.2.6/tests/known_good/test_plan_fit_contract.py +765 -0
  49. hugpy_engine-0.2.6/tests/known_good/test_politeness_retired_contract.py +65 -0
  50. hugpy_engine-0.2.6/tests/known_good/test_prefill_progress_contract.py +99 -0
  51. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_relay_gate_allocation_contract.py +12 -7
  52. hugpy_engine-0.2.6/tests/known_good/test_relay_stream_stall_contract.py +279 -0
  53. hugpy_engine-0.2.6/tests/known_good/test_remote_error_structure_contract.py +133 -0
  54. hugpy_engine-0.2.6/tests/known_good/test_response_format_contract.py +104 -0
  55. hugpy_engine-0.2.6/tests/known_good/test_slot_seat_admission_contract.py +196 -0
  56. hugpy_engine-0.2.6/tests/known_good/test_slot_serialization_contract.py +159 -0
  57. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_central_cap_gating.py +21 -7
  58. hugpy_engine-0.2.6/tests/test_ctx_range_flex.py +31 -0
  59. hugpy_engine-0.2.6/tests/test_evict_releases_transformers_registry.py +51 -0
  60. hugpy_engine-0.2.6/tests/test_planner_encroachment.py +39 -0
  61. hugpy_engine-0.2.6/tests/test_planner_worker_totals.py +20 -0
  62. hugpy_engine-0.2.6/tests/test_profile_worker_base.py +25 -0
  63. hugpy_engine-0.2.6/tests/test_ram_residents_plan.py +50 -0
  64. hugpy_engine-0.2.6/tests/test_slot_agent_loading_state.py +75 -0
  65. hugpy_engine-0.2.6/tests/test_slot_parallel_kv.py +37 -0
  66. hugpy_engine-0.2.6/tests/test_slot_served_ctx.py +24 -0
  67. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_spill_ctx_reserve.py +20 -12
  68. hugpy_engine-0.2.6/tests/test_tf_child.py +111 -0
  69. hugpy_engine-0.2.6/tests/test_tf_slot_and_routing.py +57 -0
  70. hugpy_engine-0.2.6/tests/test_transformers_kv_geometry_hybrid_vl.py +30 -0
  71. hugpy_engine-0.2.4/src/hugpy_engine/model_index/query_registry.py +0 -399
  72. hugpy_engine-0.2.4/src/hugpy_engine/model_index/service.py +0 -281
  73. hugpy_engine-0.2.4/src/hugpy_engine.egg-info/scm_version.json +0 -8
  74. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/LICENSE +0 -0
  75. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/README.md +0 -0
  76. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/docs/ALLOCATION-MODES.md +0 -0
  77. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/pyproject.toml +0 -0
  78. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/setup.cfg +0 -0
  79. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/__init__.py +0 -0
  80. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/alloc_modes.py +0 -0
  81. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/allocation.py +0 -0
  82. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/__init__.py +0 -0
  83. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/call_api.py +0 -0
  84. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/get_module.py +0 -0
  85. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/reclassify.py +0 -0
  86. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/reconcile.py +0 -0
  87. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/serve/__init__.py +0 -0
  88. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/serve/serve.py +0 -0
  89. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/serve/serve_cli.py +0 -0
  90. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/apis/systemd_units.py +0 -0
  91. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/backend.py +0 -0
  92. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/backends/__init__.py +0 -0
  93. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/backends/local.py +0 -0
  94. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/catalog.py +0 -0
  95. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/categories.py +0 -0
  96. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/__init__.py +0 -0
  97. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/chat_context.py +0 -0
  98. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/context_budget.py +0 -0
  99. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/chat_context/unbounded.py +0 -0
  100. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/__init__.py +0 -0
  101. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/__init__.py +0 -0
  102. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/model_meta.py +0 -0
  103. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/models_default.py +0 -0
  104. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/config/models/models_dict.py +0 -0
  105. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/contracts.py +0 -0
  106. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/__init__.py +0 -0
  107. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/dispatch/acquire.py +0 -0
  108. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/draft_models.py +0 -0
  109. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/engines.py +0 -0
  110. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/eviction.py +0 -0
  111. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/generate/__init__.py +0 -0
  112. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/gguf_election.py +0 -0
  113. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/__init__.py +0 -0
  114. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/__init__.py +0 -0
  115. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/__init__.py +0 -0
  116. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/__init__.py +0 -0
  117. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/config.py +0 -0
  118. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/constants.py +0 -0
  119. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/init_imports.py +0 -0
  120. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/imports/utils.py +0 -0
  121. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/runners/src/shard_server.py +0 -0
  122. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/llama/serve.py +0 -0
  123. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/manifest.py +0 -0
  124. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_classifier.py +0 -0
  125. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/model_index/client.py +0 -0
  126. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/name_match.py +0 -0
  127. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/__init__.py +0 -0
  128. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/build.py +0 -0
  129. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/fetch.py +0 -0
  130. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/native/resolve.py +0 -0
  131. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/output_repair.py +0 -0
  132. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/placement.py +0 -0
  133. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/py.typed +0 -0
  134. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/query.py +0 -0
  135. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/__init__.py +0 -0
  136. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/allocator.py +0 -0
  137. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/categories/__init__.py +0 -0
  138. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/categories/builders.py +0 -0
  139. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/categories/frameworks.py +0 -0
  140. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/device_placement.py +0 -0
  141. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/groups.py +0 -0
  142. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/model_dict_resolver.py +0 -0
  143. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/resolvers/model_resolver.py +0 -0
  144. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/routing_diagnostics.py +0 -0
  145. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/runtime.py +0 -0
  146. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/__init__.py +0 -0
  147. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/metadata_schemas.py +0 -0
  148. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/model_schemas.py +0 -0
  149. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/runner_schemas.py +0 -0
  150. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/schemas/task_schemas.py +0 -0
  151. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/__init__.py +0 -0
  152. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/chunksum_verify.py +0 -0
  153. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/hot_cache.py +0 -0
  154. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/model_cache.py +0 -0
  155. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/policy.py +0 -0
  156. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/serve.py +0 -0
  157. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/serve_cli.py +0 -0
  158. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/serve/supervisor.py +0 -0
  159. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/task_deps.py +0 -0
  160. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/tasks.py +0 -0
  161. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/utils/__init__.py +0 -0
  162. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/utils/json_scavenge.py +0 -0
  163. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/utils/no_think.py +0 -0
  164. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/__init__.py +0 -0
  165. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/chat_schemas.py +0 -0
  166. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/config_schemas.py +0 -0
  167. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/install_schemas.py +0 -0
  168. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/model_schemas.py +0 -0
  169. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/request_schemas.py +0 -0
  170. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine/wire/specs_schemas.py +0 -0
  171. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/dependency_links.txt +0 -0
  172. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/entry_points.txt +0 -0
  173. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/requires.txt +0 -0
  174. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/src/hugpy_engine.egg-info/top_level.txt +0 -0
  175. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_call_queue_contract.py +0 -0
  176. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_evict_fit_contract.py +0 -0
  177. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/known_good/test_model_format_contract.py +0 -0
  178. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_admission_gate_and_diagnostics.py +0 -0
  179. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_allocation_accuracy.py +0 -0
  180. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_budget_bar_spec.py +0 -0
  181. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_catalog_bridge.py +0 -0
  182. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chat_request_caller.py +0 -0
  183. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chat_role_alternation.py +0 -0
  184. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chat_tool_messages_schema.py +0 -0
  185. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_chunksum_verify.py +0 -0
  186. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_comms_foundations.py +0 -0
  187. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_ctx_fit.py +0 -0
  188. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_device_placement.py +0 -0
  189. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_engine_boundary.py +0 -0
  190. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_engine_persisted_resolve.py +0 -0
  191. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_eviction_flow.py +0 -0
  192. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_feasible_distribution_engine.py +0 -0
  193. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_gguf_election.py +0 -0
  194. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_gguf_sharded_effective.py +0 -0
  195. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_hot_cache.py +0 -0
  196. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_image_task_classification.py +0 -0
  197. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_import_policy.py +0 -0
  198. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_load_failure_reason.py +0 -0
  199. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_mmproj_effective_bytes.py +0 -0
  200. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_model_aliases.py +0 -0
  201. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_no_makeroom.py +0 -0
  202. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_no_think.py +0 -0
  203. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_peft_adapter_load.py +0 -0
  204. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_per_device_slot.py +0 -0
  205. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_per_request_alloc.py +0 -0
  206. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_placement_defaults.py +0 -0
  207. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_provision_failure_honesty.py +0 -0
  208. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_registry_attribution.py +0 -0
  209. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_registry_symmetry.py +0 -0
  210. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_resolve_routing_key_reconcile.py +0 -0
  211. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_runner_registry_heartbeat_starvation.py +0 -0
  212. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_load_stall_health.py +0 -0
  213. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_moe_vram_preflight.py +0 -0
  214. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_placement_projection.py +0 -0
  215. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_port_guard.py +0 -0
  216. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_slot_relaunch.py +0 -0
  217. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_spill_vision_fit.py +0 -0
  218. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_tasks_registry.py +0 -0
  219. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_tok_s_plausible_ceiling.py +0 -0
  220. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_transformers_placement.py +0 -0
  221. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_video_model_classification.py +0 -0
  222. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_vision_needs_slot.py +0 -0
  223. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_vram_cliff.py +0 -0
  224. {hugpy_engine-0.2.4 → hugpy_engine-0.2.6}/tests/test_worker_error_attribution.py +0 -0
  225. {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.4
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
- return assure_model_key(model_key)
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
- if changed:
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
- stamp = os.stat(_WORKER_CATALOG_PATH).st_mtime_ns
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
- with open(_WORKER_CATALOG_PATH, encoding="utf-8") as fh:
1647
- data = json.load(fh)
1648
- except (OSError, ValueError):
1649
- return
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 ErrorEvent(request_id=rid,
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
- return dropped or heavy
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
+ ]