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
Dependency diagram
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
"""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,
),
}