|
""" |
|
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, SimpleWriteReview]) |
|
|
|
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() |
|
|
|
code_text = await todo.run(context, k=5) |
|
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) |
|
|