hud-python 0.4.31__tar.gz → 0.4.32__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.

Potentially problematic release.


This version of hud-python might be problematic. Click here for more details.

Files changed (221) hide show
  1. {hud_python-0.4.31 → hud_python-0.4.32}/PKG-INFO +1 -1
  2. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/flows/tasks.py +81 -13
  3. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/push.py +1 -0
  4. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/remote_runner.py +77 -62
  5. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/test_version.py +1 -1
  6. {hud_python-0.4.31 → hud_python-0.4.32}/hud/version.py +1 -1
  7. {hud_python-0.4.31 → hud_python-0.4.32}/pyproject.toml +1 -1
  8. {hud_python-0.4.31 → hud_python-0.4.32}/.gitignore +0 -0
  9. {hud_python-0.4.31 → hud_python-0.4.32}/LICENSE +0 -0
  10. {hud_python-0.4.31 → hud_python-0.4.32}/README.md +0 -0
  11. {hud_python-0.4.31 → hud_python-0.4.32}/environments/README.md +0 -0
  12. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/README.md +0 -0
  13. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/apps/2048/README.md +0 -0
  14. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/apps/2048/backend/pyproject.toml +0 -0
  15. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/apps/README.md +0 -0
  16. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/apps/todo/README.md +0 -0
  17. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/apps/todo/backend/pyproject.toml +0 -0
  18. {hud_python-0.4.31 → hud_python-0.4.32}/environments/browser/pyproject.toml +0 -0
  19. {hud_python-0.4.31 → hud_python-0.4.32}/environments/remote_browser/README.md +0 -0
  20. {hud_python-0.4.31 → hud_python-0.4.32}/environments/remote_browser/pyproject.toml +0 -0
  21. {hud_python-0.4.31 → hud_python-0.4.32}/environments/remote_browser/src/hud_controller/providers/README.md +0 -0
  22. {hud_python-0.4.31 → hud_python-0.4.32}/environments/text_2048/README.md +0 -0
  23. {hud_python-0.4.31 → hud_python-0.4.32}/environments/text_2048/pyproject.toml +0 -0
  24. {hud_python-0.4.31 → hud_python-0.4.32}/examples/README.md +0 -0
  25. {hud_python-0.4.31 → hud_python-0.4.32}/hud/__init__.py +0 -0
  26. {hud_python-0.4.31 → hud_python-0.4.32}/hud/__main__.py +0 -0
  27. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/__init__.py +0 -0
  28. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/base.py +0 -0
  29. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/claude.py +0 -0
  30. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/grounded_openai.py +0 -0
  31. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/langchain.py +0 -0
  32. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/misc/__init__.py +0 -0
  33. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/misc/response_agent.py +0 -0
  34. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/openai.py +0 -0
  35. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/openai_chat_generic.py +0 -0
  36. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/tests/__init__.py +0 -0
  37. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/tests/test_base.py +0 -0
  38. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/tests/test_claude.py +0 -0
  39. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/tests/test_client.py +0 -0
  40. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/tests/test_grounded_openai_agent.py +0 -0
  41. {hud_python-0.4.31 → hud_python-0.4.32}/hud/agents/tests/test_openai.py +0 -0
  42. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/__init__.py +0 -0
  43. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/__main__.py +0 -0
  44. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/analyze.py +0 -0
  45. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/build.py +0 -0
  46. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/clone.py +0 -0
  47. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/debug.py +0 -0
  48. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/dev.py +0 -0
  49. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/eval.py +0 -0
  50. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/flows/__init__.py +0 -0
  51. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/get.py +0 -0
  52. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/init.py +0 -0
  53. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/list_func.py +0 -0
  54. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/pull.py +0 -0
  55. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/remove.py +0 -0
  56. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/__init__.py +0 -0
  57. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/config.py +0 -0
  58. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/display.py +0 -0
  59. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/gpu.py +0 -0
  60. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/gpu_utils.py +0 -0
  61. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/local_runner.py +0 -0
  62. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/presets.py +0 -0
  63. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/rl_api.py +0 -0
  64. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/rl/vllm.py +0 -0
  65. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/__init__.py +0 -0
  66. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_analyze.py +0 -0
  67. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_analyze_metadata.py +0 -0
  68. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_build.py +0 -0
  69. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_cli_init.py +0 -0
  70. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_cli_main.py +0 -0
  71. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_clone.py +0 -0
  72. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_cursor.py +0 -0
  73. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_debug.py +0 -0
  74. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_list_func.py +0 -0
  75. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_main_module.py +0 -0
  76. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_mcp_server.py +0 -0
  77. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_pull.py +0 -0
  78. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_push.py +0 -0
  79. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_registry.py +0 -0
  80. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/tests/test_utils.py +0 -0
  81. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/__init__.py +0 -0
  82. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/cursor.py +0 -0
  83. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/docker.py +0 -0
  84. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/environment.py +0 -0
  85. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/interactive.py +0 -0
  86. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/logging.py +0 -0
  87. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/metadata.py +0 -0
  88. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/registry.py +0 -0
  89. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/remote_runner.py +0 -0
  90. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/runner.py +0 -0
  91. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/server.py +0 -0
  92. {hud_python-0.4.31 → hud_python-0.4.32}/hud/cli/utils/tasks.py +0 -0
  93. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/README.md +0 -0
  94. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/__init__.py +0 -0
  95. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/base.py +0 -0
  96. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/fastmcp.py +0 -0
  97. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/mcp_use.py +0 -0
  98. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/tests/__init__.py +0 -0
  99. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/tests/test_client_integration.py +0 -0
  100. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/tests/test_fastmcp.py +0 -0
  101. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/tests/test_mcp_use_retry.py +0 -0
  102. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/tests/test_protocol.py +0 -0
  103. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/utils/__init__.py +0 -0
  104. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/utils/mcp_use_retry.py +0 -0
  105. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/utils/retry.py +0 -0
  106. {hud_python-0.4.31 → hud_python-0.4.32}/hud/clients/utils/retry_transport.py +0 -0
  107. {hud_python-0.4.31 → hud_python-0.4.32}/hud/datasets/__init__.py +0 -0
  108. {hud_python-0.4.31 → hud_python-0.4.32}/hud/datasets/parallel.py +0 -0
  109. {hud_python-0.4.31 → hud_python-0.4.32}/hud/datasets/runner.py +0 -0
  110. {hud_python-0.4.31 → hud_python-0.4.32}/hud/datasets/utils.py +0 -0
  111. {hud_python-0.4.31 → hud_python-0.4.32}/hud/misc/__init__.py +0 -0
  112. {hud_python-0.4.31 → hud_python-0.4.32}/hud/misc/claude_plays_pokemon.py +0 -0
  113. {hud_python-0.4.31 → hud_python-0.4.32}/hud/native/__init__.py +0 -0
  114. {hud_python-0.4.31 → hud_python-0.4.32}/hud/native/comparator.py +0 -0
  115. {hud_python-0.4.31 → hud_python-0.4.32}/hud/native/tests/__init__.py +0 -0
  116. {hud_python-0.4.31 → hud_python-0.4.32}/hud/native/tests/test_comparator.py +0 -0
  117. {hud_python-0.4.31 → hud_python-0.4.32}/hud/native/tests/test_native_init.py +0 -0
  118. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/__init__.py +0 -0
  119. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/collector.py +0 -0
  120. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/config.py +0 -0
  121. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/context.py +0 -0
  122. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/exporters.py +0 -0
  123. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/instrumentation.py +0 -0
  124. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/processors.py +0 -0
  125. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/tests/__init__.py +0 -0
  126. {hud_python-0.4.31 → hud_python-0.4.32}/hud/otel/tests/test_processors.py +0 -0
  127. {hud_python-0.4.31 → hud_python-0.4.32}/hud/py.typed +0 -0
  128. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/README.md +0 -0
  129. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/__init__.py +0 -0
  130. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/actor.py +0 -0
  131. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/buffer.py +0 -0
  132. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/chat_template.jinja +0 -0
  133. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/config.py +0 -0
  134. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/distributed.py +0 -0
  135. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/learner.py +0 -0
  136. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/tests/__init__.py +0 -0
  137. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/tests/test_learner.py +0 -0
  138. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/train.py +0 -0
  139. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/types.py +0 -0
  140. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/utils/start_vllm_server.sh +0 -0
  141. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/utils.py +0 -0
  142. {hud_python-0.4.31 → hud_python-0.4.32}/hud/rl/vllm_adapter.py +0 -0
  143. {hud_python-0.4.31 → hud_python-0.4.32}/hud/server/__init__.py +0 -0
  144. {hud_python-0.4.31 → hud_python-0.4.32}/hud/server/context.py +0 -0
  145. {hud_python-0.4.31 → hud_python-0.4.32}/hud/server/helper/__init__.py +0 -0
  146. {hud_python-0.4.31 → hud_python-0.4.32}/hud/server/low_level.py +0 -0
  147. {hud_python-0.4.31 → hud_python-0.4.32}/hud/server/server.py +0 -0
  148. {hud_python-0.4.31 → hud_python-0.4.32}/hud/server/tests/__init__.py +0 -0
  149. {hud_python-0.4.31 → hud_python-0.4.32}/hud/settings.py +0 -0
  150. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/__init__.py +0 -0
  151. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/exceptions.py +0 -0
  152. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/hints.py +0 -0
  153. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/requests.py +0 -0
  154. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/tests/__init__.py +0 -0
  155. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/tests/test_exceptions.py +0 -0
  156. {hud_python-0.4.31 → hud_python-0.4.32}/hud/shared/tests/test_requests.py +0 -0
  157. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/__init__.py +0 -0
  158. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/instrument.py +0 -0
  159. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/job.py +0 -0
  160. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/replay.py +0 -0
  161. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/tests/__init__.py +0 -0
  162. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/tests/test_replay.py +0 -0
  163. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/tests/test_trace.py +0 -0
  164. {hud_python-0.4.31 → hud_python-0.4.32}/hud/telemetry/trace.py +0 -0
  165. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/__init__.py +0 -0
  166. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/base.py +0 -0
  167. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/bash.py +0 -0
  168. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/computer/__init__.py +0 -0
  169. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/computer/anthropic.py +0 -0
  170. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/computer/hud.py +0 -0
  171. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/computer/openai.py +0 -0
  172. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/computer/settings.py +0 -0
  173. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/edit.py +0 -0
  174. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/__init__.py +0 -0
  175. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/base.py +0 -0
  176. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/pyautogui.py +0 -0
  177. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/tests/__init__.py +0 -0
  178. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/tests/test_base_executor.py +0 -0
  179. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/tests/test_pyautogui_executor.py +0 -0
  180. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/executors/xdo.py +0 -0
  181. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/grounding/__init__.py +0 -0
  182. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/grounding/config.py +0 -0
  183. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/grounding/grounded_tool.py +0 -0
  184. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/grounding/grounder.py +0 -0
  185. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/grounding/tests/__init__.py +0 -0
  186. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/grounding/tests/test_grounded_tool.py +0 -0
  187. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/playwright.py +0 -0
  188. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/response.py +0 -0
  189. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/submit.py +0 -0
  190. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/__init__.py +0 -0
  191. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_base.py +0 -0
  192. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_bash.py +0 -0
  193. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_bash_extended.py +0 -0
  194. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_computer.py +0 -0
  195. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_computer_actions.py +0 -0
  196. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_edit.py +0 -0
  197. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_init.py +0 -0
  198. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_playwright_tool.py +0 -0
  199. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_response.py +0 -0
  200. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_tools.py +0 -0
  201. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_tools_init.py +0 -0
  202. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/tests/test_utils.py +0 -0
  203. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/types.py +0 -0
  204. {hud_python-0.4.31 → hud_python-0.4.32}/hud/tools/utils.py +0 -0
  205. {hud_python-0.4.31 → hud_python-0.4.32}/hud/types.py +0 -0
  206. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/__init__.py +0 -0
  207. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/agent_factories.py +0 -0
  208. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/async_utils.py +0 -0
  209. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/group_eval.py +0 -0
  210. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/hud_console.py +0 -0
  211. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/mcp.py +0 -0
  212. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/pretty_errors.py +0 -0
  213. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/progress.py +0 -0
  214. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tasks.py +0 -0
  215. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/telemetry.py +0 -0
  216. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/__init__.py +0 -0
  217. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/test_async_utils.py +0 -0
  218. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/test_init.py +0 -0
  219. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/test_mcp.py +0 -0
  220. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/test_progress.py +0 -0
  221. {hud_python-0.4.31 → hud_python-0.4.32}/hud/utils/tests/test_telemetry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.4.31
