diff --git a/metagpt/actions/__init__.py b/metagpt/actions/__init__.py index 6c0a2addc..363b4fd33 100644 --- a/metagpt/actions/__init__.py +++ b/metagpt/actions/__init__.py @@ -23,7 +23,7 @@ from metagpt.actions.write_prd import WritePRD from metagpt.actions.write_prd_review import WritePRDReview from metagpt.actions.write_test import WriteTest from metagpt.actions.ci.execute_nb_code import ExecuteNbCode -from metagpt.actions.ci.write_analysis_code import WriteCodeByGenerate +from metagpt.actions.ci.write_analysis_code import WriteCodeWithoutTools, WriteCodeWithTools from metagpt.actions.ci.write_plan import WritePlan @@ -46,7 +46,8 @@ class ActionType(Enum): WEB_BROWSE_AND_SUMMARIZE = WebBrowseAndSummarize CONDUCT_RESEARCH = ConductResearch EXECUTE_NB_CODE = ExecuteNbCode - WRITE_CODE_BY_GENERATE = WriteCodeByGenerate + WRITE_CODE_WITHOUT_TOOLS = WriteCodeWithoutTools + WRITE_CODE_WITH_TOOLS = WriteCodeWithTools WRITE_PLAN = WritePlan diff --git a/metagpt/actions/ci/ask_review.py b/metagpt/actions/ci/ask_review.py index 25b4314fe..041011e80 100644 --- a/metagpt/actions/ci/ask_review.py +++ b/metagpt/actions/ci/ask_review.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Tuple from metagpt.actions import Action diff --git a/metagpt/actions/ci/debug_code.py b/metagpt/actions/ci/debug_code.py index f6b86b8bf..4a6617dc6 100644 --- a/metagpt/actions/ci/debug_code.py +++ b/metagpt/actions/ci/debug_code.py @@ -1,4 +1,4 @@ -from typing import List +from __future__ import annotations from metagpt.actions.ci.write_analysis_code import BaseWriteAnalysisCode from metagpt.logs import logger @@ -75,7 +75,7 @@ CODE_REFLECTION = { class DebugCode(BaseWriteAnalysisCode): async def run( self, - context: List[Message] = None, + context: list[Message] = None, code: str = "", runtime_result: str = "", ) -> str: @@ -83,7 +83,7 @@ class DebugCode(BaseWriteAnalysisCode): Execute the debugging process based on the provided context, code, and runtime_result. Args: - context (List[Message]): A list of Message objects representing the context. + context (list[Message]): A list of Message objects representing the context. code (str): The code to be debugged. runtime_result (str): The result of the code execution. diff --git a/metagpt/actions/ci/execute_nb_code.py b/metagpt/actions/ci/execute_nb_code.py index ee2faa0cb..300ee3807 100644 --- a/metagpt/actions/ci/execute_nb_code.py +++ b/metagpt/actions/ci/execute_nb_code.py @@ -2,13 +2,15 @@ """ @Date : 2023/11/17 14:22:15 @Author : orange-crow -@File : code_executor.py +@File : execute_nb_code.py """ +from __future__ import annotations + import asyncio import base64 import re import traceback -from typing import List, Literal, Tuple +from typing import Literal, Tuple import nbformat from nbclient import NotebookClient @@ -90,7 +92,7 @@ class ExecuteNbCode(Action): else: cell["outputs"].append(new_output(output_type="stream", name="stdout", text=str(output))) - def parse_outputs(self, outputs: List[str]) -> str: + def parse_outputs(self, outputs: list[str]) -> str: """Parses the outputs received from notebook execution.""" assert isinstance(outputs, list) parsed_output = "" diff --git a/metagpt/actions/ci/ml_action.py b/metagpt/actions/ci/ml_action.py index 9640a7918..60fe18c1b 100644 --- a/metagpt/actions/ci/ml_action.py +++ b/metagpt/actions/ci/ml_action.py @@ -1,4 +1,6 @@ -from typing import List, Tuple +from __future__ import annotations + +from typing import Tuple from metagpt.actions import Action from metagpt.actions.ci.write_analysis_code import WriteCodeWithTools @@ -16,11 +18,11 @@ from metagpt.utils.common import create_func_call_config, remove_comments class WriteCodeWithToolsML(WriteCodeWithTools): async def run( self, - context: List[Message], + context: list[Message], plan: Plan = None, column_info: str = "", **kwargs, - ) -> Tuple[List[Message], str]: + ) -> Tuple[list[Message], str]: # prepare tool schemas and tool-type-specific instruction tool_schemas, tool_type_usage_prompt = await self._prepare_tools(plan=plan) diff --git a/metagpt/actions/ci/write_analysis_code.py b/metagpt/actions/ci/write_analysis_code.py index 38fe107fd..72fe4e7a6 100644 --- a/metagpt/actions/ci/write_analysis_code.py +++ b/metagpt/actions/ci/write_analysis_code.py @@ -4,6 +4,8 @@ @Author : orange-crow @File : write_analysis_code.py """ +from __future__ import annotations + from typing import Tuple from metagpt.actions import Action @@ -42,7 +44,7 @@ class BaseWriteAnalysisCode(Action): raise NotImplementedError -class WriteCodeByGenerate(BaseWriteAnalysisCode): +class WriteCodeWithoutTools(BaseWriteAnalysisCode): """Ask LLM to generate codes purely by itself without local user-defined tools""" async def run(self, context: list[Message], plan: Plan = None, system_msg: str = None, **kwargs) -> dict: diff --git a/metagpt/actions/ci/write_plan.py b/metagpt/actions/ci/write_plan.py index 885611c68..e88f64724 100644 --- a/metagpt/actions/ci/write_plan.py +++ b/metagpt/actions/ci/write_plan.py @@ -4,9 +4,11 @@ @Author : orange-crow @File : plan.py """ +from __future__ import annotations + import json from copy import deepcopy -from typing import Dict, List, Tuple +from typing import Tuple from metagpt.actions import Action from metagpt.logs import logger @@ -40,14 +42,14 @@ class WritePlan(Action): ``` """ - async def assign_task_type(self, tasks: List[Dict]) -> str: + async def assign_task_type(self, tasks: list[dict]) -> str: """Assign task type to each task in tasks Args: - tasks (List[Dict]): tasks to be assigned task type + tasks (list[dict]): tasks to be assigned task type Returns: - List[Dict]: tasks with task type assigned + list[dict]: tasks with task type assigned """ task_list = "\n".join([f"Task {task['task_id']}: {task['instruction']}" for task in tasks]) task_type_desc = "\n".join( @@ -64,7 +66,7 @@ class WritePlan(Action): task["task_type"] = task_type return json.dumps(tasks) - async def run(self, context: List[Message], max_tasks: int = 5, use_tools: bool = False) -> str: + async def run(self, context: list[Message], max_tasks: int = 5, use_tools: bool = False) -> str: prompt = ( self.PROMPT_TEMPLATE.replace("__context__", "\n".join([str(ct) for ct in context])) # .replace("__current_plan__", current_plan) @@ -77,7 +79,7 @@ class WritePlan(Action): return rsp -def rsp_to_tasks(rsp: str) -> List[Task]: +def rsp_to_tasks(rsp: str) -> list[Task]: rsp = json.loads(rsp) tasks = [Task(**task_config) for task_config in rsp] return tasks diff --git a/metagpt/roles/ci/code_interpreter.py b/metagpt/roles/ci/code_interpreter.py index f8d00bb91..2572d09c5 100644 --- a/metagpt/roles/ci/code_interpreter.py +++ b/metagpt/roles/ci/code_interpreter.py @@ -1,9 +1,11 @@ +from __future__ import annotations + from pydantic import Field from metagpt.actions.ci.ask_review import ReviewConst from metagpt.actions.ci.execute_nb_code import ExecuteNbCode from metagpt.actions.ci.write_analysis_code import ( - WriteCodeByGenerate, + WriteCodeWithoutTools, WriteCodeWithTools, ) from metagpt.logs import logger @@ -80,7 +82,7 @@ class CodeInterpreter(Role): return py_code, result, success async def _write_code(self): - todo = WriteCodeByGenerate() if not self.use_tools else WriteCodeWithTools(selected_tools=self.tools) + todo = WriteCodeWithoutTools() if not self.use_tools else WriteCodeWithTools(selected_tools=self.tools) logger.info(f"ready to {todo.name}") context = self.planner.get_useful_memories() diff --git a/metagpt/strategy/planner.py b/metagpt/strategy/planner.py index bcb0bda9b..fd635df39 100644 --- a/metagpt/strategy/planner.py +++ b/metagpt/strategy/planner.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json from pydantic import BaseModel, Field diff --git a/metagpt/tools/libs/data_preprocess.py b/metagpt/tools/libs/data_preprocess.py index c9ca657a5..7a3d019bf 100644 --- a/metagpt/tools/libs/data_preprocess.py +++ b/metagpt/tools/libs/data_preprocess.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import numpy as np diff --git a/metagpt/tools/libs/feature_engineering.py b/metagpt/tools/libs/feature_engineering.py index 325742105..40bfb2fc7 100644 --- a/metagpt/tools/libs/feature_engineering.py +++ b/metagpt/tools/libs/feature_engineering.py @@ -4,6 +4,8 @@ # @Author : lidanyang # @File : feature_engineering.py # @Desc : Feature Engineering Tools +from __future__ import annotations + import itertools # import lightgbm as lgb diff --git a/metagpt/tools/libs/sd_engine.py b/metagpt/tools/libs/sd_engine.py index 58f34a152..347f4a430 100644 --- a/metagpt/tools/libs/sd_engine.py +++ b/metagpt/tools/libs/sd_engine.py @@ -2,12 +2,13 @@ # @Date : 2023/7/19 16:28 # @Author : stellahong (stellahong@deepwisdom.ai) # @Desc : +from __future__ import annotations + import base64 import hashlib import io import json from os.path import join -from typing import List import requests from aiohttp import ClientSession @@ -135,11 +136,11 @@ class SDEngine: self.save(results, save_name=f"output_{save_name}") return results - async def run_t2i(self, payloads: List): + async def run_t2i(self, payloads: list): """Run the stable diffusion API for multiple prompts asynchronously. Args: - payloads (list): List of payload, each payload is a dictionary of input parameters for the stable diffusion API. + payloads (list): list of payload, each payload is a dictionary of input parameters for the stable diffusion API. """ session = ClientSession() for payload_idx, payload in enumerate(payloads): diff --git a/metagpt/tools/tool_registry.py b/metagpt/tools/tool_registry.py index 87645d35a..5fbd39421 100644 --- a/metagpt/tools/tool_registry.py +++ b/metagpt/tools/tool_registry.py @@ -5,6 +5,8 @@ @Author : garylin2099 @File : tool_registry.py """ +from __future__ import annotations + import inspect import os import re diff --git a/tests/metagpt/actions/ci/test_write_analysis_code.py b/tests/metagpt/actions/ci/test_write_analysis_code.py index dbd83fe40..95c7dfca8 100644 --- a/tests/metagpt/actions/ci/test_write_analysis_code.py +++ b/tests/metagpt/actions/ci/test_write_analysis_code.py @@ -4,7 +4,7 @@ import pytest from metagpt.actions.ci.execute_nb_code import ExecuteNbCode from metagpt.actions.ci.write_analysis_code import ( - WriteCodeByGenerate, + WriteCodeWithoutTools, WriteCodeWithTools, ) from metagpt.logs import logger @@ -15,7 +15,7 @@ from metagpt.strategy.planner import STRUCTURAL_CONTEXT @pytest.mark.skip @pytest.mark.asyncio async def test_write_code_by_list_plan(): - write_code = WriteCodeByGenerate() + write_code = WriteCodeWithoutTools() execute_code = ExecuteNbCode() messages = [] plan = ["随机生成一个pandas DataFrame时间序列", "绘制这个时间序列的直方图", "回顾已完成的任务", "求均值", "总结"] @@ -144,7 +144,7 @@ async def test_write_code_to_correct_error(): Message(content=wrong_code, role="assistant"), Message(content=error, role="user"), ] - new_code = await WriteCodeByGenerate().run(context=context) + new_code = await WriteCodeWithoutTools().run(context=context) new_code = new_code["code"] print(new_code) assert "read_csv" in new_code # should correct read_excel to read_csv @@ -184,7 +184,7 @@ async def test_write_code_reuse_code_simple(): context = [ Message(content=structural_context, role="user"), ] - code = await WriteCodeByGenerate().run(context=context) + code = await WriteCodeWithoutTools().run(context=context) code = code["code"] print(code) assert "pandas" not in code and "read_csv" not in code # should reuse import and read statement from previous one @@ -239,7 +239,7 @@ async def test_write_code_reuse_code_long(): Message(content=structural_context, role="user"), ] trials_num = 5 - trials = [WriteCodeByGenerate().run(context=context, temperature=0.0) for _ in range(trials_num)] + trials = [WriteCodeWithoutTools().run(context=context, temperature=0.0) for _ in range(trials_num)] trial_results = await asyncio.gather(*trials) print(*trial_results, sep="\n\n***\n\n") success = [ @@ -313,7 +313,7 @@ async def test_write_code_reuse_code_long_for_wine(): Message(content=structural_context, role="user"), ] trials_num = 5 - trials = [WriteCodeByGenerate().run(context=context, temperature=0.0) for _ in range(trials_num)] + trials = [WriteCodeWithoutTools().run(context=context, temperature=0.0) for _ in range(trials_num)] trial_results = await asyncio.gather(*trials) print(*trial_results, sep="\n\n***\n\n") success = [