Spaces:
Paused
Paused
| """ | |
| Filename: MetaGPT/examples/build_customized_multi_agents.py | |
| Created Date: Wednesday, November 15th 2023, 7:12:39 pm | |
| Author: garylin2099 | |
| """ | |
| import re | |
| import fire | |
| from metagpt.actions import Action, UserRequirement | |
| from metagpt.logs import logger | |
| from metagpt.roles import Role | |
| from metagpt.schema import Message | |
| from metagpt.team import Team | |
| def parse_code(rsp): | |
| pattern = r"```python(.*)```" | |
| match = re.search(pattern, rsp, re.DOTALL) | |
| code_text = match.group(1) if match else rsp | |
| return code_text | |
| class SimpleWriteCode(Action): | |
| PROMPT_TEMPLATE: str = """ | |
| Write a python function that can {instruction}. | |
| Return ```python your_code_here ``` with NO other texts, | |
| your code: | |
| """ | |
| name: str = "SimpleWriteCode" | |
| async def run(self, instruction: str): | |
| prompt = self.PROMPT_TEMPLATE.format(instruction=instruction) | |
| rsp = await self._aask(prompt) | |
| code_text = parse_code(rsp) | |
| return code_text | |
| class SimpleCoder(Role): | |
| name: str = "Alice" | |
| profile: str = "SimpleCoder" | |
| def __init__(self, **kwargs): | |
| super().__init__(**kwargs) | |
| self._watch([UserRequirement]) | |
| self.set_actions([SimpleWriteCode]) | |
| class SimpleWriteTest(Action): | |
| PROMPT_TEMPLATE: str = """ | |
| Context: {context} | |
| Write {k} unit tests using pytest for the given function, assuming you have imported it. | |
| Return ```python your_code_here ``` with NO other texts, | |
| your code: | |
| """ | |
| name: str = "SimpleWriteTest" | |
| async def run(self, context: str, k: int = 3): | |
| prompt = self.PROMPT_TEMPLATE.format(context=context, k=k) | |
| rsp = await self._aask(prompt) | |
| code_text = parse_code(rsp) | |
| return code_text | |
| class SimpleTester(Role): | |
| name: str = "Bob" | |
| profile: str = "SimpleTester" | |
| def __init__(self, **kwargs): | |
| super().__init__(**kwargs) | |
| self.set_actions([SimpleWriteTest]) | |
| # self._watch([SimpleWriteCode]) | |
| self._watch([SimpleWriteCode, SimpleWriteReview]) # feel free to try this too | |
| async def _act(self) -> Message: | |
| logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})") | |
| todo = self.rc.todo | |
| # context = self.get_memories(k=1)[0].content # use the most recent memory as context | |
| context = self.get_memories() # use all memories as context | |
| code_text = await todo.run(context, k=5) # specify arguments | |
| msg = Message(content=code_text, role=self.profile, cause_by=type(todo)) | |
| return msg | |
| class SimpleWriteReview(Action): | |
| PROMPT_TEMPLATE: str = """ | |
| Context: {context} | |
| Review the test cases and provide one critical comments: | |
| """ | |
| name: str = "SimpleWriteReview" | |
| async def run(self, context: str): | |
| prompt = self.PROMPT_TEMPLATE.format(context=context) | |
| rsp = await self._aask(prompt) | |
| return rsp | |
| class SimpleReviewer(Role): | |
| name: str = "Charlie" | |
| profile: str = "SimpleReviewer" | |
| def __init__(self, **kwargs): | |
| super().__init__(**kwargs) | |
| self.set_actions([SimpleWriteReview]) | |
| self._watch([SimpleWriteTest]) | |
| async def main( | |
| idea: str = "write a function that calculates the product of a list", | |
| investment: float = 3.0, | |
| n_round: int = 5, | |
| add_human: bool = False, | |
| ): | |
| logger.info(idea) | |
| team = Team() | |
| team.hire( | |
| [ | |
| SimpleCoder(), | |
| SimpleTester(), | |
| SimpleReviewer(is_human=add_human), | |
| ] | |
| ) | |
| team.invest(investment=investment) | |
| team.run_project(idea) | |
| await team.run(n_round=n_round) | |
| if __name__ == "__main__": | |
| fire.Fire(main) | |