hud-python 0.4.1__py3-none-any.whl → 0.4.3__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.
Potentially problematic release.
This version of hud-python might be problematic. Click here for more details.
- hud/__init__.py +22 -22
- hud/agents/__init__.py +13 -15
- hud/agents/base.py +599 -599
- hud/agents/claude.py +373 -373
- hud/agents/langchain.py +261 -250
- hud/agents/misc/__init__.py +7 -7
- hud/agents/misc/response_agent.py +82 -80
- hud/agents/openai.py +352 -352
- hud/agents/openai_chat_generic.py +154 -154
- hud/agents/tests/__init__.py +1 -1
- hud/agents/tests/test_base.py +742 -742
- hud/agents/tests/test_claude.py +324 -324
- hud/agents/tests/test_client.py +363 -363
- hud/agents/tests/test_openai.py +237 -237
- hud/cli/__init__.py +617 -617
- hud/cli/__main__.py +8 -8
- hud/cli/analyze.py +371 -371
- hud/cli/analyze_metadata.py +230 -230
- hud/cli/build.py +498 -427
- hud/cli/clone.py +185 -185
- hud/cli/cursor.py +92 -92
- hud/cli/debug.py +392 -392
- hud/cli/docker_utils.py +83 -83
- hud/cli/init.py +280 -281
- hud/cli/interactive.py +353 -353
- hud/cli/mcp_server.py +764 -756
- hud/cli/pull.py +330 -336
- hud/cli/push.py +404 -370
- hud/cli/remote_runner.py +311 -311
- hud/cli/runner.py +160 -160
- hud/cli/tests/__init__.py +3 -3
- hud/cli/tests/test_analyze.py +284 -284
- hud/cli/tests/test_cli_init.py +265 -265
- hud/cli/tests/test_cli_main.py +27 -27
- hud/cli/tests/test_clone.py +142 -142
- hud/cli/tests/test_cursor.py +253 -253
- hud/cli/tests/test_debug.py +453 -453
- hud/cli/tests/test_mcp_server.py +139 -139
- hud/cli/tests/test_utils.py +388 -388
- hud/cli/utils.py +263 -263
- hud/clients/README.md +143 -143
- hud/clients/__init__.py +16 -16
- hud/clients/base.py +378 -379
- hud/clients/fastmcp.py +222 -222
- hud/clients/mcp_use.py +298 -278
- hud/clients/tests/__init__.py +1 -1
- hud/clients/tests/test_client_integration.py +111 -111
- hud/clients/tests/test_fastmcp.py +342 -342
- hud/clients/tests/test_protocol.py +188 -188
- hud/clients/utils/__init__.py +1 -1
- hud/clients/utils/retry_transport.py +160 -160
- hud/datasets.py +327 -322
- hud/misc/__init__.py +1 -1
- hud/misc/claude_plays_pokemon.py +292 -292
- hud/otel/__init__.py +35 -35
- hud/otel/collector.py +142 -142
- hud/otel/config.py +164 -164
- hud/otel/context.py +536 -536
- hud/otel/exporters.py +366 -366
- hud/otel/instrumentation.py +97 -97
- hud/otel/processors.py +118 -118
- hud/otel/tests/__init__.py +1 -1
- hud/otel/tests/test_processors.py +197 -197
- hud/server/__init__.py +5 -5
- hud/server/context.py +114 -114
- hud/server/helper/__init__.py +5 -5
- hud/server/low_level.py +132 -132
- hud/server/server.py +170 -166
- hud/server/tests/__init__.py +3 -3
- hud/settings.py +73 -73
- hud/shared/__init__.py +5 -5
- hud/shared/exceptions.py +180 -180
- hud/shared/requests.py +264 -264
- hud/shared/tests/test_exceptions.py +157 -157
- hud/shared/tests/test_requests.py +275 -275
- hud/telemetry/__init__.py +25 -25
- hud/telemetry/instrument.py +379 -379
- hud/telemetry/job.py +309 -309
- hud/telemetry/replay.py +74 -74
- hud/telemetry/trace.py +83 -83
- hud/tools/__init__.py +33 -33
- hud/tools/base.py +365 -365
- hud/tools/bash.py +161 -161
- hud/tools/computer/__init__.py +15 -15
- hud/tools/computer/anthropic.py +437 -437
- hud/tools/computer/hud.py +376 -376
- hud/tools/computer/openai.py +295 -295
- hud/tools/computer/settings.py +82 -82
- hud/tools/edit.py +314 -314
- hud/tools/executors/__init__.py +30 -30
- hud/tools/executors/base.py +539 -539
- hud/tools/executors/pyautogui.py +621 -621
- hud/tools/executors/tests/__init__.py +1 -1
- hud/tools/executors/tests/test_base_executor.py +338 -338
- hud/tools/executors/tests/test_pyautogui_executor.py +165 -165
- hud/tools/executors/xdo.py +511 -511
- hud/tools/playwright.py +412 -412
- hud/tools/tests/__init__.py +3 -3
- hud/tools/tests/test_base.py +282 -282
- hud/tools/tests/test_bash.py +158 -158
- hud/tools/tests/test_bash_extended.py +197 -197
- hud/tools/tests/test_computer.py +425 -425
- hud/tools/tests/test_computer_actions.py +34 -34
- hud/tools/tests/test_edit.py +259 -259
- hud/tools/tests/test_init.py +27 -27
- hud/tools/tests/test_playwright_tool.py +183 -183
- hud/tools/tests/test_tools.py +145 -145
- hud/tools/tests/test_utils.py +156 -156
- hud/tools/types.py +72 -72
- hud/tools/utils.py +50 -50
- hud/types.py +136 -136
- hud/utils/__init__.py +10 -10
- hud/utils/async_utils.py +65 -65
- hud/utils/design.py +236 -168
- hud/utils/mcp.py +55 -55
- hud/utils/progress.py +149 -149
- hud/utils/telemetry.py +66 -66
- hud/utils/tests/test_async_utils.py +173 -173
- hud/utils/tests/test_init.py +17 -17
- hud/utils/tests/test_progress.py +261 -261
- hud/utils/tests/test_telemetry.py +82 -82
- hud/utils/tests/test_version.py +8 -8
- hud/version.py +7 -7
- {hud_python-0.4.1.dist-info → hud_python-0.4.3.dist-info}/METADATA +10 -8
- hud_python-0.4.3.dist-info/RECORD +131 -0
- {hud_python-0.4.1.dist-info → hud_python-0.4.3.dist-info}/licenses/LICENSE +21 -21
- hud/agents/art.py +0 -101
- hud_python-0.4.1.dist-info/RECORD +0 -132
- {hud_python-0.4.1.dist-info → hud_python-0.4.3.dist-info}/WHEEL +0 -0
- {hud_python-0.4.1.dist-info → hud_python-0.4.3.dist-info}/entry_points.txt +0 -0
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
"""Integration tests for MCP clients."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import pytest
|
|
6
|
-
|
|
7
|
-
from hud.clients import FastMCPHUDClient
|
|
8
|
-
from hud.clients.base import AgentMCPClient
|
|
9
|
-
from hud.clients.mcp_use import MCPUseHUDClient
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TestClientIntegration:
|
|
13
|
-
"""Test that clients work with real configurations."""
|
|
14
|
-
|
|
15
|
-
def test_fastmcp_client_creation(self):
|
|
16
|
-
"""Test that FastMCP client can be created with various configs."""
|
|
17
|
-
# HTTP config
|
|
18
|
-
config = {"server": {"url": "http://localhost:8080"}}
|
|
19
|
-
client = FastMCPHUDClient(config)
|
|
20
|
-
assert isinstance(client, AgentMCPClient)
|
|
21
|
-
assert client.is_connected is False
|
|
22
|
-
|
|
23
|
-
# Stdio config
|
|
24
|
-
config = {"server": {"command": "python", "args": ["server.py"]}}
|
|
25
|
-
client = FastMCPHUDClient(config)
|
|
26
|
-
assert isinstance(client, AgentMCPClient)
|
|
27
|
-
|
|
28
|
-
# Multi-server config
|
|
29
|
-
config = {
|
|
30
|
-
"server1": {"url": "http://localhost:8080"},
|
|
31
|
-
"server2": {"command": "python", "args": ["server.py"]},
|
|
32
|
-
}
|
|
33
|
-
client = FastMCPHUDClient(config)
|
|
34
|
-
assert isinstance(client, AgentMCPClient)
|
|
35
|
-
|
|
36
|
-
def test_mcp_use_client_creation(self):
|
|
37
|
-
"""Test that MCP-use client can be created with various configs."""
|
|
38
|
-
# HTTP config
|
|
39
|
-
config = {"server": {"url": "http://localhost:8080"}}
|
|
40
|
-
client = MCPUseHUDClient(config)
|
|
41
|
-
assert isinstance(client, AgentMCPClient)
|
|
42
|
-
assert client.is_connected is False
|
|
43
|
-
|
|
44
|
-
# Stdio config
|
|
45
|
-
config = {"server": {"command": "python", "args": ["server.py"]}}
|
|
46
|
-
client = MCPUseHUDClient(config)
|
|
47
|
-
assert isinstance(client, AgentMCPClient)
|
|
48
|
-
|
|
49
|
-
# Multi-server config
|
|
50
|
-
config = {
|
|
51
|
-
"server1": {"url": "http://localhost:8080"},
|
|
52
|
-
"server2": {"command": "python", "args": ["server.py"]},
|
|
53
|
-
}
|
|
54
|
-
client = MCPUseHUDClient(config)
|
|
55
|
-
assert isinstance(client, AgentMCPClient)
|
|
56
|
-
|
|
57
|
-
def test_client_switching(self):
|
|
58
|
-
"""Test that clients can be switched without changing agent code."""
|
|
59
|
-
config = {"server": {"url": "http://localhost:8080"}}
|
|
60
|
-
|
|
61
|
-
# Both clients should satisfy the protocol
|
|
62
|
-
fastmcp_client = FastMCPHUDClient(config)
|
|
63
|
-
mcp_use_client = MCPUseHUDClient(config)
|
|
64
|
-
|
|
65
|
-
# Both implement the same protocol
|
|
66
|
-
assert isinstance(fastmcp_client, AgentMCPClient)
|
|
67
|
-
assert isinstance(mcp_use_client, AgentMCPClient)
|
|
68
|
-
|
|
69
|
-
# Both have the same essential methods
|
|
70
|
-
for method in ["initialize", "list_tools", "call_tool"]:
|
|
71
|
-
assert hasattr(fastmcp_client, method)
|
|
72
|
-
assert hasattr(mcp_use_client, method)
|
|
73
|
-
assert callable(getattr(fastmcp_client, method))
|
|
74
|
-
assert callable(getattr(mcp_use_client, method))
|
|
75
|
-
|
|
76
|
-
@pytest.mark.asyncio
|
|
77
|
-
async def test_context_manager_usage(self):
|
|
78
|
-
"""Test that both clients work as context managers."""
|
|
79
|
-
from unittest.mock import AsyncMock, patch
|
|
80
|
-
|
|
81
|
-
config = {"server": {"url": "http://localhost:8080"}}
|
|
82
|
-
|
|
83
|
-
# Test FastMCP client with mocked initialization
|
|
84
|
-
fastmcp_client = FastMCPHUDClient(config)
|
|
85
|
-
assert not fastmcp_client.is_connected
|
|
86
|
-
|
|
87
|
-
with (
|
|
88
|
-
patch.object(fastmcp_client, "initialize", new_callable=AsyncMock) as mock_init,
|
|
89
|
-
patch.object(fastmcp_client, "shutdown", new_callable=AsyncMock) as mock_shutdown,
|
|
90
|
-
):
|
|
91
|
-
async with fastmcp_client:
|
|
92
|
-
# Verify initialization was called
|
|
93
|
-
mock_init.assert_called_once()
|
|
94
|
-
|
|
95
|
-
# Verify shutdown was called
|
|
96
|
-
mock_shutdown.assert_called_once()
|
|
97
|
-
|
|
98
|
-
# Test MCP-use client with mocked initialization
|
|
99
|
-
mcp_use_client = MCPUseHUDClient(config)
|
|
100
|
-
assert not mcp_use_client.is_connected
|
|
101
|
-
|
|
102
|
-
with (
|
|
103
|
-
patch.object(mcp_use_client, "initialize", new_callable=AsyncMock) as mock_init,
|
|
104
|
-
patch.object(mcp_use_client, "shutdown", new_callable=AsyncMock) as mock_shutdown,
|
|
105
|
-
):
|
|
106
|
-
async with mcp_use_client:
|
|
107
|
-
# Verify initialization was called
|
|
108
|
-
mock_init.assert_called_once()
|
|
109
|
-
|
|
110
|
-
# Verify shutdown was called
|
|
111
|
-
mock_shutdown.assert_called_once()
|
|
1
|
+
"""Integration tests for MCP clients."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from hud.clients import FastMCPHUDClient
|
|
8
|
+
from hud.clients.base import AgentMCPClient
|
|
9
|
+
from hud.clients.mcp_use import MCPUseHUDClient
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TestClientIntegration:
|
|
13
|
+
"""Test that clients work with real configurations."""
|
|
14
|
+
|
|
15
|
+
def test_fastmcp_client_creation(self):
|
|
16
|
+
"""Test that FastMCP client can be created with various configs."""
|
|
17
|
+
# HTTP config
|
|
18
|
+
config = {"server": {"url": "http://localhost:8080"}}
|
|
19
|
+
client = FastMCPHUDClient(config)
|
|
20
|
+
assert isinstance(client, AgentMCPClient)
|
|
21
|
+
assert client.is_connected is False
|
|
22
|
+
|
|
23
|
+
# Stdio config
|
|
24
|
+
config = {"server": {"command": "python", "args": ["server.py"]}}
|
|
25
|
+
client = FastMCPHUDClient(config)
|
|
26
|
+
assert isinstance(client, AgentMCPClient)
|
|
27
|
+
|
|
28
|
+
# Multi-server config
|
|
29
|
+
config = {
|
|
30
|
+
"server1": {"url": "http://localhost:8080"},
|
|
31
|
+
"server2": {"command": "python", "args": ["server.py"]},
|
|
32
|
+
}
|
|
33
|
+
client = FastMCPHUDClient(config)
|
|
34
|
+
assert isinstance(client, AgentMCPClient)
|
|
35
|
+
|
|
36
|
+
def test_mcp_use_client_creation(self):
|
|
37
|
+
"""Test that MCP-use client can be created with various configs."""
|
|
38
|
+
# HTTP config
|
|
39
|
+
config = {"server": {"url": "http://localhost:8080"}}
|
|
40
|
+
client = MCPUseHUDClient(config)
|
|
41
|
+
assert isinstance(client, AgentMCPClient)
|
|
42
|
+
assert client.is_connected is False
|
|
43
|
+
|
|
44
|
+
# Stdio config
|
|
45
|
+
config = {"server": {"command": "python", "args": ["server.py"]}}
|
|
46
|
+
client = MCPUseHUDClient(config)
|
|
47
|
+
assert isinstance(client, AgentMCPClient)
|
|
48
|
+
|
|
49
|
+
# Multi-server config
|
|
50
|
+
config = {
|
|
51
|
+
"server1": {"url": "http://localhost:8080"},
|
|
52
|
+
"server2": {"command": "python", "args": ["server.py"]},
|
|
53
|
+
}
|
|
54
|
+
client = MCPUseHUDClient(config)
|
|
55
|
+
assert isinstance(client, AgentMCPClient)
|
|
56
|
+
|
|
57
|
+
def test_client_switching(self):
|
|
58
|
+
"""Test that clients can be switched without changing agent code."""
|
|
59
|
+
config = {"server": {"url": "http://localhost:8080"}}
|
|
60
|
+
|
|
61
|
+
# Both clients should satisfy the protocol
|
|
62
|
+
fastmcp_client = FastMCPHUDClient(config)
|
|
63
|
+
mcp_use_client = MCPUseHUDClient(config)
|
|
64
|
+
|
|
65
|
+
# Both implement the same protocol
|
|
66
|
+
assert isinstance(fastmcp_client, AgentMCPClient)
|
|
67
|
+
assert isinstance(mcp_use_client, AgentMCPClient)
|
|
68
|
+
|
|
69
|
+
# Both have the same essential methods
|
|
70
|
+
for method in ["initialize", "list_tools", "call_tool"]:
|
|
71
|
+
assert hasattr(fastmcp_client, method)
|
|
72
|
+
assert hasattr(mcp_use_client, method)
|
|
73
|
+
assert callable(getattr(fastmcp_client, method))
|
|
74
|
+
assert callable(getattr(mcp_use_client, method))
|
|
75
|
+
|
|
76
|
+
@pytest.mark.asyncio
|
|
77
|
+
async def test_context_manager_usage(self):
|
|
78
|
+
"""Test that both clients work as context managers."""
|
|
79
|
+
from unittest.mock import AsyncMock, patch
|
|
80
|
+
|
|
81
|
+
config = {"server": {"url": "http://localhost:8080"}}
|
|
82
|
+
|
|
83
|
+
# Test FastMCP client with mocked initialization
|
|
84
|
+
fastmcp_client = FastMCPHUDClient(config)
|
|
85
|
+
assert not fastmcp_client.is_connected
|
|
86
|
+
|
|
87
|
+
with (
|
|
88
|
+
patch.object(fastmcp_client, "initialize", new_callable=AsyncMock) as mock_init,
|
|
89
|
+
patch.object(fastmcp_client, "shutdown", new_callable=AsyncMock) as mock_shutdown,
|
|
90
|
+
):
|
|
91
|
+
async with fastmcp_client:
|
|
92
|
+
# Verify initialization was called
|
|
93
|
+
mock_init.assert_called_once()
|
|
94
|
+
|
|
95
|
+
# Verify shutdown was called
|
|
96
|
+
mock_shutdown.assert_called_once()
|
|
97
|
+
|
|
98
|
+
# Test MCP-use client with mocked initialization
|
|
99
|
+
mcp_use_client = MCPUseHUDClient(config)
|
|
100
|
+
assert not mcp_use_client.is_connected
|
|
101
|
+
|
|
102
|
+
with (
|
|
103
|
+
patch.object(mcp_use_client, "initialize", new_callable=AsyncMock) as mock_init,
|
|
104
|
+
patch.object(mcp_use_client, "shutdown", new_callable=AsyncMock) as mock_shutdown,
|
|
105
|
+
):
|
|
106
|
+
async with mcp_use_client:
|
|
107
|
+
# Verify initialization was called
|
|
108
|
+
mock_init.assert_called_once()
|
|
109
|
+
|
|
110
|
+
# Verify shutdown was called
|
|
111
|
+
mock_shutdown.assert_called_once()
|