feat: add vecstores, docloaders and embedding

This commit is contained in:
Ibis Prevedello 2023-04-05 19:40:52 -03:00
commit 7f330177f3
10 changed files with 89 additions and 9 deletions

View file

@ -45,5 +45,6 @@ vectorstores:
documentloaders: documentloaders:
- TextLoader - TextLoader
- Text
dev: false dev: false

View file

@ -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

View file

@ -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

View file

@ -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")

View file

@ -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."""

View 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,
}

View file

@ -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}")

View file

@ -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)

View file

@ -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

View file

@ -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