OpenHands/opendevin/controller.py
Robert Brennan b84463f512
Refactor agent interface a bit (#74)
* start moving files

* initial refactor

* factor out command management

* fix command runner

* add workspace to gitignore

* factor out command manager

* remove dupe add_event

* update docs

* fix init

* fix langchain agent after merge
2024-03-21 23:35:28 +08:00

50 lines
1.7 KiB
Python

from opendevin.lib.command_manager import CommandManager
from opendevin.lib.event import Event
def print_callback(event):
print(event, flush=True)
class AgentController:
def __init__(self, agent, max_iterations=100, callbacks=[]):
self.agent = agent
self.max_iterations = max_iterations
self.background_commands = []
self.command_manager = CommandManager()
self.callbacks = callbacks
self.callbacks.append(self.agent.add_event)
self.callbacks.append(print_callback)
def maybe_perform_action(self, event):
if not (event and event.is_runnable()):
return
action = 'output'
try:
output = event.run(self)
except Exception as e:
output = 'Error: ' + str(e)
action = 'error'
out_event = Event(action, {'output': output})
return out_event
def start_loop(self):
output = None
for i in range(self.max_iterations):
print("STEP", i, flush=True)
log_events = self.command_manager.get_background_events()
for event in log_events:
for callback in self.callbacks:
callback(event)
action_event = self.agent.step(self.command_manager)
for callback in self.callbacks:
callback(action_event)
if action_event.action == 'finish':
break
print("---", flush=True)
output_event = self.maybe_perform_action(action_event)
if output_event is not None:
for callback in self.callbacks:
callback(output_event)
print("==============", flush=True)