forked from All-Hands-AI/OpenHands
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Abstraction that allows us to develop different agents, frontend, bac…
…kend, and evaluation in parallel (All-Hands-AI#68) * move agent to langchains_agent * remove old .env * remove the old agent folder * add preliminary version of Agent abstraction * add preliminary version of the main.py * merge controlloop and main into a Agent class * add init * fix json import * fix missing arg * get langchains_agent working after abstraction * rename `research` to `agenthub` * rename: rename research to agenthub --------- Co-authored-by: huybery <huybery@gmail.com>
- Loading branch information
Showing
140 changed files
with
296 additions
and
131 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# Agent Framework Research | ||
|
||
In this folder, there may exist multiple implementations of `Agent` that will be used by the | ||
|
||
For example, `agenthub/langchain_agent`, `agenthub/metagpt_agent`, `agenthub/codeact_agent`, etc. | ||
Contributors from different backgrounds and interests can choose to contribute to any (or all!) of these directions. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from . import langchains_agent |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
import os | ||
import argparse | ||
|
||
from opendevin.agent import Agent, Message | ||
|
||
from agenthub.langchains_agent.utils.agent import Agent as LangchainsAgentImpl | ||
from agenthub.langchains_agent.utils.event import Event | ||
|
||
INITIAL_THOUGHTS = [ | ||
"I exist!", | ||
"Hmm...looks like I can type in a command line prompt", | ||
"Looks like I have a web browser too!", | ||
"Here's what I want to do: $TASK", | ||
"How am I going to get there though?", | ||
"It seems like I have some kind of short term memory.", | ||
"Each of my thoughts seems to be stored in a numbered list.", | ||
"It seems whatever I say next will be added to the list.", | ||
"But no one has perfect short-term memory. My list of thoughts will be summarized and condensed over time, losing information in the process.", | ||
"Fortunately I have long term memory!", | ||
"I can just say RECALL, followed by the thing I want to remember. And then related thoughts just spill out!", | ||
"Sometimes they're random thoughts that don't really have to do with what I wanted to remember. But usually they're exactly what I need!", | ||
"Let's try it out!", | ||
"RECALL what it is I want to do", | ||
"Here's what I want to do: $TASK", | ||
"How am I going to get there though?", | ||
"Neat! And it looks like it's easy for me to use the command line too! I just have to say RUN followed by the command I want to run. The command output just jumps into my head!", | ||
'RUN echo "hello world"', | ||
"hello world", | ||
"Cool! I bet I can read and edit files too.", | ||
"RUN echo \"console.log('hello world')\" > test.js", | ||
"", | ||
"I just created test.js. I'll try and run it now.", | ||
"RUN node test.js", | ||
"hello world", | ||
"it works!", | ||
"And if I want to use the browser, I just need to say BROWSE, followed by a website I want to visit, or an action I want to take on the current site", | ||
"Let's try that...", | ||
"BROWSE google.com", | ||
'<form><input type="text"></input><button type="submit"></button></form>', | ||
"Very cool. Now to accomplish my task.", | ||
"I'll need a strategy. And as I make progress, I'll need to keep refining that strategy. I'll need to set goals, and break them into sub-goals.", | ||
"In between actions, I must always take some time to think, strategize, and set new goals. I should never take two actions in a row.", | ||
"OK so my task is to $TASK. I haven't made any progress yet. Where should I start?", | ||
"It seems like there might be an existing project here. I should probably start by running `ls` to see what's here.", | ||
] | ||
|
||
|
||
class LangchainsAgent(Agent): | ||
|
||
def _run_loop(self, agent: LangchainsAgentImpl, max_iterations=100): | ||
# TODO: make it add a Message to the history for each turn / event | ||
for i in range(max_iterations): | ||
print("STEP", i, flush=True) | ||
log_events = agent.get_background_logs() | ||
for event in log_events: | ||
print(event, flush=True) | ||
action = agent.get_next_action() | ||
if action.action == "finish": | ||
print("Done!", flush=True) | ||
break | ||
print(action, flush=True) | ||
print("---", flush=True) | ||
out = agent.maybe_perform_latest_action() | ||
print(out, flush=True) | ||
print("==============", flush=True) | ||
|
||
def run(self) -> None: | ||
""" | ||
Starts the execution of the assigned instruction. This method should | ||
be implemented by subclasses to define the specific execution logic. | ||
""" | ||
agent = LangchainsAgentImpl(self.instruction) | ||
next_is_output = False | ||
for thought in INITIAL_THOUGHTS: | ||
thought = thought.replace("$TASK", self.instruction) | ||
if next_is_output: | ||
event = Event("output", {"output": thought}) | ||
next_is_output = False | ||
else: | ||
if thought.startswith("RUN"): | ||
command = thought.split("RUN ")[1] | ||
event = Event("run", {"command": command}) | ||
next_is_output = True | ||
elif thought.startswith("RECALL"): | ||
query = thought.split("RECALL ")[1] | ||
event = Event("recall", {"query": query}) | ||
next_is_output = True | ||
elif thought.startswith("BROWSE"): | ||
url = thought.split("BROWSE ")[1] | ||
event = Event("browse", {"url": url}) | ||
next_is_output = True | ||
else: | ||
event = Event("think", {"thought": thought}) | ||
|
||
agent.add_event(event) | ||
self._run_loop(agent, self.max_steps) | ||
|
||
# Set the agent's completion status to True | ||
self._complete = True | ||
|
||
def chat(self, message: str) -> None: | ||
""" | ||
Optional method for interactive communication with the agent during its execution. Implementations | ||
can use this method to modify the agent's behavior or state based on chat inputs. | ||
Parameters: | ||
- message (str): The chat message or command. | ||
""" | ||
raise NotImplementedError | ||
|
||
Agent.register("LangchainsAgent", LangchainsAgent) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#!/bin/bash | ||
set -eo pipefail | ||
|
||
rm -rf `pwd`/workspace | ||
mkdir -p `pwd`/workspace | ||
|
||
pushd agenthub/langchains_agent | ||
docker build -t control-loop . | ||
popd | ||
docker run \ | ||
-e DEBUG=$DEBUG \ | ||
-e OPENAI_API_KEY=$OPENAI_API_KEY \ | ||
-u `id -u`:`id -g` \ | ||
-v `pwd`/workspace:/workspace \ | ||
-v `pwd`:/app:ro \ | ||
-e PYTHONPATH=/app \ | ||
control-loop \ | ||
python /app/opendevin/main.py -d /workspace -t "${1}" | ||
|
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
from .run import run | ||
from .kill import kill | ||
from .browse import browse | ||
from .write import write | ||
from .read import read | ||
|
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
8 changes: 4 additions & 4 deletions
8
agent/lib/agent.py → agenthub/langchains_agent/utils/agent.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
agent/lib/memory.py → agenthub/langchains_agent/utils/memory.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
import os | ||
import lib.json as json | ||
from . import json | ||
|
||
import chromadb | ||
|
||
|
6 changes: 3 additions & 3 deletions
6
agent/lib/monologue.py → agenthub/langchains_agent/utils/monologue.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.