ref: Add ruff rules for arguments (ARG) (#4123)

Add ruff rules for arguments (ARG)
This commit is contained in:
Christophe Bornet 2024-10-14 17:37:41 +02:00 • committed by GitHub
commit 9a666c1b50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
49 changed files with 138 additions and 144 deletions

View file

@ -95,12 +95,12 @@ def run(
), ),
log_level: str | None = typer.Option(None, help="Logging level.", show_default=False), log_level: str | None = typer.Option(None, help="Logging level.", show_default=False),
log_file: Path | None = typer.Option(None, help="Path to the log file.", show_default=False), log_file: Path | None = typer.Option(None, help="Path to the log file.", show_default=False),
cache: str | None = typer.Option( cache: str | None = typer.Option( # noqa: ARG001
None, None,
help="Type of cache to use. (InMemoryCache, SQLiteCache)", help="Type of cache to use. (InMemoryCache, SQLiteCache)",
show_default=False, show_default=False,
), ),
dev: bool | None = typer.Option(None, help="Run in development mode (may contain bugs)", show_default=False), dev: bool | None = typer.Option(None, help="Run in development mode (may contain bugs)", show_default=False), # noqa: ARG001
frontend_path: str | None = typer.Option( frontend_path: str | None = typer.Option(
None, None,
help="Path to the frontend directory containing build files. This is for development purposes only.", help="Path to the frontend directory containing build files. This is for development purposes only.",
@ -111,7 +111,7 @@ def run(
help="Open the browser after starting the server.", help="Open the browser after starting the server.",
show_default=False, show_default=False,
), ),
remove_api_keys: bool | None = typer.Option( remove_api_keys: bool | None = typer.Option( # noqa: ARG001
None, None,
help="Remove API keys from the projects saved in the database.", help="Remove API keys from the projects saved in the database.",
show_default=False, show_default=False,
@ -121,27 +121,27 @@ def run(
help="Run only the backend server without the frontend.", help="Run only the backend server without the frontend.",
show_default=False, show_default=False,
), ),
store: bool | None = typer.Option( store: bool | None = typer.Option( # noqa: ARG001
None, None,
help="Enables the store features.", help="Enables the store features.",
show_default=False, show_default=False,
), ),
auto_saving: bool | None = typer.Option( auto_saving: bool | None = typer.Option( # noqa: ARG001
None, None,
help="Defines if the auto save is enabled.", help="Defines if the auto save is enabled.",
show_default=False, show_default=False,
), ),
auto_saving_interval: int | None = typer.Option( auto_saving_interval: int | None = typer.Option( # noqa: ARG001
None, None,
help="Defines the debounce time for the auto save.", help="Defines the debounce time for the auto save.",
show_default=False, show_default=False,
), ),
health_check_max_retries: bool | None = typer.Option( health_check_max_retries: bool | None = typer.Option( # noqa: ARG001
None, None,
help="Defines the number of retries for the health check.", help="Defines the number of retries for the health check.",
show_default=False, show_default=False,
), ),
max_file_size_upload: int | None = typer.Option( max_file_size_upload: int | None = typer.Option( # noqa: ARG001
None, None,
help="Defines the maximum file size for the upload in MB.", help="Defines the maximum file size for the upload in MB.",
show_default=False, show_default=False,

View file

@ -46,10 +46,9 @@ def create_api_key_route(
raise HTTPException(status_code=400, detail=str(e)) from e raise HTTPException(status_code=400, detail=str(e)) from e
@router.delete("/{api_key_id}") @router.delete("/{api_key_id}", dependencies=[Depends(auth_utils.get_current_active_user)])
def delete_api_key_route( def delete_api_key_route(
api_key_id: UUID, api_key_id: UUID,
current_user=Depends(auth_utils.get_current_active_user),
db: Session = Depends(get_session), db: Session = Depends(get_session),
): ):
try: try:

View file

@ -6,6 +6,7 @@ from uuid import UUID
from langchain_core.agents import AgentAction, AgentFinish from langchain_core.agents import AgentAction, AgentFinish
from langchain_core.callbacks.base import AsyncCallbackHandler from langchain_core.callbacks.base import AsyncCallbackHandler
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.api.v1.schemas import ChatResponse, PromptResponse from langflow.api.v1.schemas import ChatResponse, PromptResponse
from langflow.services.deps import get_chat_service, get_socket_service from langflow.services.deps import get_chat_service, get_socket_service
@ -31,11 +32,13 @@ class AsyncStreamingLLMCallbackHandleSIO(AsyncCallbackHandler):
self.sid = session_id self.sid = session_id
# self.socketio_service = self.chat_service.active_connections[self.client_id] # self.socketio_service = self.chat_service.active_connections[self.client_id]
async def on_llm_new_token(self, token: str, **kwargs: Any) -> None: @override
async def on_llm_new_token(self, token: str, **kwargs: Any) -> None: # type: ignore[misc]
resp = ChatResponse(message=token, type="stream", intermediate_steps="") resp = ChatResponse(message=token, type="stream", intermediate_steps="")
await self.socketio_service.emit_token(to=self.sid, data=resp.model_dump()) await self.socketio_service.emit_token(to=self.sid, data=resp.model_dump())
async def on_tool_start(self, serialized: dict[str, Any], input_str: str, **kwargs: Any) -> Any: @override
async def on_tool_start(self, serialized: dict[str, Any], input_str: str, **kwargs: Any) -> Any: # type: ignore[misc]
"""Run when tool starts running.""" """Run when tool starts running."""
resp = ChatResponse( resp = ChatResponse(
message="", message="",
@ -88,7 +91,10 @@ class AsyncStreamingLLMCallbackHandleSIO(AsyncCallbackHandler):
) -> None: ) -> None:
"""Run when tool errors.""" """Run when tool errors."""
async def on_text(self, text: str, **kwargs: Any) -> Any: @override
async def on_text( # type: ignore[misc]
self, text: str, **kwargs: Any
) -> Any:
"""Run on arbitrary text.""" """Run on arbitrary text."""
# This runs when first sending the prompt # This runs when first sending the prompt
# to the LLM, adding it will send the final prompt # to the LLM, adding it will send the final prompt
@ -101,7 +107,10 @@ class AsyncStreamingLLMCallbackHandleSIO(AsyncCallbackHandler):
) )
await self.socketio_service.emit_message(to=self.sid, data=resp.model_dump()) await self.socketio_service.emit_message(to=self.sid, data=resp.model_dump())
async def on_agent_action(self, action: AgentAction, **kwargs: Any): @override
async def on_agent_action( # type: ignore[misc]
self, action: AgentAction, **kwargs: Any
):
log = f"Thought: {action.log}" log = f"Thought: {action.log}"
# if there are line breaks, split them and send them # if there are line breaks, split them and send them
# as separate messages # as separate messages
@ -114,7 +123,10 @@ class AsyncStreamingLLMCallbackHandleSIO(AsyncCallbackHandler):
resp = ChatResponse(message="", type="stream", intermediate_steps=log) resp = ChatResponse(message="", type="stream", intermediate_steps=log)
await self.socketio_service.emit_token(to=self.sid, data=resp.model_dump()) await self.socketio_service.emit_token(to=self.sid, data=resp.model_dump())
async def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any: @override
async def on_agent_finish( # type: ignore[misc]
self, finish: AgentFinish, **kwargs: Any
) -> Any:
"""Run on agent end.""" """Run on agent end."""
resp = ChatResponse( resp = ChatResponse(
message="", message="",

View file

@ -40,13 +40,12 @@ from langflow.graph.utils import log_vertex_build
from langflow.schema.schema import OutputValue from langflow.schema.schema import OutputValue
from langflow.services.auth.utils import get_current_active_user from langflow.services.auth.utils import get_current_active_user
from langflow.services.chat.service import ChatService from langflow.services.chat.service import ChatService
from langflow.services.deps import get_chat_service, get_session, get_session_service, get_telemetry_service from langflow.services.deps import get_chat_service, get_session, get_telemetry_service
from langflow.services.telemetry.schema import ComponentPayload, PlaygroundPayload from langflow.services.telemetry.schema import ComponentPayload, PlaygroundPayload
from langflow.services.telemetry.service import TelemetryService from langflow.services.telemetry.service import TelemetryService
if TYPE_CHECKING: if TYPE_CHECKING:
from langflow.graph.vertex.types import InterfaceVertex from langflow.graph.vertex.types import InterfaceVertex
from langflow.services.session.service import SessionService
router = APIRouter(tags=["Chat"]) router = APIRouter(tags=["Chat"])
@ -696,9 +695,7 @@ async def _stream_vertex(flow_id: str, vertex_id: str, chat_service: ChatService
async def build_vertex_stream( async def build_vertex_stream(
flow_id: uuid.UUID, flow_id: uuid.UUID,
vertex_id: str, vertex_id: str,
session_id: str | None = None,
chat_service: ChatService = Depends(get_chat_service), chat_service: ChatService = Depends(get_chat_service),
session_service: SessionService = Depends(get_session_service),
): ):
"""Build a vertex instead of the entire graph. """Build a vertex instead of the entire graph.

View file

@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import time import time
from asyncio import Lock
from http import HTTPStatus from http import HTTPStatus
from typing import TYPE_CHECKING, Annotated from typing import TYPE_CHECKING, Annotated
from uuid import UUID from uuid import UUID
@ -41,7 +40,6 @@ from langflow.services.database.models.flow.model import FlowRead
from langflow.services.database.models.flow.utils import get_all_webhook_components_in_flow from langflow.services.database.models.flow.utils import get_all_webhook_components_in_flow
from langflow.services.database.models.user.model import User, UserRead from langflow.services.database.models.user.model import User, UserRead
from langflow.services.deps import ( from langflow.services.deps import (
get_cache_service,
get_session, get_session,
get_session_service, get_session_service,
get_settings_service, get_settings_service,
@ -49,13 +47,11 @@ from langflow.services.deps import (
get_telemetry_service, get_telemetry_service,
) )
from langflow.services.session.service import SessionService from langflow.services.session.service import SessionService
from langflow.services.task.service import TaskService
from langflow.services.telemetry.schema import RunPayload from langflow.services.telemetry.schema import RunPayload
from langflow.services.telemetry.service import TelemetryService from langflow.services.telemetry.service import TelemetryService
from langflow.utils.version import get_version_info from langflow.utils.version import get_version_info
if TYPE_CHECKING: if TYPE_CHECKING:
from langflow.services.cache.base import CacheService
from langflow.services.settings.service import SettingsService from langflow.services.settings.service import SettingsService
router = APIRouter(tags=["Base"]) router = APIRouter(tags=["Base"])
@ -64,16 +60,11 @@ router = APIRouter(tags=["Base"])
@router.get("/all", dependencies=[Depends(get_current_active_user)]) @router.get("/all", dependencies=[Depends(get_current_active_user)])
async def get_all( async def get_all(
settings_service=Depends(get_settings_service), settings_service=Depends(get_settings_service),
cache_service: CacheService = Depends(dependency=get_cache_service),
force_refresh: bool = False,
): ):
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.types import get_and_cache_all_types_dict
try: try:
async with Lock() as lock: return await get_and_cache_all_types_dict(settings_service=settings_service)
return await get_and_cache_all_types_dict(
settings_service=settings_service, cache_service=cache_service, force_refresh=force_refresh, lock=lock
)
except Exception as exc: except Exception as exc:
raise HTTPException(status_code=500, detail=str(exc)) from exc raise HTTPException(status_code=500, detail=str(exc)) from exc
@ -496,19 +487,9 @@ async def experimental_run_flow(
@router.post( @router.post(
"/process/{flow_id}", "/process/{flow_id}",
response_model=ProcessResponse, response_model=ProcessResponse,
dependencies=[Depends(api_key_security)],
) )
async def process( async def process():
session: Annotated[Session, Depends(get_session)],
flow_id: str,
inputs: list[dict] | dict | None = None,
tweaks: dict | None = None,
clear_cache: Annotated[bool, Body(embed=True)] = False,
session_id: Annotated[None | str, Body(embed=True)] = None,
task_service: TaskService = Depends(get_task_service),
api_key_user: UserRead = Depends(api_key_security),
sync: Annotated[bool, Body(embed=True)] = True,
session_service: SessionService = Depends(get_session_service),
):
"""Endpoint to process an input with a given flow_id.""" """Endpoint to process an input with a given flow_id."""
# Raise a depreciation warning # Raise a depreciation warning
logger.warning( logger.warning(

View file

@ -10,7 +10,6 @@ from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.message.model import MessageRead, MessageTable, MessageUpdate from langflow.services.database.models.message.model import MessageRead, MessageTable, MessageUpdate
from langflow.services.database.models.transactions.crud import get_transactions_by_flow_id from langflow.services.database.models.transactions.crud import get_transactions_by_flow_id
from langflow.services.database.models.transactions.model import TransactionReadResponse from langflow.services.database.models.transactions.model import TransactionReadResponse
from langflow.services.database.models.user.model import User
from langflow.services.database.models.vertex_builds.crud import ( from langflow.services.database.models.vertex_builds.crud import (
delete_vertex_builds_by_flow_id, delete_vertex_builds_by_flow_id,
get_vertex_builds_by_flow_id, get_vertex_builds_by_flow_id,
@ -72,11 +71,10 @@ async def get_messages(
raise HTTPException(status_code=500, detail=str(e)) from e raise HTTPException(status_code=500, detail=str(e)) from e
@router.delete("/messages", status_code=204) @router.delete("/messages", status_code=204, dependencies=[Depends(get_current_active_user)])
async def delete_messages( async def delete_messages(
message_ids: list[UUID], message_ids: list[UUID],
session: Annotated[Session, Depends(get_session)], session: Annotated[Session, Depends(get_session)],
current_user: Annotated[User, Depends(get_current_active_user)],
): ):
try: try:
session.exec(delete(MessageTable).where(MessageTable.id.in_(message_ids))) # type: ignore[attr-defined] session.exec(delete(MessageTable).where(MessageTable.id.in_(message_ids))) # type: ignore[attr-defined]
@ -85,12 +83,11 @@ async def delete_messages(
raise HTTPException(status_code=500, detail=str(e)) from e raise HTTPException(status_code=500, detail=str(e)) from e
@router.put("/messages/{message_id}", response_model=MessageRead) @router.put("/messages/{message_id}", dependencies=[Depends(get_current_active_user)], response_model=MessageRead)
async def update_message( async def update_message(
message_id: UUID, message_id: UUID,
message: MessageUpdate, message: MessageUpdate,
session: Annotated[Session, Depends(get_session)], session: Annotated[Session, Depends(get_session)],
user: Annotated[User, Depends(get_current_active_user)],
): ):
try: try:
db_message = session.get(MessageTable, message_id) db_message = session.get(MessageTable, message_id)
@ -112,12 +109,15 @@ async def update_message(
return db_message return db_message
@router.patch("/messages/session/{old_session_id}", response_model=list[MessageResponse]) @router.patch(
"/messages/session/{old_session_id}",
dependencies=[Depends(get_current_active_user)],
response_model=list[MessageResponse],
)
async def update_session_id( async def update_session_id(
old_session_id: str, old_session_id: str,
new_session_id: Annotated[str, Query(..., description="The new session ID to update to")], new_session_id: Annotated[str, Query(..., description="The new session ID to update to")],
session: Annotated[Session, Depends(get_session)], session: Annotated[Session, Depends(get_session)],
current_user: Annotated[User, Depends(get_current_active_user)],
): ):
try: try:
# Get all messages with the old session ID # Get all messages with the old session ID

View file

@ -2,16 +2,12 @@ from fastapi import APIRouter, Depends, HTTPException
from langflow.graph.graph.schema import GraphDump from langflow.graph.graph.schema import GraphDump
from langflow.services.auth.utils import get_current_active_user from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.user.model import User
router = APIRouter(prefix="/starter-projects", tags=["Flows"]) router = APIRouter(prefix="/starter-projects", tags=["Flows"])
@router.get("/", response_model=list[GraphDump], status_code=200) @router.get("/", dependencies=[Depends(get_current_active_user)], response_model=list[GraphDump], status_code=200)
def get_starter_projects( def get_starter_projects():
*,
current_user: User = Depends(get_current_active_user),
):
"""Get a list of starter projects.""" """Get a list of starter projects."""
from langflow.initial_setup.load import get_starter_projects_dump from langflow.initial_setup.load import get_starter_projects_dump

View file

@ -7,7 +7,7 @@ from sqlmodel import Session
from langflow.services.auth.utils import get_current_active_user from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.user.model import User from langflow.services.database.models.user.model import User
from langflow.services.database.models.variable import VariableCreate, VariableRead, VariableUpdate from langflow.services.database.models.variable import VariableCreate, VariableRead, VariableUpdate
from langflow.services.deps import get_session, get_settings_service, get_variable_service from langflow.services.deps import get_session, get_variable_service
from langflow.services.variable.base import VariableService from langflow.services.variable.base import VariableService
from langflow.services.variable.constants import GENERIC_TYPE from langflow.services.variable.constants import GENERIC_TYPE
from langflow.services.variable.service import DatabaseVariableService from langflow.services.variable.service import DatabaseVariableService
@ -21,7 +21,6 @@ def create_variable(
session: Session = Depends(get_session), session: Session = Depends(get_session),
variable: VariableCreate, variable: VariableCreate,
current_user: User = Depends(get_current_active_user), current_user: User = Depends(get_current_active_user),
settings_service=Depends(get_settings_service),
variable_service: DatabaseVariableService = Depends(get_variable_service), variable_service: DatabaseVariableService = Depends(get_variable_service),
): ):
"""Create a new variable.""" """Create a new variable."""

View file

@ -68,9 +68,9 @@ def validate_and_create_openai_tools_agent(
llm: BaseLanguageModel, llm: BaseLanguageModel,
tools: Sequence[BaseTool], tools: Sequence[BaseTool],
prompt: ChatPromptTemplate, prompt: ChatPromptTemplate,
tools_renderer: Callable[[list[BaseTool]], str] = render_text_description, _tools_renderer: Callable[[list[BaseTool]], str] = render_text_description,
*, *,
stop_sequence: bool | list[str] = True, _stop_sequence: bool | list[str] = True,
): ):
return create_openai_tools_agent( return create_openai_tools_agent(
llm=llm, llm=llm,
@ -83,9 +83,9 @@ def validate_and_create_tool_calling_agent(
llm: BaseLanguageModel, llm: BaseLanguageModel,
tools: Sequence[BaseTool], tools: Sequence[BaseTool],
prompt: ChatPromptTemplate, prompt: ChatPromptTemplate,
tools_renderer: Callable[[list[BaseTool]], str] = render_text_description, _tools_renderer: Callable[[list[BaseTool]], str] = render_text_description,
*, *,
stop_sequence: bool | list[str] = True, _stop_sequence: bool | list[str] = True,
): ):
return create_tool_calling_agent( return create_tool_calling_agent(
llm=llm, llm=llm,

View file

@ -24,12 +24,11 @@ def build_data_from_run_outputs(run_outputs: RunOutputs) -> list[Data]:
return data return data
def build_data_from_result_data(result_data: ResultData, get_final_results_only: bool = True) -> list[Data]: def build_data_from_result_data(result_data: ResultData) -> list[Data]:
"""Build a list of data from the given ResultData. """Build a list of data from the given ResultData.
Args: Args:
result_data (ResultData): The ResultData object containing the result data. result_data (ResultData): The ResultData object containing the result data.
get_final_results_only (bool, optional): Whether to include only final results. Defaults to True.
Returns: Returns:
List[Data]: A list of data built from the ResultData. List[Data]: A list of data built from the ResultData.
@ -64,7 +63,7 @@ def build_data_from_result_data(result_data: ResultData, get_final_results_only:
if isinstance(result_data.results, dict): if isinstance(result_data.results, dict):
for name, result in result_data.results.items(): for name, result in result_data.results.items():
dataobj: Data | Message | None = None dataobj: Data | Message | None
dataobj = result if isinstance(result, Message) else Data(data=result, text_key=name) dataobj = result if isinstance(result, Message) else Data(data=result, text_key=name)
data.append(dataobj) data.append(dataobj)

View file

@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Any
from langchain_core.tools import BaseTool, ToolException from langchain_core.tools import BaseTool, ToolException
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.base.flow_processing.utils import build_data_from_result_data, format_flow_output_data from langflow.base.flow_processing.utils import build_data_from_result_data, format_flow_output_data
from langflow.graph.graph.base import Graph # cannot be a part of TYPE_CHECKING # noqa: TCH001 from langflow.graph.graph.base import Graph # cannot be a part of TYPE_CHECKING # noqa: TCH001
@ -30,7 +31,10 @@ class FlowTool(BaseTool):
schema = self.get_input_schema() schema = self.get_input_schema()
return schema.schema()["properties"] return schema.schema()["properties"]
def get_input_schema(self, config: RunnableConfig | None = None) -> type[BaseModel]: @override
def get_input_schema( # type: ignore[misc]
self, config: RunnableConfig | None = None
) -> type[BaseModel]:
"""The tool's input schema.""" """The tool's input schema."""
if self.args_schema is not None: if self.args_schema is not None:
return self.args_schema return self.args_schema
@ -68,7 +72,7 @@ class FlowTool(BaseTool):
if run_output is not None: if run_output is not None:
for output in run_output.outputs: for output in run_output.outputs:
if output: if output:
data.extend(build_data_from_result_data(output, get_final_results_only=self.get_final_results_only)) data.extend(build_data_from_result_data(output))
return format_flow_output_data(data) return format_flow_output_data(data)
def validate_inputs(self, args_names: list[dict[str, str]], args: Any, kwargs: Any): def validate_inputs(self, args_names: list[dict[str, str]], args: Any, kwargs: Any):
@ -118,5 +122,5 @@ class FlowTool(BaseTool):
if run_output is not None: if run_output is not None:
for output in run_output.outputs: for output in run_output.outputs:
if output: if output:
data.extend(build_data_from_result_data(output, get_final_results_only=self.get_final_results_only)) data.extend(build_data_from_result_data(output))
return format_flow_output_data(data) return format_flow_output_data(data)

View file

@ -104,7 +104,7 @@ class SubFlowComponent(CustomComponent):
}, },
} }
async def build(self, flow_name: str, get_final_results_only: bool = True, **kwargs) -> list[Data]: async def build(self, flow_name: str, **kwargs) -> list[Data]:
tweaks = {key: {"input_value": value} for key, value in kwargs.items()} tweaks = {key: {"input_value": value} for key, value in kwargs.items()}
run_outputs: list[RunOutputs | None] = await self.run_flow( run_outputs: list[RunOutputs | None] = await self.run_flow(
tweaks=tweaks, tweaks=tweaks,
@ -118,7 +118,7 @@ class SubFlowComponent(CustomComponent):
if run_output is not None: if run_output is not None:
for output in run_output.outputs: for output in run_output.outputs:
if output: if output:
data.extend(build_data_from_result_data(output, get_final_results_only)) data.extend(build_data_from_result_data(output))
self.status = data self.status = data
logger.debug(data) logger.debug(data)

View file

@ -77,7 +77,7 @@ class GoogleGenerativeAIEmbeddingsComponent(Component):
text=text, text=text,
task_type=task_type, task_type=task_type,
title=title, title=title,
output_dimensionality=1536, output_dimensionality=output_dimensionality,
) )
for text, title in zip(batch, titles_batch, strict=True) for text, title in zip(batch, titles_batch, strict=True)
] ]
@ -112,12 +112,12 @@ class GoogleGenerativeAIEmbeddingsComponent(Component):
Returns: Returns:
Embedding for the text. Embedding for the text.
""" """
task_type = self.task_type or "RETRIEVAL_QUERY" task_type = task_type or "RETRIEVAL_QUERY"
return self.embed_documents( return self.embed_documents(
[text], [text],
task_type=task_type, task_type=task_type,
titles=[title] if title else None, titles=[title] if title else None,
output_dimensionality=1536, output_dimensionality=output_dimensionality,
)[0] )[0]
return HotaGoogleGenerativeAIEmbeddings(model=self.model_name, google_api_key=self.api_key) return HotaGoogleGenerativeAIEmbeddings(model=self.model_name, google_api_key=self.api_key)

View file

@ -1,6 +1,8 @@
import uuid import uuid
from typing import Any from typing import Any
from typing_extensions import override
from langflow.custom import Component from langflow.custom import Component
from langflow.io import MessageTextInput, Output from langflow.io import MessageTextInput, Output
from langflow.schema import dotdict from langflow.schema import dotdict
@ -26,6 +28,7 @@ class IDGeneratorComponent(Component):
Output(display_name="ID", name="id", method="generate_id"), Output(display_name="ID", name="id", method="generate_id"),
] ]
@override
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None): def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
if field_name == "unique_id": if field_name == "unique_id":
build_config[field_name]["value"] = str(uuid.uuid4()) build_config[field_name]["value"] = str(uuid.uuid4())

View file

@ -1,6 +1,7 @@
import requests import requests
from langchain_groq import ChatGroq from langchain_groq import ChatGroq
from pydantic.v1 import SecretStr from pydantic.v1 import SecretStr
from typing_extensions import override
from langflow.base.models.model import LCModelComponent from langflow.base.models.model import LCModelComponent
from langflow.field_typing import LanguageModel from langflow.field_typing import LanguageModel
@ -75,6 +76,7 @@ class GroqModel(LCModelComponent):
self.status = f"Error fetching models: {e}" self.status = f"Error fetching models: {e}"
return [] return []
@override
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None): def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
if field_name in {"groq_api_key", "groq_api_base", "model_name"}: if field_name in {"groq_api_key", "groq_api_base", "model_name"}:
models = self.get_models() models = self.get_models()

View file

@ -52,7 +52,6 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
def create_huggingface_endpoint( def create_huggingface_endpoint(
self, self,
model_id: str,
task: str | None, task: str | None,
huggingfacehub_api_token: str | None, huggingfacehub_api_token: str | None,
model_kwargs: dict[str, Any], model_kwargs: dict[str, Any],
@ -76,7 +75,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
max_new_tokens=max_new_tokens, max_new_tokens=max_new_tokens,
top_k=top_k, top_k=top_k,
top_p=top_p, top_p=top_p,
typical_p=self.typical_p, typical_p=typical_p,
temperature=temperature, temperature=temperature,
repetition_penalty=repetition_penalty, repetition_penalty=repetition_penalty,
) )
@ -84,7 +83,6 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
return _attempt_create() return _attempt_create()
def build_model(self) -> LanguageModel: def build_model(self) -> LanguageModel:
model_id = self.model_id
task = self.task or None task = self.task or None
huggingfacehub_api_token = self.huggingfacehub_api_token huggingfacehub_api_token = self.huggingfacehub_api_token
model_kwargs = self.model_kwargs or {} model_kwargs = self.model_kwargs or {}
@ -97,7 +95,6 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
try: try:
llm = self.create_huggingface_endpoint( llm = self.create_huggingface_endpoint(
model_id=model_id,
task=task, task=task,
huggingfacehub_api_token=huggingfacehub_api_token, huggingfacehub_api_token=huggingfacehub_api_token,
model_kwargs=model_kwargs, model_kwargs=model_kwargs,

View file

@ -1,6 +1,7 @@
from typing import Any from typing import Any
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.base.langchain_utilities.model import LCToolComponent from langflow.base.langchain_utilities.model import LCToolComponent
from langflow.base.tools.flow_tool import FlowTool from langflow.base.tools.flow_tool import FlowTool
@ -39,6 +40,7 @@ class FlowToolComponent(LCToolComponent):
return flow_data return flow_data
return None return None
@override
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None): def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
if field_name == "flow_name": if field_name == "flow_name":
build_config["flow_name"]["options"] = self.get_flow_names() build_config["flow_name"]["options"] = self.get_flow_names()

View file

@ -1,5 +1,7 @@
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from typing_extensions import override
from langflow.base.flow_processing.utils import build_data_from_run_outputs from langflow.base.flow_processing.utils import build_data_from_run_outputs
from langflow.custom import Component from langflow.custom import Component
from langflow.io import DropdownInput, MessageTextInput, NestedDictInput, Output from langflow.io import DropdownInput, MessageTextInput, NestedDictInput, Output
@ -19,6 +21,7 @@ class RunFlowComponent(Component):
flow_data = self.list_flows() flow_data = self.list_flows()
return [flow_data.data["name"] for flow_data in flow_data] return [flow_data.data["name"] for flow_data in flow_data]
@override
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None): def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
if field_name == "flow_name": if field_name == "flow_name":
build_config["flow_name"]["options"] = self.get_flow_names() build_config["flow_name"]["options"] = self.get_flow_names()

View file

@ -4,6 +4,7 @@ from typing import Any
from composio_langchain import Action, App, ComposioToolSet from composio_langchain import Action, App, ComposioToolSet
from langchain_core.tools import Tool from langchain_core.tools import Tool
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.base.langchain_utilities.model import LCToolComponent from langflow.base.langchain_utilities.model import LCToolComponent
from langflow.inputs import DropdownInput, MessageTextInput, MultiselectInput, SecretStrInput, StrInput from langflow.inputs import DropdownInput, MessageTextInput, MultiselectInput, SecretStrInput, StrInput
@ -142,6 +143,7 @@ class ComposioAPIComponent(LCToolComponent):
def _get_normalized_app_name(self) -> str: def _get_normalized_app_name(self) -> str:
return self.app_names.replace("_CONNECTED", "").replace("_connected", "") return self.app_names.replace("_CONNECTED", "").replace("_connected", "")
@override
def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict: def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
if field_name == "api_key": if field_name == "api_key":
if hasattr(self, "api_key") and self.api_key != "": if hasattr(self, "api_key") and self.api_key != "":

View file

@ -7,6 +7,7 @@ from langchain_core.tools import StructuredTool
from loguru import logger from loguru import logger
from pydantic.v1 import Field, create_model from pydantic.v1 import Field, create_model
from pydantic.v1.fields import Undefined from pydantic.v1.fields import Undefined
from typing_extensions import override
from langflow.base.langchain_utilities.model import LCToolComponent from langflow.base.langchain_utilities.model import LCToolComponent
from langflow.inputs.inputs import BoolInput, DropdownInput, FieldTypes, HandleInput, MessageTextInput, MultilineInput from langflow.inputs.inputs import BoolInput, DropdownInput, FieldTypes, HandleInput, MessageTextInput, MultilineInput
@ -83,6 +84,7 @@ class PythonCodeStructuredTool(LCToolComponent):
Output(display_name="Tool", name="result_tool", method="build_tool"), Output(display_name="Tool", name="result_tool", method="build_tool"),
] ]
@override
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict: def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:
if field_name is None: if field_name is None:
return build_config return build_config

View file

@ -4,7 +4,7 @@ import emoji
from loguru import logger from loguru import logger
def validate_icon(value: str, *args, **kwargs): def validate_icon(value: str):
# we are going to use the emoji library to validate the emoji # we are going to use the emoji library to validate the emoji
# emojis can be defined using the :emoji_name: syntax # emojis can be defined using the :emoji_name: syntax

View file

@ -29,7 +29,6 @@ from .custom_component import CustomComponent
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Callable from collections.abc import Callable
from uuid import UUID
from langflow.events.event_manager import EventManager from langflow.events.event_manager import EventManager
from langflow.graph.edge.schema import EdgeData from langflow.graph.edge.schema import EdgeData
@ -775,12 +774,9 @@ class Component(CustomComponent):
return str(self.repr_value) return str(self.repr_value)
return self.repr_value return self.repr_value
def build_inputs(self, user_id: str | UUID | None = None): def build_inputs(self):
"""Builds the inputs for the custom component. """Builds the inputs for the custom component.
Args:
user_id (Optional[Union[str, UUID]], optional): The user ID. Defaults to None.
Returns: Returns:
List[Input]: The list of inputs. List[Input]: The list of inputs.
""" """

View file

@ -247,11 +247,10 @@ def get_field_dict(field: Input | dict):
def run_build_inputs( def run_build_inputs(
custom_component: Component, custom_component: Component,
user_id: str | UUID | None = None,
): ):
"""Run the build inputs of a custom component.""" """Run the build inputs of a custom component."""
try: try:
return custom_component.build_inputs(user_id=user_id) return custom_component.build_inputs()
# add_extra_fields(frontend_node, field_config, field_config.values()) # add_extra_fields(frontend_node, field_config, field_config.values())
except Exception as exc: except Exception as exc:
logger.exception("Error running build inputs") logger.exception("Error running build inputs")

View file

@ -11,7 +11,7 @@ class RangeSpec(BaseModel):
@field_validator("max") @field_validator("max")
@classmethod @classmethod
def max_must_be_greater_than_min(cls, v, values, **kwargs): def max_must_be_greater_than_min(cls, v, values):
if "min" in values.data and v <= values.data["min"]: if "min" in values.data and v <= values.data["min"]:
msg = "Max must be greater than min" msg = "Max must be greater than min"
raise ValueError(msg) raise ValueError(msg)
@ -19,7 +19,7 @@ class RangeSpec(BaseModel):
@field_validator("step") @field_validator("step")
@classmethod @classmethod
def step_must_be_positive(cls, v, values, **kwargs): def step_must_be_positive(cls, v, values):
if v <= 0: if v <= 0:
msg = "Step must be positive" msg = "Step must be positive"
raise ValueError(msg) raise ValueError(msg)

View file

@ -1041,7 +1041,7 @@ class Graph:
# both graphs have the same vertices and edges # both graphs have the same vertices and edges
# but the data of the vertices might be different # but the data of the vertices might be different
def update_edges_from_vertex(self, vertex: Vertex, other_vertex: Vertex) -> None: def update_edges_from_vertex(self, other_vertex: Vertex) -> None:
"""Updates the edges of a vertex in the Graph.""" """Updates the edges of a vertex in the Graph."""
new_edges = [] new_edges = []
for edge in self.edges: for edge in self.edges:
@ -1121,7 +1121,7 @@ class Graph:
vertex._data = other_vertex._data vertex._data = other_vertex._data
vertex._parse_data() vertex._parse_data()
# Now we update the edges of the vertex # Now we update the edges of the vertex
self.update_edges_from_vertex(vertex, other_vertex) self.update_edges_from_vertex(other_vertex)
vertex.params = {} vertex.params = {}
vertex._build_params() vertex._build_params()
vertex.graph = self vertex.graph = self
@ -1208,7 +1208,7 @@ class Graph:
# All vertices that do not have edges are invalid # All vertices that do not have edges are invalid
return len(self.get_vertex_edges(vertex.id)) > 0 return len(self.get_vertex_edges(vertex.id)) > 0
def get_vertex(self, vertex_id: str, silent: bool = False) -> Vertex: def get_vertex(self, vertex_id: str) -> Vertex:
"""Returns a vertex by id.""" """Returns a vertex by id."""
try: try:
return self.vertex_map[vertex_id] return self.vertex_map[vertex_id]
@ -1289,7 +1289,7 @@ class Graph:
} }
) )
def _record_snapshot(self, vertex_id: str | None = None, start: bool = False): def _record_snapshot(self, vertex_id: str | None = None):
self._snapshots.append(self.get_snapshot()) self._snapshots.append(self.get_snapshot())
if vertex_id: if vertex_id:
self._call_order.append(vertex_id) self._call_order.append(vertex_id)
@ -1480,7 +1480,7 @@ class Graph:
logger.debug("Graph processing complete") logger.debug("Graph processing complete")
return self return self
def find_next_runnable_vertices(self, vertex_id: str, vertex_successors_ids: list[str]) -> list[str]: def find_next_runnable_vertices(self, vertex_successors_ids: list[str]) -> list[str]:
next_runnable_vertices = set() next_runnable_vertices = set()
for v_id in sorted(vertex_successors_ids): for v_id in sorted(vertex_successors_ids):
if not self.is_vertex_runnable(v_id): if not self.is_vertex_runnable(v_id):
@ -1495,7 +1495,7 @@ class Graph:
v_successors_ids = vertex.successors_ids v_successors_ids = vertex.successors_ids
async with lock: async with lock:
self.run_manager.remove_vertex_from_runnables(v_id) self.run_manager.remove_vertex_from_runnables(v_id)
next_runnable_vertices = self.find_next_runnable_vertices(v_id, v_successors_ids) next_runnable_vertices = self.find_next_runnable_vertices(v_successors_ids)
for next_v_id in set(next_runnable_vertices): # Use set to avoid duplicates for next_v_id in set(next_runnable_vertices): # Use set to avoid duplicates
if next_v_id == v_id: if next_v_id == v_id:

View file

@ -131,13 +131,12 @@ def update_template(template, g_nodes):
g_nodes[node_index]["data"]["node"]["template"][field]["display_name"] = display_name g_nodes[node_index]["data"]["node"]["template"][field]["display_name"] = display_name
def update_target_handle(new_edge, g_nodes, group_node_id): def update_target_handle(new_edge, g_nodes):
"""Updates the target handle of a given edge if it is a proxy node. """Updates the target handle of a given edge if it is a proxy node.
Args: Args:
new_edge (dict): The edge to update. new_edge (dict): The edge to update.
g_nodes (list): The list of nodes in the graph. g_nodes (list): The list of nodes in the graph.
group_node_id (str): The ID of the group node.
Returns: Returns:
dict: The updated edge. dict: The updated edge.
@ -222,7 +221,7 @@ def get_updated_edges(base_flow, g_nodes, g_edges, group_node_id):
for edge in base_flow["edges"]: for edge in base_flow["edges"]:
new_edge = copy.deepcopy(edge) new_edge = copy.deepcopy(edge)
if new_edge["target"] == group_node_id: if new_edge["target"] == group_node_id:
new_edge = update_target_handle(new_edge, g_nodes, group_node_id) new_edge = update_target_handle(new_edge, g_nodes)
if new_edge["source"] == group_node_id: if new_edge["source"] == group_node_id:
new_edge = update_source_handle(new_edge, g_nodes, g_edges) new_edge = update_source_handle(new_edge, g_nodes, g_edges)

View file

@ -126,7 +126,7 @@ def build_output_setter(method: Callable, validate: bool = True) -> Callable:
>>> print(component.get_output_by_method(component.set_message).value) # Prints "New message" >>> print(component.get_output_by_method(component.set_message).value) # Prints "New message"
""" """
def output_setter(self, value): def output_setter(self, value): # noqa: ARG001
if validate: if validate:
__validate_method(method) __validate_method(method)
methods_class = method.__self__ methods_class = method.__self__

View file

@ -480,7 +480,7 @@ class Vertex:
): ):
"""Initiate the build process.""" """Initiate the build process."""
logger.debug(f"Building {self.display_name}") logger.debug(f"Building {self.display_name}")
await self._build_each_vertex_in_params_dict(user_id) await self._build_each_vertex_in_params_dict()
if self.base_type is None: if self.base_type is None:
msg = f"Base type for vertex {self.display_name} not found" msg = f"Base type for vertex {self.display_name} not found"
@ -562,7 +562,7 @@ class Vertex:
) )
self.set_result(result_dict) self.set_result(result_dict)
async def _build_each_vertex_in_params_dict(self, user_id=None): async def _build_each_vertex_in_params_dict(self):
"""Iterates over each vertex in the params dictionary and builds it.""" """Iterates over each vertex in the params dictionary and builds it."""
for key, value in self._raw_params.items(): for key, value in self._raw_params.items():
if self._is_vertex(value): if self._is_vertex(value):
@ -622,7 +622,11 @@ class Vertex:
self.log_transaction_tasks.add(task) self.log_transaction_tasks.add(task)
task.add_done_callback(self.log_transaction_tasks.discard) task.add_done_callback(self.log_transaction_tasks.discard)
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, # noqa: ARG002
) -> Any:
"""Retrieves the result of the built component. """Retrieves the result of the built component.
If the component has not been built yet, a ValueError is raised. If the component has not been built yet, a ValueError is raised.
@ -749,7 +753,7 @@ class Vertex:
msg = f"You are trying to stream to a {self.display_name}. Try using a Chat Output instead." msg = f"You are trying to stream to a {self.display_name}. Try using a Chat Output instead."
raise ValueError(msg) raise ValueError(msg)
def _reset(self, params_update: dict[str, Any] | None = None): def _reset(self):
self._built = False self._built = False
self._built_object = UnbuiltObject() self._built_object = UnbuiltObject()
self._built_result = UnbuiltResult() self._built_result = UnbuiltResult()

