Skip to content

Commit 7e838ff

Browse files
feat: add locate and get method to MultiDeviceAgent
1 parent dfc5e6f commit 7e838ff

1 file changed

Lines changed: 65 additions & 4 deletions

File tree

src/askui/multi_device_agent.py

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
from typing import Annotated
1+
from typing import Annotated, Optional, Type, overload
22

33
from pydantic import Field
44

55
from askui.agent import ComputerAgent
66
from askui.agent_base import Agent
77
from askui.agent_settings import AgentSettings
88
from askui.android_agent import AndroidAgent
9+
from askui.locators.locators import Locator
10+
from askui.models.shared.settings import GetSettings, LocateSettings
911
from askui.models.shared.tools import Tool
12+
from askui.models.types.geometry import Point
13+
from askui.models.types.response_schemas import ResponseSchema
1014
from askui.prompts.act_prompts import create_multidevice_agent_prompt
1115
from askui.reporting import CompositeReporter, Reporter
1216
from askui.retry import Retry
17+
from askui.utils.source_utils import InputSource
1318

1419

1520
class MultiDeviceAgent(Agent):
@@ -90,6 +95,65 @@ def android(self) -> AndroidAgent:
9095
"""The composed Android agent."""
9196
return self._android_agent
9297

98+
@overload
99+
def get(
100+
self,
101+
query: Annotated[str, Field(min_length=1)],
102+
response_schema: None = None,
103+
source: Optional[InputSource] = None,
104+
get_settings: GetSettings | None = None,
105+
) -> str: ...
106+
@overload
107+
def get(
108+
self,
109+
query: Annotated[str, Field(min_length=1)],
110+
response_schema: Type[ResponseSchema],
111+
source: Optional[InputSource] = None,
112+
get_settings: GetSettings | None = None,
113+
) -> ResponseSchema: ...
114+
115+
def get(
116+
self,
117+
query: Annotated[str, Field(min_length=1)],
118+
response_schema: Type[ResponseSchema] | None = None,
119+
source: Optional[InputSource] = None,
120+
get_settings: GetSettings | None = None,
121+
) -> ResponseSchema | str:
122+
"""Not supported on `MultiDeviceAgent`.
123+
124+
Use `agent.computer.get()` or `agent.android.get()` instead.
125+
126+
Raises:
127+
NotImplementedError: Always.
128+
"""
129+
error_msg = (
130+
"MultiDeviceAgent does not support get() directly."
131+
" Use agent.computer.get() or agent.android.get()"
132+
" instead."
133+
)
134+
raise NotImplementedError(error_msg)
135+
136+
def locate(
137+
self,
138+
locator: str | Locator,
139+
screenshot: Optional[InputSource] = None,
140+
locate_settings: LocateSettings | None = None,
141+
) -> Point:
142+
"""Not supported on `MultiDeviceAgent`.
143+
144+
Use `agent.computer.locate()` or `agent.android.locate()`
145+
instead.
146+
147+
Raises:
148+
NotImplementedError: Always.
149+
"""
150+
error_msg = (
151+
"MultiDeviceAgent does not support locate() directly."
152+
" Use agent.computer.locate() or"
153+
" agent.android.locate() instead."
154+
)
155+
raise NotImplementedError(error_msg)
156+
93157
def close(self) -> None:
94158
self._computer_agent.act_agent_os_facade.disconnect()
95159
self._android_agent.act_agent_os_facade.disconnect()
@@ -99,6 +163,3 @@ def open(self) -> None:
99163
self._computer_agent.open()
100164
self._android_agent.open()
101165
super().open()
102-
103-
# Get and locate functions must be overridden and throw please use
104-
# .computer_agent and .android_agent instead.

0 commit comments

Comments
 (0)