From 4a7ebb7184fa5dad4cdfef49d1eab2a3e9029a2b Mon Sep 17 00:00:00 2001 From: Pierre Alexandre SCHEMBRI Date: Mon, 7 Aug 2023 00:12:03 +0200 Subject: [PATCH] Fix issue #7616 (#7617) Fix Issue #7616 with a simpler approach to extract function names (use `__name__` attribute) @hwchase17 --------- Co-authored-by: Harrison Chase --- .../langchain/chains/openai_functions/base.py | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/libs/langchain/langchain/chains/openai_functions/base.py b/libs/langchain/langchain/chains/openai_functions/base.py index aa5598e3f0..ad457d537c 100644 --- a/libs/langchain/langchain/chains/openai_functions/base.py +++ b/libs/langchain/langchain/chains/openai_functions/base.py @@ -1,7 +1,16 @@ """Methods for creating chains that use OpenAI function-calling APIs.""" import inspect -import re -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Type, Union +from typing import ( + Any, + Callable, + Dict, + List, + Optional, + Sequence, + Tuple, + Type, + Union, +) from pydantic import BaseModel @@ -25,8 +34,7 @@ PYTHON_TO_JSON_TYPES = { def _get_python_function_name(function: Callable) -> str: """Get the name of a Python function.""" - source = inspect.getsource(function) - return re.search(r"^def (.*)\(", source).groups()[0] # type: ignore + return function.__name__ def _parse_python_function_docstring(function: Callable) -> Tuple[str, dict]: @@ -94,10 +102,16 @@ def _get_python_function_required_args(function: Callable) -> List[str]: spec = inspect.getfullargspec(function) required = spec.args[: -len(spec.defaults)] if spec.defaults else spec.args required += [k for k in spec.kwonlyargs if k not in (spec.kwonlydefaults or {})] + + is_class = type(function) is type + if is_class and required[0] == "self": + required = required[1:] return required -def convert_python_function_to_openai_function(function: Callable) -> Dict[str, Any]: +def convert_python_function_to_openai_function( + function: Callable, +) -> Dict[str, Any]: """Convert a Python function to an OpenAI function-calling API compatible dict. Assumes the Python function has type hints and a docstring with a description. If