ref: Add some postponed annotations evaluations (#3990)
Add some postponed annotations evaluations
This commit is contained in:
parent
942c8dca36
commit
426719607b
38 changed files with 176 additions and 101 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
):
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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__)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@ select = [
|
|||
"E",
|
||||
"EM",
|
||||
"F",
|
||||
"FA",
|
||||
"FLY",
|
||||
"FURB",
|
||||
"I",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue