diff --git a/src/backend/base/langflow/services/settings/base.py b/src/backend/base/langflow/services/settings/base.py index 3df9360f9..d5f394707 100644 --- a/src/backend/base/langflow/services/settings/base.py +++ b/src/backend/base/langflow/services/settings/base.py @@ -73,6 +73,10 @@ class Settings(BaseSettings): max_overflow: int = 20 """The number of connections to allow that can be opened beyond the pool size. If not provided, the default is 10.""" cache_type: str = "async" + + """The store can be 'db' or 'kubernetes'.""" + variable_store: str = "db" + remove_api_keys: bool = False components_path: List[str] = [] langchain_cache: str = "InMemoryCache" diff --git a/src/backend/base/langflow/services/variable/base.py b/src/backend/base/langflow/services/variable/base.py new file mode 100644 index 000000000..2cf9a3593 --- /dev/null +++ b/src/backend/base/langflow/services/variable/base.py @@ -0,0 +1,109 @@ +import abc +from typing import Optional, Union +from uuid import UUID + +from fastapi import Depends +from sqlmodel import Session + +from langflow.services.base import Service +from langflow.services.database.models.variable.model import Variable +from langflow.services.deps import get_session + +class VariableService(Service): + """ + Abstract base class for a variable service. + """ + name = "variable_service" + + @abc.abstractmethod + def initialize_user_variables(self, user_id: Union[UUID, str], session: Session) -> None: + """ + Initialize user variables. + + Args: + user_id: The user ID. + session: The database session. + """ + + @abc.abstractmethod + def get_variable(self, user_id: Union[UUID, str], name: str, field: str, session: Session) -> str: + """ + Get a variable value. + + Args: + user_id: The user ID. + name: The name of the variable. + field: The field of the variable. + session: The database session. + + Returns: + The value of the variable. + """ + + @abc.abstractmethod + def list_variables(self, user_id: Union[UUID, str], session: Session) -> list[Optional[str]]: + """ + List all variables. + + Args: + user_id: The user ID. + session: The database session. + + Returns: + A list of variable names. + """ + + @abc.abstractmethod + def update_variable(self, user_id: Union[UUID, str], name: str, value: str, session: Session) -> Variable: + """ + Update a variable. + + Args: + user_id: The user ID. + name: The name of the variable. + value: The value of the variable. + session: The database session. + + Returns: + The updated variable. + """ + + @abc.abstractmethod + def delete_variable(self, user_id: Union[UUID, str], name: str, session: Session) -> Variable: + """ + Delete a variable. + + Args: + user_id: The user ID. + name: The name of the variable. + session: The database session. + + Returns: + The deleted variable. + """ + + @abc.abstractmethod + def create_variable( + self, + user_id: Union[UUID, str], + name: str, + value: str, + default_fields: list[str] = [], + _type: str = "Generic", + session: Session = Depends(get_session), + ) -> Variable: + """ + Create a variable. + + Args: + user_id: The user ID. + name: The name of the variable. + value: The value of the variable. + default_fields: The default fields of the variable. + _type: The type of the variable. + session: The database session. + + Returns: + The created variable. + """ + diff --git a/src/backend/base/langflow/services/variable/factory.py b/src/backend/base/langflow/services/variable/factory.py index aac384807..163f4aa3f 100644 --- a/src/backend/base/langflow/services/variable/factory.py +++ b/src/backend/base/langflow/services/variable/factory.py @@ -1,7 +1,7 @@ from typing import TYPE_CHECKING from langflow.services.factory import ServiceFactory -from langflow.services.variable.service import VariableService +from langflow.services.variable.service import DatabaseVariableService, KubernetesSecretService if TYPE_CHECKING: from langflow.services.settings.service import SettingsService @@ -12,4 +12,10 @@ class VariableServiceFactory(ServiceFactory): super().__init__(VariableService) def create(self, settings_service: "SettingsService"): - return VariableService(settings_service) + # here you would have logic to create and configure a VariableService + # based on the settings_service + + if settings_service.settings.variable_store == "kubernetes": + return KubernetesSecretService(settings_service) + else: + return DatabaseVariableService(settings_service) diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index b3bde028f..c6cf2a3f1 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -8,6 +8,7 @@ from sqlmodel import Session, select from langflow.services.auth import utils as auth_utils from langflow.services.base import Service +from langflow.services.variable.base import VariableService from langflow.services.database.models.variable.model import Variable, VariableCreate from langflow.services.deps import get_session @@ -15,8 +16,7 @@ if TYPE_CHECKING: from langflow.services.settings.service import SettingsService -class VariableService(Service): - name = "variable_service" +class DatabaseVariableService(VariableService, Service): def __init__(self, settings_service: "SettingsService"): self.settings_service = settings_service @@ -127,3 +127,53 @@ class VariableService(Service): session.commit() session.refresh(variable) return variable + + + +class KubernetesSecretService(VariableService, Service): + + def __init__(self, settings_service: "SettingsService"): + self.settings_service = settings_service + + def initialize_user_variables(self, user_id: Union[UUID, str], session: Session = Depends(get_session)): + return + + def get_variable( + self, + user_id: Union[UUID, str], + name: str, + field: str, + session: Session = Depends(get_session), + ) -> str: + return "" + + def list_variables(self, user_id: Union[UUID, str], session: Session = Depends(get_session)) -> list[Optional[str]]: + return [] + + def update_variable( + self, + user_id: Union[UUID, str], + name: str, + value: str, + session: Session = Depends(get_session), + ): + return + + def delete_variable( + self, + user_id: Union[UUID, str], + name: str, + session: Session = Depends(get_session), + ): + return + + def create_variable( + self, + user_id: Union[UUID, str], + name: str, + value: str, + default_fields: list[str] = [], + _type: str = "Generic", + session: Session = Depends(get_session), + ): + return