diff --git a/agenthub/langchains_agent/__init__.py b/agenthub/langchains_agent/__init__.py index 66fb268366..f504b234c4 100644 --- a/agenthub/langchains_agent/__init__.py +++ b/agenthub/langchains_agent/__init__.py @@ -136,7 +136,7 @@ class LangchainsAgent(Agent): else: d = {"action": "output", "args": {"output": obs.content}} else: - raise ValueError(f"Unknown observation type: {obs}") + d = {"action": "output", "args": {"output": obs.content}} if d is not None: self._add_event(d) diff --git a/opendevin/controller/__init__.py b/opendevin/controller/__init__.py index 787c31cceb..62b3cb9337 100644 --- a/opendevin/controller/__init__.py +++ b/opendevin/controller/__init__.py @@ -1,5 +1,6 @@ import asyncio from typing import List, Callable, Tuple +import traceback from opendevin.state import State from opendevin.agent import Agent @@ -45,8 +46,12 @@ class AgentController: self.state_updated_info = [] return state - def add_observation(self, observation: Observation): - self.state_updated_info.append((NullAction(), observation)) + def add_history(self, action: Action, observation: Observation): + if not isinstance(action, Action): + raise ValueError("action must be an instance of Action") + if not isinstance(observation, Observation): + raise ValueError("observation must be an instance of Observation") + self.state_updated_info.append((action, observation)) async def start_loop(self, task_instruction: str): finished = False @@ -56,6 +61,7 @@ class AgentController: finished = await self.step(i) except Exception as e: print("Error in loop", e, flush=True) + traceback.print_exc() break if finished: break @@ -67,7 +73,7 @@ class AgentController: print("STEP", i, flush=True) log_obs = self.command_manager.get_background_obs() for obs in log_obs: - self.add_observation(obs) + self.add_history(NullAction(), obs) await self._run_callbacks(obs) print_with_indent("\nBACKGROUND LOG:\n%s" % obs) @@ -91,7 +97,7 @@ class AgentController: else: observation = NullObservation("") print_with_indent("\nOBSERVATION:\n%s" % observation) - self.state_updated_info.append((action, observation)) + self.add_history(action, observation) await self._run_callbacks(observation) diff --git a/opendevin/server/session.py b/opendevin/server/session.py index bbe44b8a5a..ca49f3f646 100644 --- a/opendevin/server/session.py +++ b/opendevin/server/session.py @@ -6,6 +6,7 @@ from fastapi import WebSocketDisconnect from opendevin.action import ( Action, + NullAction, CmdRunAction, CmdKillAction, BrowseURLAction, @@ -99,7 +100,7 @@ class Session: await self.send_error("No agent started. Please wait a second...") elif event["action"] == "chat": - self.controller.add_observation(UserMessageObservation(event["message"])) + self.controller.add_history(NullAction(), UserMessageObservation(event["message"])) else: # TODO: we only need to implement user message for now # since even Devin does not support having the user taking other