openhands.controller.agent_controller
AgentController Objects
class AgentController()
__init__
def __init__(agent: Agent,
event_stream: EventStream,
max_iterations: int,
max_budget_per_task: float | None = None,
agent_to_llm_config: dict[str, LLMConfig] | None = None,
agent_configs: dict[str, AgentConfig] | None = None,
sid: str = 'default',
confirmation_mode: bool = False,
initial_state: State | None = None,
is_delegate: bool = False,
headless_mode: bool = True,
status_callback: Callable | None = None)
Initializes a new instance of the AgentController class.
Arguments:
agent
- The agent instance to control.event_stream
- The event stream to publish events to.max_iterations
- The maximum number of iterations the agent can run.max_budget_per_task
- The maximum budget (in USD) allowed per task, beyond which the agent will stop.agent_to_llm_config
- A dictionary mapping agent names to LLM configurations in the case that we delegate to a different agent.agent_configs
- A dictionary mapping agent names to agent configurations in the case that we delegate to a different agent.sid
- The session ID of the agent.confirmation_mode
- Whether to enable confirmation mode for agent actions.initial_state
- The initial state of the controller.is_delegate
- Whether this controller is a delegate.event_stream
0 - Whether the agent is run in headless mode.event_stream
1 - Optional callback function to handle status updates.
close
async def close() -> None
Closes the agent controller, canceling any ongoing tasks and unsubscribing from the event stream.
Note that it's fairly important that this closes properly, otherwise the state is incomplete.
log
def log(level: str, message: str, extra: dict | None = None) -> None
Logs a message to the agent controller's logger.
Arguments:
level
str - The logging level to use (e.g., 'info', 'debug', 'error').message
str - The message to log.extra
dict | None, optional - Additional fields to include in the log. Defaults to None.
start_step_loop
async def start_step_loop()
The main loop for the agent's step-by-step execution.
on_event
async def on_event(event: Event) -> None
Callback from the event stream. Notifies the controller of incoming events.
Arguments:
event
Event - The incoming event to process.
set_agent_state_to
async def set_agent_state_to(new_state: AgentState) -> None
Updates the agent's state and handles side effects. Can emit events to the event stream.
Arguments:
new_state
AgentState - The new state to set for the agent.
get_agent_state
def get_agent_state() -> AgentState
Returns the current state of the agent.
Returns:
AgentState
- The current state of the agent.
start_delegate
async def start_delegate(action: AgentDelegateAction) -> None
Start a delegate agent to handle a subtask.
OpenHands is a multi-agentic system. A task
is a conversation between
OpenHands (the whole system) and the user, which might involve one or more inputs
from the user. It starts with an initial input (typically a task statement) from
the user, and ends with either an AgentFinishAction
initiated by the agent, a
stop initiated by the user, or an error.
A subtask
is a conversation between an agent and the user, or another agent. If a task
is conducted by a single agent, then it's also a subtask
. Otherwise, a task
consists of
multiple subtasks
, each executed by one agent.
Arguments:
action
AgentDelegateAction - The action containing information about the delegate agent to start.
get_state
def get_state() -> State
Returns the current running state object.
Returns:
State
- The current state object.
set_initial_state
def set_initial_state(state: State | None,
max_iterations: int,
confirmation_mode: bool = False) -> None
Sets the initial state for the agent, either from the previous session, or from a parent agent, or by creating a new one.
Arguments:
state
- The state to initialize with, or None to create a new state.max_iterations
- The maximum number of iterations allowed for the task.confirmation_mode
- Whether to enable confirmation mode.