3
+ Version: 0.4.32
4
4
  Summary: SDK for the HUD platform.
5
5
  Project-URL: Homepage, https://github.com/hud-evals/hud-python
6
6
  Project-URL: Bug Tracker, https://github.com/hud-evals/hud-python/issues
@@ -27,9 +27,27 @@ def _is_remote_url(url: str) -> bool:
27
27
 
28
28
 
29
29
  def _validate_tasks(tasks: list[Task]) -> bool:
30
- """Validate the tasks file."""
30
+ """Validate the tasks file: return True if tasks already reference a remote MCP URL.
31
+
32
+ A task is considered remote if any "url" field anywhere inside mcp_config
33
+ is a valid remote URL (e.g., https://mcp.hud.so/v3/mcp).
34
+ """
35
+ def _has_remote_url(obj: Any) -> bool:
36
+ if isinstance(obj, dict):
37
+ for k, v in obj.items():
38
+ if k == "url" and isinstance(v, str) and _is_remote_url(v):
39
+ return True
40
+ if _has_remote_url(v):
41
+ return True
42
+ elif isinstance(obj, list):
43
+ for item in obj:
44
+ if _has_remote_url(item):
45
+ return True
46
+ return False
47
+
31
48
  for task in tasks:
32
- if not task.mcp_config or (not _is_remote_url(task.mcp_config.get("url", ""))):
49
+ cfg = task.mcp_config or {}
50
+ if not _has_remote_url(cfg):
33
51
  return False
