From 3bb445b925ba5901bd0e5d9e4e1339c3c60c13dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=A3=92=E6=A3=92?= Date: Tue, 19 Dec 2023 16:50:37 +0800 Subject: [PATCH] fix: no returns function tools. --- metagpt/tools/functions/libs/udf/__init__.py | 14 ++++++++++---- tests/metagpt/tools/functions/test_udf.py | 5 +++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/metagpt/tools/functions/libs/udf/__init__.py b/metagpt/tools/functions/libs/udf/__init__.py index ad36b2817..245288de2 100644 --- a/metagpt/tools/functions/libs/udf/__init__.py +++ b/metagpt/tools/functions/libs/udf/__init__.py @@ -43,11 +43,18 @@ def extract_function_signatures(file_path): 'udf_returns': [var.strip() for var in line.strip()[len("return "):].split(',')] }) break + + # 没有返回值的函数 + if not function_returns or function_returns[-1]['udf_name'] != function_name: + function_returns.append({ + 'udf_name': function_name, + 'udf_returns': [None] + }) return function_signatures, function_returns def get_function_signatures_in_folder(folder_path): - python_files = [f for f in os.listdir(folder_path) if f.endswith('.py')] + python_files = [f for f in os.listdir(folder_path) if f.endswith('.py') and f != '__init__.py'] all_function_signatures = [] all_function_returns = [] @@ -59,7 +66,7 @@ def get_function_signatures_in_folder(folder_path): return all_function_signatures, all_function_returns -# TODO: Create Tools Yaml Style Schema +# Create Tools Yaml Style Schema def docstring_to_yaml(docstring: str, return_vars: List[str] = None): logger.debug(f"\n\nFunction Docstring: \n{'-'*60}\n {docstring} \n\nFunction Returns: \n{'-'*60}\n{return_vars}\n") if docstring is None: @@ -111,8 +118,7 @@ def extract_function_schema_yaml_in_folder(folder_path: str): folder_path = str(Path(__file__).parent.absolute()) function_signatures, function_returns = get_function_signatures_in_folder(folder_path) -UDFS = [func for func in function_signatures - if not func['udf_name'].startswith(('extract_function_signatures', 'get_function_signatures_in_folder', 'docstring_to_yaml'))] +UDFS = [func for func in function_signatures] UDFS_YAML_STR: str = extract_function_schema_yaml_in_folder(folder_path) UDFS_YAML: dict = yaml.load(UDFS_YAML_STR, Loader=yaml.FullLoader) diff --git a/tests/metagpt/tools/functions/test_udf.py b/tests/metagpt/tools/functions/test_udf.py index 111ec532a..b4060ad13 100644 --- a/tests/metagpt/tools/functions/test_udf.py +++ b/tests/metagpt/tools/functions/test_udf.py @@ -1,5 +1,6 @@ import pytest import yaml +import json from metagpt.tools.functions.libs.udf import UDFS, docstring_to_yaml, UDFS_YAML from metagpt.logs import logger @@ -30,8 +31,8 @@ def test_docstring2yaml(): def test_UDFS_YAML(): assert len(UDFS_YAML) > 0 - logger.info(f"\n\n{UDFS_YAML}") - function_schema = yaml.load(UDFS_YAML, Loader=yaml.FullLoader) + logger.info(f"\n\n{json.dumps(UDFS_YAML, indent=2, ensure_ascii=False)}") + function_schema = UDFS_YAML assert 'description' in function_schema[list(function_schema.keys())[0]] assert 'type' in function_schema[list(function_schema.keys())[0]] assert 'parameters' in function_schema[list(function_schema.keys())[0]]