From fd080fa63361d66ea4ce92745c18a4b6bc4b5c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E4=BC=9F=E9=9F=AC?= Date: Mon, 5 Aug 2024 19:17:43 +0800 Subject: [PATCH] fixbug: write to folder --- metagpt/actions/design_api.py | 2 +- metagpt/actions/project_management.py | 7 ++++--- metagpt/actions/project_management_an.py | 2 +- metagpt/actions/write_prd.py | 2 +- metagpt/prompts/di/role_zero.py | 4 ++-- metagpt/prompts/di/team_leader.py | 1 + metagpt/roles/di/role_zero.py | 7 +++++-- metagpt/tools/libs/editor.py | 2 +- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/metagpt/actions/design_api.py b/metagpt/actions/design_api.py index 3eb8fe04d..61a6adfa1 100644 --- a/metagpt/actions/design_api.py +++ b/metagpt/actions/design_api.py @@ -83,7 +83,7 @@ class WriteDesign(Action): prd_filename (str, optional): The filename of the Product Requirement Document (PRD). legacy_design_filename (str, optional): The filename of the legacy design document. extra_info (str, optional): Additional information to be included in the system design. - output_pathname (str, optional): The output path name of file that the system design should be saved to. + output_pathname (str, optional): The output path name of file that the system design should be saved to. The path name must must end with '.json'. Returns: str: The file path of the generated system design. diff --git a/metagpt/actions/project_management.py b/metagpt/actions/project_management.py index 355a3853d..8277c6342 100644 --- a/metagpt/actions/project_management.py +++ b/metagpt/actions/project_management.py @@ -62,7 +62,7 @@ class WriteTasks(Action): Args: user_requirement (str, optional): A string specifying the user's requirements. Defaults to an empty string. - design_filename (str): The filename of the project system design file. Defaults to an empty string. + design_filename (str): The filename of the project system design file. The path name must must end with '.json'. Defaults to an empty string. output_pathname (str, optional): The output path name of file that the project schedule should be saved to. **kwargs: Additional keyword arguments. @@ -73,10 +73,11 @@ class WriteTasks(Action): # Write a project schedule with a given system design. >>> design_filename = "/absolute/path/to/snake_game/docs/system_design.json" >>> output_pathname = "/absolute/path/to/snake_game/docs/project_schedule.json" + >>> user_requirement = "Write project schedule for a snake game following these requirements:..." >>> action = WriteTasks() - >>> result = await action.run(design_filename=design_filename, output_pathname=output_pathname) + >>> result = await action.run(user_requirement=user_requirement,design_filename=design_filename, output_pathname=output_pathname) >>> print(result) - The project schedule is at /absolute/path/to/snake_game/docs/project_schedule.json + The project schedule is at /absolute/path/to/在nake_game/docs/project_schedule.json # Write a project schedule with a user requirement. >>> user_requirement = "Write project schedule for a snake game following these requirements: ..." diff --git a/metagpt/actions/project_management_an.py b/metagpt/actions/project_management_an.py index 01b92b7fc..78f17653b 100644 --- a/metagpt/actions/project_management_an.py +++ b/metagpt/actions/project_management_an.py @@ -12,7 +12,7 @@ from metagpt.actions.action_node import ActionNode REQUIRED_PYTHON_PACKAGES = ActionNode( key="Required Python packages", expected_type=List[str], - instruction="Provide required Python packages in requirements.txt format.", + instruction="Provide required Python packages in requirements.txt format. The response language should correspond to the context and requirements.", example=["flask==1.1.2", "bcrypt==3.2.0"], ) diff --git a/metagpt/actions/write_prd.py b/metagpt/actions/write_prd.py index a062ece54..549a04927 100644 --- a/metagpt/actions/write_prd.py +++ b/metagpt/actions/write_prd.py @@ -98,7 +98,7 @@ class WritePRD(Action): Args: user_requirement (str): A string detailing the user's requirements. - output_pathname (str, optional): The path name of file that the output document should be saved to. Defaults to "". + output_pathname (str, optional): The path name of file that the output document should be saved to. The path name must must end with '.json'. Defaults to "". legacy_prd_filename (str, optional): The file path of the legacy Product Requirement Document to use as a reference. Defaults to "". extra_info (str, optional): Additional information to include in the document. Defaults to "". **kwargs: Additional keyword arguments. diff --git a/metagpt/prompts/di/role_zero.py b/metagpt/prompts/di/role_zero.py index 5891522bd..0c1c5544b 100644 --- a/metagpt/prompts/di/role_zero.py +++ b/metagpt/prompts/di/role_zero.py @@ -56,7 +56,7 @@ In your response, include at least one command. Some text indicating your thoughts before JSON is required, such as what tasks have been completed, what tasks are next, how you should update the plan status, respond to inquiry, or seek for help. Then a json array of commands. You must output ONE and ONLY ONE json array. DON'T output multiple json arrays with thoughts between them. Output should adhere to the following format. {thought_guidance} -Finally, combine your thoughts, describe what you want to do conscisely in 20 words, including which process you will taked and whether you will end, then follow your thoughts to list the commands, adhering closely to the instructions provided. +Finally, combine your thoughts, describe what you want to do, including which process you will taked and whether you will end, then follow your thoughts to list the commands, adhering closely to the instructions provided. ```json [ {{ @@ -71,7 +71,7 @@ Notice: your output JSON data section must start with **```json [** THOUGHT_GUIDANCE = """ First, describe the actions you have taken recently. Second, describe the messages you have received recently, with a particular emphasis on messages from users. -Third, describe the plan status and the current task. Review the histroy, if `Current Task` has been undertaken and completed by you or anyone, you MUST use the **Plan.finish_current_task** command to finish it first before taking any action, the command will automatically move you to the next task. +Third, describe the plan status and the current task. Review the histroy, if `Current Task` has been undertaken and completed by you or anyone, you MUST use the **Plan.finish_current_task** command to finish it first, the command will automatically move you to the next task. Fourth, describe any necessary human interaction. Use **RoleZero.reply_to_human** to report your progress if you complete a task or the overall requirement, pay attention to the history, DON'T repeat reporting. Use **RoleZero.ask_human** if you failed the current task, unsure of the situation encountered, need any help from human, or executing repetitive commands but receiving repetitive feedbacks without making progress. Fifth, describe if you should terminate, you should use **end** command to terminate if any of the following is met: - You have completed the overall user requirement diff --git a/metagpt/prompts/di/team_leader.py b/metagpt/prompts/di/team_leader.py index 2f3e69651..3ab59d5ad 100644 --- a/metagpt/prompts/di/team_leader.py +++ b/metagpt/prompts/di/team_leader.py @@ -30,6 +30,7 @@ Note: 10. Do not use escape characters in json data, particularly within file paths. 11. Analyze the capabilities of team members and assign tasks to them based on user Requirements. If the requirements ask to ignore certain tasks, follow the requirements. 12. Add default web technologies: HTML (*.html), CSS (*.css), and JavaScript (*.js) to your requirements.If no specific programming language is required, include these technologies in the project requirements. Using instruction to forward this information to your team members. +13. If you find there are no specific tasks or user requirements, you must ask a human for advice on what to do next. """ TL_THOUGHT_GUIDANCE = ( THOUGHT_GUIDANCE diff --git a/metagpt/roles/di/role_zero.py b/metagpt/roles/di/role_zero.py index af39fa544..c5ff1e858 100644 --- a/metagpt/roles/di/role_zero.py +++ b/metagpt/roles/di/role_zero.py @@ -368,6 +368,9 @@ class RoleZero(Role): elif cmd["command_name"] == "end": self._set_state(-1) + # When all the plans have been completed, clear the plan's goal and wait for the next requirements. + if self.planner.current_task is None: + self.planner.plan.goal = "" command_output = "" # output from bash.run may be empty, add decorations to the output to ensure visibility. @@ -376,10 +379,10 @@ class RoleZero(Role): tool_output = await tool_obj(**cmd["args"]) if len(tool_output) <= 10: command_output += ( - f"\n[command]: {cmd['args']['cmd']} \n [command output] : {tool_output} (pay attention to this.)" + f"\n[command]: {cmd['args']['cmd']} \n[command output] : {tool_output} (pay attention to this.)" ) else: - command_output += f"\n[command]: {cmd['args']['cmd']} \n [command output] : {tool_output}" + command_output += f"\n[command]: {cmd['args']['cmd']} \n[command output] : {tool_output}" return command_output def _get_plan_status(self) -> Tuple[str, str]: diff --git a/metagpt/tools/libs/editor.py b/metagpt/tools/libs/editor.py index b964a2741..c61df3579 100644 --- a/metagpt/tools/libs/editor.py +++ b/metagpt/tools/libs/editor.py @@ -25,7 +25,7 @@ class Editor: self.resource = EditorReporter() def write(self, path: str, content: str): - """Write the whole content to a file. When used, make sure content arg contains the full content of the file.""" + """Write the whole content to a file. The path must be a file path with a specific file extension. When used, make sure content arg contains the full content of the file.""" if "\n" not in content and "\\n" in content: # A very raw rule to correct the content: If 'content' lacks actual newlines ('\n') but includes '\\n', consider # replacing them with '\n' to potentially correct mistaken representations of newline characters.