MetaGPT Actions基础框架之Action类解析

代码地址:github.com/FoundationA...

Action类解析

概述

Action类是MetaGPT框架中的核心组件,用于定义可执行动作,集成了LLM调用、上下文管理和动作节点执行功能,作为所有具体动作类的基类。

继承关系

  • SerializationMixin: 提供序列化能力,支持对象的持久化与传输
  • ContextMixin: 提供上下文管理功能,维护动作执行过程中的状态信息
  • BaseModel: 基于Pydantic的模型基类,提供数据验证和配置管理

核心配置

  • model_config : 使用ConfigDict(arbitrary_types_allowed=True)允许任意类型属性,适应复杂上下文场景

核心属性

属性名 类型 描述
name str 动作名称,默认为类名(通过模型验证器自动设置)
i_context Uniondict, CodingContext, str, None 输入上下文,支持多种类型以适应不同动作场景(编码、测试、代码总结等)
prefix str LLM调用的系统提示前缀,通过set_prefix方法更新
desc str 动作描述,用于技能管理器识别和分类
node ActionNode 动作节点实例,定义具体执行逻辑和LLM交互模板
llm_name_or_type Optionalstr LLM模型名称或类型,对应config2.yaml中的模型配置

关键属性方法

  • prompt_schema: 获取配置中的提示词模板结构
  • project_name: 获取/设置当前项目名称(关联配置上下文)
  • project_path: 获取当前项目路径(关联配置上下文)

主要方法

方法名 说明
run(*args, **kwargs) 动作执行入口方法,若存在node则调用_run_action_node,否则需子类实现
_aask(prompt, system_msgs) 异步调用LLM,自动附加prefix作为系统提示
_run_action_node(*args, **kwargs) 处理历史消息上下文,调用ActionNode.fill()执行节点逻辑
set_prefix(prefix) 更新前缀并同步至LLM系统提示,若存在node则同步节点的LLM实例
override_context() private_contextcontext统一为同一对象,确保上下文一致性
str /repr 返回类名作为字符串表示,便于日志和调试

模型验证器逻辑

  1. set_name_if_empty (前置验证):若未提供name,自动将类名设为动作名称
  2. _init_with_instruction (前置验证):若传入instruction参数,自动创建ActionNode实例并赋值给node
  3. _update_private_llm (后置验证):根据llm_name_or_type从配置中加载LLM实例,继承成本管理器(cost_manager)

ActionNode集成

  • 通过node属性关联ActionNode,实现基于模板的LLM交互
  • _run_action_node方法会将历史消息格式化为上下文,调用node.fill()完成具体内容生成
  • set_prefix方法同步更新LLM系统提示时,会同时更新node的LLM实例

使用示例

示例1:代码生成动作(WriteCode)

python 复制代码
class WriteCode(Action):
    name: str = "WriteCode"
    i_context: Document = Field(default_factory=Document)
    repo: Optional[ProjectRepo] = Field(default=None, exclude=True)
    input_args: Optional[BaseModel] = Field(default=None, exclude=True)

    async def run(self, *args, **kwargs) -> CodingContext:
        # 1. 加载上下文(设计文档、任务描述、历史代码等)
        coding_context = CodingContext.loads(self.i_context.content)
        
        # 2. 构建LLM提示词
        prompt = PROMPT_TEMPLATE.format(
            design=coding_context.design_doc.content,
            task=coding_context.task_doc.content,
            code=code_context,
            filename=self.i_context.filename
        )
        
        # 3. 调用LLM生成代码
        code = await self.write_code(prompt)
        
        # 4. 更新上下文并返回
        coding_context.code_doc.content = code
        return coding_context

关键实现点

  • 重写run方法实现代码生成逻辑
  • 使用CodingContext管理编码相关上下文信息
  • 通过模板构建提示词,调用_aask方法与LLM交互
  • 支持增量开发和调试日志集成

示例2:需求分析动作(AnalyzeRequirementsRestrictions)

python 复制代码
class AnalyzeRequirementsRestrictions(Action):
    name: str = "AnalyzeRequirementsRestrictions"

    async def run(self, requirements, isinstance=INSTRUCTIONS, output_format=OUTPUT_FORMAT):
        # 1. 构建提示词(包含示例、需求和输出格式)
        prompt = ANALYZE_REQUIREMENTS.format(
            examples=EXAMPLES,
            requirements=requirements,
            instructions=isinstance,
            output_format=output_format
        )
        
        # 2. 调用LLM分析需求
        rsp = await self.llm.aask(prompt)
        return rsp

关键实现点

  • 轻量级实现,专注于需求分析单一职责
  • 通过格式化字符串构建复杂提示词
  • 直接使用llm.aask方法进行LLM调用
  • 返回原始LLM响应结果

使用场景

  • 作为所有具体动作(如WriteCodeAnalyzeRequirements)的基类
  • 标准化LLM调用流程,统一上下文管理和消息处理机制
  • 通过ActionNode实现可配置的动作逻辑,支持不同场景下的提示词模板复用
相关推荐
染指111011 分钟前
26.RAG进阶(Advanced RAG)-假设性问题索引
人工智能·windows·agent·rag·advanced rag
闵孚龙14 分钟前
动态图机制:为什么 PyTorch 调试起来更舒服
人工智能·pytorch·python
甲维斯1 小时前
还要啥Codex!DeepSeek接入Zcode远程连接!
人工智能
百胜软件@百胜软件1 小时前
百胜软件亮相“AI消费新生活”主题日活动,AI智能运营平台入选市级案例征集
人工智能·生活·零售数字化·数智中台·珠宝行业
专注搞钱2 小时前
GPT-4o写设备Recipe:从3小时到10分钟
数据库·人工智能·gpt·半导体
闻道参看2 小时前
贝芯宠AI灵兽 ELFVET 大模型聚焦临床应用,强化宠物诊疗综合能力
人工智能·宠物
MartinYeung52 小时前
[论文学习]重新思考大型语言模型忘却目标:梯度视角与超越
人工智能·学习·语言模型
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月14日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
m0_380167143 小时前
加密货币价格 API、市场数据 API 与 分析 API 有什么区别?
人工智能·ai·区块链
zyplayer-doc3 小时前
企业知识库安全与权限管理完全指南:从加密到审计的六层防护
人工智能·安全·pdf·编辑器·创业创新