From df29e16e2b78b2a1c351f0b689109ef9b41a2e05 Mon Sep 17 00:00:00 2001 From: lidanyang Date: Fri, 12 Jul 2024 16:44:05 +0800 Subject: [PATCH] refine code --- metagpt/actions/di/write_analysis_code.py | 10 ++-------- metagpt/prompts/di/data_analyst.py | 9 ++++++++- metagpt/prompts/di/write_analysis_code.py | 6 ------ metagpt/roles/di/data_analyst.py | 19 ++++++++++--------- metagpt/roles/di/role_zero.py | 6 +++--- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/metagpt/actions/di/write_analysis_code.py b/metagpt/actions/di/write_analysis_code.py index 06e0ba4e2..00e6d174d 100644 --- a/metagpt/actions/di/write_analysis_code.py +++ b/metagpt/actions/di/write_analysis_code.py @@ -16,7 +16,6 @@ from metagpt.prompts.di.write_analysis_code import ( REFLECTION_PROMPT, REFLECTION_SYSTEM_MSG, STRUCTUAL_PROMPT, - BROWSER_INFO, ) from metagpt.schema import Message, Plan from metagpt.utils.common import CodeParser, remove_comments @@ -49,14 +48,9 @@ class WriteAnalysisCode(Action): plan_status=plan_status, tool_info=tool_info, ) - message = [Message(content=structual_prompt, role="user")] - browser_actions = [msg for msg in working_memory if msg.cause_by == "browser"] - if browser_actions: - browser_prompt = BROWSER_INFO.format(browser_actions=browser_actions) - message = [Message(content=browser_prompt, role="user")] + message - working_memory = [msg for msg in working_memory if msg.cause_by != "browser"] if use_reflection else [] - context = self.llm.format_msg(message + working_memory) + working_memory = working_memory or [] + context = self.llm.format_msg([Message(content=structual_prompt, role="user")] + working_memory) # LLM call if use_reflection: diff --git a/metagpt/prompts/di/data_analyst.py b/metagpt/prompts/di/data_analyst.py index 7abe0ac93..56ae0b68b 100644 --- a/metagpt/prompts/di/data_analyst.py +++ b/metagpt/prompts/di/data_analyst.py @@ -16,4 +16,11 @@ CODE_STATUS = """ **Execution status**: {status} **Execution result**: {result} -""" \ No newline at end of file +""" + + +BROWSER_INFO = """ +Here are ordered web actions in the browser environment, note that you can not use the browser tool in the current environment. +{browser_actions} +The latest url is the one you should use to view the page. If view page has been done, directly use the variable and html content in executing result. +""" diff --git a/metagpt/prompts/di/write_analysis_code.py b/metagpt/prompts/di/write_analysis_code.py index 6105c4182..1d743a719 100644 --- a/metagpt/prompts/di/write_analysis_code.py +++ b/metagpt/prompts/di/write_analysis_code.py @@ -119,9 +119,3 @@ DATA_INFO = """ Latest data info after previous tasks: {info} """ - -BROWSER_INFO = """ -Here are ordered web actions in the browser environment, note that you can not use the browser tool in the current environment. -{browser_actions} -The latest url is the one you should use to view the page. If view page has been done, directly use the variable and html content in executing result. -""" diff --git a/metagpt/roles/di/data_analyst.py b/metagpt/roles/di/data_analyst.py index 066b82874..2e5315f33 100644 --- a/metagpt/roles/di/data_analyst.py +++ b/metagpt/roles/di/data_analyst.py @@ -1,14 +1,14 @@ from __future__ import annotations -import json import re +from typing import List from pydantic import Field, model_validator from metagpt.actions.di.execute_nb_code import ExecuteNbCode from metagpt.actions.di.write_analysis_code import WriteAnalysisCode from metagpt.logs import logger -from metagpt.prompts.di.data_analyst import BROWSER_INSTRUCTION, TASK_TYPE_DESC, CODE_STATUS +from metagpt.prompts.di.data_analyst import BROWSER_INSTRUCTION, TASK_TYPE_DESC, CODE_STATUS, BROWSER_INFO from metagpt.prompts.di.role_zero import ROLE_INSTRUCTION from metagpt.roles.di.role_zero import RoleZero from metagpt.schema import TaskResult, Message @@ -44,19 +44,20 @@ class DataAnalyst(RoleZero): "DataAnalyst.write_and_exec_code": self.write_and_exec_code, }) - async def parse_browser_actions(self): - memory = await super().parse_browser_actions() + async def parse_browser_actions(self, memory: List[Message]) -> List[Message]: + memory = await super().parse_browser_actions(memory) + browser_actions = [] for index, msg in enumerate(memory): if msg.cause_by == "browser": browser_url = re.search('URL: (.*?)\\n', msg.content).group(1) pattern = re.compile(r"Command Browser\.(\w+) executed") - browser_action = { + browser_actions.append({ 'command': pattern.match(memory[index - 1].content).group(1), 'current url': browser_url - } - self.rc.working_memory.add( - Message(content=json.dumps(browser_action), role="user", cause_by="browser") - ) + }) + if browser_actions: + browser_actions = BROWSER_INFO.format(browser_actions=browser_actions) + self.rc.working_memory.add(Message(content=browser_actions, role="user", cause_by="browser")) return memory async def write_and_exec_code(self): diff --git a/metagpt/roles/di/role_zero.py b/metagpt/roles/di/role_zero.py index ed617eb81..671cddc79 100644 --- a/metagpt/roles/di/role_zero.py +++ b/metagpt/roles/di/role_zero.py @@ -150,7 +150,8 @@ class RoleZero(Role): instruction=self.instruction.strip(), task_type_desc=self.task_type_desc, ) - memory = await self.parse_browser_actions() + memory = self.rc.memory.get(self.memory_k) + memory = await self.parse_browser_actions(memory) context = self.llm.format_msg(memory + [UserMessage(content=prompt)]) # print(*context, sep="\n" + "*" * 5 + "\n") async with ThoughtReporter(enable_llm_stream=True): @@ -159,8 +160,7 @@ class RoleZero(Role): return True - async def parse_browser_actions(self): - memory = self.rc.memory.get(self.memory_k) + async def parse_browser_actions(self, memory: List[Message]) -> List[Message]: if not self.browser.is_empty_page: pattern = re.compile(r"Command Browser\.(\w+) executed") for index, msg in zip(range(len(memory), 0, -1), memory[::-1]):