mirror of
https://github.com/aljazceru/Auto-GPT.git
synced 2025-12-22 16:34:25 +01:00
Add challenge name and level to pytest logs (#4661)
This commit is contained in:
@@ -34,7 +34,7 @@ class LogCycleHandler:
|
|||||||
if os.environ.get("OVERWRITE_DEBUG") == "1":
|
if os.environ.get("OVERWRITE_DEBUG") == "1":
|
||||||
outer_folder_name = "auto_gpt"
|
outer_folder_name = "auto_gpt"
|
||||||
else:
|
else:
|
||||||
ai_name_short = ai_name[:15] if ai_name else DEFAULT_PREFIX
|
ai_name_short = self.get_agent_short_name(ai_name)
|
||||||
outer_folder_name = f"{created_at}_{ai_name_short}"
|
outer_folder_name = f"{created_at}_{ai_name_short}"
|
||||||
|
|
||||||
outer_folder_path = os.path.join(log_directory, "DEBUG", outer_folder_name)
|
outer_folder_path = os.path.join(log_directory, "DEBUG", outer_folder_name)
|
||||||
@@ -42,6 +42,9 @@ class LogCycleHandler:
|
|||||||
|
|
||||||
return outer_folder_path
|
return outer_folder_path
|
||||||
|
|
||||||
|
def get_agent_short_name(self, ai_name):
|
||||||
|
return ai_name[:15] if ai_name else DEFAULT_PREFIX
|
||||||
|
|
||||||
def create_inner_directory(self, outer_folder_path: str, cycle_count: int) -> str:
|
def create_inner_directory(self, outer_folder_path: str, cycle_count: int) -> str:
|
||||||
nested_folder_name = str(cycle_count).zfill(3)
|
nested_folder_name = str(cycle_count).zfill(3)
|
||||||
nested_folder_path = os.path.join(outer_folder_path, nested_folder_name)
|
nested_folder_path = os.path.join(outer_folder_path, nested_folder_name)
|
||||||
|
|||||||
@@ -13,9 +13,12 @@ def test_browse_website(
|
|||||||
patched_api_requestor: None,
|
patched_api_requestor: None,
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
file_path = browser_agent.workspace.get_path("browse_website.txt")
|
file_path = browser_agent.workspace.get_path("browse_website.txt")
|
||||||
run_interaction_loop(monkeypatch, browser_agent, CYCLE_COUNT)
|
run_interaction_loop(
|
||||||
|
monkeypatch, browser_agent, CYCLE_COUNT, challenge_name, level_to_run
|
||||||
|
)
|
||||||
|
|
||||||
# content = read_file(file_path, config)
|
# content = read_file(file_path, config)
|
||||||
content = open(file_path, encoding="utf-8").read()
|
content = open(file_path, encoding="utf-8").read()
|
||||||
|
|||||||
@@ -20,10 +20,15 @@ def test_write_file(
|
|||||||
patched_api_requestor: None,
|
patched_api_requestor: None,
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
file_system_agent = file_system_agents[level_to_run - 1]
|
file_system_agent = file_system_agents[level_to_run - 1]
|
||||||
run_interaction_loop(
|
run_interaction_loop(
|
||||||
monkeypatch, file_system_agent, CYCLE_COUNT_PER_LEVEL[level_to_run - 1]
|
monkeypatch,
|
||||||
|
file_system_agent,
|
||||||
|
CYCLE_COUNT_PER_LEVEL[level_to_run - 1],
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
)
|
)
|
||||||
|
|
||||||
expected_outputs = EXPECTED_OUTPUTS_PER_LEVEL[level_to_run - 1]
|
expected_outputs = EXPECTED_OUTPUTS_PER_LEVEL[level_to_run - 1]
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from typing import Optional
|
|||||||
|
|
||||||
class Challenge:
|
class Challenge:
|
||||||
BEAT_CHALLENGES = False
|
BEAT_CHALLENGES = False
|
||||||
|
DEFAULT_CHALLENGE_NAME = "default_challenge_name"
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -10,7 +11,7 @@ class Challenge:
|
|||||||
category: str,
|
category: str,
|
||||||
max_level: int,
|
max_level: int,
|
||||||
is_new_challenge: bool,
|
is_new_challenge: bool,
|
||||||
max_level_beaten: Optional[int],
|
max_level_beaten: Optional[int] = None,
|
||||||
level_to_run: Optional[int] = None,
|
level_to_run: Optional[int] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ def challenge(
|
|||||||
)
|
)
|
||||||
if challenge.level_to_run is not None:
|
if challenge.level_to_run is not None:
|
||||||
kwargs["level_to_run"] = challenge.level_to_run
|
kwargs["level_to_run"] = challenge.level_to_run
|
||||||
|
kwargs["challenge_name"] = challenge.name
|
||||||
try:
|
try:
|
||||||
func(*args, **kwargs)
|
func(*args, **kwargs)
|
||||||
challenge.succeeded = True
|
challenge.succeeded = True
|
||||||
|
|||||||
@@ -51,6 +51,11 @@ def level_to_run(request: FixtureRequest) -> int:
|
|||||||
return request.config.option.level
|
return request.config.option.level
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def challenge_name() -> str:
|
||||||
|
return Challenge.DEFAULT_CHALLENGE_NAME
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def check_beat_challenges(request: FixtureRequest) -> None:
|
def check_beat_challenges(request: FixtureRequest) -> None:
|
||||||
Challenge.BEAT_CHALLENGES = request.config.getoption("--beat-challenges")
|
Challenge.BEAT_CHALLENGES = request.config.getoption("--beat-challenges")
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ def test_debug_code_challenge_a(
|
|||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Test whether the agent can debug a simple code snippet.
|
Test whether the agent can debug a simple code snippet.
|
||||||
@@ -39,7 +40,9 @@ def test_debug_code_challenge_a(
|
|||||||
copy_file_into_workspace(debug_code_agent, DIRECTORY_PATH, CODE_FILE_PATH)
|
copy_file_into_workspace(debug_code_agent, DIRECTORY_PATH, CODE_FILE_PATH)
|
||||||
copy_file_into_workspace(debug_code_agent, DIRECTORY_PATH, TEST_FILE_PATH)
|
copy_file_into_workspace(debug_code_agent, DIRECTORY_PATH, TEST_FILE_PATH)
|
||||||
|
|
||||||
run_interaction_loop(monkeypatch, debug_code_agent, CYCLE_COUNT)
|
run_interaction_loop(
|
||||||
|
monkeypatch, debug_code_agent, CYCLE_COUNT, challenge_name, level_to_run
|
||||||
|
)
|
||||||
|
|
||||||
output = execute_python_file(
|
output = execute_python_file(
|
||||||
get_workspace_path(debug_code_agent, TEST_FILE_PATH), debug_code_agent
|
get_workspace_path(debug_code_agent, TEST_FILE_PATH), debug_code_agent
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ def test_information_retrieval_challenge_a(
|
|||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Test the challenge_a function in a given agent by mocking user inputs and checking the output file content.
|
Test the challenge_a function in a given agent by mocking user inputs and checking the output file content.
|
||||||
@@ -26,7 +27,13 @@ def test_information_retrieval_challenge_a(
|
|||||||
:param monkeypatch: pytest's monkeypatch utility for modifying builtins.
|
:param monkeypatch: pytest's monkeypatch utility for modifying builtins.
|
||||||
"""
|
"""
|
||||||
information_retrieval_agent = information_retrieval_agents[level_to_run - 1]
|
information_retrieval_agent = information_retrieval_agents[level_to_run - 1]
|
||||||
run_interaction_loop(monkeypatch, information_retrieval_agent, CYCLE_COUNT)
|
run_interaction_loop(
|
||||||
|
monkeypatch,
|
||||||
|
information_retrieval_agent,
|
||||||
|
CYCLE_COUNT,
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
|
)
|
||||||
|
|
||||||
file_path = get_workspace_path(information_retrieval_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(information_retrieval_agent, OUTPUT_LOCATION)
|
||||||
content = read_file(file_path, information_retrieval_agent)
|
content = read_file(file_path, information_retrieval_agent)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ def test_information_retrieval_challenge_b(
|
|||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Test the challenge_b function in a given agent by mocking user inputs and checking the output file content.
|
Test the challenge_b function in a given agent by mocking user inputs and checking the output file content.
|
||||||
@@ -29,7 +30,13 @@ def test_information_retrieval_challenge_b(
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
with contextlib.suppress(SystemExit):
|
with contextlib.suppress(SystemExit):
|
||||||
run_interaction_loop(monkeypatch, get_nobel_prize_agent, CYCLE_COUNT)
|
run_interaction_loop(
|
||||||
|
monkeypatch,
|
||||||
|
get_nobel_prize_agent,
|
||||||
|
CYCLE_COUNT,
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
|
)
|
||||||
file_path = get_workspace_path(get_nobel_prize_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(get_nobel_prize_agent, OUTPUT_LOCATION)
|
||||||
|
|
||||||
content = read_file(file_path, get_nobel_prize_agent)
|
content = read_file(file_path, get_nobel_prize_agent)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ def test_kubernetes_template_challenge_a(
|
|||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Test the challenge_a function in a given agent by mocking user inputs
|
Test the challenge_a function in a given agent by mocking user inputs
|
||||||
@@ -27,7 +28,9 @@ def test_kubernetes_template_challenge_a(
|
|||||||
monkeypatch (pytest.MonkeyPatch)
|
monkeypatch (pytest.MonkeyPatch)
|
||||||
level_to_run (int)
|
level_to_run (int)
|
||||||
"""
|
"""
|
||||||
run_interaction_loop(monkeypatch, kubernetes_agent, CYCLE_COUNT)
|
run_interaction_loop(
|
||||||
|
monkeypatch, kubernetes_agent, CYCLE_COUNT, challenge_name, level_to_run
|
||||||
|
)
|
||||||
|
|
||||||
file_path = get_workspace_path(kubernetes_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(kubernetes_agent, OUTPUT_LOCATION)
|
||||||
content = read_file(file_path, kubernetes_agent)
|
content = read_file(file_path, kubernetes_agent)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ def test_memory_challenge_a(
|
|||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
The agent reads a file containing a task_id. Then, it reads a series of other files.
|
The agent reads a file containing a task_id. Then, it reads a series of other files.
|
||||||
@@ -28,7 +29,13 @@ def test_memory_challenge_a(
|
|||||||
task_id = "2314"
|
task_id = "2314"
|
||||||
create_instructions_files(memory_management_agent, level_to_run, task_id)
|
create_instructions_files(memory_management_agent, level_to_run, task_id)
|
||||||
|
|
||||||
run_interaction_loop(monkeypatch, memory_management_agent, level_to_run + 2)
|
run_interaction_loop(
|
||||||
|
monkeypatch,
|
||||||
|
memory_management_agent,
|
||||||
|
level_to_run + 2,
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
|
)
|
||||||
|
|
||||||
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
||||||
content = read_file(file_path, memory_management_agent)
|
content = read_file(file_path, memory_management_agent)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ def test_memory_challenge_b(
|
|||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
The agent reads a series of files, each containing a task_id and noise. After reading 'n' files,
|
The agent reads a series of files, each containing a task_id and noise. After reading 'n' files,
|
||||||
@@ -34,7 +35,13 @@ def test_memory_challenge_b(
|
|||||||
task_ids = [str(i * 1111) for i in range(1, level_to_run + 1)]
|
task_ids = [str(i * 1111) for i in range(1, level_to_run + 1)]
|
||||||
create_instructions_files(memory_management_agent, level_to_run, task_ids)
|
create_instructions_files(memory_management_agent, level_to_run, task_ids)
|
||||||
|
|
||||||
run_interaction_loop(monkeypatch, memory_management_agent, level_to_run + 2)
|
run_interaction_loop(
|
||||||
|
monkeypatch,
|
||||||
|
memory_management_agent,
|
||||||
|
level_to_run + 2,
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
|
)
|
||||||
|
|
||||||
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
||||||
content = read_file(file_path, memory_management_agent)
|
content = read_file(file_path, memory_management_agent)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ def test_memory_challenge_c(
|
|||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Instead of reading task Ids from files as with the previous challenges, the agent now must remember
|
Instead of reading task Ids from files as with the previous challenges, the agent now must remember
|
||||||
@@ -52,7 +53,13 @@ def test_memory_challenge_c(
|
|||||||
level_silly_phrases,
|
level_silly_phrases,
|
||||||
)
|
)
|
||||||
|
|
||||||
run_interaction_loop(monkeypatch, memory_management_agent, level_to_run + 2)
|
run_interaction_loop(
|
||||||
|
monkeypatch,
|
||||||
|
memory_management_agent,
|
||||||
|
level_to_run + 2,
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
|
)
|
||||||
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
||||||
content = read_file(file_path, agent=memory_management_agent)
|
content = read_file(file_path, agent=memory_management_agent)
|
||||||
for phrase in level_silly_phrases:
|
for phrase in level_silly_phrases:
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ def test_memory_challenge_d(
|
|||||||
patched_api_requestor: MockerFixture,
|
patched_api_requestor: MockerFixture,
|
||||||
monkeypatch: pytest.MonkeyPatch,
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
level_to_run: int,
|
level_to_run: int,
|
||||||
|
challenge_name: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
The agent is given a series of events and must remember the respective beliefs of the characters.
|
The agent is given a series of events and must remember the respective beliefs of the characters.
|
||||||
@@ -38,7 +39,13 @@ def test_memory_challenge_d(
|
|||||||
create_instructions_files(
|
create_instructions_files(
|
||||||
memory_management_agent, level_to_run, level_sally_anne_test_phrases
|
memory_management_agent, level_to_run, level_sally_anne_test_phrases
|
||||||
)
|
)
|
||||||
run_interaction_loop(monkeypatch, memory_management_agent, level_to_run + 2)
|
run_interaction_loop(
|
||||||
|
monkeypatch,
|
||||||
|
memory_management_agent,
|
||||||
|
level_to_run + 2,
|
||||||
|
challenge_name,
|
||||||
|
level_to_run,
|
||||||
|
)
|
||||||
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
file_path = get_workspace_path(memory_management_agent, OUTPUT_LOCATION)
|
||||||
|
|
||||||
content = read_file(file_path, memory_management_agent)
|
content = read_file(file_path, memory_management_agent)
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import contextlib
|
|||||||
import random
|
import random
|
||||||
import shutil
|
import shutil
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Generator
|
from typing import Any, Generator
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from autogpt.agent import Agent
|
from autogpt.agent import Agent
|
||||||
|
from autogpt.log_cycle.log_cycle import LogCycleHandler
|
||||||
|
|
||||||
|
|
||||||
def generate_noise(noise_size: int) -> str:
|
def generate_noise(noise_size: int) -> str:
|
||||||
@@ -39,13 +40,30 @@ def setup_mock_input(monkeypatch: pytest.MonkeyPatch, cycle_count: int) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def run_interaction_loop(
|
def run_interaction_loop(
|
||||||
monkeypatch: pytest.MonkeyPatch, agent: Agent, cycle_count: int
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
|
agent: Agent,
|
||||||
|
cycle_count: int,
|
||||||
|
challenge_name: str,
|
||||||
|
level_to_run: int,
|
||||||
) -> None:
|
) -> None:
|
||||||
setup_mock_input(monkeypatch, cycle_count)
|
setup_mock_input(monkeypatch, cycle_count)
|
||||||
|
|
||||||
|
setup_mock_log_cycle_agent_name(monkeypatch, challenge_name, level_to_run)
|
||||||
with contextlib.suppress(SystemExit):
|
with contextlib.suppress(SystemExit):
|
||||||
agent.start_interaction_loop()
|
agent.start_interaction_loop()
|
||||||
|
|
||||||
|
|
||||||
|
def setup_mock_log_cycle_agent_name(
|
||||||
|
monkeypatch: pytest.MonkeyPatch, challenge_name: str, level_to_run: int
|
||||||
|
) -> None:
|
||||||
|
def mock_get_agent_short_name(*args: Any, **kwargs: Any) -> str:
|
||||||
|
return f"{challenge_name}_level_{level_to_run}"
|
||||||
|
|
||||||
|
monkeypatch.setattr(
|
||||||
|
LogCycleHandler, "get_agent_short_name", mock_get_agent_short_name
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_workspace_path(agent: Agent, file_name: str) -> str:
|
def get_workspace_path(agent: Agent, file_name: str) -> str:
|
||||||
return str(agent.workspace.get_path(file_name))
|
return str(agent.workspace.get_path(file_name))
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
|
import pytest
|
||||||
from pytest_mock import MockerFixture
|
from pytest_mock import MockerFixture
|
||||||
|
|
||||||
from autogpt.agent.agent import Agent
|
from autogpt.agent.agent import Agent
|
||||||
from autogpt.commands.web_selenium import browse_website
|
from autogpt.commands.web_selenium import browse_website
|
||||||
|
from tests.utils import requires_api_key
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.vcr
|
||||||
|
@requires_api_key("OPENAI_API_KEY")
|
||||||
def test_browse_website(agent: Agent, patched_api_requestor: MockerFixture):
|
def test_browse_website(agent: Agent, patched_api_requestor: MockerFixture):
|
||||||
url = "https://barrel-roll.com"
|
url = "https://barrel-roll.com"
|
||||||
question = "How to execute a barrel roll"
|
question = "How to execute a barrel roll"
|
||||||
|
|||||||
Reference in New Issue
Block a user