From b24d1dc6a38d02c4775fb5c60e869f201cc71990 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 2 Oct 2024 19:51:28 -0300 Subject: [PATCH 01/92] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20(uv.lock):=20Update?= =?UTF-8?q?=20authlib=20version=20from=201.3.2=20to=201.3.1=20=E2=AC=86?= =?UTF-8?q?=EF=B8=8F=20(uv.lock):=20Update=20httpx=20version=20from=200.27?= =?UTF-8?q?.2=20to=200.27.0=20=E2=AC=86=EF=B8=8F=20(uv.lock):=20Add=20new?= =?UTF-8?q?=20package=20grpcio-health-checking=20version=201.62.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⬆️ (uv.lock): upgrade weaviate-client package from version 3.26.7 to 4.8.1 and add new dependencies grpcio, grpcio-health-checking, grpcio-tools, httpx, and pydantic. Update package source and distribution URLs accordingly. --- uv.lock | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/uv.lock b/uv.lock index 1b13b19c7cf..18b1c1ea990 100644 --- a/uv.lock +++ b/uv.lock @@ -335,14 +335,14 @@ wheels = [ [[package]] name = "authlib" -version = "1.3.2" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/75/47dbab150ef6f9298e227a40c93c7fed5f3ffb67c9fb62cd49f66285e46e/authlib-1.3.2.tar.gz", hash = "sha256:4b16130117f9eb82aa6eec97f6dd4673c3f960ac0283ccdae2897ee4bc030ba2", size = 147313 } +sdist = { url = "https://files.pythonhosted.org/packages/09/47/df70ecd34fbf86d69833fe4e25bb9ecbaab995c8e49df726dd416f6bb822/authlib-1.3.1.tar.gz", hash = "sha256:7ae843f03c06c5c0debd63c9db91f9fda64fa62a42a77419fa15fbb7e7a58917", size = 146074 } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/4c/9aa0416a403d5cc80292cb030bcd2c918cce2755e314d8c1aa18656e1e12/Authlib-1.3.2-py2.py3-none-any.whl", hash = "sha256:ede026a95e9f5cdc2d4364a52103f5405e75aa156357e831ef2bfd0bc5094dfc", size = 225111 }, + { url = "https://files.pythonhosted.org/packages/87/1f/bc95e43ffb57c05b8efcc376dd55a0240bf58f47ddf5a0f92452b6457b75/Authlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:d35800b973099bbadc49b42b256ecb80041ad56b7fe1216a362c7943c088f377", size = 223827 }, ] [[package]] @@ -2321,6 +2321,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/66/2b/a6e68d7ea6f4fbc31cce20e354d6cef484da0a9891ee6a3eaf3aa9659d01/grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734", size = 4275565 }, ] +[[package]] +name = "grpcio-health-checking" +version = "1.62.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/9f/09df9b02fc8eafa3031d878c8a4674a0311293c8c6f1c942cdaeec204126/grpcio-health-checking-1.62.3.tar.gz", hash = "sha256:5074ba0ce8f0dcfe328408ec5c7551b2a835720ffd9b69dade7fa3e0dc1c7a93", size = 15640 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4c/ee3173906196b741ac6ba55a9788ba9ebf2cd05f91715a49b6c3bfbb9d73/grpcio_health_checking-1.62.3-py3-none-any.whl", hash = "sha256:f29da7dd144d73b4465fe48f011a91453e9ff6c8af0d449254cf80021cab3e0d", size = 18547 }, +] + [[package]] name = "grpcio-status" version = "1.62.3" @@ -2484,7 +2497,7 @@ wheels = [ [[package]] name = "httpx" -version = "0.27.2" +version = "0.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2493,9 +2506,9 @@ dependencies = [ { name = "idna" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/82/08f8c936781f67d9e6b9eeb8a0c8b4e406136ea4c3d1f89a5db71d42e0e6/httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2", size = 144189 } +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/3da5bdf4408b8b2800061c339f240c1802f2e82d55e50bd39c5a881f47f0/httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5", size = 126413 } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 }, + { url = "https://files.pythonhosted.org/packages/41/7b/ddacf6dcebb42466abd03f368782142baa82e08fc0c1f8eaa05b4bae87d5/httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", size = 75590 }, ] [package.optional-dependencies] @@ -6731,6 +6744,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a1/32/4a7a205b14c11225609b75b28402c196e4396ac754dab6a81971b811781c/scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd", size = 12085794 }, { url = "https://files.pythonhosted.org/packages/c6/29/044048c5e911373827c0e1d3051321b9183b2a4f8d4e2f11c08fcff83f13/scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6", size = 12945797 }, { url = "https://files.pythonhosted.org/packages/aa/ce/c0b912f2f31aeb1b756a6ba56bcd84dd1f8a148470526a48515a3f4d48cd/scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1", size = 10985467 }, + { url = "https://files.pythonhosted.org/packages/a4/50/8891028437858cc510e13578fe7046574a60c2aaaa92b02d64aac5b1b412/scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5", size = 12025584 }, + { url = "https://files.pythonhosted.org/packages/d2/79/17feef8a1c14149436083bec0e61d7befb4812e272d5b20f9d79ea3e9ab1/scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908", size = 10959795 }, + { url = "https://files.pythonhosted.org/packages/b1/c8/f08313f9e2e656bd0905930ae8bf99a573ea21c34666a813b749c338202f/scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3", size = 12077302 }, + { url = "https://files.pythonhosted.org/packages/a7/48/fbfb4dc72bed0fe31fe045fb30e924909ad03f717c36694351612973b1a9/scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12", size = 13002811 }, + { url = "https://files.pythonhosted.org/packages/a5/e7/0c869f9e60d225a77af90d2aefa7a4a4c0e745b149325d1450f0f0ce5399/scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f", size = 10951354 }, ] [[package]] @@ -7876,16 +7894,21 @@ wheels = [ [[package]] name = "weaviate-client" -version = "3.26.7" +version = "4.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib" }, + { name = "grpcio" }, + { name = "grpcio-health-checking" }, + { name = "grpcio-tools" }, + { name = "httpx" }, + { name = "pydantic" }, { name = "requests" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/2e/9588bae34c1d67d05ccc07d74a4f5d73cce342b916f79ab3a9114c6607bb/weaviate_client-3.26.7.tar.gz", hash = "sha256:ea538437800abc6edba21acf213accaf8a82065584ee8b914bae4a4ad4ef6b70", size = 210480 } +sdist = { url = "https://files.pythonhosted.org/packages/4f/4d/650831937f25b8e788870b46a693a6e141d9d3d72bfd708ce88b0b01d69f/weaviate_client-4.8.1.tar.gz", hash = "sha256:2756996a2205bb991f258c064fc502011fc78a40e8786cb072208b1d3d7c9932", size = 681877 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/95/fb326052bc1d73cb3c19fcfaf6ebb477f896af68de07eaa1337e27ee57fa/weaviate_client-3.26.7-py3-none-any.whl", hash = "sha256:48b8d4b71df881b4e5e15964d7ac339434338ccee73779e3af7eab698a92083b", size = 120051 }, + { url = "https://files.pythonhosted.org/packages/c8/d8/88610f5aaaffd3d2447fe755b86a8bb06b79472e45ec999baa5040dea9a3/weaviate_client-4.8.1-py3-none-any.whl", hash = "sha256:c16453ebfd9bd4045675f8e50841d1af21aa9af1332f379d0418c4531c03bd44", size = 374526 }, ] [[package]] From 1ef65b48f7440a580400b6fc222dcd2f9f8ac879 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 2 Oct 2024 19:56:36 -0300 Subject: [PATCH 02/92] =?UTF-8?q?=E2=9C=A8=20(flows.py):=20Add=20paginatio?= =?UTF-8?q?n=20support=20for=20retrieving=20a=20list=20of=20flows=20to=20i?= =?UTF-8?q?mprove=20performance=20and=20user=20experience=20=F0=9F=93=9D?= =?UTF-8?q?=20(flows.py):=20Update=20documentation=20to=20reflect=20change?= =?UTF-8?q?s=20made=20for=20pagination=20and=20additional=20query=20parame?= =?UTF-8?q?ters=20=F0=9F=93=9D=20(folders.py):=20Add=20a=20new=20endpoint?= =?UTF-8?q?=20to=20retrieve=20a=20folder=20with=20paginated=20flows=20for?= =?UTF-8?q?=20better=20organization=20and=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/base/langflow/api/v1/flows.py | 102 ++++++++++++++------ src/backend/base/langflow/api/v1/folders.py | 31 +++++- 2 files changed, 100 insertions(+), 33 deletions(-) diff --git a/src/backend/base/langflow/api/v1/flows.py b/src/backend/base/langflow/api/v1/flows.py index 96b0f3a07c0..1ee0b2c73da 100644 --- a/src/backend/base/langflow/api/v1/flows.py +++ b/src/backend/base/langflow/api/v1/flows.py @@ -9,6 +9,8 @@ from fastapi import APIRouter, Depends, File, HTTPException, UploadFile from fastapi.encoders import jsonable_encoder from fastapi.responses import StreamingResponse +from fastapi_pagination import Page, Params, add_pagination +from fastapi_pagination.ext.sqlalchemy import paginate from loguru import logger from sqlmodel import Session, and_, col, select @@ -118,64 +120,75 @@ def create_flow( raise HTTPException(status_code=500, detail=str(e)) from e -@router.get("/", response_model=list[FlowRead], status_code=200) +@router.get("/", response_model=list[FlowRead] | Page[FlowRead], status_code=200) def read_flows( *, current_user: User = Depends(get_current_active_user), session: Session = Depends(get_session), settings_service: "SettingsService" = Depends(get_settings_service), - remove_example_flows: bool = False, components_only: bool = False, + get_all: bool = False, + folder_id: UUID | None = None, + params: Params = Depends(), + remove_example_flows: bool = False, ): """ - Retrieve a list of flows. + Retrieve a list of flows with pagination support. Args: current_user (User): The current authenticated user. session (Session): The database session. settings_service (SettingsService): The settings service. - remove_example_flows (bool, optional): Whether to remove example flows. Defaults to False. components_only (bool, optional): Whether to return only components. Defaults to False. - + get_all (bool, optional): Whether to return all flows without pagination. Defaults to False. + folder_id (UUID, optional): The folder ID. Defaults to None. + params (Params): Pagination parameters. + remove_example_flows (bool, optional): Whether to remove example flows. Defaults to False. Returns: - List[Dict]: A list of flows in JSON format. + Union[list[FlowRead], Page[FlowRead]]: A list of flows or a paginated response containing the list of flows. """ try: auth_settings = settings_service.auth_settings + + default_folder = session.exec(select(Folder).where(Folder.name == DEFAULT_FOLDER_NAME)).first() + default_folder_id = default_folder.id if default_folder else None + + starter_folder = session.exec(select(Folder).where(Folder.name == STARTER_FOLDER_NAME)).first() + starter_folder_id = starter_folder.id if starter_folder else None + + if not folder_id: + folder_id = default_folder_id + if auth_settings.AUTO_LOGIN: stmt = select(Flow).where( (Flow.user_id == None) | (Flow.user_id == current_user.id) # noqa ) - if components_only: - stmt = stmt.where(Flow.is_component == True) # noqa - flows = session.exec(stmt).all() - else: - flows = current_user.flows + stmt = select(Flow).where(Flow.user_id == current_user.id) + + if remove_example_flows: + stmt = stmt.where(Flow.folder_id != starter_folder_id) - flows = validate_is_component(flows) # type: ignore if components_only: - flows = [flow for flow in flows if flow.is_component] - flow_ids = [flow.id for flow in flows] - # with the session get the flows that DO NOT have a user_id - folder = session.exec(select(Folder).where(Folder.name == STARTER_FOLDER_NAME)).first() - - if not remove_example_flows and not components_only: - try: - example_flows = folder.flows if folder else [] - for example_flow in example_flows: - if example_flow.id not in flow_ids: - flows.append(example_flow) # type: ignore - except Exception as e: - logger.error(e) + stmt = stmt.where(Flow.is_component == True) # noqa - if remove_example_flows: - flows = [flow for flow in flows if flow.folder_id != folder.id] + if not get_all: + stmt = stmt.where(Flow.folder_id == folder_id) + + if get_all: + flows = session.exec(stmt).all() + flows = validate_is_component(flows) # type: ignore + if components_only: + flows = [flow for flow in flows if flow.is_component] + if remove_example_flows and starter_folder_id: + flows = [flow for flow in flows if flow.folder_id != starter_folder_id] + + return flows + return paginate(session, stmt, params=params) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) from e - return [jsonable_encoder(flow) for flow in flows] @router.get("/{flow_id}", response_model=FlowRead, status_code=200) @@ -400,3 +413,36 @@ async def download_multiple_file( headers={"Content-Disposition": f"attachment; filename={filename}"}, ) return flows_without_api_keys[0] + + +@router.get("/basic_examples/", response_model=list[FlowRead], status_code=200) +def read_basic_examples( + *, + session: Session = Depends(get_session), +): + """ + Retrieve a list of basic example flows. + + Args: + session (Session): The database session. + + Returns: + list[FlowRead]: A list of basic example flows. + """ + + try: + # Get the starter folder + starter_folder = session.exec(select(Folder).where(Folder.name == STARTER_FOLDER_NAME)).first() + + if not starter_folder: + return [] + + # Get all flows in the starter folder + return session.exec(select(Flow).where(Flow.folder_id == starter_folder.id)).all() + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) from e + + +# At the end of the file, add: +add_pagination(router) diff --git a/src/backend/base/langflow/api/v1/folders.py b/src/backend/base/langflow/api/v1/folders.py index c00c4ec5c64..3901a93002c 100644 --- a/src/backend/base/langflow/api/v1/folders.py +++ b/src/backend/base/langflow/api/v1/folders.py @@ -1,5 +1,8 @@ import orjson from fastapi import APIRouter, Depends, File, HTTPException, Response, UploadFile, status +from fastapi_pagination import Page, Params +from fastapi_pagination.ext.sqlmodel import paginate +from pydantic import BaseModel from sqlalchemy import or_, update from sqlmodel import Session, select @@ -8,6 +11,7 @@ from langflow.api.v1.schemas import FlowListCreate, FlowListReadWithFolderName from langflow.helpers.flow import generate_unique_flow_name from langflow.helpers.folders import generate_unique_folder_name +from langflow.initial_setup.setup import STARTER_FOLDER_NAME from langflow.services.auth.utils import get_current_active_user from langflow.services.database.models.flow.model import Flow, FlowCreate, FlowRead from langflow.services.database.models.folder.constants import DEFAULT_FOLDER_NAME @@ -15,7 +19,6 @@ Folder, FolderCreate, FolderRead, - FolderReadWithFlows, FolderUpdate, ) from langflow.services.database.models.user.model import User @@ -24,6 +27,11 @@ router = APIRouter(prefix="/folders", tags=["Folders"]) +class FolderWithPaginatedFlows(BaseModel): + folder: FolderRead + flows: Page[FlowRead] + + @router.post("/", response_model=FolderRead, status_code=201) def create_folder( *, @@ -89,25 +97,38 @@ def read_folders( or_(Folder.user_id == current_user.id, Folder.user_id == None) # type: ignore # noqa: E711 ) ).all() + folders = [folder for folder in folders if folder.name != STARTER_FOLDER_NAME] return sorted(folders, key=lambda x: x.name != DEFAULT_FOLDER_NAME) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) -@router.get("/{folder_id}", response_model=FolderReadWithFlows, status_code=200) +@router.get("/{folder_id}", response_model=FolderWithPaginatedFlows, status_code=200) def read_folder( *, session: Session = Depends(get_session), folder_id: str, current_user: User = Depends(get_current_active_user), + params: Params = Depends(), + is_component: bool = False, + is_flow: bool = False, + search: str = "", ): try: folder = session.exec(select(Folder).where(Folder.id == folder_id, Folder.user_id == current_user.id)).first() if not folder: raise HTTPException(status_code=404, detail="Folder not found") - flows_from_current_user_in_folder = [flow for flow in folder.flows if flow.user_id == current_user.id] - folder.flows = flows_from_current_user_in_folder - return folder + + stmt = select(Flow).where(Flow.folder_id == folder_id, Flow.user_id == current_user.id) + if is_component: + stmt = stmt.where(Flow.is_component) + if is_flow: + stmt = stmt.where(not Flow.is_component) + if search: + stmt = stmt.where(Flow.name.like(f"%{search}%")) # type: ignore + paginated_flows = paginate(session, stmt, params=params) + + return FolderWithPaginatedFlows(folder=FolderRead.model_validate(folder), flows=paginated_flows) except Exception as e: if "No result found" in str(e): raise HTTPException(status_code=404, detail="Folder not found") From 6aecb37ab77daa78da91a347eaeeef3fd773318f Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 2 Oct 2024 19:56:43 -0300 Subject: [PATCH 03/92] =?UTF-8?q?=E2=9C=A8=20(model.py):=20add=20Paginated?= =?UTF-8?q?FlowResponse=20class=20to=20handle=20paginated=20flow=20respons?= =?UTF-8?q?es=20in=20API=20calls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/langflow/services/database/models/flow/model.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/services/database/models/flow/model.py b/src/backend/base/langflow/services/database/models/flow/model.py index 0dbf957be44..4aec329b4a3 100644 --- a/src/backend/base/langflow/services/database/models/flow/model.py +++ b/src/backend/base/langflow/services/database/models/flow/model.py @@ -9,7 +9,7 @@ import emoji from emoji import purely_emoji # type: ignore from fastapi import HTTPException, status -from pydantic import field_serializer, field_validator +from pydantic import BaseModel, field_serializer, field_validator from sqlalchemy import Text, UniqueConstraint from sqlmodel import JSON, Column, Field, Relationship, SQLModel @@ -186,6 +186,13 @@ class FlowRead(FlowBase): folder_id: UUID | None = Field() +class PaginatedFlowResponse(BaseModel): + flows: list[FlowRead] + total: int + page_size: int + page_index: int + + class FlowUpdate(SQLModel): name: str | None = None description: str | None = None From 87e52337ae5410686c5550f9bd37857f49028f9e Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 2 Oct 2024 19:56:49 -0300 Subject: [PATCH 04/92] =?UTF-8?q?=E2=9C=A8=20(test=5Fdatabase.py):=20add?= =?UTF-8?q?=20support=20for=20fetching=20all=20flows=20by=20adding=20"get?= =?UTF-8?q?=5Fall"=20parameter=20to=20the=20request=20=F0=9F=90=9B=20(test?= =?UTF-8?q?=5Fdatabase.py):=20fix=20endpoint=20for=20fetching=20read-only?= =?UTF-8?q?=20starter=20projects=20to=20use=20correct=20URL=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/tests/unit/test_database.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/tests/unit/test_database.py b/src/backend/tests/unit/test_database.py index c59762417cc..5f793a3024d 100644 --- a/src/backend/tests/unit/test_database.py +++ b/src/backend/tests/unit/test_database.py @@ -68,7 +68,7 @@ def test_read_flows(client: TestClient, json_flow: str, active_user, logged_in_h def test_read_flows_components_only(client: TestClient, flow_component: dict, logged_in_headers): - response = client.get("api/v1/flows/", headers=logged_in_headers, params={"components_only": True}) + response = client.get("api/v1/flows/", headers=logged_in_headers, params={"components_only": True, "get_all": True}) assert response.status_code == 200 names = [flow["name"] for flow in response.json()] assert any("Chat Input Component" in name for name in names) @@ -412,7 +412,7 @@ def test_delete_nonexistent_flow(client: TestClient, active_user, logged_in_head def test_read_only_starter_projects(client: TestClient, active_user, logged_in_headers): - response = client.get("api/v1/flows/", headers=logged_in_headers) + response = client.get("api/v1/flows/basic_examples/", headers=logged_in_headers) starter_projects = load_starter_projects() assert response.status_code == 200 assert len(response.json()) == len(starter_projects) From 274135dd5bf97fe2aff14d5794b6e22ee1539b5a Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 2 Oct 2024 19:57:04 -0300 Subject: [PATCH 05/92] packages changes --- src/backend/base/pyproject.toml | 3 ++- src/frontend/package-lock.json | 1 - uv.lock | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index f7d3c7baf0c..ba39b493e6e 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -248,7 +248,8 @@ dependencies = [ "spider-client>=0.0.27", "diskcache>=5.6.3", "clickhouse-connect==0.7.19", - "assemblyai>=0.33.0" + "assemblyai>=0.33.0", + "fastapi-pagination>=0.12.29", ] # Optional dependencies for uv diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index b07ae39d770..e54783c6692 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -858,7 +858,6 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { diff --git a/uv.lock b/uv.lock index 18b1c1ea990..b0f0eba6438 100644 --- a/uv.lock +++ b/uv.lock @@ -1653,6 +1653,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/ab/a1f7eed031aeb1c406a6e9d45ca04bff401c8a25a30dd0e4fd2caae767c3/fastapi-0.115.0-py3-none-any.whl", hash = "sha256:17ea427674467486e997206a5ab25760f6b09e069f099b96f5b55a32fb6f1631", size = 94625 }, ] +[[package]] +name = "fastapi-pagination" +version = "0.12.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/4f/758832457733a75522fe6693b543a1404009bfa19fd5198e80cf6f77f232/fastapi_pagination-0.12.29.tar.gz", hash = "sha256:bbfa8af44636f9cda3ec10f59fe370a89a8f10cfa4035a6dc4da86b9f8d06649", size = 26279 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/8f/3a0ab35dcb73c8e93a7dc66ff0641bcc4af2a6b919ba21f3c1873c642f96/fastapi_pagination-0.12.29-py3-none-any.whl", hash = "sha256:c18e58c91cf7909490236ded4dae1326c68e286a0831de41ba1be170fb24f182", size = 42525 }, +] + [[package]] name = "fastavro" version = "1.9.7" @@ -3672,6 +3685,7 @@ dependencies = [ { name = "duckdb" }, { name = "emoji" }, { name = "fastapi" }, + { name = "fastapi-pagination" }, { name = "filelock" }, { name = "firecrawl-py" }, { name = "grandalf" }, @@ -3788,6 +3802,7 @@ requires-dist = [ { name = "duckdb", specifier = ">=1.0.0" }, { name = "emoji", specifier = ">=2.12.0" }, { name = "fastapi", specifier = ">=0.111.0" }, + { name = "fastapi-pagination", specifier = ">=0.12.29" }, { name = "filelock", specifier = ">=3.15.4" }, { name = "firecrawl-py", specifier = ">=0.0.16" }, { name = "flower", marker = "extra == 'all'", specifier = ">=1.0.0" }, From a436a587e3cc05638e9eec1f5943e0418a2168b4 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 2 Oct 2024 19:57:09 -0300 Subject: [PATCH 06/92] packages changes --- .../src/components/folderSidebarComponent/index.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/folderSidebarComponent/index.tsx b/src/frontend/src/components/folderSidebarComponent/index.tsx index 25df8aa2642..499d625aa48 100644 --- a/src/frontend/src/components/folderSidebarComponent/index.tsx +++ b/src/frontend/src/components/folderSidebarComponent/index.tsx @@ -1,4 +1,6 @@ import { useGetFoldersQuery } from "@/controllers/API/queries/folders/use-get-folders"; +import { useFolderStore } from "@/stores/foldersStore"; +import { useIsFetching } from "@tanstack/react-query"; import { useLocation } from "react-router-dom"; import { FolderType } from "../../pages/MainPage/entities"; import { cn } from "../../utils/utils"; @@ -19,8 +21,12 @@ export default function FolderSidebarNav({ }: SidebarNavProps) { const location = useLocation(); const pathname = location.pathname; + const folders = useFolderStore((state) => state.folders); - const { data: folders, isPending } = useGetFoldersQuery(); + const isPending = !!useIsFetching({ + queryKey: ["useGetFolders"], + exact: false, + }); return (