diff --git a/src/backend/base/langflow/api/v1/flows.py b/src/backend/base/langflow/api/v1/flows.py index a4444d809..510b6e525 100644 --- a/src/backend/base/langflow/api/v1/flows.py +++ b/src/backend/base/langflow/api/v1/flows.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import io import json import re @@ -123,7 +125,7 @@ def read_flows( *, current_user: User = Depends(get_current_active_user), session: Session = Depends(get_session), - settings_service: "SettingsService" = Depends(get_settings_service), + settings_service: SettingsService = Depends(get_settings_service), remove_example_flows: bool = False, components_only: bool = False, ): @@ -184,7 +186,7 @@ def read_flow( session: Session = Depends(get_session), flow_id: UUID, current_user: User = Depends(get_current_active_user), - settings_service: "SettingsService" = Depends(get_settings_service), + settings_service: SettingsService = Depends(get_settings_service), ): """Read a flow.""" auth_settings = settings_service.auth_settings diff --git a/src/backend/base/langflow/api/v1/login.py b/src/backend/base/langflow/api/v1/login.py index 6eac5450e..1a53f352d 100644 --- a/src/backend/base/langflow/api/v1/login.py +++ b/src/backend/base/langflow/api/v1/login.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from fastapi import APIRouter, Depends, HTTPException, Request, Response, status from fastapi.security import OAuth2PasswordRequestForm from sqlmodel import Session @@ -127,7 +129,7 @@ async def auto_login( async def refresh_token( request: Request, response: Response, - settings_service: "SettingsService" = Depends(get_settings_service), + settings_service: SettingsService = Depends(get_settings_service), db: Session = Depends(get_session), ): auth_settings = settings_service.auth_settings diff --git a/src/backend/base/langflow/base/tools/flow_tool.py b/src/backend/base/langflow/base/tools/flow_tool.py index 8eb598ccb..d2bd68b78 100644 --- a/src/backend/base/langflow/base/tools/flow_tool.py +++ b/src/backend/base/langflow/base/tools/flow_tool.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import warnings from typing import Any @@ -18,7 +20,7 @@ class FlowTool(BaseTool): graph: Graph | None = None flow_id: str | None = None user_id: str | None = None - inputs: list["Vertex"] = [] + inputs: list[Vertex] = [] get_final_results_only: bool = True @property diff --git a/src/backend/base/langflow/graph/edge/base.py b/src/backend/base/langflow/graph/edge/base.py index 6ee13e9fb..6068a65c9 100644 --- a/src/backend/base/langflow/graph/edge/base.py +++ b/src/backend/base/langflow/graph/edge/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING, Any, cast from loguru import logger @@ -10,7 +12,7 @@ if TYPE_CHECKING: class Edge: - def __init__(self, source: "Vertex", target: "Vertex", edge: EdgeData): + def __init__(self, source: Vertex, target: Vertex, edge: EdgeData): self.source_id: str = source.id if source else "" self.target_id: str = target.id if target else "" self.valid_handles: bool = False @@ -207,13 +209,13 @@ class Edge: class CycleEdge(Edge): - def __init__(self, source: "Vertex", target: "Vertex", raw_edge: EdgeData): + def __init__(self, source: Vertex, target: Vertex, raw_edge: EdgeData): super().__init__(source, target, raw_edge) self.is_fulfilled = False # Whether the contract has been fulfilled. self.result: Any = None self.is_cycle = True - async def honor(self, source: "Vertex", target: "Vertex") -> None: + async def honor(self, source: Vertex, target: Vertex) -> None: """ Fulfills the contract by setting the result of the source vertex to the target vertex's parameter. If the edge is runnable, the source vertex is run with the message text and the target vertex's @@ -238,7 +240,7 @@ class CycleEdge(Edge): target.params[self.target_param] = self.result self.is_fulfilled = True - async def get_result_from_source(self, source: "Vertex", target: "Vertex"): + async def get_result_from_source(self, source: Vertex, target: Vertex): # Fulfill the contract if it has not been fulfilled. if not self.is_fulfilled: await self.honor(source, target) diff --git a/src/backend/base/langflow/graph/graph/schema.py b/src/backend/base/langflow/graph/graph/schema.py index 62ad99a27..06c138561 100644 --- a/src/backend/base/langflow/graph/graph/schema.py +++ b/src/backend/base/langflow/graph/graph/schema.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING, NamedTuple, Protocol from typing_extensions import NotRequired, TypedDict @@ -32,11 +34,11 @@ class GraphDump(TypedDict, total=False): class VertexBuildResult(NamedTuple): - result_dict: "ResultData" + result_dict: ResultData params: str valid: bool artifacts: dict - vertex: "Vertex" + vertex: Vertex class OutputConfigDict(TypedDict): diff --git a/src/backend/base/langflow/graph/utils.py b/src/backend/base/langflow/graph/utils.py index 43384768b..7afdd2283 100644 --- a/src/backend/base/langflow/graph/utils.py +++ b/src/backend/base/langflow/graph/utils.py @@ -1,7 +1,9 @@ +from __future__ import annotations + import json from collections.abc import Generator from enum import Enum -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any from uuid import UUID from langchain_core.documents import Document @@ -118,7 +120,7 @@ def post_process_raw(raw, artifact_type: str): return raw -def _vertex_to_primitive_dict(target: "Vertex") -> dict: +def _vertex_to_primitive_dict(target: Vertex) -> dict: """ Cleans the parameters of the target vertex. """ @@ -134,7 +136,7 @@ def _vertex_to_primitive_dict(target: "Vertex") -> dict: async def log_transaction( - flow_id: str | UUID, source: "Vertex", status, target: Optional["Vertex"] = None, error=None + flow_id: str | UUID, source: Vertex, status, target: Vertex | None = None, error=None ) -> None: try: if not get_settings_service().settings.transactions_storage_enabled: @@ -162,7 +164,7 @@ def log_vertex_build( vertex_id: str, valid: bool, params: Any, - data: "ResultDataResponse", + data: ResultDataResponse, artifacts: dict | None = None, ): try: diff --git a/src/backend/base/langflow/graph/vertex/base.py b/src/backend/base/langflow/graph/vertex/base.py index 7eb5f5974..6731d04cf 100644 --- a/src/backend/base/langflow/graph/vertex/base.py +++ b/src/backend/base/langflow/graph/vertex/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import ast import asyncio import inspect @@ -6,7 +8,7 @@ import traceback import types from collections.abc import AsyncIterator, Callable, Iterator, Mapping from enum import Enum -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any import pandas as pd from loguru import logger @@ -46,7 +48,7 @@ class Vertex: def __init__( self, data: NodeData, - graph: "Graph", + graph: Graph, base_type: str | None = None, is_task: bool = False, params: dict | None = None, @@ -108,7 +110,7 @@ class Vertex: def to_data(self): return self._data - def add_component_instance(self, component_instance: "Component"): + def add_component_instance(self, component_instance: Component): component_instance.set_vertex(self) self._custom_component = component_instance @@ -165,15 +167,15 @@ class Vertex: pass @property - def edges(self) -> list["CycleEdge"]: + def edges(self) -> list[CycleEdge]: return self.graph.get_vertex_edges(self.id) @property - def outgoing_edges(self) -> list["CycleEdge"]: + def outgoing_edges(self) -> list[CycleEdge]: return [edge for edge in self.edges if edge.source_id == self.id] @property - def incoming_edges(self) -> list["CycleEdge"]: + def incoming_edges(self) -> list[CycleEdge]: return [edge for edge in self.edges if edge.target_id == self.id] @property @@ -181,11 +183,11 @@ class Vertex: return {edge.source_handle.name for edge in self.edges} @property - def predecessors(self) -> list["Vertex"]: + def predecessors(self) -> list[Vertex]: return self.graph.get_predecessors(self) @property - def successors(self) -> list["Vertex"]: + def successors(self) -> list[Vertex]: return self.graph.get_successors(self) @property @@ -268,7 +270,7 @@ class Vertex: return AsyncResult(self.task_id) - def _set_params_from_normal_edge(self, params: dict, edge: "Edge", template_dict: dict): + def _set_params_from_normal_edge(self, params: dict, edge: Edge, template_dict: dict): param_key = edge.target_param # If the param_key is in the template_dict and the edge.target_id is the current node @@ -570,7 +572,7 @@ class Vertex: async def _build_dict_and_update_params( self, key, - vertices_dict: dict[str, "Vertex"], + vertices_dict: dict[str, Vertex], ): """ Iterates over a dictionary of vertices, builds each and updates the params dictionary. @@ -594,7 +596,7 @@ class Vertex: """ return all(self._is_vertex(vertex) for vertex in value) - async def get_result(self, requester: "Vertex", target_handle_name: str | None = None) -> Any: + async def get_result(self, requester: Vertex, target_handle_name: str | None = None) -> Any: """ Retrieves the result of the vertex. @@ -606,7 +608,7 @@ class Vertex: async with self._lock: return await self._get_result(requester, target_handle_name) - async def _get_result(self, requester: "Vertex", target_handle_name: str | None = None) -> Any: + async def _get_result(self, requester: Vertex, target_handle_name: str | None = None) -> Any: """ Retrieves the result of the built component. @@ -627,7 +629,7 @@ class Vertex: asyncio.create_task(log_transaction(str(flow_id), source=self, target=requester, status="success")) return result - async def _build_vertex_and_update_params(self, key, vertex: "Vertex"): + async def _build_vertex_and_update_params(self, key, vertex: Vertex): """ Builds a given vertex and updates the params dictionary accordingly. """ @@ -641,7 +643,7 @@ class Vertex: async def _build_list_of_vertices_and_update_params( self, key, - vertices: list["Vertex"], + vertices: list[Vertex], ): """ Iterates over a list of vertices, builds each and updates the params dictionary. @@ -711,7 +713,7 @@ class Vertex: msg = f"Error building Component {self.display_name}: \n\n{exc}" raise ComponentBuildException(msg, tb) from exc - def _update_built_object_and_artifacts(self, result: Any | tuple[Any, dict] | tuple["Component", Any, dict]): + def _update_built_object_and_artifacts(self, result: Any | tuple[Any, dict] | tuple[Component, Any, dict]): """ Updates the built object and its artifacts. """ @@ -769,7 +771,7 @@ class Vertex: user_id=None, inputs: dict[str, Any] | None = None, files: list[str] | None = None, - requester: Optional["Vertex"] = None, + requester: Vertex | None = None, event_manager: EventManager | None = None, **kwargs, ) -> Any: @@ -809,7 +811,7 @@ class Vertex: return await self.get_requester_result(requester) - async def get_requester_result(self, requester: Optional["Vertex"]): + async def get_requester_result(self, requester: Vertex | None): # If the requester is None, this means that # the Vertex is the root of the graph if requester is None: @@ -824,7 +826,7 @@ class Vertex: else await requester_edge.get_result_from_source(source=self, target=requester) ) - def add_edge(self, edge: "CycleEdge") -> None: + def add_edge(self, edge: CycleEdge) -> None: if edge not in self.edges: self.edges.append(edge) diff --git a/src/backend/base/langflow/graph/vertex/types.py b/src/backend/base/langflow/graph/vertex/types.py index 2e08784eb..29dfb9d3d 100644 --- a/src/backend/base/langflow/graph/vertex/types.py +++ b/src/backend/base/langflow/graph/vertex/types.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import contextlib import json @@ -75,7 +77,7 @@ class ComponentVertex(Vertex): for key, value in self._built_object.items(): self.add_result(key, value) - def get_edge_with_target(self, target_id: str) -> Generator["CycleEdge", None, None]: + def get_edge_with_target(self, target_id: str) -> Generator[CycleEdge, None, None]: """ Get the edge with the target id. @@ -89,7 +91,7 @@ class ComponentVertex(Vertex): if edge.target_id == target_id: yield edge - async def _get_result(self, requester: "Vertex", target_handle_name: str | None = None) -> Any: + async def _get_result(self, requester: Vertex, target_handle_name: str | None = None) -> Any: """ Retrieves the result of the built component. diff --git a/src/backend/base/langflow/graph/vertex/utils.py b/src/backend/base/langflow/graph/vertex/utils.py index d68b1b2fd..9af58ee6d 100644 --- a/src/backend/base/langflow/graph/vertex/utils.py +++ b/src/backend/base/langflow/graph/vertex/utils.py @@ -1,10 +1,12 @@ +from __future__ import annotations + from typing import TYPE_CHECKING if TYPE_CHECKING: from langflow.graph.vertex.base import Vertex -def build_clean_params(target: "Vertex") -> dict: +def build_clean_params(target: Vertex) -> dict: """ Cleans the parameters of the target vertex. """ diff --git a/src/backend/base/langflow/helpers/flow.py b/src/backend/base/langflow/helpers/flow.py index c4802d4de..aa1e22a20 100644 --- a/src/backend/base/langflow/helpers/flow.py +++ b/src/backend/base/langflow/helpers/flow.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections.abc import Awaitable, Callable from typing import TYPE_CHECKING, Any, cast from uuid import UUID @@ -42,7 +44,7 @@ def list_flows(*, user_id: str | None = None) -> list[Data]: async def load_flow( user_id: str, flow_id: str | None = None, flow_name: str | None = None, tweaks: dict | None = None -) -> "Graph": +) -> Graph: from langflow.graph.graph.base import Graph from langflow.processing.process import process_tweaks @@ -120,7 +122,7 @@ async def run_flow( def generate_function_for_flow( - inputs: list["Vertex"], flow_id: str, user_id: str | UUID | None + inputs: list[Vertex], flow_id: str, user_id: str | UUID | None ) -> Callable[..., Awaitable[Any]]: """ Generate a dynamic flow function based on the given inputs and flow ID. @@ -196,7 +198,7 @@ async def flow_function({func_args}): def build_function_and_schema( - flow_data: Data, graph: "Graph", user_id: str | UUID | None + flow_data: Data, graph: Graph, user_id: str | UUID | None ) -> tuple[Callable[..., Awaitable[Any]], type[BaseModel]]: """ Builds a dynamic function and schema for a given flow. @@ -215,7 +217,7 @@ def build_function_and_schema( return dynamic_flow_function, schema -def get_flow_inputs(graph: "Graph") -> list["Vertex"]: +def get_flow_inputs(graph: Graph) -> list[Vertex]: """ Retrieves the flow inputs from the given graph. @@ -232,7 +234,7 @@ def get_flow_inputs(graph: "Graph") -> list["Vertex"]: return inputs -def build_schema_from_inputs(name: str, inputs: list["Vertex"]) -> type[BaseModel]: +def build_schema_from_inputs(name: str, inputs: list[Vertex]) -> type[BaseModel]: """ Builds a schema from the given inputs. @@ -253,7 +255,7 @@ def build_schema_from_inputs(name: str, inputs: list["Vertex"]) -> type[BaseMode return create_model(name, **fields) # type: ignore -def get_arg_names(inputs: list["Vertex"]) -> list[dict[str, str]]: +def get_arg_names(inputs: list[Vertex]) -> list[dict[str, str]]: """ Returns a list of dictionaries containing the component name and its corresponding argument name. diff --git a/src/backend/base/langflow/interface/types.py b/src/backend/base/langflow/interface/types.py index 4a63aa1eb..e44a75de7 100644 --- a/src/backend/base/langflow/interface/types.py +++ b/src/backend/base/langflow/interface/types.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import json from typing import TYPE_CHECKING @@ -59,8 +61,8 @@ all_types_dict_cache = None async def get_and_cache_all_types_dict( - settings_service: "SettingsService", - cache_service: "CacheService", + settings_service: SettingsService, + cache_service: CacheService, force_refresh: bool = False, lock: asyncio.Lock | None = None, ): diff --git a/src/backend/base/langflow/processing/base.py b/src/backend/base/langflow/processing/base.py index 2ff2df9a3..03e00a5ed 100644 --- a/src/backend/base/langflow/processing/base.py +++ b/src/backend/base/langflow/processing/base.py @@ -1,4 +1,6 @@ -from typing import TYPE_CHECKING, Union +from __future__ import annotations + +from typing import TYPE_CHECKING from langchain_core.callbacks import BaseCallbackHandler from loguru import logger @@ -34,7 +36,7 @@ def get_langfuse_callback(trace_id): return None -def flush_langfuse_callback_if_present(callbacks: list[Union[BaseCallbackHandler, "CallbackHandler"]]): +def flush_langfuse_callback_if_present(callbacks: list[BaseCallbackHandler | CallbackHandler]): """ If langfuse callback is present, run callback.langfuse.flush() """ diff --git a/src/backend/base/langflow/processing/process.py b/src/backend/base/langflow/processing/process.py index dee2e6c16..48079ae6c 100644 --- a/src/backend/base/langflow/processing/process.py +++ b/src/backend/base/langflow/processing/process.py @@ -1,4 +1,6 @@ -from typing import TYPE_CHECKING, Any, Union, cast +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, cast from loguru import logger from pydantic import BaseModel @@ -20,11 +22,11 @@ class Result(BaseModel): async def run_graph_internal( - graph: "Graph", + graph: Graph, flow_id: str, stream: bool = False, session_id: str | None = None, - inputs: list["InputValueRequest"] | None = None, + inputs: list[InputValueRequest] | None = None, outputs: list[str] | None = None, ) -> tuple[list[RunOutputs], str]: """Run the graph and generate the result""" @@ -56,7 +58,7 @@ async def run_graph_internal( def run_graph( - graph: "Graph", + graph: Graph, input_value: str, input_type: str, output_type: str, @@ -109,7 +111,7 @@ def run_graph( def validate_input( - graph_data: dict[str, Any], tweaks: Union["Tweaks", dict[str, str | dict[str, Any]]] + graph_data: dict[str, Any], tweaks: Tweaks | dict[str, str | dict[str, Any]] ) -> list[dict[str, Any]]: if not isinstance(graph_data, dict) or not isinstance(tweaks, dict): msg = "graph_data and tweaks should be dictionaries" @@ -151,7 +153,7 @@ def apply_tweaks_on_vertex(vertex: Vertex, node_tweaks: dict[str, Any]) -> None: def process_tweaks( - graph_data: dict[str, Any], tweaks: Union["Tweaks", dict[str, dict[str, Any]]], stream: bool = False + graph_data: dict[str, Any], tweaks: Tweaks | dict[str, dict[str, Any]], stream: bool = False ) -> dict[str, Any]: """ This function is used to tweak the graph data using the node id and the tweaks dict. diff --git a/src/backend/base/langflow/services/auth/service.py b/src/backend/base/langflow/services/auth/service.py index 5c3a89af6..fd7de2785 100644 --- a/src/backend/base/langflow/services/auth/service.py +++ b/src/backend/base/langflow/services/auth/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.base import Service @@ -9,5 +11,5 @@ if TYPE_CHECKING: class AuthService(Service): name = "auth_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service diff --git a/src/backend/base/langflow/services/cache/factory.py b/src/backend/base/langflow/services/cache/factory.py index 5b6e74bc7..f9b1eac7e 100644 --- a/src/backend/base/langflow/services/cache/factory.py +++ b/src/backend/base/langflow/services/cache/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.logging.logger import logger @@ -13,7 +15,7 @@ class CacheServiceFactory(ServiceFactory): def __init__(self): super().__init__(CacheService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): # Here you would have logic to create and configure a CacheService # based on the settings_service diff --git a/src/backend/base/langflow/services/database/factory.py b/src/backend/base/langflow/services/database/factory.py index 6593c5c23..e57959053 100644 --- a/src/backend/base/langflow/services/database/factory.py +++ b/src/backend/base/langflow/services/database/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.database.service import DatabaseService @@ -11,7 +13,7 @@ class DatabaseServiceFactory(ServiceFactory): def __init__(self): super().__init__(DatabaseService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): # Here you would have logic to create and configure a DatabaseService if not settings_service.settings.database_url: msg = "No database URL provided" diff --git a/src/backend/base/langflow/services/database/service.py b/src/backend/base/langflow/services/database/service.py index 1e0a5d52c..c4d0667b8 100644 --- a/src/backend/base/langflow/services/database/service.py +++ b/src/backend/base/langflow/services/database/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import time from contextlib import contextmanager from datetime import datetime @@ -32,7 +34,7 @@ if TYPE_CHECKING: class DatabaseService(Service): name = "database_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service if settings_service.settings.database_url is None: msg = "No database URL provided" @@ -45,7 +47,7 @@ class DatabaseService(Service): self.alembic_cfg_path = langflow_dir / "alembic.ini" self.engine = self._create_engine() - def _create_engine(self) -> "Engine": + def _create_engine(self) -> Engine: """Create the engine for the database.""" if self.settings_service.settings.database_url and self.settings_service.settings.database_url.startswith( "sqlite" diff --git a/src/backend/base/langflow/services/deps.py b/src/backend/base/langflow/services/deps.py index f2670445e..d43d9cc82 100644 --- a/src/backend/base/langflow/services/deps.py +++ b/src/backend/base/langflow/services/deps.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections.abc import Generator from contextlib import contextmanager from typing import TYPE_CHECKING @@ -45,7 +47,7 @@ def get_service(service_type: ServiceType, default=None): return service_manager.get(service_type, default) # type: ignore -def get_telemetry_service() -> "TelemetryService": +def get_telemetry_service() -> TelemetryService: """ Retrieves the TelemetryService instance from the service manager. @@ -57,7 +59,7 @@ def get_telemetry_service() -> "TelemetryService": return get_service(ServiceType.TELEMETRY_SERVICE, TelemetryServiceFactory()) # type: ignore -def get_tracing_service() -> "TracingService": +def get_tracing_service() -> TracingService: """ Retrieves the TracingService instance from the service manager. @@ -69,7 +71,7 @@ def get_tracing_service() -> "TracingService": return get_service(ServiceType.TRACING_SERVICE, TracingServiceFactory()) # type: ignore -def get_state_service() -> "StateService": +def get_state_service() -> StateService: """ Retrieves the StateService instance from the service manager. @@ -81,7 +83,7 @@ def get_state_service() -> "StateService": return get_service(ServiceType.STATE_SERVICE, StateServiceFactory()) # type: ignore -def get_socket_service() -> "SocketIOService": +def get_socket_service() -> SocketIOService: """ Get the SocketIOService instance from the service manager. @@ -91,7 +93,7 @@ def get_socket_service() -> "SocketIOService": return get_service(ServiceType.SOCKETIO_SERVICE) # type: ignore -def get_storage_service() -> "StorageService": +def get_storage_service() -> StorageService: """ Retrieves the storage service instance. @@ -103,7 +105,7 @@ def get_storage_service() -> "StorageService": return get_service(ServiceType.STORAGE_SERVICE, default=StorageServiceFactory()) # type: ignore -def get_variable_service() -> "VariableService": +def get_variable_service() -> VariableService: """ Retrieves the VariableService instance from the service manager. @@ -116,7 +118,7 @@ def get_variable_service() -> "VariableService": return get_service(ServiceType.VARIABLE_SERVICE, VariableServiceFactory()) # type: ignore -def get_plugins_service() -> "PluginService": +def get_plugins_service() -> PluginService: """ Get the PluginService instance from the service manager. @@ -126,7 +128,7 @@ def get_plugins_service() -> "PluginService": return get_service(ServiceType.PLUGIN_SERVICE) # type: ignore -def get_settings_service() -> "SettingsService": +def get_settings_service() -> SettingsService: """ Retrieves the SettingsService instance. @@ -143,7 +145,7 @@ def get_settings_service() -> "SettingsService": return get_service(ServiceType.SETTINGS_SERVICE, SettingsServiceFactory()) # type: ignore -def get_db_service() -> "DatabaseService": +def get_db_service() -> DatabaseService: """ Retrieves the DatabaseService instance from the service manager. @@ -156,7 +158,7 @@ def get_db_service() -> "DatabaseService": return get_service(ServiceType.DATABASE_SERVICE, DatabaseServiceFactory()) # type: ignore -def get_session() -> Generator["Session", None, None]: +def get_session() -> Generator[Session, None, None]: """ Retrieves a session from the database service. @@ -169,7 +171,7 @@ def get_session() -> Generator["Session", None, None]: @contextmanager -def session_scope() -> Generator["Session", None, None]: +def session_scope() -> Generator[Session, None, None]: """ Context manager for managing a session scope. @@ -195,7 +197,7 @@ def session_scope() -> Generator["Session", None, None]: raise -def get_cache_service() -> "CacheService": +def get_cache_service() -> CacheService: """ Retrieves the cache service from the service manager. @@ -207,7 +209,7 @@ def get_cache_service() -> "CacheService": return get_service(ServiceType.CACHE_SERVICE, CacheServiceFactory()) # type: ignore -def get_session_service() -> "SessionService": +def get_session_service() -> SessionService: """ Retrieves the session service from the service manager. @@ -219,7 +221,7 @@ def get_session_service() -> "SessionService": return get_service(ServiceType.SESSION_SERVICE, SessionServiceFactory()) # type: ignore -def get_task_service() -> "TaskService": +def get_task_service() -> TaskService: """ Retrieves the TaskService instance from the service manager. @@ -232,7 +234,7 @@ def get_task_service() -> "TaskService": return get_service(ServiceType.TASK_SERVICE, TaskServiceFactory()) # type: ignore -def get_chat_service() -> "ChatService": +def get_chat_service() -> ChatService: """ Get the chat service instance. @@ -242,7 +244,7 @@ def get_chat_service() -> "ChatService": return get_service(ServiceType.CHAT_SERVICE) # type: ignore -def get_store_service() -> "StoreService": +def get_store_service() -> StoreService: """ Retrieves the StoreService instance from the service manager. diff --git a/src/backend/base/langflow/services/plugins/factory.py b/src/backend/base/langflow/services/plugins/factory.py index 586dcb0ff..0d984ba48 100644 --- a/src/backend/base/langflow/services/plugins/factory.py +++ b/src/backend/base/langflow/services/plugins/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.factory import ServiceFactory @@ -11,5 +13,5 @@ class PluginServiceFactory(ServiceFactory): def __init__(self): super().__init__(PluginService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): return PluginService(settings_service) diff --git a/src/backend/base/langflow/services/plugins/langfuse_plugin.py b/src/backend/base/langflow/services/plugins/langfuse_plugin.py index 242e656c3..d57fcb868 100644 --- a/src/backend/base/langflow/services/plugins/langfuse_plugin.py +++ b/src/backend/base/langflow/services/plugins/langfuse_plugin.py @@ -1,4 +1,6 @@ -from typing import TYPE_CHECKING, Optional +from __future__ import annotations + +from typing import TYPE_CHECKING from loguru import logger @@ -10,7 +12,7 @@ if TYPE_CHECKING: class LangfuseInstance: - _instance: Optional["Langfuse"] = None + _instance: Langfuse | None = None @classmethod def get(cls): diff --git a/src/backend/base/langflow/services/plugins/service.py b/src/backend/base/langflow/services/plugins/service.py index 6b8ac0fb1..b0581fb12 100644 --- a/src/backend/base/langflow/services/plugins/service.py +++ b/src/backend/base/langflow/services/plugins/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib import inspect import os @@ -15,7 +17,7 @@ if TYPE_CHECKING: class PluginService(Service): name = "plugin_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.plugins: dict[str, BasePlugin] = {} # plugin_dir = settings_service.settings.PLUGIN_DIR self.plugin_dir = os.path.dirname(__file__) diff --git a/src/backend/base/langflow/services/settings/manager.py b/src/backend/base/langflow/services/settings/manager.py index 8354050ec..63284c13c 100644 --- a/src/backend/base/langflow/services/settings/manager.py +++ b/src/backend/base/langflow/services/settings/manager.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import yaml @@ -17,7 +19,7 @@ class SettingsService(Service): self.auth_settings = auth_settings @classmethod - def load_settings_from_yaml(cls, file_path: str) -> "SettingsService": + def load_settings_from_yaml(cls, file_path: str) -> SettingsService: # Check if a string is a valid path or a file name if "/" not in file_path: # Get current path diff --git a/src/backend/base/langflow/services/settings/service.py b/src/backend/base/langflow/services/settings/service.py index ebcaae044..a633de6f6 100644 --- a/src/backend/base/langflow/services/settings/service.py +++ b/src/backend/base/langflow/services/settings/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from langflow.services.base import Service from langflow.services.settings.auth import AuthSettings from langflow.services.settings.base import Settings @@ -12,7 +14,7 @@ class SettingsService(Service): self.auth_settings: AuthSettings = auth_settings @classmethod - def initialize(cls) -> "SettingsService": + def initialize(cls) -> SettingsService: # Check if a string is a valid path or a file name settings = Settings() diff --git a/src/backend/base/langflow/services/storage/service.py b/src/backend/base/langflow/services/storage/service.py index 15f51d65c..62eff6ab0 100644 --- a/src/backend/base/langflow/services/storage/service.py +++ b/src/backend/base/langflow/services/storage/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from abc import abstractmethod from typing import TYPE_CHECKING @@ -11,7 +13,7 @@ if TYPE_CHECKING: class StorageService(Service): name = "storage_service" - def __init__(self, session_service: "SessionService", settings_service: "SettingsService"): + def __init__(self, session_service: SessionService, settings_service: SettingsService): self.settings_service = settings_service self.session_service = session_service self.set_ready() diff --git a/src/backend/base/langflow/services/store/factory.py b/src/backend/base/langflow/services/store/factory.py index 2bdc918bd..3b668a226 100644 --- a/src/backend/base/langflow/services/store/factory.py +++ b/src/backend/base/langflow/services/store/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.factory import ServiceFactory @@ -11,5 +13,5 @@ class StoreServiceFactory(ServiceFactory): def __init__(self): super().__init__(StoreService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): return StoreService(settings_service) diff --git a/src/backend/base/langflow/services/store/service.py b/src/backend/base/langflow/services/store/service.py index 09057dbb0..c76392e9d 100644 --- a/src/backend/base/langflow/services/store/service.py +++ b/src/backend/base/langflow/services/store/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json from typing import TYPE_CHECKING, Any from uuid import UUID @@ -31,7 +33,7 @@ user_data_var: ContextVar[dict[str, Any] | None] = ContextVar("user_data", defau @asynccontextmanager -async def user_data_context(store_service: "StoreService", api_key: str | None = None): +async def user_data_context(store_service: StoreService, api_key: str | None = None): # Fetch and set user data to the context variable if api_key: try: @@ -78,7 +80,7 @@ class StoreService(Service): name = "store_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service self.base_url = self.settings_service.settings.store_url self.download_webhook_url = self.settings_service.settings.download_webhook_url diff --git a/src/backend/base/langflow/services/task/service.py b/src/backend/base/langflow/services/task/service.py index 3fca26e55..e4781e849 100644 --- a/src/backend/base/langflow/services/task/service.py +++ b/src/backend/base/langflow/services/task/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections.abc import Callable, Coroutine from typing import TYPE_CHECKING, Any @@ -27,7 +29,7 @@ def check_celery_availability(): class TaskService(Service): name = "task_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service try: if self.settings_service.settings.celery_enabled: diff --git a/src/backend/base/langflow/services/telemetry/factory.py b/src/backend/base/langflow/services/telemetry/factory.py index 86f048112..6368377a4 100644 --- a/src/backend/base/langflow/services/telemetry/factory.py +++ b/src/backend/base/langflow/services/telemetry/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.factory import ServiceFactory @@ -11,5 +13,5 @@ class TelemetryServiceFactory(ServiceFactory): def __init__(self): super().__init__(TelemetryService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): return TelemetryService(settings_service) diff --git a/src/backend/base/langflow/services/telemetry/service.py b/src/backend/base/langflow/services/telemetry/service.py index 59b95ec6f..532c110d9 100644 --- a/src/backend/base/langflow/services/telemetry/service.py +++ b/src/backend/base/langflow/services/telemetry/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import contextlib import os @@ -27,7 +29,7 @@ if TYPE_CHECKING: class TelemetryService(Service): name = "telemetry_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): super().__init__() self.settings_service = settings_service self.base_url = settings_service.settings.telemetry_base_url diff --git a/src/backend/base/langflow/services/tracing/base.py b/src/backend/base/langflow/services/tracing/base.py index f1012f6ed..f4bda77f1 100644 --- a/src/backend/base/langflow/services/tracing/base.py +++ b/src/backend/base/langflow/services/tracing/base.py @@ -1,5 +1,7 @@ +from __future__ import annotations + from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any from uuid import UUID from langflow.services.tracing.schema import Log @@ -27,7 +29,7 @@ class BaseTracer(ABC): trace_type: str, inputs: dict[str, Any], metadata: dict[str, Any] | None = None, - vertex: Optional["Vertex"] = None, + vertex: Vertex | None = None, ): raise NotImplementedError @@ -53,5 +55,5 @@ class BaseTracer(ABC): raise NotImplementedError @abstractmethod - def get_langchain_callback(self) -> Optional["BaseCallbackHandler"]: + def get_langchain_callback(self) -> BaseCallbackHandler | None: raise NotImplementedError diff --git a/src/backend/base/langflow/services/tracing/factory.py b/src/backend/base/langflow/services/tracing/factory.py index e179d2118..5b8fe5508 100644 --- a/src/backend/base/langflow/services/tracing/factory.py +++ b/src/backend/base/langflow/services/tracing/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.factory import ServiceFactory @@ -11,5 +13,5 @@ class TracingServiceFactory(ServiceFactory): def __init__(self): super().__init__(TracingService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): return TracingService(settings_service) diff --git a/src/backend/base/langflow/services/tracing/langsmith.py b/src/backend/base/langflow/services/tracing/langsmith.py index 063afd451..209f7fd5f 100644 --- a/src/backend/base/langflow/services/tracing/langsmith.py +++ b/src/backend/base/langflow/services/tracing/langsmith.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import os import traceback import types from datetime import datetime, timezone -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any from uuid import UUID from loguru import logger @@ -65,7 +67,7 @@ class LangSmithTracer(BaseTracer): trace_type: str, inputs: dict[str, Any], metadata: dict[str, Any] | None = None, - vertex: Optional["Vertex"] = None, + vertex: Vertex | None = None, ): if not self._ready: return @@ -161,5 +163,5 @@ class LangSmithTracer(BaseTracer): self._run_tree.post() self._run_link = self._run_tree.get_url() - def get_langchain_callback(self) -> Optional["BaseCallbackHandler"]: + def get_langchain_callback(self) -> BaseCallbackHandler | None: return None diff --git a/src/backend/base/langflow/services/tracing/service.py b/src/backend/base/langflow/services/tracing/service.py index 810b1d910..57a392547 100644 --- a/src/backend/base/langflow/services/tracing/service.py +++ b/src/backend/base/langflow/services/tracing/service.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import asyncio import os from collections import defaultdict from contextlib import asynccontextmanager -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any from uuid import UUID from loguru import logger @@ -40,7 +42,7 @@ def _get_langfuse_tracer(): class TracingService(Service): name = "tracing_service" - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service self.inputs: dict[str, dict] = defaultdict(dict) self.inputs_metadata: dict[str, dict] = defaultdict(dict) @@ -155,7 +157,7 @@ class TracingService(Service): trace_type: str, inputs: dict[str, Any], metadata: dict[str, Any] | None = None, - vertex: Optional["Vertex"] = None, + vertex: Vertex | None = None, ): inputs = self._cleanup_inputs(inputs) self.inputs[trace_name] = inputs @@ -203,7 +205,7 @@ class TracingService(Service): @asynccontextmanager async def trace_context( self, - component: "Component", + component: Component, trace_name: str, inputs: dict[str, Any], metadata: dict[str, Any] | None = None, @@ -248,7 +250,7 @@ class TracingService(Service): inputs[key] = "*****" # avoid logging api_keys for security reasons return inputs - def get_langchain_callbacks(self) -> list["BaseCallbackHandler"]: + def get_langchain_callbacks(self) -> list[BaseCallbackHandler]: callbacks = [] for tracer in self._tracers.values(): if not tracer.ready: # type: ignore diff --git a/src/backend/base/langflow/services/variable/factory.py b/src/backend/base/langflow/services/variable/factory.py index c81511244..60a327673 100644 --- a/src/backend/base/langflow/services/variable/factory.py +++ b/src/backend/base/langflow/services/variable/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING from langflow.services.factory import ServiceFactory @@ -11,7 +13,7 @@ class VariableServiceFactory(ServiceFactory): def __init__(self): super().__init__(VariableService) - def create(self, settings_service: "SettingsService"): + def create(self, settings_service: SettingsService): # here you would have logic to create and configure a VariableService # based on the settings_service diff --git a/src/backend/base/langflow/services/variable/kubernetes.py b/src/backend/base/langflow/services/variable/kubernetes.py index c5970fb92..ff11b78d9 100644 --- a/src/backend/base/langflow/services/variable/kubernetes.py +++ b/src/backend/base/langflow/services/variable/kubernetes.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from uuid import UUID @@ -14,7 +16,7 @@ from langflow.services.variable.kubernetes_secrets import KubernetesSecretManage class KubernetesSecretService(VariableService, Service): - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service # TODO: settings_service to set kubernetes namespace self.kubernetes_secrets = KubernetesSecretManager() diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index ab9cade98..77e44a9a1 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from datetime import datetime, timezone from typing import TYPE_CHECKING @@ -19,7 +21,7 @@ if TYPE_CHECKING: class DatabaseVariableService(VariableService, Service): - def __init__(self, settings_service: "SettingsService"): + def __init__(self, settings_service: SettingsService): self.settings_service = settings_service def initialize_user_variables(self, user_id: UUID | str, session: Session = Depends(get_session)): diff --git a/src/backend/base/langflow/worker.py b/src/backend/base/langflow/worker.py index 46a0a665b..2e4b6c1fc 100644 --- a/src/backend/base/langflow/worker.py +++ b/src/backend/base/langflow/worker.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING, Any from asgiref.sync import async_to_sync @@ -15,7 +17,7 @@ def test_celery(word: str) -> str: @celery_app.task(bind=True, soft_time_limit=30, max_retries=3) -def build_vertex(self, vertex: "Vertex") -> "Vertex": +def build_vertex(self, vertex: Vertex) -> Vertex: """ Build a vertex """ diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index ea1cb6c40..9a4783969 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -157,6 +157,7 @@ select = [ "E", "EM", "F", + "FA", "FLY", "FURB", "I",