diff --git a/src/backend/base/langflow/api/utils.py b/src/backend/base/langflow/api/utils.py index 2a282fe5e..8e008ace1 100644 --- a/src/backend/base/langflow/api/utils.py +++ b/src/backend/base/langflow/api/utils.py @@ -6,18 +6,18 @@ from typing import TYPE_CHECKING, Any from fastapi import HTTPException from loguru import logger from sqlalchemy import delete -from sqlmodel import Session from langflow.graph.graph.base import Graph -from langflow.services.chat.service import ChatService from langflow.services.database.models.flow import Flow from langflow.services.database.models.transactions.model import TransactionTable from langflow.services.database.models.vertex_builds.model import VertexBuildTable -from langflow.services.store.schema import StoreComponentCreate from langflow.services.store.utils import get_lf_version_from_pypi if TYPE_CHECKING: - from langflow.services.database.models.flow.model import Flow + from sqlmodel import Session + + from langflow.services.chat.service import ChatService + from langflow.services.store.schema import StoreComponentCreate API_WORDS = ["api", "key", "token"] diff --git a/src/backend/base/langflow/base/agents/agent.py b/src/backend/base/langflow/base/agents/agent.py index 3b47e8a3a..c149ef9e3 100644 --- a/src/backend/base/langflow/base/agents/agent.py +++ b/src/backend/base/langflow/base/agents/agent.py @@ -1,9 +1,8 @@ from abc import abstractmethod -from typing import cast +from typing import TYPE_CHECKING, cast from langchain.agents import AgentExecutor, BaseMultiActionAgent, BaseSingleActionAgent from langchain.agents.agent import RunnableAgent -from langchain_core.messages import BaseMessage from langchain_core.runnables import Runnable from langflow.base.agents.callback import AgentAsyncHandler @@ -17,6 +16,9 @@ from langflow.schema.message import Message from langflow.template import Output from langflow.utils.constants import MESSAGE_SENDER_AI +if TYPE_CHECKING: + from langchain_core.messages import BaseMessage + class LCAgentComponent(Component): trace_type = "agent" diff --git a/src/backend/base/langflow/base/tools/component_tool.py b/src/backend/base/langflow/base/tools/component_tool.py index 2580682f8..2972b8825 100644 --- a/src/backend/base/langflow/base/tools/component_tool.py +++ b/src/backend/base/langflow/base/tools/component_tool.py @@ -1,10 +1,8 @@ from __future__ import annotations import re -from collections.abc import Callable from typing import TYPE_CHECKING -from langchain_core.tools import BaseTool from langchain_core.tools.structured import StructuredTool from loguru import logger @@ -12,6 +10,10 @@ from langflow.base.tools.constants import TOOL_OUTPUT_NAME from langflow.io.schema import create_input_schema if TYPE_CHECKING: + from collections.abc import Callable + + from langchain_core.tools import BaseTool + from langflow.custom.custom_component.component import Component from langflow.inputs.inputs import InputTypes from langflow.io import Output diff --git a/src/backend/base/langflow/base/tools/flow_tool.py b/src/backend/base/langflow/base/tools/flow_tool.py index 8d5703fc9..daba4a0b1 100644 --- a/src/backend/base/langflow/base/tools/flow_tool.py +++ b/src/backend/base/langflow/base/tools/flow_tool.py @@ -1,18 +1,21 @@ from __future__ import annotations -from typing import Any +from typing import TYPE_CHECKING, Any -from langchain_core.runnables import RunnableConfig from langchain_core.tools import BaseTool, ToolException from loguru import logger -from pydantic.v1 import BaseModel from langflow.base.flow_processing.utils import build_data_from_result_data, format_flow_output_data -from langflow.graph.graph.base import Graph -from langflow.graph.vertex.base import Vertex from langflow.helpers.flow import build_schema_from_inputs, get_arg_names, get_flow_inputs, run_flow from langflow.utils.async_helpers import run_until_complete +if TYPE_CHECKING: + from langchain_core.runnables import RunnableConfig + from pydantic.v1 import BaseModel + + from langflow.graph.graph.base import Graph + from langflow.graph.vertex.base import Vertex + class FlowTool(BaseTool): name: str diff --git a/src/backend/base/langflow/base/vectorstores/model.py b/src/backend/base/langflow/base/vectorstores/model.py index 323575ca5..79202095e 100644 --- a/src/backend/base/langflow/base/vectorstores/model.py +++ b/src/backend/base/langflow/base/vectorstores/model.py @@ -1,8 +1,7 @@ from abc import abstractmethod from functools import wraps -from typing import cast +from typing import TYPE_CHECKING, cast -from langchain_core.documents import Document from loguru import logger from langflow.custom import Component @@ -11,6 +10,9 @@ from langflow.helpers.data import docs_to_data from langflow.io import Output from langflow.schema import Data +if TYPE_CHECKING: + from langchain_core.documents import Document + def check_cached_vector_store(f): """ diff --git a/src/backend/base/langflow/components/chains/SQLGenerator.py b/src/backend/base/langflow/components/chains/SQLGenerator.py index 88d2a5ba7..d2c412e23 100644 --- a/src/backend/base/langflow/components/chains/SQLGenerator.py +++ b/src/backend/base/langflow/components/chains/SQLGenerator.py @@ -1,12 +1,16 @@ +from typing import TYPE_CHECKING + from langchain.chains import create_sql_query_chain from langchain_core.prompts import PromptTemplate -from langchain_core.runnables import Runnable from langflow.base.chains.model import LCChainComponent from langflow.field_typing import Message from langflow.inputs import HandleInput, IntInput, MultilineInput from langflow.template import Output +if TYPE_CHECKING: + from langchain_core.runnables import Runnable + class SQLGeneratorComponent(LCChainComponent): display_name = "Natural Language to SQL" diff --git a/src/backend/base/langflow/components/deactivated/SubFlow.py b/src/backend/base/langflow/components/deactivated/SubFlow.py index 74d162ca8..a2ddbc49e 100644 --- a/src/backend/base/langflow/components/deactivated/SubFlow.py +++ b/src/backend/base/langflow/components/deactivated/SubFlow.py @@ -1,17 +1,19 @@ -from typing import Any +from typing import TYPE_CHECKING, Any from loguru import logger from langflow.base.flow_processing.utils import build_data_from_result_data from langflow.custom import CustomComponent from langflow.graph.graph.base import Graph -from langflow.graph.schema import RunOutputs from langflow.graph.vertex.base import Vertex from langflow.helpers.flow import get_flow_inputs from langflow.schema import Data from langflow.schema.dotdict import dotdict from langflow.template.field.base import Input +if TYPE_CHECKING: + from langflow.graph.schema import RunOutputs + class SubFlowComponent(CustomComponent): display_name = "Sub Flow" diff --git a/src/backend/base/langflow/components/embeddings/TextEmbedder.py b/src/backend/base/langflow/components/embeddings/TextEmbedder.py index e5c76a623..24a6b1573 100644 --- a/src/backend/base/langflow/components/embeddings/TextEmbedder.py +++ b/src/backend/base/langflow/components/embeddings/TextEmbedder.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + from langflow.custom import Component -from langflow.field_typing import Embeddings from langflow.io import HandleInput, MessageInput, Output from langflow.schema import Data -from langflow.schema.message import Message + +if TYPE_CHECKING: + from langflow.field_typing import Embeddings + from langflow.schema.message import Message class TextEmbedderComponent(Component): diff --git a/src/backend/base/langflow/components/prototypes/RunFlow.py b/src/backend/base/langflow/components/prototypes/RunFlow.py index 834a7b20f..d0c656e21 100644 --- a/src/backend/base/langflow/components/prototypes/RunFlow.py +++ b/src/backend/base/langflow/components/prototypes/RunFlow.py @@ -1,11 +1,13 @@ -from typing import Any +from typing import TYPE_CHECKING, Any from langflow.base.flow_processing.utils import build_data_from_run_outputs from langflow.custom import Component -from langflow.graph.schema import RunOutputs from langflow.io import DropdownInput, MessageTextInput, NestedDictInput, Output from langflow.schema import Data, dotdict +if TYPE_CHECKING: + from langflow.graph.schema import RunOutputs + class RunFlowComponent(Component): display_name = "Run Flow" diff --git a/src/backend/base/langflow/components/vectorstores/Chroma.py b/src/backend/base/langflow/components/vectorstores/Chroma.py index 92a2ef83a..e6e15e548 100644 --- a/src/backend/base/langflow/components/vectorstores/Chroma.py +++ b/src/backend/base/langflow/components/vectorstores/Chroma.py @@ -1,8 +1,7 @@ from copy import deepcopy -from typing import TYPE_CHECKING from chromadb.config import Settings -from langchain_chroma.vectorstores import Chroma +from langchain_chroma import Chroma from loguru import logger from langflow.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store @@ -10,9 +9,6 @@ from langflow.base.vectorstores.utils import chroma_collection_to_data from langflow.io import BoolInput, DataInput, DropdownInput, HandleInput, IntInput, MultilineInput, StrInput from langflow.schema import Data -if TYPE_CHECKING: - from langchain_chroma import Chroma - class ChromaVectorStoreComponent(LCVectorStoreComponent): """ diff --git a/src/backend/base/langflow/components/vectorstores/OpenSearch.py b/src/backend/base/langflow/components/vectorstores/OpenSearch.py index ca02781e3..8e351724d 100644 --- a/src/backend/base/langflow/components/vectorstores/OpenSearch.py +++ b/src/backend/base/langflow/components/vectorstores/OpenSearch.py @@ -1,6 +1,6 @@ import json import traceback -from typing import TYPE_CHECKING, Any +from typing import Any from langchain_community.vectorstores import OpenSearchVectorSearch from loguru import logger @@ -19,9 +19,6 @@ from langflow.io import ( ) from langflow.schema import Data -if TYPE_CHECKING: - from langchain_community.vectorstores import OpenSearchVectorSearch - class OpenSearchVectorStoreComponent(LCVectorStoreComponent): """ diff --git a/src/backend/base/langflow/custom/custom_component/component.py b/src/backend/base/langflow/custom/custom_component/component.py index cbf71377a..75c2b3e79 100644 --- a/src/backend/base/langflow/custom/custom_component/component.py +++ b/src/backend/base/langflow/custom/custom_component/component.py @@ -2,11 +2,9 @@ from __future__ import annotations import ast import inspect -from collections.abc import Callable from copy import deepcopy from textwrap import dedent from typing import TYPE_CHECKING, Any, ClassVar, get_type_hints -from uuid import UUID import nanoid # type: ignore import yaml @@ -14,13 +12,11 @@ from pydantic import BaseModel from langflow.base.tools.constants import TOOL_OUTPUT_NAME from langflow.custom.tree_visitor import RequiredInputsVisitor -from langflow.events.event_manager import EventManager -from langflow.field_typing import Tool +from langflow.field_typing import Tool # noqa: TCH001 Needed by add_toolkit_output from langflow.graph.state.model import create_state_model from langflow.helpers.custom import format_type from langflow.schema.artifact import get_artifact_type, post_process_raw from langflow.schema.data import Data -from langflow.schema.log import LoggableType from langflow.schema.message import Message from langflow.services.settings.feature_flags import FEATURE_FLAGS from langflow.services.tracing.schema import Log @@ -32,9 +28,14 @@ from langflow.utils.util import find_closest_match from .custom_component import CustomComponent if TYPE_CHECKING: + from collections.abc import Callable + from uuid import UUID + + from langflow.events.event_manager import EventManager from langflow.graph.edge.schema import EdgeData from langflow.graph.vertex.base import Vertex from langflow.inputs.inputs import InputTypes + from langflow.schema.log import LoggableType _ComponentToolkit = None diff --git a/src/backend/base/langflow/custom/custom_component/custom_component.py b/src/backend/base/langflow/custom/custom_component/custom_component.py index 07a16b2da..e54333715 100644 --- a/src/backend/base/langflow/custom/custom_component/custom_component.py +++ b/src/backend/base/langflow/custom/custom_component/custom_component.py @@ -12,11 +12,8 @@ from pydantic import BaseModel from langflow.custom.custom_component.base_component import BaseComponent from langflow.helpers.flow import list_flows, load_flow, run_flow from langflow.schema import Data -from langflow.schema.dotdict import dotdict -from langflow.schema.schema import OutputValue from langflow.services.deps import get_storage_service, get_variable_service, session_scope from langflow.services.storage.service import StorageService -from langflow.services.tracing.schema import Log from langflow.template.utils import update_frontend_node_with_template_values from langflow.type_extraction.type_extraction import post_process_type from langflow.utils import validate @@ -26,7 +23,10 @@ if TYPE_CHECKING: from langflow.graph.graph.base import Graph from langflow.graph.vertex.base import Vertex + from langflow.schema.dotdict import dotdict + from langflow.schema.schema import OutputValue from langflow.services.storage.service import StorageService + from langflow.services.tracing.schema import Log from langflow.services.tracing.service import TracingService diff --git a/src/backend/base/langflow/graph/graph/base.py b/src/backend/base/langflow/graph/graph/base.py index 7cde9ca32..07839b472 100644 --- a/src/backend/base/langflow/graph/graph/base.py +++ b/src/backend/base/langflow/graph/graph/base.py @@ -15,10 +15,8 @@ from typing import TYPE_CHECKING, Any, cast import nest_asyncio from loguru import logger -from langflow.events.event_manager import EventManager from langflow.exceptions.component import ComponentBuildException from langflow.graph.edge.base import CycleEdge, Edge -from langflow.graph.edge.schema import EdgeData from langflow.graph.graph.constants import Finish, lazy_load_vertex_dict from langflow.graph.graph.runnable_vertices_manager import RunnableVerticesManager from langflow.graph.graph.schema import GraphData, GraphDump, StartConfigDict, VertexBuildResult @@ -38,17 +36,19 @@ from langflow.graph.vertex.base import Vertex, VertexStates from langflow.graph.vertex.schema import NodeData, NodeTypeEnum from langflow.graph.vertex.types import ComponentVertex, InterfaceVertex, StateVertex from langflow.logging.logger import LogConfig, configure -from langflow.schema import Data from langflow.schema.schema import INPUT_FIELD_NAME, InputType from langflow.services.cache.utils import CacheMiss -from langflow.services.chat.schema import GetCache, SetCache from langflow.services.deps import get_chat_service, get_tracing_service from langflow.utils.async_helpers import run_until_complete if TYPE_CHECKING: from langflow.api.v1.schemas import InputValueRequest from langflow.custom.custom_component.component import Component + from langflow.events.event_manager import EventManager + from langflow.graph.edge.schema import EdgeData from langflow.graph.schema import ResultData + from langflow.schema import Data + from langflow.services.chat.schema import GetCache, SetCache from langflow.services.tracing.service import TracingService diff --git a/src/backend/base/langflow/graph/graph/schema.py b/src/backend/base/langflow/graph/graph/schema.py index 06c138561..4777abef6 100644 --- a/src/backend/base/langflow/graph/graph/schema.py +++ b/src/backend/base/langflow/graph/graph/schema.py @@ -6,11 +6,11 @@ from typing_extensions import NotRequired, TypedDict from langflow.graph.edge.schema import EdgeData from langflow.graph.vertex.schema import NodeData -from langflow.schema.log import LoggableType if TYPE_CHECKING: from langflow.graph.schema import ResultData from langflow.graph.vertex.base import Vertex + from langflow.schema.log import LoggableType class ViewPort(TypedDict): diff --git a/src/backend/base/langflow/graph/graph/state_manager.py b/src/backend/base/langflow/graph/graph/state_manager.py index 8936b86de..ae6ea68e5 100644 --- a/src/backend/base/langflow/graph/graph/state_manager.py +++ b/src/backend/base/langflow/graph/graph/state_manager.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Callable from typing import TYPE_CHECKING from loguru import logger @@ -8,6 +7,8 @@ from loguru import logger from langflow.services.deps import get_settings_service, get_state_service if TYPE_CHECKING: + from collections.abc import Callable + from langflow.services.state.service import StateService diff --git a/src/backend/base/langflow/graph/vertex/base.py b/src/backend/base/langflow/graph/vertex/base.py index 4187ed201..f0e4f2b80 100644 --- a/src/backend/base/langflow/graph/vertex/base.py +++ b/src/backend/base/langflow/graph/vertex/base.py @@ -13,11 +13,9 @@ from typing import TYPE_CHECKING, Any import pandas as pd from loguru import logger -from langflow.events.event_manager import EventManager from langflow.exceptions.component import ComponentBuildException from langflow.graph.schema import INPUT_COMPONENTS, OUTPUT_COMPONENTS, InterfaceComponentTypes, ResultData from langflow.graph.utils import UnbuiltObject, UnbuiltResult, log_transaction -from langflow.graph.vertex.schema import NodeData from langflow.interface import initialize from langflow.interface.listing import lazy_load_dict from langflow.schema.artifact import ArtifactType @@ -25,15 +23,17 @@ from langflow.schema.data import Data from langflow.schema.message import Message from langflow.schema.schema import INPUT_FIELD_NAME, OutputValue, build_output_logs from langflow.services.deps import get_storage_service -from langflow.services.tracing.schema import Log from langflow.utils.constants import DIRECT_TYPES from langflow.utils.schemas import ChatOutputResponse from langflow.utils.util import sync_to_async, unescape_string if TYPE_CHECKING: from langflow.custom import Component + from langflow.events.event_manager import EventManager from langflow.graph.edge.base import CycleEdge, Edge from langflow.graph.graph.base import Graph + from langflow.graph.vertex.schema import NodeData + from langflow.services.tracing.schema import Log class VertexStates(str, Enum): diff --git a/src/backend/base/langflow/graph/vertex/types.py b/src/backend/base/langflow/graph/vertex/types.py index 3acb4378e..d2df06f4c 100644 --- a/src/backend/base/langflow/graph/vertex/types.py +++ b/src/backend/base/langflow/graph/vertex/types.py @@ -14,8 +14,6 @@ from langflow.graph.schema import CHAT_COMPONENTS, RECORDS_COMPONENTS, Interface from langflow.graph.utils import UnbuiltObject, log_transaction, log_vertex_build, rewrite_file_path, serialize_field from langflow.graph.vertex.base import Vertex from langflow.graph.vertex.exceptions import NoComponentInstance -from langflow.graph.vertex.schema import NodeData -from langflow.inputs.inputs import InputTypes from langflow.schema import Data from langflow.schema.artifact import ArtifactType from langflow.schema.message import Message @@ -26,6 +24,8 @@ from langflow.utils.util import unescape_string if TYPE_CHECKING: from langflow.graph.edge.base import CycleEdge + from langflow.graph.vertex.schema import NodeData + from langflow.inputs.inputs import InputTypes class CustomComponentVertex(Vertex): diff --git a/src/backend/base/langflow/helpers/flow.py b/src/backend/base/langflow/helpers/flow.py index 492edcfbf..eeb77a99f 100644 --- a/src/backend/base/langflow/helpers/flow.py +++ b/src/backend/base/langflow/helpers/flow.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Awaitable, Callable from typing import TYPE_CHECKING, Any, cast from uuid import UUID @@ -8,16 +7,18 @@ from fastapi import HTTPException from pydantic.v1 import BaseModel, Field, create_model from sqlmodel import select -from langflow.graph.schema import RunOutputs -from langflow.schema import Data from langflow.schema.schema import INPUT_FIELD_NAME from langflow.services.database.models.flow import Flow from langflow.services.database.models.flow.model import FlowRead from langflow.services.deps import get_settings_service, session_scope if TYPE_CHECKING: + from collections.abc import Awaitable, Callable + from langflow.graph.graph.base import Graph + from langflow.graph.schema import RunOutputs from langflow.graph.vertex.base import Vertex + from langflow.schema import Data INPUT_TYPE_MAP = { "ChatInput": {"type_hint": "Optional[str]", "default": '""'}, diff --git a/src/backend/base/langflow/interface/initialize/loading.py b/src/backend/base/langflow/interface/initialize/loading.py index 4c128c93b..985b97f89 100644 --- a/src/backend/base/langflow/interface/initialize/loading.py +++ b/src/backend/base/langflow/interface/initialize/loading.py @@ -10,13 +10,13 @@ from loguru import logger from pydantic import PydanticDeprecatedSince20 from langflow.custom.eval import eval_custom_component_code -from langflow.events.event_manager import EventManager from langflow.schema import Data from langflow.schema.artifact import get_artifact_type, post_process_raw from langflow.services.deps import get_tracing_service if TYPE_CHECKING: from langflow.custom import Component, CustomComponent + from langflow.events.event_manager import EventManager from langflow.graph.vertex.base import Vertex diff --git a/src/backend/base/langflow/interface/types.py b/src/backend/base/langflow/interface/types.py index e44a75de7..f28f5a832 100644 --- a/src/backend/base/langflow/interface/types.py +++ b/src/backend/base/langflow/interface/types.py @@ -1,6 +1,5 @@ from __future__ import annotations -import asyncio import json from typing import TYPE_CHECKING @@ -9,6 +8,8 @@ from loguru import logger from langflow.custom.utils import abuild_custom_components, build_custom_components if TYPE_CHECKING: + import asyncio + from langflow.services.cache.base import CacheService from langflow.services.settings.service import SettingsService diff --git a/src/backend/base/langflow/processing/base.py b/src/backend/base/langflow/processing/base.py index 03e00a5ed..23ed9d86e 100644 --- a/src/backend/base/langflow/processing/base.py +++ b/src/backend/base/langflow/processing/base.py @@ -2,12 +2,12 @@ from __future__ import annotations from typing import TYPE_CHECKING -from langchain_core.callbacks import BaseCallbackHandler from loguru import logger from langflow.services.deps import get_plugins_service if TYPE_CHECKING: + from langchain_core.callbacks import BaseCallbackHandler from langfuse.callback import CallbackHandler # type: ignore diff --git a/src/backend/base/langflow/processing/process.py b/src/backend/base/langflow/processing/process.py index e3117df07..c4dfdcf60 100644 --- a/src/backend/base/langflow/processing/process.py +++ b/src/backend/base/langflow/processing/process.py @@ -5,8 +5,6 @@ from typing import TYPE_CHECKING, Any, cast from loguru import logger from pydantic import BaseModel -from langflow.graph.graph.base import Graph -from langflow.graph.schema import RunOutputs from langflow.graph.vertex.base import Vertex from langflow.schema.graph import InputValue, Tweaks from langflow.schema.schema import INPUT_FIELD_NAME @@ -14,6 +12,8 @@ from langflow.services.deps import get_settings_service if TYPE_CHECKING: from langflow.api.v1.schemas import InputValueRequest + from langflow.graph.graph.base import Graph + from langflow.graph.schema import RunOutputs class Result(BaseModel): diff --git a/src/backend/base/langflow/schema/data.py b/src/backend/base/langflow/schema/data.py index c74673559..98a7b39a4 100644 --- a/src/backend/base/langflow/schema/data.py +++ b/src/backend/base/langflow/schema/data.py @@ -1,15 +1,17 @@ import copy import json -from typing import cast +from typing import TYPE_CHECKING, cast from langchain_core.documents import Document from langchain_core.messages import AIMessage, BaseMessage, HumanMessage -from langchain_core.prompt_values import ImagePromptValue from langchain_core.prompts.image import ImagePromptTemplate from pydantic import BaseModel, model_serializer, model_validator from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER +if TYPE_CHECKING: + from langchain_core.prompt_values import ImagePromptValue + class Data(BaseModel): """ diff --git a/src/backend/base/langflow/schema/message.py b/src/backend/base/langflow/schema/message.py index cdc7f782f..fb501d7b0 100644 --- a/src/backend/base/langflow/schema/message.py +++ b/src/backend/base/langflow/schema/message.py @@ -2,13 +2,12 @@ import asyncio import json from collections.abc import AsyncIterator, Iterator from datetime import datetime, timezone -from typing import Annotated, Any +from typing import TYPE_CHECKING, Annotated, Any from uuid import UUID from fastapi.encoders import jsonable_encoder from langchain_core.load import load from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage -from langchain_core.prompt_values import ImagePromptValue from langchain_core.prompts import BaseChatPromptTemplate, ChatPromptTemplate, PromptTemplate from langchain_core.prompts.image import ImagePromptTemplate from loguru import logger @@ -24,6 +23,9 @@ from langflow.utils.constants import ( MESSAGE_SENDER_USER, ) +if TYPE_CHECKING: + from langchain_core.prompt_values import ImagePromptValue + def _timestamp_to_str(timestamp: datetime | str) -> str: if isinstance(timestamp, str): diff --git a/src/backend/base/langflow/services/database/models/api_key/crud.py b/src/backend/base/langflow/services/database/models/api_key/crud.py index 05dd14784..389e2a81b 100644 --- a/src/backend/base/langflow/services/database/models/api_key/crud.py +++ b/src/backend/base/langflow/services/database/models/api_key/crud.py @@ -1,13 +1,16 @@ import datetime import secrets import threading +from typing import TYPE_CHECKING from uuid import UUID from sqlmodel import Session, select -from sqlmodel.sql.expression import SelectOfScalar from langflow.services.database.models.api_key import ApiKey, ApiKeyCreate, ApiKeyRead, UnmaskedApiKeyRead +if TYPE_CHECKING: + from sqlmodel.sql.expression import SelectOfScalar + def get_api_keys(session: Session, user_id: UUID) -> list[ApiKeyRead]: query: SelectOfScalar = select(ApiKey).where(ApiKey.user_id == user_id) diff --git a/src/backend/base/langflow/services/database/models/flow/model.py b/src/backend/base/langflow/services/database/models/flow/model.py index 6d50c64fd..30693eb2d 100644 --- a/src/backend/base/langflow/services/database/models/flow/model.py +++ b/src/backend/base/langflow/services/database/models/flow/model.py @@ -14,13 +14,13 @@ from sqlalchemy import Text, UniqueConstraint from sqlmodel import JSON, Column, Field, Relationship, SQLModel from langflow.schema import Data -from langflow.services.database.models.vertex_builds.model import VertexBuildTable if TYPE_CHECKING: from langflow.services.database.models import TransactionTable from langflow.services.database.models.folder import Folder from langflow.services.database.models.message import MessageTable from langflow.services.database.models.user import User + from langflow.services.database.models.vertex_builds.model import VertexBuildTable class FlowBase(SQLModel): diff --git a/src/backend/base/langflow/services/database/models/folder/model.py b/src/backend/base/langflow/services/database/models/folder/model.py index 94997856a..0dbfb94d6 100644 --- a/src/backend/base/langflow/services/database/models/folder/model.py +++ b/src/backend/base/langflow/services/database/models/folder/model.py @@ -1,14 +1,11 @@ -from typing import TYPE_CHECKING, Optional +from typing import Optional from uuid import UUID, uuid4 from sqlalchemy import Text, UniqueConstraint from sqlmodel import Column, Field, Relationship, SQLModel -from langflow.services.database.models.flow.model import FlowRead - -if TYPE_CHECKING: - from langflow.services.database.models.flow.model import Flow - from langflow.services.database.models.user.model import User +from langflow.services.database.models.flow.model import Flow, FlowRead +from langflow.services.database.models.user.model import User class FolderBase(SQLModel): @@ -26,8 +23,8 @@ class Folder(FolderBase, table=True): # type: ignore ) children: list["Folder"] = Relationship(back_populates="parent") user_id: UUID | None = Field(default=None, foreign_key="user.id") - user: "User" = Relationship(back_populates="folders") - flows: list["Flow"] = Relationship( + user: User = Relationship(back_populates="folders") + flows: list[Flow] = Relationship( back_populates="folder", sa_relationship_kwargs={"cascade": "all, delete, delete-orphan"} ) @@ -47,7 +44,7 @@ class FolderRead(FolderBase): class FolderReadWithFlows(FolderBase): id: UUID parent_id: UUID | None = Field() - flows: list["FlowRead"] = Field(default=[]) + flows: list[FlowRead] = Field(default=[]) class FolderUpdate(SQLModel): diff --git a/src/backend/base/langflow/services/database/models/folder/utils.py b/src/backend/base/langflow/services/database/models/folder/utils.py index 446efb029..e7403fb11 100644 --- a/src/backend/base/langflow/services/database/models/folder/utils.py +++ b/src/backend/base/langflow/services/database/models/folder/utils.py @@ -1,4 +1,3 @@ -from typing import TYPE_CHECKING from uuid import UUID from sqlmodel import Session, and_, select, update @@ -8,9 +7,6 @@ from langflow.services.database.models.flow.model import Flow from .constants import DEFAULT_FOLDER_DESCRIPTION, DEFAULT_FOLDER_NAME from .model import Folder -if TYPE_CHECKING: - pass - def create_default_folder_if_it_doesnt_exist(session: Session, user_id: UUID): folder = session.exec(select(Folder).where(Folder.user_id == user_id)).first() diff --git a/src/backend/base/langflow/services/database/service.py b/src/backend/base/langflow/services/database/service.py index 970f1aa7b..c018bdc38 100644 --- a/src/backend/base/langflow/services/database/service.py +++ b/src/backend/base/langflow/services/database/service.py @@ -26,8 +26,6 @@ from langflow.services.deps import get_settings_service from langflow.services.utils import teardown_superuser if TYPE_CHECKING: - from sqlalchemy.engine import Engine - from langflow.services.settings.service import SettingsService diff --git a/src/backend/base/langflow/services/deps.py b/src/backend/base/langflow/services/deps.py index d43d9cc82..231295105 100644 --- a/src/backend/base/langflow/services/deps.py +++ b/src/backend/base/langflow/services/deps.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Generator from contextlib import contextmanager from typing import TYPE_CHECKING @@ -9,6 +8,8 @@ from loguru import logger from langflow.services.schema import ServiceType if TYPE_CHECKING: + from collections.abc import Generator + from sqlmodel import Session from langflow.services.cache.service import CacheService diff --git a/src/backend/base/langflow/services/factory.py b/src/backend/base/langflow/services/factory.py index ea4fa3bbc..c4f03e766 100644 --- a/src/backend/base/langflow/services/factory.py +++ b/src/backend/base/langflow/services/factory.py @@ -77,7 +77,7 @@ def import_all_services_into_a_dict(): for name, obj in inspect.getmembers(module, inspect.isclass): if issubclass(obj, Service) and obj is not Service: services[name] = obj - break + # break except Exception as exc: logger.exception(exc) msg = "Could not initialize services. Please check your settings." diff --git a/src/backend/base/langflow/services/session/service.py b/src/backend/base/langflow/services/session/service.py index 30418c151..0997b7912 100644 --- a/src/backend/base/langflow/services/session/service.py +++ b/src/backend/base/langflow/services/session/service.py @@ -1,9 +1,12 @@ from collections.abc import Coroutine +from typing import TYPE_CHECKING from langflow.services.base import Service -from langflow.services.cache.base import CacheService from langflow.services.session.utils import compute_dict_hash, session_id_generator +if TYPE_CHECKING: + from langflow.services.cache.base import CacheService + class SessionService(Service): name = "session_service" diff --git a/src/backend/base/langflow/services/task/backends/celery.py b/src/backend/base/langflow/services/task/backends/celery.py index e2ae1e86b..f73ff6e7f 100644 --- a/src/backend/base/langflow/services/task/backends/celery.py +++ b/src/backend/base/langflow/services/task/backends/celery.py @@ -1,11 +1,14 @@ from collections.abc import Callable -from typing import Any +from typing import TYPE_CHECKING, Any from celery.result import AsyncResult # type: ignore from langflow.services.task.backends.base import TaskBackend from langflow.worker import celery_app +if TYPE_CHECKING: + from celery import Task + class CeleryBackend(TaskBackend): name = "celery" @@ -15,7 +18,6 @@ class CeleryBackend(TaskBackend): def launch_task(self, task_func: Callable[..., Any], *args: Any, **kwargs: Any) -> tuple[str, AsyncResult]: # I need to type the delay method to make it easier - from celery import Task # type: ignore if not hasattr(task_func, "delay"): msg = f"Task function {task_func} does not have a delay method" diff --git a/src/backend/base/langflow/services/task/service.py b/src/backend/base/langflow/services/task/service.py index e4781e849..2d8817d3f 100644 --- a/src/backend/base/langflow/services/task/service.py +++ b/src/backend/base/langflow/services/task/service.py @@ -7,11 +7,11 @@ from loguru import logger from langflow.services.base import Service from langflow.services.task.backends.anyio import AnyIOBackend -from langflow.services.task.backends.base import TaskBackend from langflow.services.task.utils import get_celery_worker_status if TYPE_CHECKING: from langflow.services.settings.service import SettingsService + from langflow.services.task.backends.base import TaskBackend def check_celery_availability(): diff --git a/src/backend/base/langflow/services/task/utils.py b/src/backend/base/langflow/services/task/utils.py index 5dfb03b83..2b1bf0894 100644 --- a/src/backend/base/langflow/services/task/utils.py +++ b/src/backend/base/langflow/services/task/utils.py @@ -1,7 +1,8 @@ -import contextlib from typing import TYPE_CHECKING if TYPE_CHECKING: + import contextlib + with contextlib.suppress(ImportError): from celery import Celery # type: ignore diff --git a/src/backend/base/langflow/services/telemetry/service.py b/src/backend/base/langflow/services/telemetry/service.py index 532c110d9..6e9333564 100644 --- a/src/backend/base/langflow/services/telemetry/service.py +++ b/src/backend/base/langflow/services/telemetry/service.py @@ -9,7 +9,6 @@ from typing import TYPE_CHECKING import httpx from loguru import logger -from pydantic import BaseModel from langflow.services.base import Service from langflow.services.telemetry.opentelemetry import OpenTelemetry @@ -23,6 +22,8 @@ from langflow.services.telemetry.schema import ( from langflow.utils.version import get_version_info if TYPE_CHECKING: + from pydantic import BaseModel + from langflow.services.settings.service import SettingsService diff --git a/src/backend/base/langflow/services/tracing/base.py b/src/backend/base/langflow/services/tracing/base.py index 6e39b643d..3ae22e1d1 100644 --- a/src/backend/base/langflow/services/tracing/base.py +++ b/src/backend/base/langflow/services/tracing/base.py @@ -1,16 +1,16 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence from typing import TYPE_CHECKING, Any -from uuid import UUID - -from langflow.services.tracing.schema import Log if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + from langchain.callbacks.base import BaseCallbackHandler from langflow.graph.vertex.base import Vertex + from langflow.services.tracing.schema import Log class BaseTracer(ABC): diff --git a/src/backend/base/langflow/services/tracing/langfuse.py b/src/backend/base/langflow/services/tracing/langfuse.py index 65a89eaea..7dd384ed5 100644 --- a/src/backend/base/langflow/services/tracing/langfuse.py +++ b/src/backend/base/langflow/services/tracing/langfuse.py @@ -1,21 +1,22 @@ from __future__ import annotations import os -from collections.abc import Sequence from datetime import datetime, timezone from typing import TYPE_CHECKING, Any -from uuid import UUID from loguru import logger from langflow.services.tracing.base import BaseTracer -from langflow.services.tracing.schema import Log if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + from langchain.callbacks.base import BaseCallbackHandler from langfuse.client import StatefulSpanClient from langflow.graph.vertex.base import Vertex + from langflow.services.tracing.schema import Log class LangFuseTracer(BaseTracer): diff --git a/src/backend/base/langflow/services/tracing/langsmith.py b/src/backend/base/langflow/services/tracing/langsmith.py index 4cdbe36c0..52c1f22c0 100644 --- a/src/backend/base/langflow/services/tracing/langsmith.py +++ b/src/backend/base/langflow/services/tracing/langsmith.py @@ -3,21 +3,22 @@ from __future__ import annotations import os import traceback import types -from collections.abc import Sequence from datetime import datetime, timezone from typing import TYPE_CHECKING, Any -from uuid import UUID from loguru import logger from langflow.schema.data import Data from langflow.services.tracing.base import BaseTracer -from langflow.services.tracing.schema import Log if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + from langchain.callbacks.base import BaseCallbackHandler from langflow.graph.vertex.base import Vertex + from langflow.services.tracing.schema import Log class LangSmithTracer(BaseTracer): diff --git a/src/backend/base/langflow/services/tracing/langwatch.py b/src/backend/base/langflow/services/tracing/langwatch.py index baaabcb12..b1a11dfc8 100644 --- a/src/backend/base/langflow/services/tracing/langwatch.py +++ b/src/backend/base/langflow/services/tracing/langwatch.py @@ -1,21 +1,22 @@ from __future__ import annotations -from collections.abc import Sequence from typing import TYPE_CHECKING, Any, cast -from uuid import UUID import nanoid # type: ignore from loguru import logger from langflow.schema.data import Data from langflow.services.tracing.base import BaseTracer -from langflow.services.tracing.schema import Log if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + from langchain.callbacks.base import BaseCallbackHandler from langwatch.tracer import ContextSpan from langflow.graph.vertex.base import Vertex + from langflow.services.tracing.schema import Log class LangWatchTracer(BaseTracer): diff --git a/src/backend/base/langflow/services/tracing/service.py b/src/backend/base/langflow/services/tracing/service.py index 57a392547..776bdf91c 100644 --- a/src/backend/base/langflow/services/tracing/service.py +++ b/src/backend/base/langflow/services/tracing/service.py @@ -5,20 +5,21 @@ import os from collections import defaultdict from contextlib import asynccontextmanager from typing import TYPE_CHECKING, Any -from uuid import UUID from loguru import logger from langflow.services.base import Service -from langflow.services.tracing.base import BaseTracer -from langflow.services.tracing.schema import Log if TYPE_CHECKING: + from uuid import UUID + from langchain.callbacks.base import BaseCallbackHandler from langflow.custom.custom_component.component import Component from langflow.graph.vertex.base import Vertex from langflow.services.settings.service import SettingsService + from langflow.services.tracing.base import BaseTracer + from langflow.services.tracing.schema import Log def _get_langsmith_tracer(): diff --git a/src/backend/base/langflow/services/variable/kubernetes.py b/src/backend/base/langflow/services/variable/kubernetes.py index ff11b78d9..92e84c806 100644 --- a/src/backend/base/langflow/services/variable/kubernetes.py +++ b/src/backend/base/langflow/services/variable/kubernetes.py @@ -1,19 +1,24 @@ from __future__ import annotations import os -from uuid import UUID +from typing import TYPE_CHECKING from loguru import logger -from sqlmodel import Session from langflow.services.auth import utils as auth_utils from langflow.services.base import Service from langflow.services.database.models.variable.model import Variable, VariableCreate -from langflow.services.settings.service import SettingsService from langflow.services.variable.base import VariableService from langflow.services.variable.constants import CREDENTIAL_TYPE, GENERIC_TYPE from langflow.services.variable.kubernetes_secrets import KubernetesSecretManager, encode_user_id +if TYPE_CHECKING: + from uuid import UUID + + from sqlmodel import Session + + from langflow.services.settings.service import SettingsService + class KubernetesSecretService(VariableService, Service): def __init__(self, settings_service: SettingsService): diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index e29298864..8b04e69bc 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -1,10 +1,8 @@ from __future__ import annotations import os -from collections.abc import Sequence from datetime import datetime, timezone from typing import TYPE_CHECKING -from uuid import UUID from fastapi import Depends from loguru import logger @@ -18,6 +16,9 @@ from langflow.services.variable.base import VariableService from langflow.services.variable.constants import CREDENTIAL_TYPE, GENERIC_TYPE if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + from langflow.services.settings.service import SettingsService diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index 277b93ad5..2df390eb3 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -156,6 +156,11 @@ flake8-bugbear.extend-immutable-calls = [ "fastapi.Query", "typer.Option", ] +flake8-type-checking.runtime-evaluated-base-classes = [ + "pydantic.BaseModel", + "typing.TypedDict", # Needed by fastapi + "typing_extensions.TypedDict", # Needed by fastapi +] select = [ "A", "ASYNC", @@ -188,6 +193,7 @@ select = [ "SIM", "SLOT", "T10", + "TCH", "TID", "UP", "W", @@ -198,6 +204,11 @@ ignore = [ "ISC001", # Messes with the formatter ] +[tool.ruff.lint.per-file-ignores] +"langflow/api/v1/*" = [ + "TCH", # FastAPI needs to evaluate types at runtime +] + [tool.uv] dev-dependencies = [ "asgi-lifespan>=2.1.0",