From 08407abe9a9cfd5d21ff347cfe85e744621be03e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 10:20:20 -0300 Subject: [PATCH 01/13] =?UTF-8?q?=F0=9F=94=A7=20chore(main.py):=20add=20te?= =?UTF-8?q?ardown=5Fservices=20function=20to=20be=20called=20on=20app=20sh?= =?UTF-8?q?utdown=20event=20to=20properly=20clean=20up=20resources?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/main.py b/src/backend/langflow/main.py index 57f3e34dc..f567e65bb 100644 --- a/src/backend/langflow/main.py +++ b/src/backend/langflow/main.py @@ -10,7 +10,7 @@ from langflow.api import router from langflow.interface.utils import setup_llm_caching from langflow.services.database.utils import initialize_database -from langflow.services.manager import initialize_services +from langflow.services.manager import initialize_services, teardown_services from langflow.utils.logger import configure @@ -40,6 +40,7 @@ def create_app(): app.on_event("startup")(initialize_services) app.on_event("startup")(initialize_database) app.on_event("startup")(setup_llm_caching) + app.on_event("shutdown")(teardown_services) return app From 91ea879e508bbb350a0d4df573668f8cf8c32432 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 10:20:40 -0300 Subject: [PATCH 02/13] =?UTF-8?q?=F0=9F=94=A7=20fix(base.py):=20make=20Ser?= =?UTF-8?q?vice=20class=20inherit=20from=20ABC=20to=20make=20it=20an=20abs?= =?UTF-8?q?tract=20base=20class=20=E2=9C=A8=20feat(manager.py):=20add=20de?= =?UTF-8?q?bug=20log=20messages=20for=20service=20creation=20and=20update?= =?UTF-8?q?=20to=20improve=20debugging=20=E2=9C=A8=20feat(manager.py):=20a?= =?UTF-8?q?dd=20teardown=20method=20to=20ServiceManager=20to=20teardown=20?= =?UTF-8?q?all=20services=20and=20clear=20state=20=E2=9C=A8=20feat(manager?= =?UTF-8?q?.py):=20add=20teardown=5Fservices=20function=20to=20teardown=20?= =?UTF-8?q?all=20services=20and=20clear=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/base.py | 8 +++++++- src/backend/langflow/services/manager.py | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/services/base.py b/src/backend/langflow/services/base.py index 6bca6c4e2..aaa966047 100644 --- a/src/backend/langflow/services/base.py +++ b/src/backend/langflow/services/base.py @@ -1,2 +1,8 @@ -class Service: +from abc import ABC + + +class Service(ABC): name: str + + def teardown(self): + pass diff --git a/src/backend/langflow/services/manager.py b/src/backend/langflow/services/manager.py index e9895adab..bfe83fce8 100644 --- a/src/backend/langflow/services/manager.py +++ b/src/backend/langflow/services/manager.py @@ -1,5 +1,6 @@ from langflow.services.schema import ServiceType from typing import TYPE_CHECKING, List, Optional +from langflow.utils.logger import logger if TYPE_CHECKING: from langflow.services.factory import ServiceFactory @@ -42,6 +43,7 @@ class ServiceManager: """ Create a new service given its name, handling dependencies. """ + logger.debug(f"Create service {service_name}") self._validate_service_creation(service_name) # Create dependencies first @@ -74,9 +76,21 @@ class ServiceManager: Update a service by its name. """ if service_name in self.services: + logger.debug(f"Update service {service_name}") self.services.pop(service_name, None) self.get(service_name) + def teardown(self): + """ + Teardown all the services. + """ + for service in self.services.values(): + logger.debug(f"Teardown service {service.name}") + service.teardown() + self.services = {} + self.factories = {} + self.dependencies = {} + service_manager = ServiceManager() @@ -134,3 +148,10 @@ def initialize_session_manager(): session_manager_factory.SessionManagerFactory(), dependencies=[ServiceType.CACHE_MANAGER], ) + + +def teardown_services(): + """ + Teardown all the services. + """ + service_manager.teardown() From 29a616bc77813e816590c8fc2004ece4bfc52d7e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 10:20:53 -0300 Subject: [PATCH 03/13] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.py):=20remove=20?= =?UTF-8?q?unnecessary=20code=20and=20simplify=20create=5Fsuper=5Fuser=20f?= =?UTF-8?q?unction=20=E2=9C=A8=20feat(utils.py):=20refactor=20create=5Fuse?= =?UTF-8?q?r=5Flongterm=5Ftoken=20to=20use=20settings=5Fmanager=20for=20us?= =?UTF-8?q?ername=20and=20password?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/auth/utils.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/backend/langflow/services/auth/utils.py b/src/backend/langflow/services/auth/utils.py index 1431ee615..a53a182c0 100644 --- a/src/backend/langflow/services/auth/utils.py +++ b/src/backend/langflow/services/auth/utils.py @@ -154,18 +154,12 @@ def create_super_user( username: Optional[str] = None, password: Optional[str] = None, ) -> User: - settings_manager = get_settings_manager() - - super_user = get_user_by_username( - db, username or settings_manager.auth_settings.FIRST_SUPERUSER - ) + super_user = get_user_by_username(db, username) if not super_user: super_user = User( - username=username or settings_manager.auth_settings.FIRST_SUPERUSER, - password=get_password_hash( - password or settings_manager.auth_settings.FIRST_SUPERUSER_PASSWORD - ), + username=username, + password=get_password_hash(password), is_superuser=True, is_active=True, last_login_at=None, @@ -179,7 +173,10 @@ def create_super_user( def create_user_longterm_token(db: Session = Depends(get_session)) -> dict: - super_user = create_super_user(db) + settings_manager = get_settings_manager() + username = settings_manager.auth_settings.FIRST_SUPERUSER + password = settings_manager.auth_settings.FIRST_SUPERUSER_PASSWORD + super_user = create_super_user(db, username=username, password=password) access_token_expires_longterm = timedelta(days=365) access_token = create_token( From 8d96c32c2b4a42dae66afaa562e6816a50cffefd Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 10:21:03 -0300 Subject: [PATCH 04/13] =?UTF-8?q?=F0=9F=94=A7=20chore(manager.py):=20add?= =?UTF-8?q?=20teardown=20method=20to=20DatabaseManager=20class=20for=20cle?= =?UTF-8?q?aning=20up=20the=20database=20=F0=9F=94=A7=20chore(manager.py):?= =?UTF-8?q?=20remove=20default=20superuser=20if=20auto=5Flogin=20is=20enab?= =?UTF-8?q?led=20during=20teardown=20to=20ensure=20clean=20database=20stat?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/services/database/manager.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/backend/langflow/services/database/manager.py b/src/backend/langflow/services/database/manager.py index 2b599a0ba..1159cbf7a 100644 --- a/src/backend/langflow/services/database/manager.py +++ b/src/backend/langflow/services/database/manager.py @@ -1,6 +1,7 @@ from pathlib import Path from typing import TYPE_CHECKING from langflow.services.base import Service +from langflow.services.database.models.user.crud import get_user_by_username from langflow.services.database.utils import Result, TableResults from langflow.services.utils import get_settings_manager from sqlalchemy import inspect @@ -159,3 +160,23 @@ class DatabaseManager(Service): ) logger.debug("Database and tables created successfully") + + def teardown(self): + logger.debug("Tearing down database") + try: + settings_manager = get_settings_manager() + # remove the default superuser if auto_login is enabled + # using the FIRST_SUPERUSER to get the user + if settings_manager.auth_settings.AUTO_LOGIN: + logger.debug("Removing default superuser") + username = settings_manager.auth_settings.FIRST_SUPERUSER + with Session(self.engine) as session: + user = get_user_by_username(session, username) + session.delete(user) + session.commit() + logger.debug("Default superuser removed") + + except Exception as exc: + logger.error(f"Error tearing down database: {exc}") + + self.engine.dispose() From d8c7450576b838ccbe21ed23a3e75257db0ed662 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 10:55:04 -0300 Subject: [PATCH 05/13] =?UTF-8?q?=F0=9F=94=A7=20chore(test=5Fuser.py):=20r?= =?UTF-8?q?efactor=20super=5Fuser=20fixture=20to=20use=20auth=20settings?= =?UTF-8?q?=20from=20settings=20manager=20for=20username=20and=20password?= =?UTF-8?q?=20=F0=9F=94=A7=20chore(test=5Fuser.py):=20refactor=20super=5Fu?= =?UTF-8?q?ser=20fixture=20to=20use=20auth=20settings=20from=20settings=20?= =?UTF-8?q?manager=20for=20username=20and=20password=20in=20create=5Fsuper?= =?UTF-8?q?=5Fuser=20function=20call?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_user.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_user.py b/tests/test_user.py index d734e4d61..35b724cc6 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -9,7 +9,13 @@ from langflow.services.database.models.user import UserUpdate @pytest.fixture def super_user(client, session): - return create_super_user(session) + settings_manager = get_settings_manager() + auth_settings = settings_manager.auth_settings + return create_super_user( + session, + username=auth_settings.FIRST_SUPERUSER, + password=auth_settings.FIRST_SUPERUSER_PASSWORD, + ) @pytest.fixture From 269cb9bc53d52f1636e4c248b208bfb73cdcb190 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:16:39 -0300 Subject: [PATCH 06/13] =?UTF-8?q?=F0=9F=90=9B=20fix(=5F=5Fmain=5F=5F.py):?= =?UTF-8?q?=20pass=20the=20session=20as=20a=20keyword=20argument=20'db'=20?= =?UTF-8?q?to=20the=20create=5Fsuper=5Fuser=20function=20for=20clarity=20a?= =?UTF-8?q?nd=20consistency=20=F0=9F=90=9B=20fix(test=5Fuser.py):=20pass?= =?UTF-8?q?=20the=20session=20as=20a=20keyword=20argument=20'db'=20to=20th?= =?UTF-8?q?e=20create=5Fsuper=5Fuser=20function=20for=20clarity=20and=20co?= =?UTF-8?q?nsistency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/__main__.py | 2 +- tests/test_user.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index b5ec034de..a08ae9fb0 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -356,7 +356,7 @@ def superuser( with session_getter(db_manager) as session: from langflow.services.auth.utils import create_super_user - if create_super_user(session, username, password): + if create_super_user(db=session, username=username, password=password): # Verify that the superuser was created from langflow.services.database.models.user.user import User diff --git a/tests/test_user.py b/tests/test_user.py index 35b724cc6..bc617e127 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -12,7 +12,7 @@ def super_user(client, session): settings_manager = get_settings_manager() auth_settings = settings_manager.auth_settings return create_super_user( - session, + db=session, username=auth_settings.FIRST_SUPERUSER, password=auth_settings.FIRST_SUPERUSER_PASSWORD, ) From 8429f3fe7241f6b5b814b9df00068d785e7be715 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:16:52 -0300 Subject: [PATCH 07/13] =?UTF-8?q?=F0=9F=90=9B=20fix(chat.py):=20fix=20typo?= =?UTF-8?q?=20in=20variable=20name=20'messsage'=20to=20'message'=20for=20b?= =?UTF-8?q?etter=20readability=20=F0=9F=94=A7=20chore(chat.py):=20refactor?= =?UTF-8?q?=20error=20handling=20in=20chat=20websocket=20to=20improve=20co?= =?UTF-8?q?de=20clarity=20and=20maintainability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index e4fc71343..9d322b03c 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -61,14 +61,13 @@ async def chat( await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=str(exc)) except Exception as exc: logger.error(f"Error in chat websocket: {exc}") - if isinstance(exc, HTTPException): - exc = exc.detail + messsage = exc.detail if isinstance(exc, HTTPException) else str(exc) if "Could not validate credentials" in str(exc): await websocket.close( code=status.WS_1008_POLICY_VIOLATION, reason="Unauthorized" ) else: - await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=str(exc)) + await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=messsage) @router.post("/build/init/{flow_id}", response_model=InitResponse, status_code=201) From 9eca124b1700eaeb8742b1f60c7170543fcb03f5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:17:16 -0300 Subject: [PATCH 08/13] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.py):=20raise=20H?= =?UTF-8?q?TTPException=20with=20status=20code=20400=20and=20detail=20mess?= =?UTF-8?q?age=20when=20FIRST=5FSUPERUSER=20credentials=20are=20missing=20?= =?UTF-8?q?in=20api=5Fkey=5Fsecurity=20function=20=F0=9F=90=9B=20fix(utils?= =?UTF-8?q?.py):=20raise=20credentials=5Fexception=20when=20SECRET=5FKEY?= =?UTF-8?q?=20is=20None=20in=20get=5Fcurrent=5Fuser=20function=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(utils.py):=20raise=20HTTPException=20with=20?= =?UTF-8?q?status=20code=20400=20and=20detail=20message=20when=20FIRST=5FS?= =?UTF-8?q?UPERUSER=20credentials=20are=20missing=20in=20create=5Fuser=5Fl?= =?UTF-8?q?ongterm=5Ftoken=20function=20=F0=9F=90=9B=20fix(auth.py):=20set?= =?UTF-8?q?=20SECRET=5FKEY=20default=20value=20to=20empty=20string=20and?= =?UTF-8?q?=20disallow=20mutation=20in=20AuthSettings=20class=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(auth.py):=20set=20FIRST=5FSUPERUSER=20and=20?= =?UTF-8?q?FIRST=5FSUPERUSER=5FPASSWORD=20as=20optional=20fields=20with=20?= =?UTF-8?q?default=20values=20and=20disallow=20mutation=20in=20AuthSetting?= =?UTF-8?q?s=20class=20=F0=9F=90=9B=20fix(manager.py):=20raise=20ValueErro?= =?UTF-8?q?r=20when=20CONFIG=5FDIR=20is=20not=20set=20in=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/auth/utils.py | 21 +++++++++++++++---- .../langflow/services/settings/auth.py | 19 +++++++++++++---- .../langflow/services/settings/manager.py | 8 ++++++- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/backend/langflow/services/auth/utils.py b/src/backend/langflow/services/auth/utils.py index a53a182c0..485968a38 100644 --- a/src/backend/langflow/services/auth/utils.py +++ b/src/backend/langflow/services/auth/utils.py @@ -37,7 +37,12 @@ async def api_key_security( result: Optional[Union[ApiKey, User]] = None if settings_manager.auth_settings.AUTO_LOGIN: # Get the first user - settings_manager.auth_settings.FIRST_SUPERUSER + if not settings_manager.auth_settings.FIRST_SUPERUSER: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Missing first superuser credentials", + ) + result = get_user_by_username( db, settings_manager.auth_settings.FIRST_SUPERUSER ) @@ -80,6 +85,9 @@ async def get_current_user( if isinstance(token, Coroutine): token = await token + if settings_manager.auth_settings.SECRET_KEY is None: + raise credentials_exception + try: payload = jwt.decode( token, @@ -150,9 +158,9 @@ def create_token(data: dict, expires_delta: timedelta): def create_super_user( + username: str, + password: str, db: Session = Depends(get_session), - username: Optional[str] = None, - password: Optional[str] = None, ) -> User: super_user = get_user_by_username(db, username) @@ -176,7 +184,12 @@ def create_user_longterm_token(db: Session = Depends(get_session)) -> dict: settings_manager = get_settings_manager() username = settings_manager.auth_settings.FIRST_SUPERUSER password = settings_manager.auth_settings.FIRST_SUPERUSER_PASSWORD - super_user = create_super_user(db, username=username, password=password) + if not username or not password: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Missing first superuser credentials", + ) + super_user = create_super_user(db=db, username=username, password=password) access_token_expires_longterm = timedelta(days=365) access_token = create_token( diff --git a/src/backend/langflow/services/settings/auth.py b/src/backend/langflow/services/settings/auth.py index 7550d3ddd..c38417502 100644 --- a/src/backend/langflow/services/settings/auth.py +++ b/src/backend/langflow/services/settings/auth.py @@ -11,10 +11,11 @@ from langflow.utils.logger import logger class AuthSettings(BaseSettings): # Login settings CONFIG_DIR: str - SECRET_KEY: Optional[str] = Field( - None, + SECRET_KEY: str = Field( + default="", description="Secret key for JWT. If not provided, a random one will be generated.", env="LANGFLOW_SECRET_KEY", + allow_mutation=False, ) ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 @@ -30,8 +31,18 @@ class AuthSettings(BaseSettings): # If AUTO_LOGIN = True # > The application does not request login and logs in automatically as a super user. AUTO_LOGIN: bool = False - FIRST_SUPERUSER: str = "langflow" - FIRST_SUPERUSER_PASSWORD: str = "langflow" + FIRST_SUPERUSER: Optional[str] = Field( + "langflow", + description="First super user to be created if AUTO_LOGIN is True.", + env="LANGFLOW_FIRST_SUPERUSER", + allow_mutation=False, + ) + FIRST_SUPERUSER_PASSWORD: Optional[str] = Field( + "langflow", + description="First super user password to be created if AUTO_LOGIN is True.", + env="LANGFLOW_FIRST_SUPERUSER_PASSWORD", + allow_mutation=False, + ) pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") diff --git a/src/backend/langflow/services/settings/manager.py b/src/backend/langflow/services/settings/manager.py index 67e06108e..cef212c4e 100644 --- a/src/backend/langflow/services/settings/manager.py +++ b/src/backend/langflow/services/settings/manager.py @@ -35,5 +35,11 @@ class SettingsManager(Service): ) settings = Settings(**settings_dict) - auth_settings = AuthSettings(CONFIG_DIR=settings.CONFIG_DIR) + if not settings.CONFIG_DIR: + raise ValueError("CONFIG_DIR must be set in settings") + auth_settings = AuthSettings( + CONFIG_DIR=settings.CONFIG_DIR, + FIRST_SUPERUSER=None, + FIRST_SUPERUSER_PASSWORD=None, + ) return cls(settings, auth_settings) From 942c48955285aa92191900fb33a1ed79300e8420 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:17:28 -0300 Subject: [PATCH 09/13] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.py):=20change=20?= =?UTF-8?q?file=20mode=20from=20"rb"=20to=20"r"=20when=20reading=20secret?= =?UTF-8?q?=20from=20file=20to=20fix=20incorrect=20file=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/settings/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/services/settings/utils.py b/src/backend/langflow/services/settings/utils.py index 5eb4cd787..bb411a299 100644 --- a/src/backend/langflow/services/settings/utils.py +++ b/src/backend/langflow/services/settings/utils.py @@ -43,5 +43,5 @@ def write_secret_to_file(path: Path, value: str) -> None: def read_secret_from_file(path: Path) -> str: - with path.open("rb") as f: + with path.open("r") as f: return f.read() From 4010f5669e42b5c2a76c60b766e712446f41ab5f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:17:38 -0300 Subject: [PATCH 10/13] =?UTF-8?q?=F0=9F=94=A7=20chore(pyproject.toml):=20a?= =?UTF-8?q?dd=20types-pywin32=20as=20a=20dependency=20to=20support=20Windo?= =?UTF-8?q?ws-specific=20functionality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 13 ++++++++++++- pyproject.toml | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 675118488..cdb1ffd1a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -7041,6 +7041,17 @@ files = [ {file = "types_pytz-2023.3.0.1-py3-none-any.whl", hash = "sha256:65152e872137926bb67a8fe6cc9cfd794365df86650c5d5fdc7b167b0f38892e"}, ] +[[package]] +name = "types-pywin32" +version = "306.0.0.4" +description = "Typing stubs for pywin32" +optional = false +python-versions = "*" +files = [ + {file = "types-pywin32-306.0.0.4.tar.gz", hash = "sha256:ae4bbec80d535053236d4bebedf55f58dee89cf5883d277f0fa89e857f3ff337"}, + {file = "types_pywin32-306.0.0.4-py3-none-any.whl", hash = "sha256:f76a343ed6933008af85e158063963f923e54f2f461e697b2929b4178c7b77a1"}, +] + [[package]] name = "types-pyyaml" version = "6.0.12.11" @@ -7773,4 +7784,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "c877b4d713eef71815d858d30976ab21c42e5eadcc2df8159e940e03323681ee" +content-hash = "a3a506d483c2db7169a9790090095d1764aa5be223d135c6fc3fc2768dfef36c" diff --git a/pyproject.toml b/pyproject.toml index f852c2a7c..796145886 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,7 @@ types-python-jose = "^3.3.4.8" types-passlib = "^1.7.7.13" pytest-mock = "^3.11.1" pytest-xdist = "^3.3.1" +types-pywin32 = "^306.0.0.4" [tool.poetry.extras] From c7b500dd5c8a4c753bd8eed8ca6411f48b316f4c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:27:45 -0300 Subject: [PATCH 11/13] =?UTF-8?q?=F0=9F=94=A7=20fix(base.py):=20fix=20comm?= =?UTF-8?q?ent=20indentation=20for=20better=20readability=20=F0=9F=94=A7?= =?UTF-8?q?=20fix(users.py):=20fix=20code=20formatting=20and=20indentation?= =?UTF-8?q?=20for=20better=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/base.py | 4 ++-- src/backend/langflow/api/v1/users.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/api/v1/base.py b/src/backend/langflow/api/v1/base.py index 39c8b0b9f..acffc1bc3 100644 --- a/src/backend/langflow/api/v1/base.py +++ b/src/backend/langflow/api/v1/base.py @@ -21,7 +21,7 @@ class FrontendNodeRequest(FrontendNode): class ValidatePromptRequest(BaseModel): name: str template: str - #optional for tweak call + # optional for tweak call frontend_node: Optional[FrontendNodeRequest] @@ -41,7 +41,7 @@ class CodeValidationResponse(BaseModel): class PromptValidationResponse(BaseModel): input_variables: list - #object return for tweak call + # object return for tweak call frontend_node: FrontendNodeRequest | object diff --git a/src/backend/langflow/api/v1/users.py b/src/backend/langflow/api/v1/users.py index 7365e7cc1..5094409cb 100644 --- a/src/backend/langflow/api/v1/users.py +++ b/src/backend/langflow/api/v1/users.py @@ -43,7 +43,9 @@ def add_user( db.refresh(new_user) except IntegrityError as e: db.rollback() - raise HTTPException(status_code=400, detail="This username is unavailable.") from e + raise HTTPException( + status_code=400, detail="This username is unavailable." + ) from e return new_user From 156d8bb089318c0622f25c9bedbb6899b00cc377 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:43:41 -0300 Subject: [PATCH 12/13] =?UTF-8?q?=F0=9F=94=A7=20chore(auth.py):=20remove?= =?UTF-8?q?=20unnecessary=20comments=20and=20fields=20in=20AuthSettings=20?= =?UTF-8?q?class=20=F0=9F=94=A7=20chore(manager.py):=20remove=20unnecessar?= =?UTF-8?q?y=20arguments=20in=20AuthSettings=20instantiation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/settings/auth.py | 14 ++------------ src/backend/langflow/services/settings/manager.py | 3 +-- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/backend/langflow/services/settings/auth.py b/src/backend/langflow/services/settings/auth.py index c38417502..582aecb90 100644 --- a/src/backend/langflow/services/settings/auth.py +++ b/src/backend/langflow/services/settings/auth.py @@ -31,18 +31,8 @@ class AuthSettings(BaseSettings): # If AUTO_LOGIN = True # > The application does not request login and logs in automatically as a super user. AUTO_LOGIN: bool = False - FIRST_SUPERUSER: Optional[str] = Field( - "langflow", - description="First super user to be created if AUTO_LOGIN is True.", - env="LANGFLOW_FIRST_SUPERUSER", - allow_mutation=False, - ) - FIRST_SUPERUSER_PASSWORD: Optional[str] = Field( - "langflow", - description="First super user password to be created if AUTO_LOGIN is True.", - env="LANGFLOW_FIRST_SUPERUSER_PASSWORD", - allow_mutation=False, - ) + FIRST_SUPERUSER: str = "langflow" + FIRST_SUPERUSER_PASSWORD: str = "langflow" pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") diff --git a/src/backend/langflow/services/settings/manager.py b/src/backend/langflow/services/settings/manager.py index cef212c4e..b0af8b7f1 100644 --- a/src/backend/langflow/services/settings/manager.py +++ b/src/backend/langflow/services/settings/manager.py @@ -37,9 +37,8 @@ class SettingsManager(Service): settings = Settings(**settings_dict) if not settings.CONFIG_DIR: raise ValueError("CONFIG_DIR must be set in settings") + auth_settings = AuthSettings( CONFIG_DIR=settings.CONFIG_DIR, - FIRST_SUPERUSER=None, - FIRST_SUPERUSER_PASSWORD=None, ) return cls(settings, auth_settings) From 594dfb13c1f5a116268137763ef7cdd78a6972fa Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 31 Aug 2023 11:49:51 -0300 Subject: [PATCH 13/13] =?UTF-8?q?=F0=9F=94=80=20chore(manager.py):=20ignor?= =?UTF-8?q?e=20type=20error=20for=20session=5Fmanager=5Ffactory=20import?= =?UTF-8?q?=20to=20prevent=20linting=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/services/manager.py b/src/backend/langflow/services/manager.py index bfe83fce8..ca9eb4e70 100644 --- a/src/backend/langflow/services/manager.py +++ b/src/backend/langflow/services/manager.py @@ -135,7 +135,7 @@ def initialize_session_manager(): """ Initialize the session manager. """ - from langflow.services.session import factory as session_manager_factory + from langflow.services.session import factory as session_manager_factory # type: ignore from langflow.services.cache import factory as cache_factory initialize_settings_manager()