orchestrata_ultimate.drivers.browser_providers

Reference › orchestrata_ultimate › drivers › browser_providers

browser_providers externalises the per-provider settings for the browser-based drivers so that browser_driver stays generic (SPEC-025, REQ-025-073 to REQ-025-079). BrowserProviderConfig is a frozen dataclass holding a display name, base and login URLs, CSS selectors for the input box, submit button, response, completion indicator and code blocks, a rate limit in seconds, a maximum session length in minutes and a timeout in seconds. BROWSER_PROVIDERS maps provider keys, including qwen_chat and deepseek_chat, to their configuration. get_provider_config looks one up by name. Adding a provider means adding an entry here and not changing the driver. Tests are in tests/drivers/test_browser_providers.py.

At a glance

Source src/orchestrata_ultimate/drivers/browser_providers.py
Lines of code 118
Classes 1
Functions 1
Imports (internal) orchestrata_ultimate.core.traceability
Imported by orchestrata_ultimate.drivers, orchestrata_ultimate.drivers.browser_driver
Tests that import it tests/drivers/test_browser_driver_extended.py, tests/drivers/test_browser_providers.py, tests/test_drivers.py

Class diagram

Class diagram orchestrata_ultimate.drivers.browser_providers

Dependency diagram

Dependency diagram orchestrata_ultimate.drivers.browser_providers

API

Constants

Name Type Value
BROWSER_PROVIDERS dict[str, BrowserProviderConfig] {'qwen_chat': BrowserProviderConfig(name='Qwen Chat', base_url='https://chat.qw…

Classes

BrowserProviderConfig (dataclass)

Decorators: traces(spec='025', reqs=['REQ-025-073', 'REQ-025-074']), dataclasses.dataclass(frozen=True) · Line 20

Configuration for a browser-based LLM provider.

Attribute Type Default
name str
base_url str
login_url str
input_selector str
submit_selector str
response_selector str
completion_indicator str
code_block_selector str
rate_limit_seconds int
max_session_minutes int
timeout_seconds int

Functions

Function Signature Summary
get_provider_config traces get_provider_config(provider: str) -> BrowserProviderConfig Look up a browser provider configuration by name.

Source

Permalink: https://gitlab.com/MSamy/orchestrata-ultimate-architecture/-/blob/a4cbc2bdf/src/orchestrata_ultimate/drivers/browser_providers.py

"""Browser provider configurations for free-tier LLM web UIs.

Externalizes CSS selectors, URLs, and rate limits for each
browser-based provider so the BrowserDriver stays generic.
"""

import dataclasses

from orchestrata_ultimate.core.traceability import traces


@traces(
    spec="025",
    reqs=[
        "REQ-025-073",
        "REQ-025-074",
    ],
)
@dataclasses.dataclass(frozen=True)
class BrowserProviderConfig:
    """Configuration for a browser-based LLM provider.

    Attributes:
        name: Human-readable provider name.
        base_url: Main chat page URL.
        login_url: Authentication page URL.
        input_selector: CSS selector for the prompt textarea.
        submit_selector: CSS selector for the submit button.
        response_selector: CSS selector for the response container.
        completion_indicator: CSS selector that appears when
            generation is complete.
        code_block_selector: CSS selector for code blocks in
            the response.
        rate_limit_seconds: Minimum seconds between requests.
        max_session_minutes: Maximum session duration before
            re-authentication.
        timeout_seconds: Per-request timeout in seconds.
    """

    name: str
    base_url: str
    login_url: str
    input_selector: str
    submit_selector: str
    response_selector: str
    completion_indicator: str
    code_block_selector: str
    rate_limit_seconds: int
    max_session_minutes: int
    timeout_seconds: int


@traces(
    spec="025",
    reqs=["REQ-025-076"],
)
def get_provider_config(provider: str) -> BrowserProviderConfig:
    """Look up a browser provider configuration by name.

    Args:
        provider: Provider key (qwen_chat, deepseek_chat, kimi).

    Returns:
        The matching BrowserProviderConfig.

    Raises:
        ValueError: If the provider name is not recognized.
    """
    if provider not in BROWSER_PROVIDERS:
        raise ValueError(
            f"Unknown browser provider '{provider}'. "
            f"Available: {list(BROWSER_PROVIDERS.keys())}"
        )
    return BROWSER_PROVIDERS[provider]


# traces: spec=025, reqs=REQ-025-077, REQ-025-078, REQ-025-079
BROWSER_PROVIDERS: dict[str, BrowserProviderConfig] = {
    "qwen_chat": BrowserProviderConfig(
        name="Qwen Chat",
        base_url="https://chat.qwen.ai",
        login_url="https://chat.qwen.ai/auth/login",
        input_selector="textarea[data-testid='chat-input'",
        submit_selector="button[data-testid='send-button'",
        response_selector="div.message-content",
        completion_indicator="div.message-content:last-child",
        code_block_selector="pre code",
        rate_limit_seconds=5,
        max_session_minutes=60,
        timeout_seconds=120,
    ),
    "deepseek_chat": BrowserProviderConfig(
        name="DeepSeek Chat",
        base_url="https://chat.deepseek.com",
        login_url="https://chat.deepseek.com/sign_in",
        input_selector="textarea#chat-input",
        submit_selector="div[class*='send'] button",
        response_selector="div.ds-markdown",
        completion_indicator="div.ds-markdown:last-child",
        code_block_selector="pre code",
        rate_limit_seconds=10,
        max_session_minutes=30,
        timeout_seconds=180,
    ),
    "kimi": BrowserProviderConfig(
        name="Kimi",
        base_url="https://kimi.moonshot.cn",
        login_url="https://kimi.moonshot.cn/auth/login",
        input_selector="textarea.chat-input",
        submit_selector="button.send-btn",
        response_selector="div.message-text",
        completion_indicator="div.message-text:last-child",
        code_block_selector="pre code",
        rate_limit_seconds=8,
        max_session_minutes=45,
        timeout_seconds=150,
    ),
}