From 89ee9fff45815b45d2cab2f8109a398749d00cf3 Mon Sep 17 00:00:00 2001 From: philipph-askui Date: Mon, 21 Sep 2026 11:47:57 +0200 Subject: [PATCH] feat(models): switch default get() model from Gemini 2.5 to Gemini 3.5 Flash Gemini 2.5 (Flash, Flash-Lite, Pro) is being deprecated from the AskUI API. - Default `AskUiGeminiGetModel`, `AskUIImageQAProvider` and `GoogleImageQAProvider` to `gemini-3.5-flash` - Add `ModelName.GEMINI__3_5__FLASH` / `ASKUI__GEMINI__3_5__FLASH`; keep the 2.5 constants with a deprecation note for backwards compatibility - Update docstrings, docs and examples; drop `gemini-2.5-pro` since no 3.5 Pro is served by the proxy - Update e2e/unit tests to use 3.5 Flash and remove the gemini_pro params Co-Authored-By: Claude Fable 5.1 --- docs/04_using_models.md | 7 +- docs/05_bring_your_own_model_provider.md | 2 +- examples/model_providers.py | 6 +- src/askui/agent_settings.py | 2 +- .../askui_image_qa_provider.py | 6 +- .../google_image_qa_provider.py | 6 +- .../model_providers/image_qa_provider.py | 2 +- src/askui/models/askui/get_model.py | 4 +- src/askui/models/google/get_model.py | 2 +- src/askui/models/models.py | 6 ++ tests/e2e/agent/test_get.py | 81 +++++-------------- .../test_askui_vlm_provider.py | 8 +- 12 files changed, 47 insertions(+), 85 deletions(-) diff --git a/docs/04_using_models.md b/docs/04_using_models.md index 97d56cd9..5cf807a1 100644 --- a/docs/04_using_models.md +++ b/docs/04_using_models.md @@ -31,7 +31,7 @@ from askui.model_providers import AskUIVlmProvider, AskUIImageQAProvider with ComputerAgent(settings=AgentSettings( vlm_provider=AskUIVlmProvider(model_id="claude-opus-5"), - image_qa_provider=AskUIImageQAProvider(model_id="gemini-2.5-pro"), + image_qa_provider=AskUIImageQAProvider(model_id="gemini-3.5-flash"), )) as agent: agent.act("Complete the checkout process") ``` @@ -40,13 +40,12 @@ The following models are available with your AskUI credentials through the AskUI **VLM Provider** (for `act()`): - `claude-haiku-4-5-20251001` (most cost efficient) -- - `gemini-3.5-flash` (fastest) +- `gemini-3.5-flash` (fastest) - `claude-sonnet-5`(default) - `claude-opus-5` (most capable) **Image Q&A Provider** (for `get()`): Gemini models via AskUI's Gemini proxy -- `gemini-2.5-flash` (default) -- `gemini-2.5-pro` +- `gemini-3.5-flash` (default) You can find more details on the capabilities and limitations of the Anthropic Claude models [here](https://platform.claude.com/docs/en/about-claude/models/overview), and the Google Gemini models [here](https://modelcards.withgoogle.com/model-cards) diff --git a/docs/05_bring_your_own_model_provider.md b/docs/05_bring_your_own_model_provider.md index 071394ea..8c738c99 100644 --- a/docs/05_bring_your_own_model_provider.md +++ b/docs/05_bring_your_own_model_provider.md @@ -83,7 +83,7 @@ from askui.model_providers import GoogleImageQAProvider with ComputerAgent(settings=AgentSettings( image_qa_provider=GoogleImageQAProvider( - model_id="gemini-2.5-pro", + model_id="gemini-3.5-flash", ), )) as agent: agent.get("What is shown on the display") diff --git a/examples/model_providers.py b/examples/model_providers.py index 336d4ac6..218b2f9f 100644 --- a/examples/model_providers.py +++ b/examples/model_providers.py @@ -57,7 +57,7 @@ def create_askui_providers() -> AgentSettings: """Create settings using AskUI-hosted providers (default).""" return AgentSettings( vlm_provider=AskUIVlmProvider(model_id="claude-sonnet-4-5-20250929"), - image_qa_provider=AskUIImageQAProvider(model_id="gemini-2.5-flash"), + image_qa_provider=AskUIImageQAProvider(model_id="gemini-3.5-flash"), detection_provider=AskUIDetectionProvider(), ) @@ -87,7 +87,7 @@ def create_google_providers() -> AgentSettings: vlm_provider=AskUIVlmProvider(model_id="claude-sonnet-4-5-20250929"), image_qa_provider=GoogleImageQAProvider( api_key=api_key, - model_id="gemini-2.5-flash", + model_id="gemini-3.5-flash", ), detection_provider=AskUIDetectionProvider(), ) @@ -104,7 +104,7 @@ def create_mixed_providers() -> AgentSettings: # Google for fast image Q&A image_qa_provider=GoogleImageQAProvider( api_key=os.environ.get("GOOGLE_API_KEY", ""), - model_id="gemini-2.5-flash", + model_id="gemini-3.5-flash", ), # AskUI for element detection detection_provider=AskUIDetectionProvider(), diff --git a/src/askui/agent_settings.py b/src/askui/agent_settings.py index 68553c35..0609b4ed 100644 --- a/src/askui/agent_settings.py +++ b/src/askui/agent_settings.py @@ -154,7 +154,7 @@ class AgentSettings: agent = ComputerAgent(settings=AgentSettings( vlm_provider=AskUIVlmProvider(model_id=\"claude-opus-4-6\"), - image_qa_provider=AskUIImageQAProvider(model_id=\"gemini-2.5-pro\"), + image_qa_provider=AskUIImageQAProvider(model_id=\"gemini-3.5-flash\"), )) ``` """ diff --git a/src/askui/model_providers/askui_image_qa_provider.py b/src/askui/model_providers/askui_image_qa_provider.py index 7acbf091..c13c1141 100644 --- a/src/askui/model_providers/askui_image_qa_provider.py +++ b/src/askui/model_providers/askui_image_qa_provider.py @@ -13,7 +13,7 @@ from askui.models.types.response_schemas import ResponseSchema from askui.utils.source_utils import Source -_DEFAULT_MODEL_ID = "gemini-2.5-flash" +_DEFAULT_MODEL_ID = "gemini-3.5-flash" class AskUIImageQAProvider(ImageQAProvider): @@ -30,7 +30,7 @@ class AskUIImageQAProvider(ImageQAProvider): token (str | None, optional): AskUI API token. Reads `ASKUI_TOKEN` from the environment if not provided. model_id (str, optional): Gemini model to use. Defaults to - ``"gemini-2.5-flash"``. + ``"gemini-3.5-flash"``. get_model (AskUiGeminiGetModel | None, optional): Pre-configured get model. If provided, `workspace_id` and `token` are ignored. @@ -41,7 +41,7 @@ class AskUIImageQAProvider(ImageQAProvider): agent = ComputerAgent(settings=AgentSettings( image_qa_provider=AskUIImageQAProvider( - model_id="gemini-2.5-pro", + model_id="gemini-3.5-flash", ) )) ``` diff --git a/src/askui/model_providers/google_image_qa_provider.py b/src/askui/model_providers/google_image_qa_provider.py index d4e9dfa9..8358550a 100644 --- a/src/askui/model_providers/google_image_qa_provider.py +++ b/src/askui/model_providers/google_image_qa_provider.py @@ -14,7 +14,7 @@ from askui.models.types.response_schemas import ResponseSchema from askui.utils.source_utils import Source -_DEFAULT_MODEL_ID = "gemini-2.5-flash" +_DEFAULT_MODEL_ID = "gemini-3.5-flash" class GoogleImageQAProvider(ImageQAProvider): @@ -32,7 +32,7 @@ class GoogleImageQAProvider(ImageQAProvider): auth_token (str | None, optional): Authorization token for custom authentication. Added as an `Authorization` header. model_id (str, optional): Gemini model to use. Defaults to - `\"gemini-2.5-flash\"`. + `\"gemini-3.5-flash\"`. client (GenaiClient | None, optional): Pre-configured Google GenAI client. If provided, other connection parameters are ignored. @@ -44,7 +44,7 @@ class GoogleImageQAProvider(ImageQAProvider): agent = ComputerAgent(settings=AgentSettings( image_qa_provider=GoogleImageQAProvider( api_key=\"AIza...\", - model_id=\"gemini-2.5-pro\", + model_id=\"gemini-3.5-flash\", ) )) ``` diff --git a/src/askui/model_providers/image_qa_provider.py b/src/askui/model_providers/image_qa_provider.py index 2f58f872..6a74f601 100644 --- a/src/askui/model_providers/image_qa_provider.py +++ b/src/askui/model_providers/image_qa_provider.py @@ -24,7 +24,7 @@ class ImageQAProvider(ABC): provider = GoogleImageQAProvider( api_key="...", - model_id="gemini-2.5-flash", + model_id="gemini-3.5-flash", ) agent = ComputerAgent(settings=AgentSettings(image_qa_provider=provider)) ``` diff --git a/src/askui/models/askui/get_model.py b/src/askui/models/askui/get_model.py index 55a4df1a..3b353cfe 100644 --- a/src/askui/models/askui/get_model.py +++ b/src/askui/models/askui/get_model.py @@ -40,7 +40,7 @@ class AskUiGeminiGetModel(GetModel): """GetModel implementation using Google Gemini API (via AskUI proxy). Args: - model_id (str): The model identifier (default: GEMINI__2_5__FLASH). + model_id (str): The model identifier (default: GEMINI__3_5__FLASH). inference_api_settings (AskUiInferenceApiSettings | None, optional): API configuration for connecting to AskUI inference API. If None, uses default settings. @@ -51,7 +51,7 @@ class AskUiGeminiGetModel(GetModel): def __init__( self, - model_id: str = ModelName.GEMINI__2_5__FLASH, + model_id: str = ModelName.GEMINI__3_5__FLASH, inference_api_settings: AskUiInferenceApiSettings | None = None, get_settings: GetSettings | None = None, ) -> None: diff --git a/src/askui/models/google/get_model.py b/src/askui/models/google/get_model.py index 93f562e3..1d411608 100644 --- a/src/askui/models/google/get_model.py +++ b/src/askui/models/google/get_model.py @@ -33,7 +33,7 @@ class GoogleGetModel(GetModel): """GetModel implementation for Google Gemini models. Args: - model_id (str): The model identifier (e.g., "gemini-2.5-flash"). + model_id (str): The model identifier (e.g., "gemini-3.5-flash"). client (genai.Client): The Google GenAI client for creating messages. """ diff --git a/src/askui/models/models.py b/src/askui/models/models.py index 12c65fe9..993f4b2a 100644 --- a/src/askui/models/models.py +++ b/src/askui/models/models.py @@ -26,14 +26,20 @@ class ModelName: ASKUI = "askui" ASKUI__GEMINI__2_5__FLASH = "askui/gemini-2.5-flash" + """Deprecated: not served by the AskUI API. Use `ASKUI__GEMINI__3_5__FLASH`.""" ASKUI__GEMINI__2_5__PRO = "askui/gemini-2.5-pro" + """Deprecated: not served by the AskUI API. Use `ASKUI__GEMINI__3_5__FLASH`.""" + ASKUI__GEMINI__3_5__FLASH = "askui/gemini-3.5-flash" ASKUI__AI_ELEMENT = "askui-ai-element" ASKUI__COMBO = "askui-combo" ASKUI__OCR = "askui-ocr" ASKUI__PTA = "askui-pta" CLAUDE__SONNET__4__20250514 = "claude-sonnet-4-20250514" GEMINI__2_5__FLASH = "gemini-2.5-flash" + """Deprecated: not served by the AskUI API anymore. Use `GEMINI__3_5__FLASH`.""" GEMINI__2_5__PRO = "gemini-2.5-pro" + """Deprecated: not served by the AskUI API anymore. Use `GEMINI__3_5__FLASH`.""" + GEMINI__3_5__FLASH = "gemini-3.5-flash" HF__SPACES__ASKUI__PTA_1 = "AskUI/PTA-1" HF__SPACES__OS_COPILOT__OS_ATLAS_BASE_7B = "OS-Copilot/OS-Atlas-Base-7B" HF__SPACES__QWEN__QWEN2_VL_2B_INSTRUCT = "Qwen/Qwen2-VL-2B-Instruct" diff --git a/tests/e2e/agent/test_get.py b/tests/e2e/agent/test_get.py index b34aa67e..d8b081bd 100644 --- a/tests/e2e/agent/test_get.py +++ b/tests/e2e/agent/test_get.py @@ -65,25 +65,18 @@ class BrowserContextResponse(ResponseSchemaBase): pytest.param(None, id="default"), pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", ), pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="gemini_flash", ), - pytest.param( - AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__PRO, - inference_api_settings=AskUiInferenceApiSettings(), - ), - id="gemini_pro", - ), pytest.param( AnthropicGetModel( model_id=ModelName.CLAUDE__SONNET__4__20250514, @@ -126,18 +119,11 @@ def test_get( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="gemini_flash", ), - pytest.param( - AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__PRO, - inference_api_settings=AskUiInferenceApiSettings(), - ), - id="gemini_pro", - ), ], ) def test_get_with_pdf_with_gemini_model( @@ -163,18 +149,11 @@ def test_get_with_pdf_with_gemini_model( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="gemini_flash", ), - pytest.param( - AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__PRO, - inference_api_settings=AskUiInferenceApiSettings(), - ), - id="gemini_pro", - ), ], ) def test_get_with_pdf_too_large( @@ -214,18 +193,11 @@ def test_get_with_pdf_too_large_with_default_model( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="gemini_flash", ), - pytest.param( - AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__PRO, - inference_api_settings=AskUiInferenceApiSettings(), - ), - id="gemini_pro", - ), ], ) def test_get_with_xlsx_with_gemini_model( @@ -260,18 +232,11 @@ class SalaryResponse(ResponseSchemaBase): [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="gemini_flash", ), - pytest.param( - AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__PRO, - inference_api_settings=AskUiInferenceApiSettings(), - ), - id="gemini_pro", - ), ], ) def test_get_with_xlsx_with_gemini_model_with_response_schema( @@ -325,7 +290,7 @@ def test_get_with_fallback_model( github_login_screenshot: PILImage.Image, ) -> None: askui_get_model = AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ) with ComputerAgent( @@ -378,7 +343,7 @@ def test_get_with_response_schema_with_default_value( pytest.param(None, id="default"), pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -419,7 +384,7 @@ def test_get_with_response_schema( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -457,7 +422,7 @@ class LinkedListNode(ResponseSchemaBase): [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -490,7 +455,7 @@ def test_get_with_recursive_response_schema( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -520,14 +485,14 @@ def test_get_with_string_schema( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", ), pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="gemini_flash", @@ -558,7 +523,7 @@ def test_get_with_boolean_schema( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -589,7 +554,7 @@ def test_get_with_integer_schema( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -620,7 +585,7 @@ def test_get_with_float_schema( [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -653,7 +618,7 @@ class Basis(ResponseSchemaBase): [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -692,7 +657,7 @@ class BasisWithNestedRootModel(ResponseSchemaBase): [ pytest.param( AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__FLASH, + model_id=ModelName.GEMINI__3_5__FLASH, inference_api_settings=AskUiInferenceApiSettings(), ), id="askui", @@ -747,15 +712,7 @@ class PageDom(ResponseSchemaBase): @pytest.mark.parametrize( "get_model", - [ - pytest.param( - AskUiGeminiGetModel( - model_id=ModelName.GEMINI__2_5__PRO, - inference_api_settings=AskUiInferenceApiSettings(), - ), - id="gemini_pro", - ), - ], + [], ) def test_get_with_deeply_nested_response_schema_with_model_that_does_not_support_recursion( agent_os_mock_patch: ComputerAgentOS, # noqa: ARG001 diff --git a/tests/unit/model_providers/test_askui_vlm_provider.py b/tests/unit/model_providers/test_askui_vlm_provider.py index a3052632..a42bace8 100644 --- a/tests/unit/model_providers/test_askui_vlm_provider.py +++ b/tests/unit/model_providers/test_askui_vlm_provider.py @@ -44,7 +44,7 @@ def test_gemini_model_uses_openai_messages_api( ) -> None: provider = AskUIVlmProvider( askui_settings=askui_settings, - model_id="gemini-2.5-pro", + model_id="gemini-3.5-flash", ) assert isinstance(provider._messages_api, OpenAIMessagesApi) @@ -72,7 +72,7 @@ def test_gemini_client_targets_openai_proxy( ) -> None: provider = AskUIVlmProvider( askui_settings=askui_settings, - model_id="gemini-2.5-pro", + model_id="gemini-3.5-flash", ) api = provider._messages_api assert isinstance(api, OpenAIMessagesApi) @@ -97,7 +97,7 @@ def test_injected_openai_client_used_for_gemini( mock_client = MagicMock(spec=OpenAI) provider = AskUIVlmProvider( askui_settings=askui_settings, - model_id="gemini-2.5-pro", + model_id="gemini-3.5-flash", client=mock_client, ) api = provider._messages_api @@ -121,7 +121,7 @@ def test_gemini_prompt_augmented_with_coordinates( ) -> None: provider = AskUIVlmProvider( askui_settings=askui_settings, - model_id="gemini-2.5-pro", + model_id="gemini-3.5-flash", ) system = SystemPrompt(prompt="Base prompt.") rendered = str(provider.augment_system_prompt(system))