diff --git a/src/backend/langflow/api/chat_manager.py b/src/backend/langflow/api/chat_manager.py index 3636a94f3..663243d17 100644 --- a/src/backend/langflow/api/chat_manager.py +++ b/src/backend/langflow/api/chat_manager.py @@ -110,7 +110,7 @@ class ChatManager: start_resp = ChatResponse(message=None, type="start", intermediate_steps="") await self.send_json(client_id, start_resp) - is_first_message = len(self.chat_history.get_history(client_id=client_id)) == 0 + is_first_message = len(self.chat_history.get_history(client_id=client_id)) <= 1 # Generate result and thought try: logger.debug("Generating result and thought") diff --git a/src/backend/langflow/graph/nodes.py b/src/backend/langflow/graph/nodes.py index cdcfb3b88..f33a0fcef 100644 --- a/src/backend/langflow/graph/nodes.py +++ b/src/backend/langflow/graph/nodes.py @@ -36,7 +36,7 @@ class AgentNode(Node): #! Cannot deepcopy VectorStore, VectorStoreRouter, or SQL agents if self.node_type in ["VectorStoreAgent", "VectorStoreRouterAgent", "SQLAgent"]: return self._built_object - return deepcopy(self._built_object) + return self._built_object class ToolNode(Node): @@ -81,7 +81,7 @@ class PromptNode(Node): self.params["input_variables"] = list(set(self.params["input_variables"])) self._build() - return deepcopy(self._built_object) + return self._built_object class ChainNode(Node): @@ -105,13 +105,29 @@ class ChainNode(Node): #! Cannot deepcopy SQLDatabaseChain if self.node_type in ["SQLDatabaseChain"]: return self._built_object - return deepcopy(self._built_object) + return self._built_object class LLMNode(Node): + built_node_type = None + class_built_object = None + def __init__(self, data: Dict): super().__init__(data, base_type="llms") + def build(self, force: bool = False) -> Any: + # LLM is different because some models might take up too much memory + # or time to load. So we only load them when we need them.ß + if self.node_type == self.built_node_type: + return self.class_built_object + if not self._built or force: + self._build() + self.built_node_type = self.node_type + self.class_built_object = self._built_object + # Avoid deepcopying the LLM + # that are loaded from a file + return self._built_object + class ToolkitNode(Node): def __init__(self, data: Dict): @@ -132,7 +148,7 @@ class WrapperNode(Node): if "headers" in self.params: self.params["headers"] = eval(self.params["headers"]) self._build() - return deepcopy(self._built_object) + return self._built_object class DocumentLoaderNode(Node): diff --git a/src/backend/langflow/interface/loading.py b/src/backend/langflow/interface/loading.py index 93135067b..bd2946a3e 100644 --- a/src/backend/langflow/interface/loading.py +++ b/src/backend/langflow/interface/loading.py @@ -134,7 +134,13 @@ def instantiate_documentloader(class_object, params): def instantiate_textsplitter(class_object, params): - documents = params.pop("documents") + try: + documents = params.pop("documents") + except KeyError as e: + raise ValueError( + "The source you provided did not load correctly or was empty." + "Try changing the chunk_size of the Text Splitter." + ) from e text_splitter = class_object(**params) return text_splitter.split_documents(documents)