|
""" |
|
Filename: MetaGPT/examples/build_customized_agent.py |
|
Created Date: Tuesday, September 19th 2023, 6:52:25 pm |
|
Author: garylin2099 |
|
""" |
|
import asyncio |
|
import re |
|
import subprocess |
|
|
|
import fire |
|
|
|
from metagpt.actions import Action |
|
from metagpt.logs import logger |
|
from metagpt.roles.role import Role, RoleReactMode |
|
from metagpt.schema import Message |
|
|
|
|
|
class SimpleWriteCode(Action): |
|
PROMPT_TEMPLATE: str = """ |
|
Write a python function that can {instruction} and provide two runnable test cases. |
|
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 = SimpleWriteCode.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 rsp |
|
return code_text |
|
|
|
|
|
class SimpleRunCode(Action): |
|
name: str = "SimpleRunCode" |
|
|
|
async def run(self, code_text: str): |
|
result = subprocess.run(["python3", "-c", code_text], capture_output=True, text=True) |
|
code_result = result.stdout |
|
logger.info(f"{code_result=}") |
|
return code_result |
|
|
|
|
|
class SimpleCoder(Role): |
|
name: str = "Alice" |
|
profile: str = "SimpleCoder" |
|
|
|
def __init__(self, **kwargs): |
|
super().__init__(**kwargs) |
|
self.set_actions([SimpleWriteCode]) |
|
|
|
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.get_memories(k=1)[0] |
|
code_text = await todo.run(msg.content) |
|
msg = Message(content=code_text, role=self.profile, cause_by=type(todo)) |
|
|
|
return msg |
|
|
|
|
|
class RunnableCoder(Role): |
|
name: str = "Alice" |
|
profile: str = "RunnableCoder" |
|
|
|
def __init__(self, **kwargs): |
|
super().__init__(**kwargs) |
|
self.set_actions([SimpleWriteCode, SimpleRunCode]) |
|
self._set_react_mode(react_mode=RoleReactMode.BY_ORDER.value) |
|
|
|
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.get_memories(k=1)[0] |
|
result = await todo.run(msg.content) |
|
|
|
msg = Message(content=result, role=self.profile, cause_by=type(todo)) |
|
self.rc.memory.add(msg) |
|
return msg |
|
|
|
|
|
def main(msg="write a function that calculates the product of a list and run it"): |
|
|
|
role = RunnableCoder() |
|
logger.info(msg) |
|
result = asyncio.run(role.run(msg)) |
|
logger.info(result) |
|
|
|
|
|
if __name__ == "__main__": |
|
fire.Fire(main) |
|
|