diff --git a/src/backend/langflow/interface/custom/code_parser.py b/src/backend/langflow/interface/custom/code_parser.py index 3f4bf35e4..696e5e50d 100644 --- a/src/backend/langflow/interface/custom/code_parser.py +++ b/src/backend/langflow/interface/custom/code_parser.py @@ -4,8 +4,9 @@ import operator import traceback from typing import Any, Dict, List, Type, Union -from cachetools import TTLCache, cachedmethod +from cachetools import TTLCache, cachedmethod, keys from fastapi import HTTPException + from langflow.interface.custom.schema import CallableCodeDetails, ClassCodeDetails @@ -19,6 +20,13 @@ def get_data_type(): return Data +def imports_key(*args, **kwargs): + imports = kwargs.pop("imports") + key = keys.methodkey(*args, **kwargs) + key += tuple(imports) + return key + + class CodeParser: """ A parser for Python source code, extracting code details. @@ -105,8 +113,7 @@ class CodeParser: return arg_dict @cachedmethod(operator.attrgetter("cache")) - @staticmethod - def construct_eval_env(return_type_str: str, imports) -> dict: + def construct_eval_env(self, return_type_str: str, imports) -> dict: """ Constructs an evaluation environment with the necessary imports for the return type, taking into account module aliases. @@ -127,7 +134,7 @@ class CodeParser: exec(f"import {module} as {alias if alias else module}", eval_env) return eval_env - @cachedmethod(operator.attrgetter("cache")) + @cachedmethod(cache=operator.attrgetter("cache")) def parse_callable_details(self, node: ast.FunctionDef) -> Dict[str, Any]: """ Extracts details from a single function or method node. @@ -135,7 +142,7 @@ class CodeParser: return_type = None if node.returns: return_type_str = ast.unparse(node.returns) - eval_env = self.construct_eval_env(return_type_str, self.data["imports"]) + eval_env = self.construct_eval_env(return_type_str, tuple(self.data["imports"])) try: return_type = eval(return_type_str, eval_env)