1.metagpt中的软件公司智能体 (PrepareDocuments Action)

1. PrepareDocuments Action

定义了一个 PrepareDocuments 类,它继承自 Action 类,并实现了一个用于准备项目文档的功能。具体来说,它的主要作用是初始化项目文件夹,设置 Git 环境,并将新增的需求写入 docs/requirements.txt 文件。部分代码跟源码有点不同。

python 复制代码
import shutil
from pathlib import Path
from typing import Optional

from metagpt.actions import Action
from metagpt.const import REQUIREMENT_FILENAME
from metagpt.utils.file_repository import FileRepository
from metagpt.utils.git_repository import GitRepository
from metagpt.utils.project_repo import ProjectRepo

from metagpt.schema import Document

import dataclasses

@dataclasses.dataclass  
class ActionOutput:
    content: str
    instruct_content: Document

    def __init__(self, content: str, instruct_content: Document):
        self.content = content
        self.instruct_content = instruct_content



class PrepareDocuments(Action):
    """PrepareDocuments Action: initialize project folder and add new requirements to docs/requirements.txt."""

    name: str = "PrepareDocuments"
    i_context: Optional[str] = None

    @property
    def config(self):
        return self.context.config

    def _init_repo(self):
        """Initialize the Git environment."""
        if not self.config.project_path:
            name = self.config.project_name or FileRepository.new_filename()
            path = Path(self.config.workspace.path) / name
        else:
            path = Path(self.config.project_path)
        if path.exists() and not self.config.inc:
            shutil.rmtree(path)
        self.config.project_path = path
        self.context.git_repo = GitRepository(local_path=path, auto_init=True)
        self.context.repo = ProjectRepo(self.context.git_repo)

    async def run(self, with_messages, **kwargs):
        """Create and initialize the workspace folder, initialize the Git environment."""
        self._init_repo()

        # Write the newly added requirements from the main parameter idea to `docs/requirement.txt`.
        doc = await self.repo.docs.save(filename=REQUIREMENT_FILENAME, content=with_messages[0].content)
        # Send a Message notification to the WritePRD action, instructing it to process requirements using
        # `docs/requirement.txt` and `docs/prd/`.
        return ActionOutput(content=doc.content, instruct_content=doc)

2. 示例

python 复制代码
context = Context()
from metagpt.schema import Message
USER_REQUIREMENT = """开发一个基于大语言模型与私有知识库的搜索引擎,希望可以基于大语言模型进行搜索总结"""

from metagpt.actions import UserRequirement
user_msg = Message(role="User", content=USER_REQUIREMENT, cause_by=UserRequirement)
product_manager = PrepareDocuments(context=context)

rsp = await product_manager.run([user_msg])
print(rsp)

结果:

2024-12-16 20:31:30.767 | INFO     | metagpt.utils.file_repository:save:57 - save to: D:\llm\MetaGPT\workspace\20241216203129\docs\requirement.txt

ActionOutput(content='开发一个基于大语言模型与私有知识库的搜索引擎,希望可以基于大语言模型进行搜索总结', instruct_content=开发一个基于大语言模型与私有知识库的搜索引擎,希望可以基于大语言模型进行搜索总结)

在workspace文件夹中产生的项目结构

3. 代码详解

导入部分

python 复制代码
import shutil
from pathlib import Path
from typing import Optional
  • shutil 用于文件和目录的操作(如删除目录)。
  • Path 是 pathlib 模块的一部分,用于处理路径。
  • Optional 是类型注解中的一个工具,表示某个值可以是某个类型或者 None。
python 复制代码
from metagpt.actions import Action
from metagpt.const import REQUIREMENT_FILENAME
from metagpt.utils.file_repository import FileRepository
from metagpt.utils.git_repository import GitRepository
from metagpt.utils.project_repo import ProjectRepo
from metagpt.schema import Document

导入了 metagpt 模块中的一些类和常量,主要用于操作 Git 仓库、文件库和项目仓库等。

ActionOutput 类

python 复制代码
@dataclasses.dataclass  
class ActionOutput:
    content: str
    instruct_content: Document

    def __init__(self, content: str, instruct_content: Document):
        self.content = content
        self.instruct_content = instruct_content

这个类用于保存操作的输出结果,包含两个字段:

  • content:操作的结果内容,类型为 str。
  • instruct_content:Document 类型,可能是与操作相关的文档内容。

