-
Notifications
You must be signed in to change notification settings - Fork 235
Expand file tree
/
Copy pathdefault.py
More file actions
135 lines (110 loc) · 4.55 KB
/
default.py
File metadata and controls
135 lines (110 loc) · 4.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""Default preset configuration for OpenHands agents."""
from pathlib import Path
from openhands.sdk import Agent, agent_definition_to_factory, load_agents_from_dir
from openhands.sdk.context.condenser import (
LLMSummarizingCondenser,
)
from openhands.sdk.context.condenser.base import CondenserBase
from openhands.sdk.llm.llm import LLM
from openhands.sdk.logger import get_logger
from openhands.sdk.subagent import register_agent_if_absent
from openhands.sdk.tool import Tool
logger = get_logger(__name__)
def register_default_tools(enable_browser: bool = True) -> None:
"""Register the default set of tools."""
# Tools are now automatically registered when imported
from openhands.tools.delegate import DelegateTool
from openhands.tools.file_editor import FileEditorTool
from openhands.tools.task_tracker import TaskTrackerTool
from openhands.tools.terminal import TerminalTool
logger.debug(f"Tool: {TerminalTool.name} registered.")
logger.debug(f"Tool: {FileEditorTool.name} registered.")
logger.debug(f"Tool: {TaskTrackerTool.name} registered.")
logger.debug(f"Tool: {DelegateTool.name} registered.")
if enable_browser:
from openhands.tools.browser_use import BrowserToolSet
logger.debug(f"Tool: {BrowserToolSet.name} registered.")
def get_default_tools(
enable_browser: bool = True,
) -> list[Tool]:
"""Get the default set of tool specifications for the standard experience.
Args:
enable_browser: Whether to include browser tools.
"""
register_default_tools(enable_browser=enable_browser)
# Import tools to access their name attributes
from openhands.tools.delegate import DelegateTool
from openhands.tools.file_editor import FileEditorTool
from openhands.tools.task_tracker import TaskTrackerTool
from openhands.tools.terminal import TerminalTool
tools = [
Tool(name=TerminalTool.name),
Tool(name=FileEditorTool.name),
Tool(name=TaskTrackerTool.name),
Tool(name=DelegateTool.name),
]
if enable_browser:
from openhands.tools.browser_use import BrowserToolSet
tools.append(Tool(name=BrowserToolSet.name))
return tools
def get_default_condenser(llm: LLM) -> CondenserBase:
# Create a condenser to manage the context. The condenser will automatically
# truncate conversation history when it exceeds max_size, and replaces the dropped
# events with an LLM-generated summary.
condenser = LLMSummarizingCondenser(llm=llm, max_size=80, keep_first=4)
return condenser
def get_default_agent(
llm: LLM,
cli_mode: bool = False,
) -> Agent:
tools = get_default_tools(
# Disable browser tools in CLI mode
enable_browser=not cli_mode,
)
agent = Agent(
llm=llm,
tools=tools,
system_prompt_kwargs={"cli_mode": cli_mode},
condenser=get_default_condenser(
llm=llm.model_copy(update={"usage_id": "condenser"})
),
)
return agent
def register_builtins_agents(enable_browser: bool = True) -> list[str]:
"""Load and register builtin agents from ``subagent/*.md``.
They are registered via `register_agent_if_absent` and will not
overwrite agents already registered by programmatic calls, plugins,
or project/user-level file-based definitions.
Args:
enable_browser: Whether browser tools are available. When False,
agents that require browser tools (e.g. web researcher) are
skipped.
Returns:
List of agents which were actually registered.
"""
register_default_tools(enable_browser=enable_browser)
subagent_dir = Path(__file__).parent / "subagents"
builtins_agents_def = load_agents_from_dir(subagent_dir)
# Filter out browser-dependent agents when browser is not available
if not enable_browser:
_browser_only_agents = {"web-researcher"}
builtins_agents_def = [
agent
for agent in builtins_agents_def
if agent.name not in _browser_only_agents
]
registered: list[str] = []
for agent_def in builtins_agents_def:
factory = agent_definition_to_factory(agent_def)
was_registered = register_agent_if_absent(
name=agent_def.name,
factory_func=factory,
description=agent_def,
)
if was_registered:
registered.append(agent_def.name)
logger.info(
f"Registered file-based agent '{agent_def.name}'"
+ (f" from {agent_def.source}" if agent_def.source else "")
)
return registered