View file

@ -186,7 +186,7 @@ async def flow_function({func_args}):
if run_output is not None: if run_output is not None:
for output in run_output.outputs: for output in run_output.outputs:
if output: if output:
data.extend(build_data_from_result_data(output, get_final_results_only=True)) data.extend(build_data_from_result_data(output))
return format_flow_output_data(data) return format_flow_output_data(data)
except Exception as e: except Exception as e:
raise ToolException(f'Error running flow: ' + e) raise ToolException(f'Error running flow: ' + e)

View file

@ -8,9 +8,6 @@ from loguru import logger
from langflow.custom.utils import abuild_custom_components, build_custom_components from langflow.custom.utils import abuild_custom_components, build_custom_components
if TYPE_CHECKING: if TYPE_CHECKING:
import asyncio
from langflow.services.cache.base import CacheService
from langflow.services.settings.service import SettingsService from langflow.services.settings.service import SettingsService
@ -63,9 +60,6 @@ all_types_dict_cache = None
async def get_and_cache_all_types_dict( async def get_and_cache_all_types_dict(
settings_service: SettingsService, settings_service: SettingsService,
cache_service: CacheService,
force_refresh: bool = False,
lock: asyncio.Lock | None = None,
): ):
global all_types_dict_cache # noqa: PLW0603 global all_types_dict_cache # noqa: PLW0603
if all_types_dict_cache is None: if all_types_dict_cache is None:

View file

@ -29,7 +29,7 @@ from langflow.initial_setup.setup import (
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.types import get_and_cache_all_types_dict
from langflow.interface.utils import setup_llm_caching from langflow.interface.utils import setup_llm_caching
from langflow.logging.logger import configure from langflow.logging.logger import configure
from langflow.services.deps import get_cache_service, get_settings_service, get_telemetry_service from langflow.services.deps import get_settings_service, get_telemetry_service
from langflow.services.utils import initialize_services, teardown_services from langflow.services.utils import initialize_services, teardown_services
# Ignore Pydantic deprecation warnings from Langchain # Ignore Pydantic deprecation warnings from Langchain
@ -90,9 +90,9 @@ class JavaScriptMIMETypeMiddleware(BaseHTTPMiddleware):
telemetry_service_tasks = set() telemetry_service_tasks = set()
def get_lifespan(fix_migration=False, socketio_server=None, version=None): def get_lifespan(fix_migration=False, version=None):
@asynccontextmanager @asynccontextmanager
async def lifespan(app: FastAPI): async def lifespan(_app: FastAPI):
nest_asyncio.apply() nest_asyncio.apply()
# Startup message # Startup message
if version: if version:
@ -100,10 +100,10 @@ def get_lifespan(fix_migration=False, socketio_server=None, version=None):
else: else:
rprint("[bold green]Starting Langflow...[/bold green]") rprint("[bold green]Starting Langflow...[/bold green]")
try: try:
initialize_services(fix_migration=fix_migration, socketio_server=socketio_server) initialize_services(fix_migration=fix_migration)
setup_llm_caching() setup_llm_caching()
initialize_super_user_if_needed() initialize_super_user_if_needed()
task = asyncio.create_task(get_and_cache_all_types_dict(get_settings_service(), get_cache_service())) task = asyncio.create_task(get_and_cache_all_types_dict(get_settings_service()))
await create_or_update_starter_projects(task) await create_or_update_starter_projects(task)
telemetry_service_task = asyncio.create_task(get_telemetry_service().start()) telemetry_service_task = asyncio.create_task(get_telemetry_service().start())
telemetry_service_tasks.add(telemetry_service_task) telemetry_service_tasks.add(telemetry_service_task)
@ -206,7 +206,7 @@ def create_app():
app.include_router(log_router) app.include_router(log_router)
@app.exception_handler(Exception) @app.exception_handler(Exception)
async def exception_handler(request: Request, exc: Exception): async def exception_handler(_request: Request, exc: Exception):
if isinstance(exc, HTTPException): if isinstance(exc, HTTPException):
logger.error(f"HTTPException: {exc}", exc_info=exc) logger.error(f"HTTPException: {exc}", exc_info=exc)
return JSONResponse( return JSONResponse(
@ -252,7 +252,7 @@ def setup_static_files(app: FastAPI, static_files_dir: Path):
) )
@app.exception_handler(404) @app.exception_handler(404)
async def custom_404_handler(request, __): async def custom_404_handler(_request, _exc):
path = static_files_dir / "index.html" path = static_files_dir / "index.html"
if not path.exists(): if not path.exists():

View file

@ -11,7 +11,7 @@ if TYPE_CHECKING:
from langfuse.callback import CallbackHandler from langfuse.callback import CallbackHandler
def setup_callbacks(sync, trace_id, **kwargs): def setup_callbacks(trace_id):
"""Setup callbacks for langchain object.""" """Setup callbacks for langchain object."""
callbacks = [] callbacks = []
plugin_service = get_plugins_service() plugin_service = get_plugins_service()

View file

@ -6,6 +6,7 @@ from collections import OrderedDict
from typing import Generic, Union from typing import Generic, Union
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.services.cache.base import AsyncBaseCacheService, AsyncLockType, CacheService, LockType from langflow.services.cache.base import AsyncBaseCacheService, AsyncLockType, CacheService, LockType
from langflow.services.cache.utils import CACHE_MISS from langflow.services.cache.utils import CACHE_MISS
@ -225,12 +226,14 @@ class RedisCache(AsyncBaseCacheService, Generic[LockType]):
return False return False
return True return True
@override
async def get(self, key, lock=None): async def get(self, key, lock=None):
if key is None: if key is None:
return None return None
value = self._client.get(str(key)) value = self._client.get(str(key))
return pickle.loads(value) if value else None return pickle.loads(value) if value else None
@override
async def set(self, key, value, lock=None): async def set(self, key, value, lock=None):
try: try:
if pickled := pickle.dumps(value): if pickled := pickle.dumps(value):
@ -242,6 +245,7 @@ class RedisCache(AsyncBaseCacheService, Generic[LockType]):
msg = "RedisCache only accepts values that can be pickled. " msg = "RedisCache only accepts values that can be pickled. "
raise TypeError(msg) from exc raise TypeError(msg) from exc
@override
async def upsert(self, key, value, lock=None): async def upsert(self, key, value, lock=None):
"""Inserts or updates a value in the cache. """Inserts or updates a value in the cache.
@ -261,9 +265,11 @@ class RedisCache(AsyncBaseCacheService, Generic[LockType]):
await self.set(key, value) await self.set(key, value)
@override
async def delete(self, key, lock=None): async def delete(self, key, lock=None):
self._client.delete(key) self._client.delete(key)
@override
async def clear(self, lock=None): async def clear(self, lock=None):
"""Clear all items from the cache.""" """Clear all items from the cache."""
self._client.flushdb() self._client.flushdb()

View file

@ -82,7 +82,7 @@ class DatabaseService(Service):
msg = "Error creating database engine" msg = "Error creating database engine"
raise RuntimeError(msg) from exc raise RuntimeError(msg) from exc
def on_connection(self, dbapi_connection, connection_record): def on_connection(self, dbapi_connection, _connection_record):
from sqlite3 import Connection as sqliteConnection from sqlite3 import Connection as sqliteConnection
if isinstance(dbapi_connection, sqliteConnection): if isinstance(dbapi_connection, sqliteConnection):

View file

@ -1,17 +1,12 @@
from __future__ import annotations from __future__ import annotations
from typing import TYPE_CHECKING
from langflow.services.factory import ServiceFactory from langflow.services.factory import ServiceFactory
from langflow.services.plugins.service import PluginService from langflow.services.plugins.service import PluginService
if TYPE_CHECKING:
from langflow.services.settings.service import SettingsService
class PluginServiceFactory(ServiceFactory): class PluginServiceFactory(ServiceFactory):
def __init__(self): def __init__(self):
super().__init__(PluginService) super().__init__(PluginService)
def create(self, settings_service: SettingsService): def create(self):
return PluginService(settings_service) return PluginService()

View file

@ -3,23 +3,18 @@ from __future__ import annotations
import importlib import importlib
import inspect import inspect
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING
from loguru import logger from loguru import logger
from langflow.services.base import Service from langflow.services.base import Service
from langflow.services.plugins.base import BasePlugin, CallbackPlugin from langflow.services.plugins.base import BasePlugin, CallbackPlugin
if TYPE_CHECKING:
from langflow.services.settings.service import SettingsService
class PluginService(Service): class PluginService(Service):
name = "plugin_service" name = "plugin_service"
def __init__(self, settings_service: SettingsService): def __init__(self):
self.plugins: dict[str, BasePlugin] = {} self.plugins: dict[str, BasePlugin] = {}
# plugin_dir = settings_service.settings.PLUGIN_DIR
self.plugin_dir = Path(__file__).parent self.plugin_dir = Path(__file__).parent
self.plugins_base_module = "langflow.services.plugins" self.plugins_base_module = "langflow.services.plugins"
self.load_plugins() self.load_plugins()

View file

@ -11,6 +11,7 @@ from loguru import logger
from pydantic import field_validator from pydantic import field_validator
from pydantic.fields import FieldInfo from pydantic.fields import FieldInfo
from pydantic_settings import BaseSettings, EnvSettingsSource, PydanticBaseSettingsSource, SettingsConfigDict from pydantic_settings import BaseSettings, EnvSettingsSource, PydanticBaseSettingsSource, SettingsConfigDict
from typing_extensions import override
from langflow.services.settings.constants import VARIABLES_TO_GET_FROM_ENVIRONMENT from langflow.services.settings.constants import VARIABLES_TO_GET_FROM_ENVIRONMENT
@ -352,7 +353,8 @@ class Settings(BaseSettings):
logger.debug(f"{key}: {getattr(self, key)}") logger.debug(f"{key}: {getattr(self, key)}")
@classmethod @classmethod
def settings_customise_sources( @override
def settings_customise_sources( # type: ignore[misc]
cls, cls,
settings_cls: type[BaseSettings], settings_cls: type[BaseSettings],
init_settings: PydanticBaseSettingsSource, init_settings: PydanticBaseSettingsSource,

View file

@ -53,14 +53,12 @@ class SocketIOService(Service):
async def on_get_vertices(self, sid, flow_id): async def on_get_vertices(self, sid, flow_id):
await get_vertices(self.sio, sid, flow_id, get_chat_service()) await get_vertices(self.sio, sid, flow_id, get_chat_service())
async def on_build_vertex(self, sid, flow_id, vertex_id, tweaks, inputs): async def on_build_vertex(self, sid, flow_id, vertex_id):
await build_vertex( await build_vertex(
sio=self.sio, sio=self.sio,
sid=sid, sid=sid,
flow_id=flow_id, flow_id=flow_id,
vertex_id=vertex_id, vertex_id=vertex_id,
tweaks=tweaks,
inputs=inputs,
get_cache=self.get_cache, get_cache=self.get_cache,
set_cache=self.set_cache, set_cache=self.set_cache,
) )

View file

@ -48,8 +48,6 @@ async def build_vertex(
vertex_id: str, vertex_id: str,
get_cache: Callable, get_cache: Callable,
set_cache: Callable, set_cache: Callable,
tweaks=None,
inputs=None,
): ):
try: try:
cache = get_cache(flow_id) cache = get_cache(flow_id)

View file

@ -50,7 +50,7 @@ class ObservableGaugeWrapper:
name=name, description=description, unit=unit, callbacks=[self._callback] name=name, description=description, unit=unit, callbacks=[self._callback]
) )
def _callback(self, options: CallbackOptions): def _callback(self, _options: CallbackOptions):
return [Observation(value, attributes=dict(labels)) for labels, value in self._values.items()] return [Observation(value, attributes=dict(labels)) for labels, value in self._values.items()]
# return [Observation(self._value)] # return [Observation(self._value)]

