ref: Add ruff rules for arguments (ARG) (#4123)
Add ruff rules for arguments (ARG)
This commit is contained in:
parent
b1a79c0749
commit
9a666c1b50
49 changed files with 138 additions and 144 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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="",
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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."""
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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 != "":
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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():
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)]
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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"]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue