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