add future; rename writecodebygenerate tools

This commit is contained in:
yzlin 2024-02-05 12:00:18 +08:00
parent 20393e9d7a
commit 748aabce70
14 changed files with 51 additions and 29 deletions

View file

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

View file

@ -1,3 +1,5 @@
from __future__ import annotations
from typing import Tuple
from metagpt.actions import Action

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,3 +1,5 @@
from __future__ import annotations
import json
from pydantic import BaseModel, Field

View file

@ -1,3 +1,5 @@
from __future__ import annotations
import json
import numpy as np

View file

@ -4,6 +4,8 @@
# @Author : lidanyang
# @File : feature_engineering.py
# @Desc : Feature Engineering Tools
from __future__ import annotations
import itertools
# import lightgbm as lgb

View file

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

View file

@ -5,6 +5,8 @@
@Author : garylin2099
@File : tool_registry.py
"""
from __future__ import annotations
import inspect
import os
import re

View file

@ -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 = [