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
"""
相关推荐
北斗落凡尘2 小时前
LangGraph 入门实战(11)--输出模式
后端·python·langchain
wp123_12 小时前
IPX8 防水 Type‑C连接器:安费诺 124018792112A 与 TONEVEE TY48087‑24A 技术梳理
c语言·开发语言
不会代码的小猴2 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
fangzhanpeng1682 小时前
(前端)2.js变量作用域样例
开发语言·前端·javascript
雪碧聊技术2 小时前
安装Python(保姆级教程)
python·版本更新·python下载
张龙6875 小时前
uv 全面指南:比 pip 快 100 倍的 Python 包管理器,从安装到团队落地
后端·python
mqiqe5 小时前
线程调度与 Schedulers:Project Reactor 并发模型的核心引擎
java·开发语言·网络
@HNUSTer5 小时前
Python数据可视化科技图表绘制系列教程(八)
python·数据可视化·科技论文·专业制图·科研图表
专注仿真6 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
xixiaoyunya6 小时前
JavaScript 异步编程全解析:从回调地狱到 async/await 的演进之路
开发语言·javascript·ecmascript