From 04fe2f60546bf33b20c231978da0dcb99cefc9ab Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Sep 2023 10:59:53 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20chore(utils.py):=20add=20utility?= =?UTF-8?q?=20function=20to=20check=20if=20an=20object=20is=20a=20basic=20?= =?UTF-8?q?type=20=F0=9F=93=9D=20chore(loading.py):=20refactor=20code=20to?= =?UTF-8?q?=20improve=20readability=20and=20maintainability=20=F0=9F=93=9D?= =?UTF-8?q?=20chore(vector=5Fstore.py):=20refactor=20code=20to=20improve?= =?UTF-8?q?=20readability=20and=20maintainability=20=F0=9F=93=9D=20chore(r?= =?UTF-8?q?un.py):=20update=20return=20type=20hint=20for=20build=5Fsorted?= =?UTF-8?q?=5Fvertices=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/graph/vertex/utils.py | 5 +++++ .../langflow/interface/initialize/loading.py | 20 ++++++++++++++++++- .../interface/initialize/vector_store.py | 7 ++++++- src/backend/langflow/interface/run.py | 4 ++-- 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 src/backend/langflow/graph/vertex/utils.py diff --git a/src/backend/langflow/graph/vertex/utils.py b/src/backend/langflow/graph/vertex/utils.py new file mode 100644 index 000000000..e1d439f4b --- /dev/null +++ b/src/backend/langflow/graph/vertex/utils.py @@ -0,0 +1,5 @@ +from langflow.utils.constants import PYTHON_BASIC_TYPES + + +def is_basic_type(obj): + return type(obj) in PYTHON_BASIC_TYPES diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index b600fb5b2..82075cd2e 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -1,7 +1,7 @@ import json import orjson from typing import Any, Callable, Dict, Sequence, Type, TYPE_CHECKING - +from langchain.schema import Document from langchain.agents import agent as agent_module from langchain.agents.agent import AgentExecutor from langchain.agents.agent_toolkits.base import BaseToolkit @@ -40,12 +40,23 @@ if TYPE_CHECKING: from langflow import CustomComponent +def build_vertex_in_params(params: Dict) -> Dict: + from langflow.graph.vertex.base import Vertex + + # If any of the values in params is a Vertex, we will build it + return { + key: value.build() if isinstance(value, Vertex) else value + for key, value in params.items() + } + + def instantiate_class( node_type: str, base_type: str, params: Dict, user_id=None ) -> Any: """Instantiate class from module type and key, and params""" params = convert_params_to_sets(params) params = convert_kwargs(params) + if node_type in CUSTOM_NODES: if custom_node := CUSTOM_NODES.get(node_type): if hasattr(custom_node, "initialize"): @@ -289,6 +300,13 @@ def instantiate_embedding(node_type, class_object, params: Dict): def instantiate_vectorstore(class_object: Type[VectorStore], params: Dict): search_kwargs = params.pop("search_kwargs", {}) + # clean up docs or texts to have only documents + if "texts" in params: + params["documents"] = params.pop("texts") + if "documents" in params: + params["documents"] = [ + doc for doc in params["documents"] if isinstance(doc, Document) + ] if initializer := vecstore_initializer.get(class_object.__name__): vecstore = initializer(class_object, params) else: diff --git a/src/backend/langflow/interface/initialize/vector_store.py b/src/backend/langflow/interface/initialize/vector_store.py index 233292626..59e7c0d3b 100644 --- a/src/backend/langflow/interface/initialize/vector_store.py +++ b/src/backend/langflow/interface/initialize/vector_store.py @@ -8,7 +8,7 @@ from langchain.vectorstores import ( SupabaseVectorStore, MongoDBAtlasVectorSearch, ) - +from langchain.schema import Document import os import orjson @@ -201,11 +201,16 @@ def initialize_chroma(class_object: Type[Chroma], params: dict): if "texts" in params: params["documents"] = params.pop("texts") for doc in params["documents"]: + if not isinstance(doc, Document): + # remove any non-Document objects from the list + params["documents"].remove(doc) + continue if doc.metadata is None: doc.metadata = {} for key, value in doc.metadata.items(): if value is None: doc.metadata[key] = "" + chromadb = class_object.from_documents(**params) if persist: chromadb.persist() diff --git a/src/backend/langflow/interface/run.py b/src/backend/langflow/interface/run.py index 81c3f6910..8df41d3b3 100644 --- a/src/backend/langflow/interface/run.py +++ b/src/backend/langflow/interface/run.py @@ -3,7 +3,7 @@ from langflow.graph import Graph from loguru import logger -def build_sorted_vertices(data_graph) -> Tuple[Any, Dict]: +def build_sorted_vertices(data_graph) -> Tuple[Graph, Dict]: """ Build langchain object from data_graph. """ @@ -16,7 +16,7 @@ def build_sorted_vertices(data_graph) -> Tuple[Any, Dict]: vertex.build() if vertex.artifacts: artifacts.update(vertex.artifacts) - return graph.build(), artifacts + return graph, artifacts def build_langchain_object(data_graph):