Skip to content

Commit 648917b

Browse files
committed
feat: simplify model and model provider configuration
1 parent 90e26b9 commit 648917b

35 files changed

+1378
-923
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,19 @@ We'd love your help! Contributions, ideas, and feedback are always welcome. A pr
204204
## 📜 License
205205

206206
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
207+
208+
209+
210+
211+
212+
class AnthropicMessagesApiSettings(BaseModel):
213+
api_provider: ApiProvider = Field(
214+
default="askui",
215+
description="The API provider/platform to use for the model",
216+
validation_alias="ANTHROPIC_API_PROVIDER",
217+
)
218+
219+
@field_validator("api_provider", mode="before") # noqa: F821
220+
@classmethod
221+
def _normalize_api_provider(cls, v: Any) -> str:
222+
return v.lower() if isinstance(v, str) else v

pdm.lock

Lines changed: 545 additions & 85 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ authors = [
55
{name = "askui GmbH", email = "info@askui.com"},
66
]
77
dependencies = [
8-
"anthropic>=0.54.0",
8+
"anthropic>=0.72.0",
99
"fastapi>=0.115.12",
1010
"fastmcp>=2.3.0",
1111
"gradio-client>=1.4.3",
@@ -214,10 +214,13 @@ known-first-party = ["askui"]
214214
known-third-party = ["pytest", "mypy"]
215215

216216
[project.optional-dependencies]
217-
all = ["askui[android,chat,pynput,web]"]
217+
all = ["askui[android,bedrock,chat,pynput,vertex,web]"]
218218
android = [
219219
"pure-python-adb>=0.3.0.dev0"
220220
]
221+
bedrock = [
222+
"anthropic[bedrock]>=0.72.0"
223+
]
221224
chat = [
222225
"askui[android,web]",
223226
"uvicorn>=0.34.3",
@@ -231,6 +234,10 @@ pynput = [
231234
"mss>=10.0.0",
232235
"pynput>=1.8.1",
233236
]
237+
vertex = [
238+
"google-cloud-aiplatform>=1.122.0",
239+
"anthropic[vertex]>=0.72.0",
240+
]
234241
web = [
235242
"playwright>=1.41.0",
236243
]

src/askui/agent.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,6 @@
2929

3030
logger = logging.getLogger(__name__)
3131

32-
_CLAUDE__SONNET__4__20250514__ACT_SETTINGS = ActSettings(
33-
messages=MessageSettings(
34-
model=ModelName.CLAUDE__SONNET__4__20250514,
35-
system=COMPUTER_AGENT_SYSTEM_PROMPT,
36-
betas=[COMPUTER_USE_20250124_BETA_FLAG],
37-
thinking={"type": "enabled", "budget_tokens": 2048},
38-
),
39-
)
40-
4132

4233
class VisionAgent(AgentBase):
4334
"""
@@ -76,6 +67,7 @@ def __init__(
7667
retry: Retry | None = None,
7768
models: ModelRegistry | None = None,
7869
act_tools: list[Tool] | None = None,
70+
model_provider: str | None = None,
7971
) -> None:
8072
reporter = CompositeReporter(reporters=reporters)
8173
self.tools = tools or AgentToolbox(
@@ -97,6 +89,7 @@ def __init__(
9789
]
9890
+ (act_tools or []),
9991
agent_os=self.tools.os,
92+
model_provider=model_provider,
10093
)
10194

10295
@telemetry.record_call(exclude={"locator"})
@@ -370,11 +363,13 @@ def mouse_down(
370363

371364
@override
372365
def _get_default_settings_for_act(self, model_choice: str) -> ActSettings:
373-
match model_choice:
374-
case ModelName.CLAUDE__SONNET__4__20250514 | ModelName.ASKUI:
375-
return _CLAUDE__SONNET__4__20250514__ACT_SETTINGS
376-
case _:
377-
return ActSettings()
366+
return ActSettings(
367+
messages=MessageSettings(
368+
system=COMPUTER_AGENT_SYSTEM_PROMPT,
369+
betas=[COMPUTER_USE_20250124_BETA_FLAG],
370+
thinking={"type": "enabled", "budget_tokens": 2048},
371+
),
372+
)
378373

379374
@override
380375
def _get_default_tools_for_act(self, model_choice: str) -> list[Tool]:

src/askui/agent_base.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def __init__(
4747
models: ModelRegistry | None,
4848
tools: list[Tool] | None,
4949
agent_os: AgentOs | AndroidAgentOs,
50+
model_provider: str | None,
5051
) -> None:
5152
load_dotenv()
5253
self._reporter = reporter
@@ -56,8 +57,8 @@ def __init__(
5657
self._model_router = self._init_model_router(
5758
reporter=self._reporter,
5859
models=models or {},
60+
model_provider=model_provider,
5961
)
60-
self.model = model
6162
self._retry = retry or ConfigurableRetry(
6263
strategy="Exponential",
6364
base_delay=1000,
@@ -73,6 +74,7 @@ def _init_model_router(
7374
self,
7475
reporter: Reporter,
7576
models: ModelRegistry,
77+
model_provider: str | None,
7678
) -> ModelRouter:
7779
_models = initialize_default_model_registry(
7880
reporter=reporter,
@@ -81,6 +83,7 @@ def _init_model_router(
8183
return ModelRouter(
8284
reporter=reporter,
8385
models=_models,
86+
provider=model_provider,
8487
)
8588

8689
def _init_model_choice(
@@ -98,18 +101,18 @@ def _init_model_choice(
98101
"""
99102
if isinstance(model_choice, ModelComposition):
100103
return {
101-
"act": ModelName.ASKUI,
104+
"act": ModelName.CLAUDE__SONNET__4__20250514,
102105
"get": ModelName.ASKUI,
103106
"locate": model_choice,
104107
}
105108
if isinstance(model_choice, str) or model_choice is None:
106109
return {
107-
"act": model_choice or ModelName.ASKUI,
110+
"act": model_choice or ModelName.CLAUDE__SONNET__4__20250514,
108111
"get": model_choice or ModelName.ASKUI,
109112
"locate": model_choice or ModelName.ASKUI,
110113
}
111114
return {
112-
"act": model_choice.get("act", ModelName.ASKUI),
115+
"act": model_choice.get("act", ModelName.CLAUDE__SONNET__4__20250514),
113116
"get": model_choice.get("get", ModelName.ASKUI),
114117
"locate": model_choice.get("locate", ModelName.ASKUI),
115118
}
@@ -178,7 +181,7 @@ def act(
178181
_tools = self._build_tools(tools, model_choice)
179182
self._model_router.act(
180183
messages=messages,
181-
model_choice=model_choice,
184+
model=model_choice,
182185
on_message=on_message,
183186
settings=_settings,
184187
tools=_tools,
@@ -359,7 +362,7 @@ def locate_with_screenshot() -> PointList:
359362
return self._model_router.locate(
360363
screenshot=_screenshot,
361364
locator=locator,
362-
model_choice=model or self._model_choice["locate"],
365+
model=model or self._model_choice["locate"],
363366
)
364367

365368
points = self._retry.attempt(locate_with_screenshot)

src/askui/android_agent.py

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,12 @@
3030
from askui.tools.exception_tool import ExceptionTool
3131

3232
from .models import ModelComposition
33-
from .models.models import ModelChoice, ModelName, ModelRegistry, Point
33+
from .models.models import ModelChoice, ModelRegistry, Point
3434
from .reporting import CompositeReporter, Reporter
3535
from .retry import Retry
3636

3737
logger = logging.getLogger(__name__)
3838

39-
_CLAUDE__SONNET__4__20250514__ACT_SETTINGS = ActSettings(
40-
messages=MessageSettings(
41-
model=ModelName.CLAUDE__SONNET__4__20250514,
42-
system=ANDROID_AGENT_SYSTEM_PROMPT,
43-
thinking={"type": "enabled", "budget_tokens": 2048},
44-
betas=[],
45-
),
46-
)
47-
4839

4940
class AndroidVisionAgent(AgentBase):
5041
@telemetry.record_call(exclude={"model_router", "reporters", "tools"})
@@ -55,6 +46,7 @@ def __init__(
5546
model: ModelChoice | ModelComposition | str | None = None,
5647
retry: Retry | None = None,
5748
models: ModelRegistry | None = None,
49+
model_provider: str | None = None,
5850
) -> None:
5951
self.os = PpadbAgentOs()
6052
reporter = CompositeReporter(reporters=reporters)
@@ -81,6 +73,7 @@ def __init__(
8173
ExceptionTool(),
8274
],
8375
agent_os=self.os,
76+
model_provider=model_provider,
8477
)
8578

8679
@overload
@@ -317,8 +310,10 @@ def set_device_by_serial_number(
317310

318311
@override
319312
def _get_default_settings_for_act(self, model_choice: str) -> ActSettings:
320-
match model_choice:
321-
case ModelName.CLAUDE__SONNET__4__20250514 | ModelName.ASKUI:
322-
return _CLAUDE__SONNET__4__20250514__ACT_SETTINGS
323-
case _:
324-
return ActSettings()
313+
return ActSettings(
314+
messages=MessageSettings(
315+
system=ANDROID_AGENT_SYSTEM_PROMPT,
316+
thinking={"type": "enabled", "budget_tokens": 2048},
317+
betas=[],
318+
),
319+
)

src/askui/chat/api/runs/runner/runner.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,12 @@ def _run_agent_inner() -> None:
150150
custom_agent = CustomAgent()
151151
custom_agent.act(
152152
messages,
153-
model=ModelName.ASKUI,
153+
model=model,
154154
on_message=on_message,
155155
tools=tools,
156156
settings=ActSettings(
157157
messages=MessageSettings(
158158
betas=betas,
159-
model=model,
160159
system=system,
161160
thinking={"type": "enabled", "budget_tokens": 4096},
162161
max_tokens=8192,

src/askui/custom_agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def act(
4343
_tools = self._build_tools(tools)
4444
self._model_router.act(
4545
messages=messages,
46-
model_choice=model or ModelName.CLAUDE__SONNET__4__20250514,
46+
model=model or ModelName.CLAUDE__SONNET__4__20250514,
4747
on_message=on_message,
4848
settings=_settings,
4949
tools=_tools,

src/askui/data_extractor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def get(
8686
source=_source,
8787
query=query,
8888
response_schema=response_schema,
89-
model_choice=model,
89+
model=model,
9090
)
9191
message_content = (
9292
str(response)

src/askui/exceptions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from .models.exceptions import (
33
AutomationError,
44
ElementNotFoundError,
5-
ModelNotFoundError,
65
ModelTypeMismatchError,
6+
ProviderNotFoundError,
77
QueryNoResponseError,
88
QueryUnexpectedResponseError,
99
)
@@ -16,7 +16,7 @@
1616
"ConflictError",
1717
"ElementNotFoundError",
1818
"NotFoundError",
19-
"ModelNotFoundError",
19+
"ProviderNotFoundError",
2020
"ModelTypeMismatchError",
2121
"QueryNoResponseError",
2222
"QueryUnexpectedResponseError",

0 commit comments

Comments
 (0)