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 Union[dict, CodingContext, str, None] 输入上下文,支持多种类型以适应不同动作场景(编码、测试、代码总结等)
prefix str LLM调用的系统提示前缀,通过set_prefix方法更新
desc str 动作描述,用于技能管理器识别和分类
node ActionNode 动作节点实例,定义具体执行逻辑和LLM交互模板
llm_name_or_type Optional[str] 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实现可配置的动作逻辑,支持不同场景下的提示词模板复用
相关推荐
rocksun2 小时前
认识Embabel:一个使用Java构建AI Agent的框架
java·人工智能
Java中文社群3 小时前
AI实战:一键生成数字人视频!
java·人工智能·后端
AI大模型技术社3 小时前
🔧 PyTorch高阶开发工具箱:自定义模块+损失函数+部署流水线完整实现
人工智能·pytorch
LLM大模型3 小时前
LangChain篇-基于SQL实现数据分析问答
人工智能·程序员·llm
LLM大模型3 小时前
LangChain篇-整合维基百科实现网页问答
人工智能·程序员·llm
DeepSeek忠实粉丝3 小时前
微调篇--基于GPT定制化微调训练
人工智能·程序员·llm
聚客AI4 小时前
💡 图解Transformer生命周期:训练、自回归生成与Beam Search的视觉化解析
人工智能·llm·掘金·日新计划
神经星星5 小时前
从石英到铁电材料,哈佛大学提出等变机器学习框架,加速材料大规模电场模拟
人工智能·深度学习·机器学习
摆烂工程师5 小时前
Google One AI Pro 的教育学生优惠即将在六月底结束了!教你如何认证Gemini学生优惠!
前端·人工智能·后端
陈明勇6 小时前
MCP 官方开源 Registry 注册服务:基于 Go 和 MongoDB 构建
人工智能·后端·mcp