From 1b008332daaf6f39c533138f537d59de0e446f26 Mon Sep 17 00:00:00 2001 From: Jagjeevan Kashid Date: Mon, 22 Sep 2025 14:54:23 +0530 Subject: [PATCH 001/220] updated server endpoint from /vms/push to /lume/vms/push Signed-off-by: Jagjeevan Kashid --- libs/lume/src/Server/Server.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/lume/src/Server/Server.swift b/libs/lume/src/Server/Server.swift index 6f279a42..37d32484 100644 --- a/libs/lume/src/Server/Server.swift +++ b/libs/lume/src/Server/Server.swift @@ -294,7 +294,7 @@ final class Server { return try await self.handleSetDefaultLocation(name) }), Route( - method: "POST", path: "/vms/push", + method: "POST", path: "/lume/vms/push", handler: { [weak self] request in guard let self else { throw HTTPError.internalError } return try await self.handlePush(request.body) From c51692cd0ccbeb8a758b20c2abd998ace95c34ba Mon Sep 17 00:00:00 2001 From: Dillon DuPont Date: Mon, 22 Sep 2025 08:40:18 -0400 Subject: [PATCH 002/220] Fix image must have : error --- libs/python/computer/computer/computer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/python/computer/computer/computer.py b/libs/python/computer/computer/computer.py index 441e3ec3..f01c5491 100644 --- a/libs/python/computer/computer/computer.py +++ b/libs/python/computer/computer/computer.py @@ -154,8 +154,8 @@ class Computer: self.interface_logger = Logger("computer.interface", verbosity) if not use_host_computer_server: - if ":" not in image or len(image.split(":")) != 2: - raise ValueError("Image must be in the format :") + if ":" not in image: + image = f"{image}:latest" if not name: # Normalize the name to be used for the VM From 70f9f968cbc2a7b1b3c75c06e219ed0c266e4225 Mon Sep 17 00:00:00 2001 From: Dillon DuPont Date: Mon, 22 Sep 2025 08:59:07 -0400 Subject: [PATCH 003/220] Fixed broken winsandbox_example, added venv to provider setup --- examples/winsandbox_example.py | 4 +-- .../computer/providers/winsandbox/provider.py | 6 ++-- .../providers/winsandbox/setup_script.ps1 | 31 ++++++++++++++----- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/examples/winsandbox_example.py b/examples/winsandbox_example.py index 9cf1269a..cd5ab5c1 100644 --- a/examples/winsandbox_example.py +++ b/examples/winsandbox_example.py @@ -31,8 +31,8 @@ async def main(): # Test running a command print("Testing command execution...") - stdout, stderr = await computer.interface.run_command("echo Hello from Windows Sandbox!") - print(f"Command output: {stdout}") + result = await computer.interface.run_command("echo Hello from Windows Sandbox!") + print(f"Command output: {result.stdout}") print("Press any key to continue...") input() diff --git a/libs/python/computer/computer/providers/winsandbox/provider.py b/libs/python/computer/computer/providers/winsandbox/provider.py index 6196b96f..bca36876 100644 --- a/libs/python/computer/computer/providers/winsandbox/provider.py +++ b/libs/python/computer/computer/providers/winsandbox/provider.py @@ -423,7 +423,7 @@ class WinSandboxProvider(BaseVMProvider): if total_attempts % 10 == 0: self.logger.info(f"Still waiting for Windows Sandbox {name} IP after {total_attempts} attempts...") - async def _setup_computer_server(self, sandbox, name: str, visible: bool = False): + async def _setup_computer_server(self, sandbox, name: str, visible: bool = True): """Setup the computer server in the Windows Sandbox using RPyC. Args: @@ -472,8 +472,8 @@ class WinSandboxProvider(BaseVMProvider): shell=False ) - # # Sleep for 30 seconds - # await asyncio.sleep(30) + # Sleep for 30 seconds + await asyncio.sleep(30) ip = await self.get_ip(name) self.logger.info(f"Sandbox IP: {ip}") diff --git a/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 b/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 index 73074764..e901e179 100644 --- a/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 +++ b/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 @@ -79,23 +79,38 @@ try { $pythonVersion = & $pythonExe --version 2>&1 Write-Host "Python version: $pythonVersion" - # Step 2: Install cua-computer-server directly - Write-Host "Step 2: Installing cua-computer-server..." + # Step 2: Create a dedicated virtual environment for the sandbox + Write-Host "Step 2: Creating virtual environment (if needed)..." + $venvPath = "C:\Users\WDAGUtilityAccount\venv" + if (!(Test-Path $venvPath)) { + Write-Host "Creating venv at: $venvPath" + & $pythonExe -m venv $venvPath + } else { + Write-Host "Venv already exists at: $venvPath" + } + $venvPython = Join-Path $venvPath "Scripts\python.exe" + if (!(Test-Path $venvPython)) { + throw "Virtual environment Python not found at $venvPython" + } + Write-Host "Using venv Python: $venvPython" + + # Step 3: Install cua-computer-server into the venv + Write-Host "Step 3: Installing cua-computer-server..." Write-Host "Upgrading pip..." - & $pythonExe -m pip install --upgrade pip --quiet + & $venvPython -m pip install --upgrade pip --quiet Write-Host "Installing cua-computer-server..." - & $pythonExe -m pip install cua-computer-server --quiet + & $venvPython -m pip install cua-computer-server Write-Host "cua-computer-server installation completed." - # Step 3: Start computer server in background - Write-Host "Step 3: Starting computer server in background..." - Write-Host "Starting computer server with: $pythonExe" + # Step 4: Start computer server in background using the venv Python + Write-Host "Step 4: Starting computer server in background..." + Write-Host "Starting computer server with: $venvPython" # Start the computer server in the background - $serverProcess = Start-Process -FilePath $pythonExe -ArgumentList "-m", "computer_server.main" -WindowStyle Hidden -PassThru + $serverProcess = Start-Process -FilePath $venvPython -ArgumentList "-m", "computer_server.main" -WindowStyle Hidden -PassThru Write-Host "Computer server started in background with PID: $($serverProcess.Id)" # Give it a moment to start From f4be6538ff69fdaaf656615ce1d086bc0812acf2 Mon Sep 17 00:00:00 2001 From: Dillon DuPont Date: Mon, 22 Sep 2025 09:29:09 -0400 Subject: [PATCH 004/220] Hide setup window --- .../computer/providers/winsandbox/provider.py | 33 +++++++++++++++---- .../providers/winsandbox/setup_script.ps1 | 14 ++++++-- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/libs/python/computer/computer/providers/winsandbox/provider.py b/libs/python/computer/computer/providers/winsandbox/provider.py index bca36876..e072d900 100644 --- a/libs/python/computer/computer/providers/winsandbox/provider.py +++ b/libs/python/computer/computer/providers/winsandbox/provider.py @@ -5,6 +5,7 @@ import asyncio import logging import time from typing import Dict, Any, Optional, List +from pathlib import Path from ..base import BaseVMProvider, VMProviderType @@ -242,8 +243,15 @@ class WinSandboxProvider(BaseVMProvider): networking = run_opts.get("networking", self.networking) - # Create folder mappers if shared directories are specified + # Create folder mappers; always map a persistent venv directory on host for caching packages folder_mappers = [] + # Ensure host side persistent venv directory exists (Path.home()/wsb_venv) + host_wsb_env = Path.home() / ".cua" / "wsb_cache" + try: + host_wsb_env.mkdir(parents=True, exist_ok=True) + except Exception: + # If cannot create, continue without persistent mapping + host_wsb_env = None shared_directories = run_opts.get("shared_directories", []) for shared_dir in shared_directories: if isinstance(shared_dir, dict): @@ -255,6 +263,15 @@ class WinSandboxProvider(BaseVMProvider): if host_path and os.path.exists(host_path): folder_mappers.append(winsandbox.FolderMapper(host_path)) + + # Add mapping for the persistent venv directory (read/write) so it appears in Sandbox Desktop + if host_wsb_env is not None and host_wsb_env.exists(): + try: + folder_mappers.append( + winsandbox.FolderMapper(str(host_wsb_env), read_only=False) + ) + except Exception as e: + self.logger.warning(f"Failed to map host winsandbox_venv: {e}") self.logger.info(f"Creating Windows Sandbox: {name}") self.logger.info(f"Memory: {memory_mb}MB, Networking: {networking}") @@ -290,8 +307,10 @@ class WinSandboxProvider(BaseVMProvider): self.logger.info(f"Windows Sandbox {name} created successfully") + venv_exists = (host_wsb_env / "venv" / "Lib" / "site-packages" / "computer_server").exists() if host_wsb_env else False + # Setup the computer server in the sandbox - await self._setup_computer_server(sandbox, name) + await self._setup_computer_server(sandbox, name, wait_for_venv=(not venv_exists)) return { "success": True, @@ -423,7 +442,7 @@ class WinSandboxProvider(BaseVMProvider): if total_attempts % 10 == 0: self.logger.info(f"Still waiting for Windows Sandbox {name} IP after {total_attempts} attempts...") - async def _setup_computer_server(self, sandbox, name: str, visible: bool = True): + async def _setup_computer_server(self, sandbox, name: str, visible: bool = False, wait_for_venv: bool = True): """Setup the computer server in the Windows Sandbox using RPyC. Args: @@ -471,10 +490,12 @@ class WinSandboxProvider(BaseVMProvider): creationflags=creation_flags, shell=False ) - - # Sleep for 30 seconds - await asyncio.sleep(30) + if wait_for_venv: + print("Waiting for venv to be created for the first time setup of Windows Sandbox...") + print("This may take a minute...") + await asyncio.sleep(120) + ip = await self.get_ip(name) self.logger.info(f"Sandbox IP: {ip}") self.logger.info(f"Setup script started in background in sandbox {name} with PID: {process.pid}") diff --git a/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 b/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 index e901e179..e6208d71 100644 --- a/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 +++ b/libs/python/computer/computer/providers/winsandbox/setup_script.ps1 @@ -79,15 +79,25 @@ try { $pythonVersion = & $pythonExe --version 2>&1 Write-Host "Python version: $pythonVersion" - # Step 2: Create a dedicated virtual environment for the sandbox + # Step 2: Create a dedicated virtual environment in mapped Desktop folder (persistent) Write-Host "Step 2: Creating virtual environment (if needed)..." - $venvPath = "C:\Users\WDAGUtilityAccount\venv" + $cachePath = "C:\Users\WDAGUtilityAccount\Desktop\wsb_cache" + $venvPath = "C:\Users\WDAGUtilityAccount\Desktop\wsb_cache\venv" if (!(Test-Path $venvPath)) { Write-Host "Creating venv at: $venvPath" & $pythonExe -m venv $venvPath } else { Write-Host "Venv already exists at: $venvPath" } + # Hide the folder to keep Desktop clean + try { + $item = Get-Item $cachePath -ErrorAction SilentlyContinue + if ($item) { + if (-not ($item.Attributes -band [IO.FileAttributes]::Hidden)) { + $item.Attributes = $item.Attributes -bor [IO.FileAttributes]::Hidden + } + } + } catch { } $venvPython = Join-Path $venvPath "Scripts\python.exe" if (!(Test-Path $venvPython)) { throw "Virtual environment Python not found at $venvPython" From 65263112cdc6d9e4ea20d9636eb2200376a4bee2 Mon Sep 17 00:00:00 2001 From: Adam <62897873+YeIIcw@users.noreply.github.com> Date: Thu, 25 Sep 2025 16:07:53 -0400 Subject: [PATCH 005/220] Stream MCP responses instead of buffering --- .vscode/settings.json | 3 + libs/python/mcp-server/mcp_server/server.py | 160 ++++++++--- tests/test_mcp_server_streming.py | 303 ++++++++++++++++++++ 3 files changed, 429 insertions(+), 37 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 tests/test_mcp_server_streming.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..7e68766a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python-envs.pythonProjects": [] +} \ No newline at end of file diff --git a/libs/python/mcp-server/mcp_server/server.py b/libs/python/mcp-server/mcp_server/server.py index 73996d5e..66aaceba 100644 --- a/libs/python/mcp-server/mcp_server/server.py +++ b/libs/python/mcp-server/mcp_server/server.py @@ -1,5 +1,6 @@ import asyncio import base64 +import inspect import logging import os import sys @@ -40,11 +41,66 @@ except ImportError as e: # Global computer instance for reuse global_computer = None - def get_env_bool(key: str, default: bool = False) -> bool: """Get boolean value from environment variable.""" return os.getenv(key, str(default)).lower() in ("true", "1", "yes") +async def _maybe_call_ctx_method(ctx: Context, method_name: str, *args, **kwargs) -> None: + """Call a context helper if it exists, awaiting the result when necessary.""" + + method = getattr(ctx, method_name, None) + if not callable(method): + return + + result = method(*args, **kwargs) + if inspect.isawaitable(result): + await result + + +def _normalise_message_content(content: Union[str, List[Dict[str, Any]]]) -> List[Dict[str, Any]]: + """Normalise message content to a list of structured parts.""" + + if isinstance(content, list): + return content + + if content is None: + return [] + + return [{"type": "output_text", "text": str(content)}] + + +def _extract_text_from_content(content: Union[str, List[Dict[str, Any]]]) -> str: + """Extract textual content for inclusion in the aggregated result string.""" + + if isinstance(content, str): + return content + + texts: List[str] = [] + for part in content or []: + if not isinstance(part, dict): + continue + if part.get("type") in {"output_text", "text"} and part.get("text"): + texts.append(str(part["text"])) + return "\n".join(texts) + + +def _serialise_tool_content(content: Any) -> str: + """Convert tool outputs into a string for aggregation.""" + + if isinstance(content, str): + return content + if isinstance(content, list): + texts: List[str] = [] + for part in content: + if isinstance(part, dict) and part.get("type") in {"output_text", "text"} and part.get("text"): + texts.append(str(part["text"])) + if texts: + return "\n".join(texts) + if content is None: + return "" + return str(content) + + def serve() -> FastMCP: """Create and configure the MCP server.""" @@ -110,7 +166,7 @@ def serve() -> FastMCP: messages = [{"role": "user", "content": task}] # Collect all results - full_result = "" + aggregated_messages: List[str] = [] async for result in agent.run(messages): logger.info(f"Agent processing step") ctx.info(f"Agent processing step") @@ -119,37 +175,61 @@ def serve() -> FastMCP: outputs = result.get("output", []) for output in outputs: output_type = output.get("type") + if output_type == "message": - logger.debug(f"Message: {output}") - content = output.get("content", []) - for content_part in content: - if content_part.get("text"): - full_result += f"Message: {content_part.get('text', '')}\n" - elif output_type == "tool_use": - logger.debug(f"Tool use: {output}") - tool_name = output.get("name", "") - full_result += f"Tool: {tool_name}\n" - elif output_type == "tool_result": - logger.debug(f"Tool result: {output}") - result_content = output.get("content", "") - if isinstance(result_content, list): - for item in result_content: - if item.get("type") == "text": - full_result += f"Result: {item.get('text', '')}\n" - else: - full_result += f"Result: {result_content}\n" + logger.debug("Streaming assistant message: %s", output) + content = _normalise_message_content(output.get("content")) + aggregated_text = _extract_text_from_content(content) + if aggregated_text: + aggregated_messages.append(aggregated_text) + await _maybe_call_ctx_method( + ctx, + "yield_message", + role=output.get("role", "assistant"), + content=content, + ) - # Add separator between steps - full_result += "\n" + "-" * 20 + "\n" + elif output_type in {"tool_use", "computer_call", "function_call"}: + logger.debug("Streaming tool call: %s", output) + call_id = output.get("id") or output.get("call_id") + tool_name = output.get("name") or output.get("action", {}).get("type") + tool_input = output.get("input") or output.get("arguments") or output.get("action") + if call_id: + await _maybe_call_ctx_method( + ctx, + "yield_tool_call", + name=tool_name, + call_id=call_id, + input=tool_input, + ) + + elif output_type in {"tool_result", "computer_call_output", "function_call_output"}: + logger.debug("Streaming tool output: %s", output) + call_id = output.get("call_id") or output.get("id") + content = output.get("content") or output.get("output") + aggregated_text = _serialise_tool_content(content) + if aggregated_text: + aggregated_messages.append(aggregated_text) + if call_id: + await _maybe_call_ctx_method( + ctx, + "yield_tool_output", + call_id=call_id, + output=content, + is_error=output.get("status") == "failed" or output.get("is_error", False), + ) + + logger.info("CUA task completed successfully") + ctx.info("CUA task completed successfully") + + screenshot_image = Image( + format="png", + data=await global_computer.interface.screenshot() + ) - logger.info(f"CUA task completed successfully") - ctx.info(f"CUA task completed successfully") return ( - full_result or "Task completed with no text output.", - Image( - format="png", - data=await global_computer.interface.screenshot() - ) + "\n".join(aggregated_messages).strip() or "Task completed with no text output.", + screenshot_image, ) except Exception as e: @@ -173,7 +253,7 @@ def serve() -> FastMCP: ) @server.tool() - async def run_multi_cua_tasks(ctx: Context, tasks: List[str]) -> List: + async def run_multi_cua_tasks(ctx: Context, tasks: List[str]) -> List[Tuple[str, Image]]: """ Run multiple CUA tasks in a MacOS VM in sequence and return the combined results. @@ -184,14 +264,20 @@ def serve() -> FastMCP: Returns: Combined results from all tasks """ - results = [] + total_tasks = len(tasks) + if total_tasks == 0: + ctx.report_progress(1.0) + return [] + + results: List[Tuple[str, Image]] = [] for i, task in enumerate(tasks): - logger.info(f"Running task {i+1}/{len(tasks)}: {task}") - ctx.info(f"Running task {i+1}/{len(tasks)}: {task}") - - ctx.report_progress(i / len(tasks)) - results.extend(await run_cua_task(ctx, task)) - ctx.report_progress((i + 1) / len(tasks)) + logger.info(f"Running task {i+1}/{total_tasks}: {task}") + ctx.info(f"Running task {i+1}/{total_tasks}: {task}") + + ctx.report_progress(i / total_tasks) + task_result = await run_cua_task(ctx, task) + results.append(task_result) + ctx.report_progress((i + 1) / total_tasks) return results diff --git a/tests/test_mcp_server_streming.py b/tests/test_mcp_server_streming.py new file mode 100644 index 00000000..ed84cbfe --- /dev/null +++ b/tests/test_mcp_server_streming.py @@ -0,0 +1,303 @@ +import asyncio +import importlib.util +import sys +import types +from pathlib import Path + +import pytest + + +def _install_stub_module(name: str, module: types.ModuleType, registry: dict[str, types.ModuleType | None]) -> None: + registry[name] = sys.modules.get(name) + sys.modules[name] = module + + +@pytest.fixture +def server_module(): + stubbed_modules: dict[str, types.ModuleType | None] = {} + + # Stub MCP Context primitives + mcp_module = types.ModuleType("mcp") + mcp_module.__path__ = [] # mark as package + + mcp_server_module = types.ModuleType("mcp.server") + mcp_server_module.__path__ = [] + + fastmcp_module = types.ModuleType("mcp.server.fastmcp") + + class _StubContext: + async def yield_message(self, *args, **kwargs): + return None + + async def yield_tool_call(self, *args, **kwargs): + return None + + async def yield_tool_output(self, *args, **kwargs): + return None + + def report_progress(self, *_args, **_kwargs): + return None + + def info(self, *_args, **_kwargs): + return None + + def error(self, *_args, **_kwargs): + return None + + class _StubImage: + def __init__(self, format: str, data: bytes): + self.format = format + self.data = data + + class _StubFastMCP: + def __init__(self, name: str): + self.name = name + self._tools: dict[str, types.FunctionType] = {} + + def tool(self, *args, **kwargs): + def decorator(func): + self._tools[func.__name__] = func + return func + + return decorator + + def run(self): + return None + + fastmcp_module.Context = _StubContext + fastmcp_module.FastMCP = _StubFastMCP + fastmcp_module.Image = _StubImage + + _install_stub_module("mcp", mcp_module, stubbed_modules) + _install_stub_module("mcp.server", mcp_server_module, stubbed_modules) + _install_stub_module("mcp.server.fastmcp", fastmcp_module, stubbed_modules) + + # Stub Computer module to avoid heavy dependencies + computer_module = types.ModuleType("computer") + + class _StubInterface: + async def screenshot(self) -> bytes: # pragma: no cover - default stub + return b"" + + class _StubComputer: + def __init__(self, *args, **kwargs): + self.interface = _StubInterface() + + async def run(self): # pragma: no cover - default stub + return None + + class _StubVMProviderType: + CLOUD = "cloud" + LOCAL = "local" + + computer_module.Computer = _StubComputer + computer_module.VMProviderType = _StubVMProviderType + + _install_stub_module("computer", computer_module, stubbed_modules) + + # Stub agent module so server can import ComputerAgent + agent_module = types.ModuleType("agent") + + class _StubComputerAgent: + def __init__(self, *args, **kwargs): + pass + + async def run(self, *_args, **_kwargs): # pragma: no cover - default stub + if False: # pragma: no cover + yield {} + return + + agent_module.ComputerAgent = _StubComputerAgent + + _install_stub_module("agent", agent_module, stubbed_modules) + + module_name = "mcp_server_server_under_test" + module_path = Path("libs/python/mcp-server/mcp_server/server.py").resolve() + spec = importlib.util.spec_from_file_location(module_name, module_path) + server_module = importlib.util.module_from_spec(spec) + assert spec and spec.loader + spec.loader.exec_module(server_module) + + server_instance = getattr(server_module, "server", None) + if server_instance is not None and hasattr(server_instance, "_tools"): + for name, func in server_instance._tools.items(): + setattr(server_module, name, func) + + try: + yield server_module + finally: + sys.modules.pop(module_name, None) + for name, original in stubbed_modules.items(): + if original is None: + sys.modules.pop(name, None) + else: + sys.modules[name] = original + + +class FakeContext: + def __init__(self) -> None: + self.events: list[tuple] = [] + self.progress_updates: list[float] = [] + + def info(self, message: str) -> None: + self.events.append(("info", message)) + + def error(self, message: str) -> None: + self.events.append(("error", message)) + + def report_progress(self, value: float) -> None: + self.progress_updates.append(value) + + async def yield_message(self, *, role: str, content): + timestamp = asyncio.get_running_loop().time() + self.events.append(("message", role, content, timestamp)) + + async def yield_tool_call(self, *, name: str | None, call_id: str, input): + timestamp = asyncio.get_running_loop().time() + self.events.append(("tool_call", name, call_id, input, timestamp)) + + async def yield_tool_output(self, *, call_id: str, output, is_error: bool = False): + timestamp = asyncio.get_running_loop().time() + self.events.append(("tool_output", call_id, output, is_error, timestamp)) + + +def test_run_cua_task_streams_partial_results(server_module): + async def _run_test(): + class FakeAgent: + script = [] + + def __init__(self, *args, **kwargs): + pass + + async def run(self, messages): # type: ignore[override] + for factory, delay in type(self).script: + yield factory(messages) + if delay: + await asyncio.sleep(delay) + + FakeAgent.script = [ + ( + lambda _messages: { + "output": [ + { + "type": "message", + "role": "assistant", + "content": [ + {"type": "output_text", "text": "First chunk"} + ], + } + ] + }, + 0.0, + ), + ( + lambda _messages: { + "output": [ + { + "type": "tool_use", + "id": "call_1", + "name": "computer", + "input": {"action": "click"}, + }, + { + "type": "computer_call_output", + "call_id": "call_1", + "output": [ + {"type": "text", "text": "Tool completed"} + ], + }, + ] + }, + 0.05, + ), + ] + + class FakeInterface: + def __init__(self) -> None: + self.calls = 0 + + async def screenshot(self) -> bytes: + self.calls += 1 + return b"final-image" + + fake_interface = FakeInterface() + server_module.global_computer = types.SimpleNamespace(interface=fake_interface) + server_module.ComputerAgent = FakeAgent # type: ignore[assignment] + + ctx = FakeContext() + task = asyncio.create_task(server_module.run_cua_task(ctx, "open settings")) + + await asyncio.sleep(0.01) + assert not task.done(), "Task should still be running to simulate long operation" + message_events = [event for event in ctx.events if event[0] == "message"] + assert message_events, "Expected message event before task completion" + + text_result, image = await task + + assert "First chunk" in text_result + assert "Tool completed" in text_result + assert image.data == b"final-image" + assert fake_interface.calls == 1 + + tool_call_events = [event for event in ctx.events if event[0] == "tool_call"] + tool_output_events = [event for event in ctx.events if event[0] == "tool_output"] + assert tool_call_events and tool_output_events + assert tool_call_events[0][2] == "call_1" + assert tool_output_events[0][1] == "call_1" + + asyncio.run(_run_test()) + + +def test_run_multi_cua_tasks_reports_progress(server_module, monkeypatch): + async def _run_test(): + class FakeAgent: + script = [] + + def __init__(self, *args, **kwargs): + pass + + async def run(self, messages): # type: ignore[override] + for factory, delay in type(self).script: + yield factory(messages) + if delay: + await asyncio.sleep(delay) + + FakeAgent.script = [ + ( + lambda messages: { + "output": [ + { + "type": "message", + "role": "assistant", + "content": [ + { + "type": "output_text", + "text": f"Result for {messages[0].get('content')}", + } + ], + } + ] + }, + 0.0, + ) + ] + + server_module.ComputerAgent = FakeAgent # type: ignore[assignment] + + class FakeInterface: + async def screenshot(self) -> bytes: + return b"progress-image" + + server_module.global_computer = types.SimpleNamespace(interface=FakeInterface()) + + ctx = FakeContext() + + results = await server_module.run_multi_cua_tasks(ctx, ["a", "b", "c"]) + + assert len(results) == 3 + assert results[0][0] == "Result for a" + assert ctx.progress_updates[0] == pytest.approx(0.0) + assert ctx.progress_updates[-1] == pytest.approx(1.0) + assert len(ctx.progress_updates) == 6 + + asyncio.run(_run_test()) \ No newline at end of file From ee615390e990478213d3f06dace3b595f2504145 Mon Sep 17 00:00:00 2001 From: Adam <62897873+YeIIcw@users.noreply.github.com> Date: Thu, 25 Sep 2025 16:26:24 -0400 Subject: [PATCH 006/220] Typo Correction test_mcp_server_streaming.py update typo --- .../{test_mcp_server_streming.py => test_mcp_server_streaming.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{test_mcp_server_streming.py => test_mcp_server_streaming.py} (100%) diff --git a/tests/test_mcp_server_streming.py b/tests/test_mcp_server_streaming.py similarity index 100% rename from tests/test_mcp_server_streming.py rename to tests/test_mcp_server_streaming.py From c892f4ecea80b115492d27ba05484a10192860d3 Mon Sep 17 00:00:00 2001 From: Dillon DuPont Date: Thu, 25 Sep 2025 15:53:20 -0700 Subject: [PATCH 007/220] Change anthropic predict_click logic --- libs/python/agent/agent/loops/anthropic.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libs/python/agent/agent/loops/anthropic.py b/libs/python/agent/agent/loops/anthropic.py index cd616d38..ec25250e 100644 --- a/libs/python/agent/agent/loops/anthropic.py +++ b/libs/python/agent/agent/loops/anthropic.py @@ -1577,11 +1577,10 @@ Task: Click {instruction}. Output ONLY a click action on the target element.""" isinstance(item.get("action"), dict)): action = item["action"] - if action.get("type") == "click": + if action.get("x") and action.get("y"): x = action.get("x") y = action.get("y") - if x is not None and y is not None: - return (int(x), int(y)) + return (int(x), int(y)) return None From dcc5d7bf8f29ae4dfccc6c041c315b2dbb7610d0 Mon Sep 17 00:00:00 2001 From: f-trycua Date: Fri, 26 Sep 2025 06:06:39 +0200 Subject: [PATCH 008/220] Update README.md --- README.md | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/README.md b/README.md index e03d9bb3..0f26fabc 100644 --- a/README.md +++ b/README.md @@ -222,35 +222,3 @@ This project is not affiliated with, endorsed by, or sponsored by Apple Inc., Ca Thank you to all our supporters! [![Stargazers over time](https://starchart.cc/trycua/cua.svg?variant=adaptive)](https://starchart.cc/trycua/cua) - -## Contributors - - - - - - - - - - - - - - - - - - - - - - - - -
f-trycua
f-trycua

πŸ’»
Pedro PiΓ±era BuendΓ­a
Pedro PiΓ±era BuendΓ­a

πŸ’»
Amit Kumar
Amit Kumar

πŸ’»
Dung Duc Huynh (Kaka)
Dung Duc Huynh (Kaka)

πŸ’»
Zayd Krunz
Zayd Krunz

πŸ’»
Prashant Raj
Prashant Raj

πŸ’»
Leland Takamine
Leland Takamine

πŸ’»
ddupont
ddupont

πŸ’»
Ethan Gutierrez
Ethan Gutierrez

πŸ’»
Ricter Zheng
Ricter Zheng

πŸ’»
Rahul Karajgikar
Rahul Karajgikar

πŸ’»
trospix
trospix

πŸ’»
Evan smith
Evan smith

πŸ’»
- - - - - From e00376b60189a03e341fe164e5f30dae7260ba98 Mon Sep 17 00:00:00 2001 From: f-trycua Date: Fri, 26 Sep 2025 06:08:59 +0200 Subject: [PATCH 009/220] Create FUNDING.yml --- .github/FUNDING.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5d5400e2 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: trycua +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 47f0f73bb162ae646ee72598d902910d1cece873 Mon Sep 17 00:00:00 2001 From: f-trycua Date: Thu, 25 Sep 2025 22:11:04 -0700 Subject: [PATCH 010/220] Add hack-the-north blogpost --- blog/assets/hack-booth.png | Bin 0 -> 3599195 bytes blog/assets/hack-closing-ceremony.jpg | Bin 0 -> 164955 bytes blog/assets/hack-cua-ollama-hud.jpeg | Bin 0 -> 5397386 bytes blog/assets/hack-leaderboard.png | Bin 0 -> 1017583 bytes blog/assets/hack-winners.jpeg | Bin 0 -> 2994381 bytes blog/assets/hack-workshop.jpeg | Bin 0 -> 321307 bytes blog/hack-the-north.md | 166 ++++++++++++++++++++++++++ 7 files changed, 166 insertions(+) create mode 100644 blog/assets/hack-booth.png create mode 100644 blog/assets/hack-closing-ceremony.jpg create mode 100644 blog/assets/hack-cua-ollama-hud.jpeg create mode 100644 blog/assets/hack-leaderboard.png create mode 100644 blog/assets/hack-winners.jpeg create mode 100644 blog/assets/hack-workshop.jpeg create mode 100644 blog/hack-the-north.md diff --git a/blog/assets/hack-booth.png b/blog/assets/hack-booth.png new file mode 100644 index 0000000000000000000000000000000000000000..6da6cae1fe14ac9ad4c812880543b7e845b2afb6 GIT binary patch literal 3599195 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%0ACnLLnC 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

|Jw&&-)BX=cjqpdw|j_q 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 z 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

{O?RK;T4IOaE0{Ym#-D33z_wjA4-p;>? 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

q3KwZ5D+KLm$yS%Rz4 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%0D2NV6eh6lO#+ZO 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

@@ -29,11 +30,11 @@ from computer import Computer computer = Computer(os_type="macos", display="1024x768", memory="8GB", cpu="4") try: await computer.run() - + screenshot = await computer.interface.screenshot() with open("screenshot.png", "wb") as f: f.write(screenshot) - + await computer.interface.move_cursor(100, 100) await computer.interface.left_click() await computer.interface.right_click(300, 300) diff --git a/libs/python/computer/computer/computer.py b/libs/python/computer/computer/computer.py index 0d132ab0..7f5f9dfb 100644 --- a/libs/python/computer/computer/computer.py +++ b/libs/python/computer/computer/computer.py @@ -1,20 +1,22 @@ -import traceback -from typing import Optional, List, Literal, Dict, Any, Union, TYPE_CHECKING, cast import asyncio -from .models import Computer as ComputerConfig, Display -from .interface.factory import InterfaceFactory -import time -from PIL import Image import io -import re -from .logger import Logger, LogLevel import json import logging -from core.telemetry import is_telemetry_enabled, record_event import os -from . import helpers - import platform +import re +import time +import traceback +from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Union, cast + +from core.telemetry import is_telemetry_enabled, record_event +from PIL import Image + +from . import helpers +from .interface.factory import InterfaceFactory +from .logger import Logger, LogLevel +from .models import Computer as ComputerConfig +from .models import Display SYSTEM_INFO = { "os": platform.system().lower(), @@ -28,6 +30,7 @@ from .providers.factory import VMProviderFactory OSType = Literal["macos", "linux", "windows"] + class Computer: """Computer is the main class for interacting with the computer.""" @@ -41,8 +44,11 @@ class Computer: Returns: DioramaComputer: A proxy object with the Diorama interface, but using diorama_cmds. """ - assert "app-use" in self.experiments, "App Usage is an experimental feature. Enable it by passing experiments=['app-use'] to Computer()" + assert ( + "app-use" in self.experiments + ), "App Usage is an experimental feature. Enable it by passing experiments=['app-use'] to Computer()" from .diorama_computer import DioramaComputer + return DioramaComputer(self, apps) def __init__( @@ -64,7 +70,7 @@ class Computer: storage: Optional[str] = None, ephemeral: bool = False, api_key: Optional[str] = None, - experiments: Optional[List[str]] = None + experiments: Optional[List[str]] = None, ): """Initialize a new Computer instance. @@ -112,32 +118,36 @@ class Computer: self.os_type = os_type self.provider_type = provider_type self.ephemeral = ephemeral - + self.api_key = api_key self.experiments = experiments or [] - + if "app-use" in self.experiments: assert self.os_type == "macos", "App use experiment is only supported on macOS" # The default is currently to use non-ephemeral storage if storage and ephemeral and storage != "ephemeral": raise ValueError("Storage path and ephemeral flag cannot be used together") - + # Windows Sandbox always uses ephemeral storage if self.provider_type == VMProviderType.WINSANDBOX: if not ephemeral and storage != None and storage != "ephemeral": - self.logger.warning("Windows Sandbox storage is always ephemeral. Setting ephemeral=True.") + self.logger.warning( + "Windows Sandbox storage is always ephemeral. Setting ephemeral=True." + ) self.ephemeral = True self.storage = "ephemeral" else: self.storage = "ephemeral" if ephemeral else storage - + # For Lumier provider, store the first shared directory path to use # for VM file sharing self.shared_path = None if shared_directories and len(shared_directories) > 0: self.shared_path = shared_directories[0] - self.logger.info(f"Using first shared directory for VM file sharing: {self.shared_path}") + self.logger.info( + f"Using first shared directory for VM file sharing: {self.shared_path}" + ) # Store telemetry preference self._telemetry_enabled = telemetry_enabled @@ -264,8 +274,14 @@ class Computer: self.logger.info(f"Starting VM: {self.image}") if not self._provider_context: try: - provider_type_name = self.provider_type.name if isinstance(self.provider_type, VMProviderType) else self.provider_type - self.logger.verbose(f"Initializing {provider_type_name} provider context...") + provider_type_name = ( + self.provider_type.name + if isinstance(self.provider_type, VMProviderType) + else self.provider_type + ) + self.logger.verbose( + f"Initializing {provider_type_name} provider context..." + ) # Explicitly set provider parameters storage = "ephemeral" if self.ephemeral else self.storage @@ -282,9 +298,13 @@ class Computer: if self.provider_type == VMProviderType.LUMIER: self.logger.info(f"Using VM image for Lumier provider: {image}") if shared_path: - self.logger.info(f"Using shared path for Lumier provider: {shared_path}") + self.logger.info( + f"Using shared path for Lumier provider: {shared_path}" + ) if noVNC_port: - self.logger.info(f"Using noVNC port for Lumier provider: {noVNC_port}") + self.logger.info( + f"Using noVNC port for Lumier provider: {noVNC_port}" + ) self.config.vm_provider = VMProviderFactory.create_provider( self.provider_type, port=port, @@ -340,11 +360,17 @@ class Computer: except ImportError as ie: self.logger.error(f"Failed to import provider dependencies: {ie}") if str(ie).find("lume") >= 0 and str(ie).find("lumier") < 0: - self.logger.error("Please install with: pip install cua-computer[lume]") + self.logger.error( + "Please install with: pip install cua-computer[lume]" + ) elif str(ie).find("lumier") >= 0 or str(ie).find("docker") >= 0: - self.logger.error("Please install with: pip install cua-computer[lumier] and make sure Docker is installed") + self.logger.error( + "Please install with: pip install cua-computer[lumier] and make sure Docker is installed" + ) elif str(ie).find("cloud") >= 0: - self.logger.error("Please install with: pip install cua-computer[cloud]") + self.logger.error( + "Please install with: pip install cua-computer[cloud]" + ) raise except Exception as e: self.logger.error(f"Failed to initialize provider context: {e}") @@ -355,16 +381,14 @@ class Computer: try: if self.config.vm_provider is None: raise RuntimeError(f"VM provider not initialized for {self.config.name}") - + vm = await self.config.vm_provider.get_vm(self.config.name) self.logger.verbose(f"Found existing VM: {self.config.name}") is_running = vm.get("status") == "running" except Exception as e: self.logger.error(f"VM not found: {self.config.name}") self.logger.error(f"Error: {e}") - raise RuntimeError( - f"VM {self.config.name} could not be found or created." - ) + raise RuntimeError(f"VM {self.config.name} could not be found or created.") # Start the VM if it's not running if not is_running: @@ -377,13 +401,10 @@ class Computer: path = os.path.abspath(os.path.expanduser(path)) if os.path.exists(path): # Add path in format expected by Lume API - shared_dirs.append({ - "hostPath": path, - "readOnly": False - }) + shared_dirs.append({"hostPath": path, "readOnly": False}) else: self.logger.warning(f"Shared directory does not exist: {path}") - + # Prepare run options to pass to the provider run_opts = {} @@ -393,11 +414,11 @@ class Computer: "width": self.config.display.width, "height": self.config.display.height, } - + # Check if scale_factor exists before adding it if hasattr(self.config.display, "scale_factor"): display_info["scale_factor"] = self.config.display.scale_factor - + run_opts["display"] = display_info # Add shared directories if available @@ -407,21 +428,23 @@ class Computer: # Run the VM with the provider try: if self.config.vm_provider is None: - raise RuntimeError(f"VM provider not initialized for {self.config.name}") - + raise RuntimeError( + f"VM provider not initialized for {self.config.name}" + ) + # Use the complete run_opts we prepared earlier # Handle ephemeral storage for run_vm method too storage_param = "ephemeral" if self.ephemeral else self.storage - + # Log the image being used self.logger.info(f"Running VM using image: {self.image}") - + # Call provider.run_vm with explicit image parameter response = await self.config.vm_provider.run_vm( image=self.image, name=self.config.name, run_opts=run_opts, - storage=storage_param + storage=storage_param, ) self.logger.info(f"VM run response: {response if response else 'None'}") except Exception as run_error: @@ -433,14 +456,16 @@ class Computer: try: if self.provider_type == VMProviderType.LUMIER: max_retries = 60 # Increased for Lumier VM startup which takes longer - retry_delay = 3 # 3 seconds between retries for Lumier + retry_delay = 3 # 3 seconds between retries for Lumier else: max_retries = 30 # Default for other providers - retry_delay = 2 # 2 seconds between retries - - self.logger.info(f"Waiting up to {max_retries * retry_delay} seconds for VM to be ready...") + retry_delay = 2 # 2 seconds between retries + + self.logger.info( + f"Waiting up to {max_retries * retry_delay} seconds for VM to be ready..." + ) ip = await self.get_ip(max_retries=max_retries, retry_delay=retry_delay) - + # If we get here, we have a valid IP self.logger.info(f"VM is ready with IP: {ip}") ip_address = ip @@ -458,8 +483,10 @@ class Computer: try: # Verify we have a valid IP before initializing the interface if not ip_address or ip_address == "unknown" or ip_address == "0.0.0.0": - raise RuntimeError(f"Cannot initialize interface - invalid IP address: {ip_address}") - + raise RuntimeError( + f"Cannot initialize interface - invalid IP address: {ip_address}" + ) + # Initialize the interface using the factory with the specified OS self.logger.info(f"Initializing interface for {self.os_type} at {ip_address}") from .interface.base import BaseComputerInterface @@ -469,18 +496,17 @@ class Computer: self._interface = cast( BaseComputerInterface, InterfaceFactory.create_interface_for_os( - os=self.os_type, + os=self.os_type, ip_address=ip_address, api_key=self.api_key, - vm_name=self.config.name + vm_name=self.config.name, ), ) else: self._interface = cast( BaseComputerInterface, InterfaceFactory.create_interface_for_os( - os=self.os_type, - ip_address=ip_address + os=self.os_type, ip_address=ip_address ), ) @@ -510,10 +536,10 @@ class Computer: # Set the initialization flag and clear the initializing flag self._initialized = True - + # Set this instance as the default computer for remote decorators helpers.set_default_computer(self) - + self.logger.info("Computer successfully initialized") except Exception as e: raise @@ -522,7 +548,7 @@ class Computer: duration_ms = (time.time() - start_time) * 1000 self.logger.debug(f"Computer initialization took {duration_ms:.2f}ms") return - + async def disconnect(self) -> None: """Disconnect from the computer's WebSocket interface.""" if self._interface: @@ -536,13 +562,17 @@ class Computer: self.logger.info("Stopping Computer...") # In VM mode, first explicitly stop the VM, then exit the provider context - if not self.use_host_computer_server and self._provider_context and self.config.vm_provider is not None: + if ( + not self.use_host_computer_server + and self._provider_context + and self.config.vm_provider is not None + ): try: self.logger.info(f"Stopping VM {self.config.name}...") await self.config.vm_provider.stop_vm( - name=self.config.name, - storage=self.storage # Pass storage explicitly for clarity - ) + name=self.config.name, + storage=self.storage, # Pass storage explicitly for clarity + ) except Exception as e: self.logger.error(f"Error stopping VM: {e}") @@ -553,7 +583,9 @@ class Computer: await self.disconnect() self.logger.info("Computer stopped") except Exception as e: - self.logger.debug(f"Error during cleanup: {e}") # Log as debug since this might be expected + self.logger.debug( + f"Error during cleanup: {e}" + ) # Log as debug since this might be expected finally: # Log stop time for performance monitoring duration_ms = (time.time() - start_time) * 1000 @@ -597,12 +629,18 @@ class Computer: storage_param = "ephemeral" if self.ephemeral else self.storage if hasattr(self.config.vm_provider, "restart_vm"): self.logger.info(f"Restarting VM {self.config.name} via provider...") - await self.config.vm_provider.restart_vm(name=self.config.name, storage=storage_param) + await self.config.vm_provider.restart_vm( + name=self.config.name, storage=storage_param + ) else: # Fallback: stop then start without leaving provider context - self.logger.info(f"Provider has no restart_vm; performing stop+start for {self.config.name}...") + self.logger.info( + f"Provider has no restart_vm; performing stop+start for {self.config.name}..." + ) await self.config.vm_provider.stop_vm(name=self.config.name, storage=storage_param) - await self.config.vm_provider.run_vm(image=self.image, name=self.config.name, run_opts={}, storage=storage_param) + await self.config.vm_provider.run_vm( + image=self.image, name=self.config.name, run_opts={}, storage=storage_param + ) except Exception as e: self.logger.error(f"Failed to restart VM via provider: {e}") # As a last resort, do a full stop (with provider context exit) and run @@ -659,45 +697,42 @@ class Computer: # @property async def get_ip(self, max_retries: int = 15, retry_delay: int = 3) -> str: """Get the IP address of the VM or localhost if using host computer server. - - This method delegates to the provider's get_ip method, which waits indefinitely + + This method delegates to the provider's get_ip method, which waits indefinitely until the VM has a valid IP address. - + Args: max_retries: Unused parameter, kept for backward compatibility retry_delay: Delay between retries in seconds (default: 2) - + Returns: IP address of the VM or localhost if using host computer server """ # For host computer server, always return localhost immediately if self.use_host_computer_server: return "127.0.0.1" - + # Get IP from the provider - each provider implements its own waiting logic if self.config.vm_provider is None: raise RuntimeError("VM provider is not initialized") - + # Log that we're waiting for the IP self.logger.info(f"Waiting for VM {self.config.name} to get an IP address...") - + # Call the provider's get_ip method which will wait indefinitely storage_param = "ephemeral" if self.ephemeral else self.storage - + # Log the image being used self.logger.info(f"Running VM using image: {self.image}") - + # Call provider.get_ip with explicit image parameter ip = await self.config.vm_provider.get_ip( - name=self.config.name, - storage=storage_param, - retry_delay=retry_delay + name=self.config.name, storage=storage_param, retry_delay=retry_delay ) - + # Log success self.logger.info(f"VM {self.config.name} has IP address: {ip}") return ip - async def wait_vm_ready(self) -> Optional[Dict[str, Any]]: """Wait for VM to be ready with an IP address. @@ -785,8 +820,8 @@ class Computer: if self.config.vm_provider is not None: vm = await self.config.vm_provider.get_vm(self.config.name) # VM data is returned as a dictionary from the Lumier provider - status = vm.get('status', 'unknown') if vm else "unknown" - ip = vm.get('ip_address') if vm else None + status = vm.get("status", "unknown") if vm else "unknown" + ip = vm.get("ip_address") if vm else None else: status = "unknown" ip = None @@ -803,16 +838,13 @@ class Computer: self.logger.info( f"Updating VM settings: CPU={cpu or self.config.cpu}, Memory={memory or self.config.memory}" ) - update_opts = { - "cpu": cpu or int(self.config.cpu), - "memory": memory or self.config.memory - } + update_opts = {"cpu": cpu or int(self.config.cpu), "memory": memory or self.config.memory} if self.config.vm_provider is not None: - await self.config.vm_provider.update_vm( - name=self.config.name, - update_opts=update_opts, - storage=self.storage # Pass storage explicitly for clarity - ) + await self.config.vm_provider.update_vm( + name=self.config.name, + update_opts=update_opts, + storage=self.storage, # Pass storage explicitly for clarity + ) else: raise RuntimeError("VM provider not initialized") @@ -879,15 +911,14 @@ class Computer: """ return await self.interface.to_screenshot_coordinates(x, y) - # Add virtual environment management functions to computer interface async def venv_install(self, venv_name: str, requirements: list[str]): """Install packages in a virtual environment. - + Args: venv_name: Name of the virtual environment requirements: List of package requirements to install - + Returns: Tuple of (stdout, stderr) from the installation command """ @@ -896,37 +927,41 @@ class Computer: if self.os_type == "windows": # Use %USERPROFILE% for home directory and cmd.exe semantics venv_path = f"%USERPROFILE%\\.venvs\\{venv_name}" - ensure_dir_cmd = "if not exist \"%USERPROFILE%\\.venvs\" mkdir \"%USERPROFILE%\\.venvs\"" - create_cmd = f"if not exist \"{venv_path}\" python -m venv \"{venv_path}\"" + ensure_dir_cmd = 'if not exist "%USERPROFILE%\\.venvs" mkdir "%USERPROFILE%\\.venvs"' + create_cmd = f'if not exist "{venv_path}" python -m venv "{venv_path}"' requirements_str = " ".join(requirements) # Activate via activate.bat and install - install_cmd = f"call \"{venv_path}\\Scripts\\activate.bat\" && pip install {requirements_str}" if requirements_str else f"echo No requirements to install" + install_cmd = ( + f'call "{venv_path}\\Scripts\\activate.bat" && pip install {requirements_str}' + if requirements_str + else "echo No requirements to install" + ) await self.interface.run_command(ensure_dir_cmd) await self.interface.run_command(create_cmd) return await self.interface.run_command(install_cmd) else: # POSIX (macOS/Linux) venv_path = f"$HOME/.venvs/{venv_name}" - create_cmd = f"mkdir -p \"$HOME/.venvs\" && python3 -m venv \"{venv_path}\"" + create_cmd = f'mkdir -p "$HOME/.venvs" && python3 -m venv "{venv_path}"' # Check if venv exists, if not create it - check_cmd = f"test -d \"{venv_path}\" || ({create_cmd})" + check_cmd = f'test -d "{venv_path}" || ({create_cmd})' _ = await self.interface.run_command(check_cmd) # Install packages requirements_str = " ".join(requirements) install_cmd = ( - f". \"{venv_path}/bin/activate\" && pip install {requirements_str}" + f'. "{venv_path}/bin/activate" && pip install {requirements_str}' if requirements_str else "echo No requirements to install" ) return await self.interface.run_command(install_cmd) - + async def venv_cmd(self, venv_name: str, command: str): """Execute a shell command in a virtual environment. - + Args: venv_name: Name of the virtual environment command: Shell command to execute in the virtual environment - + Returns: Tuple of (stdout, stderr) from the command execution """ @@ -934,36 +969,36 @@ class Computer: # Windows (cmd.exe) venv_path = f"%USERPROFILE%\\.venvs\\{venv_name}" # Check existence and signal if missing - check_cmd = f"if not exist \"{venv_path}\" (echo VENV_NOT_FOUND) else (echo VENV_FOUND)" + check_cmd = f'if not exist "{venv_path}" (echo VENV_NOT_FOUND) else (echo VENV_FOUND)' result = await self.interface.run_command(check_cmd) if "VENV_NOT_FOUND" in getattr(result, "stdout", ""): # Auto-create the venv with no requirements await self.venv_install(venv_name, []) # Activate and run the command - full_command = f"call \"{venv_path}\\Scripts\\activate.bat\" && {command}" + full_command = f'call "{venv_path}\\Scripts\\activate.bat" && {command}' return await self.interface.run_command(full_command) else: # POSIX (macOS/Linux) venv_path = f"$HOME/.venvs/{venv_name}" # Check if virtual environment exists - check_cmd = f"test -d \"{venv_path}\"" + check_cmd = f'test -d "{venv_path}"' result = await self.interface.run_command(check_cmd) if result.stderr or "test:" in result.stdout: # venv doesn't exist # Auto-create the venv with no requirements await self.venv_install(venv_name, []) # Activate virtual environment and run command - full_command = f". \"{venv_path}/bin/activate\" && {command}" + full_command = f'. "{venv_path}/bin/activate" && {command}' return await self.interface.run_command(full_command) - + async def venv_exec(self, venv_name: str, python_func, *args, **kwargs): """Execute Python function in a virtual environment using source code extraction. - + Args: venv_name: Name of the virtual environment python_func: A callable function to execute *args: Positional arguments to pass to the function **kwargs: Keyword arguments to pass to the function - + Returns: The result of the function execution, or raises any exception that occurred """ @@ -971,29 +1006,29 @@ class Computer: import inspect import json import textwrap - + try: # Get function source code using inspect.getsource source = inspect.getsource(python_func) # Remove common leading whitespace (dedent) func_source = textwrap.dedent(source).strip() - + # Remove decorators while func_source.lstrip().startswith("@"): func_source = func_source.split("\n", 1)[1].strip() - + # Get function name for execution func_name = python_func.__name__ - + # Serialize args and kwargs as JSON (safer than dill for cross-version compatibility) args_json = json.dumps(args, default=str) kwargs_json = json.dumps(kwargs, default=str) - + except OSError as e: raise Exception(f"Cannot retrieve source code for function {python_func.__name__}: {e}") except Exception as e: raise Exception(f"Failed to reconstruct function source: {e}") - + # Create Python code that will define and execute the function python_code = f''' import json @@ -1038,25 +1073,27 @@ output_json = json.dumps(output_payload, default=str) # Print the JSON output with markers print(f"<<>>{{output_json}}<<>>") ''' - + # Encode the Python code in base64 to avoid shell escaping issues - encoded_code = base64.b64encode(python_code.encode('utf-8')).decode('ascii') - + encoded_code = base64.b64encode(python_code.encode("utf-8")).decode("ascii") + # Execute the Python code in the virtual environment - python_command = f"python -c \"import base64; exec(base64.b64decode('{encoded_code}').decode('utf-8'))\"" + python_command = ( + f"python -c \"import base64; exec(base64.b64decode('{encoded_code}').decode('utf-8'))\"" + ) result = await self.venv_cmd(venv_name, python_command) - + # Parse the output to extract the payload start_marker = "<<>>" end_marker = "<<>>" # Print original stdout - print(result.stdout[:result.stdout.find(start_marker)]) - + print(result.stdout[: result.stdout.find(start_marker)]) + if start_marker in result.stdout and end_marker in result.stdout: start_idx = result.stdout.find(start_marker) + len(start_marker) end_idx = result.stdout.find(end_marker) - + if start_idx < end_idx: output_json = result.stdout[start_idx:end_idx] @@ -1065,7 +1102,7 @@ print(f"<<>>{{output_json}}<<>>") output_payload = json.loads(output_json) except Exception as e: raise Exception(f"Failed to decode output payload: {e}") - + if output_payload["success"]: return output_payload["result"] else: @@ -1077,4 +1114,6 @@ print(f"<<>>{{output_json}}<<>>") raise Exception("Invalid output format: markers found but no content between them") else: # Fallback: return stdout/stderr if no payload markers found - raise Exception(f"No output payload found. stdout: {result.stdout}, stderr: {result.stderr}") + raise Exception( + f"No output payload found. stdout: {result.stdout}, stderr: {result.stderr}" + ) diff --git a/libs/python/computer/computer/diorama_computer.py b/libs/python/computer/computer/diorama_computer.py index da67c72c..329d3009 100644 --- a/libs/python/computer/computer/diorama_computer.py +++ b/libs/python/computer/computer/diorama_computer.py @@ -1,14 +1,17 @@ import asyncio -from .interface.models import KeyType, Key + +from .interface.models import Key, KeyType + class DioramaComputer: """ A Computer-compatible proxy for Diorama that sends commands over the ComputerInterface. """ + def __init__(self, computer, apps): """ Initialize the DioramaComputer with a computer instance and list of apps. - + Args: computer: The computer instance to proxy commands through apps: List of applications available in the diorama environment @@ -21,7 +24,7 @@ class DioramaComputer: async def __aenter__(self): """ Async context manager entry point. - + Returns: self: The DioramaComputer instance """ @@ -31,7 +34,7 @@ class DioramaComputer: async def run(self): """ Initialize and run the DioramaComputer if not already initialized. - + Returns: self: The DioramaComputer instance """ @@ -39,14 +42,16 @@ class DioramaComputer: await self.__aenter__() return self + class DioramaComputerInterface: """ Diorama Interface proxy that sends diorama_cmds via the Computer's interface. """ + def __init__(self, computer, apps): """ Initialize the DioramaComputerInterface. - + Args: computer: The computer instance to send commands through apps: List of applications available in the diorama environment @@ -58,14 +63,14 @@ class DioramaComputerInterface: async def _send_cmd(self, action, arguments=None): """ Send a command to the diorama interface through the computer. - + Args: action (str): The action/command to execute arguments (dict, optional): Additional arguments for the command - + Returns: The result from the diorama command execution - + Raises: RuntimeError: If the computer interface is not initialized or command fails """ @@ -77,25 +82,30 @@ class DioramaComputerInterface: raise RuntimeError("Computer interface not initialized. Call run() first.") result = await iface.diorama_cmd(action, arguments) if not result.get("success"): - raise RuntimeError(f"Diorama command failed: {result.get('error')}\n{result.get('trace')}") + raise RuntimeError( + f"Diorama command failed: {result.get('error')}\n{result.get('trace')}" + ) return result.get("result") async def screenshot(self, as_bytes=True): """ Take a screenshot of the diorama scene. - + Args: as_bytes (bool): If True, return image as bytes; if False, return PIL Image object - + Returns: bytes or PIL.Image: Screenshot data in the requested format """ - from PIL import Image import base64 + + from PIL import Image + result = await self._send_cmd("screenshot") # assume result is a b64 string of an image img_bytes = base64.b64decode(result) import io + img = Image.open(io.BytesIO(img_bytes)) self._scene_size = img.size return img_bytes if as_bytes else img @@ -103,7 +113,7 @@ class DioramaComputerInterface: async def get_screen_size(self): """ Get the dimensions of the diorama scene. - + Returns: dict: Dictionary containing 'width' and 'height' keys with pixel dimensions """ @@ -114,7 +124,7 @@ class DioramaComputerInterface: async def move_cursor(self, x, y): """ Move the cursor to the specified coordinates. - + Args: x (int): X coordinate to move cursor to y (int): Y coordinate to move cursor to @@ -124,7 +134,7 @@ class DioramaComputerInterface: async def left_click(self, x=None, y=None): """ Perform a left mouse click at the specified coordinates or current cursor position. - + Args: x (int, optional): X coordinate to click at. If None, clicks at current cursor position y (int, optional): Y coordinate to click at. If None, clicks at current cursor position @@ -134,7 +144,7 @@ class DioramaComputerInterface: async def right_click(self, x=None, y=None): """ Perform a right mouse click at the specified coordinates or current cursor position. - + Args: x (int, optional): X coordinate to click at. If None, clicks at current cursor position y (int, optional): Y coordinate to click at. If None, clicks at current cursor position @@ -144,7 +154,7 @@ class DioramaComputerInterface: async def double_click(self, x=None, y=None): """ Perform a double mouse click at the specified coordinates or current cursor position. - + Args: x (int, optional): X coordinate to double-click at. If None, clicks at current cursor position y (int, optional): Y coordinate to double-click at. If None, clicks at current cursor position @@ -154,7 +164,7 @@ class DioramaComputerInterface: async def scroll_up(self, clicks=1): """ Scroll up by the specified number of clicks. - + Args: clicks (int): Number of scroll clicks to perform upward. Defaults to 1 """ @@ -163,7 +173,7 @@ class DioramaComputerInterface: async def scroll_down(self, clicks=1): """ Scroll down by the specified number of clicks. - + Args: clicks (int): Number of scroll clicks to perform downward. Defaults to 1 """ @@ -172,7 +182,7 @@ class DioramaComputerInterface: async def drag_to(self, x, y, duration=0.5): """ Drag from the current cursor position to the specified coordinates. - + Args: x (int): X coordinate to drag to y (int): Y coordinate to drag to @@ -183,7 +193,7 @@ class DioramaComputerInterface: async def get_cursor_position(self): """ Get the current cursor position. - + Returns: dict: Dictionary containing the current cursor coordinates """ @@ -192,7 +202,7 @@ class DioramaComputerInterface: async def type_text(self, text): """ Type the specified text at the current cursor position. - + Args: text (str): The text to type """ @@ -201,7 +211,7 @@ class DioramaComputerInterface: async def press_key(self, key): """ Press a single key. - + Args: key: The key to press """ @@ -210,10 +220,10 @@ class DioramaComputerInterface: async def hotkey(self, *keys): """ Press multiple keys simultaneously as a hotkey combination. - + Args: *keys: Variable number of keys to press together. Can be Key enum instances or strings - + Raises: ValueError: If any key is not a Key enum or string type """ @@ -224,7 +234,9 @@ class DioramaComputerInterface: elif isinstance(key, str): # Try to convert to enum if it matches a known key key_or_enum = Key.from_string(key) - actual_keys.append(key_or_enum.value if isinstance(key_or_enum, Key) else key_or_enum) + actual_keys.append( + key_or_enum.value if isinstance(key_or_enum, Key) else key_or_enum + ) else: raise ValueError(f"Invalid key type: {type(key)}. Must be Key enum or string.") await self._send_cmd("hotkey", {"keys": actual_keys}) @@ -232,11 +244,11 @@ class DioramaComputerInterface: async def to_screen_coordinates(self, x, y): """ Convert coordinates to screen coordinates. - + Args: x (int): X coordinate to convert y (int): Y coordinate to convert - + Returns: dict: Dictionary containing the converted screen coordinates """ diff --git a/libs/python/computer/computer/helpers.py b/libs/python/computer/computer/helpers.py index 8317b8d9..608dcbb9 100644 --- a/libs/python/computer/computer/helpers.py +++ b/libs/python/computer/computer/helpers.py @@ -1,8 +1,9 @@ """ Helper functions and decorators for the Computer module. """ -import logging + import asyncio +import logging from functools import wraps from typing import Any, Callable, Optional, TypeVar, cast @@ -11,10 +12,11 @@ _default_computer = None logger = logging.getLogger(__name__) + def set_default_computer(computer): """ Set the default computer instance to be used by the remote decorator. - + Args: computer: The computer instance to use as default """ @@ -25,21 +27,24 @@ def set_default_computer(computer): def sandboxed(venv_name: str = "default", computer: str = "default", max_retries: int = 3): """ Decorator that wraps a function to be executed remotely via computer.venv_exec - + Args: venv_name: Name of the virtual environment to execute in computer: The computer instance to use, or "default" to use the globally set default max_retries: Maximum number of retries for the remote execution """ + def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): # Determine which computer instance to use comp = computer if computer != "default" else _default_computer - + if comp is None: - raise RuntimeError("No computer instance available. Either specify a computer instance or call set_default_computer() first.") - + raise RuntimeError( + "No computer instance available. Either specify a computer instance or call set_default_computer() first." + ) + for i in range(max_retries): try: return await comp.venv_exec(venv_name, func, *args, **kwargs) @@ -48,5 +53,7 @@ def sandboxed(venv_name: str = "default", computer: str = "default", max_retries await asyncio.sleep(1) if i == max_retries - 1: raise e + return wrapper + return decorator diff --git a/libs/python/computer/computer/interface/__init__.py b/libs/python/computer/computer/interface/__init__.py index 6d7e1b78..d15b94d5 100644 --- a/libs/python/computer/computer/interface/__init__.py +++ b/libs/python/computer/computer/interface/__init__.py @@ -2,12 +2,12 @@ Interface package for Computer SDK. """ -from .factory import InterfaceFactory from .base import BaseComputerInterface +from .factory import InterfaceFactory from .macos import MacOSComputerInterface __all__ = [ "InterfaceFactory", "BaseComputerInterface", "MacOSComputerInterface", -] \ No newline at end of file +] diff --git a/libs/python/computer/computer/interface/base.py b/libs/python/computer/computer/interface/base.py index 3e343bba..8fa40025 100644 --- a/libs/python/computer/computer/interface/base.py +++ b/libs/python/computer/computer/interface/base.py @@ -1,14 +1,23 @@ """Base interface for computer control.""" from abc import ABC, abstractmethod -from typing import Optional, Dict, Any, Tuple, List +from typing import Any, Dict, List, Optional, Tuple + from ..logger import Logger, LogLevel -from .models import MouseButton, CommandResult +from .models import CommandResult, MouseButton + class BaseComputerInterface(ABC): """Base class for computer control interfaces.""" - def __init__(self, ip_address: str, username: str = "lume", password: str = "lume", api_key: Optional[str] = None, vm_name: Optional[str] = None): + def __init__( + self, + ip_address: str, + username: str = "lume", + password: str = "lume", + api_key: Optional[str] = None, + vm_name: Optional[str] = None, + ): """Initialize interface. Args: @@ -24,7 +33,7 @@ class BaseComputerInterface(ABC): self.api_key = api_key self.vm_name = vm_name self.logger = Logger("cua.interface", LogLevel.NORMAL) - + # Optional default delay time between commands (in seconds) self.delay: float = 0.0 @@ -55,9 +64,15 @@ class BaseComputerInterface(ABC): # Mouse Actions @abstractmethod - async def mouse_down(self, x: Optional[int] = None, y: Optional[int] = None, button: "MouseButton" = "left", delay: Optional[float] = None) -> None: + async def mouse_down( + self, + x: Optional[int] = None, + y: Optional[int] = None, + button: "MouseButton" = "left", + delay: Optional[float] = None, + ) -> None: """Press and hold a mouse button. - + Args: x: X coordinate to press at. If None, uses current cursor position. y: Y coordinate to press at. If None, uses current cursor position. @@ -65,11 +80,17 @@ class BaseComputerInterface(ABC): delay: Optional delay in seconds after the action """ pass - + @abstractmethod - async def mouse_up(self, x: Optional[int] = None, y: Optional[int] = None, button: "MouseButton" = "left", delay: Optional[float] = None) -> None: + async def mouse_up( + self, + x: Optional[int] = None, + y: Optional[int] = None, + button: "MouseButton" = "left", + delay: Optional[float] = None, + ) -> None: """Release a mouse button. - + Args: x: X coordinate to release at. If None, uses current cursor position. y: Y coordinate to release at. If None, uses current cursor position. @@ -77,11 +98,13 @@ class BaseComputerInterface(ABC): delay: Optional delay in seconds after the action """ pass - + @abstractmethod - async def left_click(self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None) -> None: + async def left_click( + self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None + ) -> None: """Perform a left mouse button click. - + Args: x: X coordinate to click at. If None, uses current cursor position. y: Y coordinate to click at. If None, uses current cursor position. @@ -90,9 +113,11 @@ class BaseComputerInterface(ABC): pass @abstractmethod - async def right_click(self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None) -> None: + async def right_click( + self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None + ) -> None: """Perform a right mouse button click. - + Args: x: X coordinate to click at. If None, uses current cursor position. y: Y coordinate to click at. If None, uses current cursor position. @@ -101,9 +126,11 @@ class BaseComputerInterface(ABC): pass @abstractmethod - async def double_click(self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None) -> None: + async def double_click( + self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None + ) -> None: """Perform a double left mouse button click. - + Args: x: X coordinate to double-click at. If None, uses current cursor position. y: Y coordinate to double-click at. If None, uses current cursor position. @@ -114,7 +141,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def move_cursor(self, x: int, y: int, delay: Optional[float] = None) -> None: """Move the cursor to the specified screen coordinates. - + Args: x: X coordinate to move cursor to. y: Y coordinate to move cursor to. @@ -123,7 +150,14 @@ class BaseComputerInterface(ABC): pass @abstractmethod - async def drag_to(self, x: int, y: int, button: str = "left", duration: float = 0.5, delay: Optional[float] = None) -> None: + async def drag_to( + self, + x: int, + y: int, + button: str = "left", + duration: float = 0.5, + delay: Optional[float] = None, + ) -> None: """Drag from current position to specified coordinates. Args: @@ -136,7 +170,13 @@ class BaseComputerInterface(ABC): pass @abstractmethod - async def drag(self, path: List[Tuple[int, int]], button: str = "left", duration: float = 0.5, delay: Optional[float] = None) -> None: + async def drag( + self, + path: List[Tuple[int, int]], + button: str = "left", + duration: float = 0.5, + delay: Optional[float] = None, + ) -> None: """Drag the cursor along a path of coordinates. Args: @@ -151,27 +191,27 @@ class BaseComputerInterface(ABC): @abstractmethod async def key_down(self, key: str, delay: Optional[float] = None) -> None: """Press and hold a key. - + Args: key: The key to press and hold (e.g., 'a', 'shift', 'ctrl'). delay: Optional delay in seconds after the action. """ pass - + @abstractmethod async def key_up(self, key: str, delay: Optional[float] = None) -> None: """Release a previously pressed key. - + Args: key: The key to release (e.g., 'a', 'shift', 'ctrl'). delay: Optional delay in seconds after the action. """ pass - + @abstractmethod async def type_text(self, text: str, delay: Optional[float] = None) -> None: """Type the specified text string. - + Args: text: The text string to type. delay: Optional delay in seconds after the action. @@ -181,7 +221,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def press_key(self, key: str, delay: Optional[float] = None) -> None: """Press and release a single key. - + Args: key: The key to press (e.g., 'a', 'enter', 'escape'). delay: Optional delay in seconds after the action. @@ -191,7 +231,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def hotkey(self, *keys: str, delay: Optional[float] = None) -> None: """Press multiple keys simultaneously (keyboard shortcut). - + Args: *keys: Variable number of keys to press together (e.g., 'ctrl', 'c'). delay: Optional delay in seconds after the action. @@ -202,18 +242,18 @@ class BaseComputerInterface(ABC): @abstractmethod async def scroll(self, x: int, y: int, delay: Optional[float] = None) -> None: """Scroll the mouse wheel by specified amounts. - + Args: x: Horizontal scroll amount (positive = right, negative = left). y: Vertical scroll amount (positive = up, negative = down). delay: Optional delay in seconds after the action. """ pass - + @abstractmethod async def scroll_down(self, clicks: int = 1, delay: Optional[float] = None) -> None: """Scroll down by the specified number of clicks. - + Args: clicks: Number of scroll clicks to perform downward. delay: Optional delay in seconds after the action. @@ -223,7 +263,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def scroll_up(self, clicks: int = 1, delay: Optional[float] = None) -> None: """Scroll up by the specified number of clicks. - + Args: clicks: Number of scroll clicks to perform upward. delay: Optional delay in seconds after the action. @@ -252,7 +292,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def get_cursor_position(self) -> Dict[str, int]: """Get the current cursor position on screen. - + Returns: Dict with 'x' and 'y' keys containing cursor coordinates. """ @@ -262,7 +302,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def copy_to_clipboard(self) -> str: """Get the current clipboard content. - + Returns: The text content currently stored in the clipboard. """ @@ -271,7 +311,7 @@ class BaseComputerInterface(ABC): @abstractmethod async def set_clipboard(self, text: str) -> None: """Set the clipboard content to the specified text. - + Args: text: The text to store in the clipboard. """ @@ -281,10 +321,10 @@ class BaseComputerInterface(ABC): @abstractmethod async def file_exists(self, path: str) -> bool: """Check if a file exists at the specified path. - + Args: path: The file path to check. - + Returns: True if the file exists, False otherwise. """ @@ -293,128 +333,128 @@ class BaseComputerInterface(ABC): @abstractmethod async def directory_exists(self, path: str) -> bool: """Check if a directory exists at the specified path. - + Args: path: The directory path to check. - + Returns: True if the directory exists, False otherwise. """ pass - + @abstractmethod async def list_dir(self, path: str) -> List[str]: """List the contents of a directory. - + Args: path: The directory path to list. - + Returns: List of file and directory names in the specified directory. """ pass - + @abstractmethod async def read_text(self, path: str) -> str: """Read the text contents of a file. - + Args: path: The file path to read from. - + Returns: The text content of the file. """ pass - + @abstractmethod async def write_text(self, path: str, content: str) -> None: """Write text content to a file. - + Args: path: The file path to write to. content: The text content to write. """ pass - + @abstractmethod async def read_bytes(self, path: str, offset: int = 0, length: Optional[int] = None) -> bytes: """Read file binary contents with optional seeking support. - + Args: path: Path to the file offset: Byte offset to start reading from (default: 0) length: Number of bytes to read (default: None for entire file) """ pass - + @abstractmethod async def write_bytes(self, path: str, content: bytes) -> None: """Write binary content to a file. - + Args: path: The file path to write to. content: The binary content to write. """ pass - + @abstractmethod async def delete_file(self, path: str) -> None: """Delete a file at the specified path. - + Args: path: The file path to delete. """ pass - + @abstractmethod async def create_dir(self, path: str) -> None: """Create a directory at the specified path. - + Args: path: The directory path to create. """ pass - + @abstractmethod async def delete_dir(self, path: str) -> None: """Delete a directory at the specified path. - + Args: path: The directory path to delete. """ pass - + @abstractmethod async def get_file_size(self, path: str) -> int: """Get the size of a file in bytes. - + Args: path: The file path to get the size of. - + Returns: The size of the file in bytes. """ pass - + @abstractmethod async def run_command(self, command: str) -> CommandResult: """Run shell command and return structured result. - + Executes a shell command using subprocess.run with shell=True and check=False. The command is run in the target environment and captures both stdout and stderr. - + Args: command (str): The shell command to execute - + Returns: CommandResult: A structured result containing: - stdout (str): Standard output from the command - - stderr (str): Standard error from the command + - stderr (str): Standard error from the command - returncode (int): Exit code from the command (0 indicates success) - + Raises: RuntimeError: If the command execution fails at the system level - + Example: result = await interface.run_command("ls -la") if result.returncode == 0: @@ -428,12 +468,12 @@ class BaseComputerInterface(ABC): @abstractmethod async def get_accessibility_tree(self) -> Dict: """Get the accessibility tree of the current screen. - + Returns: Dict containing the hierarchical accessibility information of screen elements. """ pass - + @abstractmethod async def to_screen_coordinates(self, x: float, y: float) -> tuple[float, float]: """Convert screenshot coordinates to screen coordinates. diff --git a/libs/python/computer/computer/interface/factory.py b/libs/python/computer/computer/interface/factory.py index 3647400e..7ae6b05c 100644 --- a/libs/python/computer/computer/interface/factory.py +++ b/libs/python/computer/computer/interface/factory.py @@ -1,42 +1,44 @@ """Factory for creating computer interfaces.""" from typing import Literal, Optional + from .base import BaseComputerInterface + class InterfaceFactory: """Factory for creating OS-specific computer interfaces.""" - + @staticmethod def create_interface_for_os( - os: Literal['macos', 'linux', 'windows'], + os: Literal["macos", "linux", "windows"], ip_address: str, api_key: Optional[str] = None, - vm_name: Optional[str] = None + vm_name: Optional[str] = None, ) -> BaseComputerInterface: """Create an interface for the specified OS. - + Args: os: Operating system type ('macos', 'linux', or 'windows') ip_address: IP address of the computer to control api_key: Optional API key for cloud authentication vm_name: Optional VM name for cloud authentication - + Returns: BaseComputerInterface: The appropriate interface for the OS - + Raises: ValueError: If the OS type is not supported """ # Import implementations here to avoid circular imports - from .macos import MacOSComputerInterface from .linux import LinuxComputerInterface + from .macos import MacOSComputerInterface from .windows import WindowsComputerInterface - - if os == 'macos': + + if os == "macos": return MacOSComputerInterface(ip_address, api_key=api_key, vm_name=vm_name) - elif os == 'linux': + elif os == "linux": return LinuxComputerInterface(ip_address, api_key=api_key, vm_name=vm_name) - elif os == 'windows': + elif os == "windows": return WindowsComputerInterface(ip_address, api_key=api_key, vm_name=vm_name) else: raise ValueError(f"Unsupported OS type: {os}") diff --git a/libs/python/computer/computer/interface/generic.py b/libs/python/computer/computer/interface/generic.py index c78274c3..7cd2372f 100644 --- a/libs/python/computer/computer/interface/generic.py +++ b/libs/python/computer/computer/interface/generic.py @@ -2,21 +2,35 @@ import asyncio import json import time from typing import Any, Dict, List, Optional, Tuple + +import aiohttp +import websockets from PIL import Image -import websockets -import aiohttp - from ..logger import Logger, LogLevel +from ..utils import ( + bytes_to_image, + decode_base64_image, + draw_box, + encode_base64_image, + resize_image, +) from .base import BaseComputerInterface -from ..utils import decode_base64_image, encode_base64_image, bytes_to_image, draw_box, resize_image -from .models import Key, KeyType, MouseButton, CommandResult +from .models import CommandResult, Key, KeyType, MouseButton class GenericComputerInterface(BaseComputerInterface): """Generic interface with common functionality for all supported platforms (Windows, Linux, macOS).""" - def __init__(self, ip_address: str, username: str = "lume", password: str = "lume", api_key: Optional[str] = None, vm_name: Optional[str] = None, logger_name: str = "computer.interface.generic"): + def __init__( + self, + ip_address: str, + username: str = "lume", + password: str = "lume", + api_key: Optional[str] = None, + vm_name: Optional[str] = None, + logger_name: str = "computer.interface.generic", + ): super().__init__(ip_address, username, password, api_key, vm_name) self._ws = None self._reconnect_task = None @@ -38,7 +52,7 @@ class GenericComputerInterface(BaseComputerInterface): async def _handle_delay(self, delay: Optional[float] = None): """Handle delay between commands using async sleep. - + Args: delay: Optional delay in seconds. If None, uses self.delay. """ @@ -51,18 +65,18 @@ class GenericComputerInterface(BaseComputerInterface): @property def ws_uri(self) -> str: """Get the WebSocket URI using the current IP address. - + Returns: WebSocket URI for the Computer API Server """ protocol = "wss" if self.api_key else "ws" port = "8443" if self.api_key else "8000" return f"{protocol}://{self.ip_address}:{port}/ws" - + @property def rest_uri(self) -> str: """Get the REST URI using the current IP address. - + Returns: REST URI for the Computer API Server """ @@ -71,23 +85,41 @@ class GenericComputerInterface(BaseComputerInterface): return f"{protocol}://{self.ip_address}:{port}/cmd" # Mouse actions - async def mouse_down(self, x: Optional[int] = None, y: Optional[int] = None, button: str = "left", delay: Optional[float] = None) -> None: + async def mouse_down( + self, + x: Optional[int] = None, + y: Optional[int] = None, + button: str = "left", + delay: Optional[float] = None, + ) -> None: await self._send_command("mouse_down", {"x": x, "y": y, "button": button}) await self._handle_delay(delay) - - async def mouse_up(self, x: Optional[int] = None, y: Optional[int] = None, button: str = "left", delay: Optional[float] = None) -> None: + + async def mouse_up( + self, + x: Optional[int] = None, + y: Optional[int] = None, + button: str = "left", + delay: Optional[float] = None, + ) -> None: await self._send_command("mouse_up", {"x": x, "y": y, "button": button}) await self._handle_delay(delay) - - async def left_click(self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None) -> None: + + async def left_click( + self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None + ) -> None: await self._send_command("left_click", {"x": x, "y": y}) await self._handle_delay(delay) - async def right_click(self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None) -> None: + async def right_click( + self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None + ) -> None: await self._send_command("right_click", {"x": x, "y": y}) await self._handle_delay(delay) - async def double_click(self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None) -> None: + async def double_click( + self, x: Optional[int] = None, y: Optional[int] = None, delay: Optional[float] = None + ) -> None: await self._send_command("double_click", {"x": x, "y": y}) await self._handle_delay(delay) @@ -95,27 +127,38 @@ class GenericComputerInterface(BaseComputerInterface): await self._send_command("move_cursor", {"x": x, "y": y}) await self._handle_delay(delay) - async def drag_to(self, x: int, y: int, button: "MouseButton" = "left", duration: float = 0.5, delay: Optional[float] = None) -> None: + async def drag_to( + self, + x: int, + y: int, + button: "MouseButton" = "left", + duration: float = 0.5, + delay: Optional[float] = None, + ) -> None: await self._send_command( "drag_to", {"x": x, "y": y, "button": button, "duration": duration} ) await self._handle_delay(delay) - async def drag(self, path: List[Tuple[int, int]], button: "MouseButton" = "left", duration: float = 0.5, delay: Optional[float] = None) -> None: - await self._send_command( - "drag", {"path": path, "button": button, "duration": duration} - ) + async def drag( + self, + path: List[Tuple[int, int]], + button: "MouseButton" = "left", + duration: float = 0.5, + delay: Optional[float] = None, + ) -> None: + await self._send_command("drag", {"path": path, "button": button, "duration": duration}) await self._handle_delay(delay) # Keyboard Actions async def key_down(self, key: "KeyType", delay: Optional[float] = None) -> None: await self._send_command("key_down", {"key": key}) await self._handle_delay(delay) - + async def key_up(self, key: "KeyType", delay: Optional[float] = None) -> None: await self._send_command("key_up", {"key": key}) await self._handle_delay(delay) - + async def type_text(self, text: str, delay: Optional[float] = None) -> None: await self._send_command("type_text", {"text": text}) await self._handle_delay(delay) @@ -195,10 +238,12 @@ class GenericComputerInterface(BaseComputerInterface): elif isinstance(key, str): # Try to convert to enum if it matches a known key key_or_enum = Key.from_string(key) - actual_keys.append(key_or_enum.value if isinstance(key_or_enum, Key) else key_or_enum) + actual_keys.append( + key_or_enum.value if isinstance(key_or_enum, Key) else key_or_enum + ) else: raise ValueError(f"Invalid key type: {type(key)}. Must be Key enum or string.") - + await self._send_command("hotkey", {"keys": actual_keys}) await self._handle_delay(delay) @@ -206,11 +251,11 @@ class GenericComputerInterface(BaseComputerInterface): async def scroll(self, x: int, y: int, delay: Optional[float] = None) -> None: await self._send_command("scroll", {"x": x, "y": y}) await self._handle_delay(delay) - + async def scroll_down(self, clicks: int = 1, delay: Optional[float] = None) -> None: await self._send_command("scroll_down", {"clicks": clicks}) await self._handle_delay(delay) - + async def scroll_up(self, clicks: int = 1, delay: Optional[float] = None) -> None: await self._send_command("scroll_up", {"clicks": clicks}) await self._handle_delay(delay) @@ -294,27 +339,32 @@ class GenericComputerInterface(BaseComputerInterface): await self._send_command("set_clipboard", {"text": text}) # File Operations - async def _write_bytes_chunked(self, path: str, content: bytes, append: bool = False, chunk_size: int = 1024 * 1024) -> None: + async def _write_bytes_chunked( + self, path: str, content: bytes, append: bool = False, chunk_size: int = 1024 * 1024 + ) -> None: """Write large files in chunks to avoid memory issues.""" total_size = len(content) current_offset = 0 - + while current_offset < total_size: chunk_end = min(current_offset + chunk_size, total_size) chunk_data = content[current_offset:chunk_end] - + # First chunk uses the original append flag, subsequent chunks always append chunk_append = append if current_offset == 0 else True - - result = await self._send_command("write_bytes", { - "path": path, - "content_b64": encode_base64_image(chunk_data), - "append": chunk_append - }) - + + result = await self._send_command( + "write_bytes", + { + "path": path, + "content_b64": encode_base64_image(chunk_data), + "append": chunk_append, + }, + ) + if not result.get("success", False): raise RuntimeError(result.get("error", "Failed to write file chunk")) - + current_offset = chunk_end async def write_bytes(self, path: str, content: bytes, append: bool = False) -> None: @@ -322,36 +372,39 @@ class GenericComputerInterface(BaseComputerInterface): if len(content) > 5 * 1024 * 1024: # 5MB threshold await self._write_bytes_chunked(path, content, append) return - - result = await self._send_command("write_bytes", {"path": path, "content_b64": encode_base64_image(content), "append": append}) + + result = await self._send_command( + "write_bytes", + {"path": path, "content_b64": encode_base64_image(content), "append": append}, + ) if not result.get("success", False): raise RuntimeError(result.get("error", "Failed to write file")) - async def _read_bytes_chunked(self, path: str, offset: int, total_length: int, chunk_size: int = 1024 * 1024) -> bytes: + async def _read_bytes_chunked( + self, path: str, offset: int, total_length: int, chunk_size: int = 1024 * 1024 + ) -> bytes: """Read large files in chunks to avoid memory issues.""" chunks = [] current_offset = offset remaining = total_length - + while remaining > 0: read_size = min(chunk_size, remaining) - result = await self._send_command("read_bytes", { - "path": path, - "offset": current_offset, - "length": read_size - }) - + result = await self._send_command( + "read_bytes", {"path": path, "offset": current_offset, "length": read_size} + ) + if not result.get("success", False): raise RuntimeError(result.get("error", "Failed to read file chunk")) - + content_b64 = result.get("content_b64", "") chunk_data = decode_base64_image(content_b64) chunks.append(chunk_data) - + current_offset += read_size remaining -= read_size - - return b''.join(chunks) + + return b"".join(chunks) async def read_bytes(self, path: str, offset: int = 0, length: Optional[int] = None) -> bytes: # For large files, use chunked reading @@ -360,34 +413,36 @@ class GenericComputerInterface(BaseComputerInterface): file_size = await self.get_file_size(path) # If file is larger than 5MB, read in chunks if file_size > 5 * 1024 * 1024: # 5MB threshold - return await self._read_bytes_chunked(path, offset, file_size - offset if offset > 0 else file_size) - - result = await self._send_command("read_bytes", { - "path": path, - "offset": offset, - "length": length - }) + return await self._read_bytes_chunked( + path, offset, file_size - offset if offset > 0 else file_size + ) + + result = await self._send_command( + "read_bytes", {"path": path, "offset": offset, "length": length} + ) if not result.get("success", False): raise RuntimeError(result.get("error", "Failed to read file")) content_b64 = result.get("content_b64", "") return decode_base64_image(content_b64) - async def read_text(self, path: str, encoding: str = 'utf-8') -> str: + async def read_text(self, path: str, encoding: str = "utf-8") -> str: """Read text from a file with specified encoding. - + Args: path: Path to the file to read encoding: Text encoding to use (default: 'utf-8') - + Returns: str: The decoded text content of the file """ content_bytes = await self.read_bytes(path) return content_bytes.decode(encoding) - async def write_text(self, path: str, content: str, encoding: str = 'utf-8', append: bool = False) -> None: + async def write_text( + self, path: str, content: str, encoding: str = "utf-8", append: bool = False + ) -> None: """Write text to a file with specified encoding. - + Args: path: Path to the file to write content: Text content to write @@ -440,7 +495,7 @@ class GenericComputerInterface(BaseComputerInterface): return CommandResult( stdout=result.get("stdout", ""), stderr=result.get("stderr", ""), - returncode=result.get("return_code", 0) + returncode=result.get("return_code", 0), ) # Accessibility Actions @@ -450,7 +505,7 @@ class GenericComputerInterface(BaseComputerInterface): if not result.get("success", False): raise RuntimeError(result.get("error", "Failed to get accessibility tree")) return result - + async def get_active_window_bounds(self) -> Dict[str, int]: """Get the bounds of the currently active window.""" result = await self._send_command("get_active_window_bounds") @@ -556,33 +611,30 @@ class GenericComputerInterface(BaseComputerInterface): timeout=120, ) self.logger.info("WebSocket connection established") - + # If api_key and vm_name are provided, perform authentication handshake if self.api_key and self.vm_name: self.logger.info("Performing authentication handshake...") auth_message = { "command": "authenticate", - "params": { - "api_key": self.api_key, - "container_name": self.vm_name - } + "params": {"api_key": self.api_key, "container_name": self.vm_name}, } await self._ws.send(json.dumps(auth_message)) - + # Wait for authentication response async with self._recv_lock: auth_response = await asyncio.wait_for(self._ws.recv(), timeout=10) auth_result = json.loads(auth_response) - + if not auth_result.get("success"): error_msg = auth_result.get("error", "Authentication failed") self.logger.error(f"Authentication failed: {error_msg}") await self._ws.close() self._ws = None raise ConnectionError(f"Authentication failed: {error_msg}") - + self.logger.info("Authentication successful") - + self._reconnect_delay = 1 # Reset reconnect delay on successful connection self._last_ping = time.time() retry_count = 0 # Reset retry count on successful connection @@ -592,7 +644,7 @@ class GenericComputerInterface(BaseComputerInterface): # Only log the first error at WARNING level, then every Nth attempt if retry_count == 1: self.logger.warning( - f"Computer API Server not ready yet. Will retry automatically." + "Computer API Server not ready yet. Will retry automatically." ) elif retry_count % log_interval == 0: self.logger.warning( @@ -640,7 +692,7 @@ class GenericComputerInterface(BaseComputerInterface): # Only log connection lost warnings at most once every min_warning_interval seconds if current_time - last_warning_time >= min_warning_interval: self.logger.warning( - f"Computer API Server connection lost. Will retry automatically." + "Computer API Server connection lost. Will retry automatically." ) last_warning_time = current_time else: @@ -653,7 +705,7 @@ class GenericComputerInterface(BaseComputerInterface): except: pass self._ws = None - + async def _ensure_connection(self): """Ensure WebSocket connection is established.""" if self._reconnect_task is None or self._reconnect_task.done(): @@ -722,32 +774,30 @@ class GenericComputerInterface(BaseComputerInterface): raise last_error if last_error else RuntimeError("Failed to send command") - async def _send_command_rest(self, command: str, params: Optional[Dict] = None) -> Dict[str, Any]: + async def _send_command_rest( + self, command: str, params: Optional[Dict] = None + ) -> Dict[str, Any]: """Send command through REST API without retries or connection management.""" try: # Prepare the request payload payload = {"command": command, "params": params or {}} - + # Prepare headers headers = {"Content-Type": "application/json"} if self.api_key: headers["X-API-Key"] = self.api_key if self.vm_name: headers["X-Container-Name"] = self.vm_name - + # Send the request async with aiohttp.ClientSession() as session: - async with session.post( - self.rest_uri, - json=payload, - headers=headers - ) as response: + async with session.post(self.rest_uri, json=payload, headers=headers) as response: # Get the response text response_text = await response.text() - + # Trim whitespace response_text = response_text.strip() - + # Check if it starts with "data: " if response_text.startswith("data: "): # Extract everything after "data: " @@ -758,38 +808,39 @@ class GenericComputerInterface(BaseComputerInterface): return { "success": False, "error": "Server returned malformed response", - "message": response_text + "message": response_text, } else: # Return error response return { "success": False, "error": "Server returned malformed response", - "message": response_text + "message": response_text, } - + except Exception as e: - return { - "success": False, - "error": "Request failed", - "message": str(e) - } + return {"success": False, "error": "Request failed", "message": str(e)} async def _send_command(self, command: str, params: Optional[Dict] = None) -> Dict[str, Any]: """Send command using REST API with WebSocket fallback.""" # Try REST API first result = await self._send_command_rest(command, params) - + # If REST failed with "Request failed", try WebSocket as fallback - if not result.get("success", True) and (result.get("error") == "Request failed" or result.get("error") == "Server returned malformed response"): - self.logger.warning(f"REST API failed for command '{command}', trying WebSocket fallback") + if not result.get("success", True) and ( + result.get("error") == "Request failed" + or result.get("error") == "Server returned malformed response" + ): + self.logger.warning( + f"REST API failed for command '{command}', trying WebSocket fallback" + ) try: return await self._send_command_ws(command, params) except Exception as e: self.logger.error(f"WebSocket fallback also failed: {e}") # Return the original REST error return result - + return result async def wait_for_ready(self, timeout: int = 60, interval: float = 1.0): @@ -800,7 +851,9 @@ class GenericComputerInterface(BaseComputerInterface): result = await self._send_command_rest("version", {}) assert result.get("success", True) except Exception as e: - self.logger.debug(f"REST API failed for command 'version', trying WebSocket fallback: {e}") + self.logger.debug( + f"REST API failed for command 'version', trying WebSocket fallback: {e}" + ) try: await self._wait_for_ready_ws(timeout, interval) return @@ -949,7 +1002,7 @@ class GenericComputerInterface(BaseComputerInterface): # if self._ws: # asyncio.create_task(self._ws.close()) # self._ws = None - + def force_close(self): """Force close the WebSocket connection. @@ -962,4 +1015,3 @@ class GenericComputerInterface(BaseComputerInterface): if self._ws: asyncio.create_task(self._ws.close()) self._ws = None - diff --git a/libs/python/computer/computer/interface/linux.py b/libs/python/computer/computer/interface/linux.py index 174fe07a..9e5a3c9b 100644 --- a/libs/python/computer/computer/interface/linux.py +++ b/libs/python/computer/computer/interface/linux.py @@ -1,8 +1,19 @@ from typing import Optional + from .generic import GenericComputerInterface + class LinuxComputerInterface(GenericComputerInterface): """Interface for Linux.""" - def __init__(self, ip_address: str, username: str = "lume", password: str = "lume", api_key: Optional[str] = None, vm_name: Optional[str] = None): - super().__init__(ip_address, username, password, api_key, vm_name, "computer.interface.linux") + def __init__( + self, + ip_address: str, + username: str = "lume", + password: str = "lume", + api_key: Optional[str] = None, + vm_name: Optional[str] = None, + ): + super().__init__( + ip_address, username, password, api_key, vm_name, "computer.interface.linux" + ) diff --git a/libs/python/computer/computer/interface/macos.py b/libs/python/computer/computer/interface/macos.py index f4d03a52..6dcf8a1b 100644 --- a/libs/python/computer/computer/interface/macos.py +++ b/libs/python/computer/computer/interface/macos.py @@ -1,12 +1,25 @@ -from .generic import GenericComputerInterface from typing import Optional +from .generic import GenericComputerInterface + + class MacOSComputerInterface(GenericComputerInterface): """Interface for macOS.""" - def __init__(self, ip_address: str, username: str = "lume", password: str = "lume", api_key: Optional[str] = None, vm_name: Optional[str] = None): - super().__init__(ip_address, username, password, api_key, vm_name, "computer.interface.macos") + def __init__( + self, + ip_address: str, + username: str = "lume", + password: str = "lume", + api_key: Optional[str] = None, + vm_name: Optional[str] = None, + ): + super().__init__( + ip_address, username, password, api_key, vm_name, "computer.interface.macos" + ) async def diorama_cmd(self, action: str, arguments: Optional[dict] = None) -> dict: """Send a diorama command to the server (macOS only).""" - return await self._send_command("diorama_cmd", {"action": action, "arguments": arguments or {}}) \ No newline at end of file + return await self._send_command( + "diorama_cmd", {"action": action, "arguments": arguments or {}} + ) diff --git a/libs/python/computer/computer/interface/models.py b/libs/python/computer/computer/interface/models.py index 223ac321..bbba789a 100644 --- a/libs/python/computer/computer/interface/models.py +++ b/libs/python/computer/computer/interface/models.py @@ -1,136 +1,145 @@ -from enum import Enum -from typing import Dict, List, Any, TypedDict, Union, Literal from dataclasses import dataclass +from enum import Enum +from typing import Any, Dict, List, Literal, TypedDict, Union + @dataclass class CommandResult: stdout: str - stderr: str + stderr: str returncode: int - + def __init__(self, stdout: str, stderr: str, returncode: int): self.stdout = stdout self.stderr = stderr self.returncode = returncode + # Navigation key literals -NavigationKey = Literal['pagedown', 'pageup', 'home', 'end', 'left', 'right', 'up', 'down'] +NavigationKey = Literal["pagedown", "pageup", "home", "end", "left", "right", "up", "down"] # Special key literals -SpecialKey = Literal['enter', 'esc', 'tab', 'space', 'backspace', 'del'] +SpecialKey = Literal["enter", "esc", "tab", "space", "backspace", "del"] # Modifier key literals -ModifierKey = Literal['ctrl', 'alt', 'shift', 'win', 'command', 'option'] +ModifierKey = Literal["ctrl", "alt", "shift", "win", "command", "option"] # Function key literals -FunctionKey = Literal['f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12'] +FunctionKey = Literal["f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12"] + class Key(Enum): """Keyboard keys that can be used with press_key. - + These key names map to PyAutoGUI's expected key names. """ + # Navigation - PAGE_DOWN = 'pagedown' - PAGE_UP = 'pageup' - HOME = 'home' - END = 'end' - LEFT = 'left' - RIGHT = 'right' - UP = 'up' - DOWN = 'down' - + PAGE_DOWN = "pagedown" + PAGE_UP = "pageup" + HOME = "home" + END = "end" + LEFT = "left" + RIGHT = "right" + UP = "up" + DOWN = "down" + # Special keys - RETURN = 'enter' - ENTER = 'enter' - ESCAPE = 'esc' - ESC = 'esc' - TAB = 'tab' - SPACE = 'space' - BACKSPACE = 'backspace' - DELETE = 'del' - + RETURN = "enter" + ENTER = "enter" + ESCAPE = "esc" + ESC = "esc" + TAB = "tab" + SPACE = "space" + BACKSPACE = "backspace" + DELETE = "del" + # Modifier keys - ALT = 'alt' - CTRL = 'ctrl' - SHIFT = 'shift' - WIN = 'win' - COMMAND = 'command' - OPTION = 'option' - + ALT = "alt" + CTRL = "ctrl" + SHIFT = "shift" + WIN = "win" + COMMAND = "command" + OPTION = "option" + # Function keys - F1 = 'f1' - F2 = 'f2' - F3 = 'f3' - F4 = 'f4' - F5 = 'f5' - F6 = 'f6' - F7 = 'f7' - F8 = 'f8' - F9 = 'f9' - F10 = 'f10' - F11 = 'f11' - F12 = 'f12' + F1 = "f1" + F2 = "f2" + F3 = "f3" + F4 = "f4" + F5 = "f5" + F6 = "f6" + F7 = "f7" + F8 = "f8" + F9 = "f9" + F10 = "f10" + F11 = "f11" + F12 = "f12" @classmethod - def from_string(cls, key: str) -> 'Key | str': + def from_string(cls, key: str) -> "Key | str": """Convert a string key name to a Key enum value. - + Args: key: String key name to convert - + Returns: Key enum value if the string matches a known key, otherwise returns the original string for single character keys """ # Map common alternative names to enum values key_mapping = { - 'page_down': cls.PAGE_DOWN, - 'page down': cls.PAGE_DOWN, - 'pagedown': cls.PAGE_DOWN, - 'page_up': cls.PAGE_UP, - 'page up': cls.PAGE_UP, - 'pageup': cls.PAGE_UP, - 'return': cls.RETURN, - 'enter': cls.ENTER, - 'escape': cls.ESCAPE, - 'esc': cls.ESC, - 'delete': cls.DELETE, - 'del': cls.DELETE, + "page_down": cls.PAGE_DOWN, + "page down": cls.PAGE_DOWN, + "pagedown": cls.PAGE_DOWN, + "page_up": cls.PAGE_UP, + "page up": cls.PAGE_UP, + "pageup": cls.PAGE_UP, + "return": cls.RETURN, + "enter": cls.ENTER, + "escape": cls.ESCAPE, + "esc": cls.ESC, + "delete": cls.DELETE, + "del": cls.DELETE, # Modifier key mappings - 'alt': cls.ALT, - 'ctrl': cls.CTRL, - 'control': cls.CTRL, - 'shift': cls.SHIFT, - 'win': cls.WIN, - 'windows': cls.WIN, - 'super': cls.WIN, - 'command': cls.COMMAND, - 'cmd': cls.COMMAND, - '⌘': cls.COMMAND, - 'option': cls.OPTION, - 'βŒ₯': cls.OPTION, + "alt": cls.ALT, + "ctrl": cls.CTRL, + "control": cls.CTRL, + "shift": cls.SHIFT, + "win": cls.WIN, + "windows": cls.WIN, + "super": cls.WIN, + "command": cls.COMMAND, + "cmd": cls.COMMAND, + "⌘": cls.COMMAND, + "option": cls.OPTION, + "βŒ₯": cls.OPTION, } - + normalized = key.lower().strip() return key_mapping.get(normalized, key) + # Combined key type KeyType = Union[Key, NavigationKey, SpecialKey, ModifierKey, FunctionKey, str] # Key type for mouse actions -MouseButton = Literal['left', 'right', 'middle'] +MouseButton = Literal["left", "right", "middle"] + class AccessibilityWindow(TypedDict): """Information about a window in the accessibility tree.""" + app_name: str pid: int frontmost: bool has_windows: bool windows: List[Dict[str, Any]] + class AccessibilityTree(TypedDict): """Complete accessibility tree information.""" + success: bool frontmost_application: str - windows: List[AccessibilityWindow] \ No newline at end of file + windows: List[AccessibilityWindow] diff --git a/libs/python/computer/computer/interface/windows.py b/libs/python/computer/computer/interface/windows.py index a874d359..558ad749 100644 --- a/libs/python/computer/computer/interface/windows.py +++ b/libs/python/computer/computer/interface/windows.py @@ -1,8 +1,19 @@ from typing import Optional + from .generic import GenericComputerInterface + class WindowsComputerInterface(GenericComputerInterface): """Interface for Windows.""" - def __init__(self, ip_address: str, username: str = "lume", password: str = "lume", api_key: Optional[str] = None, vm_name: Optional[str] = None): - super().__init__(ip_address, username, password, api_key, vm_name, "computer.interface.windows") + def __init__( + self, + ip_address: str, + username: str = "lume", + password: str = "lume", + api_key: Optional[str] = None, + vm_name: Optional[str] = None, + ): + super().__init__( + ip_address, username, password, api_key, vm_name, "computer.interface.windows" + ) diff --git a/libs/python/computer/computer/models.py b/libs/python/computer/computer/models.py index 5ead143f..beb0e65a 100644 --- a/libs/python/computer/computer/models.py +++ b/libs/python/computer/computer/models.py @@ -1,27 +1,33 @@ """Models for computer configuration.""" from dataclasses import dataclass -from typing import Optional, Any, Dict +from typing import Any, Dict, Optional # Import base provider interface from .providers.base import BaseVMProvider + @dataclass class Display: """Display configuration.""" + width: int height: int + @dataclass class Image: """VM image configuration.""" + image: str tag: str name: str + @dataclass class Computer: """Computer configuration.""" + image: str tag: str name: str @@ -29,13 +35,13 @@ class Computer: memory: str cpu: str vm_provider: Optional[BaseVMProvider] = None - + # @property # Remove the property decorator async def get_ip(self) -> Optional[str]: """Get the IP address of the VM.""" if not self.vm_provider: return None - + vm = await self.vm_provider.get_vm(self.name) # Handle both object attribute and dictionary access for ip_address if vm: @@ -44,4 +50,4 @@ class Computer: else: # Access as attribute for object-based return values return getattr(vm, "ip_address", None) - return None \ No newline at end of file + return None diff --git a/libs/python/computer/computer/providers/base.py b/libs/python/computer/computer/providers/base.py index 0c36c913..a32988bd 100644 --- a/libs/python/computer/computer/providers/base.py +++ b/libs/python/computer/computer/providers/base.py @@ -2,13 +2,14 @@ import abc from enum import StrEnum -from typing import Dict, Optional, Any, AsyncContextManager +from typing import Any, AsyncContextManager, Dict, Optional from .types import ListVMsResponse class VMProviderType(StrEnum): """Enum of supported VM provider types.""" + LUME = "lume" LUMIER = "lumier" CLOUD = "cloud" @@ -19,30 +20,30 @@ class VMProviderType(StrEnum): class BaseVMProvider(AsyncContextManager): """Base interface for VM providers. - + All VM provider implementations must implement this interface. """ - + @property @abc.abstractmethod def provider_type(self) -> VMProviderType: """Get the provider type.""" pass - + @abc.abstractmethod async def get_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Get VM information by name. - + Args: name: Name of the VM to get information for storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM information including status, IP address, etc. """ pass - + @abc.abstractmethod async def list_vms(self) -> ListVMsResponse: """List all available VMs. @@ -52,76 +53,80 @@ class BaseVMProvider(AsyncContextManager): `computer.providers.types.MinimalVM`. """ pass - + @abc.abstractmethod - async def run_vm(self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + async def run_vm( + self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Run a VM by name with the given options. - + Args: image: Name/tag of the image to use name: Name of the VM to run run_opts: Dictionary of run options (memory, cpu, etc.) storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM run status and information """ pass - + @abc.abstractmethod async def stop_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Stop a VM by name. - + Args: name: Name of the VM to stop storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM stop status and information """ pass - + @abc.abstractmethod async def restart_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Restart a VM by name. - + Args: name: Name of the VM to restart storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM restart status and information """ pass - + @abc.abstractmethod - async def update_vm(self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + async def update_vm( + self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Update VM configuration. - + Args: name: Name of the VM to update update_opts: Dictionary of update options (memory, cpu, etc.) storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM update status and information """ pass - + @abc.abstractmethod async def get_ip(self, name: str, storage: Optional[str] = None, retry_delay: int = 2) -> str: """Get the IP address of a VM, waiting indefinitely until it's available. - + Args: name: Name of the VM to get the IP for storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. retry_delay: Delay between retries in seconds (default: 2) - + Returns: IP address of the VM when it becomes available """ diff --git a/libs/python/computer/computer/providers/cloud/provider.py b/libs/python/computer/computer/providers/cloud/provider.py index 5e4e7c51..7d479686 100644 --- a/libs/python/computer/computer/providers/cloud/provider.py +++ b/libs/python/computer/computer/providers/cloud/provider.py @@ -9,7 +9,7 @@ Implements the following public API endpoints: """ import logging -from typing import Dict, List, Optional, Any +from typing import Any, Dict, List, Optional from ..base import BaseVMProvider, VMProviderType from ..types import ListVMsResponse, MinimalVM @@ -18,15 +18,17 @@ from ..types import ListVMsResponse, MinimalVM logger = logging.getLogger(__name__) import asyncio -import aiohttp -from urllib.parse import urlparse import os +from urllib.parse import urlparse +import aiohttp DEFAULT_API_BASE = os.getenv("CUA_API_BASE", "https://api.cua.ai") + class CloudProvider(BaseVMProvider): """Cloud VM Provider implementation.""" + def __init__( self, api_key: str, @@ -123,9 +125,9 @@ class CloudProvider(BaseVMProvider): vm["api_url"] = f"https://{host}:8443" # vnc_url: only when password available if not vm.get("vnc_url") and isinstance(password, str) and password: - vm[ - "vnc_url" - ] = f"https://{host}/vnc.html?autoconnect=true&password={password}" + vm["vnc_url"] = ( + f"https://{host}/vnc.html?autoconnect=true&password={password}" + ) enriched.append(vm) return enriched # type: ignore[return-value] logger.warning("Unexpected response for list_vms; expected list") @@ -138,7 +140,13 @@ class CloudProvider(BaseVMProvider): logger.error(f"list_vms failed: HTTP {resp.status} - {text}") return [] - async def run_vm(self, name: str, image: Optional[str] = None, run_opts: Optional[Dict[str, Any]] = None, storage: Optional[str] = None) -> Dict[str, Any]: + async def run_vm( + self, + name: str, + image: Optional[str] = None, + run_opts: Optional[Dict[str, Any]] = None, + storage: Optional[str] = None, + ) -> Dict[str, Any]: """Start a VM via public API. Returns a minimal status.""" url = f"{self.api_base}/v1/vms/{name}/start" headers = { @@ -209,11 +217,19 @@ class CloudProvider(BaseVMProvider): text = await resp.text() return {"name": name, "status": "error", "message": text} - async def update_vm(self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + async def update_vm( + self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: logger.warning("CloudProvider.update_vm is not implemented via public API") - return {"name": name, "status": "unchanged", "message": "update_vm not supported by public API"} + return { + "name": name, + "status": "unchanged", + "message": "update_vm not supported by public API", + } - async def get_ip(self, name: Optional[str] = None, storage: Optional[str] = None, retry_delay: int = 2) -> str: + async def get_ip( + self, name: Optional[str] = None, storage: Optional[str] = None, retry_delay: int = 2 + ) -> str: """ Return the VM's IP address as '{container_name}.containers.cloud.trycua.com'. Uses the provided 'name' argument (the VM name requested by the caller), diff --git a/libs/python/computer/computer/providers/docker/__init__.py b/libs/python/computer/computer/providers/docker/__init__.py index 048f526c..64e42609 100644 --- a/libs/python/computer/computer/providers/docker/__init__.py +++ b/libs/python/computer/computer/providers/docker/__init__.py @@ -5,6 +5,7 @@ from .provider import DockerProvider # Check if Docker is available try: import subprocess + subprocess.run(["docker", "--version"], capture_output=True, check=True) HAS_DOCKER = True except (subprocess.SubprocessError, FileNotFoundError): diff --git a/libs/python/computer/computer/providers/docker/provider.py b/libs/python/computer/computer/providers/docker/provider.py index 97622a29..f133d771 100644 --- a/libs/python/computer/computer/providers/docker/provider.py +++ b/libs/python/computer/computer/providers/docker/provider.py @@ -6,13 +6,13 @@ Linux VMs with computer-server. It handles VM lifecycle operations through Docke commands and container management. """ -import logging -import json import asyncio -from typing import Dict, List, Optional, Any +import json +import logging +import re import subprocess import time -import re +from typing import Any, Dict, List, Optional from ..base import BaseVMProvider, VMProviderType @@ -30,11 +30,11 @@ except (subprocess.SubprocessError, FileNotFoundError): class DockerProvider(BaseVMProvider): """ Docker VM Provider implementation using Docker containers. - + This provider uses Docker to run containers with the CUA Ubuntu image that includes computer-server for remote computer use. """ - + def __init__( self, port: Optional[int] = 8000, @@ -80,7 +80,7 @@ class DockerProvider(BaseVMProvider): # Detect image type and configure user directory accordingly self._detect_image_config() - + def _detect_image_config(self): """Detect image type and configure paths accordingly.""" # Detect if this is a docker-xfce image or Kasm image @@ -98,10 +98,10 @@ class DockerProvider(BaseVMProvider): def provider_type(self) -> VMProviderType: """Return the provider type.""" return VMProviderType.DOCKER - + def _parse_memory(self, memory_str: str) -> str: """Parse memory string to Docker format. - + Examples: "8GB" -> "8g" "1024MB" -> "1024m" @@ -109,31 +109,31 @@ class DockerProvider(BaseVMProvider): """ if isinstance(memory_str, int): return f"{memory_str}m" - + if isinstance(memory_str, str): # Extract number and unit match = re.match(r"(\d+)([A-Za-z]*)", memory_str) if match: value, unit = match.groups() unit = unit.upper() - + if unit == "GB" or unit == "G": return f"{value}g" elif unit == "MB" or unit == "M" or unit == "": return f"{value}m" - + # Default fallback logger.warning(f"Could not parse memory string '{memory_str}', using 4g default") return "4g" # Default to 4GB - + async def get_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Get VM information by name. - + Args: name: Name of the VM to get information for storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM information including status, IP address, etc. """ @@ -141,7 +141,7 @@ class DockerProvider(BaseVMProvider): # Check if container exists and get its status cmd = ["docker", "inspect", name] result = subprocess.run(cmd, capture_output=True, text=True) - + if result.returncode != 0: # Container doesn't exist return { @@ -150,14 +150,14 @@ class DockerProvider(BaseVMProvider): "ip_address": None, "ports": {}, "image": self.image, - "provider": "docker" + "provider": "docker", } - + # Parse container info container_info = json.loads(result.stdout)[0] state = container_info["State"] network_settings = container_info["NetworkSettings"] - + # Determine status if state["Running"]: status = "running" @@ -165,7 +165,7 @@ class DockerProvider(BaseVMProvider): status = "paused" else: status = "stopped" - + # Get IP address ip_address = network_settings.get("IPAddress", "") if not ip_address and "Networks" in network_settings: @@ -174,7 +174,7 @@ class DockerProvider(BaseVMProvider): if network_info.get("IPAddress"): ip_address = network_info["IPAddress"] break - + # Get port mappings ports = {} if "Ports" in network_settings and network_settings["Ports"]: @@ -187,7 +187,7 @@ class DockerProvider(BaseVMProvider): if mapping.get("HostPort"): ports[container_port] = mapping["HostPort"] break # Use the first valid mapping - + return { "name": name, "status": status, @@ -199,47 +199,46 @@ class DockerProvider(BaseVMProvider): "created": container_info["Created"], "started": state.get("StartedAt", ""), } - + except Exception as e: logger.error(f"Error getting VM info for {name}: {e}") import traceback + traceback.print_exc() - return { - "name": name, - "status": "error", - "error": str(e), - "provider": "docker" - } - + return {"name": name, "status": "error", "error": str(e), "provider": "docker"} + async def list_vms(self) -> List[Dict[str, Any]]: """List all Docker containers managed by this provider.""" try: # List all containers (running and stopped) with the CUA image cmd = ["docker", "ps", "-a", "--filter", f"ancestor={self.image}", "--format", "json"] result = subprocess.run(cmd, capture_output=True, text=True, check=True) - + containers = [] if result.stdout.strip(): - for line in result.stdout.strip().split('\n'): + for line in result.stdout.strip().split("\n"): if line.strip(): container_data = json.loads(line) vm_info = await self.get_vm(container_data["Names"]) containers.append(vm_info) - + return containers - + except subprocess.CalledProcessError as e: logger.error(f"Error listing containers: {e.stderr}") return [] except Exception as e: logger.error(f"Error listing VMs: {e}") import traceback + traceback.print_exc() return [] - - async def run_vm(self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + + async def run_vm( + self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Run a VM with the given options. - + Args: image: Name/tag of the Docker image to use name: Name of the container to run @@ -248,7 +247,7 @@ class DockerProvider(BaseVMProvider): - cpu: CPU limit (e.g., 2 for 2 cores) - vnc_port: Specific port for VNC interface - api_port: Specific port for computer-server API - + Returns: Dictionary with VM status information """ @@ -263,36 +262,36 @@ class DockerProvider(BaseVMProvider): logger.info(f"Starting existing container {name}") start_cmd = ["docker", "start", name] result = subprocess.run(start_cmd, capture_output=True, text=True, check=True) - + # Wait for container to be ready await self._wait_for_container_ready(name) return await self.get_vm(name, storage) - + # Use provided image or default docker_image = image if image != "default" else self.image - + # Build docker run command cmd = ["docker", "run", "-d", "--name", name] - + # Add memory limit if specified if "memory" in run_opts: memory_limit = self._parse_memory(run_opts["memory"]) cmd.extend(["--memory", memory_limit]) - + # Add CPU limit if specified if "cpu" in run_opts: cpu_count = str(run_opts["cpu"]) cmd.extend(["--cpus", cpu_count]) - + # Add port mappings vnc_port = run_opts.get("vnc_port", self.vnc_port) api_port = run_opts.get("api_port", self.api_port) - + if vnc_port: cmd.extend(["-p", f"{vnc_port}:6901"]) # VNC port if api_port: cmd.extend(["-p", f"{api_port}:8000"]) # computer-server API port - + # Add volume mounts if storage is specified storage_path = storage or self.storage if storage_path and storage_path != "ephemeral": @@ -303,66 +302,56 @@ class DockerProvider(BaseVMProvider): if self.shared_path: # Mount shared directory using detected home directory cmd.extend(["-v", f"{self.shared_path}:{self._home_dir}/shared"]) - + # Add environment variables cmd.extend(["-e", "VNC_PW=password"]) # Set VNC password cmd.extend(["-e", "VNCOPTIONS=-disableBasicAuth"]) # Disable VNC basic auth - + # Add the image cmd.append(docker_image) - + logger.info(f"Running Docker container with command: {' '.join(cmd)}") - + # Run the container result = subprocess.run(cmd, capture_output=True, text=True, check=True) container_id = result.stdout.strip() - + logger.info(f"Container {name} started with ID: {container_id[:12]}") - + # Store container info self._container_id = container_id self._running_containers[name] = container_id - + # Wait for container to be ready await self._wait_for_container_ready(name) - + # Return VM info vm_info = await self.get_vm(name, storage) vm_info["container_id"] = container_id[:12] - + return vm_info - + except subprocess.CalledProcessError as e: error_msg = f"Failed to run container {name}: {e.stderr}" logger.error(error_msg) - return { - "name": name, - "status": "error", - "error": error_msg, - "provider": "docker" - } + return {"name": name, "status": "error", "error": error_msg, "provider": "docker"} except Exception as e: error_msg = f"Error running VM {name}: {e}" logger.error(error_msg) - return { - "name": name, - "status": "error", - "error": error_msg, - "provider": "docker" - } - + return {"name": name, "status": "error", "error": error_msg, "provider": "docker"} + async def _wait_for_container_ready(self, container_name: str, timeout: int = 60) -> bool: """Wait for the Docker container to be fully ready. - + Args: container_name: Name of the Docker container to check timeout: Maximum time to wait in seconds (default: 60 seconds) - + Returns: True if the container is running and ready """ logger.info(f"Waiting for container {container_name} to be ready...") - + start_time = time.time() while time.time() - start_time < timeout: try: @@ -370,100 +359,94 @@ class DockerProvider(BaseVMProvider): vm_info = await self.get_vm(container_name) if vm_info["status"] == "running": logger.info(f"Container {container_name} is running") - + # Additional check: try to connect to computer-server API # This is optional - we'll just wait a bit more for services to start await asyncio.sleep(5) return True - + except Exception as e: logger.debug(f"Container {container_name} not ready yet: {e}") - + await asyncio.sleep(2) - + logger.warning(f"Container {container_name} did not become ready within {timeout} seconds") return False - + async def stop_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Stop a running VM by stopping the Docker container.""" try: logger.info(f"Stopping container {name}") - + # Stop the container cmd = ["docker", "stop", name] result = subprocess.run(cmd, capture_output=True, text=True, check=True) - + # Remove from running containers tracking if name in self._running_containers: del self._running_containers[name] - + logger.info(f"Container {name} stopped successfully") - + return { "name": name, "status": "stopped", "message": "Container stopped successfully", - "provider": "docker" + "provider": "docker", } - + except subprocess.CalledProcessError as e: error_msg = f"Failed to stop container {name}: {e.stderr}" logger.error(error_msg) - return { - "name": name, - "status": "error", - "error": error_msg, - "provider": "docker" - } + return {"name": name, "status": "error", "error": error_msg, "provider": "docker"} except Exception as e: error_msg = f"Error stopping VM {name}: {e}" logger.error(error_msg) - return { - "name": name, - "status": "error", - "error": error_msg, - "provider": "docker" - } - + return {"name": name, "status": "error", "error": error_msg, "provider": "docker"} + async def restart_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: raise NotImplementedError("DockerProvider does not support restarting VMs.") - async def update_vm(self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + async def update_vm( + self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Update VM configuration. - - Note: Docker containers cannot be updated while running. + + Note: Docker containers cannot be updated while running. This method will return an error suggesting to recreate the container. """ return { "name": name, "status": "error", "error": "Docker containers cannot be updated while running. Please stop and recreate the container with new options.", - "provider": "docker" + "provider": "docker", } - + async def get_ip(self, name: str, storage: Optional[str] = None, retry_delay: int = 2) -> str: """Get the IP address of a VM, waiting indefinitely until it's available. - + Args: name: Name of the VM to get the IP for storage: Optional storage path override retry_delay: Delay between retries in seconds (default: 2) - + Returns: IP address of the VM when it becomes available """ logger.info(f"Getting IP address for container {name}") - + total_attempts = 0 while True: total_attempts += 1 - + try: vm_info = await self.get_vm(name, storage) - + if vm_info["status"] == "error": - raise Exception(f"VM is in error state: {vm_info.get('error', 'Unknown error')}") - + raise Exception( + f"VM is in error state: {vm_info.get('error', 'Unknown error')}" + ) + # TODO: for now, return localhost # it seems the docker container is not accessible from the host # on WSL2, unless you port forward? not sure @@ -476,40 +459,42 @@ class DockerProvider(BaseVMProvider): if ip and ip != "unknown" and not ip.startswith("0.0.0.0"): logger.info(f"Got valid container IP address: {ip}") return ip - + # For Docker containers, we can also use localhost if ports are mapped if vm_info["status"] == "running" and vm_info.get("ports"): - logger.info(f"Container is running with port mappings, using localhost") + logger.info("Container is running with port mappings, using localhost") return "127.0.0.1" - + # Check the container status status = vm_info.get("status", "unknown") - + if status == "stopped": logger.info(f"Container status is {status}, but still waiting for it to start") elif status != "running": logger.info(f"Container is not running yet (status: {status}). Waiting...") else: logger.info("Container is running but no valid IP address yet. Waiting...") - + except Exception as e: logger.warning(f"Error getting container {name} IP: {e}, continuing to wait...") - + # Wait before next retry await asyncio.sleep(retry_delay) - + # Add progress log every 10 attempts if total_attempts % 10 == 0: - logger.info(f"Still waiting for container {name} IP after {total_attempts} attempts...") - + logger.info( + f"Still waiting for container {name} IP after {total_attempts} attempts..." + ) + async def __aenter__(self): """Async context manager entry.""" logger.debug("Entering DockerProvider context") return self - + async def __aexit__(self, exc_type, exc_val, exc_tb): """Async context manager exit. - + This method handles cleanup of running containers if needed. """ logger.debug(f"Exiting DockerProvider context, handling exceptions: {exc_type}") diff --git a/libs/python/computer/computer/providers/factory.py b/libs/python/computer/computer/providers/factory.py index b95c2c61..634b4293 100644 --- a/libs/python/computer/computer/providers/factory.py +++ b/libs/python/computer/computer/providers/factory.py @@ -1,7 +1,7 @@ """Factory for creating VM providers.""" import logging -from typing import Dict, Optional, Any, Type, Union +from typing import Any, Dict, Optional, Type, Union from .base import BaseVMProvider, VMProviderType @@ -26,7 +26,7 @@ class VMProviderFactory: **kwargs, ) -> BaseVMProvider: """Create a VM provider of the specified type. - + Args: provider_type: Type of VM provider to create port: Port for the API server @@ -38,10 +38,10 @@ class VMProviderFactory: verbose: Enable verbose logging ephemeral: Use ephemeral (temporary) storage noVNC_port: Specific port for noVNC interface (for Lumier provider) - + Returns: An instance of the requested VM provider - + Raises: ImportError: If the required dependencies for the provider are not installed ValueError: If the provider type is not supported @@ -52,21 +52,18 @@ class VMProviderFactory: provider_type = VMProviderType(provider_type.lower()) except ValueError: provider_type = VMProviderType.UNKNOWN - + if provider_type == VMProviderType.LUME: try: - from .lume import LumeProvider, HAS_LUME + from .lume import HAS_LUME, LumeProvider + if not HAS_LUME: raise ImportError( "The pylume package is required for LumeProvider. " "Please install it with 'pip install cua-computer[lume]'" ) return LumeProvider( - port=port, - host=host, - storage=storage, - verbose=verbose, - ephemeral=ephemeral + port=port, host=host, storage=storage, verbose=verbose, ephemeral=ephemeral ) except ImportError as e: logger.error(f"Failed to import LumeProvider: {e}") @@ -76,7 +73,8 @@ class VMProviderFactory: ) from e elif provider_type == VMProviderType.LUMIER: try: - from .lumier import LumierProvider, HAS_LUMIER + from .lumier import HAS_LUMIER, LumierProvider + if not HAS_LUMIER: raise ImportError( "Docker is required for LumierProvider. " @@ -90,7 +88,7 @@ class VMProviderFactory: image=image or "macos-sequoia-cua:latest", verbose=verbose, ephemeral=ephemeral, - noVNC_port=noVNC_port + noVNC_port=noVNC_port, ) except ImportError as e: logger.error(f"Failed to import LumierProvider: {e}") @@ -102,6 +100,7 @@ class VMProviderFactory: elif provider_type == VMProviderType.CLOUD: try: from .cloud import CloudProvider + return CloudProvider( verbose=verbose, **kwargs, @@ -114,7 +113,8 @@ class VMProviderFactory: ) from e elif provider_type == VMProviderType.WINSANDBOX: try: - from .winsandbox import WinSandboxProvider, HAS_WINSANDBOX + from .winsandbox import HAS_WINSANDBOX, WinSandboxProvider + if not HAS_WINSANDBOX: raise ImportError( "pywinsandbox is required for WinSandboxProvider. " @@ -126,7 +126,7 @@ class VMProviderFactory: storage=storage, verbose=verbose, ephemeral=ephemeral, - **kwargs + **kwargs, ) except ImportError as e: logger.error(f"Failed to import WinSandboxProvider: {e}") @@ -136,7 +136,8 @@ class VMProviderFactory: ) from e elif provider_type == VMProviderType.DOCKER: try: - from .docker import DockerProvider, HAS_DOCKER + from .docker import HAS_DOCKER, DockerProvider + if not HAS_DOCKER: raise ImportError( "Docker is required for DockerProvider. " @@ -150,7 +151,7 @@ class VMProviderFactory: image=image or "trycua/cua-ubuntu:latest", verbose=verbose, ephemeral=ephemeral, - vnc_port=noVNC_port + vnc_port=noVNC_port, ) except ImportError as e: logger.error(f"Failed to import DockerProvider: {e}") diff --git a/libs/python/computer/computer/providers/lume/__init__.py b/libs/python/computer/computer/providers/lume/__init__.py index 8196c49b..70a48a47 100644 --- a/libs/python/computer/computer/providers/lume/__init__.py +++ b/libs/python/computer/computer/providers/lume/__init__.py @@ -2,6 +2,7 @@ try: from .provider import LumeProvider + HAS_LUME = True __all__ = ["LumeProvider"] except ImportError: diff --git a/libs/python/computer/computer/providers/lume/provider.py b/libs/python/computer/computer/providers/lume/provider.py index d651d2eb..e9b953c9 100644 --- a/libs/python/computer/computer/providers/lume/provider.py +++ b/libs/python/computer/computer/providers/lume/provider.py @@ -4,39 +4,40 @@ This provider uses direct curl commands to interact with the Lume API, removing the dependency on the pylume Python package. """ -import os -import re import asyncio import json import logging +import os +import re import subprocess import urllib.parse -from typing import Dict, Any, Optional, List, Tuple +from typing import Any, Dict, List, Optional, Tuple -from ..base import BaseVMProvider, VMProviderType from ...logger import Logger, LogLevel +from ..base import BaseVMProvider, VMProviderType from ..lume_api import ( + HAS_CURL, lume_api_get, + lume_api_pull, lume_api_run, lume_api_stop, lume_api_update, - lume_api_pull, - HAS_CURL, - parse_memory + parse_memory, ) # Setup logging logger = logging.getLogger(__name__) + class LumeProvider(BaseVMProvider): """Lume VM provider implementation using direct curl commands. - + This provider uses curl to interact with the Lume API server, removing the dependency on the pylume Python package. """ - + def __init__( - self, + self, port: int = 7777, host: str = "localhost", storage: Optional[str] = None, @@ -44,7 +45,7 @@ class LumeProvider(BaseVMProvider): ephemeral: bool = False, ): """Initialize the Lume provider. - + Args: port: Port for the Lume API server (default: 7777) host: Host to use for API connections (default: localhost) @@ -56,42 +57,44 @@ class LumeProvider(BaseVMProvider): "curl is required for LumeProvider. " "Please ensure it is installed and in your PATH." ) - + self.host = host self.port = port # Default port for Lume API self.storage = storage self.verbose = verbose self.ephemeral = ephemeral # If True, VMs will be deleted after stopping - + # Base API URL for Lume API calls self.api_base_url = f"http://{self.host}:{self.port}" - + self.logger = logging.getLogger(__name__) - + @property def provider_type(self) -> VMProviderType: """Get the provider type.""" return VMProviderType.LUME - + async def __aenter__(self): """Enter async context manager.""" # No initialization needed, just return self return self - + async def __aexit__(self, exc_type, exc_val, exc_tb): """Exit async context manager.""" # No cleanup needed pass - - def _lume_api_get(self, vm_name: str = "", storage: Optional[str] = None, debug: bool = False) -> Dict[str, Any]: + + def _lume_api_get( + self, vm_name: str = "", storage: Optional[str] = None, debug: bool = False + ) -> Dict[str, Any]: """Get VM information using shared lume_api function. - + Args: vm_name: Optional name of the VM to get info for. If empty, lists all VMs. storage: Optional storage path override. If provided, this will be used instead of self.storage debug: Whether to show debug output - + Returns: Dictionary with VM status information parsed from JSON response """ @@ -102,105 +105,105 @@ class LumeProvider(BaseVMProvider): port=self.port, storage=storage if storage is not None else self.storage, debug=debug, - verbose=self.verbose + verbose=self.verbose, ) - - def _lume_api_run(self, vm_name: str, run_opts: Dict[str, Any], debug: bool = False) -> Dict[str, Any]: + + def _lume_api_run( + self, vm_name: str, run_opts: Dict[str, Any], debug: bool = False + ) -> Dict[str, Any]: """Run a VM using shared lume_api function. - + Args: vm_name: Name of the VM to run run_opts: Dictionary of run options debug: Whether to show debug output - + Returns: Dictionary with API response or error information """ # Use the shared implementation from lume_api module return lume_api_run( - vm_name=vm_name, + vm_name=vm_name, host=self.host, port=self.port, run_opts=run_opts, storage=self.storage, debug=debug, - verbose=self.verbose + verbose=self.verbose, ) - + def _lume_api_stop(self, vm_name: str, debug: bool = False) -> Dict[str, Any]: """Stop a VM using shared lume_api function. - + Args: vm_name: Name of the VM to stop debug: Whether to show debug output - + Returns: Dictionary with API response or error information """ # Use the shared implementation from lume_api module return lume_api_stop( - vm_name=vm_name, + vm_name=vm_name, host=self.host, port=self.port, storage=self.storage, debug=debug, - verbose=self.verbose + verbose=self.verbose, ) - - def _lume_api_update(self, vm_name: str, update_opts: Dict[str, Any], debug: bool = False) -> Dict[str, Any]: + + def _lume_api_update( + self, vm_name: str, update_opts: Dict[str, Any], debug: bool = False + ) -> Dict[str, Any]: """Update VM configuration using shared lume_api function. - + Args: vm_name: Name of the VM to update update_opts: Dictionary of update options debug: Whether to show debug output - + Returns: Dictionary with API response or error information """ # Use the shared implementation from lume_api module return lume_api_update( - vm_name=vm_name, + vm_name=vm_name, host=self.host, port=self.port, update_opts=update_opts, storage=self.storage, debug=debug, - verbose=self.verbose + verbose=self.verbose, ) - + async def get_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Get VM information by name. - + Args: name: Name of the VM to get information for storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM information including status, IP address, etc. - + Note: If storage is not provided, the provider's default storage path will be used. The storage parameter allows overriding the storage location for this specific call. """ if not HAS_CURL: logger.error("curl is not available. Cannot get VM status.") - return { - "name": name, - "status": "unavailable", - "error": "curl is not available" - } - + return {"name": name, "status": "unavailable", "error": "curl is not available"} + # First try to get detailed VM info from the API try: # Query the Lume API for VM status using the provider's storage_path vm_info = self._lume_api_get( - vm_name=name, + vm_name=name, storage=storage if storage is not None else self.storage, - debug=self.verbose + debug=self.verbose, ) - + # Check for API errors if "error" in vm_info: logger.debug(f"API request error: {vm_info['error']}") @@ -209,12 +212,12 @@ class LumeProvider(BaseVMProvider): "name": name, "status": "starting", # VM is still starting - do not attempt to connect yet "api_status": "error", - "error": vm_info["error"] + "error": vm_info["error"], } - + # Process the VM status information vm_status = vm_info.get("status", "unknown") - + # Check if VM is stopped or not running - don't wait for IP in this case if vm_status == "stopped": logger.info(f"VM {name} is in '{vm_status}' state - not waiting for IP address") @@ -222,10 +225,10 @@ class LumeProvider(BaseVMProvider): result = { "name": name, "status": vm_status, - **vm_info # Include all original fields from the API response + **vm_info, # Include all original fields from the API response } return result - + # Handle field name differences between APIs # Some APIs use camelCase, others use snake_case if "vncUrl" in vm_info: @@ -234,7 +237,7 @@ class LumeProvider(BaseVMProvider): vnc_url = vm_info["vnc_url"] else: vnc_url = "" - + if "ipAddress" in vm_info: ip_address = vm_info["ipAddress"] elif "ip_address" in vm_info: @@ -243,40 +246,42 @@ class LumeProvider(BaseVMProvider): # If no IP address is provided and VM is supposed to be running, # report it as still starting ip_address = None - logger.info(f"VM {name} is in '{vm_status}' state but no IP address found - reporting as still starting") - + logger.info( + f"VM {name} is in '{vm_status}' state but no IP address found - reporting as still starting" + ) + logger.info(f"VM {name} status: {vm_status}") - + # Return the complete status information result = { "name": name, "status": vm_status if vm_status else "running", "ip_address": ip_address, "vnc_url": vnc_url, - "api_status": "ok" + "api_status": "ok", } - + # Include all original fields from the API response if isinstance(vm_info, dict): for key, value in vm_info.items(): if key not in result: # Don't override our carefully processed fields result[key] = value - + return result - + except Exception as e: logger.error(f"Failed to get VM status: {e}") # Return a fallback status that indicates the VM is not ready yet return { "name": name, "status": "initializing", # VM is still initializing - "error": f"Failed to get VM status: {str(e)}" + "error": f"Failed to get VM status: {str(e)}", } - + async def list_vms(self) -> List[Dict[str, Any]]: """List all available VMs.""" result = self._lume_api_get(debug=self.verbose) - + # Extract the VMs list from the response if "vms" in result and isinstance(result["vms"], list): return result["vms"] @@ -285,48 +290,49 @@ class LumeProvider(BaseVMProvider): return [] else: return [] - - async def run_vm(self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + + async def run_vm( + self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Run a VM with the given options. - + If the VM does not exist in the storage location, this will attempt to pull it from the Lume registry first. - + Args: image: Image name to use when pulling the VM if it doesn't exist name: Name of the VM to run run_opts: Dictionary of run options (memory, cpu, etc.) storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM run status and information """ # First check if VM exists by trying to get its info vm_info = await self.get_vm(name, storage=storage) - + if "error" in vm_info: # VM doesn't exist, try to pull it - self.logger.info(f"VM {name} not found, attempting to pull image {image} from registry...") - - # Call pull_vm with the image parameter - pull_result = await self.pull_vm( - name=name, - image=image, - storage=storage + self.logger.info( + f"VM {name} not found, attempting to pull image {image} from registry..." ) - + + # Call pull_vm with the image parameter + pull_result = await self.pull_vm(name=name, image=image, storage=storage) + # Check if pull was successful if "error" in pull_result: self.logger.error(f"Failed to pull VM image: {pull_result['error']}") return pull_result # Return the error from pull - + self.logger.info(f"Successfully pulled VM image {image} as {name}") - + # Now run the VM with the given options self.logger.info(f"Running VM {name} with options: {run_opts}") - + from ..lume_api import lume_api_run + return lume_api_run( vm_name=name, host=self.host, @@ -334,52 +340,48 @@ class LumeProvider(BaseVMProvider): run_opts=run_opts, storage=storage if storage is not None else self.storage, debug=self.verbose, - verbose=self.verbose + verbose=self.verbose, ) - + async def stop_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Stop a running VM. - + If this provider was initialized with ephemeral=True, the VM will also be deleted after it is stopped. - + Args: name: Name of the VM to stop storage: Optional storage path override - + Returns: Dictionary with stop status and information """ # Stop the VM first stop_result = self._lume_api_stop(name, debug=self.verbose) - + # Log ephemeral status for debugging self.logger.info(f"Ephemeral mode status: {self.ephemeral}") - + # If ephemeral mode is enabled, delete the VM after stopping if self.ephemeral and (stop_result.get("success", False) or "error" not in stop_result): self.logger.info(f"Ephemeral mode enabled - deleting VM {name} after stopping") try: delete_result = await self.delete_vm(name, storage=storage) - + # Return combined result return { **stop_result, # Include all stop result info "deleted": True, - "delete_result": delete_result + "delete_result": delete_result, } except Exception as e: self.logger.error(f"Failed to delete ephemeral VM {name}: {e}") # Include the error but still return stop result - return { - **stop_result, - "deleted": False, - "delete_error": str(e) - } - + return {**stop_result, "deleted": False, "delete_error": str(e)} + # Just return the stop result if not ephemeral return stop_result - + async def pull_vm( self, name: str, @@ -390,7 +392,7 @@ class LumeProvider(BaseVMProvider): pull_opts: Optional[Dict[str, Any]] = None, ) -> Dict[str, Any]: """Pull a VM image from the registry. - + Args: name: Name for the VM after pulling image: The image name to pull (e.g. 'macos-sequoia-cua:latest') @@ -398,31 +400,31 @@ class LumeProvider(BaseVMProvider): registry: Registry to pull from (default: ghcr.io) organization: Organization in registry (default: trycua) pull_opts: Additional options for pulling the VM (optional) - + Returns: Dictionary with information about the pulled VM - + Raises: RuntimeError: If pull operation fails or image is not provided """ # Validate image parameter if not image: raise ValueError("Image parameter is required for pull_vm") - + self.logger.info(f"Pulling VM image '{image}' as '{name}'") self.logger.info("You can check the pull progress using: lume logs -f") - + # Set default pull_opts if not provided if pull_opts is None: pull_opts = {} - + # Log information about the operation self.logger.debug(f"Pull storage location: {storage or 'default'}") - + try: # Call the lume_api_pull function from lume_api.py from ..lume_api import lume_api_pull - + result = lume_api_pull( image=image, name=name, @@ -432,113 +434,115 @@ class LumeProvider(BaseVMProvider): registry=registry, organization=organization, debug=self.verbose, - verbose=self.verbose + verbose=self.verbose, ) - + # Check for errors in the result if "error" in result: self.logger.error(f"Failed to pull VM image: {result['error']}") return result - + self.logger.info(f"Successfully pulled VM image '{image}' as '{name}'") return result except Exception as e: self.logger.error(f"Failed to pull VM image '{image}': {e}") return {"error": f"Failed to pull VM: {str(e)}"} - + async def delete_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Delete a VM permanently. - + Args: name: Name of the VM to delete storage: Optional storage path override - + Returns: Dictionary with delete status and information """ self.logger.info(f"Deleting VM {name}...") - + try: # Call the lume_api_delete function we created from ..lume_api import lume_api_delete - + result = lume_api_delete( vm_name=name, host=self.host, port=self.port, storage=storage if storage is not None else self.storage, debug=self.verbose, - verbose=self.verbose + verbose=self.verbose, ) - + # Check for errors in the result if "error" in result: self.logger.error(f"Failed to delete VM: {result['error']}") return result - + self.logger.info(f"Successfully deleted VM '{name}'") return result except Exception as e: self.logger.error(f"Failed to delete VM '{name}': {e}") return {"error": f"Failed to delete VM: {str(e)}"} - - async def update_vm(self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + + async def update_vm( + self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Update VM configuration.""" return self._lume_api_update(name, update_opts, debug=self.verbose) - + async def restart_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: raise NotImplementedError("LumeProvider does not support restarting VMs.") - + async def get_ip(self, name: str, storage: Optional[str] = None, retry_delay: int = 2) -> str: """Get the IP address of a VM, waiting indefinitely until it's available. - + Args: name: Name of the VM to get the IP for storage: Optional storage path override retry_delay: Delay between retries in seconds (default: 2) - + Returns: IP address of the VM when it becomes available """ # Track total attempts for logging purposes total_attempts = 0 - + # Loop indefinitely until we get a valid IP while True: total_attempts += 1 - + # Log retry message but not on first attempt if total_attempts > 1: self.logger.info(f"Waiting for VM {name} IP address (attempt {total_attempts})...") - + try: # Get VM information vm_info = await self.get_vm(name, storage=storage) - + # Check if we got a valid IP ip = vm_info.get("ip_address", None) if ip and ip != "unknown" and not ip.startswith("0.0.0.0"): self.logger.info(f"Got valid VM IP address: {ip}") return ip - + # Check the VM status status = vm_info.get("status", "unknown") - + # If VM is not running yet, log and wait if status != "running": self.logger.info(f"VM is not running yet (status: {status}). Waiting...") # If VM is running but no IP yet, wait and retry else: self.logger.info("VM is running but no valid IP address yet. Waiting...") - + except Exception as e: self.logger.warning(f"Error getting VM {name} IP: {e}, continuing to wait...") - + # Wait before next retry await asyncio.sleep(retry_delay) - + # Add progress log every 10 attempts if total_attempts % 10 == 0: - self.logger.info(f"Still waiting for VM {name} IP after {total_attempts} attempts...") - - + self.logger.info( + f"Still waiting for VM {name} IP after {total_attempts} attempts..." + ) diff --git a/libs/python/computer/computer/providers/lume_api.py b/libs/python/computer/computer/providers/lume_api.py index 3cbe1097..d034e1df 100644 --- a/libs/python/computer/computer/providers/lume_api.py +++ b/libs/python/computer/computer/providers/lume_api.py @@ -4,11 +4,11 @@ This module contains shared functions for interacting with the Lume API, used by both the LumeProvider and LumierProvider classes. """ -import logging import json +import logging import subprocess import urllib.parse -from typing import Dict, List, Optional, Any +from typing import Any, Dict, List, Optional # Setup logging logger = logging.getLogger(__name__) @@ -27,10 +27,10 @@ def lume_api_get( port: int, storage: Optional[str] = None, debug: bool = False, - verbose: bool = False + verbose: bool = False, ) -> Dict[str, Any]: """Use curl to get VM information from Lume API. - + Args: vm_name: Name of the VM to get info for host: API host @@ -38,46 +38,46 @@ def lume_api_get( storage: Storage path for the VM debug: Whether to show debug output verbose: Enable verbose logging - + Returns: Dictionary with VM status information parsed from JSON response """ # URL encode the storage parameter for the query encoded_storage = "" storage_param = "" - + if storage: # First encode the storage path properly - encoded_storage = urllib.parse.quote(storage, safe='') + encoded_storage = urllib.parse.quote(storage, safe="") storage_param = f"?storage={encoded_storage}" - + # Construct API URL with encoded storage parameter if needed api_url = f"http://{host}:{port}/lume/vms/{vm_name}{storage_param}" - + # Construct the curl command with increased timeouts for more reliability # --connect-timeout: Time to establish connection (15 seconds) # --max-time: Maximum time for the whole operation (20 seconds) # -f: Fail silently (no output at all) on server errors # Add single quotes around URL to ensure special characters are handled correctly cmd = ["curl", "--connect-timeout", "15", "--max-time", "20", "-s", "-f", f"'{api_url}'"] - + # For logging and display, show the properly escaped URL display_cmd = ["curl", "--connect-timeout", "15", "--max-time", "20", "-s", "-f", api_url] - + # Only print the curl command when debug is enabled - display_curl_string = ' '.join(display_cmd) + display_curl_string = " ".join(display_cmd) logger.debug(f"Executing API request: {display_curl_string}") - + # Execute the command - for execution we need to use shell=True to handle URLs with special characters try: # Use a single string with shell=True for proper URL handling - shell_cmd = ' '.join(cmd) + shell_cmd = " ".join(cmd) result = subprocess.run(shell_cmd, shell=True, capture_output=True, text=True) - + # Handle curl exit codes if result.returncode != 0: curl_error = "Unknown error" - + # Map common curl error codes to helpful messages if result.returncode == 7: curl_error = "Failed to connect to the API server - it might still be starting up" @@ -86,35 +86,42 @@ def lume_api_get( elif result.returncode == 28: curl_error = "Operation timeout - the API server is taking too long to respond" elif result.returncode == 52: - curl_error = "Empty reply from server - the API server is starting but not fully ready yet" + curl_error = ( + "Empty reply from server - the API server is starting but not fully ready yet" + ) elif result.returncode == 56: curl_error = "Network problem during data transfer - check container networking" - + # Only log at debug level to reduce noise during retries logger.debug(f"API request failed with code {result.returncode}: {curl_error}") - + # Return a more useful error message return { "error": f"API request failed: {curl_error}", "curl_code": result.returncode, "vm_name": vm_name, - "status": "unknown" # We don't know the actual status due to API error + "status": "unknown", # We don't know the actual status due to API error } - + # Try to parse the response as JSON if result.stdout and result.stdout.strip(): try: vm_status = json.loads(result.stdout) if debug or verbose: - logger.info(f"Successfully parsed VM status: {vm_status.get('status', 'unknown')}") + logger.info( + f"Successfully parsed VM status: {vm_status.get('status', 'unknown')}" + ) return vm_status except json.JSONDecodeError as e: # Return the raw response if it's not valid JSON logger.warning(f"Invalid JSON response: {e}") if "Virtual machine not found" in result.stdout: return {"status": "not_found", "message": "VM not found in Lume API"} - - return {"error": f"Invalid JSON response: {result.stdout[:100]}...", "status": "unknown"} + + return { + "error": f"Invalid JSON response: {result.stdout[:100]}...", + "status": "unknown", + } else: return {"error": "Empty response from API", "status": "unknown"} except subprocess.SubprocessError as e: @@ -129,10 +136,10 @@ def lume_api_run( run_opts: Dict[str, Any], storage: Optional[str] = None, debug: bool = False, - verbose: bool = False + verbose: bool = False, ) -> Dict[str, Any]: """Run a VM using curl. - + Args: vm_name: Name of the VM to run host: API host @@ -141,53 +148,62 @@ def lume_api_run( storage: Storage path for the VM debug: Whether to show debug output verbose: Enable verbose logging - + Returns: Dictionary with API response or error information """ # Construct API URL api_url = f"http://{host}:{port}/lume/vms/{vm_name}/run" - + # Prepare JSON payload with required parameters payload = {} - + # Add CPU cores if specified if "cpu" in run_opts: payload["cpu"] = run_opts["cpu"] - + # Add memory if specified if "memory" in run_opts: payload["memory"] = run_opts["memory"] - + # Add storage parameter if specified if storage: payload["storage"] = storage elif "storage" in run_opts: payload["storage"] = run_opts["storage"] - + # Add shared directories if specified if "shared_directories" in run_opts and run_opts["shared_directories"]: payload["sharedDirectories"] = run_opts["shared_directories"] - + # Log the payload for debugging logger.debug(f"API payload: {json.dumps(payload, indent=2)}") - + # Construct the curl command cmd = [ - "curl", "--connect-timeout", "30", "--max-time", "30", - "-s", "-X", "POST", "-H", "Content-Type: application/json", - "-d", json.dumps(payload), - api_url + "curl", + "--connect-timeout", + "30", + "--max-time", + "30", + "-s", + "-X", + "POST", + "-H", + "Content-Type: application/json", + "-d", + json.dumps(payload), + api_url, ] - + # Execute the command try: result = subprocess.run(cmd, capture_output=True, text=True) - + if result.returncode != 0: logger.warning(f"API request failed with code {result.returncode}: {result.stderr}") return {"error": f"API request failed: {result.stderr}"} - + # Try to parse the response as JSON if result.stdout and result.stdout.strip(): try: @@ -195,7 +211,11 @@ def lume_api_run( return response except json.JSONDecodeError: # Return the raw response if it's not valid JSON - return {"success": True, "message": "VM started successfully", "raw_response": result.stdout} + return { + "success": True, + "message": "VM started successfully", + "raw_response": result.stdout, + } else: return {"success": True, "message": "VM started successfully"} except subprocess.SubprocessError as e: @@ -209,10 +229,10 @@ def lume_api_stop( port: int, storage: Optional[str] = None, debug: bool = False, - verbose: bool = False + verbose: bool = False, ) -> Dict[str, Any]: """Stop a VM using curl. - + Args: vm_name: Name of the VM to stop host: API host @@ -220,39 +240,48 @@ def lume_api_stop( storage: Storage path for the VM debug: Whether to show debug output verbose: Enable verbose logging - + Returns: Dictionary with API response or error information """ # Construct API URL api_url = f"http://{host}:{port}/lume/vms/{vm_name}/stop" - + # Prepare JSON payload with required parameters payload = {} - + # Add storage path if specified if storage: payload["storage"] = storage - + # Construct the curl command cmd = [ - "curl", "--connect-timeout", "15", "--max-time", "20", - "-s", "-X", "POST", "-H", "Content-Type: application/json", - "-d", json.dumps(payload), - api_url + "curl", + "--connect-timeout", + "15", + "--max-time", + "20", + "-s", + "-X", + "POST", + "-H", + "Content-Type: application/json", + "-d", + json.dumps(payload), + api_url, ] - + # Execute the command try: if debug or verbose: logger.info(f"Executing: {' '.join(cmd)}") - + result = subprocess.run(cmd, capture_output=True, text=True) - + if result.returncode != 0: logger.warning(f"API request failed with code {result.returncode}: {result.stderr}") return {"error": f"API request failed: {result.stderr}"} - + # Try to parse the response as JSON if result.stdout and result.stdout.strip(): try: @@ -260,7 +289,11 @@ def lume_api_stop( return response except json.JSONDecodeError: # Return the raw response if it's not valid JSON - return {"success": True, "message": "VM stopped successfully", "raw_response": result.stdout} + return { + "success": True, + "message": "VM stopped successfully", + "raw_response": result.stdout, + } else: return {"success": True, "message": "VM stopped successfully"} except subprocess.SubprocessError as e: @@ -275,10 +308,10 @@ def lume_api_update( update_opts: Dict[str, Any], storage: Optional[str] = None, debug: bool = False, - verbose: bool = False + verbose: bool = False, ) -> Dict[str, Any]: """Update VM settings using curl. - + Args: vm_name: Name of the VM to update host: API host @@ -287,47 +320,56 @@ def lume_api_update( storage: Storage path for the VM debug: Whether to show debug output verbose: Enable verbose logging - + Returns: Dictionary with API response or error information """ # Construct API URL api_url = f"http://{host}:{port}/lume/vms/{vm_name}/update" - + # Prepare JSON payload with required parameters payload = {} - + # Add CPU cores if specified if "cpu" in update_opts: payload["cpu"] = update_opts["cpu"] - + # Add memory if specified if "memory" in update_opts: payload["memory"] = update_opts["memory"] - + # Add storage path if specified if storage: payload["storage"] = storage - + # Construct the curl command cmd = [ - "curl", "--connect-timeout", "15", "--max-time", "20", - "-s", "-X", "POST", "-H", "Content-Type: application/json", - "-d", json.dumps(payload), - api_url + "curl", + "--connect-timeout", + "15", + "--max-time", + "20", + "-s", + "-X", + "POST", + "-H", + "Content-Type: application/json", + "-d", + json.dumps(payload), + api_url, ] - + # Execute the command try: if debug: logger.info(f"Executing: {' '.join(cmd)}") - + result = subprocess.run(cmd, capture_output=True, text=True) - + if result.returncode != 0: logger.warning(f"API request failed with code {result.returncode}: {result.stderr}") return {"error": f"API request failed: {result.stderr}"} - + # Try to parse the response as JSON if result.stdout and result.stdout.strip(): try: @@ -335,7 +377,11 @@ def lume_api_update( return response except json.JSONDecodeError: # Return the raw response if it's not valid JSON - return {"success": True, "message": "VM updated successfully", "raw_response": result.stdout} + return { + "success": True, + "message": "VM updated successfully", + "raw_response": result.stdout, + } else: return {"success": True, "message": "VM updated successfully"} except subprocess.SubprocessError as e: @@ -352,10 +398,10 @@ def lume_api_pull( registry: str = "ghcr.io", organization: str = "trycua", debug: bool = False, - verbose: bool = False + verbose: bool = False, ) -> Dict[str, Any]: """Pull a VM image from a registry using curl. - + Args: image: Name/tag of the image to pull name: Name to give the VM after pulling @@ -366,47 +412,50 @@ def lume_api_pull( organization: Organization in registry (default: trycua) debug: Whether to show debug output verbose: Enable verbose logging - + Returns: Dictionary with pull status and information """ # Prepare pull request payload pull_payload = { "image": image, # Use provided image name - "name": name, # Always use name as the target VM name + "name": name, # Always use name as the target VM name "registry": registry, - "organization": organization + "organization": organization, } - + if storage: pull_payload["storage"] = storage - + # Construct pull command with proper JSON payload - pull_cmd = [ - "curl" - ] - + pull_cmd = ["curl"] + if not verbose: pull_cmd.append("-s") - - pull_cmd.extend([ - "-X", "POST", - "-H", "Content-Type: application/json", - "-d", json.dumps(pull_payload), - f"http://{host}:{port}/lume/pull" - ]) - + + pull_cmd.extend( + [ + "-X", + "POST", + "-H", + "Content-Type: application/json", + "-d", + json.dumps(pull_payload), + f"http://{host}:{port}/lume/pull", + ] + ) + logger.debug(f"Executing API request: {' '.join(pull_cmd)}") - + try: # Execute pull command result = subprocess.run(pull_cmd, capture_output=True, text=True) - + if result.returncode != 0: error_msg = f"Failed to pull VM {name}: {result.stderr}" logger.error(error_msg) return {"error": error_msg} - + try: response = json.loads(result.stdout) logger.info(f"Successfully initiated pull for VM {name}") @@ -415,7 +464,7 @@ def lume_api_pull( if result.stdout: logger.info(f"Pull response: {result.stdout}") return {"success": True, "message": f"Successfully initiated pull for VM {name}"} - + except subprocess.SubprocessError as e: error_msg = f"Failed to execute pull command: {str(e)}" logger.error(error_msg) @@ -428,10 +477,10 @@ def lume_api_delete( port: int, storage: Optional[str] = None, debug: bool = False, - verbose: bool = False + verbose: bool = False, ) -> Dict[str, Any]: """Delete a VM using curl. - + Args: vm_name: Name of the VM to delete host: API host @@ -439,42 +488,62 @@ def lume_api_delete( storage: Storage path for the VM debug: Whether to show debug output verbose: Enable verbose logging - + Returns: Dictionary with API response or error information """ # URL encode the storage parameter for the query encoded_storage = "" storage_param = "" - + if storage: # First encode the storage path properly - encoded_storage = urllib.parse.quote(storage, safe='') + encoded_storage = urllib.parse.quote(storage, safe="") storage_param = f"?storage={encoded_storage}" - + # Construct API URL with encoded storage parameter if needed api_url = f"http://{host}:{port}/lume/vms/{vm_name}{storage_param}" - + # Construct the curl command for DELETE operation - using much longer timeouts matching shell implementation - cmd = ["curl", "--connect-timeout", "6000", "--max-time", "5000", "-s", "-X", "DELETE", f"'{api_url}'"] - + cmd = [ + "curl", + "--connect-timeout", + "6000", + "--max-time", + "5000", + "-s", + "-X", + "DELETE", + f"'{api_url}'", + ] + # For logging and display, show the properly escaped URL - display_cmd = ["curl", "--connect-timeout", "6000", "--max-time", "5000", "-s", "-X", "DELETE", api_url] - + display_cmd = [ + "curl", + "--connect-timeout", + "6000", + "--max-time", + "5000", + "-s", + "-X", + "DELETE", + api_url, + ] + # Only print the curl command when debug is enabled - display_curl_string = ' '.join(display_cmd) + display_curl_string = " ".join(display_cmd) logger.debug(f"Executing API request: {display_curl_string}") - + # Execute the command - for execution we need to use shell=True to handle URLs with special characters try: # Use a single string with shell=True for proper URL handling - shell_cmd = ' '.join(cmd) + shell_cmd = " ".join(cmd) result = subprocess.run(shell_cmd, shell=True, capture_output=True, text=True) - + # Handle curl exit codes if result.returncode != 0: curl_error = "Unknown error" - + # Map common curl error codes to helpful messages if result.returncode == 7: curl_error = "Failed to connect to the API server - it might still be starting up" @@ -483,21 +552,23 @@ def lume_api_delete( elif result.returncode == 28: curl_error = "Operation timeout - the API server is taking too long to respond" elif result.returncode == 52: - curl_error = "Empty reply from server - the API server is starting but not fully ready yet" + curl_error = ( + "Empty reply from server - the API server is starting but not fully ready yet" + ) elif result.returncode == 56: curl_error = "Network problem during data transfer - check container networking" - + # Only log at debug level to reduce noise during retries logger.debug(f"API request failed with code {result.returncode}: {curl_error}") - + # Return a more useful error message return { "error": f"API request failed: {curl_error}", "curl_code": result.returncode, "vm_name": vm_name, - "storage": storage + "storage": storage, } - + # Try to parse the response as JSON if result.stdout and result.stdout.strip(): try: @@ -505,7 +576,11 @@ def lume_api_delete( return response except json.JSONDecodeError: # Return the raw response if it's not valid JSON - return {"success": True, "message": "VM deleted successfully", "raw_response": result.stdout} + return { + "success": True, + "message": "VM deleted successfully", + "raw_response": result.stdout, + } else: return {"success": True, "message": "VM deleted successfully"} except subprocess.SubprocessError as e: @@ -515,32 +590,33 @@ def lume_api_delete( def parse_memory(memory_str: str) -> int: """Parse memory string to MB integer. - + Examples: "8GB" -> 8192 "1024MB" -> 1024 "512" -> 512 - + Returns: Memory value in MB """ if isinstance(memory_str, int): return memory_str - + if isinstance(memory_str, str): # Extract number and unit import re + match = re.match(r"(\d+)([A-Za-z]*)", memory_str) if match: value, unit = match.groups() value = int(value) unit = unit.upper() - + if unit == "GB" or unit == "G": return value * 1024 elif unit == "MB" or unit == "M" or unit == "": return value - + # Default fallback logger.warning(f"Could not parse memory string '{memory_str}', using 8GB default") return 8192 # Default to 8GB diff --git a/libs/python/computer/computer/providers/lumier/__init__.py b/libs/python/computer/computer/providers/lumier/__init__.py index 32a3954b..7785007a 100644 --- a/libs/python/computer/computer/providers/lumier/__init__.py +++ b/libs/python/computer/computer/providers/lumier/__init__.py @@ -3,6 +3,7 @@ try: # Use the same import approach as in the Lume provider from .provider import LumierProvider + HAS_LUMIER = True except ImportError: HAS_LUMIER = False diff --git a/libs/python/computer/computer/providers/lumier/provider.py b/libs/python/computer/computer/providers/lumier/provider.py index 9b3e8c4d..d4c99bfe 100644 --- a/libs/python/computer/computer/providers/lumier/provider.py +++ b/libs/python/computer/computer/providers/lumier/provider.py @@ -6,22 +6,17 @@ macOS and Linux VMs. It handles VM lifecycle operations through Docker commands and container management. """ +import asyncio +import json import logging import os -import json -import asyncio -from typing import Dict, List, Optional, Any +import re import subprocess import time -import re +from typing import Any, Dict, List, Optional from ..base import BaseVMProvider, VMProviderType -from ..lume_api import ( - lume_api_get, - lume_api_run, - lume_api_stop, - lume_api_update -) +from ..lume_api import lume_api_get, lume_api_run, lume_api_stop, lume_api_update # Setup logging logger = logging.getLogger(__name__) @@ -37,13 +32,13 @@ except (subprocess.SubprocessError, FileNotFoundError): class LumierProvider(BaseVMProvider): """ Lumier VM Provider implementation using Docker containers. - + This provider uses Docker to run Lumier containers that can create macOS and Linux VMs through containerization. """ - + def __init__( - self, + self, port: Optional[int] = 7777, host: str = "localhost", storage: Optional[str] = None, # Can be a path or 'ephemeral' @@ -54,7 +49,7 @@ class LumierProvider(BaseVMProvider): noVNC_port: Optional[int] = 8006, ): """Initialize the Lumier VM Provider. - + Args: port: Port for the API server (default: 7777) host: Hostname for the API server (default: localhost) @@ -70,28 +65,28 @@ class LumierProvider(BaseVMProvider): self.api_port = 7777 if port is None else port self.vnc_port = noVNC_port # User-specified noVNC port, will be set in run_vm if provided self.ephemeral = ephemeral - + # Handle ephemeral storage (temporary directory) if ephemeral: self.storage = "ephemeral" else: self.storage = storage - + self.shared_path = shared_path self.image = image # Store the VM image name to use # The container_name will be set in run_vm using the VM name self.verbose = verbose self._container_id = None self._api_url = None # Will be set after container starts - + @property def provider_type(self) -> VMProviderType: """Return the provider type.""" return VMProviderType.LUMIER - + def _parse_memory(self, memory_str: str) -> int: """Parse memory string to MB integer. - + Examples: "8GB" -> 8192 "1024MB" -> 1024 @@ -99,7 +94,7 @@ class LumierProvider(BaseVMProvider): """ if isinstance(memory_str, int): return memory_str - + if isinstance(memory_str, str): # Extract number and unit match = re.match(r"(\d+)([A-Za-z]*)", memory_str) @@ -107,25 +102,25 @@ class LumierProvider(BaseVMProvider): value, unit = match.groups() value = int(value) unit = unit.upper() - + if unit == "GB" or unit == "G": return value * 1024 elif unit == "MB" or unit == "M" or unit == "": return value - + # Default fallback logger.warning(f"Could not parse memory string '{memory_str}', using 8GB default") return 8192 # Default to 8GB - + # Helper methods for interacting with the Lumier API through curl # These methods handle the various VM operations via API calls - + def _get_curl_error_message(self, return_code: int) -> str: """Get a descriptive error message for curl return codes. - + Args: return_code: The curl return code - + Returns: A descriptive error message """ @@ -143,57 +138,62 @@ class LumierProvider(BaseVMProvider): else: return f"Unknown curl error code: {return_code}" - async def get_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Get VM information by name. - + Args: name: Name of the VM to get information for storage: Optional storage path override. If provided, this will be used instead of the provider's default storage path. - + Returns: Dictionary with VM information including status, IP address, etc. """ if not HAS_LUMIER: logger.error("Docker is not available. Cannot get VM status.") - return { - "name": name, - "status": "unavailable", - "error": "Docker is not available" - } - + return {"name": name, "status": "unavailable", "error": "Docker is not available"} + # Store the current name for API requests self.container_name = name - + try: # Check if the container exists and is running - check_cmd = ["docker", "ps", "-a", "--filter", f"name={name}", "--format", "{{.Status}}"] + check_cmd = [ + "docker", + "ps", + "-a", + "--filter", + f"name={name}", + "--format", + "{{.Status}}", + ] check_result = subprocess.run(check_cmd, capture_output=True, text=True) container_status = check_result.stdout.strip() - + if not container_status: logger.info(f"Container {name} does not exist. Will create when run_vm is called.") return { "name": name, "status": "not_found", - "message": "Container doesn't exist yet" + "message": "Container doesn't exist yet", } - + # Container exists, check if it's running is_running = container_status.startswith("Up") - + if not is_running: - logger.info(f"Container {name} exists but is not running. Status: {container_status}") + logger.info( + f"Container {name} exists but is not running. Status: {container_status}" + ) return { "name": name, "status": "stopped", "container_status": container_status, } - + # Container is running, get the IP address and API status from Lumier API logger.info(f"Container {name} is running. Getting VM status from API.") - + # Use the shared lume_api_get function directly vm_info = lume_api_get( vm_name=name, @@ -201,9 +201,9 @@ class LumierProvider(BaseVMProvider): port=self.api_port, storage=storage if storage is not None else self.storage, debug=self.verbose, - verbose=self.verbose + verbose=self.verbose, ) - + # Check for API errors if "error" in vm_info: # Use debug level instead of warning to reduce log noise during polling @@ -213,14 +213,14 @@ class LumierProvider(BaseVMProvider): "status": "running", # Container is running even if API is not responsive "api_status": "error", "error": vm_info["error"], - "container_status": container_status + "container_status": container_status, } - + # Process the VM status information vm_status = vm_info.get("status", "unknown") vnc_url = vm_info.get("vncUrl", "") ip_address = vm_info.get("ipAddress", "") - + # IMPORTANT: Always ensure we have a valid IP address for connectivity # If the API doesn't return an IP address, default to localhost (127.0.0.1) # This makes the behavior consistent with LumeProvider @@ -228,9 +228,9 @@ class LumierProvider(BaseVMProvider): ip_address = "127.0.0.1" logger.info(f"No IP address returned from API, defaulting to {ip_address}") vm_info["ipAddress"] = ip_address - + logger.info(f"VM {name} status: {vm_status}") - + if ip_address and vnc_url: logger.info(f"VM {name} has IP: {ip_address} and VNC URL: {vnc_url}") elif not ip_address and not vnc_url and vm_status != "running": @@ -238,8 +238,10 @@ class LumierProvider(BaseVMProvider): logger.info(f"VM {name} is not running yet. Status: {vm_status}") else: # Missing IP or VNC but status is running - this is unusual but handled with default IP - logger.warning(f"VM {name} is running but missing expected fields. API response: {vm_info}") - + logger.warning( + f"VM {name} is running but missing expected fields. API response: {vm_info}" + ) + # Return the full status information return { "name": name, @@ -248,19 +250,19 @@ class LumierProvider(BaseVMProvider): "vnc_url": vnc_url, "api_status": "ok", "container_status": container_status, - **vm_info # Include all fields from the API response + **vm_info, # Include all fields from the API response } except subprocess.SubprocessError as e: logger.error(f"Failed to check container status: {e}") return { "name": name, "status": "error", - "error": f"Failed to check container status: {str(e)}" + "error": f"Failed to check container status: {str(e)}", } - + async def list_vms(self) -> List[Dict[str, Any]]: """List all VMs managed by this provider. - + For Lumier provider, there is only one VM per container. """ try: @@ -269,10 +271,12 @@ class LumierProvider(BaseVMProvider): except Exception as e: logger.error(f"Failed to list VMs: {e}") return [] - - async def run_vm(self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + + async def run_vm( + self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Run a VM with the given options. - + Args: image: Name/tag of the image to use name: Name of the VM to run (used for the container name and Docker image tag) @@ -280,7 +284,7 @@ class LumierProvider(BaseVMProvider): - cpu: Number of CPU cores - memory: Amount of memory (e.g. "8GB") - noVNC_port: Specific port for noVNC interface - + Returns: Dictionary with VM status information """ @@ -289,10 +293,18 @@ class LumierProvider(BaseVMProvider): try: # First, check if container already exists and remove it try: - check_cmd = ["docker", "ps", "-a", "--filter", f"name={self.container_name}", "--format", "{{.ID}}"] + check_cmd = [ + "docker", + "ps", + "-a", + "--filter", + f"name={self.container_name}", + "--format", + "{{.ID}}", + ] check_result = subprocess.run(check_cmd, capture_output=True, text=True) existing_container = check_result.stdout.strip() - + if existing_container: logger.info(f"Removing existing container: {self.container_name}") remove_cmd = ["docker", "rm", "-f", self.container_name] @@ -300,66 +312,68 @@ class LumierProvider(BaseVMProvider): except subprocess.CalledProcessError as e: logger.warning(f"Error removing existing container: {e}") # Continue anyway, next steps will fail if there's a real problem - + # Prepare the Docker run command cmd = ["docker", "run", "-d", "--name", self.container_name] - + cmd.extend(["-p", f"{self.vnc_port}:8006"]) logger.debug(f"Using specified noVNC_port: {self.vnc_port}") - + # Set API URL using the API port self._api_url = f"http://{self.host}:{self.api_port}" - + # Parse memory setting memory_mb = self._parse_memory(run_opts.get("memory", "8GB")) - + # Add storage volume mount if storage is specified (for persistent VM storage) if self.storage and self.storage != "ephemeral": # Create storage directory if it doesn't exist storage_dir = os.path.abspath(os.path.expanduser(self.storage or "")) os.makedirs(storage_dir, exist_ok=True) - + # Add volume mount for storage - cmd.extend([ - "-v", f"{storage_dir}:/storage", - "-e", f"HOST_STORAGE_PATH={storage_dir}" - ]) + cmd.extend( + ["-v", f"{storage_dir}:/storage", "-e", f"HOST_STORAGE_PATH={storage_dir}"] + ) logger.debug(f"Using persistent storage at: {storage_dir}") - + # Add shared folder volume mount if shared_path is specified if self.shared_path: # Create shared directory if it doesn't exist shared_dir = os.path.abspath(os.path.expanduser(self.shared_path or "")) os.makedirs(shared_dir, exist_ok=True) - + # Add volume mount for shared folder - cmd.extend([ - "-v", f"{shared_dir}:/shared", - "-e", f"HOST_SHARED_PATH={shared_dir}" - ]) + cmd.extend(["-v", f"{shared_dir}:/shared", "-e", f"HOST_SHARED_PATH={shared_dir}"]) logger.debug(f"Using shared folder at: {shared_dir}") - + # Add environment variables # Always use the container_name as the VM_NAME for consistency # Use the VM image passed from the Computer class logger.debug(f"Using VM image: {self.image}") - + # If ghcr.io is in the image, use the full image name if "ghcr.io" in self.image: vm_image = self.image else: vm_image = f"ghcr.io/trycua/{self.image}" - cmd.extend([ - "-e", f"VM_NAME={self.container_name}", - "-e", f"VERSION={vm_image}", - "-e", f"CPU_CORES={run_opts.get('cpu', '4')}", - "-e", f"RAM_SIZE={memory_mb}", - ]) - + cmd.extend( + [ + "-e", + f"VM_NAME={self.container_name}", + "-e", + f"VERSION={vm_image}", + "-e", + f"CPU_CORES={run_opts.get('cpu', '4')}", + "-e", + f"RAM_SIZE={memory_mb}", + ] + ) + # Specify the Lumier image with the full image name lumier_image = "trycua/lumier:latest" - + # First check if the image exists locally try: logger.debug(f"Checking if Docker image {lumier_image} exists locally...") @@ -369,54 +383,73 @@ class LumierProvider(BaseVMProvider): except subprocess.CalledProcessError: # Image doesn't exist locally logger.warning(f"\nWARNING: Docker image {lumier_image} not found locally.") - logger.warning("The system will attempt to pull it from Docker Hub, which may fail if you have network connectivity issues.") - logger.warning("If the Docker pull fails, you may need to manually pull the image first with:") + logger.warning( + "The system will attempt to pull it from Docker Hub, which may fail if you have network connectivity issues." + ) + logger.warning( + "If the Docker pull fails, you may need to manually pull the image first with:" + ) logger.warning(f" docker pull {lumier_image}\n") - + # Add the image to the command cmd.append(lumier_image) - + # Print the Docker command for debugging logger.debug(f"DOCKER COMMAND: {' '.join(cmd)}") - + # Run the container with improved error handling try: result = subprocess.run(cmd, capture_output=True, text=True, check=True) except subprocess.CalledProcessError as e: - if "no route to host" in str(e.stderr).lower() or "failed to resolve reference" in str(e.stderr).lower(): - error_msg = (f"Network error while trying to pull Docker image '{lumier_image}'\n" - f"Error: {e.stderr}\n\n" - f"SOLUTION: Please try one of the following:\n" - f"1. Check your internet connection\n" - f"2. Pull the image manually with: docker pull {lumier_image}\n" - f"3. Check if Docker is running properly\n") + if ( + "no route to host" in str(e.stderr).lower() + or "failed to resolve reference" in str(e.stderr).lower() + ): + error_msg = ( + f"Network error while trying to pull Docker image '{lumier_image}'\n" + f"Error: {e.stderr}\n\n" + f"SOLUTION: Please try one of the following:\n" + f"1. Check your internet connection\n" + f"2. Pull the image manually with: docker pull {lumier_image}\n" + f"3. Check if Docker is running properly\n" + ) logger.error(error_msg) raise RuntimeError(error_msg) raise - + # Container started, now check VM status with polling logger.debug("Container started, checking VM status...") - logger.debug("NOTE: This may take some time while the VM image is being pulled and initialized") - + logger.debug( + "NOTE: This may take some time while the VM image is being pulled and initialized" + ) + # Start a background thread to show container logs in real-time import threading - + def show_container_logs(): # Give the container a moment to start generating logs time.sleep(1) logger.debug(f"\n---- CONTAINER LOGS FOR '{name}' (LIVE) ----") - logger.debug("Showing logs as they are generated. Press Ctrl+C to stop viewing logs...\n") - + logger.debug( + "Showing logs as they are generated. Press Ctrl+C to stop viewing logs...\n" + ) + try: # Use docker logs with follow option log_cmd = ["docker", "logs", "--tail", "30", "--follow", name] - process = subprocess.Popen(log_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - text=True, bufsize=1, universal_newlines=True) - + process = subprocess.Popen( + log_cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + universal_newlines=True, + ) + # Read and print logs line by line for line in process.stdout: - logger.debug(line, end='') - + logger.debug(line, end="") + # Break if process has exited if process.poll() is not None: break @@ -427,20 +460,20 @@ class LumierProvider(BaseVMProvider): finally: logger.debug("\n---- LOG STREAMING ENDED ----") # Make sure process is terminated - if 'process' in locals() and process.poll() is None: + if "process" in locals() and process.poll() is None: process.terminate() - + # Start log streaming in a background thread if verbose mode is enabled log_thread = threading.Thread(target=show_container_logs) log_thread.daemon = True # Thread will exit when main program exits log_thread.start() - + # Skip waiting for container readiness and just poll get_vm directly # Poll the get_vm method indefinitely until the VM is ready with an IP address attempt = 0 consecutive_errors = 0 vm_running = False - + while True: # Wait indefinitely try: # Use longer delays to give the system time to initialize @@ -449,117 +482,151 @@ class LumierProvider(BaseVMProvider): # But use shorter delays while we're getting API errors if consecutive_errors > 0 and consecutive_errors < 5: wait_time = 3 # Use shorter delays when we're getting API errors - else: + else: wait_time = min(30, 5 + (attempt * 2)) - + logger.debug(f"Waiting {wait_time}s before retry #{attempt+1}...") await asyncio.sleep(wait_time) - + # Try to get VM status logger.debug(f"Checking VM status (attempt {attempt+1})...") vm_status = await self.get_vm(name) - + # Check for API errors - if 'error' in vm_status: + if "error" in vm_status: consecutive_errors += 1 - error_msg = vm_status.get('error', 'Unknown error') - + error_msg = vm_status.get("error", "Unknown error") + # Only print a user-friendly status message, not the raw error # since _lume_api_get already logged the technical details if consecutive_errors == 1 or attempt % 5 == 0: - if 'Empty reply from server' in error_msg: - logger.info("API server is starting up - container is running, but API isn't fully initialized yet.") - logger.info("This is expected during the initial VM setup - will continue polling...") + if "Empty reply from server" in error_msg: + logger.info( + "API server is starting up - container is running, but API isn't fully initialized yet." + ) + logger.info( + "This is expected during the initial VM setup - will continue polling..." + ) else: # Don't repeat the exact same error message each time - logger.warning(f"API request error (attempt {attempt+1}): {error_msg}") + logger.warning( + f"API request error (attempt {attempt+1}): {error_msg}" + ) # Just log that we're still working on it if attempt > 3: - logger.debug("Still waiting for the API server to become available...") - + logger.debug( + "Still waiting for the API server to become available..." + ) + # If we're getting errors but container is running, that's normal during startup - if vm_status.get('status') == 'running': + if vm_status.get("status") == "running": if not vm_running: - logger.info("Container is running, waiting for the VM within it to become fully ready...") + logger.info( + "Container is running, waiting for the VM within it to become fully ready..." + ) logger.info("This might take a minute while the VM initializes...") vm_running = True - + # Increase counter and continue attempt += 1 continue - + # Reset consecutive error counter when we get a successful response consecutive_errors = 0 - + # If the VM is running, check if it has an IP address (which means it's fully ready) - if vm_status.get('status') == 'running': + if vm_status.get("status") == "running": vm_running = True - + # Check if we have an IP address, which means the VM is fully ready - if 'ip_address' in vm_status and vm_status['ip_address']: - logger.info(f"VM is now fully running with IP: {vm_status.get('ip_address')}") - if 'vnc_url' in vm_status and vm_status['vnc_url']: + if "ip_address" in vm_status and vm_status["ip_address"]: + logger.info( + f"VM is now fully running with IP: {vm_status.get('ip_address')}" + ) + if "vnc_url" in vm_status and vm_status["vnc_url"]: logger.info(f"VNC URL: {vm_status.get('vnc_url')}") return vm_status else: - logger.debug("VM is running but still initializing network interfaces...") + logger.debug( + "VM is running but still initializing network interfaces..." + ) logger.debug("Waiting for IP address to be assigned...") else: # VM exists but might still be starting up - status = vm_status.get('status', 'unknown') + status = vm_status.get("status", "unknown") logger.debug(f"VM found but status is: {status}. Continuing to poll...") - + # Increase counter for next iteration's delay calculation attempt += 1 - + # If we reach a very large number of attempts, give a reassuring message but continue if attempt % 10 == 0: - logger.debug(f"Still waiting after {attempt} attempts. This might take several minutes for first-time setup.") + logger.debug( + f"Still waiting after {attempt} attempts. This might take several minutes for first-time setup." + ) if not vm_running and attempt >= 20: - logger.warning("\nNOTE: First-time VM initialization can be slow as images are downloaded.") - logger.warning("If this continues for more than 10 minutes, you may want to check:") + logger.warning( + "\nNOTE: First-time VM initialization can be slow as images are downloaded." + ) + logger.warning( + "If this continues for more than 10 minutes, you may want to check:" + ) logger.warning(" 1. Docker logs with: docker logs " + name) logger.warning(" 2. If your network can access container registries") logger.warning("Press Ctrl+C to abort if needed.\n") - + # After 150 attempts (likely over 30-40 minutes), return current status if attempt >= 150: - logger.debug(f"Reached 150 polling attempts. VM status is: {vm_status.get('status', 'unknown')}") - logger.debug("Returning current VM status, but please check Docker logs if there are issues.") + logger.debug( + f"Reached 150 polling attempts. VM status is: {vm_status.get('status', 'unknown')}" + ) + logger.debug( + "Returning current VM status, but please check Docker logs if there are issues." + ) return vm_status - + except Exception as e: # Always continue retrying, but with increasing delays - logger.warning(f"Error checking VM status (attempt {attempt+1}): {e}. Will retry.") + logger.warning( + f"Error checking VM status (attempt {attempt+1}): {e}. Will retry." + ) consecutive_errors += 1 - + # If we've had too many consecutive errors, might be a deeper problem if consecutive_errors >= 10: - logger.warning(f"\nWARNING: Encountered {consecutive_errors} consecutive errors while checking VM status.") - logger.warning("You may need to check the Docker container logs or restart the process.") + logger.warning( + f"\nWARNING: Encountered {consecutive_errors} consecutive errors while checking VM status." + ) + logger.warning( + "You may need to check the Docker container logs or restart the process." + ) logger.warning(f"Error details: {str(e)}\n") - + # Increase attempt counter for next iteration attempt += 1 - + # After many consecutive errors, add a delay to avoid hammering the system if attempt > 5: error_delay = min(30, 10 + attempt) - logger.warning(f"Multiple connection errors, waiting {error_delay}s before next attempt...") + logger.warning( + f"Multiple connection errors, waiting {error_delay}s before next attempt..." + ) await asyncio.sleep(error_delay) - + except subprocess.CalledProcessError as e: - error_msg = f"Failed to start Lumier container: {e.stderr if hasattr(e, 'stderr') else str(e)}" + error_msg = ( + f"Failed to start Lumier container: {e.stderr if hasattr(e, 'stderr') else str(e)}" + ) logger.error(error_msg) raise RuntimeError(error_msg) - + async def _wait_for_container_ready(self, container_name: str, timeout: int = 90) -> bool: """Wait for the Lumier container to be fully ready with a valid API response. - + Args: container_name: Name of the Docker container to check timeout: Maximum time to wait in seconds (default: 90 seconds) - + Returns: True if the container is running, even if API is not fully ready. This allows operations to continue with appropriate fallbacks. @@ -567,21 +634,32 @@ class LumierProvider(BaseVMProvider): start_time = time.time() api_ready = False container_running = False - + logger.debug(f"Waiting for container {container_name} to be ready (timeout: {timeout}s)...") - + while time.time() - start_time < timeout: # Check if container is running try: - check_cmd = ["docker", "ps", "--filter", f"name={container_name}", "--format", "{{.Status}}"] + check_cmd = [ + "docker", + "ps", + "--filter", + f"name={container_name}", + "--format", + "{{.Status}}", + ] result = subprocess.run(check_cmd, capture_output=True, text=True, check=True) container_status = result.stdout.strip() - + if container_status and container_status.startswith("Up"): container_running = True - logger.info(f"Container {container_name} is running with status: {container_status}") + logger.info( + f"Container {container_name} is running with status: {container_status}" + ) else: - logger.warning(f"Container {container_name} not yet running, status: {container_status}") + logger.warning( + f"Container {container_name} not yet running, status: {container_status}" + ) # container is not running yet, wait and try again await asyncio.sleep(2) # Longer sleep to give Docker time continue @@ -589,17 +667,17 @@ class LumierProvider(BaseVMProvider): logger.warning(f"Error checking container status: {e}") await asyncio.sleep(2) continue - + # Container is running, check if API is responsive try: # First check the health endpoint api_url = f"http://{self.host}:{self.api_port}/health" logger.info(f"Checking API health at: {api_url}") - + # Use longer timeout for API health check since it may still be initializing curl_cmd = ["curl", "-s", "--connect-timeout", "5", "--max-time", "10", api_url] result = subprocess.run(curl_cmd, capture_output=True, text=True) - + if result.returncode == 0 and "ok" in result.stdout.lower(): api_ready = True logger.info(f"API is ready at {api_url}") @@ -610,12 +688,21 @@ class LumierProvider(BaseVMProvider): vm_api_url = f"http://{self.host}:{self.api_port}/lume/vms/{container_name}" if self.storage: import urllib.parse + encoded_storage = urllib.parse.quote_plus(self.storage) vm_api_url += f"?storage={encoded_storage}" - - curl_vm_cmd = ["curl", "-s", "--connect-timeout", "5", "--max-time", "10", vm_api_url] + + curl_vm_cmd = [ + "curl", + "-s", + "--connect-timeout", + "5", + "--max-time", + "10", + vm_api_url, + ] vm_result = subprocess.run(curl_vm_cmd, capture_output=True, text=True) - + if vm_result.returncode == 0 and vm_result.stdout.strip(): # VM API responded with something - consider the API ready api_ready = True @@ -625,7 +712,7 @@ class LumierProvider(BaseVMProvider): curl_code = result.returncode if curl_code == 0: curl_code = vm_result.returncode - + # Map common curl error codes to helpful messages if curl_code == 7: curl_error = "Failed to connect - API server is starting up" @@ -639,29 +726,37 @@ class LumierProvider(BaseVMProvider): curl_error = "Network problem during data transfer" else: curl_error = f"Unknown curl error code: {curl_code}" - + logger.info(f"API not ready yet: {curl_error}") except subprocess.SubprocessError as e: logger.warning(f"Error checking API status: {e}") - + # If the container is running but API is not ready, that's OK - we'll just wait # a bit longer before checking again, as the container may still be initializing elapsed_seconds = time.time() - start_time - if int(elapsed_seconds) % 5 == 0: # Only print status every 5 seconds to reduce verbosity - logger.debug(f"Waiting for API to initialize... ({elapsed_seconds:.1f}s / {timeout}s)") - + if ( + int(elapsed_seconds) % 5 == 0 + ): # Only print status every 5 seconds to reduce verbosity + logger.debug( + f"Waiting for API to initialize... ({elapsed_seconds:.1f}s / {timeout}s)" + ) + await asyncio.sleep(3) # Longer sleep between API checks - + # Handle timeout - if the container is running but API is not ready, that's not # necessarily an error - the API might just need more time to start up if not container_running: logger.warning(f"Timed out waiting for container {container_name} to start") return False - + if not api_ready: - logger.warning(f"Container {container_name} is running, but API is not fully ready yet.") - logger.warning(f"NOTE: You may see some 'API request failed' messages while the API initializes.") - + logger.warning( + f"Container {container_name} is running, but API is not fully ready yet." + ) + logger.warning( + "NOTE: You may see some 'API request failed' messages while the API initializes." + ) + # Return True if container is running, even if API isn't ready yet # This allows VM operations to proceed, with appropriate retries for API calls return container_running @@ -670,12 +765,12 @@ class LumierProvider(BaseVMProvider): """Stop a running VM by stopping the Lumier container.""" try: # Use Docker commands to stop the container directly - if hasattr(self, '_container_id') and self._container_id: + if hasattr(self, "_container_id") and self._container_id: logger.info(f"Stopping Lumier container: {self.container_name}") cmd = ["docker", "stop", self.container_name] result = subprocess.run(cmd, capture_output=True, text=True, check=True) logger.info(f"Container stopped: {result.stdout.strip()}") - + # Return minimal status info return { "name": name, @@ -684,16 +779,24 @@ class LumierProvider(BaseVMProvider): } else: # Try to find the container by name - check_cmd = ["docker", "ps", "-a", "--filter", f"name={self.container_name}", "--format", "{{.ID}}"] + check_cmd = [ + "docker", + "ps", + "-a", + "--filter", + f"name={self.container_name}", + "--format", + "{{.ID}}", + ] check_result = subprocess.run(check_cmd, capture_output=True, text=True) container_id = check_result.stdout.strip() - + if container_id: logger.info(f"Found container ID: {container_id}") cmd = ["docker", "stop", self.container_name] result = subprocess.run(cmd, capture_output=True, text=True, check=True) logger.info(f"Container stopped: {result.stdout.strip()}") - + return { "name": name, "status": "stopped", @@ -709,26 +812,30 @@ class LumierProvider(BaseVMProvider): error_msg = f"Failed to stop container: {e.stderr if hasattr(e, 'stderr') else str(e)}" logger.error(error_msg) raise RuntimeError(f"Failed to stop Lumier container: {error_msg}") - + # update_vm is not implemented as it's not needed for Lumier # The BaseVMProvider requires it, so we provide a minimal implementation - async def update_vm(self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + async def update_vm( + self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Not implemented for Lumier provider.""" logger.warning("update_vm is not implemented for Lumier provider") return {"name": name, "status": "unchanged"} - - async def get_logs(self, name: str, num_lines: int = 100, follow: bool = False, timeout: Optional[int] = None) -> str: + + async def get_logs( + self, name: str, num_lines: int = 100, follow: bool = False, timeout: Optional[int] = None + ) -> str: """Get the logs from the Lumier container. - + Args: name: Name of the VM/container to get logs for num_lines: Number of recent log lines to return (default: 100) follow: If True, follow the logs (stream new logs as they are generated) timeout: Optional timeout in seconds for follow mode (None means no timeout) - + Returns: Container logs as a string - + Note: If follow=True, this function will continuously stream logs until timeout or until interrupted. The output will be printed to console in real-time. @@ -737,16 +844,16 @@ class LumierProvider(BaseVMProvider): error_msg = "Docker is not available. Cannot get container logs." logger.error(error_msg) return error_msg - + # Make sure we have a container name container_name = name - + # Check if the container exists and is running try: # Check if the container exists inspect_cmd = ["docker", "container", "inspect", container_name] result = subprocess.run(inspect_cmd, capture_output=True, text=True) - + if result.returncode != 0: error_msg = f"Container '{container_name}' does not exist or is not accessible" logger.error(error_msg) @@ -755,39 +862,43 @@ class LumierProvider(BaseVMProvider): error_msg = f"Error checking container status: {str(e)}" logger.error(error_msg) return error_msg - + # Base docker logs command log_cmd = ["docker", "logs"] - + # Add tail parameter to limit the number of lines log_cmd.extend(["--tail", str(num_lines)]) - + # Handle follow mode with or without timeout if follow: log_cmd.append("--follow") - + if timeout is not None: # For follow mode with timeout, we'll run the command and handle the timeout log_cmd.append(container_name) - logger.info(f"Following logs for container '{container_name}' with timeout {timeout}s") + logger.info( + f"Following logs for container '{container_name}' with timeout {timeout}s" + ) logger.info(f"\n---- CONTAINER LOGS FOR '{container_name}' (LIVE) ----") - logger.info(f"Press Ctrl+C to stop following logs\n") - + logger.info("Press Ctrl+C to stop following logs\n") + try: # Run with timeout process = subprocess.Popen(log_cmd, text=True) - + # Wait for the specified timeout if timeout: try: process.wait(timeout=timeout) except subprocess.TimeoutExpired: process.terminate() # Stop after timeout - logger.info(f"\n---- LOG FOLLOWING STOPPED (timeout {timeout}s reached) ----") + logger.info( + f"\n---- LOG FOLLOWING STOPPED (timeout {timeout}s reached) ----" + ) else: # Without timeout, wait for user interruption process.wait() - + return "Logs were displayed to console in follow mode" except KeyboardInterrupt: process.terminate() @@ -798,8 +909,8 @@ class LumierProvider(BaseVMProvider): log_cmd.append(container_name) logger.info(f"Following logs for container '{container_name}' indefinitely") logger.info(f"\n---- CONTAINER LOGS FOR '{container_name}' (LIVE) ----") - logger.info(f"Press Ctrl+C to stop following logs\n") - + logger.info("Press Ctrl+C to stop following logs\n") + try: # Run the command and let it run until interrupted process = subprocess.Popen(log_cmd, text=True) @@ -813,19 +924,21 @@ class LumierProvider(BaseVMProvider): # For non-follow mode, capture and return the logs as a string log_cmd.append(container_name) logger.info(f"Getting {num_lines} log lines for container '{container_name}'") - + try: result = subprocess.run(log_cmd, capture_output=True, text=True, check=True) logs = result.stdout - + # Only print header and logs if there's content if logs.strip(): - logger.info(f"\n---- CONTAINER LOGS FOR '{container_name}' (LAST {num_lines} LINES) ----\n") + logger.info( + f"\n---- CONTAINER LOGS FOR '{container_name}' (LAST {num_lines} LINES) ----\n" + ) logger.info(logs) - logger.info(f"\n---- END OF LOGS ----") + logger.info("\n---- END OF LOGS ----") else: logger.info(f"\nNo logs available for container '{container_name}'") - + return logs except subprocess.CalledProcessError as e: error_msg = f"Error getting logs: {e.stderr}" @@ -835,48 +948,48 @@ class LumierProvider(BaseVMProvider): error_msg = f"Unexpected error getting logs: {str(e)}" logger.error(error_msg) return error_msg - + async def restart_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: raise NotImplementedError("LumierProvider does not support restarting VMs.") async def get_ip(self, name: str, storage: Optional[str] = None, retry_delay: int = 2) -> str: """Get the IP address of a VM, waiting indefinitely until it's available. - + Args: name: Name of the VM to get the IP for storage: Optional storage path override retry_delay: Delay between retries in seconds (default: 2) - + Returns: IP address of the VM when it becomes available """ # Use container_name = name for consistency self.container_name = name - + # Track total attempts for logging purposes total_attempts = 0 - + # Loop indefinitely until we get a valid IP while True: total_attempts += 1 - + # Log retry message but not on first attempt if total_attempts > 1: logger.info(f"Waiting for VM {name} IP address (attempt {total_attempts})...") - + try: # Get VM information vm_info = await self.get_vm(name, storage=storage) - + # Check if we got a valid IP ip = vm_info.get("ip_address", None) if ip and ip != "unknown" and not ip.startswith("0.0.0.0"): logger.info(f"Got valid VM IP address: {ip}") return ip - + # Check the VM status status = vm_info.get("status", "unknown") - + # Special handling for Lumier: it may report "stopped" even when the VM is starting # If the VM information contains an IP but status is stopped, it might be a race condition if status == "stopped" and "ip_address" in vm_info: @@ -891,43 +1004,43 @@ class LumierProvider(BaseVMProvider): # If VM is running but no IP yet, wait and retry else: logger.info("VM is running but no valid IP address yet. Waiting...") - + except Exception as e: logger.warning(f"Error getting VM {name} IP: {e}, continuing to wait...") - + # Wait before next retry await asyncio.sleep(retry_delay) - + # Add progress log every 10 attempts if total_attempts % 10 == 0: logger.info(f"Still waiting for VM {name} IP after {total_attempts} attempts...") - + async def __aenter__(self): """Async context manager entry. - + This method is called when entering an async context manager block. Returns self to be used in the context. """ logger.debug("Entering LumierProvider context") - + # Initialize the API URL with the default value if not already set # This ensures get_vm can work before run_vm is called - if not hasattr(self, '_api_url') or not self._api_url: + if not hasattr(self, "_api_url") or not self._api_url: self._api_url = f"http://{self.host}:{self.api_port}" logger.info(f"Initialized default Lumier API URL: {self._api_url}") - + return self - + async def __aexit__(self, exc_type, exc_val, exc_tb): """Async context manager exit. - + This method is called when exiting an async context manager block. It handles proper cleanup of resources, including stopping any running containers. """ logger.debug(f"Exiting LumierProvider context, handling exceptions: {exc_type}") try: # If we have a container ID, we should stop it to clean up resources - if hasattr(self, '_container_id') and self._container_id: + if hasattr(self, "_container_id") and self._container_id: logger.info(f"Stopping Lumier container on context exit: {self.container_name}") try: cmd = ["docker", "stop", self.container_name] diff --git a/libs/python/computer/computer/providers/types.py b/libs/python/computer/computer/providers/types.py index 2db44230..da9e50c0 100644 --- a/libs/python/computer/computer/providers/types.py +++ b/libs/python/computer/computer/providers/types.py @@ -3,27 +3,30 @@ These base types describe the common shape of objects returned by provider methods like `list_vms()`. """ + from __future__ import annotations -from typing import Literal, TypedDict, NotRequired +from typing import Literal, NotRequired, TypedDict # Core status values per product docs VMStatus = Literal[ - "pending", # VM deployment in progress - "running", # VM is active and accessible - "stopped", # VM is stopped but not terminated - "terminated", # VM has been permanently destroyed - "failed", # VM deployment or operation failed + "pending", # VM deployment in progress + "running", # VM is active and accessible + "stopped", # VM is stopped but not terminated + "terminated", # VM has been permanently destroyed + "failed", # VM deployment or operation failed ] OSType = Literal["macos", "linux", "windows"] + class MinimalVM(TypedDict): """Minimal VM object shape returned by list calls. Providers may include additional fields. Optional fields below are common extensions some providers expose or that callers may compute. """ + name: str status: VMStatus # Not always included by all providers diff --git a/libs/python/computer/computer/providers/winsandbox/__init__.py b/libs/python/computer/computer/providers/winsandbox/__init__.py index 715ed7db..0d089092 100644 --- a/libs/python/computer/computer/providers/winsandbox/__init__.py +++ b/libs/python/computer/computer/providers/winsandbox/__init__.py @@ -2,6 +2,7 @@ try: import winsandbox + HAS_WINSANDBOX = True except ImportError: HAS_WINSANDBOX = False diff --git a/libs/python/computer/computer/providers/winsandbox/provider.py b/libs/python/computer/computer/providers/winsandbox/provider.py index 1c9aec3c..771ec2b4 100644 --- a/libs/python/computer/computer/providers/winsandbox/provider.py +++ b/libs/python/computer/computer/providers/winsandbox/provider.py @@ -1,11 +1,11 @@ """Windows Sandbox VM provider implementation using pywinsandbox.""" -import os import asyncio import logging +import os import time -from typing import Dict, Any, Optional, List from pathlib import Path +from typing import Any, Dict, List, Optional from ..base import BaseVMProvider, VMProviderType @@ -14,6 +14,7 @@ logger = logging.getLogger(__name__) try: import winsandbox + HAS_WINSANDBOX = True except ImportError: HAS_WINSANDBOX = False @@ -21,13 +22,13 @@ except ImportError: class WinSandboxProvider(BaseVMProvider): """Windows Sandbox VM provider implementation using pywinsandbox. - + This provider uses Windows Sandbox to create isolated Windows environments. Storage is always ephemeral with Windows Sandbox. """ - + def __init__( - self, + self, port: int = 7777, host: str = "localhost", storage: Optional[str] = None, @@ -35,10 +36,10 @@ class WinSandboxProvider(BaseVMProvider): ephemeral: bool = True, # Windows Sandbox is always ephemeral memory_mb: int = 4096, networking: bool = True, - **kwargs + **kwargs, ): """Initialize the Windows Sandbox provider. - + Args: port: Port for the computer server (default: 7777) host: Host to use for connections (default: localhost) @@ -53,41 +54,43 @@ class WinSandboxProvider(BaseVMProvider): "pywinsandbox is required for WinSandboxProvider. " "Please install it with 'pip install pywinsandbox'" ) - + self.host = host self.port = port self.verbose = verbose self.memory_mb = memory_mb self.networking = networking - + # Windows Sandbox is always ephemeral if not ephemeral: logger.warning("Windows Sandbox storage is always ephemeral. Ignoring ephemeral=False.") self.ephemeral = True - + # Storage is always ephemeral for Windows Sandbox if storage and storage != "ephemeral": - logger.warning("Windows Sandbox does not support persistent storage. Using ephemeral storage.") + logger.warning( + "Windows Sandbox does not support persistent storage. Using ephemeral storage." + ) self.storage = "ephemeral" - + self.logger = logging.getLogger(__name__) - + # Track active sandboxes self._active_sandboxes: Dict[str, Any] = {} - + @property def provider_type(self) -> VMProviderType: """Get the provider type.""" return VMProviderType.WINSANDBOX - + async def __aenter__(self): """Enter async context manager.""" # Verify Windows Sandbox is available if not HAS_WINSANDBOX: raise ImportError("pywinsandbox is not available") - + return self - + async def __aexit__(self, exc_type, exc_val, exc_tb): """Exit async context manager.""" # Clean up any active sandboxes @@ -97,29 +100,24 @@ class WinSandboxProvider(BaseVMProvider): self.logger.info(f"Terminated sandbox: {name}") except Exception as e: self.logger.error(f"Error terminating sandbox {name}: {e}") - + self._active_sandboxes.clear() - + async def get_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Get VM information by name. - + Args: name: Name of the VM to get information for storage: Ignored for Windows Sandbox (always ephemeral) - + Returns: Dictionary with VM information including status, IP address, etc. """ if name not in self._active_sandboxes: - return { - "name": name, - "status": "stopped", - "ip_address": None, - "storage": "ephemeral" - } - + return {"name": name, "status": "stopped", "ip_address": None, "storage": "ephemeral"} + sandbox = self._active_sandboxes[name] - + # Check if sandbox is still running try: # Try to ping the sandbox to see if it's responsive @@ -128,7 +126,7 @@ class WinSandboxProvider(BaseVMProvider): sandbox_responsive = True except Exception: sandbox_responsive = False - + if not sandbox_responsive: return { "name": name, @@ -136,33 +134,36 @@ class WinSandboxProvider(BaseVMProvider): "ip_address": None, "storage": "ephemeral", "memory_mb": self.memory_mb, - "networking": self.networking + "networking": self.networking, } - + # Check for computer server address file - server_address_file = r"C:\Users\WDAGUtilityAccount\Desktop\shared_windows_sandbox_dir\server_address" - + server_address_file = ( + r"C:\Users\WDAGUtilityAccount\Desktop\shared_windows_sandbox_dir\server_address" + ) + try: # Check if the server address file exists file_exists = sandbox.rpyc.modules.os.path.exists(server_address_file) - + if file_exists: # Read the server address file - with sandbox.rpyc.builtin.open(server_address_file, 'r') as f: + with sandbox.rpyc.builtin.open(server_address_file, "r") as f: server_address = f.read().strip() - - if server_address and ':' in server_address: + + if server_address and ":" in server_address: # Parse IP:port from the file - ip_address, port = server_address.split(':', 1) - + ip_address, port = server_address.split(":", 1) + # Verify the server is actually responding try: import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(3) result = sock.connect_ex((ip_address, int(port))) sock.close() - + if result == 0: # Server is responding status = "running" @@ -183,26 +184,26 @@ class WinSandboxProvider(BaseVMProvider): # Server address file doesn't exist yet status = "starting" ip_address = None - + except Exception as e: self.logger.debug(f"Error checking server address file: {e}") status = "starting" ip_address = None - + except Exception as e: self.logger.error(f"Error checking sandbox status: {e}") status = "error" ip_address = None - + return { "name": name, "status": status, "ip_address": ip_address, "storage": "ephemeral", "memory_mb": self.memory_mb, - "networking": self.networking + "networking": self.networking, } - + async def list_vms(self) -> List[Dict[str, Any]]: """List all available VMs.""" vms = [] @@ -210,25 +211,24 @@ class WinSandboxProvider(BaseVMProvider): vm_info = await self.get_vm(name) vms.append(vm_info) return vms - - async def run_vm(self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + + async def run_vm( + self, image: str, name: str, run_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Run a VM with the given options. - + Args: image: Image name (ignored for Windows Sandbox - always uses host Windows) name: Name of the VM to run run_opts: Dictionary of run options (memory, cpu, etc.) storage: Ignored for Windows Sandbox (always ephemeral) - + Returns: Dictionary with VM run status and information """ if name in self._active_sandboxes: - return { - "success": False, - "error": f"Sandbox {name} is already running" - } - + return {"success": False, "error": f"Sandbox {name} is already running"} + try: # Extract options from run_opts memory_mb = run_opts.get("memory_mb", self.memory_mb) @@ -240,9 +240,9 @@ class WinSandboxProvider(BaseVMProvider): memory_mb = int(memory_mb[:-2]) else: memory_mb = self.memory_mb - + networking = run_opts.get("networking", self.networking) - + # Create folder mappers; always map a persistent venv directory on host for caching packages folder_mappers = [] # Ensure host side persistent venv directory exists (Path.home()/wsb_venv) @@ -260,7 +260,7 @@ class WinSandboxProvider(BaseVMProvider): host_path = shared_dir else: continue - + if host_path and os.path.exists(host_path): folder_mappers.append(winsandbox.FolderMapper(host_path)) @@ -272,182 +272,185 @@ class WinSandboxProvider(BaseVMProvider): ) except Exception as e: self.logger.warning(f"Failed to map host winsandbox_venv: {e}") - + self.logger.info(f"Creating Windows Sandbox: {name}") self.logger.info(f"Memory: {memory_mb}MB, Networking: {networking}") if folder_mappers: self.logger.info(f"Shared directories: {len(folder_mappers)}") - + # Create the sandbox without logon script try: # Try with memory_mb parameter (newer pywinsandbox version) sandbox = winsandbox.new_sandbox( - memory_mb=str(memory_mb), - networking=networking, - folder_mappers=folder_mappers + memory_mb=str(memory_mb), networking=networking, folder_mappers=folder_mappers ) except TypeError as e: if "memory_mb" in str(e): # Fallback for older pywinsandbox version that doesn't support memory_mb self.logger.warning( - f"Your pywinsandbox version doesn't support memory_mb parameter. " - f"Using default memory settings. To use custom memory settings, " - f"please update pywinsandbox: pip install -U git+https://github.com/karkason/pywinsandbox.git" + "Your pywinsandbox version doesn't support memory_mb parameter. " + "Using default memory settings. To use custom memory settings, " + "please update pywinsandbox: pip install -U git+https://github.com/karkason/pywinsandbox.git" ) sandbox = winsandbox.new_sandbox( - networking=networking, - folder_mappers=folder_mappers + networking=networking, folder_mappers=folder_mappers ) else: # Re-raise if it's a different TypeError raise - + # Store the sandbox self._active_sandboxes[name] = sandbox - + self.logger.info(f"Windows Sandbox {name} created successfully") - - venv_exists = (host_wsb_env / "venv" / "Lib" / "site-packages" / "computer_server").exists() if host_wsb_env else False + + venv_exists = ( + (host_wsb_env / "venv" / "Lib" / "site-packages" / "computer_server").exists() + if host_wsb_env + else False + ) # Setup the computer server in the sandbox await self._setup_computer_server(sandbox, name, wait_for_venv=(not venv_exists)) - + return { "success": True, "name": name, "status": "starting", "memory_mb": memory_mb, "networking": networking, - "storage": "ephemeral" + "storage": "ephemeral", } - + except Exception as e: self.logger.error(f"Failed to create Windows Sandbox {name}: {e}") # stack trace import traceback + self.logger.error(f"Stack trace: {traceback.format_exc()}") - return { - "success": False, - "error": f"Failed to create sandbox: {str(e)}" - } - + return {"success": False, "error": f"Failed to create sandbox: {str(e)}"} + async def stop_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: """Stop a running VM. - + Args: name: Name of the VM to stop storage: Ignored for Windows Sandbox - + Returns: Dictionary with stop status and information """ if name not in self._active_sandboxes: - return { - "success": False, - "error": f"Sandbox {name} is not running" - } - + return {"success": False, "error": f"Sandbox {name} is not running"} + try: sandbox = self._active_sandboxes[name] - + # Terminate the sandbox sandbox.shutdown() - + # Remove from active sandboxes del self._active_sandboxes[name] - + self.logger.info(f"Windows Sandbox {name} stopped successfully") - - return { - "success": True, - "name": name, - "status": "stopped" - } - + + return {"success": True, "name": name, "status": "stopped"} + except Exception as e: self.logger.error(f"Failed to stop Windows Sandbox {name}: {e}") - return { - "success": False, - "error": f"Failed to stop sandbox: {str(e)}" - } - - async def update_vm(self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None) -> Dict[str, Any]: + return {"success": False, "error": f"Failed to stop sandbox: {str(e)}"} + + async def update_vm( + self, name: str, update_opts: Dict[str, Any], storage: Optional[str] = None + ) -> Dict[str, Any]: """Update VM configuration. - + Note: Windows Sandbox does not support runtime configuration updates. The sandbox must be stopped and restarted with new configuration. - + Args: name: Name of the VM to update update_opts: Dictionary of update options storage: Ignored for Windows Sandbox - + Returns: Dictionary with update status and information """ return { "success": False, "error": "Windows Sandbox does not support runtime configuration updates. " - "Please stop and restart the sandbox with new configuration." + "Please stop and restart the sandbox with new configuration.", } async def restart_vm(self, name: str, storage: Optional[str] = None) -> Dict[str, Any]: raise NotImplementedError("WinSandboxProvider does not support restarting VMs.") - + async def get_ip(self, name: str, storage: Optional[str] = None, retry_delay: int = 2) -> str: """Get the IP address of a VM, waiting indefinitely until it's available. - + Args: name: Name of the VM to get the IP for storage: Ignored for Windows Sandbox retry_delay: Delay between retries in seconds (default: 2) - + Returns: IP address of the VM when it becomes available """ total_attempts = 0 - + # Loop indefinitely until we get a valid IP while True: total_attempts += 1 - + # Log retry message but not on first attempt if total_attempts > 1: - self.logger.info(f"Waiting for Windows Sandbox {name} IP address (attempt {total_attempts})...") - + self.logger.info( + f"Waiting for Windows Sandbox {name} IP address (attempt {total_attempts})..." + ) + try: # Get VM information vm_info = await self.get_vm(name, storage=storage) - + # Check if we got a valid IP ip = vm_info.get("ip_address", None) if ip and ip != "unknown" and not ip.startswith("0.0.0.0"): self.logger.info(f"Got valid Windows Sandbox IP address: {ip}") return ip - + # Check the VM status status = vm_info.get("status", "unknown") - + # If VM is not running yet, log and wait if status != "running": - self.logger.info(f"Windows Sandbox is not running yet (status: {status}). Waiting...") + self.logger.info( + f"Windows Sandbox is not running yet (status: {status}). Waiting..." + ) # If VM is running but no IP yet, wait and retry else: - self.logger.info("Windows Sandbox is running but no valid IP address yet. Waiting...") - + self.logger.info( + "Windows Sandbox is running but no valid IP address yet. Waiting..." + ) + except Exception as e: - self.logger.warning(f"Error getting Windows Sandbox {name} IP: {e}, continuing to wait...") - + self.logger.warning( + f"Error getting Windows Sandbox {name} IP: {e}, continuing to wait..." + ) + # Wait before next retry await asyncio.sleep(retry_delay) - + # Add progress log every 10 attempts if total_attempts % 10 == 0: - self.logger.info(f"Still waiting for Windows Sandbox {name} IP after {total_attempts} attempts...") - - async def _setup_computer_server(self, sandbox, name: str, visible: bool = False, wait_for_venv: bool = True): + self.logger.info( + f"Still waiting for Windows Sandbox {name} IP after {total_attempts} attempts..." + ) + + async def _setup_computer_server( + self, sandbox, name: str, visible: bool = False, wait_for_venv: bool = True + ): """Setup the computer server in the Windows Sandbox using RPyC. - + Args: sandbox: The Windows Sandbox instance name: Name of the sandbox @@ -458,52 +461,58 @@ class WinSandboxProvider(BaseVMProvider): # Read the PowerShell setup script script_path = os.path.join(os.path.dirname(__file__), "setup_script.ps1") - with open(script_path, 'r', encoding='utf-8') as f: + with open(script_path, "r", encoding="utf-8") as f: setup_script_content = f.read() - + # Write the setup script to the sandbox using RPyC script_dest_path = r"C:\Users\WDAGUtilityAccount\setup_cua.ps1" - + self.logger.info(f"Writing setup script to {script_dest_path}") - with sandbox.rpyc.builtin.open(script_dest_path, 'w') as f: + with sandbox.rpyc.builtin.open(script_dest_path, "w") as f: f.write(setup_script_content) - + # Execute the PowerShell script in the background self.logger.info("Executing setup script in sandbox...") - + # Use subprocess to run PowerShell script import subprocess + powershell_cmd = [ - "powershell.exe", - "-ExecutionPolicy", "Bypass", + "powershell.exe", + "-ExecutionPolicy", + "Bypass", "-NoExit", # Keep window open after script completes - "-File", script_dest_path + "-File", + script_dest_path, ] - + # Set creation flags based on visibility preference if visible: # CREATE_NEW_CONSOLE - creates a new console window (visible) creation_flags = 0x00000010 else: - creation_flags = 0x08000000 # CREATE_NO_WINDOW - + creation_flags = 0x08000000 # CREATE_NO_WINDOW + # Start the process using RPyC process = sandbox.rpyc.modules.subprocess.Popen( - powershell_cmd, - creationflags=creation_flags, - shell=False + powershell_cmd, creationflags=creation_flags, shell=False ) if wait_for_venv: - print("Waiting for venv to be created for the first time setup of Windows Sandbox...") + print( + "Waiting for venv to be created for the first time setup of Windows Sandbox..." + ) print("This may take a minute...") await asyncio.sleep(120) - + ip = await self.get_ip(name) self.logger.info(f"Sandbox IP: {ip}") - self.logger.info(f"Setup script started in background in sandbox {name} with PID: {process.pid}") - + self.logger.info( + f"Setup script started in background in sandbox {name} with PID: {process.pid}" + ) + except Exception as e: self.logger.error(f"Failed to setup computer server in sandbox {name}: {e}") import traceback + self.logger.error(f"Stack trace: {traceback.format_exc()}") diff --git a/libs/python/computer/computer/ui/gradio/__init__.py b/libs/python/computer/computer/ui/gradio/__init__.py index 3645348e..62bbaf80 100644 --- a/libs/python/computer/computer/ui/gradio/__init__.py +++ b/libs/python/computer/computer/ui/gradio/__init__.py @@ -1,6 +1,7 @@ """Gradio UI for Computer UI.""" -import gradio as gr from typing import Optional +import gradio as gr + from .app import create_gradio_ui diff --git a/libs/python/computer/computer/ui/gradio/app.py b/libs/python/computer/computer/ui/gradio/app.py index d8c5c513..a297302c 100644 --- a/libs/python/computer/computer/ui/gradio/app.py +++ b/libs/python/computer/computer/ui/gradio/app.py @@ -4,91 +4,171 @@ Advanced Gradio UI for Computer Interface This is a Gradio interface for the Computer Interface """ -import gradio as gr import asyncio +import base64 +import glob +import hashlib import io import json -import uuid -import hashlib import os -import glob import random -import base64 -from datetime import datetime -from PIL import Image -from huggingface_hub import DatasetCard, DatasetCardData -from computer import Computer, VMProviderType -from gradio.components import ChatMessage -import pandas as pd -from datasets import Dataset, Features, Sequence, concatenate_datasets -import datasets - import random as rand +import uuid +from datetime import datetime + +import datasets +import gradio as gr +import pandas as pd +from computer import Computer, VMProviderType +from datasets import Dataset, Features, Sequence, concatenate_datasets +from gradio.components import ChatMessage +from huggingface_hub import DatasetCard, DatasetCardData +from PIL import Image # Task examples as dictionaries with task string and setup function TASK_EXAMPLES = [ { "task": "Open the shopping list on my desktop and add all the items to a Doordash cart", - "setup": lambda computer: create_shopping_list_file(computer) - }, + "setup": lambda computer: create_shopping_list_file(computer), + }, { "task": "Do a random miniwob++ task, output the task name in tags and your reward in tags" - } + }, ] + # Generate random shopping list and save to desktop using computer interface async def create_shopping_list_file(computer): - items = ["Milk", "Eggs", "Bread", "Apples", "Bananas", "Chicken", "Rice", - "Cereal", "Coffee", "Cheese", "Pasta", "Tomatoes", "Potatoes", - "Onions", "Carrots", "Ice Cream", "Yogurt", "Cookies"] - + items = [ + "Milk", + "Eggs", + "Bread", + "Apples", + "Bananas", + "Chicken", + "Rice", + "Cereal", + "Coffee", + "Cheese", + "Pasta", + "Tomatoes", + "Potatoes", + "Onions", + "Carrots", + "Ice Cream", + "Yogurt", + "Cookies", + ] + # Select 1-5 random items num_items = rand.randint(1, 5) selected_items = rand.sample(items, num_items) - + # Create shopping list content content = "SHOPPING LIST:\n\n" for item in selected_items: content += f"- {item}\n" - + # Create a temporary file with the content temp_file_path = "/tmp/shopping_list.txt" - + # Use run_command to create the file on the desktop desktop_path = "~/Desktop" file_path = f"{desktop_path}/shopping_list.txt" - + # Create the file using echo command cmd = f"echo '{content}' > {file_path}" stdout, stderr = await computer.interface.run_command(cmd) - + print(f"Created shopping list at {file_path} with {num_items} items") if stderr: print(f"Error: {stderr}") - + return file_path + +import typing + # Load valid keys from the Key enum in models.py from computer.interface.models import Key -import typing -VALID_KEYS = [key.value for key in Key] + [ - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' + +VALID_KEYS = [key.value for key in Key] + [ + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", ] -VALID_KEYS = list(dict.fromkeys(VALID_KEYS)) # remove duplicates, preserve order +VALID_KEYS = list(dict.fromkeys(VALID_KEYS)) # remove duplicates, preserve order # List of random words for demo naming -RANDOM_WORDS = ["apple", "banana", "cherry", "dolphin", "elephant", "forest", - "giraffe", "harmony", "igloo", "jungle", "kangaroo", "lemon", - "mountain", "notebook", "ocean", "penguin", "quasar", "rainbow", "ohana", - "sunflower", "tiger", "umbrella", "volcano", "waterfall", "xylophone", - "yellow", "zebra"] +RANDOM_WORDS = [ + "apple", + "banana", + "cherry", + "dolphin", + "elephant", + "forest", + "giraffe", + "harmony", + "igloo", + "jungle", + "kangaroo", + "lemon", + "mountain", + "notebook", + "ocean", + "penguin", + "quasar", + "rainbow", + "ohana", + "sunflower", + "tiger", + "umbrella", + "volcano", + "waterfall", + "xylophone", + "yellow", + "zebra", +] + # Generate a random demo name with 3 words def generate_random_demo_name(): return " ".join(random.sample(RANDOM_WORDS, 3)) + # Global session ID for tracking this run session_id = str(uuid.uuid4()) @@ -105,101 +185,108 @@ screenshot_images = [] # Array to store all screenshot images OUTPUT_DIR = "examples/output" SESSION_DIR = os.path.join(OUTPUT_DIR, "sessions") + def load_all_sessions(with_images=False): """Load and concatenate all session datasets into a single Dataset""" try: # Get all session folders if not os.path.exists(SESSION_DIR): return None - + session_folders = glob.glob(os.path.join(SESSION_DIR, "*")) if not session_folders: return None - + # Load each dataset and concatenate all_datasets = [] for folder in session_folders: try: ds = Dataset.load_from_disk(folder) if not with_images: - ds = ds.remove_columns('images') - + ds = ds.remove_columns("images") + # Add folder name to identify the source folder_name = os.path.basename(folder) - + # Process the messages from tool_call_logs def process_messages(example): messages_text = [] current_role = None - + # Process the logs if they exist in the example - if 'tool_calls' in example: + if "tool_calls" in example: # Use the existing get_chatbot_messages function with explicit logs parameter - formatted_msgs = get_chatbot_messages(logs=json.loads(example['tool_calls'])) - + formatted_msgs = get_chatbot_messages( + logs=json.loads(example["tool_calls"]) + ) + # Process each ChatMessage and extract either title or content for msg in formatted_msgs: # Check if role has changed if msg.role != current_role: # Add a line with the new role if it changed if current_role is not None: # Skip for the first message - messages_text.append("") # Add an empty line between role changes + messages_text.append( + "" + ) # Add an empty line between role changes messages_text.append(f"{msg.role}") current_role = msg.role - + # Add the message content - if msg.metadata and 'title' in msg.metadata: + if msg.metadata and "title" in msg.metadata: # Use the title if available - messages_text.append(msg.metadata['title']) + messages_text.append(msg.metadata["title"]) else: # Use just the content without role prefix since we're adding role headers messages_text.append(msg.content) - + # Join all messages with newlines all_messages = "\n".join(messages_text) - + return { **example, "source_folder": folder_name, "messages": all_messages, } - + # Apply the processing to each example ds = ds.map(process_messages) all_datasets.append(ds) except Exception as e: print(f"Error loading dataset from {folder}: {str(e)}") - + if not all_datasets: return None - + # Concatenate all datasets return concatenate_datasets(all_datasets) except Exception as e: print(f"Error loading sessions: {str(e)}") return None + def get_existing_tags(): """Extract all existing tags from saved demonstrations""" all_sessions = load_all_sessions() if all_sessions is None: return [], [] - + # Convert to pandas and extract tags df = all_sessions.to_pandas() - - if 'tags' not in df.columns: + + if "tags" not in df.columns: return [] - + # Extract all tags and flatten the list all_tags = [] - for tags in df['tags'].dropna(): + for tags in df["tags"].dropna(): all_tags += list(tags) - + # Remove duplicates and sort unique_tags = sorted(list(set(all_tags))) return unique_tags, unique_tags + def get_sessions_data(): """Load all sessions dataset""" @@ -207,21 +294,22 @@ def get_sessions_data(): if combined_ds: # Convert to pandas and select columns df = combined_ds.to_pandas() - columns = ['name', 'messages', 'source_folder'] - if 'tags' in df.columns: - columns.append('tags') + columns = ["name", "messages", "source_folder"] + if "tags" in df.columns: + columns.append("tags") return df[columns] else: return pd.DataFrame({"name": [""], "messages": [""], "source_folder": [""]}) + def upload_to_huggingface(dataset_name, visibility, filter_tags=None): """Upload sessions to HuggingFace Datasets Hub, optionally filtered by tags - + Args: dataset_name: Name of the dataset on HuggingFace (format: username/dataset-name) visibility: 'public' or 'private' filter_tags: List of tags to filter by (optional) - + Returns: Status message """ @@ -230,35 +318,35 @@ def upload_to_huggingface(dataset_name, visibility, filter_tags=None): hf_token = os.environ.get("HF_TOKEN") if not hf_token: return "Error: HF_TOKEN environment variable not found. Please set it before uploading." - + # Check if dataset name is in the correct format if not dataset_name or "/" not in dataset_name: return "Dataset name must be in the format 'username/dataset-name'" - + # Load all sessions combined_ds = load_all_sessions(with_images=True) if combined_ds is None or len(combined_ds) == 0: return "No sessions found to upload." - + # If tag filtering is provided, filter the datasets if filter_tags: # Convert to pandas to filter df = combined_ds.to_pandas() - - if 'tags' not in df.columns: + + if "tags" not in df.columns: return "No sessions with tags found to filter." - + # Get list of source folders for sessions that have any of the selected tags matching_folders = [] for _, row in df.iterrows(): - if not len(row.get('tags')): + if not len(row.get("tags")): continue - if any(tag in list(row.get('tags', [])) for tag in filter_tags): - matching_folders.append(row['source_folder']) - + if any(tag in list(row.get("tags", [])) for tag in filter_tags): + matching_folders.append(row["source_folder"]) + if not matching_folders: return "No sessions matched the selected tag filters." - + # Load only the matching datasets filtered_datasets = [] for folder in matching_folders: @@ -269,10 +357,10 @@ def upload_to_huggingface(dataset_name, visibility, filter_tags=None): filtered_datasets.append(ds) except Exception as e: print(f"Error loading dataset from {folder}: {str(e)}") - + if not len(filtered_datasets): return "Error loading the filtered sessions." - + # Create a new combined dataset with just the filtered sessions upload_ds = concatenate_datasets(filtered_datasets) session_count = len(upload_ds) @@ -280,57 +368,52 @@ def upload_to_huggingface(dataset_name, visibility, filter_tags=None): # Use all sessions upload_ds = combined_ds session_count = len(upload_ds) - - tags = ['cua'] + + tags = ["cua"] if isinstance(filter_tags, list): tags += filter_tags - + # Push to HuggingFace upload_ds.push_to_hub( dataset_name, private=visibility == "private", token=hf_token, - commit_message="(Built with github.com/trycua/cua)" + commit_message="(Built with github.com/trycua/cua)", ) - + # Create dataset card card_data = DatasetCardData( - language='en', - license='mit', - task_categories=['visual-question-answering'], - tags=tags + language="en", license="mit", task_categories=["visual-question-answering"], tags=tags ) card = DatasetCard.from_template( card_data=card_data, - template_str="---\n{{ card_data }}\n---\n\n# Uploaded computer interface trajectories\n\nThese trajectories were generated and uploaded using [cua](https://github.com/trycua/cua)" + template_str="---\n{{ card_data }}\n---\n\n# Uploaded computer interface trajectories\n\nThese trajectories were generated and uploaded using [cua](https://github.com/trycua/cua)", ) - card.push_to_hub( - dataset_name, - commit_message="Cua dataset card" - ) - + card.push_to_hub(dataset_name, commit_message="Cua dataset card") + return f"Successfully uploaded {session_count} sessions to HuggingFace Datasets Hub at https://huggingface.co/datasets/{dataset_name}" - + except Exception as e: return f"Error uploading to HuggingFace: {str(e)}" + def save_demonstration(log_data, demo_name=None, demo_tags=None): """Save the current tool call logs as a demonstration file using HuggingFace datasets""" global tool_call_logs, session_id - + if not tool_call_logs: return "No data to save", None - + # Create output directories if they don't exist if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) if not os.path.exists(SESSION_DIR): os.makedirs(SESSION_DIR) - + # Use default name if none provided if not demo_name or demo_name.strip() == "": demo_name = generate_random_demo_name() - + # Process tags tags = [] if demo_tags: @@ -338,66 +421,69 @@ def save_demonstration(log_data, demo_name=None, demo_tags=None): tags = demo_tags elif isinstance(demo_tags, str): # Split by comma if it's a comma-separated string - tags = [tag.strip() for tag in demo_tags.split(',') if tag.strip()] - + tags = [tag.strip() for tag in demo_tags.split(",") if tag.strip()] + log_time = datetime.now().isoformat() - + def msg_to_dict(msg: ChatMessage): - return { - "role": msg.role, - "content": str(msg.content), - "metadata": dict(msg.metadata) - } - + return {"role": msg.role, "content": str(msg.content), "metadata": dict(msg.metadata)} + # Create dataset - demonstration_dataset = [{ - "timestamp": str(log_time), - "session_id": str(session_id), - "name": str(demo_name), - "tool_calls": json.dumps(tool_call_logs), - "messages": json.dumps([msg_to_dict(msg) for msg in get_chatbot_messages(tool_call_logs)]), - "tags": list(tags), - "images": [Image.open(io.BytesIO(img)) for img in screenshot_images], - }] - + demonstration_dataset = [ + { + "timestamp": str(log_time), + "session_id": str(session_id), + "name": str(demo_name), + "tool_calls": json.dumps(tool_call_logs), + "messages": json.dumps( + [msg_to_dict(msg) for msg in get_chatbot_messages(tool_call_logs)] + ), + "tags": list(tags), + "images": [Image.open(io.BytesIO(img)) for img in screenshot_images], + } + ] + try: # Create a new HuggingFace dataset from the current session new_session_ds = Dataset.from_list( demonstration_dataset, - features=Features({ - 'timestamp': datasets.Value('string'), - 'session_id': datasets.Value('string'), - 'name': datasets.Value('string'), - 'tool_calls': datasets.Value('string'), - 'messages': datasets.Value('string'), - 'tags': Sequence(datasets.Value('string')), - 'images': Sequence(datasets.Image()), - }) + features=Features( + { + "timestamp": datasets.Value("string"), + "session_id": datasets.Value("string"), + "name": datasets.Value("string"), + "tool_calls": datasets.Value("string"), + "messages": datasets.Value("string"), + "tags": Sequence(datasets.Value("string")), + "images": Sequence(datasets.Image()), + } + ), ) - + # Create a unique folder name with demonstration name, session ID and timestamp timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") safe_name = demo_name.replace(" ", "_").replace("/", "_").replace("\\", "_")[:50] session_folder = os.path.join(SESSION_DIR, f"{safe_name}_{session_id}_{timestamp}") - + # Create the directory if it doesn't exist if not os.path.exists(session_folder): os.makedirs(session_folder) - + # Save the dataset to the unique folder new_session_ds.save_to_disk(session_folder) - + return f"Session saved to {session_folder}" except Exception as e: return f"Error saving demonstration: {str(e)}" + def log_tool_call(name, action, arguments, result=None): """Log a tool call with unique IDs and results""" global tool_call_logs - + # Create arguments JSON that includes the action args = {"action": action, **arguments} - + # Process result for logging processed_result = {} if result: @@ -417,37 +503,38 @@ def log_tool_call(name, action, arguments, result=None): processed_result[key] = f"" else: processed_result[key] = value - + # Create the tool call log entry log_entry = { "type": "function_call", "name": name, "arguments": json.dumps(args), - "result": processed_result if result else None + "result": processed_result if result else None, } - + # Add to logs and immediately flush by printing tool_call_logs.append(log_entry) print(f"Tool call logged: {json.dumps(log_entry)}") - + return log_entry + async def execute(name, action, arguments): """Execute a tool call, log it, and return any results""" global computer, last_action, last_screenshot, last_screenshot_before - + last_screenshot_before = last_screenshot - + # Store last action for reasoning box last_action = {"name": name, "action": action, "arguments": arguments} - + results = {} - + # Execute the action based on name and action if name == "computer": if computer is None: return {} - + # Get the method from the computer interface if action == "initialize": # Already initialized, just log @@ -505,7 +592,7 @@ async def execute(name, action, arguments): elif action == "done" or action == "fail": # Just a marker, doesn't do anything pass - + # Add a screenshot to the results for every action (if not already there) if action != "shutdown" and "screenshot" not in results: results["screenshot"] = await computer.interface.screenshot() @@ -515,22 +602,25 @@ async def execute(name, action, arguments): # If requested, take a screenshot after message if arguments.get("screenshot_after", False) and computer is not None: results["screenshot"] = await computer.interface.screenshot() - + # Log the tool call with results log_tool_call(name, action, arguments, results) - + if "screenshot" in results: # Convert bytes to PIL Image screenshot_img = Image.open(io.BytesIO(results["screenshot"])) results["screenshot"] = screenshot_img # Update last_screenshot with the new screenshot last_screenshot = screenshot_img - + return results -async def handle_init_computer(os_choice: str, app_list=None, provider="lume", container_name=None, api_key=None): + +async def handle_init_computer( + os_choice: str, app_list=None, provider="lume", container_name=None, api_key=None +): """Initialize the computer instance and tools for macOS or Ubuntu or Windows - + Args: os_choice: The OS to use ("macOS" or "Ubuntu" or "Windows") app_list: Optional list of apps to focus on using the app-use experiment @@ -539,14 +629,14 @@ async def handle_init_computer(os_choice: str, app_list=None, provider="lume", c api_key: The API key to use for cloud provider """ global computer, tool_call_logs, tools - + # Check if we should enable app-use experiment use_app_experiment = app_list and len(app_list) > 0 experiments = ["app-use"] if use_app_experiment else None - + # Determine if we should use host computer server use_host_computer_server = provider == "self" - + if os_choice == "Ubuntu": os_type_str = "linux" image_str = "ubuntu-noble-vanilla:latest" @@ -556,13 +646,11 @@ async def handle_init_computer(os_choice: str, app_list=None, provider="lume", c else: os_type_str = "macos" image_str = "macos-sequoia-cua:latest" - + # Create computer instance with appropriate configuration if use_host_computer_server: computer = Computer( - os_type=os_type_str, - use_host_computer_server=True, - experiments=experiments + os_type=os_type_str, use_host_computer_server=True, experiments=experiments ) elif provider == "cloud": # Use API key from environment variable or field input @@ -572,13 +660,11 @@ async def handle_init_computer(os_choice: str, app_list=None, provider="lume", c provider_type=VMProviderType.CLOUD, name=container_name, api_key=cloud_api_key, - experiments=experiments + experiments=experiments, ) elif provider == "winsandbox": computer = Computer( - os_type="windows", - provider_type=VMProviderType.WINSANDBOX, - experiments=experiments + os_type="windows", provider_type=VMProviderType.WINSANDBOX, experiments=experiments ) else: computer = Computer( @@ -588,169 +674,174 @@ async def handle_init_computer(os_choice: str, app_list=None, provider="lume", c display="1024x768", memory="8GB", cpu="4", - experiments=experiments + experiments=experiments, ) await computer.run() - + # If app list is provided, create desktop from apps if use_app_experiment: computer = computer.create_desktop_from_apps(app_list) # Log computer initialization as a tool call - init_params = { - "os": os_type_str, - "provider": provider - } - + init_params = {"os": os_type_str, "provider": provider} + # Add VM-specific parameters if not using host computer server if not use_host_computer_server: - init_params.update({ - "image": image_str, - "display": "1024x768", - "memory": "8GB", - "cpu": "4" - }) - + init_params.update({"image": image_str, "display": "1024x768", "memory": "8GB", "cpu": "4"}) + # Add app list to the log if provided if use_app_experiment: init_params["apps"] = app_list init_params["experiments"] = ["app-use"] - + # Add container name to the log if using cloud provider if provider == "cloud": init_params["container_name"] = container_name - + result = await execute("computer", "initialize", init_params) return result["screenshot"], json.dumps(tool_call_logs, indent=2) + async def handle_screenshot(): """Take a screenshot and return it as a PIL Image""" global computer if computer is None: return None - + result = await execute("computer", "screenshot", {}) return result["screenshot"] + async def handle_wait(): """Wait for 1 second and then take a screenshot""" global computer if computer is None: return None - + # Execute wait action result = await execute("computer", "wait", {}) return result["screenshot"], json.dumps(tool_call_logs, indent=2) + async def handle_click(evt: gr.SelectData, img, click_type): """Handle click events on the image based on click type""" global computer if computer is None: return img, json.dumps(tool_call_logs, indent=2) - + # Get the coordinates of the click x, y = evt.index - + # Move cursor and perform click result = await execute("computer", click_type, {"x": x, "y": y}) - + # Take a new screenshot to show the result return result["screenshot"], json.dumps(tool_call_logs, indent=2) + async def handle_type(text, press_enter=False): """Type text into the computer""" global computer if computer is None or not text: return await handle_screenshot(), json.dumps(tool_call_logs, indent=2) - + result = await execute("computer", "type_text", {"text": text, "press_enter": press_enter}) - + return result["screenshot"], json.dumps(tool_call_logs, indent=2) + async def handle_copy(): """Copy selected content to clipboard and return it""" global computer if computer is None: return "Computer not initialized", json.dumps(tool_call_logs, indent=2) - + result = await execute("computer", "copy_to_clipboard", {}) content = result.get("clipboard", "No content copied") - + return content, json.dumps(tool_call_logs, indent=2) + async def handle_set_clipboard(text): """Set clipboard content""" global computer if computer is None: return "Computer not initialized", json.dumps(tool_call_logs, indent=2) - + await execute("computer", "set_clipboard", {"text": text}) - + return f"Clipboard set to: {text}", json.dumps(tool_call_logs, indent=2) + async def handle_run_command(command): """Run a shell command""" global computer if computer is None: return "Computer not initialized", json.dumps(tool_call_logs, indent=2) - + # Execute the run_command action and log it result = await execute("computer", "run_command", {"command": command}) - + # Get the result from the computer interface stdout, stderr = result.get("stdout"), result.get("stderr") - + # Format the output output = "" if stdout: output += f"STDOUT:\n{stdout}\n" if stderr: output += f"STDERR:\n{stderr}\n" - + if not output: output = "(No output)" - + return output, json.dumps(tool_call_logs, indent=2) + async def handle_shutdown(): """Shutdown the computer instance""" global computer if computer is None: return "Computer not initialized", json.dumps(tool_call_logs, indent=2) - + await execute("computer", "shutdown", {}) - + computer = None return "Computer shut down", json.dumps(tool_call_logs, indent=2) + async def handle_memory(memory_text): """Update the global memory""" global memory - await execute("memory", "update", { "memory_text": memory_text }) + await execute("memory", "update", {"memory_text": memory_text}) memory = memory_text return "Memory updated" + async def update_reasoning(reasoning_text, is_erroneous=False): """Update the reasoning for the last action""" global last_action, tool_call_logs - + if not last_action["name"]: return "No action to update reasoning for" - + # Find the last log entry that matches the last action for log_entry in reversed(tool_call_logs): - if (log_entry["name"] == last_action["name"] and - json.loads(log_entry["arguments"]).get("action") == last_action["action"]): + if ( + log_entry["name"] == last_action["name"] + and json.loads(log_entry["arguments"]).get("action") == last_action["action"] + ): # Add reasoning to the log entry log_entry["reasoning"] = reasoning_text # If marked as erroneous, set weight to 0 log_entry["weight"] = 0 if is_erroneous else 1 break - + return "Reasoning updated" + async def clear_log(): """Clear the tool call logs""" global tool_call_logs, screenshot_images @@ -758,67 +849,71 @@ async def clear_log(): tool_call_logs = [] return json.dumps(tool_call_logs, indent=2) + def get_last_action_display(): """Format the last action for display in the reasoning box""" global last_action if not last_action["name"]: return "No actions performed yet" - + action_str = f"Tool: {last_action['name']}\nAction: {last_action['action']}" - + if last_action["arguments"]: args_str = "\nArguments:\n" for k, v in last_action["arguments"].items(): args_str += f" {k}: {v}\n" action_str += args_str - + return action_str + def get_memory(): """Get the current memory""" global memory return memory + def get_chatbot_messages(logs=None): """Format chat messages for gr.Chatbot component - + Args: logs: Optional list of tool call logs. If None, uses global tool_call_logs. - + Returns: List of ChatMessage objects """ formatted_messages = [] - + # Use provided logs if specified, otherwise use global tool_call_logs logs_to_process = logs if logs is not None else tool_call_logs - + for tool_call in logs_to_process: - if tool_call['type'] != "function_call": + if tool_call["type"] != "function_call": continue - - name = tool_call['name'] - arguments = json.loads(tool_call['arguments']) - - role = tool_call['role'] if 'role' in tool_call else arguments['role'] if 'role' in arguments else 'assistant' - + + name = tool_call["name"] + arguments = json.loads(tool_call["arguments"]) + + role = ( + tool_call["role"] + if "role" in tool_call + else arguments["role"] if "role" in arguments else "assistant" + ) + if "reasoning" in tool_call: - formatted_messages += [ChatMessage( - role=role, - content=tool_call['reasoning'], - metadata={"title": "🧠 Reasoning"} - )] - + formatted_messages += [ + ChatMessage( + role=role, content=tool_call["reasoning"], metadata={"title": "🧠 Reasoning"} + ) + ] + # Format tool calls with titles if name == "message": - formatted_messages += [ChatMessage( - role=role, - content=arguments['text'] - )] + formatted_messages += [ChatMessage(role=role, content=arguments["text"])] else: # Format tool calls with a title - action = arguments.get('action', '') - + action = arguments.get("action", "") + # Define dictionary for title mappings title_mappings = { "wait": "⏳ Waiting...", @@ -837,9 +932,9 @@ def get_chatbot_messages(logs=None): "set_clipboard": "πŸ“‹ Setting Clipboard", "run_command": "πŸ–₯️ Running Shell Command", "initialize": "πŸš€ Initializing Computer", - "shutdown": "πŸ›‘ Shutting Down" + "shutdown": "πŸ›‘ Shutting Down", } - + # Look up title based on name.action or just action key = f"{name}.{action}" if key in title_mappings: @@ -848,84 +943,92 @@ def get_chatbot_messages(logs=None): title = title_mappings[action] else: title = f"πŸ› οΈ {name.capitalize()}: {action}" - + # Always set status to done status = "done" - + # Format the response content content_parts = [] - + # Add arguments if arguments: content_parts.append("**Arguments:**") for k, v in arguments.items(): if k != "action": # Skip action as it's in the title content_parts.append(f"- {k}: {v}") - + # Add results if available - if tool_call.get('result'): + if tool_call.get("result"): content_parts.append("\n**Results:**") content_parts.append(f"```json\n{json.dumps(tool_call['result'], indent=4)}\n```") # for k, v in tool_call['result'].items(): # content_parts.append(f"- {k}: {v}") - + # Join all content parts content = "\n".join(content_parts) - - formatted_messages += [ChatMessage( - role="assistant", - content=content, - metadata={"title": title, "status": status} - )] - + + formatted_messages += [ + ChatMessage( + role="assistant", content=content, metadata={"title": title, "status": status} + ) + ] + return formatted_messages + async def submit_message(message_text, role, screenshot_after=False): """Submit a message with specified role (user or assistant)""" global last_screenshot - + # Log the message submission and get result (may include screenshot) - result = await execute("message", "submit", { - "role": role, - "text": message_text, - "screenshot_after": screenshot_after - }) - + result = await execute( + "message", + "submit", + {"role": role, "text": message_text, "screenshot_after": screenshot_after}, + ) + # Update return values based on whether a screenshot was taken if screenshot_after and "screenshot" in result: - return f"Message submitted as {role} with screenshot", get_chatbot_messages(), json.dumps(tool_call_logs, indent=2), result["screenshot"] + return ( + f"Message submitted as {role} with screenshot", + get_chatbot_messages(), + json.dumps(tool_call_logs, indent=2), + result["screenshot"], + ) else: # Return last screenshot if available - return f"Message submitted as {role}", get_chatbot_messages(), json.dumps(tool_call_logs, indent=2), last_screenshot + return ( + f"Message submitted as {role}", + get_chatbot_messages(), + json.dumps(tool_call_logs, indent=2), + last_screenshot, + ) + def create_gradio_ui(): with gr.Blocks() as app: gr.Markdown("# Computer Interface Tool") - + with gr.Row(): with gr.Column(scale=3): with gr.Group(): # Main screenshot display img = gr.Image( - type="pil", - label="Current Screenshot", - show_label=False, - interactive=False + type="pil", label="Current Screenshot", show_label=False, interactive=False ) - + # Click type selection click_type = gr.Radio( - ["left_click", "right_click", "double_click", "move_cursor"], + ["left_click", "right_click", "double_click", "move_cursor"], label="Click Type", - value="left_click" + value="left_click", ) - + with gr.Row(): wait_btn = gr.Button("WAIT") done_btn = gr.Button("DONE") fail_btn = gr.Button("FAIL") - - + # Tabbed logs: Tool logs, Conversational logs, and Demonstrations with gr.Tabs() as logs_tabs: with gr.TabItem("Conversational Logs"): @@ -936,14 +1039,11 @@ def create_gradio_ui(): height=400, type="messages", sanitize_html=True, - allow_tags=True + allow_tags=True, ) with gr.TabItem("Function Logs"): with gr.Group(): - action_log = gr.JSON( - label="Function Logs", - every=0.2 - ) + action_log = gr.JSON(label="Function Logs", every=0.2) clear_log_btn = gr.Button("Clear Log") with gr.TabItem("Save/Share Demonstrations"): with gr.Row(): @@ -952,11 +1052,11 @@ def create_gradio_ui(): dataset_viewer = gr.DataFrame( label="All Sessions", value=get_sessions_data, - show_search='filter', + show_search="filter", max_height=300, - interactive=True # Make it interactive for selection + interactive=True, # Make it interactive for selection ) - + # HuggingFace Upload UI with gr.Group(visible=True): gr.Markdown("Upload Sessions to HuggingFace") @@ -964,28 +1064,30 @@ def create_gradio_ui(): hf_dataset_name = gr.Textbox( label="HuggingFace Dataset Name", placeholder="username/dataset-name", - info="Format: username/dataset-name" + info="Format: username/dataset-name", ) hf_visibility = gr.Radio( choices=["public", "private"], label="Dataset Visibility", - value="private" + value="private", ) - + # Tag filtering with a single multi-select dropdown filter_tags = gr.Dropdown( label="Filter by tags (optional)", choices=get_existing_tags()[0], multiselect=True, allow_custom_value=True, - info="When tags are selected, only demonstrations with those tags will be uploaded. Leave empty to upload all sessions." + info="When tags are selected, only demonstrations with those tags will be uploaded. Leave empty to upload all sessions.", ) - + # Function to update button text based on selected tags def get_upload_button_text(selected_tags=None): if not selected_tags: # Count all sessions - session_folders = glob.glob(os.path.join(SESSION_DIR, "*")) + session_folders = glob.glob( + os.path.join(SESSION_DIR, "*") + ) count = len(session_folders) if session_folders else 0 return f"Upload {count} Sessions to HuggingFace" else: @@ -993,98 +1095,96 @@ def create_gradio_ui(): all_sessions = load_all_sessions() if all_sessions is None: return "Upload 0 Sessions to HuggingFace" - + df = all_sessions.to_pandas() - if 'tags' not in df.columns: + if "tags" not in df.columns: return "Upload 0 Sessions to HuggingFace" - + # Filter by selected tags (sessions that have ANY of the selected tags) matching_count = 0 for _, row in df.iterrows(): - tags = row.get('tags', []) + tags = row.get("tags", []) if not len(tags): continue # Check if any of the selected tags are in this session's tags - if any(tag in list(row['tags']) for tag in selected_tags): + if any( + tag in list(row["tags"]) + for tag in selected_tags + ): matching_count += 1 - - return f"Upload {matching_count} Sessions to HuggingFace" - + + return ( + f"Upload {matching_count} Sessions to HuggingFace" + ) + # Initial button text with all sessions hf_upload_btn = gr.Button(get_upload_button_text()) - + # Update button text when filter changes def update_button_text(selected_tags): return get_upload_button_text(selected_tags) - + # Connect filter changes to update button text filter_tags.change( update_button_text, inputs=filter_tags, - outputs=hf_upload_btn + outputs=hf_upload_btn, ) - + hf_upload_status = gr.Textbox(label="Upload Status", value="") with gr.Column(scale=1): # Demo name with random name button with gr.Group(): demo_name = gr.Textbox( - label="Demonstration Name", + label="Demonstration Name", value=generate_random_demo_name(), - placeholder="Enter a name for this demonstration" + placeholder="Enter a name for this demonstration", ) random_name_btn = gr.Button("🎲", scale=1) - + # Demo tags dropdown demo_tags = gr.Dropdown( label="Demonstration Tags", choices=get_existing_tags()[0], multiselect=True, allow_custom_value=True, - info="Select existing tags or create new ones" + info="Select existing tags or create new ones", ) - + save_btn = gr.Button("Save Current Session") save_status = gr.Textbox(label="Save Status", value="") - + # Function to update the demo name with a new random name def update_random_name(): return generate_random_demo_name() - + # Connect random name button - random_name_btn.click( - update_random_name, - outputs=[demo_name] - ) - + random_name_btn.click(update_random_name, outputs=[demo_name]) + with gr.Column(scale=1): with gr.Accordion("Memory / Scratchpad", open=False): with gr.Group(): memory_display = gr.Textbox( - label="Current Memory", - value=get_memory(), - lines=5 + label="Current Memory", value=get_memory(), lines=5 ) with gr.Row(): memory_submit_btn = gr.Button("Submit Memory") memory_refine_btn = gr.Button("Refine") memory_status = gr.Textbox(label="Status", value="") - + with gr.Accordion("Tasks", open=True): # Add current task display and controls with gr.Group(): current_task = gr.Textbox( - label="Current Task", - value=TASK_EXAMPLES[0]["task"], - interactive=True + label="Current Task", value=TASK_EXAMPLES[0]["task"], interactive=True ) with gr.Row(): randomize_task_btn = gr.Button("🎲 Randomize Task") run_setup_btn = gr.Button("βš™οΈ Run Task Setup") # Setup status textbox setup_status = gr.Textbox(label="Setup Status", value="") - + with gr.Group(): with gr.Accordion("Computer Configuration", open=False): with gr.Row(): @@ -1093,68 +1193,68 @@ def create_gradio_ui(): choices=["macOS", "Ubuntu", "Windows"], value="macOS", ) - + # Provider selection radio provider_choice = gr.Radio( label="Provider", choices=["lume", "self", "cloud", "winsandbox"], value="lume", - info="'lume' uses a VM, 'self' uses the host computer server, 'cloud' uses a cloud container" + info="'lume' uses a VM, 'self' uses the host computer server, 'cloud' uses a cloud container", ) - + # Container name field for cloud provider (initially hidden) container_name = gr.Textbox( label="Container Name", placeholder="Enter your container name", visible=False, - info="Get your container from [trycua.com](https://trycua.com/)" + info="Get your container from [trycua.com](https://trycua.com/)", ) - + # Check if CUA_API_KEY is set in environment has_cua_key = os.environ.get("CUA_API_KEY") is not None - + # API key field for cloud provider (visible only if no env key and cloud selected) api_key_field = gr.Textbox( label="CUA API Key", placeholder="Enter your CUA API key", type="password", visible=False, - info="Required for cloud provider. Set CUA_API_KEY environment variable to hide this field." + info="Required for cloud provider. Set CUA_API_KEY environment variable to hide this field.", ) - + # App filtering dropdown for app-use experiment app_filter = gr.Dropdown( label="Filter by apps (App-Use)", multiselect=True, allow_custom_value=True, - info="When apps are selected, the computer will focus on those apps using the app-use experiment" + info="When apps are selected, the computer will focus on those apps using the app-use experiment", ) - + # Function to show/hide container name and API key fields based on provider selection def update_cloud_fields_visibility(provider): show_container = provider == "cloud" show_api_key = provider == "cloud" and not has_cua_key return ( gr.update(visible=show_container), - gr.update(visible=show_api_key) + gr.update(visible=show_api_key), ) - + # Connect provider choice to field visibility provider_choice.change( update_cloud_fields_visibility, inputs=provider_choice, - outputs=[container_name, api_key_field] + outputs=[container_name, api_key_field], ) - + start_btn = gr.Button("Initialize Computer") - + with gr.Group(): input_text = gr.Textbox(label="Type Text") with gr.Row(): press_enter_checkbox = gr.Checkbox(label="Press Enter", value=False) submit_text_btn = gr.Button("Submit Text") text_refine_btn = gr.Button("Refine") - + with gr.Group(): hotkey_keys = gr.Dropdown( choices=VALID_KEYS, @@ -1162,112 +1262,102 @@ def create_gradio_ui(): multiselect=True, show_label=False, allow_custom_value=True, - info="Select one or more keys to send as a hotkey" + info="Select one or more keys to send as a hotkey", ) hotkey_btn = gr.Button("Send Hotkey(s)") - + with gr.Accordion("Scrolling", open=False): with gr.Group(): - scroll_clicks = gr.Number(label="Number of Clicks", value=1, minimum=1, step=1) + scroll_clicks = gr.Number( + label="Number of Clicks", value=1, minimum=1, step=1 + ) with gr.Row(): scroll_up_btn = gr.Button("Scroll Up") scroll_down_btn = gr.Button("Scroll Down") - + with gr.Accordion("Reasoning for Last Action", open=False): with gr.Group(): last_action_display = gr.Textbox( - label="Last Action", - value=get_last_action_display(), - interactive=False + label="Last Action", value=get_last_action_display(), interactive=False ) reasoning_text = gr.Textbox( label="What was your thought process behind this action?", placeholder="Enter your reasoning here...", - lines=3 + lines=3, ) erroneous_checkbox = gr.Checkbox( - label="Mark this action as erroneous (sets weight to 0)", - value=False + label="Mark this action as erroneous (sets weight to 0)", value=False ) reasoning_submit_btn = gr.Button("Submit Reasoning") reasoning_refine_btn = gr.Button("Refine") reasoning_status = gr.Textbox(label="Status", value="") - + with gr.Accordion("Conversation Messages", open=False): message_role = gr.Radio( - ["user", "assistant"], - label="Message Role", - value="user" + ["user", "assistant"], label="Message Role", value="user" ) message_text = gr.Textbox( - label="Message Content", - placeholder="Enter message here...", - lines=3 + label="Message Content", placeholder="Enter message here...", lines=3 ) screenshot_after_msg = gr.Checkbox( - label="Receive screenshot after message", - value=False + label="Receive screenshot after message", value=False ) message_submit_btn = gr.Button("Submit Message") message_status = gr.Textbox(label="Status") - + with gr.Accordion("Clipboard Operations", open=False): clipboard_content = gr.Textbox(label="Clipboard Content") get_clipboard_btn = gr.Button("Get Clipboard Content") set_clipboard_text = gr.Textbox(label="Set Clipboard Text") set_clipboard_btn = gr.Button("Set Clipboard") clipboard_status = gr.Textbox(label="Status") - + with gr.Accordion("Run Shell Commands", open=False): command_input = gr.Textbox(label="Command to run", placeholder="ls -la") run_command_btn = gr.Button("Run Command") command_output = gr.Textbox(label="Command Output", lines=5) - + shutdown_btn = gr.Button("Shutdown Computer") # Handle save button save_btn.click( - save_demonstration, - inputs=[action_log, demo_name, demo_tags], - outputs=[save_status] + save_demonstration, inputs=[action_log, demo_name, demo_tags], outputs=[save_status] ) - + # Function to refresh the dataset viewer def refresh_dataset_viewer(): return get_sessions_data() - + # Also update the dataset viewer when saving - save_btn.click( - refresh_dataset_viewer, - outputs=dataset_viewer - ) - + save_btn.click(refresh_dataset_viewer, outputs=dataset_viewer) + # Also update the tags dropdown when saving - save_btn.click( - get_existing_tags, - outputs=[demo_tags, filter_tags] - ) - + save_btn.click(get_existing_tags, outputs=[demo_tags, filter_tags]) + # Handle HuggingFace upload button hf_upload_btn.click( upload_to_huggingface, inputs=[hf_dataset_name, hf_visibility, filter_tags], - outputs=[hf_upload_status] + outputs=[hf_upload_status], ) # Function to randomize task def randomize_task(): task_dict = random.choice(TASK_EXAMPLES) return task_dict["task"] - + # Function to run task setup async def run_task_setup(task_text): global computer - + # Check if computer is initialized if computer is None: - return "Computer not initialized. Please initialize the computer first.", img, action_log - + return ( + "Computer not initialized. Please initialize the computer first.", + img, + action_log, + ) + # Find the task dict that matches the current task text for task_dict in TASK_EXAMPLES: if task_dict["task"] == task_text: @@ -1276,60 +1366,54 @@ def create_gradio_ui(): setup_func = task_dict["setup"] if setup_func: await setup_func(computer) - + # Send initial user message _, _, logs_json, screenshot = await submit_message( - task_text, - "user", - screenshot_after=True + task_text, "user", screenshot_after=True ) - + return f"Setup complete for: {task_text}", screenshot, logs_json except Exception as e: return f"Error during setup: {str(e)}", img, action_log - + return "Task not found in examples", img, action_log - + # Connect the randomize button to the function - randomize_task_btn.click( - randomize_task, - outputs=[current_task] - ) - + randomize_task_btn.click(randomize_task, outputs=[current_task]) + # Connect the setup button run_setup_btn.click( - run_task_setup, - inputs=[current_task], - outputs=[setup_status, img, action_log] + run_task_setup, inputs=[current_task], outputs=[setup_status, img, action_log] ) - + # Event handlers - action_log.change( - get_chatbot_messages, - outputs=[chat_log] - ) - + action_log.change(get_chatbot_messages, outputs=[chat_log]) + img.select(handle_click, inputs=[img, click_type], outputs=[img, action_log]) - start_btn.click(handle_init_computer, inputs=[os_choice, app_filter, provider_choice, container_name, api_key_field], outputs=[img, action_log]) + start_btn.click( + handle_init_computer, + inputs=[os_choice, app_filter, provider_choice, container_name, api_key_field], + outputs=[img, action_log], + ) wait_btn.click(handle_wait, outputs=[img, action_log]) - + # DONE and FAIL buttons just do a placeholder action async def handle_done(): output = await execute("computer", "done", {}) return output["screenshot"], json.dumps(tool_call_logs, indent=2) - + async def handle_fail(): output = await execute("computer", "fail", {}) return output["screenshot"], json.dumps(tool_call_logs, indent=2) - + done_btn.click(handle_done, outputs=[img, action_log]) fail_btn.click(handle_fail, outputs=[img, action_log]) - + # Handle hotkey button async def handle_hotkey(selected_keys): if not selected_keys or len(selected_keys) == 0: return await handle_screenshot(), json.dumps(tool_call_logs, indent=2) - + # When multiple keys are selected, the last one is the main key, the rest are modifiers if len(selected_keys) > 1: key = selected_keys[-1] @@ -1338,19 +1422,19 @@ def create_gradio_ui(): # If only one key is selected, no modifiers key = selected_keys[0] modifiers = [] - + output = await execute("computer", "send_hotkey", {"keys": selected_keys}) return output["screenshot"], json.dumps(tool_call_logs, indent=2) - + hotkey_btn.click(handle_hotkey, inputs=[hotkey_keys], outputs=[img, action_log]) - + # Define async handler for scrolling async def handle_scroll(direction, num_clicks=1): """Scroll the page up or down""" global computer if computer is None: return None, json.dumps(tool_call_logs, indent=2) - + # Convert num_clicks to integer with validation try: num_clicks = int(num_clicks) @@ -1358,34 +1442,35 @@ def create_gradio_ui(): num_clicks = 1 except (ValueError, TypeError): num_clicks = 1 - + # Execute the scroll action action = "scroll_up" if direction == "up" else "scroll_down" result = await execute("computer", action, {"clicks": num_clicks}) - + return result["screenshot"], json.dumps(tool_call_logs, indent=2) - + # Connect scroll buttons scroll_up_btn.click( - handle_scroll, - inputs=[gr.State("up"), scroll_clicks], - outputs=[img, action_log] + handle_scroll, inputs=[gr.State("up"), scroll_clicks], outputs=[img, action_log] ) scroll_down_btn.click( - handle_scroll, - inputs=[gr.State("down"), scroll_clicks], - outputs=[img, action_log] + handle_scroll, inputs=[gr.State("down"), scroll_clicks], outputs=[img, action_log] + ) + + submit_text_btn.click( + handle_type, inputs=[input_text, press_enter_checkbox], outputs=[img, action_log] ) - - submit_text_btn.click(handle_type, inputs=[input_text, press_enter_checkbox], outputs=[img, action_log]) get_clipboard_btn.click(handle_copy, outputs=[clipboard_content, action_log]) - set_clipboard_btn.click(handle_set_clipboard, inputs=set_clipboard_text, outputs=[clipboard_status, action_log]) - run_command_btn.click(handle_run_command, inputs=command_input, outputs=[command_output, action_log]) + set_clipboard_btn.click( + handle_set_clipboard, inputs=set_clipboard_text, outputs=[clipboard_status, action_log] + ) + run_command_btn.click( + handle_run_command, inputs=command_input, outputs=[command_output, action_log] + ) shutdown_btn.click(handle_shutdown, outputs=[clipboard_status, action_log]) clear_log_btn.click(clear_log, outputs=action_log) chat_log.clear(clear_log, outputs=action_log) - # Update last action display after each action img.select(lambda *args: get_last_action_display(), outputs=last_action_display) start_btn.click(lambda: get_last_action_display(), outputs=last_action_display) @@ -1395,31 +1480,33 @@ def create_gradio_ui(): hotkey_btn.click(lambda: get_last_action_display(), outputs=last_action_display) submit_text_btn.click(lambda: get_last_action_display(), outputs=last_action_display) message_submit_btn.click(lambda: get_last_action_display(), outputs=last_action_display) - + # Handle reasoning submission async def handle_reasoning_update(reasoning, is_erroneous): status = await update_reasoning(reasoning, is_erroneous) return status, json.dumps(tool_call_logs, indent=2) - + reasoning_submit_btn.click( handle_reasoning_update, - inputs=[reasoning_text, erroneous_checkbox], - outputs=[reasoning_status, action_log] + inputs=[reasoning_text, erroneous_checkbox], + outputs=[reasoning_status, action_log], ) - + # Helper function for text refinement - used for all refine buttons - async def handle_text_refinement(text_content, content_type="reasoning", task_text="", use_before = False): + async def handle_text_refinement( + text_content, content_type="reasoning", task_text="", use_before=False + ): global last_screenshot, last_action, tool_call_logs, last_screenshot_before - + screenshot = last_screenshot_before if use_before else last_screenshot - + # Check if we have the necessary components if not text_content.strip(): return f"No {content_type} text to refine", text_content - + if screenshot is None: return "No screenshot available for refinement", text_content - + try: # Convert the PIL image to base64 if available screenshot_base64 = None @@ -1427,39 +1514,45 @@ def create_gradio_ui(): with io.BytesIO() as buffer: screenshot.save(buffer, format="PNG") screenshot_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8") - + # Set up the OpenAI client for refinement # Try different API keys from environment in order of preference api_key = os.getenv("OPENAI_API_KEY") or os.getenv("OMNI_OPENAI_API_KEY") - + if not api_key: return "OpenAI API key not found in environment", text_content - + from libs.agent.agent.providers.omni.clients.openai import OpenAIClient - + # Create a client - use gpt-4 if available, fall back to 3.5-turbo model = "gpt-4.1-2025-04-14" - + client = OpenAIClient( api_key=api_key, model=model, max_tokens=1024, temperature=0.2, # Low temperature for more focused refinement ) - + # Get the last 3 messages from the chat history - recent_messages = get_chatbot_messages(tool_call_logs)[-3:] if len(get_chatbot_messages(tool_call_logs)) >= 3 else get_chatbot_messages(tool_call_logs) - + recent_messages = ( + get_chatbot_messages(tool_call_logs)[-3:] + if len(get_chatbot_messages(tool_call_logs)) >= 3 + else get_chatbot_messages(tool_call_logs) + ) + # Format message history with titles when available formatted_messages = [] for msg in recent_messages: - if msg.metadata and 'title' in msg.metadata: - formatted_messages.append(f"{msg.role} ({msg.metadata['title']}): {msg.content}") + if msg.metadata and "title" in msg.metadata: + formatted_messages.append( + f"{msg.role} ({msg.metadata['title']}): {msg.content}" + ) else: formatted_messages.append(f"{msg.role}: {msg.content}") - + formatted_messages = [f"{msg}" for msg in formatted_messages] - + # Create different prompts based on content type if content_type == "reasoning": message_prompt = f"""You are helping refine an explanation about why a specific computer UI action is about to be taken. @@ -1482,7 +1575,7 @@ Make this into a concise reasoning / self-reflection trace, using "I should/need Provide ONLY the refined explanation text, with no additional commentary or markdown.""" - + elif content_type == "memory": message_prompt = f"""You are helping refine memory/scratchpad content for an AI assistant. @@ -1503,7 +1596,7 @@ Refine this memory content to be more clear, organized, and useful for the assis - Make the format more readable with bullet points or other organizational elements if helpful Provide ONLY the refined memory text, with no additional commentary or markdown.""" - + elif content_type == "text": message_prompt = f"""You are helping refine text that will be typed into a computer interface. @@ -1524,7 +1617,7 @@ Refine this text to be more effective for the current context: - Optimize the text for the intended use Provide ONLY the refined text, with no additional commentary or markdown.""" - + else: message_prompt = f"""You are helping refine text content. @@ -1539,50 +1632,48 @@ RECENT MESSAGES: Improve this text to be more clear, concise, and effective. Provide ONLY the refined text, with no additional commentary or markdown.""" - + # Create messages with the screenshot messages = [] - + # Add message with image if available if screenshot_base64: - messages.append({ - "role": "user", - "content": [ - { - "type": "text", - "text": message_prompt - }, - { - "type": "image_url", - "image_url": {"url": f"data:image/png;base64,{screenshot_base64}"} - } - ] - }) + messages.append( + { + "role": "user", + "content": [ + {"type": "text", "text": message_prompt}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/png;base64,{screenshot_base64}" + }, + }, + ], + } + ) else: # Fallback if screenshot isn't available - messages.append({ - "role": "user", - "content": message_prompt - }) - + messages.append({"role": "user", "content": message_prompt}) + print(message_prompt) - + # Make the API call response = await client.run_interleaved( messages=messages, system="You are a helpful AI assistant that improves and refines text.", ) - + # Extract the refined text from the response if "choices" in response and len(response["choices"]) > 0: refined_text = response["choices"][0]["message"]["content"] return f"{content_type.capitalize()} refined successfully", refined_text else: return "Error: Unexpected API response format", text_content - + except Exception as e: return f"Error refining {content_type}: {str(e)}", text_content - + # Define async wrapper functions for each refine button async def handle_reasoning_refinement(reasoning, task): return await handle_text_refinement(reasoning, "reasoning", task, use_before=True) @@ -1597,54 +1688,55 @@ Provide ONLY the refined text, with no additional commentary or markdown.""" reasoning_refine_btn.click( handle_reasoning_refinement, inputs=[reasoning_text, current_task], - outputs=[reasoning_status, reasoning_text] + outputs=[reasoning_status, reasoning_text], ) - + # Connect memory refine button memory_refine_btn.click( handle_memory_refinement, inputs=[memory_display, current_task], - outputs=[memory_status, memory_display] + outputs=[memory_status, memory_display], ) - + # Status element for type text section with gr.Group(): type_text_status = gr.Textbox(label="Text Status", value="", visible=False) - + # Connect text refine button text_refine_btn.click( handle_text_input_refinement, inputs=[input_text, current_task], - outputs=[type_text_status, input_text] + outputs=[type_text_status, input_text], ) - + # Handle memory submission async def handle_memory_update(memory_text): status = await handle_memory(memory_text) return status, json.dumps(tool_call_logs, indent=2) - + memory_submit_btn.click( - handle_memory_update, - inputs=memory_display, - outputs=[memory_status, action_log] + handle_memory_update, inputs=memory_display, outputs=[memory_status, action_log] ) - + # Handle message submission async def handle_message_submit(message_content, role, screenshot_after): - status, chat_messages, logs_json, screenshot = await submit_message(message_content, role, screenshot_after) + status, chat_messages, logs_json, screenshot = await submit_message( + message_content, role, screenshot_after + ) if screenshot: return status, chat_messages, logs_json, screenshot else: return status, chat_messages, logs_json, last_screenshot - + message_submit_btn.click( handle_message_submit, - inputs=[message_text, message_role, screenshot_after_msg], - outputs=[message_status, chat_log, action_log, img] + inputs=[message_text, message_role, screenshot_after_msg], + outputs=[message_status, chat_log, action_log, img], ) return app + # Launch the app if __name__ == "__main__": app = create_gradio_ui() diff --git a/libs/python/computer/computer/utils.py b/libs/python/computer/computer/utils.py index 070f8ebc..c2f04c48 100644 --- a/libs/python/computer/computer/utils.py +++ b/libs/python/computer/computer/utils.py @@ -1,40 +1,46 @@ import base64 -from typing import Tuple, Optional, Dict, Any -from PIL import Image, ImageDraw import io +from typing import Any, Dict, Optional, Tuple + +from PIL import Image, ImageDraw + def decode_base64_image(base64_str: str) -> bytes: """Decode a base64 string into image bytes.""" return base64.b64decode(base64_str) + def encode_base64_image(image_bytes: bytes) -> str: """Encode image bytes to base64 string.""" - return base64.b64encode(image_bytes).decode('utf-8') + return base64.b64encode(image_bytes).decode("utf-8") + def bytes_to_image(image_bytes: bytes) -> Image.Image: """Convert bytes to PIL Image. - + Args: image_bytes: Raw image bytes - + Returns: PIL.Image: The converted image """ return Image.open(io.BytesIO(image_bytes)) -def image_to_bytes(image: Image.Image, format: str = 'PNG') -> bytes: + +def image_to_bytes(image: Image.Image, format: str = "PNG") -> bytes: """Convert PIL Image to bytes.""" buf = io.BytesIO() image.save(buf, format=format) return buf.getvalue() + def resize_image(image_bytes: bytes, scale_factor: float) -> bytes: """Resize an image by a scale factor. - + Args: image_bytes: The original image as bytes scale_factor: Factor to scale the image by (e.g., 0.5 for half size, 2.0 for double) - + Returns: bytes: The resized image as bytes """ @@ -44,6 +50,7 @@ def resize_image(image_bytes: bytes, scale_factor: float) -> bytes: image = image.resize(new_size, Image.Resampling.LANCZOS) return image_to_bytes(image) + def draw_box( image_bytes: bytes, x: int, @@ -51,10 +58,10 @@ def draw_box( width: int, height: int, color: str = "#FF0000", - thickness: int = 2 + thickness: int = 2, ) -> bytes: """Draw a box on an image. - + Args: image_bytes: The original image as bytes x: X coordinate of top-left corner @@ -63,39 +70,37 @@ def draw_box( height: Height of the box color: Color of the box in hex format thickness: Thickness of the box border in pixels - + Returns: bytes: The modified image as bytes """ # Convert bytes to PIL Image image = bytes_to_image(image_bytes) - + # Create drawing context draw = ImageDraw.Draw(image) - + # Draw rectangle - draw.rectangle( - [(x, y), (x + width, y + height)], - outline=color, - width=thickness - ) - + draw.rectangle([(x, y), (x + width, y + height)], outline=color, width=thickness) + # Convert back to bytes return image_to_bytes(image) + def get_image_size(image_bytes: bytes) -> Tuple[int, int]: """Get the dimensions of an image. - + Args: image_bytes: The image as bytes - + Returns: Tuple[int, int]: Width and height of the image """ image = bytes_to_image(image_bytes) return image.size + def parse_vm_info(vm_info: Dict[str, Any]) -> Optional[Dict[str, Any]]: """Parse VM info from pylume response.""" if not vm_info: - return None \ No newline at end of file + return None diff --git a/libs/python/core/README.md b/libs/python/core/README.md index 6c743a8b..95d3fd2b 100644 --- a/libs/python/core/README.md +++ b/libs/python/core/README.md @@ -8,10 +8,11 @@ - [![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) - [![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) - [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) - [![PyPI](https://img.shields.io/pypi/v/cua-core?color=333333)](https://pypi.org/project/cua-core/) +[![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) +[![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) +[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) +[![PyPI](https://img.shields.io/pypi/v/cua-core?color=333333)](https://pypi.org/project/cua-core/) + @@ -25,4 +26,4 @@ ```bash pip install cua-core -``` \ No newline at end of file +``` diff --git a/libs/python/core/core/telemetry/__init__.py b/libs/python/core/core/telemetry/__init__.py index b5846715..4c84ace2 100644 --- a/libs/python/core/core/telemetry/__init__.py +++ b/libs/python/core/core/telemetry/__init__.py @@ -4,12 +4,11 @@ It provides a low-overhead way to collect anonymous usage data. """ from core.telemetry.posthog import ( - record_event, - is_telemetry_enabled, destroy_telemetry_client, + is_telemetry_enabled, + record_event, ) - __all__ = [ "record_event", "is_telemetry_enabled", diff --git a/libs/python/core/core/telemetry/posthog.py b/libs/python/core/core/telemetry/posthog.py index a6c361e5..5edd7343 100644 --- a/libs/python/core/core/telemetry/posthog.py +++ b/libs/python/core/core/telemetry/posthog.py @@ -4,8 +4,8 @@ from __future__ import annotations import logging import os -import uuid import sys +import uuid from pathlib import Path from typing import Any, Dict, List, Optional @@ -20,6 +20,7 @@ logger = logging.getLogger("core.telemetry") PUBLIC_POSTHOG_API_KEY = "phc_eSkLnbLxsnYFaXksif1ksbrNzYlJShr35miFLDppF14" PUBLIC_POSTHOG_HOST = "https://eu.i.posthog.com" + class PostHogTelemetryClient: """Collects and reports telemetry data via PostHog.""" @@ -47,7 +48,8 @@ class PostHogTelemetryClient: # Legacy opt-out flag os.environ.get("CUA_TELEMETRY", "").lower() != "off" # Opt-in flag (defaults to enabled) - and os.environ.get("CUA_TELEMETRY_ENABLED", "true").lower() in { "1", "true", "yes", "on" } + and os.environ.get("CUA_TELEMETRY_ENABLED", "true").lower() + in {"1", "true", "yes", "on"} ) def _get_or_create_installation_id(self) -> str: @@ -150,14 +152,12 @@ class PostHogTelemetryClient: logger.debug( f"Setting up PostHog user properties for: {self.installation_id} with properties: {properties}" ) - + # In the Python SDK, we capture an identification event instead of calling identify() posthog.capture( - distinct_id=self.installation_id, - event="$identify", - properties={"$set": properties} + distinct_id=self.installation_id, event="$identify", properties={"$set": properties} ) - + logger.info(f"Set up PostHog user properties for installation: {self.installation_id}") except Exception as e: logger.warning(f"Failed to set up PostHog user properties: {e}") @@ -224,13 +224,16 @@ class PostHogTelemetryClient: """Destroy the global PostHogTelemetryClient instance.""" cls._singleton = None + def destroy_telemetry_client() -> None: """Destroy the global PostHogTelemetryClient instance (class-managed).""" PostHogTelemetryClient.destroy_client() + def is_telemetry_enabled() -> bool: return PostHogTelemetryClient.is_telemetry_enabled() + def record_event(event_name: str, properties: Optional[Dict[str, Any]] | None = None) -> None: """Record an arbitrary PostHog event.""" - PostHogTelemetryClient.get_client().record_event(event_name, properties or {}) \ No newline at end of file + PostHogTelemetryClient.get_client().record_event(event_name, properties or {}) diff --git a/libs/python/mcp-server/CONCURRENT_SESSIONS.md b/libs/python/mcp-server/CONCURRENT_SESSIONS.md index 3a7028cb..62e63dd2 100644 --- a/libs/python/mcp-server/CONCURRENT_SESSIONS.md +++ b/libs/python/mcp-server/CONCURRENT_SESSIONS.md @@ -143,7 +143,7 @@ await cleanup_session(ctx, "session-to-cleanup") class SessionManager: def __init__(self, max_concurrent_sessions: int = 10): # Configurable maximum concurrent sessions - + class ComputerPool: def __init__(self, max_size: int = 5, idle_timeout: float = 300.0): # Configurable pool size and idle timeout @@ -152,6 +152,7 @@ class ComputerPool: ## Performance Improvements ### Before (Issues): + - ❌ Single global computer instance - ❌ Client interference and resource conflicts - ❌ Sequential task processing only @@ -159,6 +160,7 @@ class ComputerPool: - ❌ 30s timeout issues with long-running tasks ### After (Benefits): + - βœ… Per-session computer instances with proper isolation - βœ… Computer instance pooling for efficient resource usage - βœ… Concurrent task execution support diff --git a/libs/python/mcp-server/README.md b/libs/python/mcp-server/README.md index 0ed79435..7eddf4b7 100644 --- a/libs/python/mcp-server/README.md +++ b/libs/python/mcp-server/README.md @@ -8,10 +8,11 @@ - [![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) - [![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) - [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) - [![PyPI](https://img.shields.io/pypi/v/cua-computer?color=333333)](https://pypi.org/project/cua-computer/) +[![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) +[![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) +[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) +[![PyPI](https://img.shields.io/pypi/v/cua-computer?color=333333)](https://pypi.org/project/cua-computer/) + @@ -41,7 +42,8 @@ Add this to your MCP client configuration: "cua-agent": { "command": "/usr/bin/env", "args": [ - "bash", "-lc", + "bash", + "-lc", "export CUA_MODEL_NAME='anthropic/claude-3-5-sonnet-20241022'; ~/.cua/start_mcp_server.sh" ] } @@ -59,7 +61,8 @@ Use an absolute path to the repository root in the arguments below. "cua-agent": { "command": "/usr/bin/env", "args": [ - "bash", "-lc", + "bash", + "-lc", "export CUA_MODEL_NAME='huggingface-local/ByteDance-Seed/UI-TARS-1.5-7B'; /Users/your-username/Documents/GitHub/cua/libs/python/mcp-server/scripts/start_mcp_server.sh" ] } @@ -68,6 +71,7 @@ Use an absolute path to the repository root in the arguments below. ``` Notes: + - Replace `/Users/your-username/Documents/GitHub/cua` with the absolute path to your clone. - The script sets `PYTHONPATH` for local libs and runs the server module. @@ -94,6 +98,7 @@ After configuring your MCP client, restart it and invoke one of these tools: ``` Expected results: + - Assistant messages streamed during execution - A final screenshot image @@ -109,6 +114,7 @@ Expected results: ## Troubleshooting Server reports disconnected in MCP client: + - Use an absolute path in the `args` command. - Launch via `/usr/bin/env bash -lc` so the shell initializes and expands paths. - Run the script manually to verify: @@ -117,12 +123,14 @@ Server reports disconnected in MCP client: ``` pip not found in venv: + ```bash python3 -m ensurepip --upgrade python3 -m pip install -U pip setuptools wheel ``` Pydantic schema error related to Image: + ```bash python3 -m pip install -U "mcp>=1.2.0" "fastmcp>=0.4.7" "pydantic>=2.7,<2.12" ``` diff --git a/libs/python/mcp-server/mcp_server/__init__.py b/libs/python/mcp-server/mcp_server/__init__.py index a0a7407a..f4b66e43 100644 --- a/libs/python/mcp-server/mcp_server/__init__.py +++ b/libs/python/mcp-server/mcp_server/__init__.py @@ -1,7 +1,7 @@ """MCP Server for Computer-Use Agent (CUA).""" -import sys import os +import sys # Add detailed debugging at import time with open("/tmp/mcp_server_debug.log", "w") as f: @@ -9,11 +9,11 @@ with open("/tmp/mcp_server_debug.log", "w") as f: f.write(f"Python version: {sys.version}\n") f.write(f"Working directory: {os.getcwd()}\n") f.write(f"Python path:\n{chr(10).join(sys.path)}\n") - f.write(f"Environment variables:\n") + f.write("Environment variables:\n") for key, value in os.environ.items(): f.write(f"{key}={value}\n") -from .server import server, main +from .server import main, server __version__ = "0.1.0" __all__ = ["server", "main"] diff --git a/libs/python/mcp-server/mcp_server/server.py b/libs/python/mcp-server/mcp_server/server.py index 67d2cbf2..7d47cfd1 100644 --- a/libs/python/mcp-server/mcp_server/server.py +++ b/libs/python/mcp-server/mcp_server/server.py @@ -7,7 +7,7 @@ import signal import sys import traceback import uuid -from typing import Any, Dict, List, Optional, Union, Tuple +from typing import Any, Dict, List, Optional, Tuple, Union import anyio @@ -24,6 +24,7 @@ logger.debug("MCP Server module loading...") try: from mcp.server.fastmcp import Context, FastMCP + # Use the canonical Image type from mcp.server.fastmcp.utilities.types import Image @@ -34,8 +35,8 @@ except ImportError as e: sys.exit(1) try: - from computer import Computer from agent import ComputerAgent + from computer import Computer logger.debug("Successfully imported Computer and Agent modules") except ImportError as e: @@ -44,17 +45,24 @@ except ImportError as e: sys.exit(1) try: - from .session_manager import get_session_manager, initialize_session_manager, shutdown_session_manager + from .session_manager import ( + get_session_manager, + initialize_session_manager, + shutdown_session_manager, + ) + logger.debug("Successfully imported session manager") except ImportError as e: logger.error(f"Failed to import session manager: {e}") traceback.print_exc(file=sys.stderr) sys.exit(1) + def get_env_bool(key: str, default: bool = False) -> bool: """Get boolean value from environment variable.""" return os.getenv(key, str(default)).lower() in ("true", "1", "yes") + async def _maybe_call_ctx_method(ctx: Context, method_name: str, *args, **kwargs) -> None: """Call a context helper if it exists, awaiting the result when necessary.""" method = getattr(ctx, method_name, None) @@ -64,6 +72,7 @@ async def _maybe_call_ctx_method(ctx: Context, method_name: str, *args, **kwargs if inspect.isawaitable(result): await result + def _normalise_message_content(content: Union[str, List[Dict[str, Any]]]) -> List[Dict[str, Any]]: """Normalise message content to a list of structured parts.""" if isinstance(content, list): @@ -72,6 +81,7 @@ def _normalise_message_content(content: Union[str, List[Dict[str, Any]]]) -> Lis return [] return [{"type": "output_text", "text": str(content)}] + def _extract_text_from_content(content: Union[str, List[Dict[str, Any]]]) -> str: """Extract textual content for inclusion in the aggregated result string.""" if isinstance(content, str): @@ -84,6 +94,7 @@ def _extract_text_from_content(content: Union[str, List[Dict[str, Any]]]) -> str texts.append(str(part["text"])) return "\n".join(texts) + def _serialise_tool_content(content: Any) -> str: """Convert tool outputs into a string for aggregation.""" if isinstance(content, str): @@ -91,7 +102,11 @@ def _serialise_tool_content(content: Any) -> str: if isinstance(content, list): texts: List[str] = [] for part in content: - if isinstance(part, dict) and part.get("type") in {"output_text", "text"} and part.get("text"): + if ( + isinstance(part, dict) + and part.get("type") in {"output_text", "text"} + and part.get("text") + ): texts.append(str(part["text"])) if texts: return "\n".join(texts) @@ -99,6 +114,7 @@ def _serialise_tool_content(content: Any) -> str: return "" return str(content) + def serve() -> FastMCP: """Create and configure the MCP server.""" # NOTE: Do not pass model_config here; FastMCP 2.12.x doesn't support it. @@ -108,12 +124,12 @@ def serve() -> FastMCP: async def screenshot_cua(ctx: Context, session_id: Optional[str] = None) -> Any: """ Take a screenshot of the current MacOS VM screen and return the image. - + Args: session_id: Optional session ID for multi-client support. If not provided, a new session will be created. """ session_manager = get_session_manager() - + async with session_manager.get_session(session_id) as session: screenshot = await session.computer.interface.screenshot() # Returning Image object is fine when structured_output=False @@ -123,21 +139,21 @@ def serve() -> FastMCP: async def run_cua_task(ctx: Context, task: str, session_id: Optional[str] = None) -> Any: """ Run a Computer-Use Agent (CUA) task in a MacOS VM and return (combined text, final screenshot). - + Args: task: The task description for the agent to execute session_id: Optional session ID for multi-client support. If not provided, a new session will be created. """ session_manager = get_session_manager() task_id = str(uuid.uuid4()) - + try: logger.info(f"Starting CUA task: {task} (task_id: {task_id})") async with session_manager.get_session(session_id) as session: # Register this task with the session await session_manager.register_task(session.session_id, task_id) - + try: # Get model name model_name = os.getenv("CUA_MODEL_NAME", "anthropic/claude-3-5-sonnet-20241022") @@ -179,8 +195,14 @@ def serve() -> FastMCP: elif output_type in {"tool_use", "computer_call", "function_call"}: logger.debug("Streaming tool call: %s", output) call_id = output.get("id") or output.get("call_id") - tool_name = output.get("name") or output.get("action", {}).get("type") - tool_input = output.get("input") or output.get("arguments") or output.get("action") + tool_name = output.get("name") or output.get("action", {}).get( + "type" + ) + tool_input = ( + output.get("input") + or output.get("arguments") + or output.get("action") + ) if call_id: await _maybe_call_ctx_method( ctx, @@ -190,7 +212,11 @@ def serve() -> FastMCP: input=tool_input, ) - elif output_type in {"tool_result", "computer_call_output", "function_call_output"}: + elif output_type in { + "tool_result", + "computer_call_output", + "function_call_output", + }: logger.debug("Streaming tool output: %s", output) call_id = output.get("call_id") or output.get("id") content = output.get("content") or output.get("output") @@ -203,7 +229,8 @@ def serve() -> FastMCP: "yield_tool_output", call_id=call_id, output=content, - is_error=output.get("status") == "failed" or output.get("is_error", False), + is_error=output.get("status") == "failed" + or output.get("is_error", False), ) logger.info("CUA task completed successfully") @@ -215,10 +242,11 @@ def serve() -> FastMCP: ) return ( - "\n".join(aggregated_messages).strip() or "Task completed with no text output.", + "\n".join(aggregated_messages).strip() + or "Task completed with no text output.", screenshot_image, ) - + finally: # Unregister the task from the session await session_manager.unregister_task(session.session_id, task_id) @@ -227,7 +255,7 @@ def serve() -> FastMCP: error_msg = f"Error running CUA task: {str(e)}\n{traceback.format_exc()}" logger.error(error_msg) ctx.error(error_msg) - + # Try to get a screenshot from the session if available try: if session_id: @@ -239,7 +267,7 @@ def serve() -> FastMCP: ) except Exception: pass - + # If we can't get a screenshot, return a placeholder return ( f"Error during task execution: {str(e)}", @@ -247,10 +275,12 @@ def serve() -> FastMCP: ) @server.tool(structured_output=False) - async def run_multi_cua_tasks(ctx: Context, tasks: List[str], session_id: Optional[str] = None, concurrent: bool = False) -> Any: + async def run_multi_cua_tasks( + ctx: Context, tasks: List[str], session_id: Optional[str] = None, concurrent: bool = False + ) -> Any: """ Run multiple CUA tasks and return a list of (combined text, screenshot). - + Args: tasks: List of task descriptions to execute session_id: Optional session ID for multi-client support. If not provided, a new session will be created. @@ -262,25 +292,27 @@ def serve() -> FastMCP: return [] session_manager = get_session_manager() - + if concurrent and total_tasks > 1: # Run tasks concurrently logger.info(f"Running {total_tasks} tasks concurrently") ctx.info(f"Running {total_tasks} tasks concurrently") - + # Create tasks with progress tracking - async def run_task_with_progress(task_index: int, task: str) -> Tuple[int, Tuple[str, Image]]: + async def run_task_with_progress( + task_index: int, task: str + ) -> Tuple[int, Tuple[str, Image]]: ctx.report_progress(task_index / total_tasks) result = await run_cua_task(ctx, task, session_id) ctx.report_progress((task_index + 1) / total_tasks) return task_index, result - + # Create all task coroutines task_coroutines = [run_task_with_progress(i, task) for i, task in enumerate(tasks)] - + # Wait for all tasks to complete results_with_indices = await asyncio.gather(*task_coroutines, return_exceptions=True) - + # Sort results by original task order and handle exceptions results: List[Tuple[str, Image]] = [] for result in results_with_indices: @@ -291,13 +323,13 @@ def serve() -> FastMCP: else: _, task_result = result results.append(task_result) - + return results else: # Run tasks sequentially (original behavior) logger.info(f"Running {total_tasks} tasks sequentially") ctx.info(f"Running {total_tasks} tasks sequentially") - + results: List[Tuple[str, Image]] = [] for i, task in enumerate(tasks): logger.info(f"Running task {i+1}/{total_tasks}: {task}") @@ -322,7 +354,7 @@ def serve() -> FastMCP: async def cleanup_session(ctx: Context, session_id: str) -> str: """ Cleanup a specific session and release its resources. - + Args: session_id: The session ID to cleanup """ @@ -335,30 +367,31 @@ def serve() -> FastMCP: server = serve() + async def run_server(): """Run the MCP server with proper lifecycle management.""" session_manager = None try: logger.debug("Starting MCP server...") - + # Initialize session manager session_manager = await initialize_session_manager() logger.info("Session manager initialized") - + # Set up signal handlers for graceful shutdown def signal_handler(signum, frame): logger.info(f"Received signal {signum}, initiating graceful shutdown...") # Create a task to shutdown gracefully asyncio.create_task(graceful_shutdown()) - + signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - + # Start the server logger.info("Starting FastMCP server...") # Use run_stdio_async directly instead of server.run() to avoid nested event loops await server.run_stdio_async() - + except Exception as e: logger.error(f"Error starting server: {e}") traceback.print_exc(file=sys.stderr) @@ -369,6 +402,7 @@ async def run_server(): logger.info("Shutting down session manager...") await shutdown_session_manager() + async def graceful_shutdown(): """Gracefully shutdown the server and all sessions.""" logger.info("Initiating graceful shutdown...") @@ -380,8 +414,10 @@ async def graceful_shutdown(): finally: # Exit the process import os + os._exit(0) + def main(): """Run the MCP server with proper async lifecycle management.""" try: @@ -394,5 +430,6 @@ def main(): traceback.print_exc(file=sys.stderr) sys.exit(1) + if __name__ == "__main__": main() diff --git a/libs/python/mcp-server/mcp_server/session_manager.py b/libs/python/mcp-server/mcp_server/session_manager.py index 2691e6e5..dc8d480b 100644 --- a/libs/python/mcp-server/mcp_server/session_manager.py +++ b/libs/python/mcp-server/mcp_server/session_manager.py @@ -12,16 +12,18 @@ import asyncio import logging import time import uuid -from typing import Dict, Optional, Any, List, Set -from dataclasses import dataclass, field -from contextlib import asynccontextmanager import weakref +from contextlib import asynccontextmanager +from dataclasses import dataclass, field +from typing import Any, Dict, List, Optional, Set logger = logging.getLogger("mcp-server.session_manager") + @dataclass class SessionInfo: """Information about an active session.""" + session_id: str computer: Any # Computer instance created_at: float @@ -29,92 +31,95 @@ class SessionInfo: active_tasks: Set[str] = field(default_factory=set) is_shutting_down: bool = False + class ComputerPool: """Pool of computer instances for efficient resource management.""" - + def __init__(self, max_size: int = 5, idle_timeout: float = 300.0): self.max_size = max_size self.idle_timeout = idle_timeout self._available: List[Any] = [] self._in_use: Set[Any] = set() self._creation_lock = asyncio.Lock() - + async def acquire(self) -> Any: """Acquire a computer instance from the pool.""" # Try to get an available instance if self._available: computer = self._available.pop() self._in_use.add(computer) - logger.debug(f"Reusing computer instance from pool") + logger.debug("Reusing computer instance from pool") return computer - + # Check if we can create a new one async with self._creation_lock: if len(self._in_use) < self.max_size: logger.debug("Creating new computer instance") from computer import Computer + computer = Computer(verbosity=logging.INFO) await computer.run() self._in_use.add(computer) return computer - + # Wait for an instance to become available logger.debug("Waiting for computer instance to become available") while not self._available: await asyncio.sleep(0.1) - + computer = self._available.pop() self._in_use.add(computer) return computer - + async def release(self, computer: Any) -> None: """Release a computer instance back to the pool.""" if computer in self._in_use: self._in_use.remove(computer) self._available.append(computer) logger.debug("Released computer instance back to pool") - + async def cleanup_idle(self) -> None: """Clean up idle computer instances.""" current_time = time.time() idle_instances = [] - + for computer in self._available[:]: # Check if computer has been idle too long # Note: We'd need to track last use time per instance for this # For now, we'll keep instances in the pool pass - + async def shutdown(self) -> None: """Shutdown all computer instances in the pool.""" logger.info("Shutting down computer pool") - + # Close all available instances for computer in self._available: try: - if hasattr(computer, 'close'): + if hasattr(computer, "close"): await computer.close() - elif hasattr(computer, 'stop'): + elif hasattr(computer, "stop"): await computer.stop() except Exception as e: logger.warning(f"Error closing computer instance: {e}") - + # Close all in-use instances for computer in self._in_use: try: - if hasattr(computer, 'close'): + if hasattr(computer, "close"): await computer.close() - elif hasattr(computer, 'stop'): + elif hasattr(computer, "stop"): await computer.stop() except Exception as e: logger.warning(f"Error closing computer instance: {e}") - + self._available.clear() self._in_use.clear() + class SessionManager: """Manages concurrent client sessions with proper resource isolation.""" - + def __init__(self, max_concurrent_sessions: int = 10): self.max_concurrent_sessions = max_concurrent_sessions self._sessions: Dict[str, SessionInfo] = {} @@ -122,39 +127,39 @@ class SessionManager: self._session_lock = asyncio.Lock() self._cleanup_task: Optional[asyncio.Task] = None self._shutdown_event = asyncio.Event() - + async def start(self) -> None: """Start the session manager and cleanup task.""" logger.info("Starting session manager") self._cleanup_task = asyncio.create_task(self._cleanup_loop()) - + async def stop(self) -> None: """Stop the session manager and cleanup all resources.""" logger.info("Stopping session manager") self._shutdown_event.set() - + if self._cleanup_task: self._cleanup_task.cancel() try: await self._cleanup_task except asyncio.CancelledError: pass - + # Force cleanup all sessions async with self._session_lock: session_ids = list(self._sessions.keys()) - + for session_id in session_ids: await self._force_cleanup_session(session_id) - + await self._computer_pool.shutdown() - + @asynccontextmanager async def get_session(self, session_id: Optional[str] = None) -> Any: """Get or create a session with proper resource management.""" if session_id is None: session_id = str(uuid.uuid4()) - + # Check if session exists and is not shutting down async with self._session_lock: if session_id in self._sessions: @@ -166,18 +171,20 @@ class SessionManager: else: # Create new session if len(self._sessions) >= self.max_concurrent_sessions: - raise RuntimeError(f"Maximum concurrent sessions ({self.max_concurrent_sessions}) reached") - + raise RuntimeError( + f"Maximum concurrent sessions ({self.max_concurrent_sessions}) reached" + ) + computer = await self._computer_pool.acquire() session = SessionInfo( session_id=session_id, computer=computer, created_at=time.time(), - last_activity=time.time() + last_activity=time.time(), ) self._sessions[session_id] = session logger.info(f"Created new session: {session_id}") - + try: yield session finally: @@ -185,81 +192,82 @@ class SessionManager: async with self._session_lock: if session_id in self._sessions: self._sessions[session_id].last_activity = time.time() - + async def register_task(self, session_id: str, task_id: str) -> None: """Register a task for a session.""" async with self._session_lock: if session_id in self._sessions: self._sessions[session_id].active_tasks.add(task_id) logger.debug(f"Registered task {task_id} for session {session_id}") - + async def unregister_task(self, session_id: str, task_id: str) -> None: """Unregister a task from a session.""" async with self._session_lock: if session_id in self._sessions: self._sessions[session_id].active_tasks.discard(task_id) logger.debug(f"Unregistered task {task_id} from session {session_id}") - + async def cleanup_session(self, session_id: str) -> None: """Cleanup a specific session.""" async with self._session_lock: if session_id not in self._sessions: return - + session = self._sessions[session_id] - + # Check if session has active tasks if session.active_tasks: logger.info(f"Session {session_id} has active tasks, marking for shutdown") session.is_shutting_down = True return - + # Actually cleanup the session await self._force_cleanup_session(session_id) - + async def _force_cleanup_session(self, session_id: str) -> None: """Force cleanup a session regardless of active tasks.""" async with self._session_lock: if session_id not in self._sessions: return - + session = self._sessions[session_id] logger.info(f"Cleaning up session: {session_id}") - + # Release computer back to pool await self._computer_pool.release(session.computer) - + # Remove session del self._sessions[session_id] - + async def _cleanup_loop(self) -> None: """Background task to cleanup idle sessions.""" while not self._shutdown_event.is_set(): try: await asyncio.sleep(60) # Run cleanup every minute - + current_time = time.time() idle_timeout = 600.0 # 10 minutes - + async with self._session_lock: idle_sessions = [] for session_id, session in self._sessions.items(): if not session.is_shutting_down and not session.active_tasks: if current_time - session.last_activity > idle_timeout: idle_sessions.append(session_id) - + # Cleanup idle sessions for session_id in idle_sessions: await self._force_cleanup_session(session_id) logger.info(f"Cleaned up idle session: {session_id}") - + except asyncio.CancelledError: break except Exception as e: logger.error(f"Error in cleanup loop: {e}") - + def get_session_stats(self) -> Dict[str, Any]: """Get statistics about active sessions.""" + async def _get_stats(): async with self._session_lock: return { @@ -270,12 +278,12 @@ class SessionManager: "created_at": session.created_at, "last_activity": session.last_activity, "active_tasks": len(session.active_tasks), - "is_shutting_down": session.is_shutting_down + "is_shutting_down": session.is_shutting_down, } for session_id, session in self._sessions.items() - } + }, } - + # Run in current event loop or create new one try: loop = asyncio.get_running_loop() @@ -284,9 +292,11 @@ class SessionManager: # No event loop running, create a new one return asyncio.run(_get_stats()) + # Global session manager instance _session_manager: Optional[SessionManager] = None + def get_session_manager() -> SessionManager: """Get the global session manager instance.""" global _session_manager @@ -294,6 +304,7 @@ def get_session_manager() -> SessionManager: _session_manager = SessionManager() return _session_manager + async def initialize_session_manager() -> None: """Initialize the global session manager.""" global _session_manager @@ -302,6 +313,7 @@ async def initialize_session_manager() -> None: await _session_manager.start() return _session_manager + async def shutdown_session_manager() -> None: """Shutdown the global session manager.""" global _session_manager diff --git a/libs/python/pylume/README.md b/libs/python/pylume/README.md index 4502c943..459d1ce5 100644 --- a/libs/python/pylume/README.md +++ b/libs/python/pylume/README.md @@ -8,14 +8,14 @@ - [![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) - [![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) - [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) - [![PyPI](https://img.shields.io/pypi/v/pylume?color=333333)](https://pypi.org/project/pylume/) +[![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) +[![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) +[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) +[![PyPI](https://img.shields.io/pypi/v/pylume?color=333333)](https://pypi.org/project/pylume/) + - **pylume** is a lightweight Python library based on [lume](https://github.com/trycua/lume) to create, run and manage macOS and Linux virtual machines (VMs) natively on Apple Silicon. ```bash @@ -28,7 +28,7 @@ Please refer to this [Notebook](./samples/nb.ipynb) for a quickstart. More detai ## Prebuilt Images -Pre-built images are available on [ghcr.io/trycua](https://github.com/orgs/trycua/packages). +Pre-built images are available on [ghcr.io/trycua](https://github.com/orgs/trycua/packages). These images come pre-configured with an SSH server and auto-login enabled. ## Contributing diff --git a/libs/python/pylume/__init__.py b/libs/python/pylume/__init__.py index 65cacee1..128ce121 100644 --- a/libs/python/pylume/__init__.py +++ b/libs/python/pylume/__init__.py @@ -2,8 +2,8 @@ PyLume Python SDK - A client library for managing macOS VMs with PyLume. """ -from pylume.pylume import * -from pylume.models import * from pylume.exceptions import * +from pylume.models import * +from pylume.pylume import * __version__ = "0.1.0" diff --git a/libs/python/pylume/pylume/client.py b/libs/python/pylume/pylume/client.py index 607ddd0a..101d5ee8 100644 --- a/libs/python/pylume/pylume/client.py +++ b/libs/python/pylume/pylume/client.py @@ -1,18 +1,19 @@ -import json import asyncio -import subprocess -from typing import Optional, Any, Dict +import json import shlex +import subprocess +from typing import Any, Dict, Optional from .exceptions import ( - LumeError, - LumeServerError, - LumeConnectionError, - LumeTimeoutError, - LumeNotFoundError, LumeConfigError, + LumeConnectionError, + LumeError, + LumeNotFoundError, + LumeServerError, + LumeTimeoutError, ) + class LumeClient: def __init__(self, base_url: str, timeout: float = 60.0, debug: bool = False): self.base_url = base_url @@ -26,7 +27,13 @@ class LumeClient: if kwargs: print(json.dumps(kwargs, indent=2)) - async def _run_curl(self, method: str, path: str, data: Optional[Dict[str, Any]] = None, params: Optional[Dict[str, Any]] = None) -> Any: + async def _run_curl( + self, + method: str, + path: str, + data: Optional[Dict[str, Any]] = None, + params: Optional[Dict[str, Any]] = None, + ) -> Any: """Execute a curl command and return the response.""" url = f"{self.base_url}{path}" if params: @@ -34,30 +41,28 @@ class LumeClient: url = f"{url}?{param_str}" cmd = ["curl", "-X", method, "-s", "-w", "%{http_code}", "-m", str(self.timeout)] - + if data is not None: cmd.extend(["-H", "Content-Type: application/json", "-d", json.dumps(data)]) - + cmd.append(url) - + self._log_debug(f"Running curl command: {' '.join(map(shlex.quote, cmd))}") - + try: process = await asyncio.create_subprocess_exec( - *cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE + *cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout, stderr = await process.communicate() - + if process.returncode != 0: raise LumeConnectionError(f"Curl command failed: {stderr.decode()}") - + # The last 3 characters are the status code response = stdout.decode() status_code = int(response[-3:]) response_body = response[:-3] # Remove status code from response - + if status_code >= 400: if status_code == 404: raise LumeNotFoundError(f"Resource not found: {path}") @@ -67,9 +72,9 @@ class LumeClient: raise LumeServerError(f"Server error: {response_body}") else: raise LumeError(f"Request failed with status {status_code}: {response_body}") - + return json.loads(response_body) if response_body.strip() else None - + except asyncio.TimeoutError: raise LumeTimeoutError(f"Request timed out after {self.timeout} seconds") @@ -77,7 +82,9 @@ class LumeClient: """Make a GET request.""" return await self._run_curl("GET", path, params=params) - async def post(self, path: str, data: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> Any: + async def post( + self, path: str, data: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None + ) -> Any: """Make a POST request.""" old_timeout = self.timeout if timeout is not None: @@ -99,14 +106,14 @@ class LumeClient: """Print equivalent curl command for debugging.""" curl_cmd = f"""curl -X {method} \\ '{self.base_url}{path}'""" - + if data: curl_cmd += f" \\\n -H 'Content-Type: application/json' \\\n -d '{json.dumps(data)}'" - + print("\nEquivalent curl command:") print(curl_cmd) print() async def close(self) -> None: """Close the client resources.""" - pass # No shared resources to clean up \ No newline at end of file + pass # No shared resources to clean up diff --git a/libs/python/pylume/pylume/exceptions.py b/libs/python/pylume/pylume/exceptions.py index 420b5d42..191718b0 100644 --- a/libs/python/pylume/pylume/exceptions.py +++ b/libs/python/pylume/pylume/exceptions.py @@ -1,36 +1,54 @@ from typing import Optional + class LumeError(Exception): """Base exception for all PyLume errors.""" + pass + class LumeServerError(LumeError): """Raised when there's an error with the PyLume server.""" - def __init__(self, message: str, status_code: Optional[int] = None, response_text: Optional[str] = None): + + def __init__( + self, message: str, status_code: Optional[int] = None, response_text: Optional[str] = None + ): self.status_code = status_code self.response_text = response_text super().__init__(message) + class LumeConnectionError(LumeError): """Raised when there's an error connecting to the PyLume server.""" + pass + class LumeTimeoutError(LumeError): """Raised when a request to the PyLume server times out.""" + pass + class LumeNotFoundError(LumeError): """Raised when a requested resource is not found.""" + pass + class LumeConfigError(LumeError): """Raised when there's an error with the configuration.""" + pass + class LumeVMError(LumeError): """Raised when there's an error with a VM operation.""" + pass + class LumeImageError(LumeError): """Raised when there's an error with an image operation.""" - pass \ No newline at end of file + + pass diff --git a/libs/python/pylume/pylume/models.py b/libs/python/pylume/pylume/models.py index cd2ddb2b..021ea8aa 100644 --- a/libs/python/pylume/pylume/models.py +++ b/libs/python/pylume/pylume/models.py @@ -1,22 +1,26 @@ -from typing import Optional, List, Literal, Dict, Any import re -from pydantic import BaseModel, Field, computed_field, validator, ConfigDict, RootModel +from typing import Any, Dict, List, Literal, Optional + +from pydantic import BaseModel, ConfigDict, Field, RootModel, computed_field, validator + class DiskInfo(BaseModel): """Information about disk storage allocation. - + Attributes: total: Total disk space in bytes allocated: Currently allocated disk space in bytes """ + total: int allocated: int + class VMConfig(BaseModel): """Configuration for creating a new VM. - + Note: Memory and disk sizes should be specified with units (e.g., "4GB", "64GB") - + Attributes: name: Name of the virtual machine os: Operating system type, either "macOS" or "linux" @@ -26,6 +30,7 @@ class VMConfig(BaseModel): display: Display resolution in format "widthxheight" ipsw: IPSW path or 'latest' for macOS VMs, None for other OS types """ + name: str os: Literal["macOS", "linux"] = "macOS" cpu: int = Field(default=2, ge=1) @@ -37,46 +42,53 @@ class VMConfig(BaseModel): class Config: populate_by_alias = True + class SharedDirectory(BaseModel): """Configuration for a shared directory. - + Attributes: host_path: Path to the directory on the host system read_only: Whether the directory should be mounted as read-only """ + host_path: str = Field(..., alias="hostPath") # Allow host_path but serialize as hostPath read_only: bool = False - + class Config: populate_by_name = True # Allow both alias and original name - alias_generator = lambda s: ''.join(word.capitalize() if i else word for i, word in enumerate(s.split('_'))) + alias_generator = lambda s: "".join( + word.capitalize() if i else word for i, word in enumerate(s.split("_")) + ) + class VMRunOpts(BaseModel): """Configuration for running a VM. - + Args: no_display: Whether to not display the VNC client shared_directories: List of directories to share with the VM """ + no_display: bool = Field(default=False, alias="noDisplay") shared_directories: Optional[list[SharedDirectory]] = Field( - default=None, - alias="sharedDirectories" + default=None, alias="sharedDirectories" ) model_config = ConfigDict( populate_by_name=True, - alias_generator=lambda s: ''.join(word.capitalize() if i else word for i, word in enumerate(s.split('_'))) + alias_generator=lambda s: "".join( + word.capitalize() if i else word for i, word in enumerate(s.split("_")) + ), ) def model_dump(self, **kwargs): """Export model data with proper field name conversion. - + Converts shared directory fields to match API expectations when using aliases. - + Args: **kwargs: Keyword arguments passed to parent model_dump method - + Returns: dict: Model data with properly formatted field names """ @@ -84,19 +96,16 @@ class VMRunOpts(BaseModel): # Convert shared directory fields to match API expectations if self.shared_directories and "by_alias" in kwargs and kwargs["by_alias"]: data["sharedDirectories"] = [ - { - "hostPath": d.host_path, - "readOnly": d.read_only - } - for d in self.shared_directories + {"hostPath": d.host_path, "readOnly": d.read_only} for d in self.shared_directories ] # Remove the snake_case version if it exists data.pop("shared_directories", None) return data + class VMStatus(BaseModel): """Status information for a virtual machine. - + Attributes: name: Name of the virtual machine status: Current status of the VM @@ -107,6 +116,7 @@ class VMStatus(BaseModel): vnc_url: URL for VNC connection if available ip_address: IP address of the VM if available """ + name: str status: str os: Literal["macOS", "linux"] @@ -123,7 +133,7 @@ class VMStatus(BaseModel): @property def state(self) -> str: """Get the current state of the VM. - + Returns: str: Current VM status """ @@ -133,7 +143,7 @@ class VMStatus(BaseModel): @property def cpu(self) -> int: """Get the number of CPU cores. - + Returns: int: Number of CPU cores allocated to the VM """ @@ -143,7 +153,7 @@ class VMStatus(BaseModel): @property def memory(self) -> str: """Get memory allocation in human-readable format. - + Returns: str: Memory size formatted as "{size}GB" """ @@ -151,27 +161,31 @@ class VMStatus(BaseModel): gb = self.memory_size / (1024 * 1024 * 1024) return f"{int(gb)}GB" + class VMUpdateOpts(BaseModel): """Options for updating VM configuration. - + Attributes: cpu: Number of CPU cores to update to memory: Amount of memory to update to with units disk_size: Size of disk to update to with units """ + cpu: Optional[int] = None memory: Optional[str] = None disk_size: Optional[str] = None + class ImageRef(BaseModel): """Reference to a VM image. - + Attributes: image: Name of the image tag: Tag version of the image registry: Registry hostname where image is stored organization: Organization or namespace in the registry """ + image: str tag: str = "latest" registry: Optional[str] = "ghcr.io" @@ -179,47 +193,53 @@ class ImageRef(BaseModel): def model_dump(self, **kwargs): """Override model_dump to return just the image:tag format. - + Args: **kwargs: Keyword arguments (ignored) - + Returns: str: Image reference in "image:tag" format """ return f"{self.image}:{self.tag}" + class CloneSpec(BaseModel): """Specification for cloning a VM. - + Attributes: name: Name of the source VM to clone new_name: Name for the new cloned VM """ + name: str new_name: str = Field(alias="newName") class Config: populate_by_alias = True + class ImageInfo(BaseModel): """Model for individual image information. - + Attributes: imageId: Unique identifier for the image """ + imageId: str + class ImageList(RootModel): """Response model for the images endpoint. - + A list-like container for ImageInfo objects that provides iteration and indexing capabilities. """ + root: List[ImageInfo] def __iter__(self): """Iterate over the image list. - + Returns: Iterator over ImageInfo objects """ @@ -227,10 +247,10 @@ class ImageList(RootModel): def __getitem__(self, item): """Get an item from the image list by index. - + Args: item: Index or slice to retrieve - + Returns: ImageInfo or list of ImageInfo objects """ @@ -238,8 +258,8 @@ class ImageList(RootModel): def __len__(self): """Get the number of images in the list. - + Returns: int: Number of images in the list """ - return len(self.root) \ No newline at end of file + return len(self.root) diff --git a/libs/python/pylume/pylume/pylume.py b/libs/python/pylume/pylume/pylume.py index 2073b883..1bbe34b2 100644 --- a/libs/python/pylume/pylume/pylume.py +++ b/libs/python/pylume/pylume/pylume.py @@ -1,36 +1,36 @@ -import os -import sys -import json -import time import asyncio -import subprocess -from typing import Optional, List, Union, Callable, TypeVar, Any -from functools import wraps +import json +import os import re import signal +import subprocess +import sys +import time +from functools import wraps +from typing import Any, Callable, List, Optional, TypeVar, Union -from .server import LumeServer from .client import LumeClient -from .models import ( - VMConfig, - VMStatus, - VMRunOpts, - VMUpdateOpts, - ImageRef, - CloneSpec, - SharedDirectory, - ImageList, -) from .exceptions import ( - LumeError, - LumeServerError, - LumeConnectionError, - LumeTimeoutError, - LumeNotFoundError, LumeConfigError, - LumeVMError, + LumeConnectionError, + LumeError, LumeImageError, + LumeNotFoundError, + LumeServerError, + LumeTimeoutError, + LumeVMError, ) +from .models import ( + CloneSpec, + ImageList, + ImageRef, + SharedDirectory, + VMConfig, + VMRunOpts, + VMStatus, + VMUpdateOpts, +) +from .server import LumeServer # Type variable for the decorator T = TypeVar("T") diff --git a/libs/python/pylume/pylume/server.py b/libs/python/pylume/pylume/server.py index 01c48084..cab5f627 100644 --- a/libs/python/pylume/pylume/server.py +++ b/libs/python/pylume/pylume/server.py @@ -1,18 +1,19 @@ -import os -import time import asyncio -import subprocess -import tempfile -import logging -import socket -from typing import Optional -import sys -from .exceptions import LumeConnectionError -import signal import json -import shlex +import logging +import os import random +import shlex +import signal +import socket +import subprocess +import sys +import tempfile +import time from logging import getLogger +from typing import Optional + +from .exceptions import LumeConnectionError class LumeServer: diff --git a/libs/python/som/README.md b/libs/python/som/README.md index 02802bfc..ad7e906a 100644 --- a/libs/python/som/README.md +++ b/libs/python/som/README.md @@ -8,10 +8,11 @@ - [![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) - [![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) - [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) - [![PyPI](https://img.shields.io/pypi/v/cua-computer?color=333333)](https://pypi.org/project/cua-computer/) +[![Python](https://img.shields.io/badge/Python-333333?logo=python&logoColor=white&labelColor=333333)](#) +[![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0)](#) +[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.com/invite/mVnXXpdE85) +[![PyPI](https://img.shields.io/pypi/v/cua-computer?color=333333)](https://pypi.org/project/cua-computer/) + @@ -33,7 +34,6 @@ - Uses Metal Performance Shaders (MPS) - Multi-scale detection enabled - ~0.4s average detection time - - **Supported**: Any Python 3.11+ environment - Falls back to CPU if no GPU available - Single-scale detection on CPU @@ -82,11 +82,13 @@ for elem in result.elements: ## Development ### Test Data + - Place test screenshots in `examples/test_data/` - Not tracked in git to keep repository size manageable - Default test image: `test_screen.png` (1920x1080) ### Running Tests + ```bash # Run benchmark with no OCR python examples/omniparser_examples.py examples/test_data/test_screen.png --runs 5 --ocr none diff --git a/libs/python/som/som/__init__.py b/libs/python/som/som/__init__.py index 906da597..48b0c7e8 100644 --- a/libs/python/som/som/__init__.py +++ b/libs/python/som/som/__init__.py @@ -5,11 +5,11 @@ __version__ = "0.1.0" from .detect import OmniParser from .models import ( BoundingBox, - UIElement, IconElement, - TextElement, + ParseResult, ParserMetadata, - ParseResult + TextElement, + UIElement, ) __all__ = [ @@ -19,5 +19,5 @@ __all__ = [ "IconElement", "TextElement", "ParserMetadata", - "ParseResult" -] \ No newline at end of file + "ParseResult", +] diff --git a/libs/python/som/som/detect.py b/libs/python/som/som/detect.py index 79e64886..8b27d529 100644 --- a/libs/python/som/som/detect.py +++ b/libs/python/som/som/detect.py @@ -1,28 +1,35 @@ -from pathlib import Path -from typing import Union, List, Dict, Any, Tuple, Optional, cast +import argparse +import base64 +import io import logging -import torch -import torchvision.ops +import signal +import time +from contextlib import contextmanager +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union, cast + import cv2 import numpy as np -import time -import torchvision.transforms as T -from PIL import Image -import io -import base64 -import argparse -import signal -from contextlib import contextmanager - -from ultralytics import YOLO -from huggingface_hub import hf_hub_download import supervision as sv +import torch +import torchvision.ops +import torchvision.transforms as T +from huggingface_hub import hf_hub_download +from PIL import Image from supervision.detection.core import Detections +from ultralytics import YOLO from .detection import DetectionProcessor +from .models import ( + BoundingBox, + IconElement, + ParseResult, + ParserMetadata, + TextElement, + UIElement, +) from .ocr import OCRProcessor from .visualization import BoxAnnotator -from .models import BoundingBox, UIElement, IconElement, TextElement, ParserMetadata, ParseResult logger = logging.getLogger(__name__) @@ -50,8 +57,9 @@ def timeout(seconds: int): def process_text_box(box, image): """Process a single text box with OCR.""" try: + from typing import Any, List, Sequence, Tuple + import easyocr - from typing import List, Tuple, Any, Sequence x1 = int(min(point[0] for point in box)) y1 = int(min(point[1] for point in box)) @@ -100,6 +108,7 @@ def check_ocr_box(image_path: Union[str, Path]) -> Tuple[List[str], List[List[fl # Use EasyOCR import ssl + import easyocr # Create unverified SSL context for development @@ -231,7 +240,7 @@ class OmniParser: for i, det in enumerate(text_detections) ], ) - + if elements and text_elements: # Filter out non-OCR elements that have OCR elements with center points colliding with them filtered_elements = [] @@ -241,17 +250,21 @@ class OmniParser: # Calculate center point of the text element center_x = (text_elem.bbox.x1 + text_elem.bbox.x2) / 2 center_y = (text_elem.bbox.y1 + text_elem.bbox.y2) / 2 - + # Check if this center point is inside the non-OCR element - if (center_x >= elem.bbox.x1 and center_x <= elem.bbox.x2 and - center_y >= elem.bbox.y1 and center_y <= elem.bbox.y2): + if ( + center_x >= elem.bbox.x1 + and center_x <= elem.bbox.x2 + and center_y >= elem.bbox.y1 + and center_y <= elem.bbox.y2 + ): should_keep = False break - + if should_keep: filtered_elements.append(elem) elements = filtered_elements - + # Merge detections using NMS all_elements = elements + text_elements boxes = torch.tensor([elem.bbox.coordinates for elem in all_elements]) diff --git a/libs/python/som/som/detection.py b/libs/python/som/som/detection.py index 3b585d9e..bc7454fd 100644 --- a/libs/python/som/som/detection.py +++ b/libs/python/som/som/detection.py @@ -1,12 +1,13 @@ -from typing import List, Dict, Any, Tuple, Optional import logging +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +import numpy as np import torch import torchvision -from PIL import Image -import numpy as np -from ultralytics import YOLO from huggingface_hub import hf_hub_download -from pathlib import Path +from PIL import Image +from ultralytics import YOLO logger = logging.getLogger(__name__) diff --git a/libs/python/som/som/models.py b/libs/python/som/som/models.py index aa116106..fc1e3503 100644 --- a/libs/python/som/som/models.py +++ b/libs/python/som/som/models.py @@ -1,4 +1,5 @@ -from typing import List, Tuple, Optional, Literal, Dict, Any, Union +from typing import Any, Dict, List, Literal, Optional, Tuple, Union + from pydantic import BaseModel, Field, validator diff --git a/libs/python/som/som/ocr.py b/libs/python/som/som/ocr.py index 32f15bd1..73f677b9 100644 --- a/libs/python/som/som/ocr.py +++ b/libs/python/som/som/ocr.py @@ -1,12 +1,13 @@ -from typing import List, Dict, Any, Tuple, Union import logging import signal from contextlib import contextmanager from pathlib import Path +from typing import Any, Dict, List, Tuple, Union + import easyocr -from PIL import Image import numpy as np import torch +from PIL import Image logger = logging.getLogger(__name__) @@ -18,9 +19,10 @@ class TimeoutException(Exception): @contextmanager def timeout(seconds: int): import threading - + # Check if we're in the main thread if threading.current_thread() is threading.main_thread(): + def timeout_handler(signum, frame): raise TimeoutException("OCR process timed out") @@ -34,7 +36,9 @@ def timeout(seconds: int): signal.signal(signal.SIGALRM, original_handler) else: # In a non-main thread, we can't use signal - logger.warning("Timeout function called from non-main thread; signal-based timeout disabled") + logger.warning( + "Timeout function called from non-main thread; signal-based timeout disabled" + ) try: yield finally: @@ -80,7 +84,7 @@ class OCRProcessor: # Use GPU if available use_gpu = self.device in ["cuda", "mps"] self.reader = easyocr.Reader(["en"], gpu=use_gpu) - + # Verify reader initialization if self.reader is None: raise ValueError("Failed to initialize EasyOCR reader") diff --git a/libs/python/som/som/util/utils.py b/libs/python/som/som/util/utils.py index 4303b91d..e635adcd 100644 --- a/libs/python/som/som/util/utils.py +++ b/libs/python/som/som/util/utils.py @@ -1,13 +1,14 @@ -import easyocr +import logging +import signal +import time +from contextlib import contextmanager +from typing import Any, List, Optional, Sequence, Tuple, Union, cast + import cv2 +import easyocr import matplotlib.pyplot as plt import numpy as np from PIL import Image -from typing import Union, List, Tuple, Any, Optional, cast, Sequence -import time -import signal -from contextlib import contextmanager -import logging logger = logging.getLogger(__name__) diff --git a/libs/python/som/som/visualization.py b/libs/python/som/som/visualization.py index 038af0f5..2668b231 100644 --- a/libs/python/som/som/visualization.py +++ b/libs/python/som/som/visualization.py @@ -1,10 +1,11 @@ -from typing import List, Dict, Any, Tuple -import numpy as np -from PIL import Image, ImageDraw, ImageFont -import supervision as sv -import platform -import os import logging +import os +import platform +from typing import Any, Dict, List, Tuple + +import numpy as np +import supervision as sv +from PIL import Image, ImageDraw, ImageFont logger = logging.getLogger(__name__) @@ -184,7 +185,7 @@ class BoxAnnotator: new_box = (x, y, x + box_width, y + box_height) label_width = new_box[2] - new_box[0] label_height = new_box[3] - new_box[1] - + for used_box in used_areas: if not ( new_box[2] < used_box[0] # new box is left of used box @@ -195,9 +196,11 @@ class BoxAnnotator: # Calculate dimensions of the used box used_box_width = used_box[2] - used_box[0] used_box_height = used_box[3] - used_box[1] - + # Only consider as collision if used box is NOT more than 5x bigger in both dimensions - if not (used_box_width > 5 * label_width and used_box_height > 5 * label_height): + if not ( + used_box_width > 5 * label_width and used_box_height > 5 * label_height + ): return True return False diff --git a/libs/typescript/agent/README.md b/libs/typescript/agent/README.md index 76db192e..27c152fb 100644 --- a/libs/typescript/agent/README.md +++ b/libs/typescript/agent/README.md @@ -17,28 +17,27 @@ yarn add @trycua/agent ### Basic Usage ```typescript -import AgentClient from "@trycua/agent"; +import AgentClient from '@trycua/agent'; // Connect to local HTTP server -const client = new AgentClient("https://localhost:8000"); +const client = new AgentClient('https://localhost:8000'); // Connect to a cloud container (port 8443 over HTTPS) -const cloud = new AgentClient( - "https://m-linux-96lcxd2c2k.containers.cloud.trycua.com:8443", - { apiKey: process.env.NEXT_PUBLIC_CUA_API_KEY || "" } -); +const cloud = new AgentClient('https://m-linux-96lcxd2c2k.containers.cloud.trycua.com:8443', { + apiKey: process.env.NEXT_PUBLIC_CUA_API_KEY || '', +}); // Connect to peer -const peerClient = new AgentClient("peer://my-agent-proxy"); +const peerClient = new AgentClient('peer://my-agent-proxy'); // Send a simple text request const response = await client.responses.create({ - model: "anthropic/claude-3-5-sonnet-20241022", - input: "Write a one-sentence bedtime story about a unicorn.", + model: 'anthropic/claude-3-5-sonnet-20241022', + input: 'Write a one-sentence bedtime story about a unicorn.', // Optional per-request env overrides env: { - OPENAI_API_KEY: "sk-..." - } + OPENAI_API_KEY: 'sk-...', + }, }); console.log(response.output); @@ -48,48 +47,48 @@ console.log(response.output); ```typescript const response = await client.responses.create({ - model: "anthropic/claude-3-5-sonnet-20241022", + model: 'anthropic/claude-3-5-sonnet-20241022', input: [ { - role: "user", + role: 'user', content: [ - { type: "input_text", text: "What is in this image?" }, - { - type: "input_image", - image_url: "https://example.com/image.jpg" - } - ] - } + { type: 'input_text', text: 'What is in this image?' }, + { + type: 'input_image', + image_url: 'https://example.com/image.jpg', + }, + ], + }, ], - env: { OPENROUTER_API_KEY: "sk-..." } + env: { OPENROUTER_API_KEY: 'sk-...' }, }); ``` ### Advanced Configuration ```typescript -const client = new AgentClient("https://localhost:8000", { +const client = new AgentClient('https://localhost:8000', { timeout: 60000, // 60 second timeout - retries: 5, // 5 retry attempts - apiKey: "cua_...", // sent as X-API-Key header when using HTTP/HTTPS + retries: 5, // 5 retry attempts + apiKey: 'cua_...', // sent as X-API-Key header when using HTTP/HTTPS }); const response = await client.responses.create({ - model: "anthropic/claude-3-5-sonnet-20241022", - input: "Hello, world!", + model: 'anthropic/claude-3-5-sonnet-20241022', + input: 'Hello, world!', agent_kwargs: { save_trajectory: true, - verbosity: 20 + verbosity: 20, }, computer_kwargs: { - os_type: "linux", - provider_type: "cloud" + os_type: 'linux', + provider_type: 'cloud', }, // Per-request env overrides env: { - ANTHROPIC_API_KEY: "sk-...", - OPENROUTER_API_KEY: "sk-..." - } + ANTHROPIC_API_KEY: 'sk-...', + OPENROUTER_API_KEY: 'sk-...', + }, }); ``` @@ -174,6 +173,7 @@ interface Usage { ``` The `output` array contains the conversation history including: + - User messages - Agent reasoning/thinking - Computer actions and their results @@ -189,16 +189,16 @@ Connect to a CUA agent proxy server: ```typescript // Local -const client = new AgentClient("https://my-agent-server.com:8000", { apiKey: "cua_..." }); +const client = new AgentClient('https://my-agent-server.com:8000', { apiKey: 'cua_...' }); // Cloud container (port 8443) -const cloud = new AgentClient( - "https://m-linux-96lcxd2c2k.containers.cloud.trycua.com:8443", - { apiKey: "cua_..." } -); +const cloud = new AgentClient('https://m-linux-96lcxd2c2k.containers.cloud.trycua.com:8443', { + apiKey: 'cua_...', +}); ``` Notes: + - The client sends the API key as `X-API-Key` for HTTP/HTTPS connections. - Cloud containers listen on `:8443` with HTTPS. @@ -207,7 +207,7 @@ Notes: Connect directly to another peer using WebRTC: ```typescript -const client = new AgentClient("peer://agent-proxy-peer-id"); +const client = new AgentClient('peer://agent-proxy-peer-id'); ``` The client uses PeerJS with default configuration for peer connections. diff --git a/libs/typescript/agent/examples/README.md b/libs/typescript/agent/examples/README.md index 98939466..d27eac59 100644 --- a/libs/typescript/agent/examples/README.md +++ b/libs/typescript/agent/examples/README.md @@ -9,6 +9,7 @@ This directory contains examples demonstrating how to use the `@trycua/agent` cl A simple HTML page that demonstrates using the CUA Agent Client in a browser environment. **Features:** + - Connect to HTTP/HTTPS or P2P (peer://) agent proxies - Send text messages to any supported model - View responses in real-time @@ -18,19 +19,21 @@ A simple HTML page that demonstrates using the CUA Agent Client in a browser env **Usage:** 1. **Build the library first:** + ```bash cd ../ pnpm build ``` 2. **Start a local web server** (required for ES modules): + ```bash # Option 1: Using Python python -m http.server 8080 - + # Option 2: Using Node.js (if you have http-server installed) npx http-server -p 8080 - + # Option 3: Using any other local server ``` @@ -44,10 +47,12 @@ A simple HTML page that demonstrates using the CUA Agent Client in a browser env - View the response in the output textarea **Supported URLs:** + - **HTTP/HTTPS**: `https://localhost:8000`, `http://my-agent-server.com:8080` - **Peer-to-Peer**: `peer://computer-agent-proxy`, `peer://any-peer-id` **Example Models:** + - `anthropic/claude-3-5-sonnet-20241022` - `openai/gpt-4` - `huggingface-local/microsoft/UI-TARS-7B` diff --git a/libs/typescript/agent/src/client.ts b/libs/typescript/agent/src/client.ts index d25e698b..2ae4da66 100644 --- a/libs/typescript/agent/src/client.ts +++ b/libs/typescript/agent/src/client.ts @@ -1,10 +1,5 @@ -import {Peer} from "peerjs"; -import type { - AgentRequest, - AgentResponse, - ConnectionType, - AgentClientOptions, -} from "./types"; +import { Peer } from 'peerjs'; +import type { AgentRequest, AgentResponse, ConnectionType, AgentClientOptions } from './types'; export class AgentClient { private url: string; @@ -22,14 +17,12 @@ export class AgentClient { }; // Determine connection type from URL - if (url.startsWith("http://") || url.startsWith("https://")) { - this.connectionType = url.startsWith("https://") ? "https" : "http"; - } else if (url.startsWith("peer://")) { - this.connectionType = "peer"; + if (url.startsWith('http://') || url.startsWith('https://')) { + this.connectionType = url.startsWith('https://') ? 'https' : 'http'; + } else if (url.startsWith('peer://')) { + this.connectionType = 'peer'; } else { - throw new Error( - "Invalid URL format. Must start with http://, https://, or peer://" - ); + throw new Error('Invalid URL format. Must start with http://, https://, or peer://'); } } @@ -42,10 +35,10 @@ export class AgentClient { private async sendRequest(request: AgentRequest): Promise { switch (this.connectionType) { - case "http": - case "https": + case 'http': + case 'https': return this.sendHttpRequest(request); - case "peer": + case 'peer': return this.sendPeerRequest(request); default: throw new Error(`Unsupported connection type: ${this.connectionType}`); @@ -54,21 +47,18 @@ export class AgentClient { private async sendHttpRequest(request: AgentRequest): Promise { const controller = new AbortController(); - const timeoutId = setTimeout( - () => controller.abort(), - this.options.timeout - ); + const timeoutId = setTimeout(() => controller.abort(), this.options.timeout); try { const headers: Record = { - "Content-Type": "application/json", + 'Content-Type': 'application/json', }; if (this.options.apiKey) { - headers["X-API-Key"] = this.options.apiKey; + headers['X-API-Key'] = this.options.apiKey; } const response = await fetch(`${this.url}/responses`, { - method: "POST", + method: 'POST', headers, body: JSON.stringify(request), signal: controller.signal, @@ -93,7 +83,7 @@ export class AgentClient { private async sendPeerRequest(request: AgentRequest): Promise { // Extract peer ID from peer:// URL - const peerId = this.url.replace("peer://", ""); + const peerId = this.url.replace('peer://', ''); if (!this.peer) { // Initialize peer connection with default options as requested @@ -101,36 +91,35 @@ export class AgentClient { return new Promise((resolve, reject) => { const timeout = setTimeout(() => { - reject(new Error("Peer connection timeout")); + reject(new Error('Peer connection timeout')); }, this.options.timeout); - this.peer!.on("open", () => { + this.peer!.on('open', () => { // Connect to the target peer this.connection = this.peer!.connect(peerId); - this.connection.on("open", () => { + this.connection.on('open', () => { // Send the request this.connection!.send(JSON.stringify(request)); }); - this.connection.on("data", (data: any) => { + this.connection.on('data', (data: any) => { clearTimeout(timeout); try { - const response = - typeof data === "string" ? JSON.parse(data) : data; + const response = typeof data === 'string' ? JSON.parse(data) : data; resolve(response as AgentResponse); } catch (error) { - reject(new Error("Failed to parse peer response")); + reject(new Error('Failed to parse peer response')); } }); - this.connection.on("error", (error: any) => { + this.connection.on('error', (error: any) => { clearTimeout(timeout); reject(new Error(`Peer connection error: ${error}`)); }); }); - this.peer!.on("error", (error: any) => { + this.peer!.on('error', (error: any) => { clearTimeout(timeout); reject(new Error(`Peer error: ${error}`)); }); @@ -139,7 +128,7 @@ export class AgentClient { // Reuse existing connection return new Promise((resolve, reject) => { const timeout = setTimeout(() => { - reject(new Error("Peer request timeout")); + reject(new Error('Peer request timeout')); }, this.options.timeout); if (this.connection && this.connection.open) { @@ -147,20 +136,19 @@ export class AgentClient { const handleData = (data: any) => { clearTimeout(timeout); - this.connection!.off("data", handleData); + this.connection!.off('data', handleData); try { - const response = - typeof data === "string" ? JSON.parse(data) : data; + const response = typeof data === 'string' ? JSON.parse(data) : data; resolve(response as AgentResponse); } catch (error) { - reject(new Error("Failed to parse peer response")); + reject(new Error('Failed to parse peer response')); } }; - this.connection.on("data", handleData); + this.connection.on('data', handleData); } else { clearTimeout(timeout); - reject(new Error("Peer connection not available")); + reject(new Error('Peer connection not available')); } }); } @@ -168,18 +156,18 @@ export class AgentClient { // Health check method async health(): Promise<{ status: string }> { - if (this.connectionType === "peer") { - return { status: this.peer?.open ? "connected" : "disconnected" }; + if (this.connectionType === 'peer') { + return { status: this.peer?.open ? 'connected' : 'disconnected' }; } try { const response = await fetch(`${this.url}/health`); if (response.ok) { - return { status: "healthy" }; + return { status: 'healthy' }; } - return { status: "unhealthy" }; + return { status: 'unhealthy' }; } catch { - return { status: "unreachable" }; + return { status: 'unreachable' }; } } diff --git a/libs/typescript/agent/src/types.ts b/libs/typescript/agent/src/types.ts index 30e7340a..eec5b1f8 100644 --- a/libs/typescript/agent/src/types.ts +++ b/libs/typescript/agent/src/types.ts @@ -28,7 +28,6 @@ export interface AgentRequest { } // #endregion - // #region Response // Response types export interface AgentResponse { @@ -46,11 +45,9 @@ export interface Usage { } // #endregion - - // #region Messages // Agent message types - can be one of several different message types -export type AgentMessage = +export type AgentMessage = | UserMessage | AssistantMessage | ReasoningMessage @@ -104,8 +101,6 @@ export interface FunctionCallOutputMessage { } // #endregion - - // #region Message Content export interface InputContent { type: 'input_image' | 'input_text'; @@ -126,14 +121,10 @@ export interface ComputerResultContent { } // #endregion - - // #region Actions -export type ComputerAction = - | ComputerActionOpenAI - | ComputerActionAnthropic; +export type ComputerAction = ComputerActionOpenAI | ComputerActionAnthropic; // OpenAI Computer Actions -export type ComputerActionOpenAI = +export type ComputerActionOpenAI = | ClickAction | DoubleClickAction | DragAction @@ -187,9 +178,7 @@ export interface WaitAction { type: 'wait'; } // Anthropic Computer Actions -export type ComputerActionAnthropic = - | LeftMouseDownAction - | LeftMouseUpAction; +export type ComputerActionAnthropic = LeftMouseDownAction | LeftMouseUpAction; export interface LeftMouseDownAction { type: 'left_mouse_down'; x: number; @@ -200,4 +189,4 @@ export interface LeftMouseUpAction { x: number; y: number; } -// #endregion \ No newline at end of file +// #endregion diff --git a/libs/typescript/agent/tsconfig.json b/libs/typescript/agent/tsconfig.json index 8d56b691..cdcd74de 100644 --- a/libs/typescript/agent/tsconfig.json +++ b/libs/typescript/agent/tsconfig.json @@ -1,28 +1,22 @@ { - "compilerOptions": { - "target": "esnext", - "lib": [ - "es2023" - ], - "moduleDetection": "force", - "module": "preserve", - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "types": [ - "node" - ], - "allowSyntheticDefaultImports": true, - "strict": true, - "noUnusedLocals": true, - "declaration": true, - "emitDeclarationOnly": true, - "esModuleInterop": true, - "isolatedModules": true, - "verbatimModuleSyntax": true, - "skipLibCheck": true - }, - "include": [ - "src" - ] -} \ No newline at end of file + "compilerOptions": { + "target": "esnext", + "lib": ["es2023"], + "moduleDetection": "force", + "module": "preserve", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "types": ["node"], + "allowSyntheticDefaultImports": true, + "strict": true, + "noUnusedLocals": true, + "declaration": true, + "emitDeclarationOnly": true, + "esModuleInterop": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/libs/typescript/agent/tsdown.config.ts b/libs/typescript/agent/tsdown.config.ts index b837b6ee..efbd5ff2 100644 --- a/libs/typescript/agent/tsdown.config.ts +++ b/libs/typescript/agent/tsdown.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown'; export default defineConfig({ - entry: ["src/index.ts"], - format: ["module"], - platform: "browser", + entry: ['src/index.ts'], + format: ['module'], + platform: 'browser', dts: true, clean: true, - // Remove if we don't need to support including the library via '