""" 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)