From df66ae848e8a9c625090811f73d85d2e60b47e59 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 11 Oct 2023 18:31:05 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=80=20chore(field=5Ftyping):=20add=20s?= =?UTF-8?q?upport=20for=20additional=20types=20in=20field=5Ftyping/=5F=5Fi?= =?UTF-8?q?nit=5F=5F.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔀 chore(field_typing): add support for Data type in field_typing/base.py 🔀 chore(field_typing): add constants.py file to define supported types in field_typing 🔀 chore(interface/custom): remove duplicate imports and use field_typing types 🔀 chore(utils): fix syntax error in get_base_classes function --- src/backend/langflow/field_typing/__init__.py | 9 ++- src/backend/langflow/field_typing/base.py | 3 +- .../langflow/field_typing/constants.py | 43 +++++++++++++ .../langflow/interface/custom/constants.py | 62 ++----------------- src/backend/langflow/utils/util.py | 4 +- 5 files changed, 61 insertions(+), 60 deletions(-) create mode 100644 src/backend/langflow/field_typing/constants.py diff --git a/src/backend/langflow/field_typing/__init__.py b/src/backend/langflow/field_typing/__init__.py index 927716b11..14cbba2d0 100644 --- a/src/backend/langflow/field_typing/__init__.py +++ b/src/backend/langflow/field_typing/__init__.py @@ -1,3 +1,8 @@ -from .base import NestedDict +from .base import NestedDict, Data +from .constants import * -__all__ = ["NestedDict"] +__all__ = ( + ["NestedDict", "Data"] + + list(LANGCHAIN_BASE_TYPES.keys()) + + list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys()) +) diff --git a/src/backend/langflow/field_typing/base.py b/src/backend/langflow/field_typing/base.py index ed3219888..48b737a63 100644 --- a/src/backend/langflow/field_typing/base.py +++ b/src/backend/langflow/field_typing/base.py @@ -1,4 +1,5 @@ -from typing import Union, Dict +from typing import Union, Dict, Any # Type alias for more complex dicts NestedDict = Dict[str, Union[str, Dict]] +Data = Any diff --git a/src/backend/langflow/field_typing/constants.py b/src/backend/langflow/field_typing/constants.py new file mode 100644 index 000000000..4a8072b15 --- /dev/null +++ b/src/backend/langflow/field_typing/constants.py @@ -0,0 +1,43 @@ +from langchain.agents.agent import AgentExecutor +from langchain.chains.base import Chain +from langchain.document_loaders.base import BaseLoader +from langchain.llms.base import BaseLLM +from langchain.memory.chat_memory import BaseChatMemory +from langchain.prompts import PromptTemplate +from langchain.schema import BaseOutputParser, BaseRetriever, Document +from langchain.schema.embeddings import Embeddings +from langchain.schema.memory import BaseMemory +from langchain.text_splitter import TextSplitter +from langchain.tools import Tool +from langchain.vectorstores.base import VectorStore +from langflow.field_typing import Data, NestedDict + + +LANGCHAIN_BASE_TYPES = { + "Chain": Chain, + "AgentExecutor": AgentExecutor, + "Tool": Tool, + "BaseLLM": BaseLLM, + "PromptTemplate": PromptTemplate, + "BaseLoader": BaseLoader, + "Document": Document, + "TextSplitter": TextSplitter, + "VectorStore": VectorStore, + "Embeddings": Embeddings, + "BaseRetriever": BaseRetriever, + "BaseOutputParser": BaseOutputParser, + "BaseMemory": BaseMemory, + "BaseChatMemory": BaseChatMemory, +} +# Langchain base types plus Python base types +CUSTOM_COMPONENT_SUPPORTED_TYPES = { + **LANGCHAIN_BASE_TYPES, + "str": str, + "int": int, + "float": float, + "bool": bool, + "list": list, + "dict": dict, + "NestedDict": NestedDict, + "Data": Data, +} diff --git a/src/backend/langflow/interface/custom/constants.py b/src/backend/langflow/interface/custom/constants.py index 58ecef637..a3eb64336 100644 --- a/src/backend/langflow/interface/custom/constants.py +++ b/src/backend/langflow/interface/custom/constants.py @@ -1,65 +1,15 @@ -from langchain.prompts import PromptTemplate -from langchain.chains.base import Chain -from langchain.document_loaders.base import BaseLoader -from langchain.schema.embeddings import Embeddings -from langchain.llms.base import BaseLLM -from langchain.schema import BaseRetriever, Document -from langchain.text_splitter import TextSplitter -from langchain.tools import Tool -from langchain.vectorstores.base import VectorStore -from langchain.schema import BaseOutputParser -from langchain.schema.memory import BaseMemory -from langchain.memory.chat_memory import BaseChatMemory -from langchain.agents.agent import AgentExecutor - -LANGCHAIN_BASE_TYPES = { - "Chain": Chain, - "AgentExecutor": AgentExecutor, - "Tool": Tool, - "BaseLLM": BaseLLM, - "PromptTemplate": PromptTemplate, - "BaseLoader": BaseLoader, - "Document": Document, - "TextSplitter": TextSplitter, - "VectorStore": VectorStore, - "Embeddings": Embeddings, - "BaseRetriever": BaseRetriever, - "BaseOutputParser": BaseOutputParser, - "BaseMemory": BaseMemory, - "BaseChatMemory": BaseChatMemory, -} - -# Langchain base types plus Python base types -CUSTOM_COMPONENT_SUPPORTED_TYPES = { - **LANGCHAIN_BASE_TYPES, - "str": str, - "int": int, - "float": float, - "bool": bool, - "list": list, - "dict": dict, -} - - DEFAULT_CUSTOM_COMPONENT_CODE = """from langflow import CustomComponent -from langchain.llms.base import BaseLLM -from langchain.chains import LLMChain -from langchain.prompts import PromptTemplate -from langchain.schema import Document +from langflow.field_typing import * -import requests - -class YourComponent(CustomComponent): +class Component(CustomComponent): display_name: str = "Custom Component" description: str = "Create any custom component you want!" def build_config(self): - return { "url": { "multiline": True, "required": True } } + return { "param": { "display_name": "Parameter" } } + + def build(self, param: Data) -> Data: + return params - def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document: - response = requests.get(url) - chain = LLMChain(llm=llm, prompt=prompt) - result = chain.run(response.text[:300]) - return Document(page_content=str(result)) """ diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index b563c5973..c23c559e4 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -191,7 +191,9 @@ def get_base_classes(cls): """Get the base classes of a class. These are used to determine the output of the nodes. """ - if bases := cls.__bases__: + + if hasattr(cls, "__bases__") and cls.__bases__: + bases = cls.__bases__ result = [] for base in bases: if any(type in base.__module__ for type in ["pydantic", "abc"]):