Skip to content

Commit 55cdac0

Browse files
implement review remarks
1 parent 24de514 commit 55cdac0

28 files changed

Lines changed: 1098 additions & 982 deletions

src/askui/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
from .models.types.response_schemas import ResponseSchema, ResponseSchemaBase
4646
from .retry import ConfigurableRetry, Retry
4747
from .tools import ModifierKey, PcKey
48-
from .tools.askui import LocalAgentOsServer, RemoteAgentOsServer
48+
from .tools.askui import LocalAgentOsTargetComputer, RemoteAgentOsTargetComputer
4949
from .utils.image_utils import ImageSource
5050
from .utils.source_utils import InputSource
5151

@@ -70,8 +70,8 @@
7070
logging.getLogger(__name__).addHandler(logging.NullHandler())
7171

7272
__all__ = [
73-
"RemoteAgentOsServer",
74-
"LocalAgentOsServer",
73+
"RemoteAgentOsTargetComputer",
74+
"LocalAgentOsTargetComputer",
7575
"Agent",
7676
"AutomationError",
7777
"ComputerAgent",

src/askui/computer_agent.py

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
create_computer_agent_prompt,
1818
)
1919
from askui.tools.computer import (
20-
ComputerGetActiveAgentOsServerTool,
20+
ComputerGetCurrentComputerTargetIdTool,
2121
ComputerGetMousePositionTool,
2222
ComputerGetSystemInfoTool,
2323
ComputerKeyboardPressedTool,
2424
ComputerKeyboardReleaseTool,
2525
ComputerKeyboardTapTool,
26-
ComputerListAgentOsServersTool,
26+
ComputerListAgentOsTargetComputersTool,
2727
ComputerListDisplaysTool,
2828
ComputerMouseClickTool,
2929
ComputerMouseHoldDownTool,
@@ -33,15 +33,15 @@
3333
ComputerRetrieveActiveDisplayTool,
3434
ComputerScreenshotTool,
3535
ComputerSetActiveDisplayTool,
36-
ComputerSwitchAgentOsServerTool,
36+
ComputerSwitchAgentOsTargetComputerTool,
3737
ComputerTypeTool,
3838
)
3939
from askui.tools.exception_tool import ExceptionTool
4040

4141
from .reporting import CompositeReporter, Reporter
4242
from .retry import Retry
4343
from .tools import AgentToolbox, ComputerAgentOsFacade, ModifierKey, PcKey
44-
from .tools.askui import AgentOsServer, AskUiControllerClient
44+
from .tools.askui import AgentOsTargetComputer, AskUiControllerClient
4545

4646
logger = logging.getLogger(__name__)
4747

