hud-python 0.4.45__py3-none-any.whl → 0.5.1__py3-none-any.whl
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.
- hud/__init__.py +27 -7
- hud/agents/__init__.py +11 -5
- hud/agents/base.py +220 -500
- hud/agents/claude.py +200 -240
- hud/agents/gemini.py +275 -0
- hud/agents/gemini_cua.py +335 -0
- hud/agents/grounded_openai.py +98 -100
- hud/agents/misc/integration_test_agent.py +51 -20
- hud/agents/misc/response_agent.py +41 -36
- hud/agents/openai.py +291 -292
- hud/agents/{openai_chat_generic.py → openai_chat.py} +80 -34
- hud/agents/operator.py +211 -0
- hud/agents/tests/conftest.py +133 -0
- hud/agents/tests/test_base.py +300 -622
- hud/agents/tests/test_base_runtime.py +233 -0
- hud/agents/tests/test_claude.py +379 -210
- hud/agents/tests/test_client.py +9 -10
- hud/agents/tests/test_gemini.py +369 -0
- hud/agents/tests/test_grounded_openai_agent.py +65 -50
- hud/agents/tests/test_openai.py +376 -140
- hud/agents/tests/test_operator.py +362 -0
- hud/agents/tests/test_run_eval.py +179 -0
- hud/cli/__init__.py +461 -545
- hud/cli/analyze.py +43 -5
- hud/cli/build.py +664 -110
- hud/cli/debug.py +8 -5
- hud/cli/dev.py +882 -734
- hud/cli/eval.py +782 -668
- hud/cli/flows/dev.py +167 -0
- hud/cli/flows/init.py +191 -0
- hud/cli/flows/tasks.py +153 -56
- hud/cli/flows/templates.py +151 -0
- hud/cli/flows/tests/__init__.py +1 -0
- hud/cli/flows/tests/test_dev.py +126 -0
- hud/cli/init.py +60 -58
- hud/cli/push.py +29 -11
- hud/cli/rft.py +311 -0
- hud/cli/rft_status.py +145 -0
- hud/cli/tests/test_analyze.py +5 -5
- hud/cli/tests/test_analyze_metadata.py +3 -2
- hud/cli/tests/test_analyze_module.py +120 -0
- hud/cli/tests/test_build.py +108 -6
- hud/cli/tests/test_build_failure.py +41 -0
- hud/cli/tests/test_build_module.py +50 -0
- hud/cli/tests/test_cli_init.py +6 -1
- hud/cli/tests/test_cli_more_wrappers.py +30 -0
- hud/cli/tests/test_cli_root.py +140 -0
- hud/cli/tests/test_convert.py +361 -0
- hud/cli/tests/test_debug.py +12 -10
- hud/cli/tests/test_dev.py +197 -0
- hud/cli/tests/test_eval.py +251 -0
- hud/cli/tests/test_eval_bedrock.py +51 -0
- hud/cli/tests/test_init.py +124 -0
- hud/cli/tests/test_main_module.py +11 -5
- hud/cli/tests/test_mcp_server.py +12 -100
- hud/cli/tests/test_push_happy.py +74 -0
- hud/cli/tests/test_push_wrapper.py +23 -0
- hud/cli/tests/test_registry.py +1 -1
- hud/cli/tests/test_utils.py +1 -1
- hud/cli/{rl → utils}/celebrate.py +14 -12
- hud/cli/utils/config.py +18 -1
- hud/cli/utils/docker.py +130 -4
- hud/cli/utils/env_check.py +9 -9
- hud/cli/utils/git.py +136 -0
- hud/cli/utils/interactive.py +39 -5
- hud/cli/utils/metadata.py +69 -0
- hud/cli/utils/runner.py +1 -1
- hud/cli/utils/server.py +2 -2
- hud/cli/utils/source_hash.py +3 -3
- hud/cli/utils/tasks.py +4 -1
- hud/cli/utils/tests/__init__.py +0 -0
- hud/cli/utils/tests/test_config.py +58 -0
- hud/cli/utils/tests/test_docker.py +93 -0
- hud/cli/utils/tests/test_docker_hints.py +71 -0
- hud/cli/utils/tests/test_env_check.py +74 -0
- hud/cli/utils/tests/test_environment.py +42 -0
- hud/cli/utils/tests/test_git.py +142 -0
- hud/cli/utils/tests/test_interactive_module.py +60 -0
- hud/cli/utils/tests/test_local_runner.py +50 -0
- hud/cli/utils/tests/test_logging_utils.py +23 -0
- hud/cli/utils/tests/test_metadata.py +49 -0
- hud/cli/utils/tests/test_package_runner.py +35 -0
- hud/cli/utils/tests/test_registry_utils.py +49 -0
- hud/cli/utils/tests/test_remote_runner.py +25 -0
- hud/cli/utils/tests/test_runner_modules.py +52 -0
- hud/cli/utils/tests/test_source_hash.py +36 -0
- hud/cli/utils/tests/test_tasks.py +80 -0
- hud/cli/utils/version_check.py +258 -0
- hud/cli/{rl → utils}/viewer.py +2 -2
- hud/clients/README.md +12 -11
- hud/clients/__init__.py +4 -3
- hud/clients/base.py +166 -26
- hud/clients/environment.py +51 -0
- hud/clients/fastmcp.py +13 -6
- hud/clients/mcp_use.py +40 -15
- hud/clients/tests/test_analyze_scenarios.py +206 -0
- hud/clients/tests/test_protocol.py +9 -3
- hud/datasets/__init__.py +23 -20
- hud/datasets/loader.py +327 -0
- hud/datasets/runner.py +192 -105
- hud/datasets/tests/__init__.py +0 -0
- hud/datasets/tests/test_loader.py +221 -0
- hud/datasets/tests/test_utils.py +315 -0
- hud/datasets/utils.py +270 -90
- hud/environment/__init__.py +50 -0
- hud/environment/connection.py +206 -0
- hud/environment/connectors/__init__.py +33 -0
- hud/environment/connectors/base.py +68 -0
- hud/environment/connectors/local.py +177 -0
- hud/environment/connectors/mcp_config.py +109 -0
- hud/environment/connectors/openai.py +101 -0
- hud/environment/connectors/remote.py +172 -0
- hud/environment/environment.py +694 -0
- hud/environment/integrations/__init__.py +45 -0
- hud/environment/integrations/adk.py +67 -0
- hud/environment/integrations/anthropic.py +196 -0
- hud/environment/integrations/gemini.py +92 -0
- hud/environment/integrations/langchain.py +82 -0
- hud/environment/integrations/llamaindex.py +68 -0
- hud/environment/integrations/openai.py +238 -0
- hud/environment/mock.py +306 -0
- hud/environment/router.py +112 -0
- hud/environment/scenarios.py +493 -0
- hud/environment/tests/__init__.py +1 -0
- hud/environment/tests/test_connection.py +317 -0
- hud/environment/tests/test_connectors.py +218 -0
- hud/environment/tests/test_environment.py +161 -0
- hud/environment/tests/test_integrations.py +257 -0
- hud/environment/tests/test_local_connectors.py +201 -0
- hud/environment/tests/test_scenarios.py +280 -0
- hud/environment/tests/test_tools.py +208 -0
- hud/environment/types.py +23 -0
- hud/environment/utils/__init__.py +35 -0
- hud/environment/utils/formats.py +215 -0
- hud/environment/utils/schema.py +171 -0
- hud/environment/utils/tool_wrappers.py +113 -0
- hud/eval/__init__.py +67 -0
- hud/eval/context.py +674 -0
- hud/eval/display.py +299 -0
- hud/eval/instrument.py +185 -0
- hud/eval/manager.py +466 -0
- hud/eval/parallel.py +268 -0
- hud/eval/task.py +340 -0
- hud/eval/tests/__init__.py +1 -0
- hud/eval/tests/test_context.py +178 -0
- hud/eval/tests/test_eval.py +210 -0
- hud/eval/tests/test_manager.py +152 -0
- hud/eval/tests/test_parallel.py +168 -0
- hud/eval/tests/test_task.py +145 -0
- hud/eval/types.py +63 -0
- hud/eval/utils.py +183 -0
- hud/patches/__init__.py +19 -0
- hud/patches/mcp_patches.py +151 -0
- hud/patches/warnings.py +54 -0
- hud/samples/browser.py +4 -4
- hud/server/__init__.py +2 -1
- hud/server/low_level.py +2 -1
- hud/server/router.py +164 -0
- hud/server/server.py +567 -80
- hud/server/tests/test_mcp_server_integration.py +11 -11
- hud/server/tests/test_mcp_server_more.py +1 -1
- hud/server/tests/test_server_extra.py +2 -0
- hud/settings.py +45 -3
- hud/shared/exceptions.py +36 -10
- hud/shared/hints.py +26 -1
- hud/shared/requests.py +15 -3
- hud/shared/tests/test_exceptions.py +40 -31
- hud/shared/tests/test_hints.py +167 -0
- hud/telemetry/__init__.py +20 -19
- hud/telemetry/exporter.py +201 -0
- hud/telemetry/instrument.py +158 -253
- hud/telemetry/tests/test_eval_telemetry.py +356 -0
- hud/telemetry/tests/test_exporter.py +258 -0
- hud/telemetry/tests/test_instrument.py +401 -0
- hud/tools/__init__.py +16 -2
- hud/tools/apply_patch.py +639 -0
- hud/tools/base.py +54 -4
- hud/tools/bash.py +2 -2
- hud/tools/computer/__init__.py +4 -0
- hud/tools/computer/anthropic.py +2 -2
- hud/tools/computer/gemini.py +385 -0
- hud/tools/computer/hud.py +23 -6
- hud/tools/computer/openai.py +20 -21
- hud/tools/computer/qwen.py +434 -0
- hud/tools/computer/settings.py +37 -0
- hud/tools/edit.py +3 -7
- hud/tools/executors/base.py +4 -2
- hud/tools/executors/pyautogui.py +1 -1
- hud/tools/grounding/grounded_tool.py +13 -18
- hud/tools/grounding/grounder.py +10 -31
- hud/tools/grounding/tests/test_grounded_tool.py +26 -44
- hud/tools/jupyter.py +330 -0
- hud/tools/playwright.py +18 -3
- hud/tools/shell.py +308 -0
- hud/tools/tests/test_apply_patch.py +718 -0
- hud/tools/tests/test_computer.py +4 -9
- hud/tools/tests/test_computer_actions.py +24 -2
- hud/tools/tests/test_jupyter_tool.py +181 -0
- hud/tools/tests/test_shell.py +596 -0
- hud/tools/tests/test_submit.py +85 -0
- hud/tools/tests/test_types.py +193 -0
- hud/tools/types.py +21 -1
- hud/types.py +167 -57
- hud/utils/__init__.py +2 -0
- hud/utils/env.py +67 -0
- hud/utils/hud_console.py +61 -3
- hud/utils/mcp.py +15 -58
- hud/utils/strict_schema.py +162 -0
- hud/utils/tests/test_init.py +1 -2
- hud/utils/tests/test_mcp.py +1 -28
- hud/utils/tests/test_pretty_errors.py +186 -0
- hud/utils/tests/test_tool_shorthand.py +154 -0
- hud/utils/tests/test_version.py +1 -1
- hud/utils/types.py +20 -0
- hud/version.py +1 -1
- hud_python-0.5.1.dist-info/METADATA +264 -0
- hud_python-0.5.1.dist-info/RECORD +299 -0
- {hud_python-0.4.45.dist-info → hud_python-0.5.1.dist-info}/WHEEL +1 -1
- hud/agents/langchain.py +0 -261
- hud/agents/lite_llm.py +0 -72
- hud/cli/rl/__init__.py +0 -180
- hud/cli/rl/config.py +0 -101
- hud/cli/rl/display.py +0 -133
- hud/cli/rl/gpu.py +0 -63
- hud/cli/rl/gpu_utils.py +0 -321
- hud/cli/rl/local_runner.py +0 -595
- hud/cli/rl/presets.py +0 -96
- hud/cli/rl/remote_runner.py +0 -463
- hud/cli/rl/rl_api.py +0 -150
- hud/cli/rl/vllm.py +0 -177
- hud/cli/rl/wait_utils.py +0 -89
- hud/datasets/parallel.py +0 -687
- hud/misc/__init__.py +0 -1
- hud/misc/claude_plays_pokemon.py +0 -292
- hud/otel/__init__.py +0 -35
- hud/otel/collector.py +0 -142
- hud/otel/config.py +0 -181
- hud/otel/context.py +0 -570
- hud/otel/exporters.py +0 -369
- hud/otel/instrumentation.py +0 -135
- hud/otel/processors.py +0 -121
- hud/otel/tests/__init__.py +0 -1
- hud/otel/tests/test_processors.py +0 -197
- hud/rl/README.md +0 -30
- hud/rl/__init__.py +0 -1
- hud/rl/actor.py +0 -176
- hud/rl/buffer.py +0 -405
- hud/rl/chat_template.jinja +0 -101
- hud/rl/config.py +0 -192
- hud/rl/distributed.py +0 -132
- hud/rl/learner.py +0 -637
- hud/rl/tests/__init__.py +0 -1
- hud/rl/tests/test_learner.py +0 -186
- hud/rl/train.py +0 -382
- hud/rl/types.py +0 -101
- hud/rl/utils/start_vllm_server.sh +0 -30
- hud/rl/utils.py +0 -524
- hud/rl/vllm_adapter.py +0 -143
- hud/telemetry/job.py +0 -352
- hud/telemetry/replay.py +0 -74
- hud/telemetry/tests/test_replay.py +0 -40
- hud/telemetry/tests/test_trace.py +0 -63
- hud/telemetry/trace.py +0 -158
- hud/utils/agent_factories.py +0 -86
- hud/utils/async_utils.py +0 -65
- hud/utils/group_eval.py +0 -223
- hud/utils/progress.py +0 -149
- hud/utils/tasks.py +0 -127
- hud/utils/tests/test_async_utils.py +0 -173
- hud/utils/tests/test_progress.py +0 -261
- hud_python-0.4.45.dist-info/METADATA +0 -552
- hud_python-0.4.45.dist-info/RECORD +0 -228
- {hud_python-0.4.45.dist-info → hud_python-0.5.1.dist-info}/entry_points.txt +0 -0
- {hud_python-0.4.45.dist-info → hud_python-0.5.1.dist-info}/licenses/LICENSE +0 -0
hud/rl/distributed.py
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"""Distributed training utilities for GRPO."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import os
|
|
6
|
-
from datetime import timedelta
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
import torch
|
|
10
|
-
import torch.distributed as dist
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def setup_distributed() -> None:
|
|
14
|
-
"""Initialize distributed training environment."""
|
|
15
|
-
if "RANK" in os.environ and int(os.environ["WORLD_SIZE"]) > 1:
|
|
16
|
-
# Set device for this process
|
|
17
|
-
local_rank = int(os.environ["LOCAL_RANK"])
|
|
18
|
-
torch.cuda.set_device(local_rank)
|
|
19
|
-
|
|
20
|
-
# Initialize process group
|
|
21
|
-
# Increase watchdog timeout to accommodate long eval/sampling phases
|
|
22
|
-
# and enable clearer NCCL error handling.
|
|
23
|
-
os.environ.setdefault("TORCH_NCCL_ASYNC_ERROR_HANDLING", "1")
|
|
24
|
-
dist.init_process_group("nccl", timeout=timedelta(minutes=20))
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def get_local_rank() -> int:
|
|
28
|
-
"""Get local rank from environment."""
|
|
29
|
-
return int(os.environ.get("LOCAL_RANK", 0))
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def get_global_rank() -> int:
|
|
33
|
-
"""Get global rank from environment."""
|
|
34
|
-
return int(os.environ.get("RANK", 0))
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def get_world_size() -> int:
|
|
38
|
-
"""Get world size from environment."""
|
|
39
|
-
return int(os.environ.get("WORLD_SIZE", 1))
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def cleanup_distributed() -> None:
|
|
43
|
-
"""Clean up distributed environment."""
|
|
44
|
-
if dist.is_initialized():
|
|
45
|
-
dist.destroy_process_group()
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def is_main_process() -> bool:
|
|
49
|
-
"""Check if this is the main process (rank 0)."""
|
|
50
|
-
if not dist.is_initialized():
|
|
51
|
-
return True
|
|
52
|
-
return dist.get_rank() == 0
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def synchronize() -> None:
|
|
56
|
-
"""Synchronize all processes."""
|
|
57
|
-
if dist.is_initialized():
|
|
58
|
-
dist.barrier()
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def all_reduce_mean(tensor: torch.Tensor) -> torch.Tensor:
|
|
62
|
-
"""Average a tensor across all processes."""
|
|
63
|
-
if not dist.is_initialized():
|
|
64
|
-
return tensor
|
|
65
|
-
|
|
66
|
-
world_size = dist.get_world_size()
|
|
67
|
-
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)
|
|
68
|
-
tensor /= world_size
|
|
69
|
-
return tensor
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def broadcast_object(obj: Any, src: int = 0) -> Any:
|
|
73
|
-
"""Broadcast a Python object from src rank to all ranks.
|
|
74
|
-
|
|
75
|
-
Args:
|
|
76
|
-
obj: Object to broadcast (used on src rank)
|
|
77
|
-
src: Source rank
|
|
78
|
-
device: Device for temporary tensor buffer during pickling transfer
|
|
79
|
-
"""
|
|
80
|
-
if not dist.is_initialized():
|
|
81
|
-
return obj
|
|
82
|
-
|
|
83
|
-
obj_list = [obj] if dist.get_rank() == src else [None]
|
|
84
|
-
dist.broadcast_object_list(obj_list, src=src, device=torch.device("cpu"))
|
|
85
|
-
return obj_list[0]
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def scatter_object(
|
|
89
|
-
obj_list: list[Any] | None,
|
|
90
|
-
src: int = 0,
|
|
91
|
-
) -> Any:
|
|
92
|
-
"""Scatter a list of Python objects from src so each rank receives one object.
|
|
93
|
-
|
|
94
|
-
Usage:
|
|
95
|
-
- On src rank: pass the full list (length == world_size)
|
|
96
|
-
- On non-src ranks: pass None
|
|
97
|
-
|
|
98
|
-
Returns:
|
|
99
|
-
The object intended for this rank.
|
|
100
|
-
"""
|
|
101
|
-
if not dist.is_initialized():
|
|
102
|
-
# Single-process: return first element if provided, else None
|
|
103
|
-
if obj_list is None or len(obj_list) == 0:
|
|
104
|
-
return None
|
|
105
|
-
return obj_list[0]
|
|
106
|
-
|
|
107
|
-
out: list[Any] = [None]
|
|
108
|
-
if dist.get_rank() == src:
|
|
109
|
-
dist.scatter_object_list(out, obj_list, src=src)
|
|
110
|
-
else:
|
|
111
|
-
dist.scatter_object_list(out, None, src=src)
|
|
112
|
-
return out[0]
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def gather_tensors(tensor: torch.Tensor) -> list[torch.Tensor] | None:
|
|
116
|
-
"""Gather tensors from all ranks to rank 0.
|
|
117
|
-
|
|
118
|
-
Returns:
|
|
119
|
-
List of tensors on rank 0, None on other ranks
|
|
120
|
-
"""
|
|
121
|
-
if not dist.is_initialized():
|
|
122
|
-
return [tensor]
|
|
123
|
-
|
|
124
|
-
world_size = dist.get_world_size()
|
|
125
|
-
|
|
126
|
-
if dist.get_rank() == 0:
|
|
127
|
-
gathered = [torch.zeros_like(tensor) for _ in range(world_size)]
|
|
128
|
-
dist.gather(tensor, gathered, dst=0)
|
|
129
|
-
return gathered
|
|
130
|
-
else:
|
|
131
|
-
dist.gather(tensor, None, dst=0)
|
|
132
|
-
return None
|