diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/langflow/interface/importing/utils.py index f65376d48..587e02949 100644 --- a/src/backend/langflow/interface/importing/utils.py +++ b/src/backend/langflow/interface/importing/utils.py @@ -44,6 +44,7 @@ def import_by_type(_type: str, name: str) -> Any: "documentloaders": import_documentloader, "textsplitters": import_textsplitter, "utilities": import_utility, + "output_parsers": import_output_parser, } if _type == "llms": key = "chat" if "chat" in name.lower() else "llm" @@ -54,6 +55,11 @@ def import_by_type(_type: str, name: str) -> Any: return loaded_func(name) +def import_output_parser(output_parser: str) -> Any: + """Import output parser from output parser name""" + return import_module(f"from langchain.output_parsers import {output_parser}") + + def import_chat_llm(llm: str) -> BaseChatModel: """Import chat llm from llm name""" return import_class(f"langchain.chat_models.{llm}") diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 896ee1837..34249239d 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -14,6 +14,7 @@ from langflow.interface.custom_lists import CUSTOM_NODES from langflow.interface.importing.utils import get_function, import_by_type from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator +from langflow.interface.output_parsers.base import output_parser_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate @@ -72,10 +73,21 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_utility(node_type, class_object, params) elif base_type == "chains": return instantiate_chains(node_type, class_object, params) + elif base_type == "output_parsers": + return instantiate_output_parser(node_type, class_object, params) else: return class_object(**params) +def instantiate_output_parser(node_type, class_object, params): + if node_type in output_parser_creator.from_method_nodes: + method = output_parser_creator.from_method_nodes[node_type] + if class_method := getattr(class_object, method, None): + return class_method(**params) + raise ValueError(f"Method {method} not found in {class_object}") + return class_object(**params) + + def instantiate_chains(node_type, class_object, params): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() diff --git a/src/backend/langflow/interface/listing.py b/src/backend/langflow/interface/listing.py index 3d73105c2..bb8e6127b 100644 --- a/src/backend/langflow/interface/listing.py +++ b/src/backend/langflow/interface/listing.py @@ -11,6 +11,7 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.output_parsers.base import output_parser_creator def get_type_dict(): @@ -28,6 +29,7 @@ def get_type_dict(): "embeddings": embedding_creator.to_list(), "textSplitters": textsplitter_creator.to_list(), "utilities": utility_creator.to_list(), + "outputParsers": output_parser_creator.to_list(), } diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 085537756..8bbf8a7b4 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -11,6 +11,7 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.output_parsers.base import output_parser_creator def get_type_list(): @@ -44,6 +45,7 @@ def build_langchain_types_dict(): # sourcery skip: dict-assign-update-to-union documentloader_creator, textsplitter_creator, utility_creator, + output_parser_creator, ] all_types = {}