From 00f3652ef4df6104ef5fcbdaebb4d483de966e39 Mon Sep 17 00:00:00 2001 From: Samir mlika <105347215+mlikasam-askui@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:30:58 +0100 Subject: [PATCH 1/3] refactor(askui): delegate controller path to askui-agent-os package - Add askui-agent-os>=26.2.1 dependency - Replace custom controller path resolution (component registry, installation directory, ASKUI_CONTROLLER_PATH) with AgentOS.controller_path() - Remove deprecated installation_directory and related settings - Simplify AskUiControllerSettings and trim unit tests to match --- pyproject.toml | 1 + .../tools/askui/askui_controller_settings.py | 99 +---- .../askui/test_askui_controller_settings.py | 398 +----------------- 3 files changed, 6 insertions(+), 492 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f3fa879e..83928c09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,6 +5,7 @@ authors = [ {name = "askui GmbH", email = "info@askui.com"}, ] dependencies = [ + "askui-agent-os>=26.2.1", "anthropic>=0.72.0", "fastapi>=0.115.12", "fastmcp>=2.3.0", diff --git a/src/askui/tools/askui/askui_controller_settings.py b/src/askui/tools/askui/askui_controller_settings.py index 9a2d5cec..0833b86f 100644 --- a/src/askui/tools/askui/askui_controller_settings.py +++ b/src/askui/tools/askui/askui_controller_settings.py @@ -1,7 +1,7 @@ import pathlib -import sys from functools import cached_property +from askui_agent_os import AgentOS from pydantic import BaseModel, Field, field_validator from pydantic_settings import BaseSettings, SettingsConfigDict @@ -32,21 +32,6 @@ class AskUiControllerSettings(BaseSettings): env_prefix="ASKUI_", ) - component_registry_file: pathlib.Path | None = None - installation_directory: pathlib.Path | None = Field( - None, - deprecated="ASKUI_INSTALLATION_DIRECTORY has been deprecated in favor of " - "ASKUI_COMPONENT_REGISTRY_FILE and ASKUI_CONTROLLER_PATH. You may be using an " - "outdated AskUI Suite. If you think so, reinstall to upgrade the AskUI Suite " - "(see https://docs.askui.com/01-tutorials/00-installation).", - ) - controller_path_setting: pathlib.Path | None = Field( - None, - validation_alias="ASKUI_CONTROLLER_PATH", - description="Path to the AskUI Remote Device Controller executable. Takes " - "precedence over ASKUI_COMPONENT_REGISTRY_FILE and ASKUI_INSTALLATION_DIRECTORY" - ".", - ) controller_args: str | None = Field( default="--showOverlay false", description=( @@ -92,89 +77,9 @@ def validate_controller_args(cls, value: str) -> str: return value - def _find_remote_device_controller_by_installation_directory( - self, - ) -> pathlib.Path | None: - if self.installation_directory is None: - return None - - return self._build_controller_path(self.installation_directory) - - def _build_controller_path( - self, installation_directory: pathlib.Path - ) -> pathlib.Path: - match sys.platform: - case "win32": - return ( - installation_directory - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController.exe" - ) - case "darwin": - return ( - installation_directory - / "Binaries" - / "askui-ui-controller.app" - / "Contents" - / "Resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - case "linux": - return ( - installation_directory - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - case _: - error_msg = ( - f'Platform "{sys.platform}" not supported by ' - "AskUI Remote Device Controller" - ) - raise NotImplementedError(error_msg) - - def _find_remote_device_controller_by_component_registry_file( - self, - ) -> pathlib.Path | None: - if self.component_registry_file is None: - return None - - component_registry = AskUiComponentRegistry.model_validate_json( - self.component_registry_file.read_text(encoding="utf-8") - ) - return ( - component_registry.installed_packages.remote_device_controller_uuid.executables.askui_remote_device_controller # noqa: E501 - ) - @cached_property def controller_path(self) -> pathlib.Path: - result = ( - self.controller_path_setting - or self._find_remote_device_controller_by_component_registry_file() - or self._find_remote_device_controller_by_installation_directory() - ) - if result is None: - error_msg = ( - "No AskUI Remote Device Controller found. Please set the " - "ASKUI_COMPONENT_REGISTRY_FILE, ASKUI_INSTALLATION_DIRECTORY, or " - "ASKUI_CONTROLLER_PATH environment variable." - ) - raise ValueError(error_msg) - - if not result.is_file(): - error_msg = ( - "AskUIRemoteDeviceController executable does not exist under " - f"`{result}`" - ) - raise FileNotFoundError(error_msg) - return result + return AgentOS.controller_path() __all__ = ["AskUiControllerSettings"] diff --git a/tests/unit/tools/askui/test_askui_controller_settings.py b/tests/unit/tools/askui/test_askui_controller_settings.py index 983e2cbe..2837cb53 100644 --- a/tests/unit/tools/askui/test_askui_controller_settings.py +++ b/tests/unit/tools/askui/test_askui_controller_settings.py @@ -1,9 +1,6 @@ -import pathlib -import sys from unittest.mock import patch import pytest -from pydantic import ValidationError from askui.tools.askui.askui_controller_settings import AskUiControllerSettings @@ -11,403 +8,14 @@ class TestAskUiControllerSettings: """Test suite for AskUiControllerSettings.""" - def test_controller_path_setting_takes_precedence( - self, tmp_path: pathlib.Path - ) -> None: - """Test that ASKUI_CONTROLLER_PATH takes precedence over other settings.""" - controller_path = tmp_path / "controller.exe" - controller_path.touch() - - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": str(controller_path)}, clear=True - ): - settings = AskUiControllerSettings() - assert settings.controller_path == controller_path - - def test_component_registry_file_resolution(self, tmp_path: pathlib.Path) -> None: - """Test resolution via component registry file.""" - registry_file = tmp_path / "registry.json" - controller_path = tmp_path / "controller.exe" - controller_path.touch() - - registry_content = { - "DefinitionVersion": 1, - "InstalledPackages": { - "{aed1b543-e856-43ad-b1bc-19365d35c33e}": { - "Executables": {"AskUIRemoteDeviceController": str(controller_path)} - } - }, - } - - import json - - registry_file.write_text(json.dumps(registry_content)) - - with patch.dict( - "os.environ", - {"ASKUI_COMPONENT_REGISTRY_FILE": str(registry_file)}, - clear=True, - ): - settings = AskUiControllerSettings() - assert settings.controller_path == controller_path - - def test_installation_directory_resolution(self, tmp_path: pathlib.Path) -> None: - """Test resolution via installation directory.""" - installation_dir = tmp_path / "installation" - installation_dir.mkdir() - - # Create the expected path structure based on platform - if sys.platform == "win32": - controller_path = ( - installation_dir - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController.exe" - ) - elif sys.platform == "darwin": - controller_path = ( - installation_dir - / "Binaries" - / "askui-ui-controller.app" - / "Contents" - / "Resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - else: # linux - controller_path = ( - installation_dir - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - - controller_path.parent.mkdir(parents=True, exist_ok=True) - controller_path.touch() - - with patch.dict( - "os.environ", - {"ASKUI_INSTALLATION_DIRECTORY": str(installation_dir)}, - clear=True, - ): - settings = AskUiControllerSettings() - assert settings.controller_path == controller_path - - def test_no_environment_variables_raises_error(self) -> None: - """Test that ValueError is raised when no environment variables are set.""" - with patch.dict("os.environ", {}, clear=True): - with pytest.raises( - ValueError, match="No AskUI Remote Device Controller found. Please set" - ): - settings = AskUiControllerSettings() - _ = settings.controller_path - - def test_build_controller_path_windows(self) -> None: - """Test _build_controller_path for Windows platform.""" - with patch("sys.platform", "win32"): - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": "/tmp/test"}, clear=True - ): - settings = AskUiControllerSettings() - installation_dir = pathlib.Path("/test/installation") - expected_path = ( - installation_dir - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController.exe" - ) - assert ( - settings._build_controller_path(installation_dir) == expected_path - ) - - def test_build_controller_path_darwin(self) -> None: - """Test _build_controller_path for macOS platform.""" - with patch("sys.platform", "darwin"): - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": "/tmp/test"}, clear=True - ): - settings = AskUiControllerSettings() - installation_dir = pathlib.Path("/test/installation") - expected_path = ( - installation_dir - / "Binaries" - / "askui-ui-controller.app" - / "Contents" - / "Resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - assert ( - settings._build_controller_path(installation_dir) == expected_path - ) - - def test_build_controller_path_linux(self) -> None: - """Test _build_controller_path for Linux platform.""" - with patch("sys.platform", "linux"): - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": "/tmp/test"}, clear=True - ): - settings = AskUiControllerSettings() - installation_dir = pathlib.Path("/test/installation") - expected_path = ( - installation_dir - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - assert ( - settings._build_controller_path(installation_dir) == expected_path - ) - - def test_build_controller_path_unsupported_platform(self) -> None: - """Test _build_controller_path for unsupported platform.""" - with patch("sys.platform", "unsupported"): - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": "/tmp/test"}, clear=True - ): - settings = AskUiControllerSettings() - installation_dir = pathlib.Path("/test/installation") - with pytest.raises( - NotImplementedError, match='Platform "unsupported" not supported' - ): - settings._build_controller_path(installation_dir) - - def test_invalid_component_registry_file(self, tmp_path: pathlib.Path) -> None: - """Test handling of invalid component registry file.""" - registry_file = tmp_path / "invalid.json" - registry_file.write_text("invalid json") - - with patch.dict( - "os.environ", - {"ASKUI_COMPONENT_REGISTRY_FILE": str(registry_file)}, - clear=True, - ): - settings = AskUiControllerSettings() - # Should return None when registry file is invalid - with pytest.raises(ValidationError): - settings._find_remote_device_controller_by_component_registry_file() - - def test_missing_component_registry_file(self, tmp_path: pathlib.Path) -> None: - """Test handling of missing component registry file.""" - registry_file = tmp_path / "missing.json" - - with patch.dict( - "os.environ", - {"ASKUI_COMPONENT_REGISTRY_FILE": str(registry_file)}, - clear=True, - ): - settings = AskUiControllerSettings() - # Should raise FileNotFoundError when registry file doesn't exist - with pytest.raises(FileNotFoundError): - settings._find_remote_device_controller_by_component_registry_file() - - def test_controller_executable_not_found(self, tmp_path: pathlib.Path) -> None: - """Test error when controller executable doesn't exist.""" - controller_path = tmp_path / "nonexistent.exe" - - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": str(controller_path)}, clear=True - ): - settings = AskUiControllerSettings() - with pytest.raises( - FileNotFoundError, - match="AskUIRemoteDeviceController executable does not exist", - ): - _ = settings.controller_path - - def test_controller_path_cached_property(self, tmp_path: pathlib.Path) -> None: - """Test that controller_path is cached.""" - controller_path = tmp_path / "controller.exe" - controller_path.touch() - - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": str(controller_path)}, clear=True - ): - settings = AskUiControllerSettings() - - # First call should resolve the path - first_result = settings.controller_path - assert first_result == controller_path - - # Second call should use cached result - second_result = settings.controller_path - assert second_result == controller_path - assert first_result is second_result - - def test_priority_order_controller_path_first(self, tmp_path: pathlib.Path) -> None: - """Test that controller_path_setting takes priority over other methods.""" - controller_path = tmp_path / "controller.exe" - controller_path.touch() - - registry_file = tmp_path / "registry.json" - registry_file.write_text('{"DefinitionVersion": 1, "InstalledPackages": {}}') - - installation_dir = tmp_path / "installation" - installation_dir.mkdir() - - with patch.dict( - "os.environ", - { - "ASKUI_CONTROLLER_PATH": str(controller_path), - "ASKUI_COMPONENT_REGISTRY_FILE": str(registry_file), - "ASKUI_INSTALLATION_DIRECTORY": str(installation_dir), - }, - clear=True, - ): - settings = AskUiControllerSettings() - assert settings.controller_path == controller_path - - def test_priority_order_component_registry_second( - self, tmp_path: pathlib.Path - ) -> None: - """Test that component registry takes priority over installation directory.""" - registry_file = tmp_path / "registry.json" - controller_path = tmp_path / "controller.exe" - controller_path.touch() - - registry_content = { - "DefinitionVersion": 1, - "InstalledPackages": { - "{aed1b543-e856-43ad-b1bc-19365d35c33e}": { - "Executables": {"AskUIRemoteDeviceController": str(controller_path)} - } - }, - } - - import json - - registry_file.write_text(json.dumps(registry_content)) - - installation_dir = tmp_path / "installation" - installation_dir.mkdir() - - with patch.dict( - "os.environ", - { - "ASKUI_COMPONENT_REGISTRY_FILE": str(registry_file), - "ASKUI_INSTALLATION_DIRECTORY": str(installation_dir), - }, - clear=True, - ): - settings = AskUiControllerSettings() - assert settings.controller_path == controller_path - - def test_installation_directory_fallback(self, tmp_path: pathlib.Path) -> None: - """Test that installation directory is used as fallback.""" - installation_dir = tmp_path / "installation" - installation_dir.mkdir() - - # Create the expected path structure - if sys.platform == "win32": - controller_path = ( - installation_dir - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController.exe" - ) - elif sys.platform == "darwin": - controller_path = ( - installation_dir - / "Binaries" - / "askui-ui-controller.app" - / "Contents" - / "Resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - else: # linux - controller_path = ( - installation_dir - / "Binaries" - / "resources" - / "assets" - / "binaries" - / "AskuiRemoteDeviceController" - ) - - controller_path.parent.mkdir(parents=True, exist_ok=True) - controller_path.touch() - - with patch.dict( - "os.environ", - {"ASKUI_INSTALLATION_DIRECTORY": str(installation_dir)}, - clear=True, - ): - settings = AskUiControllerSettings() - assert settings.controller_path == controller_path - - def test_none_values_return_none(self) -> None: - """Test that None values are handled correctly.""" - # Create a settings instance with mocked environment - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": "/tmp/test"}, clear=True - ): - settings = AskUiControllerSettings() - - # Mock the methods to return None - with ( - patch.object(settings, "component_registry_file", None), - patch.object(settings, "installation_directory", None), - ): - assert ( - settings._find_remote_device_controller_by_installation_directory() - is None - ) - # Note: _find_remote_device_controller_by_component_registry_file will - # raise - # FileNotFoundError when component_registry_file is None, so we test - # that separately - - def test_assertion_error_when_no_controller_found(self) -> None: - """Test that assertion error is raised when no controller is found.""" - # Create a settings instance with mocked environment - with patch.dict( - "os.environ", {"ASKUI_CONTROLLER_PATH": "/tmp/test"}, clear=True - ): - settings = AskUiControllerSettings() - - # Mock all resolution methods to return None - with ( - patch.object( - settings, - "_find_remote_device_controller_by_component_registry_file", - return_value=None, - ), - patch.object( - settings, - "_find_remote_device_controller_by_installation_directory", - return_value=None, - ), - patch.object(settings, "controller_path_setting", None), - ): - with pytest.raises( - ValueError, match="No AskUI Remote Device Controller found" - ): - _ = settings.controller_path - def test_controller_args_default_value(self) -> None: """Test that controller_args is set correctly with default value.""" - settings = AskUiControllerSettings(component_registry_file="/dummy") + settings = AskUiControllerSettings() assert settings.controller_args == "--showOverlay false" def test_controller_args_constructor(self) -> None: """Test that controller_args is set correctly with constructor.""" - settings = AskUiControllerSettings( - controller_args="--showOverlay false", component_registry_file="/dummy" - ) + settings = AskUiControllerSettings(controller_args="--showOverlay false") assert settings.controller_args == "--showOverlay false" def test_controller_args_with_environment_variable(self) -> None: @@ -419,7 +27,7 @@ def test_controller_args_with_environment_variable(self) -> None: }, clear=True, ): - settings = AskUiControllerSettings(component_registry_file="/dummy") + settings = AskUiControllerSettings() assert settings.controller_args == "--showOverlay false" def test_controller_args_with_invalid_arg(self) -> None: From b7edc320dd17b4759413d0a1e3ff59e133717927 Mon Sep 17 00:00:00 2001 From: Samir Mlika Date: Thu, 12 Mar 2026 14:41:16 +0100 Subject: [PATCH 2/3] update setup doc --- docs/01_setup.md | 64 ------------------------------------------------ 1 file changed, 64 deletions(-) diff --git a/docs/01_setup.md b/docs/01_setup.md index 29874a1c..fa9399dc 100644 --- a/docs/01_setup.md +++ b/docs/01_setup.md @@ -23,63 +23,6 @@ If you want a minimal installation without optional dependencies, please run pip install askui ``` -## AgentOS Installation - -AgentOS is a device controller that allows agents to take screenshots, move the mouse, click, type on the keyboard, interact with the shell, and manage user session across any operating system. It's installed on a Desktop OS but can also control mobile devices and HMI devices when connected. - -### Windows - -- [Download AskUI Installer for AMD64](https://files.askui.com/releases/Installer/Latest/AskUI-Suite-Latest-User-Installer-Win-AMD64-Web.exe) -- [Download AskUI Installer for ARM64](https://files.askui.com/releases/Installer/Latest/AskUI-Suite-Latest-User-Installer-Win-ARM64-Web.exe) - -**Installation Steps:** -1. Download the installer for your architecture -2. Run the executable -3. Follow the installation wizard -4. AgentOS will start automatically after installation - -### Linux - -**⚠️ Important:** AgentOS currently does not work on Wayland. Switch to XOrg to use it. - -#### AMD64 (Intel/AMD Processors) - -```bash -curl -L -o /tmp/AskUI-Suite-Latest-User-Installer-Linux-AMD64-Web.run https://files.askui.com/releases/Installer/Latest/AskUI-Suite-Latest-User-Installer-Linux-AMD64-Web.run -bash /tmp/AskUI-Suite-Latest-User-Installer-Linux-AMD64-Web.run -``` - -#### ARM64 (ARM Processors) - -```bash -curl -L -o /tmp/AskUI-Suite-Latest-User-Installer-Linux-ARM64-Web.run https://files.askui.com/releases/Installer/Latest/AskUI-Suite-Latest-User-Installer-Linux-ARM64-Web.run -bash /tmp/AskUI-Suite-Latest-User-Installer-Linux-ARM64-Web.run -``` - -**Installation Steps:** -1. Download the installer script -2. Run the script with bash -3. Follow the prompts -4. AgentOS will start automatically after installation - -### MacOS - -**⚠️ Important:** AgentOS currently does not work on MacOS with Intel chips (x86_64/amd64 architecture). You need a Mac with Apple Silicon (M1, M2, M3, etc.). - -#### ARM64 (Apple Silicon) - -```bash -curl -L -o /tmp/AskUI-Suite-Latest-User-Installer-MacOS-ARM64-Web.run https://files.askui.com/releases/Installer/Latest/AskUI-Suite-Latest-User-Installer-MacOS-ARM64-Web.run -bash /tmp/AskUI-Suite-Latest-User-Installer-MacOS-ARM64-Web.run -``` - -**Installation Steps:** -1. Download the installer script -2. Run the script with bash -3. Follow the prompts -4. Grant necessary permissions when prompted (screen recording, accessibility) -5. AgentOS will start automatically after installation - ## Authentication and Configuration To use the AskUI VisionAgent, please sign up and configure your credentials. @@ -125,13 +68,6 @@ set ASKUI_WORKSPACE_ID= set ASKUI_TOKEN= ``` -#### AskUI Shell -_Note: The AskUI Shell can be installed using the AskUI Suite_ -```powershell -askui-shell -AskUI-SetSetting -WorkspaceId -Token -``` - ## Verifying Your Installation ```python From 513e9a5b55026a64ffc0fd6f7091b10cdacc5bf2 Mon Sep 17 00:00:00 2001 From: Samir Mlika Date: Thu, 12 Mar 2026 15:48:15 +0100 Subject: [PATCH 3/3] update pyproject --- pdm.lock | 36 +++++++++++++++++++++++++++++++++++- pyproject.toml | 2 +- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/pdm.lock b/pdm.lock index bad16b37..728086f1 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "all", "android", "bedrock", "dev", "vertex", "web"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:860b7990d08be9d842b6e507d955fd350dad1e81c45fcf4cce4627b44506be68" +content_hash = "sha256:52d39f70b344148d3dd0461d075a560f85a0563971bc9ea4edfa86c8037fb578" [[metadata.targets]] requires_python = ">=3.10,<3.14" @@ -151,6 +151,40 @@ files = [ {file = "arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7"}, ] +[[package]] +name = "askui-agent-os" +version = "26.1.1" +requires_python = ">=3.8" +summary = "Platform-specific binaries for the AskUI Remote Device Controller, shipped as a Python package. Used by the AskUI Agent (created with the AskUI Python SDK) to control the local device on Windows, Linux, and macOS." +groups = ["default"] +files = [ + {file = "askui_agent_os-26.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03f4f7aa7c6c40903ca5e7155207db4c282b95d87542cc883b0c827feb0bbebc"}, + {file = "askui_agent_os-26.1.1-cp310-cp310-manylinux_2_34_aarch64.whl", hash = "sha256:797079d8c560c3a8925e1a94869fb1fb971fb4d5c2b38ab034c5dbfa0e15c13f"}, + {file = "askui_agent_os-26.1.1-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:5273f7bf7ca7dae922458f37dbaf54e84f8c783cb9122be0239358ac609c8e9c"}, + {file = "askui_agent_os-26.1.1-cp310-cp310-win32.whl", hash = "sha256:6158028333fc93a43845210a11bedc41a98fa3178cbb68e070ddaa153e3597c8"}, + {file = "askui_agent_os-26.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:e9ac17789c44eeb9df14c2d975d6b00e2283509c817e5c55b01cd7e92922c46c"}, + {file = "askui_agent_os-26.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:40908a46cde60a2a2543930e6bb19cdde3e0af843ee5fc343fd5f9a38ce9b4c0"}, + {file = "askui_agent_os-26.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e16ff453ed2cdb25a2bd97b67fcdaef1be293e96a2497720238c464f4a18afb"}, + {file = "askui_agent_os-26.1.1-cp311-cp311-manylinux_2_34_aarch64.whl", hash = "sha256:7abca8dd98d3bf615401cf42650688a82011aa60f7d4f1bc8b1c0b6033c95dd2"}, + {file = "askui_agent_os-26.1.1-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:ec0704dbdeeb8ebb9c7557c874682a6ed7bf4009f04b41264561a535b85c7ed0"}, + {file = "askui_agent_os-26.1.1-cp311-cp311-win32.whl", hash = "sha256:68130e52923367d58d080024c27944ca8d4be45a1420011b39a8bf14b46d0248"}, + {file = "askui_agent_os-26.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:90ca39ba3b1cdb3dedb9225db1dcd6524d8e0b261439dc32522241ebc1b84c1d"}, + {file = "askui_agent_os-26.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:481c1ebadf9a511804ca702c1403a68af037b6f40d68b662cccc9979be6bc70c"}, + {file = "askui_agent_os-26.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7471cad085e380ab9f580a77d1957011ca08677e8f7eb313b16dc1b1fc8d159e"}, + {file = "askui_agent_os-26.1.1-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:5e6719db637251e67877b6e8cd3c8bade448e2523ee1f8b90c51b5ef1c03a288"}, + {file = "askui_agent_os-26.1.1-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:0856001118b0f5f870c6686d4f561f54914f1742bd37e0c5f893df04b1484d29"}, + {file = "askui_agent_os-26.1.1-cp312-cp312-win32.whl", hash = "sha256:c3c42a62bfb8efea8c80fcb3f52c78aec86fb938d7397526969918469968623a"}, + {file = "askui_agent_os-26.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:80734af7d6d752913e9b058f1ce578e64e76e3203532244d2aa6e739ff7ca244"}, + {file = "askui_agent_os-26.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:91165a559b61d4e61efeae917d52dd31c2b28187808c6b7130bab384f4ec397b"}, + {file = "askui_agent_os-26.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e8c69de3554170d0dfb7f3941e99a50c403d33700802d83091901e32c78b3a0d"}, + {file = "askui_agent_os-26.1.1-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:4a85dd025125ca6b2f2e4a9df0f961103d06563db0a58f9457d63e213ca5c3d4"}, + {file = "askui_agent_os-26.1.1-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:6bc687ed47b1dc25b7f42db656204ac297ca9ff6e5d7308d4262542ff7207f2e"}, + {file = "askui_agent_os-26.1.1-cp313-cp313-win32.whl", hash = "sha256:478323c694196ffaabc77bbd0112cb59922c53fd6bc30ce896572b9297f3baf2"}, + {file = "askui_agent_os-26.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:7086e1bff487c42ba707da33906dd53ddc976afcedf1b0791f976b2fa5494d6f"}, + {file = "askui_agent_os-26.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:f17ce6a3da87e2d75b8119a3fdadf08f961b60b5f8a1552bb7f3a5b7a1d8c0bd"}, + {file = "askui_agent_os-26.1.1.tar.gz", hash = "sha256:2fd72c0ace97e9c39e18ba4420a7d526b95069a45389a291e699048bf2865da8"}, +] + [[package]] name = "asyncer" version = "0.0.8" diff --git a/pyproject.toml b/pyproject.toml index 83928c09..946aa59b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ authors = [ {name = "askui GmbH", email = "info@askui.com"}, ] dependencies = [ - "askui-agent-os>=26.2.1", + "askui-agent-os>=26.1.1", "anthropic>=0.72.0", "fastapi>=0.115.12", "fastmcp>=2.3.0",