View file

@ -5,6 +5,7 @@ from datetime import datetime, timezone
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.services.tracing.base import BaseTracer from langflow.services.tracing.base import BaseTracer
@ -63,6 +64,7 @@ class LangFuseTracer(BaseTracer):
return True return True
@override
def add_trace( def add_trace(
self, self,
trace_id: str, trace_id: str,
@ -93,6 +95,7 @@ class LangFuseTracer(BaseTracer):
self.last_span = span self.last_span = span
self.spans[trace_id] = span self.spans[trace_id] = span
@override
def end_trace( def end_trace(
self, self,
trace_id: str, trace_id: str,
@ -114,6 +117,7 @@ class LangFuseTracer(BaseTracer):
content = {"output": _output, "end_time": end_time} content = {"output": _output, "end_time": end_time}
span.update(**content) span.update(**content)
@override
def end( def end(
self, self,
inputs: dict[str, Any], inputs: dict[str, Any],

View file

@ -7,6 +7,7 @@ from datetime import datetime, timezone
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.schema.data import Data from langflow.schema.data import Data
from langflow.services.tracing.base import BaseTracer from langflow.services.tracing.base import BaseTracer
@ -62,6 +63,7 @@ class LangSmithTracer(BaseTracer):
os.environ["LANGCHAIN_TRACING_V2"] = "true" os.environ["LANGCHAIN_TRACING_V2"] = "true"
return True return True
@override
def add_trace( def add_trace(
self, self,
trace_id: str, trace_id: str,
@ -115,6 +117,7 @@ class LangSmithTracer(BaseTracer):
value = str(value) value = str(value)
return value return value
@override
def end_trace( def end_trace(
self, self,
trace_id: str, trace_id: str,

View file

@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Any, cast
import nanoid import nanoid
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.schema.data import Data from langflow.schema.data import Data
from langflow.services.tracing.base import BaseTracer from langflow.services.tracing.base import BaseTracer
@ -64,6 +65,7 @@ class LangWatchTracer(BaseTracer):
return False return False
return True return True
@override
def add_trace( def add_trace(
self, self,
trace_id: str, trace_id: str,
@ -99,6 +101,7 @@ class LangWatchTracer(BaseTracer):
self.trace.set_current_span(span) self.trace.set_current_span(span)
self.spans[trace_id] = span self.spans[trace_id] = span
@override
def end_trace( def end_trace(
self, self,
trace_id: str, trace_id: str,

View file

@ -149,7 +149,7 @@ def initialize_session_service():
) )
def initialize_services(fix_migration: bool = False, socketio_server=None): def initialize_services(fix_migration: bool = False):
"""Initialize all the services needed.""" """Initialize all the services needed."""
# Test cache connection # Test cache connection
get_service(ServiceType.CACHE_SERVICE, default=CacheServiceFactory()) get_service(ServiceType.CACHE_SERVICE, default=CacheServiceFactory())

View file

@ -4,6 +4,7 @@ import os
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from loguru import logger from loguru import logger
from typing_extensions import override
from langflow.services.auth import utils as auth_utils from langflow.services.auth import utils as auth_utils
from langflow.services.base import Service from langflow.services.base import Service
@ -26,6 +27,7 @@ class KubernetesSecretService(VariableService, Service):
# TODO: settings_service to set kubernetes namespace # TODO: settings_service to set kubernetes namespace
self.kubernetes_secrets = KubernetesSecretManager() self.kubernetes_secrets = KubernetesSecretManager()
@override
def initialize_user_variables(self, user_id: UUID | str, session: Session): def initialize_user_variables(self, user_id: UUID | str, session: Session):
# Check for environment variables that should be stored in the database # Check for environment variables that should be stored in the database
should_or_should_not = "Should" if self.settings_service.settings.store_environment_variables else "Should not" should_or_should_not = "Should" if self.settings_service.settings.store_environment_variables else "Should not"

View file

@ -42,7 +42,7 @@ class KubernetesSecretManager:
return self.core_api.create_namespaced_secret(self.namespace, secret) return self.core_api.create_namespaced_secret(self.namespace, secret)
def upsert_secret(self, secret_name: str, data: dict, secret_type: str = "Opaque"): def upsert_secret(self, secret_name: str, data: dict):
"""Upsert a secret in the specified namespace. """Upsert a secret in the specified namespace.
If the secret doesn't exist, it will be created. If the secret doesn't exist, it will be created.

View file

@ -29,10 +29,10 @@ def build_vertex(self, vertex: Vertex) -> Vertex:
@celery_app.task(acks_late=True) @celery_app.task(acks_late=True)
def process_graph_cached_task( def process_graph_cached_task(
data_graph: dict[str, Any], data_graph: dict[str, Any], # noqa: ARG001
inputs: dict | list[dict] | None = None, inputs: dict | list[dict] | None = None, # noqa: ARG001
clear_cache=False, clear_cache=False, # noqa: ARG001
session_id=None, session_id=None, # noqa: ARG001
) -> dict[str, Any]: ) -> dict[str, Any]:
msg = "This task is not implemented yet" msg = "This task is not implemented yet"
raise NotImplementedError(msg) raise NotImplementedError(msg)

View file

@ -57,7 +57,6 @@ ignore = [
# Rules that are TODOs # Rules that are TODOs
"ANN", "ANN",
"ARG",
"D1", # Missing docstrings "D1", # Missing docstrings
"FBT", "FBT",
"N", "N",

View file

@ -224,8 +224,7 @@ def test_update_target_handle_proxy():
} }
} }
g_nodes = [{"id": "some_id", "data": {"node": {"flow": None}}}] g_nodes = [{"id": "some_id", "data": {"node": {"flow": None}}}]
group_node_id = "group_id" updated_edge = update_target_handle(new_edge, g_nodes)
updated_edge = update_target_handle(new_edge, g_nodes, group_node_id)
assert updated_edge["data"]["targetHandle"] == new_edge["data"]["targetHandle"] assert updated_edge["data"]["targetHandle"] == new_edge["data"]["targetHandle"]