@@ -54,27 +54,28 @@ class ComputerAgent(Agent):
5454
It uses computer vision models to locate UI elements and execute actions on them.
5555
5656
A single `ComputerAgent` can drive **one or more machines** through the
57-
`agent_os_servers` argument. Each entry is an Agent OS server (local
58-
subprocess or remote gRPC endpoint) identified by a stable `computer_id`.
59-
At any moment one server is *active* and receives all explicit calls
60-
(`click`, `type`, `keyboard`, ...). The active server can be changed at
61-
runtime via `agent.tools.os.switch_agent_os_server(computer_id)` or
62-
scoped to a block using `agent.tools.os.temporary_select(computer_id)`.
63-
The `act()` model is also given list/switch/get-active tools so it can
64-
orchestrate work across machines on its own (e.g. read something on one
65-
computer and re-enter it on another).
57+
`agent_os_target_computers` argument. Each entry is an Agent OS target
58+
computer (local subprocess or remote gRPC endpoint) identified by a stable
59+
`computer_id`. At any moment one target is *active* and receives all
60+
explicit calls (`click`, `type`, `keyboard`, ...). The active target can be
61+
changed at runtime via
62+
`agent.tools.os.switch_agent_os_target_computer(computer_id)` or scoped to a
63+
block using `agent.tools.os.temporary_select(computer_id)`. The `act()`
64+
model is also given list/switch/get-current tools so it can orchestrate
65+
work across machines on its own (e.g. read something on one computer and
66+
re-enter it on another).
6667
6768
Args:
68-
display (int, optional): The display number to use for screen interactions on the default local server. Ignored when `agent_os_servers` is provided. Defaults to `1`.
69+
display (int, optional): The display number to use for screen interactions on the default local target. Ignored when `agent_os_target_computers` is provided. Defaults to `1`.
6970
reporters (list[Reporter] | None, optional): List of reporter instances for logging and reporting. If `None`, an empty list is used.
70-
agent_os_servers (list[AgentOsServer] | None, optional):
71-
Agent OS servers the agent can route actions to. May mix one
72-
`LocalAgentOsServer` (managing a controller subprocess on this
73-
machine) with any number of `RemoteAgentOsServer`s pointing at
71+
agent_os_target_computers (list[AgentOsTargetComputer] | None, optional):
72+
Target computers the agent can route actions to. May mix one
73+
`LocalAgentOsTargetComputer` (managing a controller subprocess on this
74+
machine) with any number of `RemoteAgentOsTargetComputer`s pointing at
7475
controllers already running on other machines. Constraints: at
75-
least one server, at most one local, and remote `address`es plus
76+
least one target, at most one local, and remote `address`es plus
7677
all `computer_id`s must be unique. The first entry becomes the
77-
initial active server. Defaults to a single local server bound to
78+
initial active target. Defaults to a single local target bound to
7879
`display`.
7980
settings (AgentSettings | None, optional): Provider-based model settings. If `None`, uses the default AskUI model stack.
8081
retry (Retry, optional): The retry instance to use for retrying failed actions. Defaults to `ConfigurableRetry` with exponential backoff. Currently only supported for `locate()` method.
@@ -94,18 +95,18 @@ class ComputerAgent(Agent):
9495
9596
Example:
9697
Research on one machine and write up the findings on another. The
97-
first server in the list is the active one; `temporary_select`
98+
first target in the list is the active one; `temporary_select`
9899
re-routes a block of explicit calls and restores the previous
99-
active server on exit.
100+
active target on exit.
100101
101102
```python
102103
from askui import ComputerAgent
103-
from askui.tools.askui import LocalAgentOsServer, RemoteAgentOsServer
104+
from askui.tools.askui import LocalAgentOsTargetComputer, RemoteAgentOsTargetComputer
104105
105106
with ComputerAgent(
106-
agent_os_servers=[
107-
LocalAgentOsServer(computer_id="research-box"),
108-
RemoteAgentOsServer(
107+
agent_os_target_computers=[
108+
LocalAgentOsTargetComputer(computer_id="research-box"),
109+
RemoteAgentOsTargetComputer(
109110
address="192.168.1.42:26000",
110111
description="Writer box with a text editor open",
111112
computer_id="writer-box",
@@ -129,7 +130,7 @@ class ComputerAgent(Agent):
129130
from askui import ComputerAgent
130131
131132
with ComputerAgent() as agent:
132-
agent.tools.os.add_remote_agent_os_server(
133+
agent.tools.os.add_remote_agent_os_target_computer(
133134
address="10.0.0.5:26000",
134135
description="Build server",
135136
)
@@ -144,15 +145,15 @@ class ComputerAgent(Agent):
144145
"act_tools",
145146
"callbacks",
146147
"truncation_strategy",
147-
"agent_os_servers",
148+
"agent_os_target_computers",
148149
}
149150
)
150151
@validate_call(config=ConfigDict(arbitrary_types_allowed=True))
151152
def __init__(
152153
self,
153154
display: Annotated[int, Field(ge=1)] = 1,
154155
reporters: list[Reporter] | None = None,
155-
agent_os_servers: list[AgentOsServer] | None = None,
156+
agent_os_target_computers: list[AgentOsTargetComputer] | None = None,
156157
settings: AgentSettings | None = None,
157158
retry: Retry | None = None,
158159
act_tools: list[Tool] | None = None,
@@ -164,7 +165,7 @@ def __init__(
164165
agent_os=AskUiControllerClient(
165166
display=display,
166167
reporter=reporter,
167-
agent_os_servers=agent_os_servers,
168+
agent_os_target_computers=agent_os_target_computers,
168169
)
169170
)
170171
super().__init__(
@@ -588,9 +589,9 @@ def get_default_tools() -> list[Tool]:
588589
ComputerListDisplaysTool(),
589590
ComputerRetrieveActiveDisplayTool(),
590591
ComputerSetActiveDisplayTool(),
591-
ComputerListAgentOsServersTool(),
592-
ComputerSwitchAgentOsServerTool(),
593-
ComputerGetActiveAgentOsServerTool(),
592+
ComputerListAgentOsTargetComputersTool(),
593+
ComputerSwitchAgentOsTargetComputerTool(),
594+
ComputerGetCurrentComputerTargetIdTool(),
594595
]
595596

596597

src/askui/models/shared/tools.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,10 @@ def __init__(
362362

363363
@property
364364
def agent_os(self) -> AgentOs | AndroidAgentOs:
365-
"""Get the agent OS.
365+
"""Get the AgentOS.
366366
367367
Returns:
368-
AgentOs | AndroidAgentOs: The agent OS instance.
368+
AgentOs | AndroidAgentOs: The AgentOS instance.
369369
"""
370370
if self._agent_os is None:
371371
msg = (
@@ -381,7 +381,7 @@ def agent_os(self, agent_os: AgentOs | AndroidAgentOs) -> None:
381381
self._agent_os = agent_os
382382

383383
def is_agent_os_initialized(self) -> bool:
384-
"""Check if the agent OS is initialized."""
384+
"""Check if the AgentOS is initialized."""
385385
return self._agent_os is not None
386386

387387

@@ -471,10 +471,10 @@ def __init__(
471471
self.add_agent_os(agent_os)
472472

473473
def add_agent_os(self, agent_os: AgentOs | AndroidAgentOs) -> None:
474-
"""Add an agent OS to the collection.
474+
"""Add an AgentOS to the collection.
475475
476476
Args:
477-
agent_os (AgentOs | AndroidAgentOs): The agent OS instance to add.
477+
agent_os (AgentOs | AndroidAgentOs): The AgentOS instance to add.
478478
"""
479479
self._agent_os_list.append(agent_os)
480480

@@ -538,19 +538,19 @@ def get_agent_os_by_tags(
538538
self, required_tags: list[str]
539539
) -> AgentOs | AndroidAgentOs:
540540
"""
541-
Find the first registered agent OS whose tags are a superset of
541+
Find the first registered AgentOS whose tags are a superset of
542542
`required_tags`.
543543
544-
Every tag in `required_tags` must appear in the agent OS's tags; the
545-
agent OS may declare additional tags beyond those.
544+
Every tag in `required_tags` must appear in the AgentOS's tags; the
545+
AgentOS may declare additional tags beyond those.
546546
547547
Raises:
548-
ValueError: when no registered agent OS satisfies the required tags.
548+
ValueError: when no registered AgentOS satisfies the required tags.
549549
"""
550550
for agent_os in self._agent_os_list:
551551
if all(required in agent_os.tags for required in required_tags):
552552
return agent_os
553-
msg = f"No agent OS satisfies required tags [{', '.join(required_tags)}]"
553+
msg = f"No AgentOS satisfies required tags [{', '.join(required_tags)}]"
554554
raise ValueError(msg)
555555

556556
def _initialize_tools(self) -> None:

src/askui/tools/agent_os.py

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from askui.models.shared.tool_tags import ToolTags
1010

1111
if TYPE_CHECKING:
12-
from askui.tools.askui.agent_os_server import (
13-
AgentOsServer,
14-
RemoteAgentOsServer,
12+
from askui.tools.askui.agent_os_target_computer import (
13+
AgentOsTargetComputer,
14+
RemoteAgentOsTargetComputer,
1515
)
1616
from askui.tools.askui.askui_ui_controller_grpc.generated import (
1717
Controller_V1_pb2 as controller_v1_pbs,
@@ -683,63 +683,61 @@ def set_window_in_focus(self, process_id: int, window_id: int) -> None:
683683
"""
684684
raise NotImplementedError
685685

686-
# --- Agent-OS-server management -----------------------------------------------
687-
# These methods only do something meaningful for backends that talk to multiple
688-
# Agent OS servers (`AskUiControllerClient`). Other `AgentOs` implementations
689-
# (Playwright, Android, ...) inherit the default implementations, which raise
690-
# `NotImplementedError`.
691-
692-
def add_agent_os_server(self, server: "AgentOsServer") -> "AgentOsServer":
693-
"""Register an additional Agent OS server. Auto-connects if connected."""
686+
def add_agent_os_target_computer(
687+
self, agent_os_target_computer: "AgentOsTargetComputer"
688+
) -> "AgentOsTargetComputer":
689+
"""Register an additional target computer. Auto-connects if connected."""
694690
raise NotImplementedError
695691

696-
def add_remote_agent_os_server(
692+
def add_remote_agent_os_target_computer(
697693
self,
698694
address: str,
699695
description: str,
700-
) -> "RemoteAgentOsServer":
701-
"""Register an additional remote Agent OS server."""
696+
) -> "RemoteAgentOsTargetComputer":
697+
"""Register an additional remote target computer."""
702698
raise NotImplementedError
703699

704-
def reset_agent_os_servers(
700+
def reset_agent_os_target_computers(
705701
self,
706-
agent_os_servers: "list[AgentOsServer] | None" = None,
702+
agent_os_target_computers: "list[AgentOsTargetComputer] | None" = None,
707703
) -> None:
708-
"""Disconnect (if connected) and replace the Agent-OS-server list."""
704+
"""Disconnect (if connected) and replace the target computer list."""
709705
raise NotImplementedError
710706

711-
def list_agent_os_servers(self) -> "list[AgentOsServer]":
712-
"""Return all registered Agent OS servers."""
707+
def list_agent_os_target_computers(self) -> "list[AgentOsTargetComputer]":
708+
"""Return all registered target computers."""
713709
raise NotImplementedError
714710

715-
def get_active_agent_os_server(self, report: bool = True) -> "AgentOsServer":
716-
"""Return the currently active Agent OS server."""
711+
def get_current_computer_target_id(self, report: bool = True) -> str:
712+
"""Return the `computer_id` of the currently active target computer."""
717713
raise NotImplementedError
718714

719-
def switch_agent_os_server(self, computer_id: str) -> "AgentOsServer":
720-
"""Switch the active Agent OS server by its `computer_id`."""
715+
def switch_agent_os_target_computer(
716+
self, computer_id: str
717+
) -> "AgentOsTargetComputer":
718+
"""Switch the active target computer by its `computer_id`."""
721719
raise NotImplementedError
722720

723721
def temporary_select(self, computer_id: str) -> AbstractContextManager[Self]:
724722
"""
725-
Temporarily switch the active Agent OS server for the duration of a `with`
726-
block, then restore the previously-active server on exit (even if the block
727-
raises).
723+
Temporarily switch the active target computer for the duration of a `with`
724+
block, then restore the previously-active target on exit (even if the
725+
block raises).
728726
729727
Args:
730-
computer_id (str): Computer id of the server to activate inside the
728+
computer_id (str): Computer id of the target to activate inside the
731729
block.
732730
733731
Returns:
734732
AbstractContextManager[Self]: Context manager that yields this
735-
`AgentOs` with the selected server active.
733+
`AgentOs` with the selected target active.
736734
737735
Example:
738736
```python
739737
with agent_os.temporary_select('Remote-Machine') as remote_machine:
740738
img = remote_machine.screenshot()
741739
img.save("remote_machine.png")
742-
# previous active server restored here
740+
# previous active target restored here
743741
```
744742
"""
745743
raise NotImplementedError

src/askui/tools/askui/__init__.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
from .agent_os_server import (
2-
AgentOsServer,
3-
LocalAgentOsServer,
4-
RemoteAgentOsServer,
1+
from .agent_os_target_computer import (
2+
AgentOsTargetComputer,
3+
LocalAgentOsTargetComputer,
4+
RemoteAgentOsTargetComputer,
55
)
6-
from .agent_os_server_manager import (
7-
AgentOsServerManager,
6+
from .agent_os_target_computer_manager import (
7+
AgentOsTargetComputerManager,
88
)
99
from .askui_controller import AskUiControllerClient
1010

1111
__all__ = [
12-
"AgentOsServer",
13-
"AgentOsServerManager",
12+
"AgentOsTargetComputer",
13+
"AgentOsTargetComputerManager",
1414
"AskUiControllerClient",
15-
"LocalAgentOsServer",
16-
"RemoteAgentOsServer",
15+
"LocalAgentOsTargetComputer",
16+
"RemoteAgentOsTargetComputer",
1717
]

0 commit comments

Comments
 (0)