From f65efbc43bf93b4493393dbbc917b17eb2254867 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 13 Aug 2023 23:37:56 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=80=20refactor(base.py):=20move=20cach?= =?UTF-8?q?e=20settings=20to=20a=20separate=20section=20for=20better=20org?= =?UTF-8?q?anization=20and=20readability=20=F0=9F=94=80=20refactor(base.py?= =?UTF-8?q?):=20rename=20CACHE=5FTYPE=20variable=20to=20REDIS=5FCACHE=5FTY?= =?UTF-8?q?PE=20to=20improve=20clarity=20=F0=9F=94=80=20refactor(base.py):?= =?UTF-8?q?=20rename=20REDIS=5FHOST,=20REDIS=5FPORT,=20REDIS=5FDB,=20and?= =?UTF-8?q?=20REDIS=5FCACHE=5FEXPIRE=20variables=20to=20improve=20clarity?= =?UTF-8?q?=20=F0=9F=94=80=20refactor(base.py):=20remove=20unused=20import?= =?UTF-8?q?=20statements=20=F0=9F=94=80=20refactor(settings.py):=20remove?= =?UTF-8?q?=20unused=20import=20statements=20=F0=9F=94=80=20refactor(setti?= =?UTF-8?q?ngs.py):=20remove=20unused=20code=20and=20comments=20?= =?UTF-8?q?=F0=9F=94=80=20refactor(settings.py):=20remove=20unused=20funct?= =?UTF-8?q?ion=20`save=5Fsettings=5Fto=5Fyaml`=20=F0=9F=94=80=20refactor(s?= =?UTF-8?q?ettings.py):=20remove=20unused=20function=20`update=5Fsettings`?= =?UTF-8?q?=20=F0=9F=94=80=20refactor(settings.py):=20remove=20unused=20fu?= =?UTF-8?q?nction=20`update=5Ffrom=5Fyaml`=20=F0=9F=94=80=20refactor(setti?= =?UTF-8?q?ngs.py):=20remove=20unused=20constant=20`BASE=5FCOMPONENTS=5FPA?= =?UTF-8?q?TH`=20=F0=9F=94=80=20refactor(settings.py):=20remove=20unused?= =?UTF-8?q?=20class=20attributes=20=F0=9F=94=80=20refactor(settings.py):?= =?UTF-8?q?=20remove=20unused=20class=20methods=20=F0=9F=94=80=20refactor(?= =?UTF-8?q?settings.py):=20remove=20unused=20class=20`Settings`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/services/settings/base.py | 9 + .../langflow/services/settings/settings.py | 171 ------------------ 2 files changed, 9 insertions(+), 171 deletions(-) delete mode 100644 src/backend/langflow/services/settings/settings.py diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 1eb2793b3..071e6a296 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -35,6 +35,15 @@ class Settings(BaseSettings): REMOVE_API_KEYS: bool = False COMPONENTS_PATH: List[str] = [] + # cache settings + # if CACHE_TYPE is set to "redis", the following settings are used + CACHE_TYPE: str = "redis" + + REDIS_HOST: str = "localhost" + REDIS_PORT: int = 6379 + REDIS_DB: int = 0 + REDIS_CACHE_EXPIRE: int = 3600 + @validator("DATABASE_URL", pre=True) def set_database_url(cls, value): if not value: diff --git a/src/backend/langflow/services/settings/settings.py b/src/backend/langflow/services/settings/settings.py deleted file mode 100644 index 439b3a1e4..000000000 --- a/src/backend/langflow/services/settings/settings.py +++ /dev/null @@ -1,171 +0,0 @@ -import contextlib -import json -import os -from typing import Optional, List -from pathlib import Path - -import yaml -from pydantic import BaseSettings, root_validator, validator -from langflow.utils.logger import logger - -BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") - - -class Settings(BaseSettings): - CHAINS: dict = {} - AGENTS: dict = {} - PROMPTS: dict = {} - LLMS: dict = {} - TOOLS: dict = {} - MEMORIES: dict = {} - EMBEDDINGS: dict = {} - VECTORSTORES: dict = {} - DOCUMENTLOADERS: dict = {} - WRAPPERS: dict = {} - RETRIEVERS: dict = {} - TOOLKITS: dict = {} - TEXTSPLITTERS: dict = {} - UTILITIES: dict = {} - OUTPUT_PARSERS: dict = {} - CUSTOM_COMPONENTS: dict = {} - - DEV: bool = False - DATABASE_URL: Optional[str] = None - CACHE: str = "InMemoryCache" - REMOVE_API_KEYS: bool = False - COMPONENTS_PATH: List[str] = [] - - @validator("DATABASE_URL", pre=True) - def set_database_url(cls, value): - if not value: - logger.debug( - "No database_url provided, trying LANGFLOW_DATABASE_URL env variable" - ) - if langflow_database_url := os.getenv("LANGFLOW_DATABASE_URL"): - value = langflow_database_url - logger.debug("Using LANGFLOW_DATABASE_URL env variable.") - else: - logger.debug("No DATABASE_URL env variable, using sqlite database") - value = "sqlite:///./langflow.db" - - return value - - @validator("COMPONENTS_PATH", pre=True) - def set_components_path(cls, value): - if os.getenv("LANGFLOW_COMPONENTS_PATH"): - logger.debug("Adding LANGFLOW_COMPONENTS_PATH to components_path") - langflow_component_path = os.getenv("LANGFLOW_COMPONENTS_PATH") - if ( - Path(langflow_component_path).exists() - and langflow_component_path not in value - ): - if isinstance(langflow_component_path, list): - for path in langflow_component_path: - if path not in value: - value.append(path) - logger.debug( - f"Extending {langflow_component_path} to components_path" - ) - elif langflow_component_path not in value: - value.append(langflow_component_path) - logger.debug( - f"Appending {langflow_component_path} to components_path" - ) - - if not value: - value = [BASE_COMPONENTS_PATH] - logger.debug("Setting default components path to components_path") - elif BASE_COMPONENTS_PATH not in value: - value.append(BASE_COMPONENTS_PATH) - logger.debug("Adding default components path to components_path") - - logger.debug(f"Components path: {value}") - return value - - class Config: - validate_assignment = True - extra = "ignore" - env_prefix = "LANGFLOW_" - - @root_validator(allow_reuse=True) - def validate_lists(cls, values): - for key, value in values.items(): - if key != "dev" and not value: - values[key] = [] - return values - - def update_from_yaml(self, file_path: str, dev: bool = False): - new_settings = load_settings_from_yaml(file_path) - self.CHAINS = new_settings.CHAINS or {} - self.AGENTS = new_settings.AGENTS or {} - self.PROMPTS = new_settings.PROMPTS or {} - self.LLMS = new_settings.LLMS or {} - self.TOOLS = new_settings.TOOLS or {} - self.MEMORIES = new_settings.MEMORIES or {} - self.WRAPPERS = new_settings.WRAPPERS or {} - self.TOOLKITS = new_settings.TOOLKITS or {} - self.TEXTSPLITTERS = new_settings.TEXTSPLITTERS or {} - self.UTILITIES = new_settings.UTILITIES or {} - self.EMBEDDINGS = new_settings.EMBEDDINGS or {} - self.VECTORSTORES = new_settings.VECTORSTORES or {} - self.DOCUMENTLOADERS = new_settings.DOCUMENTLOADERS or {} - self.RETRIEVERS = new_settings.RETRIEVERS or {} - self.OUTPUT_PARSERS = new_settings.OUTPUT_PARSERS or {} - self.CUSTOM_COMPONENTS = new_settings.CUSTOM_COMPONENTS or {} - self.COMPONENTS_PATH = new_settings.COMPONENTS_PATH or [] - self.DEV = dev - - def update_settings(self, **kwargs): - logger.debug("Updating settings") - for key, value in kwargs.items(): - # value may contain sensitive information, so we don't want to log it - if not hasattr(self, key): - logger.debug(f"Key {key} not found in settings") - continue - logger.debug(f"Updating {key}") - if isinstance(getattr(self, key), list): - # value might be a '[something]' string - with contextlib.suppress(json.decoder.JSONDecodeError): - value = json.loads(str(value)) - if isinstance(value, list): - for item in value: - if item not in getattr(self, key): - getattr(self, key).append(item) - logger.debug(f"Extended {key}") - else: - getattr(self, key).append(value) - logger.debug(f"Appended {key}") - - else: - setattr(self, key, value) - logger.debug(f"Updated {key}") - logger.debug(f"{key}: {getattr(self, key)}") - - -def save_settings_to_yaml(settings: Settings, file_path: str): - with open(file_path, "w") as f: - settings_dict = settings.dict() - yaml.dump(settings_dict, f) - - -def load_settings_from_yaml(file_path: str) -> Settings: - # Check if a string is a valid path or a file name - if "/" not in file_path: - # Get current path - current_path = os.path.dirname(os.path.abspath(__file__)) - - file_path = os.path.join(current_path, file_path) - - with open(file_path, "r") as f: - settings_dict = yaml.safe_load(f) - settings_dict = {k.upper(): v for k, v in settings_dict.items()} - - for key in settings_dict: - if key not in Settings.__fields__.keys(): - raise KeyError(f"Key {key} not found in settings") - logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") - - return Settings(**settings_dict) - - -settings = load_settings_from_yaml("config.yaml")