Spaces:
Running
Running
| """ | |
| Filename: MetaGPT/examples/agent_creator.py | |
| Created Date: Tuesday, September 12th 2023, 3:28:37 pm | |
| Author: garylin2099 | |
| """ | |
| import re | |
| from metagpt.actions import Action | |
| from metagpt.config2 import config | |
| from metagpt.const import METAGPT_ROOT | |
| from metagpt.logs import logger | |
| from metagpt.roles import Role | |
| from metagpt.schema import Message | |
| EXAMPLE_CODE_FILE = METAGPT_ROOT / "examples/build_customized_agent.py" | |
| MULTI_ACTION_AGENT_CODE_EXAMPLE = EXAMPLE_CODE_FILE.read_text() | |
| class CreateAgent(Action): | |
| PROMPT_TEMPLATE: str = """ | |
| ### BACKGROUND | |
| You are using an agent framework called metagpt to write agents capable of different actions, | |
| the usage of metagpt can be illustrated by the following example: | |
| ### EXAMPLE STARTS AT THIS LINE | |
| {example} | |
| ### EXAMPLE ENDS AT THIS LINE | |
| ### TASK | |
| Now you should create an agent with appropriate actions based on the instruction, consider carefully about | |
| the PROMPT_TEMPLATE of all actions and when to call self._aask() | |
| ### INSTRUCTION | |
| {instruction} | |
| ### YOUR CODE | |
| Return ```python your_code_here ``` with NO other texts, your code: | |
| """ | |
| async def run(self, example: str, instruction: str): | |
| prompt = self.PROMPT_TEMPLATE.format(example=example, instruction=instruction) | |
| # logger.info(prompt) | |
| rsp = await self._aask(prompt) | |
| code_text = CreateAgent.parse_code(rsp) | |
| return code_text | |
| def parse_code(rsp): | |
| pattern = r"```python(.*)```" | |
| match = re.search(pattern, rsp, re.DOTALL) | |
| code_text = match.group(1) if match else "" | |
| config.workspace.path.mkdir(parents=True, exist_ok=True) | |
| new_file = config.workspace.path / "agent_created_agent.py" | |
| new_file.write_text(code_text) | |
| return code_text | |
| class AgentCreator(Role): | |
| name: str = "Matrix" | |
| profile: str = "AgentCreator" | |
| agent_template: str = MULTI_ACTION_AGENT_CODE_EXAMPLE | |
| def __init__(self, **kwargs): | |
| super().__init__(**kwargs) | |
| self.set_actions([CreateAgent]) | |
| async def _act(self) -> Message: | |
| logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})") | |
| todo = self.rc.todo | |
| msg = self.rc.memory.get()[-1] | |
| instruction = msg.content | |
| code_text = await CreateAgent().run(example=self.agent_template, instruction=instruction) | |
| msg = Message(content=code_text, role=self.profile, cause_by=todo) | |
| return msg | |
| if __name__ == "__main__": | |
| import asyncio | |
| async def main(): | |
| agent_template = MULTI_ACTION_AGENT_CODE_EXAMPLE | |
| creator = AgentCreator(agent_template=agent_template) | |
| msg = """ | |
| Write an agent called SimpleTester that will take any code snippet (str) and do the following: | |
| 1. write a testing code (str) for testing the given code snippet, save the testing code as a .py file in the current working directory; | |
| 2. run the testing code. | |
| You can use pytest as the testing framework. | |
| """ | |
| await creator.run(msg) | |
| asyncio.run(main()) | |