Move agenthub within openhands (#4130)

This commit is contained in:
Engel Nyst 2024-10-08 02:34:18 +02:00 committed by GitHub
parent a3571ec510
commit e6847e9e61
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
88 changed files with 57 additions and 52 deletions

View File

@ -294,7 +294,7 @@ jobs:
SANDBOX_RUNTIME_CONTAINER_IMAGE=$image_name \
TEST_IN_CI=true \
RUN_AS_OPENHANDS=false \
poetry run pytest -n 3 -raRs --reruns 2 --reruns-delay 5 --cov=agenthub --cov=openhands --cov-report=xml -s ./tests/runtime
poetry run pytest -n 3 -raRs --reruns 2 --reruns-delay 5 --cov=openhands --cov-report=xml -s ./tests/runtime
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
env:
@ -372,7 +372,7 @@ jobs:
SANDBOX_RUNTIME_CONTAINER_IMAGE=$image_name \
TEST_IN_CI=true \
RUN_AS_OPENHANDS=true \
poetry run pytest -n 3 -raRs --reruns 2 --reruns-delay 5 --cov=agenthub --cov=openhands --cov-report=xml -s ./tests/runtime
poetry run pytest -n 3 -raRs --reruns 2 --reruns-delay 5 --cov=openhands --cov-report=xml -s ./tests/runtime
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
env:

View File

@ -46,4 +46,4 @@ jobs:
- name: Install pre-commit
run: pip install pre-commit==3.7.0
- name: Run pre-commit hooks
run: pre-commit run --files openhands/**/* agenthub/**/* evaluation/**/* tests/**/* --show-diff-on-failure --config ./dev_config/python/.pre-commit-config.yaml
run: pre-commit run --files openhands/**/* evaluation/**/* tests/**/* --show-diff-on-failure --config ./dev_config/python/.pre-commit-config.yaml

View File

@ -93,7 +93,7 @@ jobs:
id: buildx
uses: docker/setup-buildx-action@v3
- name: Run Tests
run: poetry run pytest --forked --cov=agenthub --cov=openhands --cov-report=xml ./tests/unit --ignore=tests/unit/test_memory.py
run: poetry run pytest --forked --cov=openhands --cov-report=xml ./tests/unit --ignore=tests/unit/test_memory.py
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
env:
@ -125,7 +125,7 @@ jobs:
- name: Build Environment
run: make build
- name: Run Tests
run: poetry run pytest --forked --cov=agenthub --cov=openhands --cov-report=xml -svv ./tests/unit --ignore=tests/unit/test_memory.py
run: poetry run pytest --forked --cov=openhands --cov-report=xml -svv ./tests/unit --ignore=tests/unit/test_memory.py
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
env:

View File

@ -14,11 +14,12 @@ There are many ways that you can contribute:
To understand the codebase, please refer to the README in each module:
- [frontend](./frontend/README.md)
- [agenthub](./agenthub/README.md)
- [evaluation](./evaluation/README.md)
- [openhands](./openhands/README.md)
- [agenthub](./openhands/agenthub/README.md)
- [server](./openhands/server/README.md)
When you write code, it is also good to write tests. Please navigate to the `tests` folder to see existing test suites.
At the moment, we have two kinds of tests: `unit` and `integration`. Please refer to the README for each test suite. These tests also run on GitHub's continuous integration to ensure quality of the project.

View File

@ -69,7 +69,7 @@ RUN playwright install --with-deps chromium
COPY --chown=openhands:app --chmod=770 ./openhands ./openhands
COPY --chown=openhands:app --chmod=777 ./openhands/runtime/plugins ./openhands/runtime/plugins
COPY --chown=openhands:app --chmod=770 ./agenthub ./agenthub
COPY --chown=openhands:app --chmod=770 ./openhands/agenthub ./openhands/agenthub
COPY --chown=openhands:app ./pyproject.toml ./pyproject.toml
COPY --chown=openhands:app ./poetry.lock ./poetry.lock
COPY --chown=openhands:app ./README.md ./README.md

View File

@ -38,6 +38,6 @@ repos:
- id: mypy
additional_dependencies:
[types-requests, types-setuptools, types-pyyaml, types-toml]
entry: mypy --config-file dev_config/python/mypy.ini openhands/ agenthub/
entry: mypy --config-file dev_config/python/mypy.ini openhands/
always_run: true
pass_filenames: false

View File

@ -84,7 +84,7 @@ To create an evaluation workflow for your benchmark, follow these steps:
1. Import relevant OpenHands utilities:
```python
import agenthub
import openhands.agenthub
from evaluation.utils.shared import (
EvalMetadata,
EvalOutput,

View File

@ -36,7 +36,7 @@ fi
# IMPORTANT: Because Agent's prompt changes fairly often in the rapidly evolving codebase of OpenHands
# We need to track the version of Agent in the evaluation to make sure results are comparable
AGENT_VERSION=v$(poetry run python -c "import agenthub; from openhands.controller.agent import Agent; print(Agent.get_cls('$AGENT').VERSION)")
AGENT_VERSION=v$(poetry run python -c "import openhands.agenthub; from openhands.controller.agent import Agent; print(Agent.get_cls('$AGENT').VERSION)")
echo "AGENT: $AGENT"
echo "AGENT_VERSION: $AGENT_VERSION"

View File

@ -8,7 +8,7 @@ import pytest
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
CASES_DIR = os.path.join(SCRIPT_DIR, 'cases')
AGENTHUB_DIR = os.path.join(SCRIPT_DIR, '../../', 'agenthub')
AGENTHUB_DIR = os.path.join(SCRIPT_DIR, '../', 'agenthub')
def agents():

View File

@ -8,7 +8,7 @@ import pandas as pd
import toml
from datasets import load_dataset
import agenthub
import openhands.agenthub
from evaluation.swe_bench.prompt import CODEACT_SWE_PROMPT
from evaluation.utils.shared import (
EvalMetadata,
@ -470,7 +470,7 @@ if __name__ == '__main__':
raise ValueError(f'Could not find LLM config: --llm_config {args.llm_config}')
details = {}
_agent_cls = agenthub.Agent.get_cls(args.agent_cls)
_agent_cls = openhands.agenthub.Agent.get_cls(args.agent_cls)
if hasattr(_agent_cls, 'system_message'):
details['system_message'] = _agent_cls.system_message
if hasattr(_agent_cls, 'in_context_example'):

View File

@ -42,5 +42,5 @@ checkout_original_branch() {
get_agent_version() {
# IMPORTANT: Because Agent's prompt changes fairly often in the rapidly evolving codebase of OpenHands
# We need to track the version of Agent in the evaluation to make sure results are comparable
AGENT_VERSION=v$(poetry run python -c "import agenthub; from openhands.controller.agent import Agent; print(Agent.get_cls('$AGENT').VERSION)")
AGENT_VERSION=v$(poetry run python -c "import openhands.agenthub; from openhands.controller.agent import Agent; print(Agent.get_cls('$AGENT').VERSION)")
}

View File

@ -2,7 +2,7 @@
In this folder, there may exist multiple implementations of `Agent` that will be used by the framework.
For example, `agenthub/codeact_agent`, etc.
For example, `openhands/agenthub/codeact_agent`, etc.
Contributors from different backgrounds and interests can choose to contribute to any (or all!) of these directions.
## Constructing an Agent

View File

@ -1,13 +1,13 @@
from dotenv import load_dotenv
from agenthub.micro.agent import MicroAgent
from agenthub.micro.registry import all_microagents
from openhands.agenthub.micro.agent import MicroAgent
from openhands.agenthub.micro.registry import all_microagents
from openhands.controller.agent import Agent
load_dotenv()
from agenthub import ( # noqa: E402
from openhands.agenthub import ( # noqa: E402
browsing_agent,
codeact_agent,
codeact_swe_agent,

View File

@ -1,4 +1,4 @@
from agenthub.browsing_agent.browsing_agent import BrowsingAgent
from openhands.agenthub.browsing_agent.browsing_agent import BrowsingAgent
from openhands.controller.agent import Agent
Agent.register('BrowsingAgent', BrowsingAgent)

View File

@ -3,7 +3,7 @@ import os
from browsergym.core.action.highlevel import HighLevelActionSet
from browsergym.utils.obs import flatten_axtree_to_str
from agenthub.browsing_agent.response_parser import BrowsingResponseParser
from openhands.agenthub.browsing_agent.response_parser import BrowsingResponseParser
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
from openhands.core.config import AgentConfig

View File

@ -12,7 +12,7 @@ from browsergym.core.action.base import AbstractActionSet
from browsergym.core.action.highlevel import HighLevelActionSet
from browsergym.core.action.python import PythonActionSet
from agenthub.browsing_agent.utils import (
from openhands.agenthub.browsing_agent.utils import (
ParseError,
parse_html_tags_raise,
)

View File

@ -1,4 +1,4 @@
from agenthub.codeact_agent.codeact_agent import CodeActAgent
from openhands.agenthub.codeact_agent.codeact_agent import CodeActAgent
from openhands.controller.agent import Agent
Agent.register('CodeActAgent', CodeActAgent)

View File

@ -1,7 +1,7 @@
import os
from itertools import islice
from agenthub.codeact_agent.action_parser import CodeActResponseParser
from openhands.agenthub.codeact_agent.action_parser import CodeActResponseParser
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
from openhands.core.config import AgentConfig

View File

@ -1,4 +1,4 @@
from agenthub.codeact_swe_agent.codeact_swe_agent import CodeActSWEAgent
from openhands.agenthub.codeact_swe_agent.codeact_swe_agent import CodeActSWEAgent
from openhands.controller.agent import Agent
Agent.register('CodeActSWEAgent', CodeActSWEAgent)

View File

@ -1,10 +1,12 @@
from agenthub.codeact_swe_agent.prompt import (
from openhands.agenthub.codeact_swe_agent.prompt import (
COMMAND_DOCS,
SWE_EXAMPLE,
SYSTEM_PREFIX,
SYSTEM_SUFFIX,
)
from agenthub.codeact_swe_agent.response_parser import CodeActSWEResponseParser
from openhands.agenthub.codeact_swe_agent.response_parser import (
CodeActSWEResponseParser,
)
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
from openhands.core.config import AgentConfig

View File

@ -1,4 +1,4 @@
from agenthub.codeact_swe_agent.action_parser import (
from openhands.agenthub.codeact_swe_agent.action_parser import (
CodeActSWEActionParserCmdRun,
CodeActSWEActionParserFinish,
CodeActSWEActionParserIPythonRunCell,

View File

@ -1,4 +1,4 @@
from agenthub.delegator_agent.agent import DelegatorAgent
from openhands.agenthub.delegator_agent.agent import DelegatorAgent
from openhands.controller.agent import Agent
Agent.register('DelegatorAgent', DelegatorAgent)

View File

@ -1,4 +1,4 @@
from agenthub.dummy_agent.agent import DummyAgent
from openhands.agenthub.dummy_agent.agent import DummyAgent
from openhands.controller.agent import Agent
Agent.register('DummyAgent', DummyAgent)

View File

@ -1,7 +1,7 @@
from jinja2 import BaseLoader, Environment
from agenthub.micro.instructions import instructions
from agenthub.micro.registry import all_microagents
from openhands.agenthub.micro.instructions import instructions
from openhands.agenthub.micro.registry import all_microagents
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
from openhands.core.config import AgentConfig

View File

@ -1,4 +1,4 @@
from agenthub.planner_agent.agent import PlannerAgent
from openhands.agenthub.planner_agent.agent import PlannerAgent
from openhands.controller.agent import Agent
Agent.register('PlannerAgent', PlannerAgent)

View File

@ -1,5 +1,5 @@
from agenthub.planner_agent.prompt import get_prompt_and_images
from agenthub.planner_agent.response_parser import PlannerResponseParser
from openhands.agenthub.planner_agent.prompt import get_prompt_and_images
from openhands.agenthub.planner_agent.response_parser import PlannerResponseParser
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
from openhands.core.config import AgentConfig

View File

@ -4,7 +4,7 @@ from typing import Type
from termcolor import colored
import agenthub # noqa F401 (we import this to get the agents registered)
import openhands.agenthub # noqa F401 (we import this to get the agents registered)
from openhands import __version__
from openhands.controller import AgentController
from openhands.controller.agent import Agent

View File

@ -1,2 +1,2 @@
# Run this file to trigger a model download
import agenthub # noqa F401 (we import this to get the agents registered)
import openhands.agenthub # noqa F401 (we import this to get the agents registered)

View File

@ -4,7 +4,7 @@ import sys
import uuid
from typing import Callable, Protocol, Type
import agenthub # noqa F401 (we import this to get the agents registered)
import openhands.agenthub # noqa F401 (we import this to get the agents registered)
from openhands.controller import AgentController
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
@ -66,7 +66,7 @@ def create_runtime(
event_stream = EventStream(session_id, file_store)
# agent class
agent_cls = agenthub.Agent.get_cls(config.default_agent)
agent_cls = openhands.agenthub.Agent.get_cls(config.default_agent)
# runtime and tools
runtime_cls = get_runtime_cls(config.runtime)

View File

@ -34,7 +34,7 @@ from fastapi.security import HTTPBearer
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
import agenthub # noqa F401 (we import this to get the agents registered)
import openhands.agenthub # noqa F401 (we import this to get the agents registered)
from openhands.controller.agent import Agent
from openhands.core.config import LLMConfig, load_app_config
from openhands.core.logger import openhands_logger as logger

View File

@ -8,7 +8,6 @@ readme = "README.md"
repository = "https://github.com/All-Hands-AI/OpenHands"
include = ["poetry.lock"]
packages = [
{ include = "agenthub/**/*" },
{ include = "openhands/**/*" }
]
@ -86,6 +85,7 @@ reportlab = "*"
[tool.coverage.run]
concurrency = ["gevent"]
[tool.poetry.group.runtime.dependencies]
jupyterlab = "*"
notebook = "*"
@ -116,6 +116,7 @@ ignore = ["D1"]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.poetry.group.evaluation.dependencies]
streamlit = "*"
whatthepatch = "*"

View File

@ -119,7 +119,7 @@ run_test() {
local pytest_cmd="poetry run pytest --cache-clear -vvsxx $SCRIPT_DIR/test_agent.py::$test_name"
# Check if TEST_IN_CI is defined
if [ -n "$TEST_IN_CI" ]; then
pytest_cmd+=" --cov=agenthub --cov=openhands --cov-report=xml --cov-append"
pytest_cmd+=" --cov=openhands --cov-report=xml --cov-append"
fi
env SCRIPT_DIR="$SCRIPT_DIR" \

View File

@ -1,6 +1,6 @@
import pytest
from agenthub.browsing_agent.response_parser import (
from openhands.agenthub.browsing_agent.response_parser import (
BrowseInteractiveAction,
BrowsingResponseParser,
)

View File

@ -2,7 +2,7 @@ from unittest.mock import Mock
import pytest
from agenthub.codeact_agent.codeact_agent import CodeActAgent
from openhands.agenthub.codeact_agent.codeact_agent import CodeActAgent
from openhands.core.config import AgentConfig, LLMConfig
from openhands.core.message import TextContent
from openhands.events.observation.commands import (

View File

@ -6,7 +6,7 @@ import pytest
import yaml
from pytest import TempPathFactory
from agenthub.micro.registry import all_microagents
from openhands.agenthub.micro.registry import all_microagents
from openhands.controller.agent import Agent
from openhands.controller.state.state import State
from openhands.core.config import AgentConfig
@ -44,7 +44,7 @@ def test_all_agents_are_loaded():
assert all_microagents is not None
assert len(all_microagents) > 1
base = os.path.join('agenthub', 'micro')
base = os.path.join('openhands', 'agenthub', 'micro')
full_path = os.path.dirname(__file__) + '/../../' + base
agent_names = set()
for root, _, files in os.walk(full_path):

View File

@ -3,7 +3,7 @@ import os
import pytest
from pytest import MonkeyPatch
import agenthub # noqa: F401
import openhands.agenthub # noqa: F401
from openhands.core.exceptions import (
AgentNotRegisteredError,
MicroAgentValidationError,

View File

@ -2,7 +2,7 @@ from unittest.mock import MagicMock, Mock, patch
import pytest
from agenthub.codeact_agent.codeact_agent import CodeActAgent
from openhands.agenthub.codeact_agent.codeact_agent import CodeActAgent
from openhands.core.config import AgentConfig, LLMConfig
from openhands.events import EventSource, EventStream
from openhands.events.action import CmdRunAction, MessageAction

View File

@ -10,8 +10,8 @@ from openhands.utils.prompt import PromptManager
@pytest.fixture
def prompt_dir(tmp_path):
# Copy contents from "agenthub/codeact_agent" to the temp directory
shutil.copytree('agenthub/codeact_agent', tmp_path, dirs_exist_ok=True)
# Copy contents from "openhands/agenthub/codeact_agent" to the temp directory
shutil.copytree('openhands/agenthub/codeact_agent', tmp_path, dirs_exist_ok=True)
# Return the temporary directory path
return tmp_path

View File

@ -1,7 +1,9 @@
import pytest
from agenthub.micro.agent import parse_response as parse_response_micro
from agenthub.planner_agent.prompt import parse_response as parse_response_planner
from openhands.agenthub.micro.agent import parse_response as parse_response_micro
from openhands.agenthub.planner_agent.prompt import (
parse_response as parse_response_planner,
)
from openhands.core.exceptions import LLMResponseError
from openhands.core.utils.json import loads as custom_loads
from openhands.events.action import (

View File

@ -56,7 +56,6 @@ def _check_source_code_in_dir(temp_dir):
# The source code should only include the `openhands` folder, but not the other folders
assert set(os.listdir(code_dir)) == {
'agenthub',
'openhands',
'pyproject.toml',
'poetry.lock',