From ab470e56554740be96cdf36a571cb133bf90d283 Mon Sep 17 00:00:00 2001 From: yzlin Date: Fri, 4 Aug 2023 12:20:30 +0800 Subject: [PATCH] add a switch args and rm redundant recv --- metagpt/roles/qa_engineer.py | 10 ++++------ startup.py | 13 ++++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/metagpt/roles/qa_engineer.py b/metagpt/roles/qa_engineer.py index 303b775ac..5e12a1abd 100644 --- a/metagpt/roles/qa_engineer.py +++ b/metagpt/roles/qa_engineer.py @@ -22,12 +22,13 @@ from metagpt.utils.special_tokens import MSG_SEP, FILENAME_CODE_SEP class QaEngineer(Role): def __init__(self, name="Edward", profile="QaEngineer", goal="Write comprehensive and robust tests to ensure codes will work as expected without bugs", - constraints="The test code you write should conform to code standard like PEP8, be modular, easy to read and maintain"): + constraints="The test code you write should conform to code standard like PEP8, be modular, easy to read and maintain", + test_round_allowed=5): super().__init__(name, profile, goal, constraints) - self._init_actions([WriteTest]) + self._init_actions([WriteTest]) # FIXME: a bit hack here, only init one action to circumvent _think() logic, will overwrite _think() in future updates self._watch([WriteCode, WriteTest, RunCode, DebugError]) self.test_round = 0 - self.test_round_allowed = 5 # hard code for 1 WriteTest round + 2 x (RunCode -> DebugError loop) + self.test_round_allowed = test_round_allowed @classmethod def parse_workspace(cls, system_design_msg: Message) -> str: @@ -52,9 +53,6 @@ class QaEngineer(Role): file.parent.mkdir(parents=True, exist_ok=True) file.write_text(code) - def recv(self, message: Message) -> None: - self._rc.memory.add(message) - async def _write_test(self, message: Message) -> None: code_msgs = message.content.split(MSG_SEP) diff --git a/startup.py b/startup.py index fb11a73f0..f37b5286c 100644 --- a/startup.py +++ b/startup.py @@ -8,20 +8,23 @@ from metagpt.roles import Architect, Engineer, ProductManager, ProjectManager, Q from metagpt.software_company import SoftwareCompany -async def startup(idea: str, investment: float = 3.0, n_round: int = 5, code_review: bool = False): +async def startup(idea: str, investment: float = 3.0, n_round: int = 5, + code_review: bool = False, run_tests: bool = False): """Run a startup. Be a boss.""" company = SoftwareCompany() company.hire([ProductManager(), Architect(), ProjectManager(), - Engineer(n_borg=5, use_code_review=code_review), - QaEngineer()]) + Engineer(n_borg=5, use_code_review=code_review)]) + if run_tests: + # developing features: run tests on the spot and identify bugs (bug fixing capability comes soon!) + company.hire([QaEngineer()]) company.invest(investment) company.start_project(idea) await company.run(n_round=n_round) -def main(idea: str, investment: float = 3.0, n_round: int = 5, code_review: bool = False): +def main(idea: str, investment: float = 3.0, n_round: int = 5, code_review: bool = False, run_tests: bool = False): """ We are a software startup comprised of AI. By investing in us, you are empowering a future filled with limitless possibilities. :param idea: Your innovative idea, such as "Creating a snake game." @@ -30,7 +33,7 @@ def main(idea: str, investment: float = 3.0, n_round: int = 5, code_review: bool :param code_review: Whether to use code review. :return: """ - asyncio.run(startup(idea, investment, n_round, code_review)) + asyncio.run(startup(idea, investment, n_round, code_review, run_tests)) if __name__ == '__main__':