diff --git a/metagpt/actions/project_management.py b/metagpt/actions/project_management.py index 67a614d6f..b52616e37 100644 --- a/metagpt/actions/project_management.py +++ b/metagpt/actions/project_management.py @@ -70,6 +70,7 @@ class WriteTasks(Action): dependencies={system_design_doc.root_relative_path}, ) await self._update_requirements(task_doc) + await self.repo.resources.api_spec_and_task.save_pdf(doc=task_doc) return task_doc async def _run_new_tasks(self, context): diff --git a/metagpt/const.py b/metagpt/const.py index e4cebfd96..484987a03 100644 --- a/metagpt/const.py +++ b/metagpt/const.py @@ -135,3 +135,6 @@ AGGREGATION = "Aggregate" # Timeout USE_CONFIG_TIMEOUT = 0 # Using llm.timeout configuration. LLM_API_TIMEOUT = 300 + +# Assistant alias +ASSISTANT_ALIAS = "response" diff --git a/metagpt/tools/libs/software_development.py b/metagpt/tools/libs/software_development.py index 04da431b7..726f46e12 100644 --- a/metagpt/tools/libs/software_development.py +++ b/metagpt/tools/libs/software_development.py @@ -5,7 +5,7 @@ from __future__ import annotations from pathlib import Path from typing import Optional -from metagpt.const import BUGFIX_FILENAME, REQUIREMENT_FILENAME +from metagpt.const import ASSISTANT_ALIAS, BUGFIX_FILENAME, REQUIREMENT_FILENAME from metagpt.logs import ToolLogItem, log_tool_output from metagpt.schema import BugFixContext, Message from metagpt.tools.tool_registry import register_tool @@ -42,6 +42,8 @@ async def write_prd(idea: str, project_path: Optional[str | Path] = None) -> Pat from metagpt.context import Context from metagpt.roles import ProductManager + log_tool_output(output=[ToolLogItem(name=ASSISTANT_ALIAS, value=write_prd.__name__)], tool_name=write_prd.__name__) + ctx = Context() if project_path and Path(project_path).exists(): ctx.config.project_path = Path(project_path) @@ -85,6 +87,10 @@ async def write_design(prd_path: str | Path) -> Path: from metagpt.context import Context from metagpt.roles import Architect + log_tool_output( + output=[ToolLogItem(name=ASSISTANT_ALIAS, value=write_design.__name__)], tool_name=write_design.__name__ + ) + ctx = Context() prd_path = Path(prd_path) project_path = (Path(prd_path) if not prd_path.is_file() else prd_path.parent) / "../.." @@ -132,6 +138,11 @@ async def write_project_plan(system_design_path: str | Path) -> Path: from metagpt.context import Context from metagpt.roles import ProjectManager + log_tool_output( + output=[ToolLogItem(name=ASSISTANT_ALIAS, value=write_project_plan.__name__)], + tool_name=write_project_plan.__name__, + ) + ctx = Context() system_design_path = Path(system_design_path) project_path = (system_design_path if not system_design_path.is_file() else system_design_path.parent) / "../.." @@ -141,9 +152,15 @@ async def write_project_plan(system_design_path: str | Path) -> Path: await role.run(with_message=Message(content="", cause_by=WriteDesign)) outputs = [ - ToolLogItem(name="Project Plan", value=str(ctx.repo.docs.task.workdir / i)) + ToolLogItem(name="Intermedia Project Plan", value=str(ctx.repo.docs.task.workdir / i)) for i in ctx.repo.docs.task.changed_files.keys() ] + outputs.extend( + [ + ToolLogItem(name="Project Plan", value=str(ctx.repo.resources.api_spec_and_task.workdir / i)) + for i in ctx.repo.resources.api_spec_and_task.changed_files.keys() + ] + ) log_tool_output(output=outputs, tool_name=write_project_plan.__name__) return ctx.repo.docs.task.workdir @@ -179,6 +196,10 @@ async def write_codes(task_path: str | Path, inc: bool = False) -> Path: from metagpt.context import Context from metagpt.roles import Engineer + log_tool_output( + output=[ToolLogItem(name=ASSISTANT_ALIAS, value=write_codes.__name__)], tool_name=write_codes.__name__ + ) + ctx = Context() ctx.config.inc = inc task_path = Path(task_path) @@ -222,6 +243,10 @@ async def run_qa_test(src_path: str | Path) -> Path: from metagpt.environment import Environment from metagpt.roles import QaEngineer + log_tool_output( + output=[ToolLogItem(name=ASSISTANT_ALIAS, value=run_qa_test.__name__)], tool_name=run_qa_test.__name__ + ) + ctx = Context() src_path = Path(src_path) project_path = (src_path if not src_path.is_file() else src_path.parent) / ".." @@ -270,6 +295,8 @@ async def fix_bug(project_path: str | Path, issue: str) -> Path: from metagpt.context import Context from metagpt.roles import Engineer + log_tool_output(output=[ToolLogItem(name=ASSISTANT_ALIAS, value=fix_bug.__name__)], tool_name=fix_bug.__name__) + ctx = Context() ctx.set_repo_dir(project_path) ctx.src_workspace = ctx.git_repo.workdir / ctx.git_repo.workdir.name @@ -325,6 +352,10 @@ async def git_archive(project_path: str | Path) -> str: """ from metagpt.context import Context + log_tool_output( + output=[ToolLogItem(name=ASSISTANT_ALIAS, value=git_archive.__name__)], tool_name=git_archive.__name__ + ) + ctx = Context() ctx.set_repo_dir(project_path) ctx.git_repo.archive() @@ -358,6 +389,10 @@ async def import_git_repo(url: str) -> Path: from metagpt.actions.import_repo import ImportRepo from metagpt.context import Context + log_tool_output( + output=[ToolLogItem(name=ASSISTANT_ALIAS, value=import_git_repo.__name__)], tool_name=import_git_repo.__name__ + ) + ctx = Context() action = ImportRepo(repo_path=url, context=ctx) await action.run()