34
52
  return True
35
53
 
@@ -100,7 +118,7 @@ def _ensure_pushed(env_dir: Path, lock_data: dict[str, Any]) -> dict[str, Any]:
100
118
  require_docker_running()
101
119
 
102
120
  # If Docker or login is not configured, the push function will fail and halt.
103
- push_environment(str(env_dir))
121
+ push_environment(str(env_dir), yes=True)
104
122
 
105
123
  # Reload lock after push
106
124
  lock_path = env_dir / "hud.lock.yaml"
@@ -111,7 +129,21 @@ def _ensure_pushed(env_dir: Path, lock_data: dict[str, Any]) -> dict[str, Any]:
111
129
 
112
130
 
113
131
  def _derive_remote_image(lock_data: dict[str, Any]) -> str:
114
- """Derive org/name:tag from lock file image field for MCP header."""
132
+ """Derive org/name:tag from lock file for MCP header.
133
+
134
+ Preference order:
135
+ 1) lock_data["push"]["image_with_tag"] if present
136
+ 2) Derive from lock_data["image"] (may be a digest; falls back to latest)
137
+ """
138
+ push_info = lock_data.get("push", {}) if isinstance(lock_data, dict) else {}
139
+
140
+ # 1) Exact image_with_tag if present
141
+ pushed_with_tag = str(push_info.get("image_with_tag", "")).strip()
142
+ if pushed_with_tag:
143
+ name, tag = extract_name_and_tag(pushed_with_tag)
144
+ return f"{name}:{tag}"
145
+
146
+ # Base name always comes from lock_data.image to preserve org/repo
115
147
  image_ref = str(lock_data.get("image", "")).strip()
