基于MetaGPT构建网页生成Agent团队:从需求到可运行网页的全自动化
MetaGPT作为一款以“模拟企业协作流程”为核心的多智能体框架,能够将复杂任务拆解为不同角色的子任务,通过智能体间的信息流转和能力互补完成端到端的工作闭环。本文将手把手教你搭建“网页生成Agent团队”,让产品经理Agent、前端Agent、测试Agent各司其职,最终自动输出无语法错误的可运行网页文件,彻底打通“自然语言需求→代码实现→成果交付”的全流程。 MetaGPT的核心是“角色化分工+标准化成果流转”,针对“网页生成”场景,我们将任务拆解为4个核心环节: 创建 基于MetaGPT的 核心职责:将模糊的自然语言需求转化为结构化、可落地的前端开发需求文档,明确页面结构、样式、核心元素等。 核心职责:基于产品经理的需求文档,生成符合W3C标准的HTML/CSS代码,样式内联便于测试,输出可直接运行的 核心职责:校验HTML/CSS代码的语法错误(标签未闭合、属性错误、CSS语法错误等),输出测试报告,验收通过则触发最终文件输出。 通过MetaGPT的 基于MetaGPT搭建的“网页生成Agent团队”,核心价值在于将“需求分析-代码开发-测试验收”的人工工作流转化为智能体自动化协作流,不仅降低了网页开发的技术门槛,还能保证成果的规范性和一致性。该方案可适配个人轻量网页开发、企业批量生成静态页面等场景,通过角色扩展和流程优化,还能支撑更复杂的前端开发需求,是AI赋能开发效率提升的典型落地实践。一、核心设计思路
1.1 MetaGPT多智能体协作逻辑
1.2 核心技术依赖
二、环境准备
2.1 安装核心依赖
# 安装MetaGPT核心包
pip install metagpt>=0.8.0
# 安装语法检测依赖
pip install beautifulsoup4 lxml csslint
# 配置工作目录(成果输出路径)
export METAGPT_WORKSPACE="./web_agent_workspace"
mkdir -p $METAGPT_WORKSPACE2.2 配置大模型密钥
config.yaml文件(MetaGPT默认读取路径:~/.metagpt/config.yaml):llm:
api_type: "openai" # 可选:openai/anthropic/qwen(通义千问)
api_key: "你的API密钥"
base_url: "https://api.openai.com/v1" # 国产模型替换为对应地址
model: "gpt-4o-mini" # 推荐使用低成本且效果好的模型三、各Agent角色实现
Role基类,为每个角色定制核心能力,所有代码可直接复制运行。3.1 产品经理Agent:需求分析
from metagpt.roles import Role
from metagpt.schema import Message
from metagpt.const import WORKSPACE_ROOT
class ProductManagerAgent(Role):
def __init__(self):
super().__init__(
name="网页产品经理",
profile="精通网页产品需求分析,能将自然语言需求转化为结构化的前端开发文档",
goal="输出清晰、可落地的网页开发需求文档",
constraints=[
"需求文档需包含页面标题、核心结构(头部/主体/底部)、样式要求(主色调/字体)、核心元素(按钮/文本/图片)",
"语言简洁,避免模糊表述,确保前端Agent能直接理解"
]
)
async def handle(self, msg: Message) -> Message:
"""处理用户需求,生成结构化需求文档"""
user_requirement = msg.content
# 调用大模型生成结构化需求文档
prompt = f"""
请将以下用户需求转化为网页开发需求文档:
用户需求:{user_requirement}
文档格式要求:
1. 页面标题
2. 页面结构(头部/主体/底部)
3. 样式要求(主色调、字体、布局)
4. 核心元素(必须包含的按钮/文本/图片等)
"""
# 调用MetaGPT内置的LLM能力
requirement_doc = await self._aask(prompt)
# 保存需求文档到工作目录
doc_path = f"{WORKSPACE_ROOT}/需求文档.md"
with open(doc_path, "w", encoding="utf-8") as f:
f.write(requirement_doc)
return Message(
content=f"需求分析完成,文档路径:{doc_path}\n需求摘要:{requirement_doc[:200]}...",
role=self.name
)3.2 前端Agent:编写HTML/CSS代码
.html文件。class FrontendAgent(Role):
def __init__(self):
super().__init__(
name="前端开发工程师",
profile="精通HTML/CSS,能根据需求文档编写规范、可运行的静态网页代码",
goal="输出无基础语法错误的HTML/CSS代码文件",
constraints=[
"代码符合W3C标准,标签闭合完整,样式语法规范",
"样式内联在HTML文件中,无需外部CSS文件",
"文件名统一为index.html,保存到工作目录"
]
)
async def handle(self, msg: Message) -> Message:
"""基于需求文档生成HTML/CSS代码"""
# 读取需求文档
doc_path = msg.content.split("文档路径:")[1].split("\n")[0]
with open(doc_path, "r", encoding="utf-8") as f:
requirement_doc = f.read()
# 调用大模型生成HTML/CSS代码
prompt = f"""
请根据以下需求文档编写完整的HTML/CSS代码:
{requirement_doc}
代码要求:
1. 完整的HTML5结构(DOCTYPE、html/head/body标签)
2. 响应式布局,适配PC和移动端
3. 样式内联在<style>标签中,主色调符合需求
4. 包含需求中指定的所有核心元素
"""
html_code = await self._aask(prompt)
# 提取纯代码(过滤大模型的自然语言说明)
if "```html" in html_code:
html_code = html_code.split("```html")[1].split("```")[0]
# 保存代码文件
code_path = f"{WORKSPACE_ROOT}/index.html"
with open(code_path, "w", encoding="utf-8") as f:
f.write(html_code)
return Message(
content=f"前端代码生成完成,文件路径:{code_path}",
role=self.name
)3.3 测试Agent:语法错误检测
import os
from bs4 import BeautifulSoup
import subprocess
class TestAgent(Role):
def __init__(self):
super().__init__(
name="前端测试工程师",
profile="精通HTML/CSS语法检测,能识别常见的语法错误",
goal="检测网页代码语法错误,输出测试报告,确认是否可交付最终文件",
constraints=[
"重点检测:HTML标签闭合、属性格式、CSS语法规范",
"若错误数为0,判定为验收通过;否则输出具体错误信息",
"测试报告保存到工作目录"
]
)
def check_html_syntax(self, code_path):
"""检测HTML语法错误"""
errors = []
try:
with open(code_path, "r", encoding="utf-8") as f:
html_content = f.read()
# 检测标签闭合
soup = BeautifulSoup(html_content, "lxml")
# 检查是否有未闭合的标签(简化版,可扩展更严格的校验)
unclosed_tags = []
for tag in soup.find_all():
if not tag.find(string=True, recursive=False) and len(tag.contents) == 0 and not tag.name in ["img", "input", "br"]:
unclosed_tags.append(tag.name)
if unclosed_tags:
errors.append(f"HTML未闭合标签:{','.join(unclosed_tags)}")
# 检测CSS语法(使用csslint)
css_content = html_content.split("<style>")[1].split("</style>")[0] if "<style>" in html_content else ""
if css_content:
# 临时保存CSS内容
css_path = f"{WORKSPACE_ROOT}/temp.css"
with open(css_path, "w", encoding="utf-8") as f:
f.write(css_content)
# 调用csslint检测
result = subprocess.run(
["csslint", css_path],
capture_output=True,
text=True,
encoding="utf-8"
)
if result.returncode != 0 and result.stderr:
errors.append(f"CSS语法错误:{result.stderr[:200]}...")
os.remove(css_path)
except Exception as e:
errors.append(f"文件读取/解析错误:{str(e)}")
return errors
async def handle(self, msg: Message) -> Message:
"""执行语法检测,生成测试报告"""
code_path = msg.content.split("文件路径:")[1]
errors = self.check_html_syntax(code_path)
# 生成测试报告
report_path = f"{WORKSPACE_ROOT}/测试报告.md"
if not errors:
report_content = f"""
# 网页代码测试报告
- 测试文件:{code_path}
- 测试结果:通过(无语法错误)
- 结论:可输出最终网页文件
"""
status = "通过"
else:
report_content = f"""
# 网页代码测试报告
- 测试文件:{code_path}
- 测试结果:失败
- 错误列表:
{chr(10).join([f"- {err}" for err in errors])}
- 结论:需修正错误后重新生成
"""
status = "失败"
# 保存测试报告
with open(report_path, "w", encoding="utf-8") as f:
f.write(report_content)
# 验收通过则复制到最终文件目录
if status == "通过":
final_dir = f"{WORKSPACE_ROOT}/最终文件"
os.makedirs(final_dir, exist_ok=True)
final_path = f"{final_dir}/index.html"
os.system(f"cp {code_path} {final_path}")
report_content += f"\n- 最终文件路径:{final_path}"
return Message(
content=f"测试完成,报告路径:{report_path}\n验收状态:{status}",
role=self.name
)四、启动Agent团队并运行
Team类整合所有Agent,实现任务自动流转和成果输出:from metagpt.team import Team
import asyncio
async def run_web_agent_team(user_requirement: str):
"""启动网页生成Agent团队"""
# 1. 创建团队并添加成员
team = Team()
team.add_members([
ProductManagerAgent(),
FrontendAgent(),
TestAgent()
])
# 2. 启动团队,传入用户需求
print("🚀 启动网页生成Agent团队...")
await team.run(
project_name="自动生成网页",
idea=user_requirement,
send_to="网页产品经理" # 需求先发送给产品经理Agent
)
# 3. 输出最终结果
final_path = f"{WORKSPACE_ROOT}/最终文件/index.html"
if os.path.exists(final_path):
print(f"✅ 任务完成!最终网页文件路径:{final_path}")
else:
print("❌ 任务失败!请查看测试报告修正错误。")
# 运行示例:用户需求
if __name__ == "__main__":
# 自定义用户需求(可替换为任意自然语言描述)
user_req = "生成一个个人简历网页,包含姓名、工作经历、技能展示区域,主色调为深蓝色,字体为微软雅黑,底部添加联系按钮"
# 启动团队
asyncio.run(run_web_agent_team(user_req))五、实战效果验证
5.1 输入示例
生成一个个人简历网页,包含姓名、工作经历、技能展示区域,主色调为深蓝色,字体为微软雅黑,底部添加联系按钮5.2 输出成果
需求文档.md,明确页面结构、样式、核心元素;index.html,包含完整的HTML/CSS代码,符合需求;测试报告.md,并将文件复制到最终文件目录;最终文件/index.html可直接在浏览器打开,展示完整的个人简历页面。六、优化与扩展方向
七、总结
总结
Role基类实现核心能力,通过Team类完成任务调度;