Spaces:
Sleeping
Sleeping
Update src/controller/custom_controller.py
Browse files
src/controller/custom_controller.py
CHANGED
|
@@ -1,16 +1,17 @@
|
|
| 1 |
import pdb
|
|
|
|
| 2 |
import pyperclip
|
| 3 |
from typing import Optional, Type, Callable, Dict, Any, Union, Awaitable, TypeVar
|
| 4 |
from pydantic import BaseModel
|
| 5 |
from browser_use.agent.views import ActionResult
|
| 6 |
from browser_use.browser.context import BrowserContext
|
| 7 |
-
from browser_use.controller.service import Controller
|
| 8 |
from browser_use.controller.registry.service import Registry, RegisteredAction
|
| 9 |
from main_content_extractor import MainContentExtractor
|
| 10 |
from browser_use.controller.views import (
|
| 11 |
ClickElementAction,
|
| 12 |
DoneAction,
|
| 13 |
-
|
| 14 |
GoToUrlAction,
|
| 15 |
InputTextAction,
|
| 16 |
OpenTabAction,
|
|
@@ -34,6 +35,7 @@ logger = logging.getLogger(__name__)
|
|
| 34 |
|
| 35 |
Context = TypeVar('Context')
|
| 36 |
|
|
|
|
| 37 |
class CustomController(Controller):
|
| 38 |
def __init__(self, exclude_actions: list[str] = [],
|
| 39 |
output_model: Optional[Type[BaseModel]] = None,
|
|
@@ -79,6 +81,7 @@ class CustomController(Controller):
|
|
| 79 |
return ActionResult(error=f'File {path} does not exist')
|
| 80 |
|
| 81 |
dom_el = await browser.get_dom_element_by_index(index)
|
|
|
|
| 82 |
file_upload_dom_el = dom_el.get_file_upload_element()
|
| 83 |
|
| 84 |
if file_upload_dom_el is None:
|
|
@@ -108,9 +111,11 @@ class CustomController(Controller):
|
|
| 108 |
self,
|
| 109 |
action: ActionModel,
|
| 110 |
browser_context: Optional[BrowserContext] = None,
|
|
|
|
| 111 |
page_extraction_llm: Optional[BaseChatModel] = None,
|
| 112 |
sensitive_data: Optional[Dict[str, str]] = None,
|
| 113 |
available_file_paths: Optional[list[str]] = None,
|
|
|
|
| 114 |
context: Context | None = None,
|
| 115 |
) -> ActionResult:
|
| 116 |
"""Execute an action"""
|
|
@@ -119,6 +124,7 @@ class CustomController(Controller):
|
|
| 119 |
for action_name, params in action.model_dump(exclude_unset=True).items():
|
| 120 |
if params is not None:
|
| 121 |
if action_name.startswith("mcp"):
|
|
|
|
| 122 |
logger.debug(f"Invoke MCP tool: {action_name}")
|
| 123 |
mcp_tool = self.registry.registry.actions.get(action_name).function
|
| 124 |
result = await mcp_tool.ainvoke(params)
|
|
@@ -152,6 +158,9 @@ class CustomController(Controller):
|
|
| 152 |
self.register_mcp_tools()
|
| 153 |
|
| 154 |
def register_mcp_tools(self):
|
|
|
|
|
|
|
|
|
|
| 155 |
if self.mcp_client:
|
| 156 |
for server_name in self.mcp_client.server_name_to_tools:
|
| 157 |
for tool in self.mcp_client.server_name_to_tools[server_name]:
|
|
@@ -163,9 +172,11 @@ class CustomController(Controller):
|
|
| 163 |
param_model=create_tool_param_model(tool),
|
| 164 |
)
|
| 165 |
logger.info(f"Add mcp tool: {tool_name}")
|
|
|
|
|
|
|
| 166 |
else:
|
| 167 |
logger.warning(f"MCP client not started.")
|
| 168 |
|
| 169 |
async def close_mcp_client(self):
|
| 170 |
if self.mcp_client:
|
| 171 |
-
await self.mcp_client.__aexit__(None, None, None)
|
|
|
|
| 1 |
import pdb
|
| 2 |
+
|
| 3 |
import pyperclip
|
| 4 |
from typing import Optional, Type, Callable, Dict, Any, Union, Awaitable, TypeVar
|
| 5 |
from pydantic import BaseModel
|
| 6 |
from browser_use.agent.views import ActionResult
|
| 7 |
from browser_use.browser.context import BrowserContext
|
| 8 |
+
from browser_use.controller.service import Controller, DoneAction
|
| 9 |
from browser_use.controller.registry.service import Registry, RegisteredAction
|
| 10 |
from main_content_extractor import MainContentExtractor
|
| 11 |
from browser_use.controller.views import (
|
| 12 |
ClickElementAction,
|
| 13 |
DoneAction,
|
| 14 |
+
ExtractPageContentAction,
|
| 15 |
GoToUrlAction,
|
| 16 |
InputTextAction,
|
| 17 |
OpenTabAction,
|
|
|
|
| 35 |
|
| 36 |
Context = TypeVar('Context')
|
| 37 |
|
| 38 |
+
|
| 39 |
class CustomController(Controller):
|
| 40 |
def __init__(self, exclude_actions: list[str] = [],
|
| 41 |
output_model: Optional[Type[BaseModel]] = None,
|
|
|
|
| 81 |
return ActionResult(error=f'File {path} does not exist')
|
| 82 |
|
| 83 |
dom_el = await browser.get_dom_element_by_index(index)
|
| 84 |
+
|
| 85 |
file_upload_dom_el = dom_el.get_file_upload_element()
|
| 86 |
|
| 87 |
if file_upload_dom_el is None:
|
|
|
|
| 111 |
self,
|
| 112 |
action: ActionModel,
|
| 113 |
browser_context: Optional[BrowserContext] = None,
|
| 114 |
+
#
|
| 115 |
page_extraction_llm: Optional[BaseChatModel] = None,
|
| 116 |
sensitive_data: Optional[Dict[str, str]] = None,
|
| 117 |
available_file_paths: Optional[list[str]] = None,
|
| 118 |
+
#
|
| 119 |
context: Context | None = None,
|
| 120 |
) -> ActionResult:
|
| 121 |
"""Execute an action"""
|
|
|
|
| 124 |
for action_name, params in action.model_dump(exclude_unset=True).items():
|
| 125 |
if params is not None:
|
| 126 |
if action_name.startswith("mcp"):
|
| 127 |
+
# this is a mcp tool
|
| 128 |
logger.debug(f"Invoke MCP tool: {action_name}")
|
| 129 |
mcp_tool = self.registry.registry.actions.get(action_name).function
|
| 130 |
result = await mcp_tool.ainvoke(params)
|
|
|
|
| 158 |
self.register_mcp_tools()
|
| 159 |
|
| 160 |
def register_mcp_tools(self):
|
| 161 |
+
"""
|
| 162 |
+
Register the MCP tools used by this controller.
|
| 163 |
+
"""
|
| 164 |
if self.mcp_client:
|
| 165 |
for server_name in self.mcp_client.server_name_to_tools:
|
| 166 |
for tool in self.mcp_client.server_name_to_tools[server_name]:
|
|
|
|
| 172 |
param_model=create_tool_param_model(tool),
|
| 173 |
)
|
| 174 |
logger.info(f"Add mcp tool: {tool_name}")
|
| 175 |
+
logger.debug(
|
| 176 |
+
f"Registered {len(self.mcp_client.server_name_to_tools[server_name])} mcp tools for {server_name}")
|
| 177 |
else:
|
| 178 |
logger.warning(f"MCP client not started.")
|
| 179 |
|
| 180 |
async def close_mcp_client(self):
|
| 181 |
if self.mcp_client:
|
| 182 |
+
await self.mcp_client.__aexit__(None, None, None)
|