Skip to content

Commit

Permalink
community[patch]: Fix Playwright Tools bug with Pydantic schemas (#27050
Browse files Browse the repository at this point in the history
)

- Add tests for Playwright tools schema serialization
- Introduce base empty args Input class for BaseBrowserTool

Test Plan: `poetry run pytest
tests/unit_tests/tools/playwright/test_all.py`

Fixes #26758

---------

Co-authored-by: Erick Friis <[email protected]>
Co-authored-by: Eugene Yurtsev <[email protected]>
  • Loading branch information
3 people authored Oct 30, 2024
1 parent 92024d0 commit 8180637
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 3 deletions.
1 change: 1 addition & 0 deletions libs/community/extended_testing_deps.txt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ oracledb>=2.2.0,<3
pandas>=2.0.1,<3
pdfminer-six>=20221105,<20240706
pgvector>=0.1.6,<0.2
playwright>=1.48.0,<2
praw>=7.7.1,<8
premai>=0.3.25,<0.4
psychicapi>=0.8.0,<0.9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@
)


class CurrentWebPageToolInput(BaseModel):
"""Explicit no-args input for CurrentWebPageTool."""


class CurrentWebPageTool(BaseBrowserTool): # type: ignore[override, override]
"""Tool for getting the URL of the current webpage."""

name: str = "current_webpage"
description: str = "Returns the URL of the current page"
args_schema: Type[BaseModel] = BaseModel
args_schema: Type[BaseModel] = CurrentWebPageToolInput

def _run(
self,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@
)


class ExtractTextToolInput(BaseModel):
"""Explicit no-args input for ExtractTextTool."""


class ExtractTextTool(BaseBrowserTool): # type: ignore[override, override]
"""Tool for extracting all the text on the current webpage."""

name: str = "extract_text"
description: str = "Extract all the text on the current webpage"
args_schema: Type[BaseModel] = BaseModel
args_schema: Type[BaseModel] = ExtractTextToolInput

@model_validator(mode="before")
@classmethod
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@
)


class NavigateBackToolInput(BaseModel):
"""Explicit no-args input for NavigateBackTool."""


class NavigateBackTool(BaseBrowserTool): # type: ignore[override, override]
"""Navigate back to the previous page in the browser history."""

name: str = "previous_webpage"
description: str = "Navigate back to the previous page in the browser history"
args_schema: Type[BaseModel] = BaseModel
args_schema: Type[BaseModel] = NavigateBackToolInput

def _run(self, run_manager: Optional[CallbackManagerForToolRun] = None) -> str:
"""Use the tool."""
Expand Down
Empty file.
26 changes: 26 additions & 0 deletions libs/community/tests/unit_tests/tools/playwright/test_all.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""Test Playwright's Tools."""

from unittest.mock import Mock

import pytest

from langchain_community.agent_toolkits import PlayWrightBrowserToolkit


@pytest.mark.requires("playwright")
@pytest.mark.requires("bs4")
def test_playwright_tools_schemas() -> None:
"""Test calling 'tool_call_schema' for every tool to check to init issues."""

from playwright.sync_api import Browser

sync_browser = Mock(spec=Browser)
tools = PlayWrightBrowserToolkit.from_browser(sync_browser=sync_browser).get_tools()

for tool in tools:
try:
tool.tool_call_schema
except Exception as e:
raise AssertionError(
f"Error for '{tool.name}' tool: {type(e).__name__}: {e}"
) from e

0 comments on commit 8180637

Please sign in to comment.