|
""" |
|
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) |
|
|
|
|
|
rsp = await self._aask(prompt) |
|
|
|
code_text = CreateAgent.parse_code(rsp) |
|
|
|
return code_text |
|
|
|
@staticmethod |
|
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()) |
|
|