feat: add vecstores, docloaders and embedding
This commit is contained in:
parent
137070437c
commit
7f330177f3
10 changed files with 89 additions and 9 deletions
|
|
@ -45,5 +45,6 @@ vectorstores:
|
||||||
|
|
||||||
documentloaders:
|
documentloaders:
|
||||||
- TextLoader
|
- TextLoader
|
||||||
|
- Text
|
||||||
|
|
||||||
dev: false
|
dev: false
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,9 @@ class Node:
|
||||||
result = result.run # type: ignore
|
result = result.run # type: ignore
|
||||||
elif hasattr(result, "get_function"):
|
elif hasattr(result, "get_function"):
|
||||||
result = result.get_function() # type: ignore
|
result = result.get_function() # type: ignore
|
||||||
|
elif key == "Document Loader":
|
||||||
|
result = result.load()
|
||||||
|
|
||||||
self.params[key] = result
|
self.params[key] = result
|
||||||
elif isinstance(value, list) and all(
|
elif isinstance(value, list) and all(
|
||||||
isinstance(node, Node) for node in value
|
isinstance(node, Node) for node in value
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,9 @@ from langflow.graph.nodes import (
|
||||||
ToolkitNode,
|
ToolkitNode,
|
||||||
ToolNode,
|
ToolNode,
|
||||||
WrapperNode,
|
WrapperNode,
|
||||||
|
EmbeddingNode,
|
||||||
|
VectorStoreNode,
|
||||||
|
DocumentLoaderNode,
|
||||||
)
|
)
|
||||||
from langflow.interface.agents.base import agent_creator
|
from langflow.interface.agents.base import agent_creator
|
||||||
from langflow.interface.chains.base import chain_creator
|
from langflow.interface.chains.base import chain_creator
|
||||||
|
|
@ -20,6 +23,9 @@ from langflow.interface.tools.base import tool_creator
|
||||||
from langflow.interface.tools.constants import FILE_TOOLS
|
from langflow.interface.tools.constants import FILE_TOOLS
|
||||||
from langflow.interface.tools.util import get_tools_dict
|
from langflow.interface.tools.util import get_tools_dict
|
||||||
from langflow.interface.wrappers.base import wrapper_creator
|
from langflow.interface.wrappers.base import wrapper_creator
|
||||||
|
from langflow.interface.embeddings.base import embedding_creator
|
||||||
|
from langflow.interface.vectorStore.base import vectorstore_creator
|
||||||
|
from langflow.interface.documentLoaders.base import documentloader_creator
|
||||||
from langflow.utils import payload
|
from langflow.utils import payload
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -130,6 +136,12 @@ class Graph:
|
||||||
or node_lc_type in llm_creator.to_list()
|
or node_lc_type in llm_creator.to_list()
|
||||||
):
|
):
|
||||||
nodes.append(LLMNode(node))
|
nodes.append(LLMNode(node))
|
||||||
|
elif node_type in embedding_creator.to_list():
|
||||||
|
nodes.append(EmbeddingNode(node))
|
||||||
|
elif node_type in vectorstore_creator.to_list():
|
||||||
|
nodes.append(VectorStoreNode(node))
|
||||||
|
elif node_type in documentloader_creator.to_list():
|
||||||
|
nodes.append(DocumentLoaderNode(node))
|
||||||
else:
|
else:
|
||||||
nodes.append(Node(node))
|
nodes.append(Node(node))
|
||||||
return nodes
|
return nodes
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,9 @@ def load_file(file_name, file_content, accepted_types) -> Any:
|
||||||
# Load the csv content
|
# Load the csv content
|
||||||
csv_reader = csv.DictReader(io.StringIO(decoded_string))
|
csv_reader = csv.DictReader(io.StringIO(decoded_string))
|
||||||
return list(csv_reader)
|
return list(csv_reader)
|
||||||
|
elif suffix == "txt":
|
||||||
|
# Return the text content
|
||||||
|
return decoded_string
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"File {file_name} is not accepted")
|
raise ValueError(f"File {file_name} is not accepted")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ from langflow.interface.base import LangChainTypeCreator
|
||||||
from langflow.interface.custom_lists import documentloaders_type_to_cls_dict
|
from langflow.interface.custom_lists import documentloaders_type_to_cls_dict
|
||||||
from langflow.settings import settings
|
from langflow.settings import settings
|
||||||
from langflow.utils.util import build_template_from_class
|
from langflow.utils.util import build_template_from_class
|
||||||
|
from langflow.interface.documentLoaders.custom import CUSTOM_DOCUMENTLOADERS
|
||||||
|
|
||||||
|
|
||||||
class DocumentLoaderCreator(LangChainTypeCreator):
|
class DocumentLoaderCreator(LangChainTypeCreator):
|
||||||
|
|
@ -11,7 +12,12 @@ class DocumentLoaderCreator(LangChainTypeCreator):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type_to_loader_dict(self) -> Dict:
|
def type_to_loader_dict(self) -> Dict:
|
||||||
return documentloaders_type_to_cls_dict
|
types = documentloaders_type_to_cls_dict
|
||||||
|
|
||||||
|
for name, documentloader in CUSTOM_DOCUMENTLOADERS.items():
|
||||||
|
types[name] = documentloader
|
||||||
|
|
||||||
|
return types
|
||||||
|
|
||||||
def get_signature(self, name: str) -> Optional[Dict]:
|
def get_signature(self, name: str) -> Optional[Dict]:
|
||||||
"""Get the signature of a document loader."""
|
"""Get the signature of a document loader."""
|
||||||
|
|
|
||||||
27
src/backend/langflow/interface/documentLoaders/custom.py
Normal file
27
src/backend/langflow/interface/documentLoaders/custom.py
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
"""Load text files."""
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from langchain.docstore.document import Document
|
||||||
|
from langchain.document_loaders.base import BaseLoader
|
||||||
|
from langchain.text_splitter import CharacterTextSplitter
|
||||||
|
|
||||||
|
|
||||||
|
class Text(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."""
|
||||||
|
documents = [Document(page_content=self.file, metadata={"source": "loaded"})]
|
||||||
|
|
||||||
|
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
|
||||||
|
|
||||||
|
return text_splitter.split_documents(documents)
|
||||||
|
|
||||||
|
|
||||||
|
CUSTOM_DOCUMENTLOADERS = {
|
||||||
|
"Text": Text,
|
||||||
|
}
|
||||||
|
|
@ -9,6 +9,7 @@ from langchain.chains.base import Chain
|
||||||
from langchain.chat_models.base import BaseChatModel
|
from langchain.chat_models.base import BaseChatModel
|
||||||
from langchain.llms.base import BaseLLM
|
from langchain.llms.base import BaseLLM
|
||||||
from langchain.tools import BaseTool
|
from langchain.tools import BaseTool
|
||||||
|
from langflow.interface.documentLoaders.custom import CUSTOM_DOCUMENTLOADERS
|
||||||
|
|
||||||
from langflow.interface.tools.util import get_tool_by_name
|
from langflow.interface.tools.util import get_tool_by_name
|
||||||
|
|
||||||
|
|
@ -38,6 +39,9 @@ def import_by_type(_type: str, name: str) -> Any:
|
||||||
"toolkits": import_toolkit,
|
"toolkits": import_toolkit,
|
||||||
"wrappers": import_wrapper,
|
"wrappers": import_wrapper,
|
||||||
"memory": import_memory,
|
"memory": import_memory,
|
||||||
|
"embeddings": import_embedding,
|
||||||
|
"vectorstores": import_vectorstore,
|
||||||
|
"documentloaders": import_documentloader,
|
||||||
}
|
}
|
||||||
if _type == "llms":
|
if _type == "llms":
|
||||||
key = "chat" if "chat" in name.lower() else "llm"
|
key = "chat" if "chat" in name.lower() else "llm"
|
||||||
|
|
@ -103,3 +107,21 @@ def import_tool(tool: str) -> BaseTool:
|
||||||
def import_chain(chain: str) -> Chain:
|
def import_chain(chain: str) -> Chain:
|
||||||
"""Import chain from chain name"""
|
"""Import chain from chain name"""
|
||||||
return import_class(f"langchain.chains.{chain}")
|
return import_class(f"langchain.chains.{chain}")
|
||||||
|
|
||||||
|
|
||||||
|
def import_embedding(embedding: str) -> Any:
|
||||||
|
"""Import embedding from embedding name"""
|
||||||
|
return import_class(f"langchain.embeddings.{embedding}")
|
||||||
|
|
||||||
|
|
||||||
|
def import_vectorstore(vectorstore: str) -> Any:
|
||||||
|
"""Import vectorstore from vectorstore name"""
|
||||||
|
return import_class(f"langchain.vectorstores.{vectorstore}")
|
||||||
|
|
||||||
|
|
||||||
|
def import_documentloader(documentloader: str) -> Any:
|
||||||
|
"""Import documentloader from documentloader name"""
|
||||||
|
if documentloader in CUSTOM_DOCUMENTLOADERS:
|
||||||
|
return CUSTOM_DOCUMENTLOADERS[documentloader]
|
||||||
|
|
||||||
|
return import_class(f"langchain.document_loaders.{documentloader}")
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,14 @@ def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any:
|
||||||
if toolkits_creator.has_create_function(node_type):
|
if toolkits_creator.has_create_function(node_type):
|
||||||
return load_toolkits_executor(node_type, loaded_toolkit, params)
|
return load_toolkits_executor(node_type, loaded_toolkit, params)
|
||||||
return loaded_toolkit
|
return loaded_toolkit
|
||||||
|
elif base_type == "embeddings":
|
||||||
|
params.pop("model")
|
||||||
|
return class_object(**params)
|
||||||
|
elif base_type == "vectorstores":
|
||||||
|
# Rename dict key
|
||||||
|
params["documents"] = params.pop("Document Loader")
|
||||||
|
params["embedding"] = params.pop("Embedding")
|
||||||
|
return class_object.from_documents(**params)
|
||||||
else:
|
else:
|
||||||
return class_object(**params)
|
return class_object(**params)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,14 +24,12 @@ class VectorstoreCreator(LangChainTypeCreator):
|
||||||
"required": True,
|
"required": True,
|
||||||
"show": True,
|
"show": True,
|
||||||
"name": "Document Loader",
|
"name": "Document Loader",
|
||||||
"value": "",
|
|
||||||
},
|
},
|
||||||
"Embedding": {
|
"Embedding": {
|
||||||
"type": "Embeddings",
|
"type": "Embeddings",
|
||||||
"required": True,
|
"required": True,
|
||||||
"show": True,
|
"show": True,
|
||||||
"name": "Embedding",
|
"name": "Embedding",
|
||||||
"value": "",
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return signature
|
return signature
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,8 @@ export const nodeColors: {[char: string]: string} = {
|
||||||
chat: "#454173",
|
chat: "#454173",
|
||||||
thought:"#272541",
|
thought:"#272541",
|
||||||
embeddings:"#FF9135",
|
embeddings:"#FF9135",
|
||||||
documentloader:"#FF9135",
|
documentloaders:"#FF9135",
|
||||||
vectorstore: "#FF9135",
|
vectorstores: "#FF9135",
|
||||||
unknown:"#9CA3AF"
|
unknown:"#9CA3AF"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -92,8 +92,8 @@ export const nodeNames:{[char: string]: string} = {
|
||||||
advanced: "Advanced",
|
advanced: "Advanced",
|
||||||
chat: "Chat",
|
chat: "Chat",
|
||||||
embeddings: "Embeddings",
|
embeddings: "Embeddings",
|
||||||
documentloader: "Document Loaders",
|
documentloaders: "Document Loaders",
|
||||||
vectorstore: "Vector Stores",
|
vectorstores: "Vector Stores",
|
||||||
toolkits:"Toolkits",
|
toolkits:"Toolkits",
|
||||||
wrappers:"Wrappers",
|
wrappers:"Wrappers",
|
||||||
unknown:"Unknown"
|
unknown:"Unknown"
|
||||||
|
|
@ -109,8 +109,8 @@ export const nodeIcons:{[char: string]: React.ForwardRefExoticComponent<React.SV
|
||||||
advanced: ComputerDesktopIcon,
|
advanced: ComputerDesktopIcon,
|
||||||
chat: Bars3CenterLeftIcon,
|
chat: Bars3CenterLeftIcon,
|
||||||
embeddings:PaperClipIcon,
|
embeddings:PaperClipIcon,
|
||||||
documentloader:PaperClipIcon,
|
documentloaders:PaperClipIcon,
|
||||||
vectorstore: PaperClipIcon,
|
vectorstores: PaperClipIcon,
|
||||||
toolkits:WrenchScrewdriverIcon,
|
toolkits:WrenchScrewdriverIcon,
|
||||||
wrappers:GiftIcon,
|
wrappers:GiftIcon,
|
||||||
unknown:QuestionMarkCircleIcon
|
unknown:QuestionMarkCircleIcon
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue