From 1e091b5675e36dc3cee409e43adb8497ca89c073 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Thu, 27 Jun 2024 13:44:06 +0800 Subject: [PATCH 1/4] update: role_zero add json_repair --- metagpt/prompts/di/role_zero.py | 12 ++++++++++++ metagpt/roles/di/role_zero.py | 12 +++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/metagpt/prompts/di/role_zero.py b/metagpt/prompts/di/role_zero.py index 4d52476aa..7f9f37ca2 100644 --- a/metagpt/prompts/di/role_zero.py +++ b/metagpt/prompts/di/role_zero.py @@ -50,3 +50,15 @@ Some text indicating your thoughts, such as how you should update the plan statu ] ``` """ + + +JSON_REPAIR_PROMPT = """ + ## json data + {json_data} + + ## Output Format + ```json + Formatted JSON data + ``` + Help check if there are any formatting issues with the JSON data? If so, please help format it +""" diff --git a/metagpt/roles/di/role_zero.py b/metagpt/roles/di/role_zero.py index b5342409f..39b44ccf3 100644 --- a/metagpt/roles/di/role_zero.py +++ b/metagpt/roles/di/role_zero.py @@ -10,7 +10,7 @@ from pydantic import model_validator from metagpt.actions import Action from metagpt.actions.di.run_command import RunCommand from metagpt.logs import logger -from metagpt.prompts.di.role_zero import CMD_PROMPT, ROLE_INSTRUCTION +from metagpt.prompts.di.role_zero import CMD_PROMPT, ROLE_INSTRUCTION, JSON_REPAIR_PROMPT from metagpt.roles import Role from metagpt.schema import AIMessage, Message, UserMessage from metagpt.strategy.experience_retriever import DummyExpRetriever, ExpRetriever @@ -21,6 +21,7 @@ from metagpt.tools.tool_recommend import BM25ToolRecommender, ToolRecommender from metagpt.tools.tool_registry import register_tool from metagpt.utils.common import CodeParser from metagpt.utils.report import ThoughtReporter +from metagpt.utils.repair_llm_raw_output import repair_llm_raw_output, RepairType @register_tool(include_functions=["ask_human", "reply_to_human"]) @@ -138,6 +139,9 @@ class RoleZero(Role): return await super()._act() try: + commands = json.loads(repair_llm_raw_output(output=CodeParser.parse_code(block=None, lang="json", text=self.command_rsp), req_keys=[None], repair_type=RepairType.JSON)) + except json.JSONDecodeError as e: + self.command_rsp = await self.llm.aask(msg=JSON_REPAIR_PROMPT.format(json_data=self.command_rsp)) commands = json.loads(CodeParser.parse_code(block=None, lang="json", text=self.command_rsp)) except Exception as e: tb = traceback.format_exc() @@ -145,6 +149,12 @@ class RoleZero(Role): error_msg = UserMessage(content=str(e)) self.rc.memory.add(error_msg) return error_msg + + if isinstance(commands, dict): + if "commands" in commands: + commands = commands["commands"] + else: + commands = [commands] outputs = await self._run_commands(commands) self.rc.memory.add(UserMessage(content=outputs)) return AIMessage( From 28108bb37815f0b6989e43fbbe6c5d84de962ea1 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Thu, 27 Jun 2024 16:40:28 +0800 Subject: [PATCH 2/4] update: fix cr comment --- metagpt/prompts/di/role_zero.py | 3 +-- metagpt/roles/di/role_zero.py | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/metagpt/prompts/di/role_zero.py b/metagpt/prompts/di/role_zero.py index 7f9f37ca2..6df7b01ff 100644 --- a/metagpt/prompts/di/role_zero.py +++ b/metagpt/prompts/di/role_zero.py @@ -49,9 +49,8 @@ Some text indicating your thoughts, such as how you should update the plan statu ... ] ``` + """ - - JSON_REPAIR_PROMPT = """ ## json data {json_data} diff --git a/metagpt/roles/di/role_zero.py b/metagpt/roles/di/role_zero.py index 39b44ccf3..e4c81278b 100644 --- a/metagpt/roles/di/role_zero.py +++ b/metagpt/roles/di/role_zero.py @@ -139,7 +139,8 @@ class RoleZero(Role): return await super()._act() try: - commands = json.loads(repair_llm_raw_output(output=CodeParser.parse_code(block=None, lang="json", text=self.command_rsp), req_keys=[None], repair_type=RepairType.JSON)) + self.command_rsp = CodeParser.parse_code(block=None, lang="json", text=self.command_rsp) + commands = json.loads(repair_llm_raw_output(output=self.command_rsp, req_keys=[None], repair_type=RepairType.JSON)) except json.JSONDecodeError as e: self.command_rsp = await self.llm.aask(msg=JSON_REPAIR_PROMPT.format(json_data=self.command_rsp)) commands = json.loads(CodeParser.parse_code(block=None, lang="json", text=self.command_rsp)) @@ -150,11 +151,10 @@ class RoleZero(Role): self.rc.memory.add(error_msg) return error_msg + # 为了对LLM不按格式生成进行容错 if isinstance(commands, dict): - if "commands" in commands: - commands = commands["commands"] - else: - commands = [commands] + commands = commands["commands"] if "commands" in commands else [commands] + outputs = await self._run_commands(commands) self.rc.memory.add(UserMessage(content=outputs)) return AIMessage( From c648f0704a18a3378ea87b061e0810f0be1b1fff Mon Sep 17 00:00:00 2001 From: zhanglei Date: Thu, 27 Jun 2024 17:00:40 +0800 Subject: [PATCH 3/4] update: fix cr comment --- metagpt/prompts/di/role_zero.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/metagpt/prompts/di/role_zero.py b/metagpt/prompts/di/role_zero.py index 6df7b01ff..a33487d81 100644 --- a/metagpt/prompts/di/role_zero.py +++ b/metagpt/prompts/di/role_zero.py @@ -52,12 +52,12 @@ Some text indicating your thoughts, such as how you should update the plan statu """ JSON_REPAIR_PROMPT = """ - ## json data - {json_data} - - ## Output Format - ```json - Formatted JSON data - ``` - Help check if there are any formatting issues with the JSON data? If so, please help format it +## json data +{json_data} + +## Output Format +```json +Formatted JSON data +``` +Help check if there are any formatting issues with the JSON data? If so, please help format it """ From ff6389ae6126d8914fa7578830903a4078cfcb7e Mon Sep 17 00:00:00 2001 From: zhanglei Date: Thu, 27 Jun 2024 17:13:17 +0800 Subject: [PATCH 4/4] update: fix cr comment --- metagpt/roles/di/role_zero.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/metagpt/roles/di/role_zero.py b/metagpt/roles/di/role_zero.py index e4c81278b..f528fe638 100644 --- a/metagpt/roles/di/role_zero.py +++ b/metagpt/roles/di/role_zero.py @@ -139,11 +139,11 @@ class RoleZero(Role): return await super()._act() try: - self.command_rsp = CodeParser.parse_code(block=None, lang="json", text=self.command_rsp) - commands = json.loads(repair_llm_raw_output(output=self.command_rsp, req_keys=[None], repair_type=RepairType.JSON)) + commands = CodeParser.parse_code(block=None, lang="json", text=self.command_rsp) + commands = json.loads(repair_llm_raw_output(output=commands, req_keys=[None], repair_type=RepairType.JSON)) except json.JSONDecodeError as e: - self.command_rsp = await self.llm.aask(msg=JSON_REPAIR_PROMPT.format(json_data=self.command_rsp)) - commands = json.loads(CodeParser.parse_code(block=None, lang="json", text=self.command_rsp)) + commands = await self.llm.aask(msg=JSON_REPAIR_PROMPT.format(json_data=self.command_rsp)) + commands = json.loads(CodeParser.parse_code(block=None, lang="json", text=commands)) except Exception as e: tb = traceback.format_exc() print(tb)