Skip to content

Commit 021c90b

Browse files
fix linting errors
1 parent 1d5929b commit 021c90b

13 files changed

Lines changed: 158 additions & 128 deletions

File tree

src/askui/agent_base.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ def act(
109109
Args:
110110
goal (str | list[MessageParam]): A description of what the agent should
111111
achieve.
112-
act_settings (ActSettings | None, optional): Settings for this act execution.
113-
Overrides the agent's default settings if provided.
114-
act_model (ActModel | None, optional): Model to use for this act execution.
112+
act_settings (ActSettings | None, optional): Settings for this act
113+
execution. Overrides the agent's default settings if provided.
114+
act_model (ActModel | None, optional): Model to use for this act
115+
execution.
115116
Overrides the agent's default model if provided.
116117
on_message (OnMessageCb | None, optional): Callback for new messages. If
117118
it returns `None`, stops and does not add the message. Cannot be used

src/askui/data_extractor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
class DataExtractor:
21-
"""Data extraction utility that uses a GetModel to extract information from images/PDFs."""
21+
"""Data extraction utility using GetModel for images/PDFs."""
2222

2323
def __init__(
2424
self,

src/askui/model_store/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def list_available_models() -> dict[str, dict[str, Any]]:
8181
"type": "get",
8282
"provider": "askui",
8383
"factory": create_askui_get_model,
84-
"description": "AskUI default information extraction model (Gemini 2.5 Flash + AskUI models)",
84+
"description": "AskUI default info extraction (Gemini 2.5 Flash + AskUI)",
8585
},
8686
"askui_locate": {
8787
"type": "locate",

src/askui/models/askui/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ def locate(
172172
logger.debug("Using AskUI Combo locate model (PTA + OCR fallback)")
173173
if not isinstance(locator, str):
174174
error_msg = (
175-
f"Locators of type `{type(locator)}` are not supported for Combo model. "
176-
"Please provide a `str`."
175+
f"Locators of type `{type(locator)}` are not supported for "
176+
"Combo model. Please provide a `str`."
177177
)
178178
raise AutomationError(error_msg)
179179

@@ -201,8 +201,8 @@ def locate(
201201
logger.debug("Using AskUI AI Element locate model")
202202
if not isinstance(locator, str):
203203
error_msg = (
204-
f"Locators of type `{type(locator)}` are not supported for AI Element model. "
205-
"Please provide a `str`."
204+
f"Locators of type `{type(locator)}` are not supported for "
205+
"AI Element model. Please provide a `str`."
206206
)
207207
raise AutomationError(error_msg)
208208
ai_element_locator = AiElement(locator)

src/askui/models/fallback_model.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ def locate(
101101
i + 1,
102102
len(self._models),
103103
)
104-
return result
105-
except Exception as e:
104+
return result # noqa: TRY300
105+
except Exception as e: # noqa: BLE001, PERF203
106106
logger.debug(
107107
"Locate model %d/%d failed: %s",
108108
i + 1,
@@ -176,11 +176,13 @@ def get(
176176
Args:
177177
query (str): The query describing what data to extract.
178178
source (Source): The source to extract data from.
179-
response_schema (Type[ResponseSchema] | None): Optional schema for structured output.
179+
response_schema (Type[ResponseSchema] | None): Optional schema for
180+
structured output.
180181
get_settings (GetSettings): Settings for the get operation.
181182
182183
Returns:
183-
ResponseSchema | str: The extracted data, either as a string or structured schema.
184+
ResponseSchema | str: The extracted data, either as a string or
185+
structured schema.
184186
185187
Raises:
186188
Exception: The exception from the last model if all models fail.
@@ -205,8 +207,8 @@ def get(
205207
i + 1,
206208
len(self._models),
207209
)
208-
return result
209-
except Exception as e:
210+
return result # noqa: TRY300
211+
except Exception as e: # noqa: BLE001, PERF203
210212
logger.debug(
211213
"Get model %d/%d failed: %s",
212214
i + 1,

src/askui/models/openrouter/model.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ def get(
177177
get_settings: GetSettings,
178178
) -> ResponseSchema | str:
179179
if isinstance(source, (PdfSource, OfficeDocumentSource)):
180-
err_msg = "PDF or Office Document processing is not supported for OpenRouter model"
180+
err_msg = (
181+
"PDF or Office Document processing is not supported for "
182+
"OpenRouter model"
183+
)
181184
raise NotImplementedError(err_msg)
182185

183186
# Use system prompt from settings if provided, otherwise use default

src/askui/models/shared/messages_api.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ def create_message(
3232
model_id (str): The model identifier to use.
3333
tools (ToolCollection | None): The tools available to the model.
3434
max_tokens (int | None): The maximum number of tokens to generate.
35-
betas (list[str] | None): Beta features to enable (provider-specific).
35+
betas (list[str] | None): Beta features to enable
36+
(provider-specific).
3637
system (SystemPrompt | None): The system prompt.
37-
thinking (ThinkingConfigParam | None): Thinking configuration (provider-specific).
38-
tool_choice (ToolChoiceParam | None): Tool choice configuration (provider-specific).
38+
thinking (ThinkingConfigParam | None): Thinking configuration
39+
(provider-specific).
40+
tool_choice (ToolChoiceParam | None): Tool choice configuration
41+
(provider-specific).
3942
temperature (float | None): The sampling temperature (0-1).
4043
4144
Returns:

tests/e2e/agent/conftest.py

Lines changed: 109 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@
1919
AskUiInferenceApi,
2020
AskUiInferenceApiSettings,
2121
)
22-
from askui.models.askui.models import AskUiLocateModel
22+
from askui.models.askui.models import (
23+
AskUiAiElementLocateModel,
24+
AskUiComboLocateModel,
25+
AskUiLocateModel,
26+
AskUiOcrLocateModel,
27+
AskUiPtaLocateModel,
28+
)
2329
from askui.models.models import ActModel, GetModel, LocateModel, ModelName
2430
from askui.models.shared.agent import Agent
2531
from askui.reporting import NULL_REPORTER, Reporter, SimpleHtmlReporter
@@ -48,9 +54,7 @@ def simple_html_reporter() -> Reporter:
4854

4955

5056
@pytest.fixture
51-
def askui_act_model(
52-
path_fixtures: pathlib.Path,
53-
) -> ActModel:
57+
def askui_act_model() -> ActModel:
5458
reporter = SimpleHtmlReporter()
5559
return Agent(
5660
model_id=ModelName.CLAUDE__SONNET__4__20250514,
@@ -70,6 +74,35 @@ def askui_get_model() -> GetModel:
7074
)
7175

7276

77+
@pytest.fixture
78+
def gemini_flash_get_model() -> GetModel:
79+
return AskUiGeminiGetModel(
80+
model_id=ModelName.GEMINI__2_5__FLASH,
81+
settings=AskUiInferenceApiSettings(),
82+
)
83+
84+
85+
@pytest.fixture
86+
def gemini_pro_get_model() -> GetModel:
87+
return AskUiGeminiGetModel(
88+
model_id=ModelName.GEMINI__2_5__PRO,
89+
settings=AskUiInferenceApiSettings(),
90+
)
91+
92+
93+
@pytest.fixture
94+
def claude_get_model() -> GetModel:
95+
return AnthropicModel(
96+
model_id=ModelName.CLAUDE__SONNET__4__20250514,
97+
settings=AnthropicModelSettings(),
98+
messages_api=AnthropicMessagesApi(
99+
client=create_api_client(api_provider="anthropic"),
100+
locator_serializer=VlmLocatorSerializer(),
101+
),
102+
locator_serializer=VlmLocatorSerializer(),
103+
)
104+
105+
73106
@pytest.fixture
74107
def askui_locate_model(path_fixtures: pathlib.Path) -> LocateModel:
75108
reporter = SimpleHtmlReporter()
@@ -88,6 +121,78 @@ def askui_locate_model(path_fixtures: pathlib.Path) -> LocateModel:
88121
)
89122

90123

124+
@pytest.fixture
125+
def pta_locate_model(path_fixtures: pathlib.Path) -> LocateModel:
126+
reporter = SimpleHtmlReporter()
127+
locator_serializer = AskUiLocatorSerializer(
128+
ai_element_collection=AiElementCollection(
129+
additional_ai_element_locations=[path_fixtures / "images"]
130+
),
131+
reporter=reporter,
132+
)
133+
askui_inference_api = AskUiInferenceApi(
134+
settings=AskUiInferenceApiSettings(),
135+
)
136+
return AskUiPtaLocateModel(
137+
locator_serializer=locator_serializer,
138+
inference_api=askui_inference_api,
139+
)
140+
141+
142+
@pytest.fixture
143+
def ocr_locate_model(path_fixtures: pathlib.Path) -> LocateModel:
144+
reporter = SimpleHtmlReporter()
145+
locator_serializer = AskUiLocatorSerializer(
146+
ai_element_collection=AiElementCollection(
147+
additional_ai_element_locations=[path_fixtures / "images"]
148+
),
149+
reporter=reporter,
150+
)
151+
askui_inference_api = AskUiInferenceApi(
152+
settings=AskUiInferenceApiSettings(),
153+
)
154+
return AskUiOcrLocateModel(
155+
locator_serializer=locator_serializer,
156+
inference_api=askui_inference_api,
157+
)
158+
159+
160+
@pytest.fixture
161+
def ai_element_locate_model(path_fixtures: pathlib.Path) -> LocateModel:
162+
reporter = SimpleHtmlReporter()
163+
locator_serializer = AskUiLocatorSerializer(
164+
ai_element_collection=AiElementCollection(
165+
additional_ai_element_locations=[path_fixtures / "images"]
166+
),
167+
reporter=reporter,
168+
)
169+
askui_inference_api = AskUiInferenceApi(
170+
settings=AskUiInferenceApiSettings(),
171+
)
172+
return AskUiAiElementLocateModel(
173+
locator_serializer=locator_serializer,
174+
inference_api=askui_inference_api,
175+
)
176+
177+
178+
@pytest.fixture
179+
def combo_locate_model(path_fixtures: pathlib.Path) -> LocateModel:
180+
reporter = SimpleHtmlReporter()
181+
locator_serializer = AskUiLocatorSerializer(
182+
ai_element_collection=AiElementCollection(
183+
additional_ai_element_locations=[path_fixtures / "images"]
184+
),
185+
reporter=reporter,
186+
)
187+
askui_inference_api = AskUiInferenceApi(
188+
settings=AskUiInferenceApiSettings(),
189+
)
190+
return AskUiComboLocateModel(
191+
locator_serializer=locator_serializer,
192+
inference_api=askui_inference_api,
193+
)
194+
195+
91196
@functools.cache
92197
def vlm_locator_serializer() -> VlmLocatorSerializer:
93198
return VlmLocatorSerializer()

tests/e2e/agent/test_agent_offset.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,15 @@
33
from typing import TYPE_CHECKING
44
from unittest.mock import Mock
55

6-
import pytest
76
from PIL import Image as PILImage
87

98
from askui.agent import VisionAgent
109
from askui.locators import Element
11-
from askui.models import ModelName
1210

1311
if TYPE_CHECKING:
1412
from askui.models.models import Point
1513

1614

17-
@pytest.mark.parametrize(
18-
"model",
19-
[
20-
ModelName.ASKUI,
21-
],
22-
)
2315
class TestVisionAgentOffset:
2416
"""Test class for VisionAgent offset functionality."""
2517

@@ -43,7 +35,6 @@ def test_click_with_positive_offset(
4335
self,
4436
vision_agent: VisionAgent,
4537
github_login_screenshot: PILImage.Image,
46-
model: str,
4738
) -> None:
4839
"""Test clicking with positive offset (right and down)."""
4940
locator = "Forgot password?"
@@ -69,7 +60,6 @@ def test_click_with_negative_offset(
6960
self,
7061
vision_agent: VisionAgent,
7162
github_login_screenshot: PILImage.Image,
72-
model: str,
7363
) -> None:
7464
"""Test clicking with negative offset (left and up)."""
7565
locator = "Forgot password?"
@@ -95,7 +85,6 @@ def test_click_with_zero_offset(
9585
self,
9686
vision_agent: VisionAgent,
9787
github_login_screenshot: PILImage.Image,
98-
model: str,
9988
) -> None:
10089
"""Test clicking with zero offset (same as no offset)."""
10190
locator = "Forgot password?"
@@ -120,7 +109,6 @@ def test_click_with_point_locator_and_offset(
120109
self,
121110
vision_agent: VisionAgent,
122111
github_login_screenshot: PILImage.Image,
123-
model: str,
124112
) -> None:
125113
"""Test clicking with Point locator and offset."""
126114
point_locator: Point = (100, 100)
@@ -146,7 +134,6 @@ def test_mouse_move_with_positive_offset(
146134
self,
147135
vision_agent: VisionAgent,
148136
github_login_screenshot: PILImage.Image,
149-
model: str,
150137
) -> None:
151138
"""Test mouse movement with positive offset."""
152139
locator = "Forgot password?"
@@ -171,7 +158,6 @@ def test_mouse_move_with_negative_offset(
171158
self,
172159
vision_agent: VisionAgent,
173160
github_login_screenshot: PILImage.Image,
174-
model: str,
175161
) -> None:
176162
"""Test mouse movement with negative offset."""
177163
locator = "Forgot password?"
@@ -196,7 +182,6 @@ def test_mouse_move_with_point_locator_and_offset(
196182
self,
197183
vision_agent: VisionAgent,
198184
github_login_screenshot: PILImage.Image,
199-
model: str,
200185
) -> None:
201186
"""Test mouse movement with Point locator and offset."""
202187
point_locator: Point = (200, 150)
@@ -221,7 +206,6 @@ def test_type_with_positive_offset(
221206
self,
222207
vision_agent: VisionAgent,
223208
github_login_screenshot: PILImage.Image,
224-
model: str,
225209
) -> None:
226210
"""Test typing with positive offset."""
227211
locator = Element("textfield")
@@ -249,7 +233,6 @@ def test_type_with_negative_offset(
249233
self,
250234
vision_agent: VisionAgent,
251235
github_login_screenshot: PILImage.Image,
252-
model: str,
253236
) -> None:
254237
"""Test typing with negative offset."""
255238
locator = Element("textfield")
@@ -277,7 +260,6 @@ def test_type_with_point_locator_and_offset(
277260
self,
278261
vision_agent: VisionAgent,
279262
github_login_screenshot: PILImage.Image,
280-
model: str,
281263
) -> None:
282264
"""Test typing with Point locator and offset."""
283265
point_locator: Point = (460, 195) # Approximate textfield location

0 commit comments

Comments
 (0)