diff --git a/README.md b/README.md index 3d43975f5..73e5a4092 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Let LLMs interact with websites through a simple interface. ## Short Example ```python -from src import Agent +from browser_use import Agent from langchain_openai import ChatOpenAI agent = Agent( @@ -92,7 +92,7 @@ You can persist the browser across multiple agents and chain them together. ```python from langchain_anthropic import ChatAnthropic -from src import Agent, Controller +from browser_use import Agent, Controller # Persist browser state across agents controller = Controller() diff --git a/src/README.md b/browser_use/README.md similarity index 100% rename from src/README.md rename to browser_use/README.md diff --git a/browser_use/__init__.py b/browser_use/__init__.py new file mode 100644 index 000000000..1987940a1 --- /dev/null +++ b/browser_use/__init__.py @@ -0,0 +1,6 @@ +from browser_use.agent.service import AgentService as Agent +from browser_use.browser.service import BrowserService as Browser +from browser_use.controller.service import ControllerService as Controller +from browser_use.dom.service import DomService + +__all__ = ['Agent', 'Browser', 'Controller', 'DomService'] diff --git a/src/agent/prompts.py b/browser_use/agent/prompts.py similarity index 98% rename from src/agent/prompts.py rename to browser_use/agent/prompts.py index 737abdc5f..7097f2fa8 100644 --- a/src/agent/prompts.py +++ b/browser_use/agent/prompts.py @@ -1,6 +1,6 @@ from langchain_core.messages import HumanMessage, SystemMessage -from src.controller.views import ControllerPageState +from browser_use.controller.views import ControllerPageState class AgentSystemPrompt: diff --git a/src/agent/service.py b/browser_use/agent/service.py similarity index 95% rename from src/agent/service.py rename to browser_use/agent/service.py index b198eb167..716942646 100644 --- a/src/agent/service.py +++ b/browser_use/agent/service.py @@ -5,17 +5,17 @@ from dotenv import load_dotenv from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.messages import AIMessage, BaseMessage, HumanMessage -from src.agent.prompts import AgentMessagePrompt, AgentSystemPrompt -from src.agent.views import ( +from browser_use.agent.prompts import AgentMessagePrompt, AgentSystemPrompt +from browser_use.agent.views import ( AgentHistory, AgentOutput, ClickElementControllerHistoryItem, InputTextControllerHistoryItem, Output, ) -from src.controller.service import ControllerService -from src.controller.views import ControllerActionResult, ControllerActions, ControllerPageState -from src.utils import time_execution_async +from browser_use.controller.service import ControllerService +from browser_use.controller.views import ControllerActionResult, ControllerActions, ControllerPageState +from browser_use.utils import time_execution_async load_dotenv() logger = logging.getLogger(__name__) diff --git a/src/agent/views.py b/browser_use/agent/views.py similarity index 96% rename from src/agent/views.py rename to browser_use/agent/views.py index ace6962fa..db4febf19 100644 --- a/src/agent/views.py +++ b/browser_use/agent/views.py @@ -2,7 +2,7 @@ from typing import Optional from pydantic import BaseModel -from src.controller.views import ( +from browser_use.controller.views import ( ClickElementControllerAction, ControllerActions, InputTextControllerAction, diff --git a/src/browser/service.py b/browser_use/browser/service.py similarity index 98% rename from src/browser/service.py rename to browser_use/browser/service.py index c0c029fb4..543e4fdc8 100644 --- a/src/browser/service.py +++ b/browser_use/browser/service.py @@ -20,9 +20,9 @@ from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from webdriver_manager.chrome import ChromeDriverManager -from src.browser.views import BrowserState -from src.dom.service import DomService -from src.utils import time_execution_sync +from browser_use.browser.views import BrowserState +from browser_use.dom.service import DomService +from browser_use.utils import time_execution_sync logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) diff --git a/src/browser/tests/screenshot_test.py b/browser_use/browser/tests/screenshot_test.py similarity index 93% rename from src/browser/tests/screenshot_test.py rename to browser_use/browser/tests/screenshot_test.py index 875a0fe5c..7fc30f95f 100644 --- a/src/browser/tests/screenshot_test.py +++ b/browser_use/browser/tests/screenshot_test.py @@ -1,7 +1,7 @@ import base64 import pytest -from src.browser.service import BrowserService +from browser_use.browser.service import BrowserService @pytest.fixture diff --git a/src/browser/views.py b/browser_use/browser/views.py similarity index 70% rename from src/browser/views.py rename to browser_use/browser/views.py index f14593fea..bbc24abde 100644 --- a/src/browser/views.py +++ b/browser_use/browser/views.py @@ -1,4 +1,4 @@ -from src.dom.views import ProcessedDomContent +from browser_use.dom.views import ProcessedDomContent # Exceptions diff --git a/src/controller/service.py b/browser_use/controller/service.py similarity index 92% rename from src/controller/service.py rename to browser_use/controller/service.py index 16e9f6603..e437a6d92 100644 --- a/src/controller/service.py +++ b/browser_use/controller/service.py @@ -1,7 +1,7 @@ -from src.browser.service import BrowserService -from src.browser.views import BrowserState -from src.controller.views import ControllerActionResult, ControllerActions, ControllerPageState -from src.utils import time_execution_sync +from browser_use.browser.service import BrowserService +from browser_use.browser.views import BrowserState +from browser_use.controller.views import ControllerActionResult, ControllerActions, ControllerPageState +from browser_use.utils import time_execution_sync class ControllerService: diff --git a/src/controller/views.py b/browser_use/controller/views.py similarity index 98% rename from src/controller/views.py rename to browser_use/controller/views.py index c4d5f3489..14ff29c07 100644 --- a/src/controller/views.py +++ b/browser_use/controller/views.py @@ -2,7 +2,7 @@ from typing import Literal, Optional from pydantic import BaseModel -from src.browser.views import BrowserState +from browser_use.browser.views import BrowserState class SearchGoogleControllerAction(BaseModel): diff --git a/src/dom/__init__.py b/browser_use/dom/__init__.py similarity index 100% rename from src/dom/__init__.py rename to browser_use/dom/__init__.py diff --git a/src/dom/service.py b/browser_use/dom/service.py similarity index 99% rename from src/dom/service.py rename to browser_use/dom/service.py index aa483e51b..c111ce312 100644 --- a/src/dom/service.py +++ b/browser_use/dom/service.py @@ -4,8 +4,8 @@ from bs4 import BeautifulSoup, NavigableString, PageElement, Tag from selenium import webdriver from selenium.webdriver.common.by import By -from src.dom.views import DomContentItem, ProcessedDomContent -from src.utils import time_execution_sync +from browser_use.dom.views import DomContentItem, ProcessedDomContent +from browser_use.utils import time_execution_sync logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) diff --git a/src/dom/tests/extraction_test.py b/browser_use/dom/tests/extraction_test.py similarity index 71% rename from src/dom/tests/extraction_test.py rename to browser_use/dom/tests/extraction_test.py index a3024e498..94154f676 100644 --- a/src/dom/tests/extraction_test.py +++ b/browser_use/dom/tests/extraction_test.py @@ -1,8 +1,8 @@ import time -from src.browser.service import BrowserService -from src.dom.service import DomService -from src.utils import time_execution_sync +from browser_use.browser.service import BrowserService +from browser_use.dom.service import DomService +from browser_use.utils import time_execution_sync # @pytest.mark.skip("slow af") diff --git a/src/dom/views.py b/browser_use/dom/views.py similarity index 100% rename from src/dom/views.py rename to browser_use/dom/views.py diff --git a/src/utils.py b/browser_use/utils.py similarity index 100% rename from src/utils.py rename to browser_use/utils.py diff --git a/examples/chain_of_agents.py b/examples/chain_of_agents.py index 8b48db403..0a55f96d8 100644 --- a/examples/chain_of_agents.py +++ b/examples/chain_of_agents.py @@ -8,9 +8,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import asyncio -from langchain_anthropic import ChatAnthropic - -from src import Agent, Controller +from browser_use import Agent, Controller logging.basicConfig(level=logging.INFO) diff --git a/examples/flight_search.py b/examples/flight_search.py index c4955d138..e950ae312 100644 --- a/examples/flight_search.py +++ b/examples/flight_search.py @@ -12,8 +12,8 @@ import asyncio from langchain_anthropic import ChatAnthropic from langchain_openai import ChatOpenAI -from src.agent.service import AgentService -from src.controller.service import ControllerService +from browser_use.agent.service import AgentService +from browser_use.controller.service import ControllerService task = 'Go to kayak.com and find a one-way flight from Zürich to San Francisco on 12 January 2025.' controller = ControllerService() diff --git a/examples/image_search.py b/examples/image_search.py index 196a0e705..aa7e16623 100644 --- a/examples/image_search.py +++ b/examples/image_search.py @@ -7,8 +7,8 @@ import asyncio from langchain_openai import ChatOpenAI -from src.agent.service import AgentService -from src.controller.service import ControllerService +from browser_use.agent.service import AgentService +from browser_use.controller.service import ControllerService people = ['Albert Einstein', 'Oprah Winfrey', 'Steve Jobs'] task = f'Opening new tabs and searching for images for these people: {", ".join(people)}. Then ask me for further instructions.' diff --git a/examples/simple_run.py b/examples/simple_run.py index 46ae51815..7f6f3afb9 100644 --- a/examples/simple_run.py +++ b/examples/simple_run.py @@ -8,7 +8,7 @@ import logging import os import sys -from src.controller.service import ControllerService +from browser_use.controller.service import ControllerService sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -16,7 +16,7 @@ import asyncio from langchain_openai import ChatOpenAI -from src import Agent +from browser_use import Agent logging.basicConfig(level=logging.INFO) diff --git a/examples/talent_kick_apply.py b/examples/talent_kick_apply.py index ba5e9f31c..a5dba799d 100644 --- a/examples/talent_kick_apply.py +++ b/examples/talent_kick_apply.py @@ -14,7 +14,7 @@ import asyncio from langchain_openai import ChatOpenAI -from src import Agent +from browser_use import Agent logging.basicConfig(level=logging.INFO) diff --git a/examples/try.py b/examples/try.py index 18a250a38..1f31f6429 100644 --- a/examples/try.py +++ b/examples/try.py @@ -16,8 +16,8 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import argparse import asyncio -from src import Agent -from src.controller.service import ControllerService +from browser_use import Agent +from browser_use.controller.service import ControllerService logging.basicConfig(level=logging.INFO) diff --git a/examples/wiki_search.py b/examples/wiki_search.py index 7fade2150..7d25f839c 100644 --- a/examples/wiki_search.py +++ b/examples/wiki_search.py @@ -7,8 +7,8 @@ import asyncio from langchain_anthropic import ChatAnthropic -from src.agent.service import AgentService -from src.controller.service import ControllerService +from browser_use.agent.service import AgentService +from browser_use.controller.service import ControllerService task = 'Open 3 wikipedia pages in different tabs and summarize the content of all pages.' controller = ControllerService() diff --git a/pyproject.toml b/pyproject.toml index 2eb540e1d..cdc95188e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,6 +4,7 @@ version = "0.1.0" description = "Open-Source Web Automation with LLMs" readme = "README.md" requires-python = ">=3.11" + dependencies = [] [tool.ruff] diff --git a/requirements.txt b/requirements.txt index bbffd86b7..7aa76e2f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,5 +11,4 @@ pytest-asyncio==0.24.0 python-dotenv==1.0.1 requests==2.32.3 selenium==4.26.1 -webdriver-manager==4.0.2 -setuptools==75.3.0 \ No newline at end of file +webdriver-manager==4.0.2 \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index 8cd1cccec..000000000 --- a/src/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from src.agent.service import AgentService as Agent -from src.browser.service import BrowserService as Browser -from src.controller.service import ControllerService as Controller - -__all__ = ['Agent', 'Browser', 'Controller']