[Haik]: refactored the browser toolkit into 2 sub toolkits (one for delegation and one for actions)

This commit is contained in:
haikdc
2026-04-02 15:13:14 -07:00
parent 804aeb74f9
commit 607165b866
12 changed files with 236 additions and 39 deletions
@@ -1,9 +1,9 @@
# BUILTIN_TOOLKIT.py
from typing import Dict, Callable
from typing import Dict
from typeguard import typechecked
from backend.apps.agents.HaikFix.tools.shared_structs.Toolkit import Toolkit
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.agents_toolkit.make_agents_toolkit import make_agents_toolkit
# TODO: add browser toolkit
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_toolkit import make_browser_toolkit
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.pre_existing_toolkits.FILESYSTEM_TOOLKIT import FILESYSTEM_TOOLKIT
@@ -14,6 +14,7 @@ from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.pre_existing_toolkit
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.pre_existing_toolkits.SYSTEM_TOOLKIT import SYSTEM_TOOLKIT
from backend.apps.agents.HaikFix.Agent.Agent import Agent
@typechecked
def make_builtin_toolkit(
parent: Agent,
agent_registry: Dict[str, Agent],
@@ -0,0 +1,31 @@
from typing_extensions import NotRequired
from typing import TypedDict
class BrowserScreenshotInput(TypedDict):
pass
class BrowserGetTextInput(TypedDict):
pass
class BrowserNavigateInput(TypedDict):
url: str
class BrowserClickInput(TypedDict):
selector: str
class BrowserTypeInput(TypedDict):
selector: str
text: str
class BrowserEvaluateInput(TypedDict):
expression: str
class BrowserGetElementsInput(TypedDict):
selector: NotRequired[str]
class BrowserScrollInput(TypedDict):
direction: NotRequired[str]
amount: NotRequired[float]
class BrowserWaitInput(TypedDict):
milliseconds: NotRequired[float]
@@ -0,0 +1,22 @@
from typing import Dict, Any
from typeguard import typechecked
from backend.apps.agents.HaikFix.Agent.shared_structs.Message.agent_outputs import ToolResponse
from backend.apps.agents.browser.executor import execute_browser_tool, _format_tool_result
@typechecked
def make_browser_action_handler(tool_name: str, browser_id: str, tab_id: str):
async def handler(args: Dict[str, Any]) -> ToolResponse:
result = await execute_browser_tool(tool_name, args, browser_id, tab_id)
if "error" in result:
return {
"content": [
{
"type": "text",
"text": f"Error: {result['error']}",
},
],
"is_error": True,
}
content_blocks = _format_tool_result(result, tool_name)
return {"content": content_blocks}
return handler
@@ -0,0 +1,122 @@
from typeguard import typechecked
from backend.apps.agents.HaikFix.tools.shared_structs.Toolkit import Toolkit
from backend.apps.agents.HaikFix.tools.shared_structs.MCP_Tool import SDK_MCP_Tool
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_actions_toolkit.handlers.browser_action_input_schemas import (
BrowserScreenshotInput,
BrowserGetTextInput,
BrowserNavigateInput,
BrowserClickInput,
BrowserTypeInput,
BrowserEvaluateInput,
BrowserGetElementsInput,
BrowserScrollInput,
BrowserWaitInput,
)
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_actions_toolkit.handlers.make_browser_action_handler import make_browser_action_handler
SERVER_NAME = "openswarm-browser-actions"
@typechecked
def make_browser_actions_toolkit(browser_id: str, tab_id: str = "") -> Toolkit:
return Toolkit(
name="browser_actions",
description="Low-level browser automation actions for a single browser tab",
tools=[
SDK_MCP_Tool(
name="BrowserScreenshot",
description=(
"Capture a screenshot of the browser page. Returns the screenshot as a "
"base64-encoded PNG image. Use this to see what is currently displayed."
),
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserScreenshotInput,
handler=make_browser_action_handler("BrowserScreenshot", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserGetText",
description="Get the visible text content of the browser page. Returns up to 15000 characters.",
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserGetTextInput,
handler=make_browser_action_handler("BrowserGetText", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserNavigate",
description="Navigate the browser to a URL.",
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserNavigateInput,
handler=make_browser_action_handler("BrowserNavigate", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserClick",
description=(
"Click an element identified by a CSS selector. "
"Use BrowserGetElements first to discover valid selectors."
),
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserClickInput,
handler=make_browser_action_handler("BrowserClick", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserType",
description="Type text into an input element. Clears existing value first.",
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserTypeInput,
handler=make_browser_action_handler("BrowserType", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserEvaluate",
description="Evaluate a JavaScript expression in the browser page and return the result.",
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserEvaluateInput,
handler=make_browser_action_handler("BrowserEvaluate", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserGetElements",
description=(
"Get a list of interactive elements on the page with CSS selectors. "
"Call this BEFORE clicking or typing so you know which selectors are valid."
),
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserGetElementsInput,
handler=make_browser_action_handler("BrowserGetElements", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserScroll",
description=(
"Scroll the page up or down. Automatically finds the correct scrollable "
"container. Returns scroll position info including whether top/bottom has been reached."
),
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserScrollInput,
handler=make_browser_action_handler("BrowserScroll", browser_id, tab_id),
),
SDK_MCP_Tool(
name="BrowserWait",
description=(
"Wait for a specified duration. Useful after navigation or actions that "
"trigger page loads. Min 100ms, max 10000ms."
),
deferred=False,
permission="allow",
server_name=SERVER_NAME,
input_schema=BrowserWaitInput,
handler=make_browser_action_handler("BrowserWait", browser_id, tab_id),
),
],
)
@@ -3,8 +3,8 @@ from typing import TypedDict
from typeguard import typechecked
from backend.apps.agents.HaikFix.Agent.shared_structs.Message.agent_outputs import ToolResponse
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.utils.run_browser_loop import run_browser_loop
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.utils.format_browser_result import format_browser_result
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.utils.run_browser_loop import run_browser_loop
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.utils.format_browser_result import format_browser_result
from backend.apps.agents.HaikFix.Agent.Agent import Agent
# NOTE: Legacy dependancy. TODO: fix this shit cuh
@@ -5,9 +5,9 @@ from typing import Dict, List, Any
# TODO: fix this shit cuh
from backend.apps.agents.browser.executor import execute_browser_tool, _format_tool_result
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.utils.temp_sub_utils.model_ids import is_valid_model_id
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.utils.temp_sub_utils.model_ids import get_anthropic_client
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.utils.temp_sub_utils.schemas import BROWSER_TOOLS_SCHEMA, SYSTEM_PROMPT, MAX_TURNS
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.utils.temp_sub_utils.model_ids import is_valid_model_id
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.utils.temp_sub_utils.model_ids import get_anthropic_client
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.utils.temp_sub_utils.schemas import BROWSER_TOOLS_SCHEMA, SYSTEM_PROMPT, MAX_TURNS
async def run_browser_loop(
task: str,
@@ -0,0 +1,44 @@
from typeguard import typechecked
from backend.apps.agents.HaikFix.tools.shared_structs.Toolkit import Toolkit
from backend.apps.agents.HaikFix.tools.shared_structs.MCP_Tool import SDK_MCP_Tool
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.make_create_browser_agent_handler import (
make_create_browser_agent_handler, CreateBrowserAgentInput,
)
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.handlers.make_invoke_browser_agent_handler import (
make_invoke_browser_agent_handler, InvokeBrowserAgentInput,
)
from backend.apps.agents.HaikFix.Agent.Agent import Agent
@typechecked
def make_browser_delegation_toolkit(parent: Agent) -> Toolkit:
return Toolkit(
name="browser",
description="Tools for browser automation",
tools=[
SDK_MCP_Tool(
name="CreateBrowserAgent",
description=(
"Create a new browser and run a task on it. A dedicated browser agent "
"will autonomously navigate, click, type, and return a summary plus screenshot."
),
deferred=False,
permission="allow",
server_name="openswarm-browser",
input_schema=CreateBrowserAgentInput,
handler=make_create_browser_agent_handler(parent),
),
SDK_MCP_Tool(
name="InvokeBrowserAgent",
description=(
"Run a task on an existing browser. The browser agent will autonomously "
"perform the task and return a summary plus screenshot."
),
deferred=False,
permission="allow",
server_name="openswarm-browser",
input_schema=InvokeBrowserAgentInput,
handler=make_invoke_browser_agent_handler(parent),
),
],
)
@@ -1,42 +1,19 @@
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_actions_toolkit.make_browser_actions_toolkit import make_browser_actions_toolkit
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.make_browser_delegation_toolkit.make_browser_delegation_toolkit import make_browser_delegation_toolkit
from backend.apps.agents.HaikFix.tools.shared_structs.Toolkit import Toolkit
from backend.apps.agents.HaikFix.tools.shared_structs.MCP_Tool import SDK_MCP_Tool
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.make_create_browser_agent_handler import (
make_create_browser_agent_handler, CreateBrowserAgentInput,
)
from backend.apps.agents.HaikFix.tools.make_builtin_toolkit.open_swarm_toolkits.browser_toolkit.handlers.make_invoke_browser_agent_handler import (
make_invoke_browser_agent_handler, InvokeBrowserAgentInput,
)
from typing import Dict
from backend.apps.agents.HaikFix.Agent.Agent import Agent
def make_browser_toolkit(parent: Agent, create_browser_card_fn) -> Toolkit:
def make_browser_toolkit(
parent: Agent,
) -> Toolkit:
return Toolkit(
name="browser",
description="Tools for browser automation",
tools=[
SDK_MCP_Tool(
name="CreateBrowserAgent",
description=(
"Create a new browser and run a task on it. A dedicated browser agent "
"will autonomously navigate, click, type, and return a summary plus screenshot."
),
deferred=False,
permission="allow",
server_name="openswarm-browser",
input_schema=CreateBrowserAgentInput,
handler=make_create_browser_agent_handler(parent, create_browser_card_fn),
),
SDK_MCP_Tool(
name="InvokeBrowserAgent",
description=(
"Run a task on an existing browser. The browser agent will autonomously "
"perform the task and return a summary plus screenshot."
),
deferred=False,
permission="allow",
server_name="openswarm-browser",
input_schema=InvokeBrowserAgentInput,
handler=make_invoke_browser_agent_handler(parent),
),
nested_toolkits=[
make_browser_delegation_toolkit(parent),
make_browser_actions_toolkit(parent),
],
)