From c2d4d3e9c071e3d8198947a0ae3d23c624407e32 Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Tue, 28 Mar 2023 15:28:08 -0300 Subject: [PATCH] refactor: separating modules to fix circular import --- src/backend/langflow/custom/customs.py | 2 +- src/backend/langflow/{node => graph}/__init__.py | 0 src/backend/langflow/{utils => graph}/graph.py | 7 +++---- src/backend/langflow/graph/utils.py | 0 .../langflow/interface/importing/__init__.py | 7 +++++++ .../interface/{importing.py => importing/utils.py} | 0 src/backend/langflow/interface/listing.py | 13 ++++++++++--- src/backend/langflow/interface/loading.py | 6 ++++-- src/backend/langflow/interface/run.py | 2 +- src/backend/langflow/interface/signature.py | 4 ++-- src/backend/langflow/template/__init__.py | 0 src/backend/langflow/{node => template}/nodes.py | 2 +- src/backend/langflow/{node => template}/template.py | 0 src/backend/langflow/utils/constants.py | 7 ------- src/backend/langflow/utils/util.py | 5 ++++- tests/test_endpoints.py | 12 +----------- tests/test_graph.py | 2 +- tests/test_loading.py | 2 +- 18 files changed, 36 insertions(+), 35 deletions(-) rename src/backend/langflow/{node => graph}/__init__.py (100%) rename src/backend/langflow/{utils => graph}/graph.py (98%) create mode 100644 src/backend/langflow/graph/utils.py create mode 100644 src/backend/langflow/interface/importing/__init__.py rename src/backend/langflow/interface/{importing.py => importing/utils.py} (100%) create mode 100644 src/backend/langflow/template/__init__.py rename src/backend/langflow/{node => template}/nodes.py (97%) rename src/backend/langflow/{node => template}/template.py (100%) diff --git a/src/backend/langflow/custom/customs.py b/src/backend/langflow/custom/customs.py index 11c1c43c2..877a06387 100644 --- a/src/backend/langflow/custom/customs.py +++ b/src/backend/langflow/custom/customs.py @@ -1,4 +1,4 @@ -from langflow.node import nodes +from langflow.template import nodes CUSTOM_NODES = { diff --git a/src/backend/langflow/node/__init__.py b/src/backend/langflow/graph/__init__.py similarity index 100% rename from src/backend/langflow/node/__init__.py rename to src/backend/langflow/graph/__init__.py diff --git a/src/backend/langflow/utils/graph.py b/src/backend/langflow/graph/graph.py similarity index 98% rename from src/backend/langflow/utils/graph.py rename to src/backend/langflow/graph/graph.py index c7b2cb750..e6960f772 100644 --- a/src/backend/langflow/utils/graph.py +++ b/src/backend/langflow/graph/graph.py @@ -6,10 +6,9 @@ from copy import deepcopy import types from typing import Any, Dict, List, Optional, Union +from langflow.utils import payload +from langflow.interface.listing import ALL_TYPES_DICT, ALL_TOOLS_NAMES, TOOLS_DICT from langflow.interface import loading -from langflow.utils import payload, util -from langflow.interface.listing import ALL_TYPES_DICT -from langflow.utils.constants import ALL_TOOLS_NAMES class Node: @@ -139,7 +138,7 @@ class Node: # and return the instance for base_type, value in ALL_TYPES_DICT.items(): if base_type == "tools": - value = util.get_tools_dict() + value = TOOLS_DICT if self.node_type in value: self._built_object = loading.instantiate_class( diff --git a/src/backend/langflow/graph/utils.py b/src/backend/langflow/graph/utils.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/interface/importing/__init__.py b/src/backend/langflow/interface/importing/__init__.py new file mode 100644 index 000000000..317849f8e --- /dev/null +++ b/src/backend/langflow/interface/importing/__init__.py @@ -0,0 +1,7 @@ +from langflow.interface.importing.utils import import_by_type # noqa: F401 + +# This module is used to import any langchain class by name. + +ALL = [ + "import_by_type", +] diff --git a/src/backend/langflow/interface/importing.py b/src/backend/langflow/interface/importing/utils.py similarity index 100% rename from src/backend/langflow/interface/importing.py rename to src/backend/langflow/interface/importing/utils.py diff --git a/src/backend/langflow/interface/listing.py b/src/backend/langflow/interface/listing.py index 28c1b1160..1e668b2b5 100644 --- a/src/backend/langflow/interface/listing.py +++ b/src/backend/langflow/interface/listing.py @@ -7,7 +7,14 @@ from langflow.interface.custom_lists import ( ) from langflow.settings import settings from langflow.utils import util -from langflow.utils.constants import ALL_TOOLS_NAMES +from langchain.agents.load_tools import get_all_tool_names +from langchain.agents import Tool +from langflow.interface.custom_types import PythonFunction + + +CUSTOM_TOOLS = {"Tool": Tool, "PythonFunction": PythonFunction} +TOOLS_DICT = util.get_tools_dict() +ALL_TOOLS_NAMES = set(get_all_tool_names() + list(CUSTOM_TOOLS.keys())) def get_type_dict(): @@ -51,9 +58,9 @@ def list_tools(): tools = [] - for tool in list(ALL_TOOLS_NAMES): + for tool in ALL_TOOLS_NAMES: tool_params = util.get_tool_params(util.get_tool_by_name(tool)) - if tool_params and tool_params["name"] in settings.tools or settings.dev: + if tool_params and tool_params.get("name") in settings.tools or settings.dev: tools.append(tool_params["name"]) # Add Tool diff --git a/src/backend/langflow/interface/loading.py b/src/backend/langflow/interface/loading.py index ee4764977..38c84144a 100644 --- a/src/backend/langflow/interface/loading.py +++ b/src/backend/langflow/interface/loading.py @@ -9,9 +9,9 @@ from langchain.agents.load_tools import ( _LLM_TOOLS, ) from langchain.agents import agent as agent_module -from langflow.utils.graph import Graph -from langflow.interface.importing import import_by_type + +from langflow.interface.importing.utils import import_by_type from langchain.agents import ZeroShotAgent from langchain.agents.loading import load_agent_from_config @@ -61,6 +61,8 @@ def load_flow_from_json(path: str): def extract_json(data_graph): + from langflow.graph.graph import Graph + nodes = data_graph["nodes"] # Substitute ZeroShotPrompt with PromptTemplate nodes = replace_zero_shot_prompt_with_prompt_template(nodes) diff --git a/src/backend/langflow/interface/run.py b/src/backend/langflow/interface/run.py index 469c64807..a2f691b91 100644 --- a/src/backend/langflow/interface/run.py +++ b/src/backend/langflow/interface/run.py @@ -5,7 +5,7 @@ from typing import Any, Dict from langflow.interface import loading from langflow.utils import payload -from langflow.utils.graph import Graph +from langflow.graph.graph import Graph def process_data_graph(data_graph: Dict[str, Any]): diff --git a/src/backend/langflow/interface/signature.py b/src/backend/langflow/interface/signature.py index 5ebae5f42..390f64671 100644 --- a/src/backend/langflow/interface/signature.py +++ b/src/backend/langflow/interface/signature.py @@ -13,9 +13,9 @@ from langflow.interface.custom_lists import ( llm_type_to_cls_dict, memory_type_to_cls_dict, ) -from langflow.node.template import Field, Template +from langflow.interface.listing import CUSTOM_TOOLS, ALL_TOOLS_NAMES +from langflow.template.template import Field, Template from langflow.utils import util -from langflow.utils.constants import ALL_TOOLS_NAMES, CUSTOM_TOOLS def get_signature(name: str, object_type: str): diff --git a/src/backend/langflow/template/__init__.py b/src/backend/langflow/template/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/node/nodes.py b/src/backend/langflow/template/nodes.py similarity index 97% rename from src/backend/langflow/node/nodes.py rename to src/backend/langflow/template/nodes.py index a628af510..e4db8670d 100644 --- a/src/backend/langflow/node/nodes.py +++ b/src/backend/langflow/template/nodes.py @@ -1,4 +1,4 @@ -from langflow.node.template import Field, FrontendNode, Template +from langflow.template.template import Field, FrontendNode, Template from langchain.agents.mrkl import prompt from langflow.utils.constants import DEFAULT_PYTHON_FUNCTION diff --git a/src/backend/langflow/node/template.py b/src/backend/langflow/template/template.py similarity index 100% rename from src/backend/langflow/node/template.py rename to src/backend/langflow/template/template.py diff --git a/src/backend/langflow/utils/constants.py b/src/backend/langflow/utils/constants.py index a66444ee9..c4a4eae18 100644 --- a/src/backend/langflow/utils/constants.py +++ b/src/backend/langflow/utils/constants.py @@ -1,7 +1,3 @@ -from langchain.agents import Tool -from langflow.interface.custom_types import PythonFunction -from langchain.agents.load_tools import get_all_tool_names - OPENAI_MODELS = [ "text-davinci-003", "text-davinci-002", @@ -11,11 +7,8 @@ OPENAI_MODELS = [ ] CHAT_OPENAI_MODELS = ["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"] -CUSTOM_TOOLS = {"Tool": Tool, "PythonFunction": PythonFunction} DEFAULT_PYTHON_FUNCTION = """ def python_function(text: str) -> str: return text """ - -ALL_TOOLS_NAMES = set(get_all_tool_names() + list(CUSTOM_TOOLS.keys())) diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index c694e877a..fef223762 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -15,6 +15,7 @@ from langchain.agents.load_tools import ( from langchain.agents.tools import Tool + from langflow.utils import constants @@ -165,12 +166,14 @@ def get_default_factory(module: str, function: str): def get_tools_dict(): """Get the tools dictionary.""" + from langflow.interface.listing import CUSTOM_TOOLS + tools = { **_BASE_TOOLS, **_LLM_TOOLS, **{k: v[0] for k, v in _EXTRA_LLM_TOOLS.items()}, **{k: v[0] for k, v in _EXTRA_OPTIONAL_TOOLS.items()}, - **constants.CUSTOM_TOOLS, + **CUSTOM_TOOLS, } return tools diff --git a/tests/test_endpoints.py b/tests/test_endpoints.py index 20e860575..9bd8cb785 100644 --- a/tests/test_endpoints.py +++ b/tests/test_endpoints.py @@ -1,14 +1,4 @@ -# # build router -# router = APIRouter() - - -# @router.get("/all") -# def get_all(): -# return build_langchain_types_dict() - - -# Buil test for /all endpoint -from langflow.utils.constants import CUSTOM_TOOLS +from langflow.interface.listing import CUSTOM_TOOLS from fastapi.testclient import TestClient diff --git a/tests/test_graph.py b/tests/test_graph.py index e0888c0c4..dfb0e2323 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -1,5 +1,5 @@ import json -from langflow.utils.graph import Edge, Graph, Node +from langflow.graph.graph import Edge, Graph, Node import pytest from langflow.utils.payload import build_json, get_root_node from langchain.agents import AgentExecutor diff --git a/tests/test_loading.py b/tests/test_loading.py index 783474886..b5742462f 100644 --- a/tests/test_loading.py +++ b/tests/test_loading.py @@ -1,6 +1,6 @@ import json from langchain import LLMChain, OpenAI -from langflow.utils.graph import Graph +from langflow.graph.graph import Graph import pytest from langflow import load_flow_from_json