116
148
  if not image_ref:
117
149
  raise typer.Exit("Lock file missing image reference")
@@ -157,19 +189,55 @@ def convert_tasks_to_remote(tasks_file: str) -> str:
157
189
  # Derive remote image name org/name:tag
158
190
  remote_image = _derive_remote_image(lock_data)
159
191
 
192
+ # Helper to strip extra fields from tool calls
193
+ def _simplify_tool_call(tool: Any) -> Any:
194
+ def _one(x: Any) -> dict[str, Any]:
195
+ try:
196
+ data = x.model_dump() if hasattr(x, "model_dump") else dict(x)
197
+ except Exception:
198
+ try:
199
+ data = dict(x)
200
+ except Exception:
201
+ return {}
202
+ # Keep only name and arguments
203
+ name = data.get("name")
204
+ arguments = data.get("arguments", {})
205
+ return {"name": name, "arguments": arguments}
206
+
207
+ if tool is None:
208
+ return None
209
+ if isinstance(tool, list):
210
+ return [_one(x) for x in tool]
211
+ return _one(tool)
212
+
160
213
  # Convert to list[dict]
161
214
  tasks_payload: list[dict[str, Any]] = []
162
215
  for t in tasks:
163
- item = t.model_dump()
164
- item["mcp_config"] = {
165
- "hud": {
166
- "url": "https://mcp.hud.so/v3/mcp",
167
- "headers": {
168
- "Authorization": "Bearer ${HUD_API_KEY}",
169
- "Mcp-Image": remote_image,
170
- },
171
- }
216
+ item: dict[str, Any] = {
217
+ "prompt": t.prompt,
218
+ "mcp_config": {
219
+ "hud": {
220
+ "url": "https://mcp.hud.so/v3/mcp",
221
+ "headers": {
222
+ "Authorization": "Bearer ${HUD_API_KEY}",
223
+ "Mcp-Image": remote_image,
224
+ },
225
+ }
226
+ },
172
227
  }
228
+
229
+ # Optional fields, omit Nones
230
+ if t.setup_tool is not None:
231
+ item["setup_tool"] = _simplify_tool_call(t.setup_tool)
232
+ if t.evaluate_tool is not None:
233
+ item["evaluate_tool"] = _simplify_tool_call(t.evaluate_tool)
234
+ if t.agent_tools is not None:
235
+ item["agent_tools"] = t.agent_tools
236
+ if t.system_prompt is not None:
237
+ item["system_prompt"] = t.system_prompt
238
+ if t.metadata:
239
+ item["metadata"] = t.metadata
240
+
173
241
  tasks_payload.append(item)
174
242
 
175
243
  # Write new file: remote_<name>.json (always JSON array)
@@ -332,6 +332,7 @@ def push_environment(
332
332
  "source": local_image,
333
333
  "pushedAt": datetime.now(UTC).isoformat().replace("+00:00", "Z"),
334
334
  "registry": pushed_digest.split("/")[0] if "/" in pushed_digest else "docker.io",
335
+ "image_with_tag": image,
335
336
  }
336
337
 
337
338
  # Save updated lock file
@@ -10,6 +10,7 @@ import os
10
10
  import subprocess
11
11
  import time
12
12
  from pathlib import Path
13
+ import uuid
13
14
 
14
15
  from rich.console import Console
15
16
 
@@ -29,6 +30,43 @@ GPU_PRICING = {
29
30
  }
30
31
 
31
32
 
33
+ def ensure_vllm_deployed(model_name: str, gpu_type: str = "A100", timeout: int = 600) -> None:
34
+ """Deploy vLLM for a model if needed and wait until it's ready.
35
+
36
+ Args:
37
+ model_name: The name of the model to deploy vLLM for
38
+ gpu_type: GPU type to use for deployment (e.g., A100, H100)
39
+ timeout: Max seconds to wait for vLLM to be ready
40
+ """
41
+ # Check current model status
42
+ info = rl_api.get_model(model_name)
43
+ if info.vllm_url:
44
+ hud_console.success("vLLM server already running")
45
+ return
46
+
47
+ hud_console.info(f"Deploying vLLM server for {model_name}...")
48
+ rl_api.deploy_vllm(model_name, gpu_type=gpu_type)
49
+ hud_console.success("vLLM deployment started")
50
+
51
+ hud_console.info("Waiting for vLLM server to be ready...")
52
+ start_time = time.time()
53
+ with hud_console.progress() as progress:
54
+ progress.update(
55
+ "Checking deployment status (see live status on https://app.hud.so/models)"
56
+ )
57
+ while True:
58
+ if time.time() - start_time > timeout:
59
+ hud_console.error("Timeout waiting for vLLM deployment")
60
+ raise ValueError("vLLM deployment timeout")
61
+ info = rl_api.get_model(model_name)
62
+ if info.vllm_url or info.status == "ready":
63
+ hud_console.success(
64
+ f"vLLM server ready at http://rl.hud.so/v1/models/{model_name}/vllm"
65
+ )
66
+ break
67
+ time.sleep(5)
68
+
69
+
32
70
  def run_remote_training(
33
71
  tasks_file: str | None,
34
72
  model: str | None,
@@ -128,49 +166,55 @@ def run_remote_training(
128
166
  from rich.prompt import Prompt
129
167
 
130
168
  # Ask for model name
131
- default_name = model_type.split("/")[-1].lower()
169
+ base_default = model_type.split("/")[-1].lower()
170
+ default_name = base_default
171
+ existing_names = {m.name for m in active_models}
172
+ suffix = 1
173
+ while default_name in existing_names:
174
+ default_name = f"{base_default}-{suffix}"
175
+ suffix += 1
176
+
132
177
  hud_console.info(f"Enter model name (default: {default_name}):")
133
178
  model_name = Prompt.ask("Model name", default=default_name)
134
179
  model_name = model_name.replace("/", "-").lower()
135
180
 
136
- # Create the model
181
+ # Create the model with retry on name conflict
137
182
  hud_console.info(f"Creating model: {model_name}")
138
183
  try:
139
184
  rl_api.create_model(model_name, model_type)
140
185
  hud_console.success(f"Created model: {model_name}")
186
+ ensure_vllm_deployed(model_name, gpu_type="A100")
141
187
 
142
- # Deploy vLLM automatically
143
- hud_console.info(f"Deploying vLLM server for {model_name}...")
144
- rl_api.deploy_vllm(model_name, gpu_type="A100")
145
- hud_console.success("vLLM deployment started")
146
-
147
- # Wait for deployment
148
- hud_console.info("Waiting for vLLM server to be ready...")
149
- max_wait = 600 # 10 minutes
150
- start_time = time.time()
151
-
152
- with hud_console.progress() as progress:
153
- progress.update(
154
- "Checking deployment status (see live status on https://app.hud.so/models)"
155
- )
156
-
188
+ except Exception as e:
189
+ # If the name already exists, suggest a new name and prompt once
190
+ message = str(e)
191
+ if "already exists" in message or "409" in message:
192
+ alt_name = f"{model_name}-1"
193
+ i = 1
157
194
  while True:
158
- if time.time() - start_time > max_wait:
159
- hud_console.error("Timeout waiting for vLLM deployment")
160
- raise ValueError("vLLM deployment timeout")
161
-
162
- model_info = rl_api.get_model(model_name)
163
- if model_info.status == "ready":
164
- hud_console.success(
165
- f"vLLM server ready at http://rl.hud.so/v1/models/{model_name}/vllm"
166
- )
195
+ candidate = f"{model_name}-{str(uuid.uuid4())[:4]}"
196
+ if candidate not in existing_names:
197
+ alt_name = candidate
167
198
  break
168
-
169
- time.sleep(5)
170
-
171
- except Exception as e:
172
- hud_console.error(f"Failed to create model: {e}")
173
- raise
199
+ i += 1
200
+ hud_console.warning(
201
+ f"Model '{model_name}' exists. Suggesting '{alt_name}' instead."
202
+ )
203
+ try:
204
+ from rich.prompt import Prompt as _Prompt
205
+
206
+ chosen = _Prompt.ask("Use different name", default=alt_name)
207
+ chosen = chosen.replace("/", "-").lower()
208
+ rl_api.create_model(chosen, model_type)
209
+ hud_console.success(f"Created model: {chosen}")
210
+ model_name = chosen
211
+ ensure_vllm_deployed(model_name, gpu_type="A100")
212
+ except Exception as e2:
213
+ hud_console.error(f"Failed to create model: {e2}")
214
+ raise
215
+ else:
216
+ hud_console.error(f"Failed to create model: {e}")
217
+ raise
174
218
 
175
219
  else:
176
220
  # Existing model selected
@@ -194,36 +238,7 @@ def run_remote_training(
194
238
  return
195
239
 
196
240
  # Ensure vLLM is deployed
197
- if not model_info.vllm_url:
198
- hud_console.info(f"Deploying vLLM server for {model_name}...")
199
- rl_api.deploy_vllm(model_name, gpu_type="A100")
200
- hud_console.success("vLLM deployment started")
201
-
202
- # Wait for deployment
203
- hud_console.info("Waiting for vLLM server to be ready...")
204
- max_wait = 600 # 10 minutes
205
- start_time = time.time()
206
-
207
- with hud_console.progress() as progress:
208
- progress.update(
209
- "Checking deployment status (see live status on https://app.hud.so/models)"
210
- )
211
-
212
- while True:
213
- if time.time() - start_time > max_wait:
214
- hud_console.error("Timeout waiting for vLLM deployment")
215
- raise ValueError("vLLM deployment timeout")
216
-
217
- model_info = rl_api.get_model(model_name)
218
- if model_info.vllm_url:
219
- hud_console.success(
220
- f"vLLM server ready at http://rl.hud.so/v1/models/{model_name}/vllm"
221
- )
222
- break
223
-
224
- time.sleep(5)
225
- else:
226
- hud_console.success("vLLM server already running")
241
+ ensure_vllm_deployed(model_name, gpu_type="A100")
227
242
  except KeyboardInterrupt:
228
243
  hud_console.dim_info("Training cancelled", "")
229
244
  return
@@ -5,4 +5,4 @@ def test_import():
5
5
  """Test that the package can be imported."""
6
6
  import hud
7
7
 
8
- assert hud.__version__ == "0.4.31"
8
+ assert hud.__version__ == "0.4.32"
@@ -4,4 +4,4 @@ Version information for the HUD SDK.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- __version__ = "0.4.31"
7
+ __version__ = "0.4.32"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hud-python"
3
- version = "0.4.31"
3
+ version = "0.4.32"
4
4
  description = "SDK for the HUD platform."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11, <3.13"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes