-
Notifications
You must be signed in to change notification settings - Fork 218
Expand file tree
/
Copy pathdefault.py
More file actions
137 lines (109 loc) · 4.48 KB
/
default.py
File metadata and controls
137 lines (109 loc) · 4.48 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
136
137
"""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.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.")
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.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),
]
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(cli_mode: bool = False) -> 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:
cli_mode: Whether to load the default agent in cli mode or not.
Returns:
List of agents which were actually registered.
"""
register_default_tools(
# Disable browser tools in CLI mode
enable_browser=not cli_mode,
)
subagent_dir = Path(__file__).parent / "subagents"
builtins_agents_def = load_agents_from_dir(subagent_dir)
# if we are in cli mode, we filter out the default agent (with browser tool)
# otherwise, we filter out the default cli agent
if cli_mode:
builtins_agents_def = [
agent for agent in builtins_agents_def if agent.name != "default"
]
else:
builtins_agents_def = [
agent for agent in builtins_agents_def if agent.name != "default cli mode"
]
registered: list[str] = []
for agent_def in builtins_agents_def:
factory = agent_definition_to_factory(agent_def)
if not agent_def.description:
agent_def = agent_def.model_copy(
update={"description": f"Agent: {agent_def.name}"}
)
was_registered = register_agent_if_absent(factory, 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