From 0231cfdcc750f3366c3eee16fc776581f67cbaf6 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Tue, 12 Dec 2023 16:23:56 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=BE=93=E5=87=BA=E4=BF=9D=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=A1=B9=E7=9B=AE=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=E9=A1=B9=E7=9B=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E9=9A=94=E7=A6=BB=20=E5=AE=8C=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BF=9D=E5=AD=98=E5=89=8D=EF=BC=8C=E5=8F=AF=E8=80=83?= =?UTF-8?q?=E8=99=91=E6=8B=BC=E6=8E=A5=E5=85=A8=E9=87=8F=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=8D=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metagpt/utils/save_code.py | 40 +++++++++++++++++++++++++++ tests/metagpt/utils/test_save_code.py | 30 ++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 metagpt/utils/save_code.py create mode 100644 tests/metagpt/utils/test_save_code.py diff --git a/metagpt/utils/save_code.py b/metagpt/utils/save_code.py new file mode 100644 index 000000000..b0720a5cf --- /dev/null +++ b/metagpt/utils/save_code.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# @Date : 12/12/2023 4:14 PM +# @Author : stellahong (stellahong@fuzhi.ai) +# @Desc : +import os +import json + +from metagpt.const import DATA_PATH + +def save_code_file(name: str, code_context: str, file_format: str = "py") -> None: + """ + Save code files to a specified path. + + Args: + - name (str): The name of the folder to save the files. + - code_context (str): The code content. + - file_format (str, optional): The file format, supports 'py' (Python file) and 'json' (JSON file). Default is 'py'. + + Returns: + - None + """ + # Create the folder path if it doesn't exist + os.makedirs(name=DATA_PATH / "output" / f"{name}", exist_ok=True) + + # Choose to save as a Python file or a JSON file based on the file format + file_path = DATA_PATH / "output" / f"{name}/code.{file_format}" + if file_format == "py": + with open(file_path, "w", encoding="utf-8") as fp: + fp.write(code_context + "\n\n") + elif file_format == "json": + # Parse the code content as JSON and save + data = {"code": code_context} + with open(file_path, "w", encoding="utf-8") as fp: + json.dump(data, fp, indent=2) + else: + raise ValueError("Unsupported file format. Please choose 'py' or 'json'.") + + + + diff --git a/tests/metagpt/utils/test_save_code.py b/tests/metagpt/utils/test_save_code.py new file mode 100644 index 000000000..33addb2bf --- /dev/null +++ b/tests/metagpt/utils/test_save_code.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# @Date : 12/12/2023 4:17 PM +# @Author : stellahong (stellahong@fuzhi.ai) +# @Desc : +import os +import json + +from metagpt.utils.save_code import save_code_file, DATA_PATH + + +def test_save_code_file_python(): + save_code_file("example", "print('Hello, World!')") + file_path = DATA_PATH / "output" / "example" / "code.py" + assert os.path.exists(file_path), f"File does not exist: {file_path}" + + +def test_save_code_file_python(): + save_code_file("example", "print('Hello, World!')") + file_path = DATA_PATH / "output" / "example" / "code.py" + with open(file_path, "r", encoding="utf-8") as fp: + content = fp.read() + assert "print('Hello, World!')" in content, "File content does not match" + +def test_save_code_file_json(): + save_code_file("example_json", "print('Hello, JSON!')", file_format="json") + file_path = DATA_PATH / "output" / "example_json" / "code.json" + with open(file_path, "r", encoding="utf-8") as fp: + data = json.load(fp) + assert "code" in data, "JSON key 'code' is missing" + assert data["code"] == "print('Hello, JSON!')", "JSON content does not match" From 35c9d744a46b8f0ad75512ebf6bf51537de089a9 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Tue, 12 Dec 2023 16:29:35 +0800 Subject: [PATCH 2/8] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e03eab3d3..d36fbb856 100644 --- a/.gitignore +++ b/.gitignore @@ -164,3 +164,4 @@ tmp output.wav metagpt/roles/idea_agent.py .aider* +/config/config.yaml From a4cef261e07b380bd55856bef752e380c82f238b Mon Sep 17 00:00:00 2001 From: stellahsr Date: Tue, 12 Dec 2023 17:17:40 +0800 Subject: [PATCH 3/8] =?UTF-8?q?update:=20=E6=B7=BB=E5=8A=A0nb=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + metagpt/roles/ml_engineer.py | 2 +- metagpt/utils/save_code.py | 4 ++++ tests/metagpt/utils/test_save_code.py | 26 ++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d36fbb856..5f8e400e3 100644 --- a/.gitignore +++ b/.gitignore @@ -165,3 +165,4 @@ output.wav metagpt/roles/idea_agent.py .aider* /config/config.yaml +/tests/metagpt/actions/check_data.py diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index fe6f81841..08451ec89 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -93,7 +93,7 @@ class MLEngineer(Role): summary = await SummarizeAnalysis().run(self.plan) rsp = Message(content=summary, cause_by=SummarizeAnalysis) self._rc.memory.add(rsp) - + return rsp async def _write_and_exec_code(self, max_retry: int = 3): diff --git a/metagpt/utils/save_code.py b/metagpt/utils/save_code.py index b0720a5cf..f1fdf0403 100644 --- a/metagpt/utils/save_code.py +++ b/metagpt/utils/save_code.py @@ -5,6 +5,8 @@ import os import json +import nbformat + from metagpt.const import DATA_PATH def save_code_file(name: str, code_context: str, file_format: str = "py") -> None: @@ -32,6 +34,8 @@ def save_code_file(name: str, code_context: str, file_format: str = "py") -> Non data = {"code": code_context} with open(file_path, "w", encoding="utf-8") as fp: json.dump(data, fp, indent=2) + elif file_format == "ipynb": + nbformat.write(code_context, file_path) else: raise ValueError("Unsupported file format. Please choose 'py' or 'json'.") diff --git a/tests/metagpt/utils/test_save_code.py b/tests/metagpt/utils/test_save_code.py index 33addb2bf..60a9e1ff4 100644 --- a/tests/metagpt/utils/test_save_code.py +++ b/tests/metagpt/utils/test_save_code.py @@ -2,8 +2,13 @@ # @Date : 12/12/2023 4:17 PM # @Author : stellahong (stellahong@fuzhi.ai) # @Desc : +import pytest import os import json +import nbformat + +from metagpt.actions.write_analysis_code import WriteCodeByGenerate +from metagpt.actions.execute_code import ExecutePyCode from metagpt.utils.save_code import save_code_file, DATA_PATH @@ -21,6 +26,7 @@ def test_save_code_file_python(): content = fp.read() assert "print('Hello, World!')" in content, "File content does not match" + def test_save_code_file_json(): save_code_file("example_json", "print('Hello, JSON!')", file_format="json") file_path = DATA_PATH / "output" / "example_json" / "code.json" @@ -28,3 +34,23 @@ def test_save_code_file_json(): data = json.load(fp) assert "code" in data, "JSON key 'code' is missing" assert data["code"] == "print('Hello, JSON!')", "JSON content does not match" + + + +@pytest.mark.asyncio +async def test_save_code_file_notebook(): + code = await WriteCodeByGenerate().run( + context="basic python, hello world", plan="", code_steps="", temperature=0.0 + ) + executor = ExecutePyCode() + await executor.run(code) + # Save as a Notebook file + save_code_file("example_nb", executor.nb, file_format="ipynb") + file_path = DATA_PATH / "output" / "example_nb" / "code.ipynb" + assert os.path.exists(file_path), f"Notebook file does not exist: {file_path}" + + # Additional checks specific to notebook format + notebook = nbformat.read(file_path, as_version=4) + assert len(notebook.cells) > 0, "Notebook should have at least one cell" + first_cell_source = notebook.cells[0].source + assert "print('Hello, World!')" in first_cell_source, "Notebook cell content does not match" From 8db5f22105b344eeebbe7df2281f9f062fd8fa0a Mon Sep 17 00:00:00 2001 From: stellahsr Date: Tue, 12 Dec 2023 17:26:15 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E5=92=8C=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metagpt/utils/save_code.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/metagpt/utils/save_code.py b/metagpt/utils/save_code.py index f1fdf0403..96c310336 100644 --- a/metagpt/utils/save_code.py +++ b/metagpt/utils/save_code.py @@ -16,7 +16,8 @@ def save_code_file(name: str, code_context: str, file_format: str = "py") -> Non Args: - name (str): The name of the folder to save the files. - code_context (str): The code content. - - file_format (str, optional): The file format, supports 'py' (Python file) and 'json' (JSON file). Default is 'py'. + - file_format (str, optional): The file format. Supports 'py' (Python file), 'json' (JSON file), and 'ipynb' (Jupyter Notebook file). Default is 'py'. + Returns: - None @@ -37,7 +38,7 @@ def save_code_file(name: str, code_context: str, file_format: str = "py") -> Non elif file_format == "ipynb": nbformat.write(code_context, file_path) else: - raise ValueError("Unsupported file format. Please choose 'py' or 'json'.") + raise ValueError("Unsupported file format. Please choose 'py', 'json', or 'ipynb'.") From 0147e0bb534ab487dcbdbc52cce938c62893f4be Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 13 Dec 2023 10:29:50 +0800 Subject: [PATCH 5/8] add ignore --- .gitignore | 1 + config/config.yaml | 100 --------------------------------------------- 2 files changed, 1 insertion(+), 100 deletions(-) delete mode 100644 config/config.yaml diff --git a/.gitignore b/.gitignore index 5f8e400e3..f79581de4 100644 --- a/.gitignore +++ b/.gitignore @@ -166,3 +166,4 @@ metagpt/roles/idea_agent.py .aider* /config/config.yaml /tests/metagpt/actions/check_data.py +/config/config.yaml diff --git a/config/config.yaml b/config/config.yaml deleted file mode 100644 index bf998def7..000000000 --- a/config/config.yaml +++ /dev/null @@ -1,100 +0,0 @@ -# DO NOT MODIFY THIS FILE, create a new key.yaml, define OPENAI_API_KEY. -# The configuration of key.yaml has a higher priority and will not enter git - -#### if OpenAI -## The official OPENAI_API_BASE is https://api.openai.com/v1 -## If the official OPENAI_API_BASE is not available, we recommend using the [openai-forward](https://github.com/beidongjiedeguang/openai-forward). -## Or, you can configure OPENAI_PROXY to access official OPENAI_API_BASE. -OPENAI_API_BASE: "https://api.openai.com/v1" -#OPENAI_PROXY: "http://127.0.0.1:8118" -#OPENAI_API_KEY: "YOUR_API_KEY" # set the value to sk-xxx if you host the openai interface for open llm model -OPENAI_API_MODEL: "gpt-4" -MAX_TOKENS: 1500 -RPM: 10 - -#### if Spark -#SPARK_APPID : "YOUR_APPID" -#SPARK_API_SECRET : "YOUR_APISecret" -#SPARK_API_KEY : "YOUR_APIKey" -#DOMAIN : "generalv2" -#SPARK_URL : "ws://spark-api.xf-yun.com/v2.1/chat" - -#### if Anthropic -#Anthropic_API_KEY: "YOUR_API_KEY" - -#### if AZURE, check https://github.com/openai/openai-cookbook/blob/main/examples/azure/chat.ipynb -#### You can use ENGINE or DEPLOYMENT mode -#OPENAI_API_TYPE: "azure" -#OPENAI_API_BASE: "YOUR_AZURE_ENDPOINT" -#OPENAI_API_KEY: "YOUR_AZURE_API_KEY" -#OPENAI_API_VERSION: "YOUR_AZURE_API_VERSION" -#DEPLOYMENT_NAME: "YOUR_DEPLOYMENT_NAME" -#DEPLOYMENT_ID: "YOUR_DEPLOYMENT_ID" - -#### if zhipuai from `https://open.bigmodel.cn`. You can set here or export API_KEY="YOUR_API_KEY" -# ZHIPUAI_API_KEY: "YOUR_API_KEY" - -#### for Search - -## Supported values: serpapi/google/serper/ddg -#SEARCH_ENGINE: serpapi - -## Visit https://serpapi.com/ to get key. -#SERPAPI_API_KEY: "YOUR_API_KEY" - -## Visit https://console.cloud.google.com/apis/credentials to get key. -#GOOGLE_API_KEY: "YOUR_API_KEY" -## Visit https://programmablesearchengine.google.com/controlpanel/create to get id. -#GOOGLE_CSE_ID: "YOUR_CSE_ID" - -## Visit https://serper.dev/ to get key. -#SERPER_API_KEY: "YOUR_API_KEY" - -#### for web access - -## Supported values: playwright/selenium -#WEB_BROWSER_ENGINE: playwright - -## Supported values: chromium/firefox/webkit, visit https://playwright.dev/python/docs/api/class-browsertype -##PLAYWRIGHT_BROWSER_TYPE: chromium - -## Supported values: chrome/firefox/edge/ie, visit https://www.selenium.dev/documentation/webdriver/browsers/ -# SELENIUM_BROWSER_TYPE: chrome - -#### for TTS - -#AZURE_TTS_SUBSCRIPTION_KEY: "YOUR_API_KEY" -#AZURE_TTS_REGION: "eastus" - -#### for Stable Diffusion -## Use SD service, based on https://github.com/AUTOMATIC1111/stable-diffusion-webui -SD_URL: "YOUR_SD_URL" -SD_T2I_API: "/sdapi/v1/txt2img" - -#### for Execution -#LONG_TERM_MEMORY: false - -#### for Mermaid CLI -## If you installed mmdc (Mermaid CLI) only for metagpt then enable the following configuration. -#PUPPETEER_CONFIG: "./config/puppeteer-config.json" -#MMDC: "./node_modules/.bin/mmdc" - - -### for calc_usage -# CALC_USAGE: false - -### for Research -MODEL_FOR_RESEARCHER_SUMMARY: gpt-3.5-turbo -MODEL_FOR_RESEARCHER_REPORT: gpt-3.5-turbo-16k - -### choose the engine for mermaid conversion, -# default is nodejs, you can change it to playwright,pyppeteer or ink -# MERMAID_ENGINE: nodejs - -### browser path for pyppeteer engine, support Chrome, Chromium,MS Edge -#PYPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable" - -PROMPT_FORMAT: json #json or markdown - -# KAGGLE_USERNAME: "" -# KAGGLE_KEY: "" \ No newline at end of file From 32c4a557556a6e23afa18ea1a316169cd858e7dd Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 13 Dec 2023 12:54:50 +0800 Subject: [PATCH 6/8] add save code --- metagpt/roles/ml_engineer.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index 08451ec89..d679b2e01 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -1,13 +1,11 @@ -from typing import Dict, List, Union +from typing import List import json -import subprocess +from datetime import datetime import fire -import re from metagpt.roles import Role -from metagpt.actions import Action -from metagpt.schema import Message, Task, Plan +from metagpt.schema import Message, Plan from metagpt.memory import Memory from metagpt.logs import logger from metagpt.actions.write_plan import WritePlan, update_plan_from_rsp, precheck_update_plan_from_rsp @@ -17,6 +15,7 @@ from metagpt.actions.execute_code import ExecutePyCode from metagpt.roles.kaggle_manager import DownloadData, SubmitResult from metagpt.prompts.ml_engineer import STRUCTURAL_CONTEXT from metagpt.actions.write_code_steps import WriteCodeSteps +from metagpt.utils.save_code import save_code_file class MLEngineer(Role): def __init__( @@ -93,7 +92,10 @@ class MLEngineer(Role): summary = await SummarizeAnalysis().run(self.plan) rsp = Message(content=summary, cause_by=SummarizeAnalysis) self._rc.memory.add(rsp) - + + # save code using datetime.now or keywords related to the goal of your project (plan.goal). + project_record = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + save_code_file(name=project_record, code_context=self.execute_code.nb, file_format="ipynb") return rsp async def _write_and_exec_code(self, max_retry: int = 3): From 2e4094c7a798f15f42ec3d85fc87395e4260d352 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 13 Dec 2023 12:56:54 +0800 Subject: [PATCH 7/8] test auto mode --- .gitignore | 1 - metagpt/roles/ml_engineer.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f79581de4..5f8e400e3 100644 --- a/.gitignore +++ b/.gitignore @@ -166,4 +166,3 @@ metagpt/roles/idea_agent.py .aider* /config/config.yaml /tests/metagpt/actions/check_data.py -/config/config.yaml diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index d679b2e01..8b7b72517 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -223,7 +223,7 @@ if __name__ == "__main__": # requirement = "Run data analysis on sklearn Wisconsin Breast Cancer dataset, include a plot, train a model to predict targets (20% as validation), and show validation accuracy" requirement = "Run EDA and visualization on this dataset, train a model to predict survival, report metrics on validation set (20%), dataset: workspace/titanic/train.csv" - async def main(requirement: str = requirement, auto_run: bool = False): + async def main(requirement: str = requirement, auto_run: bool = True): role = MLEngineer(goal=requirement, auto_run=auto_run) await role.run(requirement) From f81f355ff24378701c17de6d0c7260ad649fbf54 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 13 Dec 2023 13:01:32 +0800 Subject: [PATCH 8/8] add default config.yaml --- .gitignore | 1 - config/config.yaml | 97 ++++++++++++++++++++++++++++++++++++ metagpt/roles/ml_engineer.py | 4 +- 3 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 config/config.yaml diff --git a/.gitignore b/.gitignore index 5f8e400e3..9b679d48a 100644 --- a/.gitignore +++ b/.gitignore @@ -164,5 +164,4 @@ tmp output.wav metagpt/roles/idea_agent.py .aider* -/config/config.yaml /tests/metagpt/actions/check_data.py diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 000000000..bed67083c --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,97 @@ +# DO NOT MODIFY THIS FILE, create a new key.yaml, define OPENAI_API_KEY. +# The configuration of key.yaml has a higher priority and will not enter git + +#### if OpenAI +## The official OPENAI_API_BASE is https://api.openai.com/v1 +## If the official OPENAI_API_BASE is not available, we recommend using the [openai-forward](https://github.com/beidongjiedeguang/openai-forward). +## Or, you can configure OPENAI_PROXY to access official OPENAI_API_BASE. +OPENAI_API_BASE: "https://api.openai.com/v1" +#OPENAI_PROXY: "http://127.0.0.1:8118" +#OPENAI_API_KEY: "YOUR_API_KEY" # set the value to sk-xxx if you host the openai interface for open llm model +OPENAI_API_MODEL: "gpt-4" +MAX_TOKENS: 1500 +RPM: 10 + +#### if Spark +#SPARK_APPID : "YOUR_APPID" +#SPARK_API_SECRET : "YOUR_APISecret" +#SPARK_API_KEY : "YOUR_APIKey" +#DOMAIN : "generalv2" +#SPARK_URL : "ws://spark-api.xf-yun.com/v2.1/chat" + +#### if Anthropic +#Anthropic_API_KEY: "YOUR_API_KEY" + +#### if AZURE, check https://github.com/openai/openai-cookbook/blob/main/examples/azure/chat.ipynb +#### You can use ENGINE or DEPLOYMENT mode +#OPENAI_API_TYPE: "azure" +#OPENAI_API_BASE: "YOUR_AZURE_ENDPOINT" +#OPENAI_API_KEY: "YOUR_AZURE_API_KEY" +#OPENAI_API_VERSION: "YOUR_AZURE_API_VERSION" +#DEPLOYMENT_NAME: "YOUR_DEPLOYMENT_NAME" +#DEPLOYMENT_ID: "YOUR_DEPLOYMENT_ID" + +#### if zhipuai from `https://open.bigmodel.cn`. You can set here or export API_KEY="YOUR_API_KEY" +# ZHIPUAI_API_KEY: "YOUR_API_KEY" + +#### for Search + +## Supported values: serpapi/google/serper/ddg +#SEARCH_ENGINE: serpapi + +## Visit https://serpapi.com/ to get key. +#SERPAPI_API_KEY: "YOUR_API_KEY" + +## Visit https://console.cloud.google.com/apis/credentials to get key. +#GOOGLE_API_KEY: "YOUR_API_KEY" +## Visit https://programmablesearchengine.google.com/controlpanel/create to get id. +#GOOGLE_CSE_ID: "YOUR_CSE_ID" + +## Visit https://serper.dev/ to get key. +#SERPER_API_KEY: "YOUR_API_KEY" + +#### for web access + +## Supported values: playwright/selenium +#WEB_BROWSER_ENGINE: playwright + +## Supported values: chromium/firefox/webkit, visit https://playwright.dev/python/docs/api/class-browsertype +##PLAYWRIGHT_BROWSER_TYPE: chromium + +## Supported values: chrome/firefox/edge/ie, visit https://www.selenium.dev/documentation/webdriver/browsers/ +# SELENIUM_BROWSER_TYPE: chrome + +#### for TTS + +#AZURE_TTS_SUBSCRIPTION_KEY: "YOUR_API_KEY" +#AZURE_TTS_REGION: "eastus" + +#### for Stable Diffusion +## Use SD service, based on https://github.com/AUTOMATIC1111/stable-diffusion-webui +SD_URL: "YOUR_SD_URL" +SD_T2I_API: "/sdapi/v1/txt2img" + +#### for Execution +#LONG_TERM_MEMORY: false + +#### for Mermaid CLI +## If you installed mmdc (Mermaid CLI) only for metagpt then enable the following configuration. +#PUPPETEER_CONFIG: "./config/puppeteer-config.json" +#MMDC: "./node_modules/.bin/mmdc" + + +### for calc_usage +# CALC_USAGE: false + +### for Research +MODEL_FOR_RESEARCHER_SUMMARY: gpt-3.5-turbo +MODEL_FOR_RESEARCHER_REPORT: gpt-3.5-turbo-16k + +### choose the engine for mermaid conversion, +# default is nodejs, you can change it to playwright,pyppeteer or ink +# MERMAID_ENGINE: nodejs + +### browser path for pyppeteer engine, support Chrome, Chromium,MS Edge +#PYPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable" + +PROMPT_FORMAT: json #json or markdown \ No newline at end of file diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index 8b7b72517..c3f1bd669 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -217,11 +217,11 @@ class MLEngineer(Role): if __name__ == "__main__": - # requirement = "Run data analysis on sklearn Iris dataset, include a plot" + requirement = "Run data analysis on sklearn Iris dataset, include a plot" # requirement = "Run data analysis on sklearn Diabetes dataset, include a plot" # requirement = "Run data analysis on sklearn Wine recognition dataset, include a plot, and train a model to predict wine class (20% as validation), and show validation accuracy" # requirement = "Run data analysis on sklearn Wisconsin Breast Cancer dataset, include a plot, train a model to predict targets (20% as validation), and show validation accuracy" - requirement = "Run EDA and visualization on this dataset, train a model to predict survival, report metrics on validation set (20%), dataset: workspace/titanic/train.csv" + # requirement = "Run EDA and visualization on this dataset, train a model to predict survival, report metrics on validation set (20%), dataset: workspace/titanic/train.csv" async def main(requirement: str = requirement, auto_run: bool = True): role = MLEngineer(goal=requirement, auto_run=auto_run)