@dataclasses.dataclass 装饰器简化了类的定义,自动生成了初始化方法。

PrepareDocuments 类

python 复制代码
class PrepareDocuments(Action):
    """PrepareDocuments Action: initialize project folder and add new requirements to docs/requirements.txt."""

    name: str = "PrepareDocuments"
    i_context: Optional[str] = None

PrepareDocuments 类继承自 Action 类,表示一个特定的行动,目的是初始化项目文件夹并将新的需求添加到 docs/requirements.txt 文件。

  • name 是该动作的名称,i_context 是上下文(可选),它会用于定义在动作执行期间的环境信息。
python 复制代码
@property
def config(self):
    return self.context.config

config 是一个只读属性,返回当前上下文的配置对象。

初始化 Git 仓库

python 复制代码
def _init_repo(self):
    """Initialize the Git environment."""
    if not self.config.project_path:
        name = self.config.project_name or FileRepository.new_filename()
        path = Path(self.config.workspace.path) / name
    else:
        path = Path(self.config.project_path)
    if path.exists() and not self.config.inc:
        shutil.rmtree(path)
    self.config.project_path = path
    self.context.git_repo = GitRepository(local_path=path, auto_init=True)
    self.context.repo = ProjectRepo(self.context.git_repo)
  • _init_repo 方法用于初始化 Git 仓库。它会检查是否有现有的项目路径,如果没有,则创建一个新的路径。
  • 如果该路径已经存在且配置中没有指示是否覆盖(config.inc 为 False),则删除现有的目录。
  • 随后,使用 GitRepository 初始化一个新的 Git 仓库,并使用 ProjectRepo 创建一个项目仓库。

执行操作

python 复制代码
async def run(self, with_messages, **kwargs):
    """Create and initialize the workspace folder, initialize the Git environment."""
    self._init_repo()

run 方法是操作的主要执行入口。它会调用 _init_repo 方法初始化 Git 环境。

python 复制代码
# Write the newly added requirements from the main parameter idea to `docs/requirement.txt`.
doc = await self.repo.docs.save(filename=REQUIREMENT_FILENAME, content=with_messages[0].content)

将传入的 with_messages[0].content 写入 docs/requirement.txt 文件。with_messages 似乎是包含多个消息的列表,with_messages[0] 可能是包含需求内容的消息。

使用 await 表明这是一个异步操作,repo.docs.save 方法将内容保存到文档中。

python 复制代码
# Send a Message notification to the WritePRD action, instructing it to process requirements using
# `docs/requirement.txt` and `docs/prd/`.
return ActionOutput(content=doc.content, instruct_content=doc)

操作完成后,返回一个 ActionOutput 对象,包含保存的文档内容和相关指示信息,通知后续的行动(例如处理需求的 WritePRD 行动)。

总结

PrepareDocuments 类是一个在项目中进行文件准备和 Git 环境初始化的行动。

它会根据配置初始化 Git 仓库,并将传入的需求内容写入 docs/requirements.txt 文件。

最后,返回一个 ActionOutput 对象,包含文档的内容以及需要后续处理的信息。

PrepareDocuments的数据结构



相关推荐
CM莫问36 分钟前
python实战(十一)——情感分析
人工智能
chenchihwen36 分钟前
TimesFM(Time Series Foundation Model)时间序列预测的数据研究(3)
人工智能·python
听风吹等浪起44 分钟前
改进系列(6):基于DenseNet网络添加TripletAttention注意力层实现的番茄病害图像分类
网络·人工智能·神经网络·算法·分类
夜半被帅醒1 小时前
【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念
人工智能·神经网络·机器学习
Hoper.J2 小时前
Epoch、Batch、Step 之间的关系
人工智能·深度学习·机器学习·ai
一只小灿灿2 小时前
计算机视觉中的图像滤波与增强算法
人工智能·算法·计算机视觉
Illusionna.2 小时前
Word2Vec 模型 PyTorch 实现并复现论文中的数据集
人工智能·pytorch·算法·自然语言处理·nlp·matplotlib·word2vec
平凡灵感码头3 小时前
机器学习算法概览
人工智能·算法·机器学习
UQI-LIUWJ3 小时前
论文结论:GPTs and Hallucination Why do large language models hallucinate
人工智能·语言模型·自然语言处理
ZHOU_WUYI3 小时前
2.metagpt中的软件公司智能体 (ProductManager 角色)
人工智能·metagpt