Spaces:
Sleeping
Sleeping
| """ | |
| We have switched all of our code from langchain to openai.types.chat.chat_completion_message_param. | |
| For easier transition we have | |
| """ | |
| from typing import TYPE_CHECKING | |
| # Lightweight imports that are commonly used | |
| from browser_use.llm.base import BaseChatModel | |
| from browser_use.llm.messages import ( | |
| AssistantMessage, | |
| BaseMessage, | |
| SystemMessage, | |
| UserMessage, | |
| ) | |
| from browser_use.llm.messages import ( | |
| ContentPartImageParam as ContentImage, | |
| ) | |
| from browser_use.llm.messages import ( | |
| ContentPartRefusalParam as ContentRefusal, | |
| ) | |
| from browser_use.llm.messages import ( | |
| ContentPartTextParam as ContentText, | |
| ) | |
| # Type stubs for lazy imports | |
| if TYPE_CHECKING: | |
| from browser_use.llm.anthropic.chat import ChatAnthropic | |
| from browser_use.llm.aws.chat_anthropic import ChatAnthropicBedrock | |
| from browser_use.llm.aws.chat_bedrock import ChatAWSBedrock | |
| from browser_use.llm.azure.chat import ChatAzureOpenAI | |
| from browser_use.llm.browser_use.chat import ChatBrowserUse | |
| from browser_use.llm.cerebras.chat import ChatCerebras | |
| from browser_use.llm.deepseek.chat import ChatDeepSeek | |
| from browser_use.llm.google.chat import ChatGoogle | |
| from browser_use.llm.groq.chat import ChatGroq | |
| from browser_use.llm.oci_raw.chat import ChatOCIRaw | |
| from browser_use.llm.ollama.chat import ChatOllama | |
| from browser_use.llm.openai.chat import ChatOpenAI | |
| from browser_use.llm.openrouter.chat import ChatOpenRouter | |
| # Type stubs for model instances - enables IDE autocomplete | |
| openai_gpt_4o: ChatOpenAI | |
| openai_gpt_4o_mini: ChatOpenAI | |
| openai_gpt_4_1_mini: ChatOpenAI | |
| openai_o1: ChatOpenAI | |
| openai_o1_mini: ChatOpenAI | |
| openai_o1_pro: ChatOpenAI | |
| openai_o3: ChatOpenAI | |
| openai_o3_mini: ChatOpenAI | |
| openai_o3_pro: ChatOpenAI | |
| openai_o4_mini: ChatOpenAI | |
| openai_gpt_5: ChatOpenAI | |
| openai_gpt_5_mini: ChatOpenAI | |
| openai_gpt_5_nano: ChatOpenAI | |
| azure_gpt_4o: ChatAzureOpenAI | |
| azure_gpt_4o_mini: ChatAzureOpenAI | |
| azure_gpt_4_1_mini: ChatAzureOpenAI | |
| azure_o1: ChatAzureOpenAI | |
| azure_o1_mini: ChatAzureOpenAI | |
| azure_o1_pro: ChatAzureOpenAI | |
| azure_o3: ChatAzureOpenAI | |
| azure_o3_mini: ChatAzureOpenAI | |
| azure_o3_pro: ChatAzureOpenAI | |
| azure_gpt_5: ChatAzureOpenAI | |
| azure_gpt_5_mini: ChatAzureOpenAI | |
| google_gemini_2_0_flash: ChatGoogle | |
| google_gemini_2_0_pro: ChatGoogle | |
| google_gemini_2_5_pro: ChatGoogle | |
| google_gemini_2_5_flash: ChatGoogle | |
| google_gemini_2_5_flash_lite: ChatGoogle | |
| # Models are imported on-demand via __getattr__ | |
| # Lazy imports mapping for heavy chat models | |
| _LAZY_IMPORTS = { | |
| 'ChatAnthropic': ('browser_use.llm.anthropic.chat', 'ChatAnthropic'), | |
| 'ChatAnthropicBedrock': ('browser_use.llm.aws.chat_anthropic', 'ChatAnthropicBedrock'), | |
| 'ChatAWSBedrock': ('browser_use.llm.aws.chat_bedrock', 'ChatAWSBedrock'), | |
| 'ChatAzureOpenAI': ('browser_use.llm.azure.chat', 'ChatAzureOpenAI'), | |
| 'ChatBrowserUse': ('browser_use.llm.browser_use.chat', 'ChatBrowserUse'), | |
| 'ChatCerebras': ('browser_use.llm.cerebras.chat', 'ChatCerebras'), | |
| 'ChatDeepSeek': ('browser_use.llm.deepseek.chat', 'ChatDeepSeek'), | |
| 'ChatGoogle': ('browser_use.llm.google.chat', 'ChatGoogle'), | |
| 'ChatGroq': ('browser_use.llm.groq.chat', 'ChatGroq'), | |
| 'ChatOCIRaw': ('browser_use.llm.oci_raw.chat', 'ChatOCIRaw'), | |
| 'ChatOllama': ('browser_use.llm.ollama.chat', 'ChatOllama'), | |
| 'ChatOpenAI': ('browser_use.llm.openai.chat', 'ChatOpenAI'), | |
| 'ChatOpenRouter': ('browser_use.llm.openrouter.chat', 'ChatOpenRouter'), | |
| } | |
| # Cache for model instances - only created when accessed | |
| _model_cache: dict[str, 'BaseChatModel'] = {} | |
| def __getattr__(name: str): | |
| """Lazy import mechanism for heavy chat model imports and model instances.""" | |
| if name in _LAZY_IMPORTS: | |
| module_path, attr_name = _LAZY_IMPORTS[name] | |
| try: | |
| from importlib import import_module | |
| module = import_module(module_path) | |
| attr = getattr(module, attr_name) | |
| return attr | |
| except ImportError as e: | |
| raise ImportError(f'Failed to import {name} from {module_path}: {e}') from e | |
| # Check cache first for model instances | |
| if name in _model_cache: | |
| return _model_cache[name] | |
| # Try to get model instances from models module on-demand | |
| try: | |
| from browser_use.llm.models import __getattr__ as models_getattr | |
| attr = models_getattr(name) | |
| # Cache in our clean cache dict | |
| _model_cache[name] = attr | |
| return attr | |
| except (AttributeError, ImportError): | |
| pass | |
| raise AttributeError(f"module '{__name__}' has no attribute '{name}'") | |
| __all__ = [ | |
| # Message types -> for easier transition from langchain | |
| 'BaseMessage', | |
| 'UserMessage', | |
| 'SystemMessage', | |
| 'AssistantMessage', | |
| # Content parts with better names | |
| 'ContentText', | |
| 'ContentRefusal', | |
| 'ContentImage', | |
| # Chat models | |
| 'BaseChatModel', | |
| 'ChatOpenAI', | |
| 'ChatBrowserUse', | |
| 'ChatDeepSeek', | |
| 'ChatGoogle', | |
| 'ChatAnthropic', | |
| 'ChatAnthropicBedrock', | |
| 'ChatAWSBedrock', | |
| 'ChatGroq', | |
| 'ChatAzureOpenAI', | |
| 'ChatOCIRaw', | |
| 'ChatOllama', | |
| 'ChatOpenRouter', | |
| 'ChatCerebras', | |
| ] | |