From 35e24610aff53861149356f9524ee22cef7a0303 Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Wed, 30 Aug 2023 17:29:00 -0300 Subject: [PATCH 01/19] Refactor: Add trim() to login form --- src/frontend/src/pages/loginPage/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/pages/loginPage/index.tsx b/src/frontend/src/pages/loginPage/index.tsx index 14e04708b..c64fc8325 100644 --- a/src/frontend/src/pages/loginPage/index.tsx +++ b/src/frontend/src/pages/loginPage/index.tsx @@ -31,8 +31,8 @@ export default function LoginPage(): JSX.Element { function signIn() { const user: LoginType = { - username: username, - password: password, + username: username.trim(), + password: password.trim(), }; onLogin(user) .then((user) => { From 4739372e201a2b2028c5deb21556cda7f5aa4e7e Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Wed, 30 Aug 2023 17:40:18 -0300 Subject: [PATCH 02/19] Refactor: Add trim() to signUp page --- src/frontend/src/pages/signUpPage/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/pages/signUpPage/index.tsx b/src/frontend/src/pages/signUpPage/index.tsx index 92f3eff97..9a5de5991 100644 --- a/src/frontend/src/pages/signUpPage/index.tsx +++ b/src/frontend/src/pages/signUpPage/index.tsx @@ -33,8 +33,8 @@ export default function SignUp(): JSX.Element { function handleSignup(): void { const { username, password } = inputState; const newUser: UserInputType = { - username, - password, + username: username.trim(), + password: password.trim(), }; addUser(newUser) .then((user) => { From 158ef9a9eab7470eaf0d0d3c16dfbc97f91811bc Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Wed, 30 Aug 2023 17:48:17 -0300 Subject: [PATCH 03/19] Refactor: Remove duplicate login button and bring back button borders back --- .../src/components/headerComponent/index.tsx | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index c74cdaa76..8cbd5a591 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -32,7 +32,8 @@ export default function Header(): JSX.Element { )} {!autoLogin && location.pathname !== `/flow/${tabId}` && ( - { logout(); navigate("/login"); @@ -40,30 +41,20 @@ export default function Header(): JSX.Element { className="text-sm font-medium text-muted-foreground transition-colors hover:text-primary cursor-pointer mx-5" > Sign out - - )} - - {location.pathname === "/admin" && ( - { - navigate("/"); - }} - className="text-sm font-medium text-muted-foreground transition-colors hover:text-primary cursor-pointer" - > - Home - + )} {isAdmin && !autoLogin && location.pathname !== "/admin" && location.pathname !== `/flow/${tabId}` && ( - navigate("/admin")} > Admin page - + )}
From 6d6ab9a8740bc632347c5f3b40291bdb549a9a54 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 2 Sep 2023 21:36:49 +0000 Subject: [PATCH 04/19] added missing backslashes to api key request definition --- src/frontend/src/controllers/API/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 780d784e5..d9ea890c8 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -468,7 +468,7 @@ export async function updateUser(user_id: string, user: Users) { export async function getApiKey() { try { - const res = await api.get(`${BASE_URL_API}api_key`); + const res = await api.get(`${BASE_URL_API}api_key/`); if (res.status === 200) { return res.data; } @@ -480,7 +480,7 @@ export async function getApiKey() { export async function createApiKey(name: string) { try { - const res = await api.post(`${BASE_URL_API}api_key`, { name }); + const res = await api.post(`${BASE_URL_API}api_key/`, { name }); if (res.status === 200) { return res.data; } From 2bbbf44b39374546bf01fe7973d99455fc8ee211 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 06:41:34 -0300 Subject: [PATCH 05/19] =?UTF-8?q?=F0=9F=90=9B=20fix(endpoints.py):=20chang?= =?UTF-8?q?e=20get=5Fall=20function=20signature=20to=20include=20settings?= =?UTF-8?q?=5Fmanager=20as=20a=20dependency=20to=20improve=20code=20readab?= =?UTF-8?q?ility=20=F0=9F=90=9B=20fix(flows.py):=20change=20update=5Fflow?= =?UTF-8?q?=20function=20signature=20to=20include=20settings=5Fmanager=20a?= =?UTF-8?q?s=20a=20dependency=20to=20improve=20code=20readability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(login.py):=20change=20auto=5Flogin=20functio?= =?UTF-8?q?n=20signature=20to=20include=20settings=5Fmanager=20as=20a=20de?= =?UTF-8?q?pendency=20to=20improve=20code=20readability=20=F0=9F=90=9B=20f?= =?UTF-8?q?ix(users.py):=20change=20add=5Fuser=20function=20signature=20to?= =?UTF-8?q?=20include=20session=20as=20a=20dependency=20to=20improve=20cod?= =?UTF-8?q?e=20readability=20=F0=9F=90=9B=20fix(users.py):=20change=20read?= =?UTF-8?q?=5Fall=5Fusers=20function=20signature=20to=20include=20session?= =?UTF-8?q?=20as=20a=20dependency=20to=20improve=20code=20readability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(users.py):=20change=20patch=5Fuser=20functio?= =?UTF-8?q?n=20signature=20to=20include=20session=20as=20a=20dependency=20?= =?UTF-8?q?to=20improve=20code=20readability=20=F0=9F=90=9B=20fix(users.py?= =?UTF-8?q?):=20change=20delete=5Fuser=20function=20signature=20to=20inclu?= =?UTF-8?q?de=20session=20as=20a=20dependency=20to=20improve=20code=20read?= =?UTF-8?q?ability=20=F0=9F=90=9B=20fix(users.py):=20change=20add=5Fsuper?= =?UTF-8?q?=5Fuser=5Ffor=5Ftesting=5Fpurposes=5Fdelete=5Fme=5Fbefore=5Fmer?= =?UTF-8?q?ge=5Finto=5Fdev=20function=20signature=20to=20include=20session?= =?UTF-8?q?=20as=20a=20dependency=20to=20improve=20code=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/endpoints.py | 7 +++-- src/backend/langflow/api/v1/flows.py | 2 +- src/backend/langflow/api/v1/login.py | 6 ++-- src/backend/langflow/api/v1/users.py | 38 ++++++++++++------------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 813aaf415..05477a859 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -34,14 +34,15 @@ from sqlmodel import Session router = APIRouter(tags=["Base"]) -@router.get("/all") -def get_all(current_user: User = Depends(get_current_active_user)): +@router.get("/all", dependencies=[Depends(get_current_active_user)]) +def get_all( + settings_manager=Depends(get_settings_manager), +): logger.debug("Building langchain types dict") native_components = build_langchain_types_dict() # custom_components is a list of dicts # need to merge all the keys into one dict custom_components_from_file: dict[str, Any] = {} - settings_manager = get_settings_manager() if settings_manager.settings.COMPONENTS_PATH: logger.info( f"Building custom components from {settings_manager.settings.COMPONENTS_PATH}" diff --git a/src/backend/langflow/api/v1/flows.py b/src/backend/langflow/api/v1/flows.py index b215b9f95..be65048d4 100644 --- a/src/backend/langflow/api/v1/flows.py +++ b/src/backend/langflow/api/v1/flows.py @@ -83,6 +83,7 @@ def update_flow( flow_id: UUID, flow: FlowUpdate, current_user: User = Depends(get_current_active_user), + settings_manager=Depends(get_settings_manager), ): """Update a flow.""" @@ -90,7 +91,6 @@ def update_flow( if not db_flow: raise HTTPException(status_code=404, detail="Flow not found") flow_data = flow.dict(exclude_unset=True) - settings_manager = get_settings_manager() if settings_manager.settings.REMOVE_API_KEYS: flow_data = remove_api_keys(flow_data) for key, value in flow_data.items(): diff --git a/src/backend/langflow/api/v1/login.py b/src/backend/langflow/api/v1/login.py index afe67a916..4241b8d47 100644 --- a/src/backend/langflow/api/v1/login.py +++ b/src/backend/langflow/api/v1/login.py @@ -34,9 +34,9 @@ async def login_to_get_access_token( @router.get("/auto_login") -async def auto_login(db: Session = Depends(get_session)): - settings_manager = get_settings_manager() - +async def auto_login( + db: Session = Depends(get_session), settings_manager=Depends(get_settings_manager) +): if settings_manager.auth_settings.AUTO_LOGIN: return create_user_longterm_token(db) diff --git a/src/backend/langflow/api/v1/users.py b/src/backend/langflow/api/v1/users.py index 5094409cb..517dd7f69 100644 --- a/src/backend/langflow/api/v1/users.py +++ b/src/backend/langflow/api/v1/users.py @@ -29,7 +29,7 @@ router = APIRouter(tags=["Users"]) @router.post("/user", response_model=UserRead, status_code=201) def add_user( user: UserCreate, - db: Session = Depends(get_session), + session: Session = Depends(get_session), ) -> User: """ Add a new user to the database. @@ -38,11 +38,11 @@ def add_user( try: new_user.password = get_password_hash(user.password) - db.add(new_user) - db.commit() - db.refresh(new_user) + session.add(new_user) + session.commit() + session.refresh(new_user) except IntegrityError as e: - db.rollback() + session.rollback() raise HTTPException( status_code=400, detail="This username is unavailable." ) from e @@ -65,16 +65,16 @@ def read_all_users( skip: int = 0, limit: int = 10, current_user: Session = Depends(get_current_active_superuser), - db: Session = Depends(get_session), + session: Session = Depends(get_session), ) -> UsersResponse: """ Retrieve a list of users from the database with pagination. """ query = select(User).offset(skip).limit(limit) - users = db.execute(query).fetchall() + users = session.execute(query).fetchall() count_query = select(func.count()).select_from(User) # type: ignore - total_count = db.execute(count_query).scalar() + total_count = session.execute(count_query).scalar() return UsersResponse( total_count=total_count, # type: ignore @@ -87,19 +87,19 @@ def patch_user( user_id: UUID, user: UserUpdate, _: Session = Depends(get_current_active_user), - db: Session = Depends(get_session), + session: Session = Depends(get_session), ) -> User: """ Update an existing user's data. """ - return update_user(user_id, user, db) + return update_user(user_id, user, session) @router.delete("/user/{user_id}") def delete_user( user_id: UUID, current_user: User = Depends(get_current_active_superuser), - db: Session = Depends(get_session), + session: Session = Depends(get_session), ) -> dict: """ Delete a user from the database. @@ -113,12 +113,12 @@ def delete_user( status_code=403, detail="You don't have the permission to delete this user" ) - user_db = db.query(User).filter(User.id == user_id).first() + user_db = session.query(User).filter(User.id == user_id).first() if not user_db: raise HTTPException(status_code=404, detail="User not found") - db.delete(user_db) - db.commit() + session.delete(user_db) + session.commit() return {"detail": "User deleted"} @@ -126,7 +126,7 @@ def delete_user( # TODO: REMOVE - Just for testing purposes @router.post("/super_user", response_model=User) def add_super_user_for_testing_purposes_delete_me_before_merge_into_dev( - db: Session = Depends(get_session), + session: Session = Depends(get_session), ) -> User: """ Add a superuser for testing purposes. @@ -141,11 +141,11 @@ def add_super_user_for_testing_purposes_delete_me_before_merge_into_dev( ) try: - db.add(new_user) - db.commit() - db.refresh(new_user) + session.add(new_user) + session.commit() + session.refresh(new_user) except IntegrityError as e: - db.rollback() + session.rollback() raise HTTPException(status_code=400, detail="User exists") from e return new_user From 84a0d3acb39c14f8e0f51a2cd8f2dac11904fc89 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 06:42:01 -0300 Subject: [PATCH 06/19] =?UTF-8?q?=F0=9F=94=A7=20fix(chat.py):=20remove=20u?= =?UTF-8?q?nused=20imports=20and=20type=20hints=20to=20improve=20code=20re?= =?UTF-8?q?adability=20=E2=9C=A8=20feat(chat.py):=20add=20dependency=20inj?= =?UTF-8?q?ection=20for=20ChatManager=20in=20chat=20and=20init=5Fbuild=20r?= =?UTF-8?q?outes=20to=20improve=20modularity=20and=20testability=20?= =?UTF-8?q?=F0=9F=94=A7=20fix(chat.py):=20remove=20duplicate=20instantiati?= =?UTF-8?q?on=20of=20ChatManager=20in=20chat=20and=20init=5Fbuild=20routes?= =?UTF-8?q?=20to=20improve=20efficiency=20=F0=9F=94=A7=20fix(chat.py):=20r?= =?UTF-8?q?emove=20duplicate=20instantiation=20of=20ChatManager=20in=20str?= =?UTF-8?q?eam=5Fbuild=20route=20to=20improve=20efficiency=20=F0=9F=94=A7?= =?UTF-8?q?=20fix(utils.py):=20add=20missing=20import=20for=20ChatManager?= =?UTF-8?q?=20in=20get=5Fchat=5Fmanager=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 20 ++++++++++---------- src/backend/langflow/services/utils.py | 8 +++++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 9d322b03c..2c276c75d 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -11,17 +11,14 @@ from fastapi.responses import StreamingResponse from langflow.api.utils import build_input_keys_response from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData -from langflow.services import service_manager, ServiceType from langflow.graph.graph.base import Graph from langflow.services.auth.utils import get_current_active_user, get_current_user -from langflow.services.utils import get_session +from langflow.services.utils import get_chat_manager, get_session from langflow.utils.logger import logger from cachetools import LRUCache from sqlmodel import Session -from typing import TYPE_CHECKING +from langflow.services.chat.manager import ChatManager -if TYPE_CHECKING: - from langflow.services.chat.manager import ChatManager router = APIRouter(tags=["Chat"]) @@ -34,6 +31,7 @@ async def chat( websocket: WebSocket, token: str = Query(...), db: Session = Depends(get_session), + chat_manager: "ChatManager" = Depends(get_chat_manager), ): """Websocket endpoint for chat.""" try: @@ -48,7 +46,6 @@ async def chat( code=status.WS_1008_POLICY_VIOLATION, reason="Unauthorized" ) - chat_manager: "ChatManager" = service_manager.get(ServiceType.CHAT_MANAGER) if client_id in chat_manager.in_memory_cache: await chat_manager.handle_websocket(client_id, websocket) else: @@ -72,7 +69,10 @@ async def chat( @router.post("/build/init/{flow_id}", response_model=InitResponse, status_code=201) async def init_build( - graph_data: dict, flow_id: str, current_user=Depends(get_current_active_user) + graph_data: dict, + flow_id: str, + current_user=Depends(get_current_active_user), + chat_manager: "ChatManager" = Depends(get_chat_manager), ): """Initialize the build by storing graph data and returning a unique session ID.""" @@ -87,7 +87,6 @@ async def init_build( return InitResponse(flowId=flow_id) # Delete from cache if already exists - chat_manager = service_manager.get(ServiceType.CHAT_MANAGER) if flow_id in chat_manager.in_memory_cache: with chat_manager.in_memory_cache._lock: chat_manager.in_memory_cache.delete(flow_id) @@ -123,7 +122,9 @@ async def build_status(flow_id: str): @router.get("/build/stream/{flow_id}", response_class=StreamingResponse) -async def stream_build(flow_id: str): +async def stream_build( + flow_id: str, chat_manager: "ChatManager" = Depends(get_chat_manager) +): """Stream the build process based on stored flow data.""" async def event_stream(flow_id): @@ -202,7 +203,6 @@ async def stream_build(flow_id: str): "handle_keys": [], } yield str(StreamData(event="message", data=input_keys_response)) - chat_manager = service_manager.get(ServiceType.CHAT_MANAGER) chat_manager.set_cache(flow_id, langchain_object) # We need to reset the chat history chat_manager.chat_history.empty_history(flow_id) diff --git a/src/backend/langflow/services/utils.py b/src/backend/langflow/services/utils.py index 6860f8928..708377d14 100644 --- a/src/backend/langflow/services/utils.py +++ b/src/backend/langflow/services/utils.py @@ -5,6 +5,8 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: from langflow.services.database.manager import DatabaseManager from langflow.services.settings.manager import SettingsManager + from langflow.services.chat.manager import ChatManager + from sqlmodel import Session def get_settings_manager() -> "SettingsManager": @@ -15,6 +17,10 @@ def get_db_manager() -> "DatabaseManager": return service_manager.get(ServiceType.DATABASE_MANAGER) -def get_session(): +def get_session() -> "Session": db_manager = service_manager.get(ServiceType.DATABASE_MANAGER) yield from db_manager.get_session() + + +def get_chat_manager() -> "ChatManager": + return service_manager.get(ServiceType.CHAT_MANAGER) From 37ebbf4e65bfae98f54515c888df106c1b107bfd Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 06:42:41 -0300 Subject: [PATCH 07/19] Formatting --- .../DropdownButtonComponent/index.tsx | 4 +--- src/frontend/src/contexts/tabsContext.tsx | 6 ++++-- src/frontend/src/pages/MainPage/index.tsx | 19 +++++++++++++------ src/frontend/src/types/components/index.ts | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/components/DropdownButtonComponent/index.tsx b/src/frontend/src/components/DropdownButtonComponent/index.tsx index 1ddddb3c1..784a08528 100644 --- a/src/frontend/src/components/DropdownButtonComponent/index.tsx +++ b/src/frontend/src/components/DropdownButtonComponent/index.tsx @@ -39,9 +39,7 @@ export default function DropdownButton({ }} > {!showOptions ? ( - + ) : ( )} diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/tabsContext.tsx index 339ad67b5..49de70974 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/tabsContext.tsx @@ -315,9 +315,11 @@ export function TabsProvider({ children }: { children: ReactNode }) { input.type = "file"; input.accept = ".json"; // add a change event listener to the file input - id = await new Promise(resolve => { + id = await new Promise((resolve) => { input.onchange = async (e: Event) => { - if ((e.target as HTMLInputElement).files![0].type === "application/json") { + if ( + (e.target as HTMLInputElement).files![0].type === "application/json" + ) { const currentfile = (e.target as HTMLInputElement).files![0]; let text = await currentfile.text(); let flow: FlowType = JSON.parse(text); diff --git a/src/frontend/src/pages/MainPage/index.tsx b/src/frontend/src/pages/MainPage/index.tsx index 364519ea8..9582d4c57 100644 --- a/src/frontend/src/pages/MainPage/index.tsx +++ b/src/frontend/src/pages/MainPage/index.tsx @@ -1,5 +1,6 @@ import { useContext, useEffect } from "react"; import { Link, useNavigate } from "react-router-dom"; +import DropdownButton from "../../components/DropdownButtonComponent"; import { CardComponent } from "../../components/cardComponent"; import IconComponent from "../../components/genericIconComponent"; import Header from "../../components/headerComponent"; @@ -7,7 +8,6 @@ import { SkeletonCardComponent } from "../../components/skeletonCardComponent"; import { Button } from "../../components/ui/button"; import { USER_PROJECTS_HEADER } from "../../constants/constants"; import { TabsContext } from "../../contexts/tabsContext"; -import DropdownButton from "../../components/DropdownButtonComponent"; export default function HomePage(): JSX.Element { const { flows, @@ -15,12 +15,19 @@ export default function HomePage(): JSX.Element { downloadFlows, uploadFlows, addFlow, - removeFlow, uploadFlow, + removeFlow, + uploadFlow, isLoading, } = useContext(TabsContext); - const dropdownOptions = [{name: "Import from JSON", onBtnClick: () => uploadFlow(true).then((id) => { - navigate("/flow/" + id); - })}] + const dropdownOptions = [ + { + name: "Import from JSON", + onBtnClick: () => + uploadFlow(true).then((id) => { + navigate("/flow/" + id); + }), + }, + ]; // Set a null id useEffect(() => { @@ -73,7 +80,7 @@ export default function HomePage(): JSX.Element {
- Manage your personal projects. Download or upload your collection. + Manage your personal projects. Download or upload your collection.
{isLoading && flows.length == 0 ? ( diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index b61ddf07d..4b72ef36a 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -548,5 +548,5 @@ export type fetchErrorComponentType = { export type dropdownButtonPropsType = { firstButtonName: string; onFirstBtnClick: () => void; - options: Array<{ name: string; onBtnClick: () => void; }>; + options: Array<{ name: string; onBtnClick: () => void }>; }; From 43864904efd4051a91ee9e9160e9d97f7ba40a6e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 07:00:38 -0300 Subject: [PATCH 08/19] =?UTF-8?q?=F0=9F=94=A7=20chore(Makefile):=20update?= =?UTF-8?q?=20mypy=20command=20to=20only=20check=20files=20in=20src/backen?= =?UTF-8?q?d/langflow=20directory=20to=20improve=20performance=20and=20red?= =?UTF-8?q?uce=20noise=20in=20the=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 59dd4a82d..59f326853 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ format: cd src/frontend && npm run format lint: - poetry run mypy --exclude .venv . + poetry run mypy src/backend/langflow poetry run black . --check poetry run ruff . --fix From 833fb4ad8fdefba08477c7d520293697c129265e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 07:01:05 -0300 Subject: [PATCH 09/19] =?UTF-8?q?=F0=9F=94=80=20chore(utils.py):=20add=20t?= =?UTF-8?q?ype=20hint=20for=20get=5Fsession()=20function=20to=20indicate?= =?UTF-8?q?=20it=20returns=20a=20generator=20instead=20of=20a=20Session=20?= =?UTF-8?q?object?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/services/utils.py b/src/backend/langflow/services/utils.py index 708377d14..8b32aef02 100644 --- a/src/backend/langflow/services/utils.py +++ b/src/backend/langflow/services/utils.py @@ -1,5 +1,5 @@ from langflow.services import ServiceType, service_manager -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Generator if TYPE_CHECKING: @@ -17,7 +17,7 @@ def get_db_manager() -> "DatabaseManager": return service_manager.get(ServiceType.DATABASE_MANAGER) -def get_session() -> "Session": +def get_session() -> Generator["Session", None, None]: db_manager = service_manager.get(ServiceType.DATABASE_MANAGER) yield from db_manager.get_session() From 53c5a3ccdeef6baca22ae2136111f79091bcce88 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 07:05:10 -0300 Subject: [PATCH 10/19] =?UTF-8?q?=F0=9F=90=9B=20fix(base.py):=20make=20fro?= =?UTF-8?q?ntend=5Fnode=20field=20in=20PromptValidationResponse=20optional?= =?UTF-8?q?=20to=20handle=20cases=20where=20it=20is=20not=20provided?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/api/v1/base.py b/src/backend/langflow/api/v1/base.py index acffc1bc3..b1071bea2 100644 --- a/src/backend/langflow/api/v1/base.py +++ b/src/backend/langflow/api/v1/base.py @@ -42,7 +42,7 @@ class CodeValidationResponse(BaseModel): class PromptValidationResponse(BaseModel): input_variables: list # object return for tweak call - frontend_node: FrontendNodeRequest | object + frontend_node: Optional[FrontendNodeRequest] = None INVALID_CHARACTERS = { From b1c24054c6fbaf51b57d6a36247da15b6940181f Mon Sep 17 00:00:00 2001 From: root Date: Mon, 4 Sep 2023 11:41:34 +0000 Subject: [PATCH 11/19] added indent to index dropping on non-existing table --- .../langflow/alembic/versions/260dbcc8b680_adds_tables.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py b/src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py index 221e66933..53e049a05 100644 --- a/src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py +++ b/src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py @@ -30,10 +30,10 @@ def upgrade() -> None: # and other related indices if "flowstyle" in existing_tables: op.drop_table("flowstyle") - if "ix_flowstyle_flow_id" in [ - index["name"] for index in inspector.get_indexes("flowstyle") - ]: - op.drop_index("ix_flowstyle_flow_id", table_name="flowstyle") + if "ix_flowstyle_flow_id" in [ + index["name"] for index in inspector.get_indexes("flowstyle") + ]: + op.drop_index("ix_flowstyle_flow_id", table_name="flowstyle") existing_indices_flow = [] existing_fks_flow = [] From 2ab3fcb28a3fbabd3507deab7b03ae288d5555a1 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 10:04:21 -0300 Subject: [PATCH 12/19] =?UTF-8?q?=F0=9F=90=9B=20fix(base.py):=20set=20defa?= =?UTF-8?q?ult=20value=20of=20frontend=5Fnode=20to=20None=20in=20ValidateP?= =?UTF-8?q?romptRequest=20class=20to=20avoid=20potential=20NoneType=20erro?= =?UTF-8?q?rs=20=F0=9F=90=9B=20fix(validate.py):=20set=20frontend=5Fnode?= =?UTF-8?q?=20to=20None=20instead=20of=20an=20empty=20dictionary=20in=20po?= =?UTF-8?q?st=5Fvalidate=5Fprompt=20function=20to=20align=20with=20the=20d?= =?UTF-8?q?efault=20value=20in=20ValidatePromptRequest=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/base.py | 2 +- src/backend/langflow/api/v1/validate.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/api/v1/base.py b/src/backend/langflow/api/v1/base.py index b1071bea2..f2c2f3f59 100644 --- a/src/backend/langflow/api/v1/base.py +++ b/src/backend/langflow/api/v1/base.py @@ -22,7 +22,7 @@ class ValidatePromptRequest(BaseModel): name: str template: str # optional for tweak call - frontend_node: Optional[FrontendNodeRequest] + frontend_node: Optional[FrontendNodeRequest] = None # Build ValidationResponse class for {"imports": {"errors": []}, "function": {"errors": []}} diff --git a/src/backend/langflow/api/v1/validate.py b/src/backend/langflow/api/v1/validate.py index da76d25bc..64ef60549 100644 --- a/src/backend/langflow/api/v1/validate.py +++ b/src/backend/langflow/api/v1/validate.py @@ -35,7 +35,7 @@ def post_validate_prompt(prompt_request: ValidatePromptRequest): if prompt_request.frontend_node is None: return PromptValidationResponse( input_variables=input_variables, - frontend_node={}, + frontend_node=None, ) old_custom_fields = get_old_custom_fields(prompt_request) From 5f98f0bbd9997c803bf255c9a885ca8a4a0ce376 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 11:34:38 -0300 Subject: [PATCH 13/19] =?UTF-8?q?=F0=9F=93=A6=20chore(pyproject.toml):=20a?= =?UTF-8?q?dd=20loguru=20package=20as=20a=20dependency=20for=20improved=20?= =?UTF-8?q?logging=20capabilities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 10 +++++----- pyproject.toml | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index cdb1ffd1a..c2a290db4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3047,13 +3047,13 @@ server = ["fastapi (>=0.100.0)", "pydantic-settings (>=2.0.1)", "sse-starlette ( [[package]] name = "loguru" -version = "0.7.0" +version = "0.7.1" description = "Python logging made (stupidly) simple" optional = false python-versions = ">=3.5" files = [ - {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, - {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, + {file = "loguru-0.7.1-py3-none-any.whl", hash = "sha256:046bf970cb3cad77a28d607cbf042ac25a407db987a1e801c7f7e692469982f9"}, + {file = "loguru-0.7.1.tar.gz", hash = "sha256:7ba2a7d81b79a412b0ded69bd921e012335e80fd39937a633570f273a343579e"}, ] [package.dependencies] @@ -3061,7 +3061,7 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "pre-commit (==3.3.1)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] [[package]] name = "lxml" @@ -7784,4 +7784,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "a3a506d483c2db7169a9790090095d1764aa5be223d135c6fc3fc2768dfef36c" +content-hash = "6523f2e35458c6d0b8d281e20dd2233180128805ea07199c073224b0d6f75ee7" diff --git a/pyproject.toml b/pyproject.toml index 796145886..077a0cb39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,6 +84,7 @@ python-jose = "^3.3.0" metaphor-python = "^0.1.11" markupsafe = "^2.1.3" pywin32 = { version = "^306", markers = "sys_platform == 'win32'" } +loguru = "^0.7.1" [tool.poetry.group.dev.dependencies] black = "^23.1.0" From 87eb8b1a95f6af27daf7d8212fb1e586605ce0e9 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 11:35:22 -0300 Subject: [PATCH 14/19] =?UTF-8?q?=F0=9F=94=A7=20chore(logger.py):=20refact?= =?UTF-8?q?or=20logger=20configuration=20to=20use=20loguru=20library=20and?= =?UTF-8?q?=20improve=20log=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/utils/logger.py | 36 +++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/backend/langflow/utils/logger.py b/src/backend/langflow/utils/logger.py index deb0f75ca..b881a614c 100644 --- a/src/backend/langflow/utils/logger.py +++ b/src/backend/langflow/utils/logger.py @@ -1,30 +1,34 @@ -import logging +from loguru import logger from pathlib import Path - from rich.logging import RichHandler -logger = logging.getLogger("langflow") +def configure(log_level: str = "DEBUG", log_file: Path = None): + log_format = "{time:HH:mm:ss} - {level: <8} - {message}" + logger.remove() # Remove default handlers -def configure(log_level: str = "DEBUG", log_file: Path = None): # type: ignore - log_format = "%(asctime)s - %(levelname)s - %(message)s" - log_level_value = getattr(logging, log_level.upper(), logging.INFO) - - logging.basicConfig( - level=log_level_value, - format=log_format, - datefmt="[%X]", - handlers=[RichHandler(rich_tracebacks=True)], + # Configure loguru to use RichHandler + logger.configure( + handlers=[ + { + "sink": RichHandler(rich_tracebacks=True, markup=True), + "format": log_format, + "level": log_level, + } + ] ) if log_file: log_file = Path(log_file) log_file.parent.mkdir(parents=True, exist_ok=True) - file_handler = logging.FileHandler(log_file) - file_handler.setFormatter(logging.Formatter(log_format)) - logger.addHandler(file_handler) + logger.add( + sink=str(log_file), + level=log_level, + format=log_format, + rotation="10 MB", # Log rotation based on file size + ) - logger.info(f"Logger set up with log level: {log_level_value}({log_level})") + logger.info(f"Logger set up with log level: {log_level}") if log_file: logger.info(f"Log file: {log_file}") From 58c3e5e9dc588dee88600927a2f5b21a1ed545ba Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 11:38:39 -0300 Subject: [PATCH 15/19] refactor: :sparkles: replace loggers with loguru --- src/backend/langflow/api/v1/callback.py | 2 +- src/backend/langflow/api/v1/chat.py | 2 +- src/backend/langflow/api/v1/endpoints.py | 2 +- src/backend/langflow/api/v1/validate.py | 2 +- src/backend/langflow/graph/edge/base.py | 2 +- src/backend/langflow/graph/graph/base.py | 2 +- src/backend/langflow/graph/vertex/base.py | 2 +- src/backend/langflow/interface/agents/base.py | 2 +- src/backend/langflow/interface/base.py | 2 +- src/backend/langflow/interface/chains/base.py | 2 +- src/backend/langflow/interface/custom/base.py | 2 +- src/backend/langflow/interface/custom/directory_reader.py | 2 +- src/backend/langflow/interface/document_loaders/base.py | 2 +- src/backend/langflow/interface/embeddings/base.py | 2 +- src/backend/langflow/interface/initialize/loading.py | 2 +- src/backend/langflow/interface/llms/base.py | 2 +- src/backend/langflow/interface/memories/base.py | 2 +- src/backend/langflow/interface/output_parsers/base.py | 2 +- src/backend/langflow/interface/prompts/base.py | 2 +- src/backend/langflow/interface/retrievers/base.py | 2 +- src/backend/langflow/interface/run.py | 2 +- src/backend/langflow/interface/text_splitters/base.py | 2 +- src/backend/langflow/interface/toolkits/base.py | 2 +- src/backend/langflow/interface/tools/util.py | 2 +- src/backend/langflow/interface/types.py | 2 +- src/backend/langflow/interface/utilities/base.py | 2 +- src/backend/langflow/interface/utils.py | 2 +- src/backend/langflow/interface/vector_store/base.py | 2 +- src/backend/langflow/interface/wrappers/base.py | 2 +- src/backend/langflow/processing/base.py | 2 +- src/backend/langflow/processing/process.py | 2 +- src/backend/langflow/services/chat/manager.py | 2 +- src/backend/langflow/services/chat/utils.py | 2 +- src/backend/langflow/services/database/manager.py | 2 +- src/backend/langflow/services/database/utils.py | 2 +- src/backend/langflow/services/manager.py | 2 +- src/backend/langflow/services/settings/auth.py | 2 +- src/backend/langflow/services/settings/base.py | 2 +- src/backend/langflow/services/settings/manager.py | 2 +- src/backend/langflow/services/settings/utils.py | 2 +- 40 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/backend/langflow/api/v1/callback.py b/src/backend/langflow/api/v1/callback.py index 69dbf5082..2a16a0bd2 100644 --- a/src/backend/langflow/api/v1/callback.py +++ b/src/backend/langflow/api/v1/callback.py @@ -10,7 +10,7 @@ from fastapi import WebSocket from langchain.schema import AgentAction, LLMResult, AgentFinish -from langflow.utils.logger import logger +from loguru import logger # https://github.com/hwchase17/chat-langchain/blob/master/callback.py diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 9d322b03c..a79ed2ccd 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -15,7 +15,7 @@ from langflow.services import service_manager, ServiceType from langflow.graph.graph.base import Graph from langflow.services.auth.utils import get_current_active_user, get_current_user from langflow.services.utils import get_session -from langflow.utils.logger import logger +from loguru import logger from cachetools import LRUCache from sqlmodel import Session from typing import TYPE_CHECKING diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 813aaf415..957e003bc 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -7,7 +7,7 @@ from langflow.services.database.models.flow import Flow from langflow.processing.process import process_graph_cached, process_tweaks from langflow.services.database.models.user.user import User from langflow.services.utils import get_settings_manager -from langflow.utils.logger import logger +from loguru import logger from fastapi import APIRouter, Depends, HTTPException, UploadFile, Body, status import sqlalchemy as sa from langflow.interface.custom.custom_component import CustomComponent diff --git a/src/backend/langflow/api/v1/validate.py b/src/backend/langflow/api/v1/validate.py index da76d25bc..4a3ee71c6 100644 --- a/src/backend/langflow/api/v1/validate.py +++ b/src/backend/langflow/api/v1/validate.py @@ -8,7 +8,7 @@ from langflow.api.v1.base import ( validate_prompt, ) from langflow.template.field.base import TemplateField -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.validate import validate_code # build router diff --git a/src/backend/langflow/graph/edge/base.py b/src/backend/langflow/graph/edge/base.py index dc7eab328..2df20cbde 100644 --- a/src/backend/langflow/graph/edge/base.py +++ b/src/backend/langflow/graph/edge/base.py @@ -1,4 +1,4 @@ -from langflow.utils.logger import logger +from loguru import logger from typing import TYPE_CHECKING if TYPE_CHECKING: diff --git a/src/backend/langflow/graph/graph/base.py b/src/backend/langflow/graph/graph/base.py index 2b22d352c..94964e472 100644 --- a/src/backend/langflow/graph/graph/base.py +++ b/src/backend/langflow/graph/graph/base.py @@ -10,7 +10,7 @@ from langflow.graph.vertex.types import ( ) from langflow.interface.tools.constants import FILE_TOOLS from langflow.utils import payload -from langflow.utils.logger import logger +from loguru import logger from langchain.chains.base import Chain diff --git a/src/backend/langflow/graph/vertex/base.py b/src/backend/langflow/graph/vertex/base.py index d5c4beed9..0f9a5e8a9 100644 --- a/src/backend/langflow/graph/vertex/base.py +++ b/src/backend/langflow/graph/vertex/base.py @@ -3,7 +3,7 @@ from langflow.graph.utils import UnbuiltObject from langflow.interface.initialize import loading from langflow.interface.listing import lazy_load_dict from langflow.utils.constants import DIRECT_TYPES -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import sync_to_async diff --git a/src/backend/langflow/interface/agents/base.py b/src/backend/langflow/interface/agents/base.py index ec8c42aba..574264e47 100644 --- a/src/backend/langflow/interface/agents/base.py +++ b/src/backend/langflow/interface/agents/base.py @@ -8,7 +8,7 @@ from langflow.interface.base import LangChainTypeCreator from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.agents import AgentFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method diff --git a/src/backend/langflow/interface/base.py b/src/backend/langflow/interface/base.py index d1ed83b5a..b006a3174 100644 --- a/src/backend/langflow/interface/base.py +++ b/src/backend/langflow/interface/base.py @@ -8,7 +8,7 @@ from pydantic import BaseModel from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template -from langflow.utils.logger import logger +from loguru import logger # Assuming necessary imports for Field, Template, and FrontendNode classes diff --git a/src/backend/langflow/interface/chains/base.py b/src/backend/langflow/interface/chains/base.py index b906dbd25..755ac82dd 100644 --- a/src/backend/langflow/interface/chains/base.py +++ b/src/backend/langflow/interface/chains/base.py @@ -6,7 +6,7 @@ from langflow.interface.importing.utils import import_class from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.chains import ChainFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method from langchain import chains from langchain_experimental.sql import SQLDatabaseChain # type: ignore diff --git a/src/backend/langflow/interface/custom/base.py b/src/backend/langflow/interface/custom/base.py index 06e874fa7..45a3ea215 100644 --- a/src/backend/langflow/interface/custom/base.py +++ b/src/backend/langflow/interface/custom/base.py @@ -8,7 +8,7 @@ from langflow.interface.custom.custom_component import CustomComponent from langflow.template.frontend_node.custom_components import ( CustomComponentFrontendNode, ) -from langflow.utils.logger import logger +from loguru import logger # Assuming necessary imports for Field, Template, and FrontendNode classes diff --git a/src/backend/langflow/interface/custom/directory_reader.py b/src/backend/langflow/interface/custom/directory_reader.py index 44b2d4f1b..01b11a4a6 100644 --- a/src/backend/langflow/interface/custom/directory_reader.py +++ b/src/backend/langflow/interface/custom/directory_reader.py @@ -1,7 +1,7 @@ import os import ast import zlib -from langflow.utils.logger import logger +from loguru import logger class CustomComponentPathValueError(ValueError): diff --git a/src/backend/langflow/interface/document_loaders/base.py b/src/backend/langflow/interface/document_loaders/base.py index db0832ff3..a2c147e16 100644 --- a/src/backend/langflow/interface/document_loaders/base.py +++ b/src/backend/langflow/interface/document_loaders/base.py @@ -5,7 +5,7 @@ from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.documentloaders import DocumentLoaderFrontNode from langflow.interface.custom_lists import documentloaders_type_to_cls_dict -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/embeddings/base.py b/src/backend/langflow/interface/embeddings/base.py index 169985d37..1063d10d1 100644 --- a/src/backend/langflow/interface/embeddings/base.py +++ b/src/backend/langflow/interface/embeddings/base.py @@ -6,7 +6,7 @@ from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.embeddings import EmbeddingFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 589d4b3ff..b600fb5b2 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -34,7 +34,7 @@ from langflow.utils import validate from langchain.chains.base import Chain from langchain.vectorstores.base import VectorStore from langchain.document_loaders.base import BaseLoader -from langflow.utils.logger import logger +from loguru import logger if TYPE_CHECKING: from langflow import CustomComponent diff --git a/src/backend/langflow/interface/llms/base.py b/src/backend/langflow/interface/llms/base.py index f562b99ed..87e4937cf 100644 --- a/src/backend/langflow/interface/llms/base.py +++ b/src/backend/langflow/interface/llms/base.py @@ -5,7 +5,7 @@ from langflow.interface.custom_lists import llm_type_to_cls_dict from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.llms import LLMFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index 70665602c..61c6cc430 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -6,7 +6,7 @@ from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.memories import MemoryFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method from langflow.custom.customs import get_custom_nodes diff --git a/src/backend/langflow/interface/output_parsers/base.py b/src/backend/langflow/interface/output_parsers/base.py index 256b521e1..b6eb36a0e 100644 --- a/src/backend/langflow/interface/output_parsers/base.py +++ b/src/backend/langflow/interface/output_parsers/base.py @@ -7,7 +7,7 @@ from langflow.interface.importing.utils import import_class from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.output_parsers import OutputParserFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method diff --git a/src/backend/langflow/interface/prompts/base.py b/src/backend/langflow/interface/prompts/base.py index 5aa41dfb2..70818429e 100644 --- a/src/backend/langflow/interface/prompts/base.py +++ b/src/backend/langflow/interface/prompts/base.py @@ -8,7 +8,7 @@ from langflow.interface.importing.utils import import_class from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.prompts import PromptFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/langflow/interface/retrievers/base.py index db1cfd165..92e3f2f61 100644 --- a/src/backend/langflow/interface/retrievers/base.py +++ b/src/backend/langflow/interface/retrievers/base.py @@ -7,7 +7,7 @@ from langflow.interface.importing.utils import import_class from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.retrievers import RetrieverFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_method, build_template_from_class diff --git a/src/backend/langflow/interface/run.py b/src/backend/langflow/interface/run.py index 42cea0e98..9d3d95cda 100644 --- a/src/backend/langflow/interface/run.py +++ b/src/backend/langflow/interface/run.py @@ -1,7 +1,7 @@ from typing import Any, Dict, Tuple from langflow.services.cache.utils import memoize_dict from langflow.graph import Graph -from langflow.utils.logger import logger +from loguru import logger @memoize_dict(maxsize=10) diff --git a/src/backend/langflow/interface/text_splitters/base.py b/src/backend/langflow/interface/text_splitters/base.py index 87b778c4c..8b21303ce 100644 --- a/src/backend/langflow/interface/text_splitters/base.py +++ b/src/backend/langflow/interface/text_splitters/base.py @@ -5,7 +5,7 @@ from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.textsplitters import TextSplittersFrontendNode from langflow.interface.custom_lists import textsplitter_type_to_cls_dict -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/toolkits/base.py b/src/backend/langflow/interface/toolkits/base.py index c13ffdbd9..fe0003b15 100644 --- a/src/backend/langflow/interface/toolkits/base.py +++ b/src/backend/langflow/interface/toolkits/base.py @@ -6,7 +6,7 @@ from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class, import_module from langflow.services.utils import get_settings_manager -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/tools/util.py b/src/backend/langflow/interface/tools/util.py index 38276c620..f92386f18 100644 --- a/src/backend/langflow/interface/tools/util.py +++ b/src/backend/langflow/interface/tools/util.py @@ -3,7 +3,7 @@ import inspect from typing import Dict, Union from langchain.agents.tools import Tool -from langflow.utils.logger import logger +from loguru import logger def get_func_tool_params(func, **kwargs) -> Union[Dict, None]: diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 824b0af50..47743560e 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -29,7 +29,7 @@ from langflow.template.frontend_node.custom_components import ( from langflow.interface.retrievers.base import retriever_creator from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import get_base_classes import re diff --git a/src/backend/langflow/interface/utilities/base.py b/src/backend/langflow/interface/utilities/base.py index eb8cd60af..9009983b0 100644 --- a/src/backend/langflow/interface/utilities/base.py +++ b/src/backend/langflow/interface/utilities/base.py @@ -8,7 +8,7 @@ from langflow.interface.importing.utils import import_class from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.utilities import UtilitiesFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/utils.py b/src/backend/langflow/interface/utils.py index 1fddbf80f..75e854e16 100644 --- a/src/backend/langflow/interface/utils.py +++ b/src/backend/langflow/interface/utils.py @@ -8,7 +8,7 @@ import re import yaml from langchain.base_language import BaseLanguageModel from PIL.Image import Image -from langflow.utils.logger import logger +from loguru import logger from langflow.services.chat.config import ChatConfig from langflow.services.utils import get_settings_manager diff --git a/src/backend/langflow/interface/vector_store/base.py b/src/backend/langflow/interface/vector_store/base.py index 4b8ca2b64..f7aca8c9c 100644 --- a/src/backend/langflow/interface/vector_store/base.py +++ b/src/backend/langflow/interface/vector_store/base.py @@ -7,7 +7,7 @@ from langflow.interface.importing.utils import import_class from langflow.services.utils import get_settings_manager from langflow.template.frontend_node.vectorstores import VectorStoreFrontendNode -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_method diff --git a/src/backend/langflow/interface/wrappers/base.py b/src/backend/langflow/interface/wrappers/base.py index 77e38f921..c4399fb3e 100644 --- a/src/backend/langflow/interface/wrappers/base.py +++ b/src/backend/langflow/interface/wrappers/base.py @@ -3,7 +3,7 @@ from typing import Dict, List, Optional from langchain import requests, sql_database from langflow.interface.base import LangChainTypeCreator -from langflow.utils.logger import logger +from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method diff --git a/src/backend/langflow/processing/base.py b/src/backend/langflow/processing/base.py index 13ff6a385..c3d766f15 100644 --- a/src/backend/langflow/processing/base.py +++ b/src/backend/langflow/processing/base.py @@ -4,7 +4,7 @@ from langflow.api.v1.callback import ( StreamingLLMCallbackHandler, ) from langflow.processing.process import fix_memory_inputs, format_actions -from langflow.utils.logger import logger +from loguru import logger from langchain.agents.agent import AgentExecutor diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 4b2e7b178..c60a53de5 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -6,7 +6,7 @@ from langflow.interface.run import ( get_memory_key, update_memory_keys, ) -from langflow.utils.logger import logger +from loguru import logger from langflow.graph import Graph from langchain.chains.base import Chain from langchain.vectorstores.base import VectorStore diff --git a/src/backend/langflow/services/chat/manager.py b/src/backend/langflow/services/chat/manager.py index 6751e97e7..d8492e961 100644 --- a/src/backend/langflow/services/chat/manager.py +++ b/src/backend/langflow/services/chat/manager.py @@ -7,7 +7,7 @@ from langflow.services.cache.manager import Subject from langflow.services.chat.utils import process_graph from langflow.interface.utils import pil_to_base64 from langflow.services.schema import ServiceType -from langflow.utils.logger import logger +from loguru import logger import asyncio diff --git a/src/backend/langflow/services/chat/utils.py b/src/backend/langflow/services/chat/utils.py index 17c976eb9..d9c291757 100644 --- a/src/backend/langflow/services/chat/utils.py +++ b/src/backend/langflow/services/chat/utils.py @@ -2,7 +2,7 @@ from fastapi import WebSocket from langflow.api.v1.schemas import ChatMessage from langflow.processing.base import get_result_and_steps from langflow.interface.utils import try_setting_streaming_options -from langflow.utils.logger import logger +from loguru import logger async def process_graph( diff --git a/src/backend/langflow/services/database/manager.py b/src/backend/langflow/services/database/manager.py index 1159cbf7a..c8826e31b 100644 --- a/src/backend/langflow/services/database/manager.py +++ b/src/backend/langflow/services/database/manager.py @@ -7,7 +7,7 @@ from langflow.services.utils import get_settings_manager from sqlalchemy import inspect import sqlalchemy as sa from sqlmodel import SQLModel, Session, create_engine -from langflow.utils.logger import logger +from loguru import logger from alembic.config import Config from alembic import command from langflow.services.database import models # noqa diff --git a/src/backend/langflow/services/database/utils.py b/src/backend/langflow/services/database/utils.py index e6afae184..fd0a8856a 100644 --- a/src/backend/langflow/services/database/utils.py +++ b/src/backend/langflow/services/database/utils.py @@ -1,6 +1,6 @@ from dataclasses import dataclass from typing import TYPE_CHECKING -from langflow.utils.logger import logger +from loguru import logger from contextlib import contextmanager from alembic.util.exc import CommandError from sqlmodel import Session diff --git a/src/backend/langflow/services/manager.py b/src/backend/langflow/services/manager.py index ca9eb4e70..60a93fe16 100644 --- a/src/backend/langflow/services/manager.py +++ b/src/backend/langflow/services/manager.py @@ -1,6 +1,6 @@ from langflow.services.schema import ServiceType from typing import TYPE_CHECKING, List, Optional -from langflow.utils.logger import logger +from loguru import logger if TYPE_CHECKING: from langflow.services.factory import ServiceFactory diff --git a/src/backend/langflow/services/settings/auth.py b/src/backend/langflow/services/settings/auth.py index 582aecb90..d1f8197f0 100644 --- a/src/backend/langflow/services/settings/auth.py +++ b/src/backend/langflow/services/settings/auth.py @@ -5,7 +5,7 @@ from langflow.services.settings.utils import read_secret_from_file, write_secret from pydantic import BaseSettings, Field, validator from passlib.context import CryptContext -from langflow.utils.logger import logger +from loguru import logger class AuthSettings(BaseSettings): diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 00cd2085f..366ff474d 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -8,7 +8,7 @@ from pathlib import Path import yaml from pydantic import BaseSettings, root_validator, validator -from langflow.utils.logger import logger +from loguru import logger # BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") BASE_COMPONENTS_PATH = str(Path(__file__).parent.parent.parent / "components") diff --git a/src/backend/langflow/services/settings/manager.py b/src/backend/langflow/services/settings/manager.py index b0af8b7f1..2d687d784 100644 --- a/src/backend/langflow/services/settings/manager.py +++ b/src/backend/langflow/services/settings/manager.py @@ -1,7 +1,7 @@ from langflow.services.base import Service from langflow.services.settings.auth import AuthSettings from langflow.services.settings.base import Settings -from langflow.utils.logger import logger +from loguru import logger import os import yaml diff --git a/src/backend/langflow/services/settings/utils.py b/src/backend/langflow/services/settings/utils.py index bb411a299..fae96ff28 100644 --- a/src/backend/langflow/services/settings/utils.py +++ b/src/backend/langflow/services/settings/utils.py @@ -2,7 +2,7 @@ import os from pathlib import Path import platform -from langflow.utils.logger import logger +from loguru import logger def set_secure_permissions(file_path): From 7e336bbee685099f67ff6f80fcdbf6dce446a64e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 16:13:01 -0300 Subject: [PATCH 16/19] =?UTF-8?q?=F0=9F=90=9B=20fix(logger.py):=20change?= =?UTF-8?q?=20log=5Flevel=20variable=20to=20uppercase=20to=20improve=20con?= =?UTF-8?q?sistency=20and=20semantics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/utils/logger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/utils/logger.py b/src/backend/langflow/utils/logger.py index b881a614c..4e93874af 100644 --- a/src/backend/langflow/utils/logger.py +++ b/src/backend/langflow/utils/logger.py @@ -13,7 +13,7 @@ def configure(log_level: str = "DEBUG", log_file: Path = None): { "sink": RichHandler(rich_tracebacks=True, markup=True), "format": log_format, - "level": log_level, + "level": log_level.upper(), } ] ) @@ -24,7 +24,7 @@ def configure(log_level: str = "DEBUG", log_file: Path = None): logger.add( sink=str(log_file), - level=log_level, + level=log_level.upper(), format=log_format, rotation="10 MB", # Log rotation based on file size ) From 28b487dc33cc097425fdc61b0a3a06e5dd146892 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 4 Sep 2023 16:15:41 -0300 Subject: [PATCH 17/19] =?UTF-8?q?=F0=9F=94=A7=20fix(manager.py):=20change?= =?UTF-8?q?=20logger.warn=20to=20logger.warning=20for=20consistency=20and?= =?UTF-8?q?=20clarity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔧 fix(logger.py): change log_file parameter type annotation to Optional[Path] to indicate that it is an optional argument --- src/backend/langflow/services/database/manager.py | 2 +- src/backend/langflow/utils/logger.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/services/database/manager.py b/src/backend/langflow/services/database/manager.py index c8826e31b..7f8afab6f 100644 --- a/src/backend/langflow/services/database/manager.py +++ b/src/backend/langflow/services/database/manager.py @@ -89,7 +89,7 @@ class DatabaseManager(Service): for table in legacy_tables: if table in inspector.get_table_names(): - logger.warn(f"Legacy table exists: {table}") + logger.warning(f"Legacy table exists: {table}") return True diff --git a/src/backend/langflow/utils/logger.py b/src/backend/langflow/utils/logger.py index 4e93874af..1f616486b 100644 --- a/src/backend/langflow/utils/logger.py +++ b/src/backend/langflow/utils/logger.py @@ -1,9 +1,10 @@ +from typing import Optional from loguru import logger from pathlib import Path from rich.logging import RichHandler -def configure(log_level: str = "DEBUG", log_file: Path = None): +def configure(log_level: str = "DEBUG", log_file: Optional[Path] = None): log_format = "{time:HH:mm:ss} - {level: <8} - {message}" logger.remove() # Remove default handlers From 5df8b11d9fbfce56833ab584a0eeab799e789420 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Mon, 4 Sep 2023 16:37:43 -0300 Subject: [PATCH 18/19] Changed autocomplete to only fill when on form --- src/frontend/src/components/inputComponent/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/inputComponent/index.tsx index 46acdc1b0..490be0fb0 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/inputComponent/index.tsx @@ -54,7 +54,7 @@ export default function InputComponent({ ) : ( Date: Mon, 4 Sep 2023 20:18:10 -0300 Subject: [PATCH 19/19] =?UTF-8?q?=F0=9F=90=9B=20fix(API/index.ts):=20handl?= =?UTF-8?q?e=20potential=20undefined=20response=20object=20properties=20to?= =?UTF-8?q?=20prevent=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/controllers/API/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index d9ea890c8..bdf7e5221 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -164,7 +164,7 @@ export async function readFlowsFromDatabase() { try { const response = await api.get(`${BASE_URL_API}flows/`); if (response?.status !== 200) { - throw new Error(`HTTP error! status: ${response.status}`); + throw new Error(`HTTP error! status: ${response?.status}`); } return response.data; } catch (error) { @@ -177,7 +177,7 @@ export async function downloadFlowsFromDatabase() { try { const response = await api.get(`${BASE_URL_API}flows/download/`); if (response?.status !== 200) { - throw new Error(`HTTP error! status: ${response.status}`); + throw new Error(`HTTP error! status: ${response?.status}`); } return response.data; } catch (error) { @@ -190,8 +190,8 @@ export async function uploadFlowsToDatabase(flows: FormData) { try { const response = await api.post(`${BASE_URL_API}flows/upload/`, flows); - if (response.status !== 201) { - throw new Error(`HTTP error! status: ${response.status}`); + if (response?.status !== 201) { + throw new Error(`HTTP error! status: ${response?.status}`); } return response.data; } catch (error) {