Source code for langchain_community.agent_toolkits.playwright.toolkit
"""Playwright网络浏览器工具包。"""
from __future__ import annotations
from typing import TYPE_CHECKING, List, Optional, Type, cast
from langchain_core.pydantic_v1 import Extra, root_validator
from langchain_core.tools import BaseTool, BaseToolkit
from langchain_community.tools.playwright.base import (
BaseBrowserTool,
lazy_import_playwright_browsers,
)
from langchain_community.tools.playwright.click import ClickTool
from langchain_community.tools.playwright.current_page import CurrentWebPageTool
from langchain_community.tools.playwright.extract_hyperlinks import (
ExtractHyperlinksTool,
)
from langchain_community.tools.playwright.extract_text import ExtractTextTool
from langchain_community.tools.playwright.get_elements import GetElementsTool
from langchain_community.tools.playwright.navigate import NavigateTool
from langchain_community.tools.playwright.navigate_back import NavigateBackTool
if TYPE_CHECKING:
from playwright.async_api import Browser as AsyncBrowser
from playwright.sync_api import Browser as SyncBrowser
else:
try:
# We do this so pydantic can resolve the types when instantiating
from playwright.async_api import Browser as AsyncBrowser
from playwright.sync_api import Browser as SyncBrowser
except ImportError:
pass
[docs]class PlayWrightBrowserToolkit(BaseToolkit):
"""PlayWright浏览器工具包。
**安全提示** : 该工具包提供了控制Web浏览器的代码。
如果将此工具包暴露给最终用户,请谨慎。该工具包中的工具能够导航到任意网页,点击任意元素,并从网页中提取任意文本和超链接。
具体来说,默认情况下,该工具包允许导航到:
- 任何URL(包括任何内部网络URL)
- 以及本地文件
如果暴露给最终用户,请考虑限制对托管代理的服务器的网络访问;此外,建议创建一个具有限制可导航到的URL的args_schema的自定义NavigationTool(例如,仅允许导航到以特定前缀开头的URL)。
请记住,将权限范围限制为应用程序所需的最低权限。如果默认工具选择不适用于应用程序,请考虑创建一个具有适当工具的自定义工具包。
有关更多信息,请参见https://python.langchain.com/docs/security。"""
sync_browser: Optional["SyncBrowser"] = None
async_browser: Optional["AsyncBrowser"] = None
class Config:
"""此pydantic对象的配置。"""
extra = Extra.forbid
arbitrary_types_allowed = True
@root_validator
def validate_imports_and_browser_provided(cls, values: dict) -> dict:
"""检查参数是否有效。"""
lazy_import_playwright_browsers()
if values.get("async_browser") is None and values.get("sync_browser") is None:
raise ValueError("Either async_browser or sync_browser must be specified.")
return values
[docs] def get_tools(self) -> List[BaseTool]:
"""获取工具包中的工具。"""
tool_classes: List[Type[BaseBrowserTool]] = [
ClickTool,
NavigateTool,
NavigateBackTool,
ExtractTextTool,
ExtractHyperlinksTool,
GetElementsTool,
CurrentWebPageTool,
]
tools = [
tool_cls.from_browser(
sync_browser=self.sync_browser, async_browser=self.async_browser
)
for tool_cls in tool_classes
]
return cast(List[BaseTool], tools)
[docs] @classmethod
def from_browser(
cls,
sync_browser: Optional[SyncBrowser] = None,
async_browser: Optional[AsyncBrowser] = None,
) -> PlayWrightBrowserToolkit:
"""实例化工具包。"""
# This is to raise a better error than the forward ref ones Pydantic would have
lazy_import_playwright_browsers()
return cls(sync_browser=sync_browser, async_browser=async_browser)