diff --git a/langflow/backend/langflow_backend/api/endpoints.py b/langflow/backend/langflow_backend/api/endpoints.py index 6e1b6a1f4..5b3e74777 100644 --- a/langflow/backend/langflow_backend/api/endpoints.py +++ b/langflow/backend/langflow_backend/api/endpoints.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from langflow_backend.interface.types import build_langchain_types_dict, get_type_list -from langflow_backend.interface.loading import process_data_graph +from langflow_backend.interface.types import build_langchain_types_dict +from langflow_backend.interface.run import process_data_graph from typing import Any, Dict diff --git a/langflow/backend/langflow_backend/interface/loading.py b/langflow/backend/langflow_backend/interface/loading.py index d6992305e..07ee5bf4a 100644 --- a/langflow/backend/langflow_backend/interface/loading.py +++ b/langflow/backend/langflow_backend/interface/loading.py @@ -1,7 +1,4 @@ -import contextlib import json -import re -import io from typing import Any, Dict from langflow_backend.interface.types import get_type_list from langchain.agents.loading import load_agent_executor_from_config @@ -38,33 +35,7 @@ def replace_zero_shot_prompt_with_prompt_template(nodes): return nodes -def process_data_graph(data_graph: Dict[str, Any]): - """Process data graph by extracting input variables and replacing ZeroShotPrompt with PromptTemplate, - then run the graph and return the result and thought.""" - nodes = data_graph["nodes"] - # Substitute ZeroShotPrompt with PromptTemplate - nodes = replace_zero_shot_prompt_with_prompt_template(nodes) - # Add input variables - data_graph = payload.extract_input_variables(data_graph) - # Nodes, edges and root node - message = data_graph["message"] - edges = data_graph["edges"] - root = payload.get_root_node(data_graph) - extracted_json = payload.build_json(root, nodes, edges) - # Process json - result, thought = get_result_and_thought(extracted_json, message) - - # Remove unnecessary data from response - begin = thought.rfind(message) - thought = thought[(begin + len(message)) :] - - return { - "result": result, - "thought": re.sub( - r"\x1b\[([0-9,A-Z]{1,2}(;[0-9,A-Z]{1,2})?)?[m|K]", "", thought - ).strip(), - } def load_langchain_type_from_config(config: Dict[str, Any]): @@ -72,27 +43,16 @@ def load_langchain_type_from_config(config: Dict[str, Any]): # Get type list type_list = get_type_list() if config["_type"] in type_list["agents"]: - return load_agent_executor_from_config(config) + return load_agent_executor_from_config(config).run elif config["_type"] in type_list["chains"]: - return load_chain_from_config(config) + return load_chain_from_config(config).run elif config["_type"] in type_list["llms"]: return load_llm_from_config(config) else: raise ValueError("Type should be either agent, chain or llm") -def get_result_and_thought(extracted_json: Dict[str, Any], message: str): - """Get result and thought from extracted json""" - # Get type list - try: - loaded = load_langchain_type_from_config(config=extracted_json) - with io.StringIO() as output_buffer, contextlib.redirect_stdout(output_buffer): - result = loaded(message) - thought = output_buffer.getvalue() - except Exception as e: - result = f"Error: {str(e)}" - thought = "" - return result, thought + def build_prompt_template(prompt, tools): diff --git a/langflow/backend/langflow_backend/interface/run.py b/langflow/backend/langflow_backend/interface/run.py new file mode 100644 index 000000000..541663236 --- /dev/null +++ b/langflow/backend/langflow_backend/interface/run.py @@ -0,0 +1,54 @@ +import contextlib +import io +import re +from typing import Any, Dict +from langflow_backend.interface.loading import ( + load_langchain_type_from_config, + replace_zero_shot_prompt_with_prompt_template, +) +from langflow_backend.utils import payload + + +def process_data_graph(data_graph: Dict[str, Any]): + """ + Process data graph by extracting input variables and replacing ZeroShotPrompt + with PromptTemplate,then run the graph and return the result and thought. + """ + nodes = data_graph["nodes"] + # Substitute ZeroShotPrompt with PromptTemplate + nodes = replace_zero_shot_prompt_with_prompt_template(nodes) + # Add input variables + data_graph = payload.extract_input_variables(data_graph) + # Nodes, edges and root node + message = data_graph["message"] + edges = data_graph["edges"] + root = payload.get_root_node(data_graph) + extracted_json = payload.build_json(root, nodes, edges) + + # Process json + result, thought = get_result_and_thought(extracted_json, message) + + # Remove unnecessary data from response + begin = thought.rfind(message) + thought = thought[(begin + len(message)) :] + + return { + "result": result, + "thought": re.sub( + r"\x1b\[([0-9,A-Z]{1,2}(;[0-9,A-Z]{1,2})?)?[m|K]", "", thought + ).strip(), + } + + +def get_result_and_thought(extracted_json: Dict[str, Any], message: str): + """Get result and thought from extracted json""" + # Get type list + try: + loaded = load_langchain_type_from_config(config=extracted_json) + with io.StringIO() as output_buffer, contextlib.redirect_stdout(output_buffer): + result = loaded(message) + thought = output_buffer.getvalue() + except Exception as e: + result = f"Error: {str(e)}" + thought = "" + return result, thought