mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-09-11 12:17:45 +02:00
[Haik]: refactored the browser toolkit into 2 sub toolkits (one for delegation and one for actions)
This commit is contained in:
@@ -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],
|
||||
|
||||
+31
@@ -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]
|
||||
+22
@@ -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
|
||||
+122
@@ -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),
|
||||
),
|
||||
],
|
||||
)
|
||||
+2
-2
@@ -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
|
||||
+3
-3
@@ -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,
|
||||
+44
@@ -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),
|
||||
),
|
||||
],
|
||||
)
|
||||
+9
-32
@@ -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),
|
||||
],
|
||||
)
|
||||
Reference in New Issue
Block a user