diff --git a/.fernignore b/.fernignore index 077fcb3..19bc7e0 100644 --- a/.fernignore +++ b/.fernignore @@ -2,9 +2,9 @@ .gitignore .vscode/ -src/browser_use/client.py -src/browser_use/lib/ -src/browser_use/wrapper/ +src/browser_use_sdk/client.py +src/browser_use_sdk/lib/ +src/browser_use_sdk/wrapper/ examples/ assets/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9818c03..66780cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,27 +35,3 @@ jobs: - name: Test run: poetry run pytest -rP . - - publish: - needs: [compile, test] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - name: Set up python - uses: actions/setup-python@v4 - with: - python-version: 3.8 - - name: Bootstrap poetry - run: | - curl -sSL https://install.python-poetry.org | python - -y --version 1.5.1 - - name: Install dependencies - run: poetry install - - name: Publish to pypi - run: | - poetry config repositories.remote https://upload.pypi.org/legacy/ - poetry --no-interaction -v publish --build --repository remote --username "$PYPI_USERNAME" --password "$PYPI_PASSWORD" - env: - PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} - PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} diff --git a/README.md b/README.md index 568c694..9770dec 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,13 @@ The BrowserUse Python library provides convenient access to the BrowserUse APIs 1. 🦄 Automate the Internet! ```python - from browser_use_sdk import BrowserUseClient + from browser_use_sdk import BrowserUse - client = BrowserUseClient(api_key="bu_...") + client = BrowserUse(api_key="bu_...") task = client.tasks.create_task( - task="Search for the top 10 Hacker News posts and return the title and url." - llm="gpt-4.1", + task="Search for the top 10 Hacker News posts and return the title and url.", + llm="gpt-4.1" ) result = task.complete() @@ -48,6 +48,10 @@ The BrowserUse Python library provides convenient access to the BrowserUse APIs Browser Use Python SDK provides first class support for Pydantic models. ```py +from browser_use_sdk import AsyncBrowserUse + +client = AsyncBrowserUse(api_key=API_KEY) + class HackerNewsPost(BaseModel): title: str url: str diff --git a/examples/async_retrieve.py b/examples/async_retrieve.py index 82f19b7..a8e5b86 100755 --- a/examples/async_retrieve.py +++ b/examples/async_retrieve.py @@ -6,7 +6,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import AsyncBrowserUse +from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse(api_key=API_KEY) diff --git a/examples/async_run.py b/examples/async_run.py index e0b6c9a..0afc80d 100755 --- a/examples/async_run.py +++ b/examples/async_run.py @@ -6,7 +6,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import AsyncBrowserUse +from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse(api_key=API_KEY) diff --git a/examples/async_stream.py b/examples/async_stream.py index 244e792..1e3eb12 100755 --- a/examples/async_stream.py +++ b/examples/async_stream.py @@ -6,7 +6,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import AsyncBrowserUse +from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse(api_key=API_KEY) diff --git a/examples/async_watch.py b/examples/async_watch.py index d62f5b6..51caa63 100755 --- a/examples/async_watch.py +++ b/examples/async_watch.py @@ -6,7 +6,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import AsyncBrowserUse +from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse(api_key=API_KEY) diff --git a/examples/retrieve.py b/examples/retrieve.py index 121adbe..71e2d46 100755 --- a/examples/retrieve.py +++ b/examples/retrieve.py @@ -6,7 +6,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse(api_key=API_KEY) diff --git a/examples/run.py b/examples/run.py index 8f4fc50..8aada22 100755 --- a/examples/run.py +++ b/examples/run.py @@ -5,7 +5,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse(api_key=API_KEY) diff --git a/examples/stream.py b/examples/stream.py index e90ad66..76e8a26 100755 --- a/examples/stream.py +++ b/examples/stream.py @@ -5,7 +5,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse(api_key=API_KEY) diff --git a/examples/watch.py b/examples/watch.py index b8fb454..75e9425 100755 --- a/examples/watch.py +++ b/examples/watch.py @@ -5,7 +5,7 @@ from api import API_KEY from pydantic import BaseModel -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse(api_key=API_KEY) diff --git a/examples/webhooks.py b/examples/webhooks.py index a26a29c..900fac8 100755 --- a/examples/webhooks.py +++ b/examples/webhooks.py @@ -3,7 +3,7 @@ from datetime import datetime from typing import Any, Dict, Tuple -from browser_use.lib.webhooks import ( +from browser_use_sdk.lib.webhooks import ( Webhook, WebhookAgentTaskStatusUpdate, WebhookAgentTaskStatusUpdatePayload, diff --git a/pyproject.toml b/pyproject.toml index a08a197..9880f0b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ [project] -name = "browser-use-sdk" +name = "browser-use" [tool.poetry] -name = "browser-use-sdk" -version = "2.0.1" +name = "browser-use" +version = "0.0.0" description = "" readme = "README.md" authors = [] @@ -27,7 +27,7 @@ classifiers = [ "Typing :: Typed" ] packages = [ - { include = "browser_use", from = "src"} + { include = "browser_use_sdk", from = "src"} ] [project.urls] diff --git a/reference.md b/reference.md index 33df870..d7b1ab3 100644 --- a/reference.md +++ b/reference.md @@ -1,6 +1,6 @@ # Reference ## Accounts -
client.accounts.get_account_me() +
client.accounts.get_account_me()
@@ -27,7 +27,7 @@ Get authenticated account information including credit balances and account deta
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -61,7 +61,7 @@ client.accounts.get_account_me()
## Tasks -
client.tasks.list_tasks(...) +
client.tasks.list_tasks(...)
@@ -88,7 +88,7 @@ Get paginated list of AI agent tasks with optional filtering by session and stat
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -169,7 +169,7 @@ client.tasks.list_tasks()
-
client.tasks.create_task(...) +
client.tasks.create_task(...)
@@ -198,7 +198,7 @@ You can either:
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -345,7 +345,7 @@ client.tasks.create_task(
-
client.tasks.get_task(...) +
client.tasks.get_task(...)
@@ -372,7 +372,7 @@ Get detailed task information including status, progress, steps, and file output
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -415,7 +415,7 @@ client.tasks.get_task(
-
client.tasks.update_task(...) +
client.tasks.update_task(...)
@@ -442,7 +442,7 @@ Control task execution with stop, pause, resume, or stop task and session action
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -494,7 +494,7 @@ client.tasks.update_task(
-
client.tasks.get_task_logs(...) +
client.tasks.get_task_logs(...)
@@ -521,7 +521,7 @@ Get secure download URL for task execution logs with step-by-step details.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -565,7 +565,7 @@ client.tasks.get_task_logs(
## Sessions -
client.sessions.list_sessions(...) +
client.sessions.list_sessions(...)
@@ -592,7 +592,7 @@ Get paginated list of AI agent sessions with optional status filtering.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -649,7 +649,7 @@ client.sessions.list_sessions()
-
client.sessions.create_session(...) +
client.sessions.create_session(...)
@@ -676,7 +676,7 @@ Create a new session with a new task.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -725,7 +725,7 @@ client.sessions.create_session()
-
client.sessions.get_session(...) +
client.sessions.get_session(...)
@@ -752,7 +752,7 @@ Get detailed session information including status, URLs, and task details.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -795,7 +795,7 @@ client.sessions.get_session(
-
client.sessions.delete_session(...) +
client.sessions.delete_session(...)
@@ -822,7 +822,7 @@ Permanently delete a session and all associated data.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -865,7 +865,7 @@ client.sessions.delete_session(
-
client.sessions.update_session(...) +
client.sessions.update_session(...)
@@ -892,7 +892,7 @@ Stop a session and all its running tasks.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -935,7 +935,7 @@ client.sessions.update_session(
-
client.sessions.get_session_public_share(...) +
client.sessions.get_session_public_share(...)
@@ -962,7 +962,7 @@ Get public share information including URL and usage statistics.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1005,7 +1005,7 @@ client.sessions.get_session_public_share(
-
client.sessions.create_session_public_share(...) +
client.sessions.create_session_public_share(...)
@@ -1032,7 +1032,7 @@ Create or return existing public share for a session.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1075,7 +1075,7 @@ client.sessions.create_session_public_share(
-
client.sessions.delete_session_public_share(...) +
client.sessions.delete_session_public_share(...)
@@ -1102,7 +1102,7 @@ Remove public share for a session.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1146,7 +1146,7 @@ client.sessions.delete_session_public_share(
## Files -
client.files.user_upload_file_presigned_url(...) +
client.files.user_upload_file_presigned_url(...)
@@ -1173,7 +1173,7 @@ Generate a secure presigned URL for uploading files that AI agents can use durin
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1243,7 +1243,7 @@ client.files.user_upload_file_presigned_url(
-
client.files.get_task_output_file_presigned_url(...) +
client.files.get_task_output_file_presigned_url(...)
@@ -1270,7 +1270,7 @@ Get secure download URL for an output file generated by the AI agent.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1323,7 +1323,7 @@ client.files.get_task_output_file_presigned_url(
## Profiles -
client.profiles.list_profiles(...) +
client.profiles.list_profiles(...)
@@ -1350,7 +1350,7 @@ Get paginated list of profiles.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1399,7 +1399,7 @@ client.profiles.list_profiles()
-
client.profiles.create_profile() +
client.profiles.create_profile()
@@ -1431,7 +1431,7 @@ You can create a new profile by calling this endpoint.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1464,7 +1464,7 @@ client.profiles.create_profile()
-
client.profiles.get_profile(...) +
client.profiles.get_profile(...)
@@ -1491,7 +1491,7 @@ Get profile details.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -1534,7 +1534,7 @@ client.profiles.get_profile(
-
client.profiles.delete_browser_profile(...) +
client.profiles.delete_browser_profile(...)
@@ -1561,7 +1561,7 @@ Permanently delete a browser profile and its configuration.
```python -from browser_use import BrowserUse +from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", diff --git a/src/browser_use/__init__.py b/src/browser_use/__init__.py deleted file mode 100644 index b415d1a..0000000 --- a/src/browser_use/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -# isort: skip_file - -from . import accounts, files, profiles, sessions, tasks -from .client import AsyncBrowserUse, BrowserUse -from .version import __version__ - -__all__ = ["AsyncBrowserUse", "BrowserUse", "__version__", "accounts", "files", "profiles", "sessions", "tasks"] diff --git a/src/browser_use/core/__init__.py b/src/browser_use/core/__init__.py deleted file mode 100644 index 73955ba..0000000 --- a/src/browser_use/core/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -# isort: skip_file - -from .file import File, with_content_type - -__all__ = ["File", "with_content_type"] diff --git a/src/browser_use/version.py b/src/browser_use/version.py deleted file mode 100644 index ef9d625..0000000 --- a/src/browser_use/version.py +++ /dev/null @@ -1,3 +0,0 @@ -from importlib import metadata - -__version__ = metadata.version("browser-use-sdk") diff --git a/src/browser_use_sdk/__init__.py b/src/browser_use_sdk/__init__.py new file mode 100644 index 0000000..5794a32 --- /dev/null +++ b/src/browser_use_sdk/__init__.py @@ -0,0 +1,43 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from . import accounts, files, profiles, sessions, tasks + from .client import AsyncBrowserUse, BrowserUse + from .version import __version__ +_dynamic_imports: typing.Dict[str, str] = { + "AsyncBrowserUse": ".client", + "BrowserUse": ".client", + "__version__": ".version", + "accounts": ".", + "files": ".", + "profiles": ".", + "sessions": ".", + "tasks": ".", +} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + result = getattr(module, attr_name) + return result + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = ["AsyncBrowserUse", "BrowserUse", "__version__", "accounts", "files", "profiles", "sessions", "tasks"] diff --git a/src/browser_use/accounts/__init__.py b/src/browser_use_sdk/accounts/__init__.py similarity index 100% rename from src/browser_use/accounts/__init__.py rename to src/browser_use_sdk/accounts/__init__.py diff --git a/src/browser_use/accounts/client.py b/src/browser_use_sdk/accounts/client.py similarity index 96% rename from src/browser_use/accounts/client.py rename to src/browser_use_sdk/accounts/client.py index ba05a0e..d8dbf84 100644 --- a/src/browser_use/accounts/client.py +++ b/src/browser_use_sdk/accounts/client.py @@ -39,7 +39,7 @@ def get_account_me(self, *, request_options: typing.Optional[RequestOptions] = N Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -83,7 +83,7 @@ async def get_account_me(self, *, request_options: typing.Optional[RequestOption -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", diff --git a/src/browser_use/accounts/raw_client.py b/src/browser_use_sdk/accounts/raw_client.py similarity index 100% rename from src/browser_use/accounts/raw_client.py rename to src/browser_use_sdk/accounts/raw_client.py diff --git a/src/browser_use/base_client.py b/src/browser_use_sdk/base_client.py similarity index 61% rename from src/browser_use/base_client.py rename to src/browser_use_sdk/base_client.py index c0d4296..e8f3edf 100644 --- a/src/browser_use/base_client.py +++ b/src/browser_use_sdk/base_client.py @@ -1,15 +1,19 @@ # This file was auto-generated by Fern from our API Definition. +from __future__ import annotations + import typing import httpx -from .accounts.client import AccountsClient, AsyncAccountsClient from .core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from .environment import BrowserUseEnvironment -from .files.client import AsyncFilesClient, FilesClient -from .profiles.client import AsyncProfilesClient, ProfilesClient -from .sessions.client import AsyncSessionsClient, SessionsClient -from .tasks.client import AsyncTasksClient, TasksClient + +if typing.TYPE_CHECKING: + from .accounts.client import AccountsClient, AsyncAccountsClient + from .files.client import AsyncFilesClient, FilesClient + from .profiles.client import AsyncProfilesClient, ProfilesClient + from .sessions.client import AsyncSessionsClient, SessionsClient + from .tasks.client import AsyncTasksClient, TasksClient class BaseClient: @@ -45,7 +49,7 @@ class BaseClient: Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -77,11 +81,51 @@ def __init__( else httpx.Client(timeout=_defaulted_timeout), timeout=_defaulted_timeout, ) - self.accounts = AccountsClient(client_wrapper=self._client_wrapper) - self.tasks = TasksClient(client_wrapper=self._client_wrapper) - self.sessions = SessionsClient(client_wrapper=self._client_wrapper) - self.files = FilesClient(client_wrapper=self._client_wrapper) - self.profiles = ProfilesClient(client_wrapper=self._client_wrapper) + self._accounts: typing.Optional[AccountsClient] = None + self._tasks: typing.Optional[TasksClient] = None + self._sessions: typing.Optional[SessionsClient] = None + self._files: typing.Optional[FilesClient] = None + self._profiles: typing.Optional[ProfilesClient] = None + + @property + def accounts(self): + if self._accounts is None: + from .accounts.client import AccountsClient # noqa: E402 + + self._accounts = AccountsClient(client_wrapper=self._client_wrapper) + return self._accounts + + @property + def tasks(self): + if self._tasks is None: + from .tasks.client import TasksClient # noqa: E402 + + self._tasks = TasksClient(client_wrapper=self._client_wrapper) + return self._tasks + + @property + def sessions(self): + if self._sessions is None: + from .sessions.client import SessionsClient # noqa: E402 + + self._sessions = SessionsClient(client_wrapper=self._client_wrapper) + return self._sessions + + @property + def files(self): + if self._files is None: + from .files.client import FilesClient # noqa: E402 + + self._files = FilesClient(client_wrapper=self._client_wrapper) + return self._files + + @property + def profiles(self): + if self._profiles is None: + from .profiles.client import ProfilesClient # noqa: E402 + + self._profiles = ProfilesClient(client_wrapper=self._client_wrapper) + return self._profiles class AsyncBaseClient: @@ -117,7 +161,7 @@ class AsyncBaseClient: Examples -------- - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -149,11 +193,51 @@ def __init__( else httpx.AsyncClient(timeout=_defaulted_timeout), timeout=_defaulted_timeout, ) - self.accounts = AsyncAccountsClient(client_wrapper=self._client_wrapper) - self.tasks = AsyncTasksClient(client_wrapper=self._client_wrapper) - self.sessions = AsyncSessionsClient(client_wrapper=self._client_wrapper) - self.files = AsyncFilesClient(client_wrapper=self._client_wrapper) - self.profiles = AsyncProfilesClient(client_wrapper=self._client_wrapper) + self._accounts: typing.Optional[AsyncAccountsClient] = None + self._tasks: typing.Optional[AsyncTasksClient] = None + self._sessions: typing.Optional[AsyncSessionsClient] = None + self._files: typing.Optional[AsyncFilesClient] = None + self._profiles: typing.Optional[AsyncProfilesClient] = None + + @property + def accounts(self): + if self._accounts is None: + from .accounts.client import AsyncAccountsClient # noqa: E402 + + self._accounts = AsyncAccountsClient(client_wrapper=self._client_wrapper) + return self._accounts + + @property + def tasks(self): + if self._tasks is None: + from .tasks.client import AsyncTasksClient # noqa: E402 + + self._tasks = AsyncTasksClient(client_wrapper=self._client_wrapper) + return self._tasks + + @property + def sessions(self): + if self._sessions is None: + from .sessions.client import AsyncSessionsClient # noqa: E402 + + self._sessions = AsyncSessionsClient(client_wrapper=self._client_wrapper) + return self._sessions + + @property + def files(self): + if self._files is None: + from .files.client import AsyncFilesClient # noqa: E402 + + self._files = AsyncFilesClient(client_wrapper=self._client_wrapper) + return self._files + + @property + def profiles(self): + if self._profiles is None: + from .profiles.client import AsyncProfilesClient # noqa: E402 + + self._profiles = AsyncProfilesClient(client_wrapper=self._client_wrapper) + return self._profiles def _get_base_url(*, base_url: typing.Optional[str] = None, environment: BrowserUseEnvironment) -> str: diff --git a/src/browser_use/client.py b/src/browser_use_sdk/client.py similarity index 100% rename from src/browser_use/client.py rename to src/browser_use_sdk/client.py diff --git a/src/browser_use_sdk/core/__init__.py b/src/browser_use_sdk/core/__init__.py new file mode 100644 index 0000000..074914f --- /dev/null +++ b/src/browser_use_sdk/core/__init__.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + +import typing +from importlib import import_module + +if typing.TYPE_CHECKING: + from .file import File, with_content_type +_dynamic_imports: typing.Dict[str, str] = {"File": ".file", "with_content_type": ".file"} + + +def __getattr__(attr_name: str) -> typing.Any: + module_name = _dynamic_imports.get(attr_name) + if module_name is None: + raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") + try: + module = import_module(module_name, __package__) + result = getattr(module, attr_name) + return result + except ImportError as e: + raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e + except AttributeError as e: + raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e + + +def __dir__(): + lazy_attrs = list(_dynamic_imports.keys()) + return sorted(lazy_attrs) + + +__all__ = ["File", "with_content_type"] diff --git a/src/browser_use/core/api_error.py b/src/browser_use_sdk/core/api_error.py similarity index 100% rename from src/browser_use/core/api_error.py rename to src/browser_use_sdk/core/api_error.py diff --git a/src/browser_use/core/client_wrapper.py b/src/browser_use_sdk/core/client_wrapper.py similarity index 93% rename from src/browser_use/core/client_wrapper.py rename to src/browser_use_sdk/core/client_wrapper.py index afc40bf..3cb5004 100644 --- a/src/browser_use/core/client_wrapper.py +++ b/src/browser_use_sdk/core/client_wrapper.py @@ -22,10 +22,9 @@ def __init__( def get_headers(self) -> typing.Dict[str, str]: headers: typing.Dict[str, str] = { - "User-Agent": "browser-use-sdk/2.0.1", "X-Fern-Language": "Python", - "X-Fern-SDK-Name": "browser-use-sdk", - "X-Fern-SDK-Version": "2.0.1", + "X-Fern-SDK-Name": "browser-use", + "X-Fern-SDK-Version": "0.0.0", **(self.get_custom_headers() or {}), } headers["X-Browser-Use-API-Key"] = self.api_key diff --git a/src/browser_use/core/datetime_utils.py b/src/browser_use_sdk/core/datetime_utils.py similarity index 100% rename from src/browser_use/core/datetime_utils.py rename to src/browser_use_sdk/core/datetime_utils.py diff --git a/src/browser_use/core/file.py b/src/browser_use_sdk/core/file.py similarity index 100% rename from src/browser_use/core/file.py rename to src/browser_use_sdk/core/file.py diff --git a/src/browser_use/core/force_multipart.py b/src/browser_use_sdk/core/force_multipart.py similarity index 78% rename from src/browser_use/core/force_multipart.py rename to src/browser_use_sdk/core/force_multipart.py index ae24ccf..5440913 100644 --- a/src/browser_use/core/force_multipart.py +++ b/src/browser_use_sdk/core/force_multipart.py @@ -1,7 +1,9 @@ # This file was auto-generated by Fern from our API Definition. +from typing import Any, Dict -class ForceMultipartDict(dict): + +class ForceMultipartDict(Dict[str, Any]): """ A dictionary subclass that always evaluates to True in boolean contexts. @@ -9,7 +11,7 @@ class ForceMultipartDict(dict): the dictionary is empty, which would normally evaluate to False. """ - def __bool__(self): + def __bool__(self) -> bool: return True diff --git a/src/browser_use/core/http_client.py b/src/browser_use_sdk/core/http_client.py similarity index 100% rename from src/browser_use/core/http_client.py rename to src/browser_use_sdk/core/http_client.py diff --git a/src/browser_use/core/http_response.py b/src/browser_use_sdk/core/http_response.py similarity index 93% rename from src/browser_use/core/http_response.py rename to src/browser_use_sdk/core/http_response.py index 48a1798..2479747 100644 --- a/src/browser_use/core/http_response.py +++ b/src/browser_use_sdk/core/http_response.py @@ -4,8 +4,8 @@ import httpx +# Generic to represent the underlying type of the data wrapped by the HTTP response. T = TypeVar("T") -"""Generic to represent the underlying type of the data wrapped by the HTTP response.""" class BaseHttpResponse: diff --git a/src/browser_use/core/jsonable_encoder.py b/src/browser_use_sdk/core/jsonable_encoder.py similarity index 100% rename from src/browser_use/core/jsonable_encoder.py rename to src/browser_use_sdk/core/jsonable_encoder.py diff --git a/src/browser_use/core/pydantic_utilities.py b/src/browser_use_sdk/core/pydantic_utilities.py similarity index 97% rename from src/browser_use/core/pydantic_utilities.py rename to src/browser_use_sdk/core/pydantic_utilities.py index 7db2950..dd7d89f 100644 --- a/src/browser_use/core/pydantic_utilities.py +++ b/src/browser_use_sdk/core/pydantic_utilities.py @@ -61,7 +61,7 @@ class UniversalBaseModel(pydantic.BaseModel): @pydantic.model_serializer(mode="plain", when_used="json") # type: ignore[attr-defined] def serialize_model(self) -> Any: # type: ignore[name-defined] - serialized = self.model_dump() + serialized = self.model_dump() # type: ignore[attr-defined] data = {k: serialize_datetime(v) if isinstance(v, dt.datetime) else v for k, v in serialized.items()} return data @@ -147,7 +147,10 @@ def dict(self, **kwargs: Any) -> Dict[str, Any]: dict_dump = super().dict(**kwargs_with_defaults_exclude_unset_include_fields) - return convert_and_respect_annotation_metadata(object_=dict_dump, annotation=self.__class__, direction="write") + return cast( + Dict[str, Any], + convert_and_respect_annotation_metadata(object_=dict_dump, annotation=self.__class__, direction="write"), + ) def _union_list_of_pydantic_dicts(source: List[Any], destination: List[Any]) -> List[Any]: diff --git a/src/browser_use/core/query_encoder.py b/src/browser_use_sdk/core/query_encoder.py similarity index 100% rename from src/browser_use/core/query_encoder.py rename to src/browser_use_sdk/core/query_encoder.py diff --git a/src/browser_use/core/remove_none_from_dict.py b/src/browser_use_sdk/core/remove_none_from_dict.py similarity index 100% rename from src/browser_use/core/remove_none_from_dict.py rename to src/browser_use_sdk/core/remove_none_from_dict.py diff --git a/src/browser_use/core/request_options.py b/src/browser_use_sdk/core/request_options.py similarity index 100% rename from src/browser_use/core/request_options.py rename to src/browser_use_sdk/core/request_options.py diff --git a/src/browser_use/core/serialization.py b/src/browser_use_sdk/core/serialization.py similarity index 100% rename from src/browser_use/core/serialization.py rename to src/browser_use_sdk/core/serialization.py diff --git a/src/browser_use/core/unchecked_base_model.py b/src/browser_use_sdk/core/unchecked_base_model.py similarity index 98% rename from src/browser_use/core/unchecked_base_model.py rename to src/browser_use_sdk/core/unchecked_base_model.py index e04a6f8..ae59845 100644 --- a/src/browser_use/core/unchecked_base_model.py +++ b/src/browser_use_sdk/core/unchecked_base_model.py @@ -186,7 +186,7 @@ def _convert_undiscriminated_union_type(union_type: typing.Type[typing.Any], obj def _convert_union_type(type_: typing.Type[typing.Any], object_: typing.Any) -> typing.Any: base_type = get_origin(type_) or type_ union_type = type_ - if base_type == typing_extensions.Annotated: + if base_type == typing_extensions.Annotated: # type: ignore[comparison-overlap] union_type = get_args(type_)[0] annotated_metadata = get_args(type_)[1:] for metadata in annotated_metadata: @@ -217,11 +217,11 @@ def construct_type(*, type_: typing.Type[typing.Any], object_: typing.Any) -> ty return None base_type = get_origin(type_) or type_ - is_annotated = base_type == typing_extensions.Annotated + is_annotated = base_type == typing_extensions.Annotated # type: ignore[comparison-overlap] maybe_annotation_members = get_args(type_) is_annotated_union = is_annotated and is_union(get_origin(maybe_annotation_members[0])) - if base_type == typing.Any: + if base_type == typing.Any: # type: ignore[comparison-overlap] return object_ if base_type == dict: diff --git a/src/browser_use/environment.py b/src/browser_use_sdk/environment.py similarity index 100% rename from src/browser_use/environment.py rename to src/browser_use_sdk/environment.py diff --git a/src/browser_use/errors/__init__.py b/src/browser_use_sdk/errors/__init__.py similarity index 100% rename from src/browser_use/errors/__init__.py rename to src/browser_use_sdk/errors/__init__.py diff --git a/src/browser_use/errors/bad_request_error.py b/src/browser_use_sdk/errors/bad_request_error.py similarity index 100% rename from src/browser_use/errors/bad_request_error.py rename to src/browser_use_sdk/errors/bad_request_error.py diff --git a/src/browser_use/errors/internal_server_error.py b/src/browser_use_sdk/errors/internal_server_error.py similarity index 100% rename from src/browser_use/errors/internal_server_error.py rename to src/browser_use_sdk/errors/internal_server_error.py diff --git a/src/browser_use/errors/not_found_error.py b/src/browser_use_sdk/errors/not_found_error.py similarity index 100% rename from src/browser_use/errors/not_found_error.py rename to src/browser_use_sdk/errors/not_found_error.py diff --git a/src/browser_use/errors/payment_required_error.py b/src/browser_use_sdk/errors/payment_required_error.py similarity index 100% rename from src/browser_use/errors/payment_required_error.py rename to src/browser_use_sdk/errors/payment_required_error.py diff --git a/src/browser_use/errors/unprocessable_entity_error.py b/src/browser_use_sdk/errors/unprocessable_entity_error.py similarity index 100% rename from src/browser_use/errors/unprocessable_entity_error.py rename to src/browser_use_sdk/errors/unprocessable_entity_error.py diff --git a/src/browser_use/files/__init__.py b/src/browser_use_sdk/files/__init__.py similarity index 100% rename from src/browser_use/files/__init__.py rename to src/browser_use_sdk/files/__init__.py diff --git a/src/browser_use/files/client.py b/src/browser_use_sdk/files/client.py similarity index 97% rename from src/browser_use/files/client.py rename to src/browser_use_sdk/files/client.py index 8824f2b..f7b4740 100644 --- a/src/browser_use/files/client.py +++ b/src/browser_use_sdk/files/client.py @@ -62,7 +62,7 @@ def user_upload_file_presigned_url( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -105,7 +105,7 @@ def get_task_output_file_presigned_url( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -172,7 +172,7 @@ async def user_upload_file_presigned_url( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -223,7 +223,7 @@ async def get_task_output_file_presigned_url( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", diff --git a/src/browser_use/files/raw_client.py b/src/browser_use_sdk/files/raw_client.py similarity index 100% rename from src/browser_use/files/raw_client.py rename to src/browser_use_sdk/files/raw_client.py diff --git a/src/browser_use/files/types/__init__.py b/src/browser_use_sdk/files/types/__init__.py similarity index 100% rename from src/browser_use/files/types/__init__.py rename to src/browser_use_sdk/files/types/__init__.py diff --git a/src/browser_use/files/types/upload_file_request_content_type.py b/src/browser_use_sdk/files/types/upload_file_request_content_type.py similarity index 100% rename from src/browser_use/files/types/upload_file_request_content_type.py rename to src/browser_use_sdk/files/types/upload_file_request_content_type.py diff --git a/src/browser_use/lib/webhooks.py b/src/browser_use_sdk/lib/webhooks.py similarity index 100% rename from src/browser_use/lib/webhooks.py rename to src/browser_use_sdk/lib/webhooks.py diff --git a/src/browser_use/profiles/__init__.py b/src/browser_use_sdk/profiles/__init__.py similarity index 100% rename from src/browser_use/profiles/__init__.py rename to src/browser_use_sdk/profiles/__init__.py diff --git a/src/browser_use/profiles/client.py b/src/browser_use_sdk/profiles/client.py similarity index 95% rename from src/browser_use/profiles/client.py rename to src/browser_use_sdk/profiles/client.py index 5d5c658..3927b70 100644 --- a/src/browser_use/profiles/client.py +++ b/src/browser_use_sdk/profiles/client.py @@ -50,7 +50,7 @@ def list_profiles( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -83,7 +83,7 @@ def create_profile(self, *, request_options: typing.Optional[RequestOptions] = N Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -111,7 +111,7 @@ def get_profile(self, profile_id: str, *, request_options: typing.Optional[Reque Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -142,7 +142,7 @@ def delete_browser_profile( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -198,7 +198,7 @@ async def list_profiles( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -239,7 +239,7 @@ async def create_profile(self, *, request_options: typing.Optional[RequestOption -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -277,7 +277,7 @@ async def get_profile( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -316,7 +316,7 @@ async def delete_browser_profile( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", diff --git a/src/browser_use/profiles/raw_client.py b/src/browser_use_sdk/profiles/raw_client.py similarity index 100% rename from src/browser_use/profiles/raw_client.py rename to src/browser_use_sdk/profiles/raw_client.py diff --git a/src/browser_use/py.typed b/src/browser_use_sdk/py.typed similarity index 100% rename from src/browser_use/py.typed rename to src/browser_use_sdk/py.typed diff --git a/src/browser_use/sessions/__init__.py b/src/browser_use_sdk/sessions/__init__.py similarity index 100% rename from src/browser_use/sessions/__init__.py rename to src/browser_use_sdk/sessions/__init__.py diff --git a/src/browser_use/sessions/client.py b/src/browser_use_sdk/sessions/client.py similarity index 95% rename from src/browser_use/sessions/client.py rename to src/browser_use_sdk/sessions/client.py index 606cde5..b802cc0 100644 --- a/src/browser_use/sessions/client.py +++ b/src/browser_use_sdk/sessions/client.py @@ -60,7 +60,7 @@ def list_sessions( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -100,7 +100,7 @@ def create_session( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -130,7 +130,7 @@ def get_session(self, session_id: str, *, request_options: typing.Optional[Reque Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -159,7 +159,7 @@ def delete_session(self, session_id: str, *, request_options: typing.Optional[Re Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -191,7 +191,7 @@ def update_session( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -223,7 +223,7 @@ def get_session_public_share( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -255,7 +255,7 @@ def create_session_public_share( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -286,7 +286,7 @@ def delete_session_public_share( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -345,7 +345,7 @@ async def list_sessions( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -393,7 +393,7 @@ async def create_session( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -433,7 +433,7 @@ async def get_session( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -470,7 +470,7 @@ async def delete_session(self, session_id: str, *, request_options: typing.Optio -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -510,7 +510,7 @@ async def update_session( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -550,7 +550,7 @@ async def get_session_public_share( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -590,7 +590,7 @@ async def create_session_public_share( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -629,7 +629,7 @@ async def delete_session_public_share( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", diff --git a/src/browser_use/sessions/raw_client.py b/src/browser_use_sdk/sessions/raw_client.py similarity index 100% rename from src/browser_use/sessions/raw_client.py rename to src/browser_use_sdk/sessions/raw_client.py diff --git a/src/browser_use/tasks/__init__.py b/src/browser_use_sdk/tasks/__init__.py similarity index 100% rename from src/browser_use/tasks/__init__.py rename to src/browser_use_sdk/tasks/__init__.py diff --git a/src/browser_use/tasks/client.py b/src/browser_use_sdk/tasks/client.py similarity index 97% rename from src/browser_use/tasks/client.py rename to src/browser_use_sdk/tasks/client.py index 5d2574e..02fb2f1 100644 --- a/src/browser_use/tasks/client.py +++ b/src/browser_use_sdk/tasks/client.py @@ -71,7 +71,7 @@ def list_tasks( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -167,7 +167,7 @@ def create_task( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -213,7 +213,7 @@ def get_task(self, task_id: str, *, request_options: typing.Optional[RequestOpti Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -248,7 +248,7 @@ def update_task( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -281,7 +281,7 @@ def get_task_logs( Examples -------- - from browser_use import BrowserUse + from browser_use_sdk import BrowserUse client = BrowserUse( api_key="YOUR_API_KEY", @@ -349,7 +349,7 @@ async def list_tasks( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -453,7 +453,7 @@ async def create_task( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -507,7 +507,7 @@ async def get_task(self, task_id: str, *, request_options: typing.Optional[Reque -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -550,7 +550,7 @@ async def update_task( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", @@ -591,7 +591,7 @@ async def get_task_logs( -------- import asyncio - from browser_use import AsyncBrowserUse + from browser_use_sdk import AsyncBrowserUse client = AsyncBrowserUse( api_key="YOUR_API_KEY", diff --git a/src/browser_use/tasks/raw_client.py b/src/browser_use_sdk/tasks/raw_client.py similarity index 100% rename from src/browser_use/tasks/raw_client.py rename to src/browser_use_sdk/tasks/raw_client.py diff --git a/src/browser_use/types/__init__.py b/src/browser_use_sdk/types/__init__.py similarity index 100% rename from src/browser_use/types/__init__.py rename to src/browser_use_sdk/types/__init__.py diff --git a/src/browser_use/types/account_not_found_error.py b/src/browser_use_sdk/types/account_not_found_error.py similarity index 100% rename from src/browser_use/types/account_not_found_error.py rename to src/browser_use_sdk/types/account_not_found_error.py diff --git a/src/browser_use/types/account_view.py b/src/browser_use_sdk/types/account_view.py similarity index 100% rename from src/browser_use/types/account_view.py rename to src/browser_use_sdk/types/account_view.py diff --git a/src/browser_use/types/bad_request_error_body.py b/src/browser_use_sdk/types/bad_request_error_body.py similarity index 100% rename from src/browser_use/types/bad_request_error_body.py rename to src/browser_use_sdk/types/bad_request_error_body.py diff --git a/src/browser_use/types/download_url_generation_error.py b/src/browser_use_sdk/types/download_url_generation_error.py similarity index 100% rename from src/browser_use/types/download_url_generation_error.py rename to src/browser_use_sdk/types/download_url_generation_error.py diff --git a/src/browser_use/types/file_view.py b/src/browser_use_sdk/types/file_view.py similarity index 100% rename from src/browser_use/types/file_view.py rename to src/browser_use_sdk/types/file_view.py diff --git a/src/browser_use/types/http_validation_error.py b/src/browser_use_sdk/types/http_validation_error.py similarity index 100% rename from src/browser_use/types/http_validation_error.py rename to src/browser_use_sdk/types/http_validation_error.py diff --git a/src/browser_use/types/insufficient_credits_error.py b/src/browser_use_sdk/types/insufficient_credits_error.py similarity index 100% rename from src/browser_use/types/insufficient_credits_error.py rename to src/browser_use_sdk/types/insufficient_credits_error.py diff --git a/src/browser_use/types/internal_server_error_body.py b/src/browser_use_sdk/types/internal_server_error_body.py similarity index 100% rename from src/browser_use/types/internal_server_error_body.py rename to src/browser_use_sdk/types/internal_server_error_body.py diff --git a/src/browser_use/types/not_found_error_body.py b/src/browser_use_sdk/types/not_found_error_body.py similarity index 100% rename from src/browser_use/types/not_found_error_body.py rename to src/browser_use_sdk/types/not_found_error_body.py diff --git a/src/browser_use/types/output_file_not_found_error.py b/src/browser_use_sdk/types/output_file_not_found_error.py similarity index 100% rename from src/browser_use/types/output_file_not_found_error.py rename to src/browser_use_sdk/types/output_file_not_found_error.py diff --git a/src/browser_use/types/profile_list_response.py b/src/browser_use_sdk/types/profile_list_response.py similarity index 100% rename from src/browser_use/types/profile_list_response.py rename to src/browser_use_sdk/types/profile_list_response.py diff --git a/src/browser_use/types/profile_not_found_error.py b/src/browser_use_sdk/types/profile_not_found_error.py similarity index 100% rename from src/browser_use/types/profile_not_found_error.py rename to src/browser_use_sdk/types/profile_not_found_error.py diff --git a/src/browser_use/types/profile_view.py b/src/browser_use_sdk/types/profile_view.py similarity index 100% rename from src/browser_use/types/profile_view.py rename to src/browser_use_sdk/types/profile_view.py diff --git a/src/browser_use/types/proxy_country_code.py b/src/browser_use_sdk/types/proxy_country_code.py similarity index 100% rename from src/browser_use/types/proxy_country_code.py rename to src/browser_use_sdk/types/proxy_country_code.py diff --git a/src/browser_use/types/session_has_running_task_error.py b/src/browser_use_sdk/types/session_has_running_task_error.py similarity index 100% rename from src/browser_use/types/session_has_running_task_error.py rename to src/browser_use_sdk/types/session_has_running_task_error.py diff --git a/src/browser_use/types/session_item_view.py b/src/browser_use_sdk/types/session_item_view.py similarity index 100% rename from src/browser_use/types/session_item_view.py rename to src/browser_use_sdk/types/session_item_view.py diff --git a/src/browser_use/types/session_list_response.py b/src/browser_use_sdk/types/session_list_response.py similarity index 100% rename from src/browser_use/types/session_list_response.py rename to src/browser_use_sdk/types/session_list_response.py diff --git a/src/browser_use/types/session_not_found_error.py b/src/browser_use_sdk/types/session_not_found_error.py similarity index 100% rename from src/browser_use/types/session_not_found_error.py rename to src/browser_use_sdk/types/session_not_found_error.py diff --git a/src/browser_use/types/session_status.py b/src/browser_use_sdk/types/session_status.py similarity index 100% rename from src/browser_use/types/session_status.py rename to src/browser_use_sdk/types/session_status.py diff --git a/src/browser_use/types/session_stopped_error.py b/src/browser_use_sdk/types/session_stopped_error.py similarity index 100% rename from src/browser_use/types/session_stopped_error.py rename to src/browser_use_sdk/types/session_stopped_error.py diff --git a/src/browser_use/types/session_update_action.py b/src/browser_use_sdk/types/session_update_action.py similarity index 100% rename from src/browser_use/types/session_update_action.py rename to src/browser_use_sdk/types/session_update_action.py diff --git a/src/browser_use/types/session_view.py b/src/browser_use_sdk/types/session_view.py similarity index 100% rename from src/browser_use/types/session_view.py rename to src/browser_use_sdk/types/session_view.py diff --git a/src/browser_use/types/share_not_found_error.py b/src/browser_use_sdk/types/share_not_found_error.py similarity index 100% rename from src/browser_use/types/share_not_found_error.py rename to src/browser_use_sdk/types/share_not_found_error.py diff --git a/src/browser_use/types/share_view.py b/src/browser_use_sdk/types/share_view.py similarity index 100% rename from src/browser_use/types/share_view.py rename to src/browser_use_sdk/types/share_view.py diff --git a/src/browser_use/types/supported_ll_ms.py b/src/browser_use_sdk/types/supported_ll_ms.py similarity index 100% rename from src/browser_use/types/supported_ll_ms.py rename to src/browser_use_sdk/types/supported_ll_ms.py diff --git a/src/browser_use/types/task_created_response.py b/src/browser_use_sdk/types/task_created_response.py similarity index 100% rename from src/browser_use/types/task_created_response.py rename to src/browser_use_sdk/types/task_created_response.py diff --git a/src/browser_use/types/task_item_view.py b/src/browser_use_sdk/types/task_item_view.py similarity index 100% rename from src/browser_use/types/task_item_view.py rename to src/browser_use_sdk/types/task_item_view.py diff --git a/src/browser_use/types/task_list_response.py b/src/browser_use_sdk/types/task_list_response.py similarity index 100% rename from src/browser_use/types/task_list_response.py rename to src/browser_use_sdk/types/task_list_response.py diff --git a/src/browser_use/types/task_log_file_response.py b/src/browser_use_sdk/types/task_log_file_response.py similarity index 100% rename from src/browser_use/types/task_log_file_response.py rename to src/browser_use_sdk/types/task_log_file_response.py diff --git a/src/browser_use/types/task_not_found_error.py b/src/browser_use_sdk/types/task_not_found_error.py similarity index 100% rename from src/browser_use/types/task_not_found_error.py rename to src/browser_use_sdk/types/task_not_found_error.py diff --git a/src/browser_use/types/task_output_file_response.py b/src/browser_use_sdk/types/task_output_file_response.py similarity index 100% rename from src/browser_use/types/task_output_file_response.py rename to src/browser_use_sdk/types/task_output_file_response.py diff --git a/src/browser_use/types/task_status.py b/src/browser_use_sdk/types/task_status.py similarity index 100% rename from src/browser_use/types/task_status.py rename to src/browser_use_sdk/types/task_status.py diff --git a/src/browser_use/types/task_step_view.py b/src/browser_use_sdk/types/task_step_view.py similarity index 100% rename from src/browser_use/types/task_step_view.py rename to src/browser_use_sdk/types/task_step_view.py diff --git a/src/browser_use/types/task_update_action.py b/src/browser_use_sdk/types/task_update_action.py similarity index 100% rename from src/browser_use/types/task_update_action.py rename to src/browser_use_sdk/types/task_update_action.py diff --git a/src/browser_use/types/task_view.py b/src/browser_use_sdk/types/task_view.py similarity index 100% rename from src/browser_use/types/task_view.py rename to src/browser_use_sdk/types/task_view.py diff --git a/src/browser_use/types/unsupported_content_type_error.py b/src/browser_use_sdk/types/unsupported_content_type_error.py similarity index 100% rename from src/browser_use/types/unsupported_content_type_error.py rename to src/browser_use_sdk/types/unsupported_content_type_error.py diff --git a/src/browser_use/types/upload_file_presigned_url_response.py b/src/browser_use_sdk/types/upload_file_presigned_url_response.py similarity index 100% rename from src/browser_use/types/upload_file_presigned_url_response.py rename to src/browser_use_sdk/types/upload_file_presigned_url_response.py diff --git a/src/browser_use/types/validation_error.py b/src/browser_use_sdk/types/validation_error.py similarity index 100% rename from src/browser_use/types/validation_error.py rename to src/browser_use_sdk/types/validation_error.py diff --git a/src/browser_use/types/validation_error_loc_item.py b/src/browser_use_sdk/types/validation_error_loc_item.py similarity index 100% rename from src/browser_use/types/validation_error_loc_item.py rename to src/browser_use_sdk/types/validation_error_loc_item.py diff --git a/src/browser_use_sdk/version.py b/src/browser_use_sdk/version.py new file mode 100644 index 0000000..a95c7ec --- /dev/null +++ b/src/browser_use_sdk/version.py @@ -0,0 +1,3 @@ +from importlib import metadata + +__version__ = metadata.version("browser-use") diff --git a/src/browser_use/wrapper/parse.py b/src/browser_use_sdk/wrapper/parse.py similarity index 96% rename from src/browser_use/wrapper/parse.py rename to src/browser_use_sdk/wrapper/parse.py index f2d1ae3..348c166 100644 --- a/src/browser_use/wrapper/parse.py +++ b/src/browser_use_sdk/wrapper/parse.py @@ -8,11 +8,11 @@ from pydantic import BaseModel -from browser_use.core.request_options import RequestOptions -from browser_use.tasks.client import AsyncTasksClient, TasksClient -from browser_use.types.task_created_response import TaskCreatedResponse -from browser_use.types.task_step_view import TaskStepView -from browser_use.types.task_view import TaskView +from browser_use_sdk.core.request_options import RequestOptions +from browser_use_sdk.tasks.client import AsyncTasksClient, TasksClient +from browser_use_sdk.types.task_created_response import TaskCreatedResponse +from browser_use_sdk.types.task_step_view import TaskStepView +from browser_use_sdk.types.task_view import TaskView T = TypeVar("T", bound=BaseModel) diff --git a/src/browser_use/wrapper/tasks/client.py b/src/browser_use_sdk/wrapper/tasks/client.py similarity index 97% rename from src/browser_use/wrapper/tasks/client.py rename to src/browser_use_sdk/wrapper/tasks/client.py index 835f0b8..a5a3943 100644 --- a/src/browser_use/wrapper/tasks/client.py +++ b/src/browser_use_sdk/wrapper/tasks/client.py @@ -1,11 +1,11 @@ import json import typing -from browser_use.core.request_options import RequestOptions -from browser_use.tasks.client import OMIT, AsyncClientWrapper, AsyncTasksClient, SyncClientWrapper, TasksClient -from browser_use.types.supported_ll_ms import SupportedLlMs -from browser_use.types.task_view import TaskView -from browser_use.wrapper.parse import ( +from browser_use_sdk.core.request_options import RequestOptions +from browser_use_sdk.tasks.client import OMIT, AsyncClientWrapper, AsyncTasksClient, SyncClientWrapper, TasksClient +from browser_use_sdk.types.supported_ll_ms import SupportedLlMs +from browser_use_sdk.types.task_view import TaskView +from browser_use_sdk.wrapper.parse import ( AsyncWrappedStructuredTaskCreatedResponse, AsyncWrappedTaskCreatedResponse, T, diff --git a/tests/utils/assets/models/circle.py b/tests/utils/assets/models/circle.py index e2a7d91..fb0ecfb 100644 --- a/tests/utils/assets/models/circle.py +++ b/tests/utils/assets/models/circle.py @@ -4,7 +4,7 @@ import typing_extensions -from browser_use.core.serialization import FieldMetadata +from browser_use_sdk.core.serialization import FieldMetadata class CircleParams(typing_extensions.TypedDict): diff --git a/tests/utils/assets/models/object_with_optional_field.py b/tests/utils/assets/models/object_with_optional_field.py index eac76e0..472d207 100644 --- a/tests/utils/assets/models/object_with_optional_field.py +++ b/tests/utils/assets/models/object_with_optional_field.py @@ -11,7 +11,7 @@ from .shape import ShapeParams from .undiscriminated_shape import UndiscriminatedShapeParams -from browser_use.core.serialization import FieldMetadata +from browser_use_sdk.core.serialization import FieldMetadata class ObjectWithOptionalFieldParams(typing_extensions.TypedDict): diff --git a/tests/utils/assets/models/shape.py b/tests/utils/assets/models/shape.py index 1c7b3cb..f407217 100644 --- a/tests/utils/assets/models/shape.py +++ b/tests/utils/assets/models/shape.py @@ -8,7 +8,7 @@ import typing_extensions -from browser_use.core.serialization import FieldMetadata +from browser_use_sdk.core.serialization import FieldMetadata class Base(typing_extensions.TypedDict): diff --git a/tests/utils/assets/models/square.py b/tests/utils/assets/models/square.py index 3021cd4..4c9c6f4 100644 --- a/tests/utils/assets/models/square.py +++ b/tests/utils/assets/models/square.py @@ -4,7 +4,7 @@ import typing_extensions -from browser_use.core.serialization import FieldMetadata +from browser_use_sdk.core.serialization import FieldMetadata class SquareParams(typing_extensions.TypedDict): diff --git a/tests/utils/test_http_client.py b/tests/utils/test_http_client.py index d9cdaaa..47c7848 100644 --- a/tests/utils/test_http_client.py +++ b/tests/utils/test_http_client.py @@ -1,7 +1,7 @@ # This file was auto-generated by Fern from our API Definition. -from browser_use.core.http_client import get_request_body -from browser_use.core.request_options import RequestOptions +from browser_use_sdk.core.http_client import get_request_body +from browser_use_sdk.core.request_options import RequestOptions def get_request_options() -> RequestOptions: diff --git a/tests/utils/test_query_encoding.py b/tests/utils/test_query_encoding.py index aebf381..8a7d99b 100644 --- a/tests/utils/test_query_encoding.py +++ b/tests/utils/test_query_encoding.py @@ -1,7 +1,7 @@ # This file was auto-generated by Fern from our API Definition. -from browser_use.core.query_encoder import encode_query +from browser_use_sdk.core.query_encoder import encode_query def test_query_encoding_deep_objects() -> None: diff --git a/tests/utils/test_serialization.py b/tests/utils/test_serialization.py index 1c91638..cd63807 100644 --- a/tests/utils/test_serialization.py +++ b/tests/utils/test_serialization.py @@ -4,7 +4,7 @@ from .assets.models import ObjectWithOptionalFieldParams, ShapeParams -from browser_use.core.serialization import convert_and_respect_annotation_metadata +from browser_use_sdk.core.serialization import convert_and_respect_annotation_metadata UNION_TEST: ShapeParams = {"radius_measurement": 1.0, "shape_type": "circle", "id": "1"} UNION_TEST_CONVERTED = {"shapeType": "circle", "radiusMeasurement": 1.0, "id": "1"}