MetaGPT智能体开发入门》学习手册 第三章课程任务

  1. 第三章课程任务:
  • 这个 Agent 拥有三个动作 打印1 打印2 打印3
  • 重写有关方法(请不要使用act_by_order,我希望你能独立实现)使得 Agent 顺序执行上面三个动作
  • 当上述三个动作执行完毕后,为 Agent 生成新的动作 打印4 打印5 打印6 并顺序执行
python 复制代码
from metagpt.actions import Action
from metagpt.roles import Role
from metagpt.schema import Message
import asyncio
from metagpt.logs import logger
import random

class PrintFruit(Action):
    def __init__(self, fruit_name, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fruit_name = fruit_name

    async def run(self, *args, **kwargs):
        res =  f"Printing fruit: {self.fruit_name}"
        print(res)
        return res


class FruitPrintingAgent(Role):
    def __init__(self, name: str = "FruitPrinter", profile: str = "Fruit Printing Agent", **kwargs):
        super().__init__(name, profile, **kwargs)
        self.fruits = ["Apple", "Banana", "Cherry", "Durian", "Elderberry", "Fig", "Grape", "Honeydew", "Jackfruit"]
        self.current_action_index = 0
        self._init_actions(self._select_random_fruits(3))

    def _select_random_fruits(self, count):
        selected_fruits = random.sample(self.fruits, count)
        return [PrintFruit(fruit) for fruit in selected_fruits]

    async def _think(self) -> None:
        logger.info(self._rc.state)

        if self.current_action_index < len(self._actions):
            self._set_state(self.current_action_index)
        else:
            # 添加新的水果打印动作
            new_fruit_actions = self._select_random_fruits(3)
            self._init_actions(new_fruit_actions)
            self.current_action_index = 0
            self._set_state(self.current_action_index)

    async def _act(self) -> Message:
        todo = self._rc.todo
        # 从记忆中获取最新的一条消息
        msg = self._rc.memory.get(k=1)[0] if self._rc.memory.get(k=1) else None

        # 如果有消息,则将消息内容作为参数传递给当前待执行的动作
        if msg:
            result = await todo.run(msg.content)
            logger.info(result)
        else:
            result = await todo.run("")

        self.current_action_index += 1
        return Message(content=result, role=self.profile)

    async def _react(self) -> Message:
        # 持续执行动作直到所有动作都被执行
        i = 0
        while i < 6:
            await self._think()
            if self._rc.todo is None:
                break
            msg = await self._act()
            i += 1
        return msg


async def main():
    # 初始化消息和智能体
    initial_message = "Start fruit printing"
    role = FruitPrintingAgent()

    # 记录初始消息
    logger.info(initial_message)

    # 启动智能体并等待其执行完毕
    result = await role.run(initial_message)

    # 记录执行结果
    # logger.info(result.content)


asyncio.run(main())
"""
2023-12-14 23:20:49.143 | INFO     | __main__:main:75 - Start fruit printing
2023-12-14 23:20:49.143 | INFO     | __main__:_act:50 - Printing fruit: Fig
2023-12-14 23:20:49.143 | INFO     | __main__:_act:50 - Printing fruit: Apple
2023-12-14 23:20:49.143 | INFO     | __main__:_act:50 - Printing fruit: Durian
2023-12-14 23:20:49.143 | INFO     | __main__:_act:50 - Printing fruit: Honeydew
2023-12-14 23:20:49.143 | INFO     | __main__:_act:50 - Printing fruit: Elderberry
2023-12-14 23:20:49.144 | INFO     | __main__:_act:50 - Printing fruit: Cherry
"""
相关推荐
前端与小赵几秒前
Python 模块导入全解析,从基础语法到循环导入破解
python
超梦dasgg2 分钟前
Java 生产环境 Maven 实战指南
java·开发语言·maven
费弗里2 分钟前
里程碑式更新!Dash 4.2新版本新增websocket型回调
python·dash
A_humble_scholar4 分钟前
C++11 学习笔记:统一初始化、右值引用与完美转发
c++·笔记·学习
magic_now7 分钟前
Modbus RTU 与 TCP 学习笔记
笔记·学习·tcp/ip
叶子野格13 分钟前
《C语言学习:位运算》17
c语言·开发语言·c++·学习·visual studio
J2虾虾17 分钟前
Spring AI Alibaba - Structured Output 结构化输出
人工智能·python·spring
aWty_21 分钟前
实分析入门(12)--可测函数
学习·数学·算法·实变函数
RSTJ_162533 分钟前
PYTHON+AI LLM DAY SIXTY-FOUR
开发语言·python
词元Max36 分钟前
4.1 监督学习入门:线性回归与分类
学习·分类·线性回归