🚀 feat(loading.py): add support for PythonFunction node type 🚀 feat(constants.py): add PythonFunction to CUSTOM_TOOLS 🚀 feat(custom.py): add PythonFunction class 🚀 feat(frontend_node/tools.py): add PythonFunctionNode class 🧪 test(test_custom_types.py): add test for PythonFunction class 🧪 test(test_llms_template.py): comment out tests for AzureOpenAI and AzureChatOpenAI The changes add support for a new node type, PythonFunction, which allows users to define a Python function to be executed. The node type is added to CUSTOM_NODES in customs.py, and support for the node type is added to loading.py. The node type is also added to CUSTOM_TOOLS in constants.py, and the PythonFunction class is added to custom.py. The PythonFunctionNode class is added to frontend_node/tools.py. Tests for the new PythonFunction class are added to test_custom_types.py. Tests for AzureOpenAI and AzureChatOpenAI are commented out in test_llms_template.py.
54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
from typing import Callable, Optional
|
|
from langflow.interface.importing.utils import get_function
|
|
|
|
from pydantic import BaseModel, validator
|
|
|
|
from langflow.utils import validate
|
|
from langchain.agents.tools import Tool
|
|
|
|
|
|
class Function(BaseModel):
|
|
code: str
|
|
function: Optional[Callable] = None
|
|
imports: Optional[str] = None
|
|
|
|
# Eval code and store the function
|
|
def __init__(self, **data):
|
|
super().__init__(**data)
|
|
|
|
# Validate the function
|
|
@validator("code")
|
|
def validate_func(cls, v):
|
|
try:
|
|
validate.eval_function(v)
|
|
except Exception as e:
|
|
raise e
|
|
|
|
return v
|
|
|
|
def get_function(self):
|
|
"""Get the function"""
|
|
function_name = validate.extract_function_name(self.code)
|
|
|
|
return validate.create_function(self.code, function_name)
|
|
|
|
|
|
class PythonFunctionTool(Function, Tool):
|
|
"""Python function"""
|
|
|
|
name: str = "Custom Tool"
|
|
description: str
|
|
code: str
|
|
|
|
def ___init__(self, name: str, description: str, code: str):
|
|
self.name = name
|
|
self.description = description
|
|
self.code = code
|
|
self.func = get_function(self.code)
|
|
super().__init__(name=name, description=description, func=self.func)
|
|
|
|
|
|
class PythonFunction(Function):
|
|
"""Python function"""
|
|
|
|
code: str
|