From c28e6ad62da861e26b53c53ae0ebd5215d445797 Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Thu, 13 Apr 2023 11:57:10 -0300 Subject: [PATCH] fix: fix import paths for several modules feat: add logging for missing nodes in LangChainTypeCreator classes feat: add support for custom TextLoader document loader fix: fix typo in document loaders base module name fix: fix typo in text_splitters package name and add __init__.py file refactor(interface): rename textSplitters to text_splitters refactor(interface): rename documentLoaders to document_loaders refactor(interface): rename vectorStore to vectorstore refactor(interface): rename toolkits to toolkit refactor(interface): rename tools to tool refactor(interface): rename prompts to prompt refactor(interface): rename memories to memory refactor(interface): rename embeddings to embedding refactor(interface): rename wrappers to wrapper fix(interface): fix typo in text_splitters/base.py fix(interface): fix typo in toolkits/base.py fix(interface): fix typo in vectorstore/base.py fix(interface): fix typo in wrappers/base.py feat(interface): add logging for when a type is not loaded --- src/backend/langflow/graph/graph.py | 6 +++--- src/backend/langflow/interface/agents/base.py | 3 +++ src/backend/langflow/interface/base.py | 11 ++++++++--- src/backend/langflow/interface/chains/base.py | 3 +++ .../{documentLoaders => document_loaders}/__init__.py | 0 .../{documentLoaders => document_loaders}/base.py | 5 ++++- .../{documentLoaders => document_loaders}/custom.py | 0 src/backend/langflow/interface/embeddings/base.py | 4 ++++ src/backend/langflow/interface/importing/utils.py | 2 +- src/backend/langflow/interface/listing.py | 6 +++--- src/backend/langflow/interface/llms/base.py | 4 ++++ src/backend/langflow/interface/memories/base.py | 3 +++ src/backend/langflow/interface/prompts/base.py | 6 +++++- .../langflow/interface/textSplitters/__init__.py | 3 --- .../langflow/interface/text_splitters/__init__.py | 3 +++ .../{textSplitters => text_splitters}/base.py | 3 +++ src/backend/langflow/interface/toolkits/base.py | 3 +++ src/backend/langflow/interface/types.py | 6 +++--- src/backend/langflow/interface/vectorStore/base.py | 3 +++ src/backend/langflow/interface/wrappers/base.py | 3 +++ 20 files changed, 59 insertions(+), 18 deletions(-) rename src/backend/langflow/interface/{documentLoaders => document_loaders}/__init__.py (100%) rename src/backend/langflow/interface/{documentLoaders => document_loaders}/base.py (90%) rename src/backend/langflow/interface/{documentLoaders => document_loaders}/custom.py (100%) delete mode 100644 src/backend/langflow/interface/textSplitters/__init__.py create mode 100644 src/backend/langflow/interface/text_splitters/__init__.py rename src/backend/langflow/interface/{textSplitters => text_splitters}/base.py (89%) diff --git a/src/backend/langflow/graph/graph.py b/src/backend/langflow/graph/graph.py index 4045ee329..06e482032 100644 --- a/src/backend/langflow/graph/graph.py +++ b/src/backend/langflow/graph/graph.py @@ -18,16 +18,16 @@ from langflow.graph.nodes import ( ) from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator -from langflow.interface.documentLoaders.base import documentloader_creator +from langflow.interface.document_loaders.base import documentloader_creator from langflow.interface.embeddings.base import embedding_creator from langflow.interface.llms.base import llm_creator from langflow.interface.memories.base import memory_creator from langflow.interface.prompts.base import prompt_creator -from langflow.interface.textSplitters.base import textsplitter_creator +from langflow.interface.text_splitters.base import textsplitter_creator from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.tools.base import tool_creator from langflow.interface.tools.constants import FILE_TOOLS -from langflow.interface.vectorStore.base import vectorstore_creator +from langflow.interface.vectorstore.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator from langflow.utils import payload diff --git a/src/backend/langflow/interface/agents/base.py b/src/backend/langflow/interface/agents/base.py index 3774c3011..6c87c8fd7 100644 --- a/src/backend/langflow/interface/agents/base.py +++ b/src/backend/langflow/interface/agents/base.py @@ -6,6 +6,7 @@ from langflow.custom.customs import get_custom_nodes from langflow.interface.agents.custom import CUSTOM_AGENTS from langflow.interface.base import LangChainTypeCreator from langflow.settings import settings +from langflow.utils.logger import logger from langflow.utils.util import build_template_from_class @@ -31,6 +32,8 @@ class AgentCreator(LangChainTypeCreator): ) except ValueError as exc: raise ValueError("Agent not found") from exc + except AttributeError as exc: + logger.error(f"Agent {name} not loaded: {exc}") # Now this is a generator def to_list(self) -> List[str]: diff --git a/src/backend/langflow/interface/base.py b/src/backend/langflow/interface/base.py index 2694fd7a5..29baf3e97 100644 --- a/src/backend/langflow/interface/base.py +++ b/src/backend/langflow/interface/base.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod from typing import Any, Dict, List, Optional, Type, Union +from langflow.utils.logger import logger from pydantic import BaseModel @@ -39,14 +40,18 @@ class LangChainTypeCreator(BaseModel, ABC): # frontend_node.to_dict() returns a dict with the following structure: # {name: {template: {fields}, description: str}} # so we should update the result dict - result[self.type_name].update(self.frontend_node(name).to_dict()) + node = self.frontend_node(name) + if node is not None: + node = node.to_dict() + result[self.type_name].update(node) return result - def frontend_node(self, name) -> FrontendNode: + def frontend_node(self, name) -> Union[FrontendNode, None]: signature = self.get_signature(name) if signature is None: - raise ValueError(f"{name} not found") + logger.error(f"Node {name} not loaded") + return if isinstance(signature, FrontendNode): return signature fields = [ diff --git a/src/backend/langflow/interface/chains/base.py b/src/backend/langflow/interface/chains/base.py index 6f90b0e62..8425c3321 100644 --- a/src/backend/langflow/interface/chains/base.py +++ b/src/backend/langflow/interface/chains/base.py @@ -6,6 +6,7 @@ from langflow.interface.custom_lists import chain_type_to_cls_dict from langflow.settings import settings from langflow.template.nodes import ChainFrontendNode from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger # Assuming necessary imports for Field, Template, and FrontendNode classes @@ -39,6 +40,8 @@ class ChainCreator(LangChainTypeCreator): return build_template_from_class(name, self.type_to_loader_dict) except ValueError as exc: raise ValueError("Chain not found") from exc + except AttributeError as exc: + logger.error(f"Chain {name} not loaded: {exc}") def to_list(self) -> List[str]: custom_chains = list(get_custom_nodes("chains").keys()) diff --git a/src/backend/langflow/interface/documentLoaders/__init__.py b/src/backend/langflow/interface/document_loaders/__init__.py similarity index 100% rename from src/backend/langflow/interface/documentLoaders/__init__.py rename to src/backend/langflow/interface/document_loaders/__init__.py diff --git a/src/backend/langflow/interface/documentLoaders/base.py b/src/backend/langflow/interface/document_loaders/base.py similarity index 90% rename from src/backend/langflow/interface/documentLoaders/base.py rename to src/backend/langflow/interface/document_loaders/base.py index 9510a1d9e..826543757 100644 --- a/src/backend/langflow/interface/documentLoaders/base.py +++ b/src/backend/langflow/interface/document_loaders/base.py @@ -2,9 +2,10 @@ from typing import Dict, List, Optional from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import documentloaders_type_to_cls_dict -from langflow.interface.documentLoaders.custom import CUSTOM_DOCUMENTLOADERS +from langflow.interface.document_loaders.custom import CUSTOM_DOCUMENTLOADERS from langflow.settings import settings from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class DocumentLoaderCreator(LangChainTypeCreator): @@ -52,6 +53,8 @@ class DocumentLoaderCreator(LangChainTypeCreator): return signature except ValueError as exc: raise ValueError(f"Documment Loader {name} not found") from exc + except AttributeError as exc: + logger.error(f"Documment Loader {name} not loaded: {exc}") def to_list(self) -> List[str]: return [ diff --git a/src/backend/langflow/interface/documentLoaders/custom.py b/src/backend/langflow/interface/document_loaders/custom.py similarity index 100% rename from src/backend/langflow/interface/documentLoaders/custom.py rename to src/backend/langflow/interface/document_loaders/custom.py diff --git a/src/backend/langflow/interface/embeddings/base.py b/src/backend/langflow/interface/embeddings/base.py index 25038a8a5..0ee7ad3f5 100644 --- a/src/backend/langflow/interface/embeddings/base.py +++ b/src/backend/langflow/interface/embeddings/base.py @@ -4,6 +4,7 @@ from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import embedding_type_to_cls_dict from langflow.settings import settings from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class EmbeddingCreator(LangChainTypeCreator): @@ -20,6 +21,9 @@ class EmbeddingCreator(LangChainTypeCreator): except ValueError as exc: raise ValueError(f"Embedding {name} not found") from exc + except AttributeError as exc: + logger.error(f"Embedding {name} not loaded: {exc}") + def to_list(self) -> List[str]: return [ embedding.__name__ diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/langflow/interface/importing/utils.py index f72ded60b..33b53ce02 100644 --- a/src/backend/langflow/interface/importing/utils.py +++ b/src/backend/langflow/interface/importing/utils.py @@ -10,7 +10,7 @@ from langchain.chat_models.base import BaseChatModel from langchain.llms.base import BaseLLM from langchain.tools import BaseTool -from langflow.interface.documentLoaders.custom import CUSTOM_DOCUMENTLOADERS +from langflow.interface.document_loaders.custom import CUSTOM_DOCUMENTLOADERS from langflow.interface.tools.util import get_tool_by_name diff --git a/src/backend/langflow/interface/listing.py b/src/backend/langflow/interface/listing.py index bf9558e92..4f85cb572 100644 --- a/src/backend/langflow/interface/listing.py +++ b/src/backend/langflow/interface/listing.py @@ -1,14 +1,14 @@ from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator -from langflow.interface.documentLoaders.base import documentloader_creator +from langflow.interface.document_loaders.base import documentloader_creator from langflow.interface.embeddings.base import embedding_creator from langflow.interface.llms.base import llm_creator from langflow.interface.memories.base import memory_creator from langflow.interface.prompts.base import prompt_creator -from langflow.interface.textSplitters.base import textsplitter_creator +from langflow.interface.text_splitters.base import textsplitter_creator from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.tools.base import tool_creator -from langflow.interface.vectorStore.base import vectorstore_creator +from langflow.interface.vectorstore.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator diff --git a/src/backend/langflow/interface/llms/base.py b/src/backend/langflow/interface/llms/base.py index 91eefd845..25263bb03 100644 --- a/src/backend/langflow/interface/llms/base.py +++ b/src/backend/langflow/interface/llms/base.py @@ -5,6 +5,7 @@ from langflow.interface.custom_lists import llm_type_to_cls_dict from langflow.settings import settings from langflow.template.nodes import LLMFrontendNode from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class LLMCreator(LangChainTypeCreator): @@ -27,6 +28,9 @@ class LLMCreator(LangChainTypeCreator): except ValueError as exc: raise ValueError("LLM not found") from exc + except AttributeError as exc: + logger.error(f"LLM {name} not loaded: {exc}") + def to_list(self) -> List[str]: return [ llm.__name__ diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index 7db99c0a1..2b74043fa 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -5,6 +5,7 @@ from langflow.interface.custom_lists import memory_type_to_cls_dict from langflow.settings import settings from langflow.template.base import FrontendNode from langflow.template.nodes import MemoryFrontendNode +from langflow.utils.logger import logger from langflow.utils.util import build_template_from_class @@ -28,6 +29,8 @@ class MemoryCreator(LangChainTypeCreator): return build_template_from_class(name, memory_type_to_cls_dict) except ValueError as exc: raise ValueError("Memory not found") from exc + except AttributeError as exc: + logger.error(f"Memory {name} not loaded: {exc}") def to_list(self) -> List[str]: return [ diff --git a/src/backend/langflow/interface/prompts/base.py b/src/backend/langflow/interface/prompts/base.py index 73f842833..14fc77ae8 100644 --- a/src/backend/langflow/interface/prompts/base.py +++ b/src/backend/langflow/interface/prompts/base.py @@ -8,6 +8,7 @@ from langflow.interface.importing.utils import import_class from langflow.settings import settings from langflow.template.nodes import PromptFrontendNode from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class PromptCreator(LangChainTypeCreator): @@ -43,7 +44,10 @@ class PromptCreator(LangChainTypeCreator): return get_custom_nodes(self.type_name)[name] return build_template_from_class(name, self.type_to_loader_dict) except ValueError as exc: - raise ValueError("Prompt not found") from exc + # raise ValueError("Prompt not found") from exc + logger.error(f"Prompt {name} not found: {exc}") + except AttributeError as exc: + logger.error(f"Prompt {name} not loaded: {exc}") def to_list(self) -> List[str]: custom_prompts = get_custom_nodes("prompts") diff --git a/src/backend/langflow/interface/textSplitters/__init__.py b/src/backend/langflow/interface/textSplitters/__init__.py deleted file mode 100644 index 9da97b697..000000000 --- a/src/backend/langflow/interface/textSplitters/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from langflow.interface.textSplitters.base import TextSplitterCreator - -__all__ = ["TextSplitterCreator"] diff --git a/src/backend/langflow/interface/text_splitters/__init__.py b/src/backend/langflow/interface/text_splitters/__init__.py new file mode 100644 index 000000000..4bb9dd1b0 --- /dev/null +++ b/src/backend/langflow/interface/text_splitters/__init__.py @@ -0,0 +1,3 @@ +from langflow.interface.text_splitters.base import TextSplitterCreator + +__all__ = ["TextSplitterCreator"] diff --git a/src/backend/langflow/interface/textSplitters/base.py b/src/backend/langflow/interface/text_splitters/base.py similarity index 89% rename from src/backend/langflow/interface/textSplitters/base.py rename to src/backend/langflow/interface/text_splitters/base.py index bbc8ab863..f72f86ac5 100644 --- a/src/backend/langflow/interface/textSplitters/base.py +++ b/src/backend/langflow/interface/text_splitters/base.py @@ -3,6 +3,7 @@ from typing import Dict, List, Optional from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import textsplitter_type_to_cls_dict from langflow.settings import settings +from langflow.utils.logger import logger from langflow.utils.util import build_template_from_class @@ -28,6 +29,8 @@ class TextSplitterCreator(LangChainTypeCreator): return signature except ValueError as exc: raise ValueError(f"Text Splitter {name} not found") from exc + except AttributeError as exc: + logger.error(f"Text Splitter {name} not loaded: {exc}") def to_list(self) -> List[str]: return [ diff --git a/src/backend/langflow/interface/toolkits/base.py b/src/backend/langflow/interface/toolkits/base.py index 5346ae4b5..c56ed78db 100644 --- a/src/backend/langflow/interface/toolkits/base.py +++ b/src/backend/langflow/interface/toolkits/base.py @@ -6,6 +6,7 @@ from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class, import_module from langflow.settings import settings from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class ToolkitCreator(LangChainTypeCreator): @@ -44,6 +45,8 @@ class ToolkitCreator(LangChainTypeCreator): return build_template_from_class(name, self.type_to_loader_dict) except ValueError as exc: raise ValueError("Prompt not found") from exc + except AttributeError as exc: + logger.error(f"Prompt {name} not loaded: {exc}") def to_list(self) -> List[str]: return list(self.type_to_loader_dict.keys()) diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 61bfdfa7b..f279a3da8 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -1,14 +1,14 @@ from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator -from langflow.interface.documentLoaders.base import documentloader_creator +from langflow.interface.document_loaders.base import documentloader_creator from langflow.interface.embeddings.base import embedding_creator from langflow.interface.llms.base import llm_creator from langflow.interface.memories.base import memory_creator from langflow.interface.prompts.base import prompt_creator -from langflow.interface.textSplitters.base import textsplitter_creator +from langflow.interface.text_splitters.base import textsplitter_creator from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.tools.base import tool_creator -from langflow.interface.vectorStore.base import vectorstore_creator +from langflow.interface.vectorstore.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator diff --git a/src/backend/langflow/interface/vectorStore/base.py b/src/backend/langflow/interface/vectorStore/base.py index 943903b34..f104619b4 100644 --- a/src/backend/langflow/interface/vectorStore/base.py +++ b/src/backend/langflow/interface/vectorStore/base.py @@ -4,6 +4,7 @@ from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import vectorstores_type_to_cls_dict from langflow.settings import settings from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class VectorstoreCreator(LangChainTypeCreator): @@ -39,6 +40,8 @@ class VectorstoreCreator(LangChainTypeCreator): except ValueError as exc: raise ValueError(f"Vector Store {name} not found") from exc + except AttributeError as exc: + logger.error(f"Vector Store {name} not loaded: {exc}") def to_list(self) -> List[str]: return [ diff --git a/src/backend/langflow/interface/wrappers/base.py b/src/backend/langflow/interface/wrappers/base.py index 8d0df8141..5ce530461 100644 --- a/src/backend/langflow/interface/wrappers/base.py +++ b/src/backend/langflow/interface/wrappers/base.py @@ -4,6 +4,7 @@ from langchain import requests from langflow.interface.base import LangChainTypeCreator from langflow.utils.util import build_template_from_class +from langflow.utils.logger import logger class WrapperCreator(LangChainTypeCreator): @@ -22,6 +23,8 @@ class WrapperCreator(LangChainTypeCreator): return build_template_from_class(name, self.type_to_loader_dict) except ValueError as exc: raise ValueError("Wrapper not found") from exc + except AttributeError as exc: + logger.error(f"Wrapper {name} not loaded: {exc}") def to_list(self) -> List[str]: return list(self.type_to_loader_dict.keys())