mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-06-08 15:05:17 +02:00
make tool ask review
This commit is contained in:
parent
4ecd427bea
commit
437bbca466
6 changed files with 25 additions and 14 deletions
|
|
@ -23,14 +23,15 @@ class ReviewConst:
|
|||
|
||||
|
||||
class AskReview(Action):
|
||||
async def run(self, context: List[Message], plan: Plan = None, trigger: str = "task"):
|
||||
logger.info("Current overall plan:")
|
||||
logger.info(
|
||||
"\n".join([f"{task.task_id}: {task.instruction}, is_finished: {task.is_finished}" for task in plan.tasks])
|
||||
)
|
||||
async def run(self, context: List[Message] = [], plan: Plan = None, trigger: str = "task"):
|
||||
if plan:
|
||||
logger.info("Current overall plan:")
|
||||
logger.info(
|
||||
"\n".join([f"{task.task_id}: {task.instruction}, is_finished: {task.is_finished}" for task in plan.tasks])
|
||||
)
|
||||
|
||||
logger.info("most recent context:")
|
||||
latest_action = context[-1].cause_by if context[-1].cause_by else ""
|
||||
latest_action = context[-1].cause_by if context and context[-1].cause_by else ""
|
||||
review_instruction = (
|
||||
ReviewConst.TASK_REVIEW_INSTRUCTION
|
||||
if trigger == ReviewConst.TASK_REVIEW_TRIGGER
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import yaml
|
|||
from tenacity import retry, stop_after_attempt, wait_fixed
|
||||
|
||||
from metagpt.actions import Action
|
||||
from metagpt.const import METAGPT_ROOT
|
||||
from metagpt.const import METAGPT_ROOT, TOOL_SCHEMA_PATH
|
||||
from metagpt.llm import LLM
|
||||
from metagpt.logs import logger
|
||||
from metagpt.prompts.ml_engineer import (
|
||||
|
|
@ -93,7 +93,7 @@ class WriteCodeByGenerate(BaseWriteAnalysisCode):
|
|||
class WriteCodeWithTools(BaseWriteAnalysisCode):
|
||||
"""Write code with help of local available tools. Choose tools first, then generate code to use the tools"""
|
||||
|
||||
schema_path: Union[Path, str] = METAGPT_ROOT / "metagpt/tools/functions/schemas"
|
||||
schema_path: Union[Path, str] = TOOL_SCHEMA_PATH
|
||||
available_tools: dict = {}
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ TMP = METAGPT_ROOT / "tmp"
|
|||
SOURCE_ROOT = METAGPT_ROOT / "metagpt"
|
||||
PROMPT_PATH = SOURCE_ROOT / "prompts"
|
||||
SKILL_DIRECTORY = SOURCE_ROOT / "skills"
|
||||
TOOL_SCHEMA_PATH = METAGPT_ROOT / "metagpt/tools/functions/schemas"
|
||||
|
||||
|
||||
# REAL CONSTS
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ from metagpt.utils.save_code import save_code_file
|
|||
|
||||
|
||||
class CodeInterpreter(Role):
|
||||
auto_run: bool = True
|
||||
use_tools: bool = False
|
||||
make_udfs: bool = False # whether to save user-defined functions
|
||||
execute_code: ExecutePyCode = Field(default_factory=ExecutePyCode, exclude=True)
|
||||
|
|
@ -22,12 +23,12 @@ class CodeInterpreter(Role):
|
|||
name="Charlie",
|
||||
profile="CodeInterpreter",
|
||||
goal="",
|
||||
auto_run=False,
|
||||
auto_run=True,
|
||||
use_tools=False,
|
||||
make_udfs=False,
|
||||
**kwargs,
|
||||
):
|
||||
super().__init__(name=name, profile=profile, goal=goal, use_tools=use_tools, make_udfs=make_udfs, **kwargs)
|
||||
super().__init__(name=name, profile=profile, goal=goal, auto_run=auto_run, use_tools=use_tools, make_udfs=make_udfs, **kwargs)
|
||||
self._set_react_mode(react_mode="plan_and_act", auto_run=auto_run, use_tools=use_tools)
|
||||
|
||||
@property
|
||||
|
|
@ -96,4 +97,4 @@ class CodeInterpreter(Role):
|
|||
logger.info("Plan completed. Now start to make tools ...")
|
||||
tool_maker = ToolMaker()
|
||||
for task in self.planner.plan.get_finished_tasks():
|
||||
await tool_maker.make_tool(task.code, task.instruction, task.task_id)
|
||||
await tool_maker.make_tool(code=task.code, instruction=task.instruction, task_id=task.task_id, auto_run=self.auto_run)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ from metagpt.utils.common import any_to_str
|
|||
|
||||
|
||||
class MLEngineer(CodeInterpreter):
|
||||
auto_run: bool = False
|
||||
use_code_steps: bool = False
|
||||
use_udfs: bool = False
|
||||
data_desc: dict = {}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from pydantic import Field
|
||||
|
||||
from metagpt.actions.ask_review import AskReview
|
||||
from metagpt.actions.execute_code import ExecutePyCode
|
||||
from metagpt.actions.write_analysis_code import MakeTools
|
||||
from metagpt.logs import logger
|
||||
|
|
@ -10,7 +11,7 @@ from metagpt.utils.common import remove_comments
|
|||
class ToolMaker(Role):
|
||||
execute_code: ExecutePyCode = Field(default_factory=ExecutePyCode, exclude=True)
|
||||
|
||||
async def make_tool(self, code: str, instruction: str, task_id: str = ""):
|
||||
async def make_tool(self, code: str, instruction: str, task_id: str = "", auto_run=True):
|
||||
if len(remove_comments(code).split("\n")) < 5: # no need to consider trivial codes with fewer than 5 lines
|
||||
return
|
||||
|
||||
|
|
@ -41,4 +42,12 @@ class ToolMaker(Role):
|
|||
break
|
||||
# save successful tool code in udf
|
||||
if execute_success:
|
||||
make_tools.save(tool_code)
|
||||
_, confirmed = await self.ask_review(auto_run=auto_run)
|
||||
if confirmed:
|
||||
make_tools.save(tool_code)
|
||||
|
||||
async def ask_review(self, auto_run: bool = True):
|
||||
if not auto_run:
|
||||
review, confirmed = await AskReview().run()
|
||||
return review, confirmed
|
||||
return "", True
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue