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
"""
相关推荐
lsx2024062 分钟前
R 数组:深入探索与高效使用
开发语言
星火开发设计2 分钟前
格式化输入输出:控制输出精度与对齐方式
开发语言·c++·学习·算法·函数·知识
1104.北光c°17 分钟前
【黑马点评项目笔记 | 登录篇】Redis实现共享Session登录
java·开发语言·数据库·redis·笔记·spring·java-ee
曾浩轩19 分钟前
C语言学习记录——BC119 最高分与最低分之差
c语言·笔记·学习
断眉的派大星29 分钟前
Python多线程编程全解析
python
铁手飞鹰30 分钟前
[深度学习]Vision Transformer
人工智能·pytorch·python·深度学习·transformer
weixin_3954489135 分钟前
average_weights.py
pytorch·python·深度学习
zmzb010337 分钟前
C++课后习题训练记录Day91
开发语言·c++
EmbedLinX38 分钟前
Linux 之网络通信
linux·服务器·c语言·笔记·学习
蒜香拿铁39 分钟前
【第一章】爬虫概述
爬虫·python