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
This commit is contained in:
parent
cf8c5a52fa
commit
c28e6ad62d
20 changed files with 59 additions and 18 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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]:
|
||||
|
|
|
|||
|
|
@ -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 = [
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
67
src/backend/langflow/interface/document_loaders/base.py
Normal file
67
src/backend/langflow/interface/document_loaders/base.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
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.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):
|
||||
type_name: str = "documentloaders"
|
||||
|
||||
@property
|
||||
def type_to_loader_dict(self) -> Dict:
|
||||
types = documentloaders_type_to_cls_dict
|
||||
|
||||
# Drop some types that are reimplemented with the same name
|
||||
types.pop("TextLoader")
|
||||
|
||||
for name, documentloader in CUSTOM_DOCUMENTLOADERS.items():
|
||||
types[name] = documentloader
|
||||
|
||||
return types
|
||||
|
||||
def get_signature(self, name: str) -> Optional[Dict]:
|
||||
"""Get the signature of a document loader."""
|
||||
try:
|
||||
signature = build_template_from_class(
|
||||
name, documentloaders_type_to_cls_dict
|
||||
)
|
||||
|
||||
if name == "TextLoader":
|
||||
signature["template"]["file"] = {
|
||||
"type": "file",
|
||||
"required": True,
|
||||
"show": True,
|
||||
"name": "path",
|
||||
"value": "",
|
||||
"suffixes": [".txt"],
|
||||
"fileTypes": ["txt"],
|
||||
}
|
||||
elif name == "WebBaseLoader":
|
||||
signature["template"]["web_path"] = {
|
||||
"type": "str",
|
||||
"required": True,
|
||||
"show": True,
|
||||
"name": "web_path",
|
||||
"value": "",
|
||||
"display_name": "Web Path",
|
||||
}
|
||||
|
||||
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 [
|
||||
documentloader.__name__
|
||||
for documentloader in self.type_to_loader_dict.values()
|
||||
if documentloader.__name__ in settings.documentloaders or settings.dev
|
||||
]
|
||||
|
||||
|
||||
documentloader_creator = DocumentLoaderCreator()
|
||||
22
src/backend/langflow/interface/document_loaders/custom.py
Normal file
22
src/backend/langflow/interface/document_loaders/custom.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
"""Load text files."""
|
||||
from typing import List
|
||||
|
||||
from langchain.docstore.document import Document
|
||||
from langchain.document_loaders.base import BaseLoader
|
||||
|
||||
|
||||
class TextLoader(BaseLoader):
|
||||
"""Load Text files."""
|
||||
|
||||
def __init__(self, file: str):
|
||||
"""Initialize with file path."""
|
||||
self.file = file
|
||||
|
||||
def load(self) -> List[Document]:
|
||||
"""Load from file path."""
|
||||
return [Document(page_content=self.file, metadata={"source": "loaded"})]
|
||||
|
||||
|
||||
CUSTOM_DOCUMENTLOADERS = {
|
||||
"TextLoader": TextLoader,
|
||||
}
|
||||
|
|
@ -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__
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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__
|
||||
|
|
|
|||
|
|
@ -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 [
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
from langflow.interface.textSplitters.base import TextSplitterCreator
|
||||
|
||||
__all__ = ["TextSplitterCreator"]
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
from langflow.interface.text_splitters.base import TextSplitterCreator
|
||||
|
||||
__all__ = ["TextSplitterCreator"]
|
||||
43
src/backend/langflow/interface/text_splitters/base.py
Normal file
43
src/backend/langflow/interface/text_splitters/base.py
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
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
|
||||
|
||||
|
||||
class TextSplitterCreator(LangChainTypeCreator):
|
||||
type_name: str = "textsplitters"
|
||||
|
||||
@property
|
||||
def type_to_loader_dict(self) -> Dict:
|
||||
return textsplitter_type_to_cls_dict
|
||||
|
||||
def get_signature(self, name: str) -> Optional[Dict]:
|
||||
"""Get the signature of a text splitter."""
|
||||
try:
|
||||
signature = build_template_from_class(name, textsplitter_type_to_cls_dict)
|
||||
|
||||
signature["template"]["documents"] = {
|
||||
"type": "BaseLoader",
|
||||
"required": True,
|
||||
"show": True,
|
||||
"name": "documents",
|
||||
}
|
||||
|
||||
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 [
|
||||
textsplitter.__name__
|
||||
for textsplitter in self.type_to_loader_dict.values()
|
||||
if textsplitter.__name__ in settings.textsplitters or settings.dev
|
||||
]
|
||||
|
||||
|
||||
textsplitter_creator = TextSplitterCreator()
|
||||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 [
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
Loading…
Reference in a new issue