refine code

This commit is contained in:
lidanyang 2024-07-12 16:44:05 +08:00
parent df340cb330
commit df29e16e2b
5 changed files with 23 additions and 27 deletions

View file

@ -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:

View file

@ -16,4 +16,11 @@ CODE_STATUS = """
**Execution status**: {status}
**Execution result**: {result}
"""
"""
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.
"""

View file

@ -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.
"""

View file

@ -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):

View file

@ -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]):