Merge branch 'dev' of github.com:logspace-ai/langflow into dev

This commit is contained in:
cristhianzl 2023-12-08 15:49:42 -03:00
commit 907c2d7606
4 changed files with 46 additions and 66 deletions

View file

@ -1,5 +1,9 @@
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, List from typing import TYPE_CHECKING, List
from fastapi import HTTPException
from langflow.services.store.schema import StoreComponentCreate
from langflow.services.store.utils import get_lf_version_from_pypi
import warnings
from platformdirs import user_cache_dir from platformdirs import user_cache_dir
@ -139,3 +143,19 @@ def validate_is_component(flows: List["Flow"]):
def get_is_component_from_data(data: dict): def get_is_component_from_data(data: dict):
"""Returns True if the data is a component.""" """Returns True if the data is a component."""
return data.get("is_component") return data.get("is_component")
async def check_langflow_version(component: StoreComponentCreate):
from langflow import __version__ as current_version
if not component.last_tested_version:
component.last_tested_version = current_version
langflow_version = get_lf_version_from_pypi()
if langflow_version is None:
raise HTTPException(status_code=500, detail="Unable to verify the latest version of Langflow")
elif langflow_version != component.last_tested_version:
warnings.warn(
f"Your version of Langflow ({component.last_tested_version}) is outdated. "
f"Please update to the latest version ({langflow_version}) and try again."
)

View file

@ -1,8 +1,9 @@
import warnings
from typing import Annotated, List, Optional, Union from typing import Annotated, List, Optional, Union
from uuid import UUID from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Query from fastapi import APIRouter, Depends, HTTPException, Query
from langflow.api.utils import check_langflow_version
from langflow.services.auth import utils as auth_utils from langflow.services.auth import utils as auth_utils
from langflow.services.database.models.user.model import User from langflow.services.database.models.user.model import User
from langflow.services.deps import get_settings_service, get_store_service from langflow.services.deps import get_settings_service, get_store_service
@ -16,7 +17,6 @@ from langflow.services.store.schema import (
UsersLikesResponse, UsersLikesResponse,
) )
from langflow.services.store.service import StoreService from langflow.services.store.service import StoreService
from langflow.services.store.utils import get_lf_version_from_pypi
router = APIRouter(prefix="/store", tags=["Components Store"]) router = APIRouter(prefix="/store", tags=["Components Store"])
@ -70,66 +70,26 @@ async def check_if_store_has_api_key(
async def share_component( async def share_component(
component: StoreComponentCreate, component: StoreComponentCreate,
store_service: StoreService = Depends(get_store_service), store_service: StoreService = Depends(get_store_service),
store_api_Key: str = Depends(get_user_store_api_key), store_api_key: str = Depends(get_user_store_api_key),
): ):
try: try:
# Verify if this is the latest version of Langflow await check_langflow_version(component)
# If not, raise an error result = await store_service.upload(store_api_key, component)
if not component.last_tested_version:
# Get the local version of Langflow
from langflow import __version__ as current_version
component.last_tested_version = current_version
langflow_version = get_lf_version_from_pypi()
if langflow_version is None:
raise HTTPException(
status_code=500,
detail="Unable to verify the latest version of Langflow",
)
elif langflow_version != component.last_tested_version:
# If the user is using an older version of Langflow, we need to raise an error
# raise ValueError(
warnings.warn(
f"Your version of Langflow ({component.last_tested_version}) is outdated."
f" Please update to the latest version ({langflow_version}) and try again."
)
result = await store_service.upload(store_api_Key, component)
return result return result
except Exception as exc: except Exception as exc:
raise HTTPException(status_code=400, detail=str(exc)) raise HTTPException(status_code=400, detail=str(exc))
@router.patch("/components/{component_id}", response_model=CreateComponentResponse, status_code=201) @router.patch("/components/{component_id}", response_model=CreateComponentResponse, status_code=201)
async def update_component( async def update_shared_component(
component_id: UUID, component_id: UUID,
component: StoreComponentCreate, component: StoreComponentCreate,
store_service: StoreService = Depends(get_store_service), store_service: StoreService = Depends(get_store_service),
store_api_Key: str = Depends(get_user_store_api_key), store_api_key: str = Depends(get_user_store_api_key),
): ):
try: try:
# Verify if this is the latest version of Langflow await check_langflow_version(component)
# If not, raise an error result = await store_service.update(store_api_key, component_id, component)
if not component.last_tested_version:
# Get the local version of Langflow
from langflow import __version__ as current_version
component.last_tested_version = current_version
langflow_version = get_lf_version_from_pypi()
if langflow_version is None:
raise HTTPException(
status_code=500,
detail="Unable to verify the latest version of Langflow",
)
elif langflow_version != component.last_tested_version:
# If the user is using an older version of Langflow, we need to raise an error
# raise ValueError(
warnings.warn(
f"Your version of Langflow ({component.last_tested_version}) is outdated."
f" Please update to the latest version ({langflow_version}) and try again."
)
result = await store_service.update(store_api_Key, component_id, component)
return result return result
except Exception as exc: except Exception as exc:
raise HTTPException(status_code=400, detail=str(exc)) raise HTTPException(status_code=400, detail=str(exc))
@ -149,7 +109,7 @@ async def get_components(
page: int = 1, page: int = 1,
limit: int = 10, limit: int = 10,
store_service: StoreService = Depends(get_store_service), store_service: StoreService = Depends(get_store_service),
store_api_Key: Optional[str] = Depends(get_optional_user_store_api_key), store_api_key: Optional[str] = Depends(get_optional_user_store_api_key),
): ):
try: try:
return await store_service.get_list_component_response_model( return await store_service.get_list_component_response_model(
@ -164,7 +124,7 @@ async def get_components(
filter_by_user=filter_by_user, filter_by_user=filter_by_user,
page=page, page=page,
limit=limit, limit=limit,
store_api_key=store_api_Key, store_api_key=store_api_key,
) )
except CustomException as exc: except CustomException as exc:
raise HTTPException(status_code=exc.status_code, detail=str(exc)) from exc raise HTTPException(status_code=exc.status_code, detail=str(exc)) from exc
@ -176,10 +136,10 @@ async def get_components(
async def download_component( async def download_component(
component_id: UUID, component_id: UUID,
store_service: StoreService = Depends(get_store_service), store_service: StoreService = Depends(get_store_service),
store_api_Key: str = Depends(get_user_store_api_key), store_api_key: str = Depends(get_user_store_api_key),
): ):
try: try:
component = await store_service.download(store_api_Key, component_id) component = await store_service.download(store_api_key, component_id)
except CustomException as exc: except CustomException as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc raise HTTPException(status_code=400, detail=str(exc)) from exc
except Exception as exc: except Exception as exc:
@ -206,10 +166,10 @@ async def get_tags(
@router.get("/users/likes", response_model=List[UsersLikesResponse]) @router.get("/users/likes", response_model=List[UsersLikesResponse])
async def get_list_of_components_liked_by_user( async def get_list_of_components_liked_by_user(
store_service: StoreService = Depends(get_store_service), store_service: StoreService = Depends(get_store_service),
store_api_Key: str = Depends(get_user_store_api_key), store_api_key: str = Depends(get_user_store_api_key),
): ):
try: try:
return await store_service.get_user_likes(store_api_Key) return await store_service.get_user_likes(store_api_key)
except CustomException as exc: except CustomException as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc raise HTTPException(status_code=400, detail=str(exc)) from exc
except Exception as exc: except Exception as exc:
@ -220,11 +180,11 @@ async def get_list_of_components_liked_by_user(
async def like_component( async def like_component(
component_id: UUID, component_id: UUID,
store_service: StoreService = Depends(get_store_service), store_service: StoreService = Depends(get_store_service),
store_api_Key: str = Depends(get_user_store_api_key), store_api_key: str = Depends(get_user_store_api_key),
): ):
try: try:
result = await store_service.like_component(store_api_Key, str(component_id)) result = await store_service.like_component(store_api_key, str(component_id))
likes_count = await store_service.get_component_likes_count(str(component_id), store_api_Key) likes_count = await store_service.get_component_likes_count(str(component_id), store_api_key)
return UsersLikesResponse(likes_count=likes_count, liked_by_user=result) return UsersLikesResponse(likes_count=likes_count, liked_by_user=result)
except CustomException as exc: except CustomException as exc:

View file

@ -179,7 +179,7 @@ class StoreService(Service):
is_component: Optional[bool] = None, is_component: Optional[bool] = None,
filter_by_user: Optional[bool] = False, filter_by_user: Optional[bool] = False,
liked: Optional[bool] = False, liked: Optional[bool] = False,
store_api_Key: Optional[str] = None, store_api_key: Optional[str] = None,
): ):
filter_conditions = [] filter_conditions = []
@ -197,18 +197,18 @@ class StoreService(Service):
filter_conditions.append({"id": {"_eq": component_id}}) filter_conditions.append({"id": {"_eq": component_id}})
if is_component is not None: if is_component is not None:
filter_conditions.append({"is_component": {"_eq": is_component}}) filter_conditions.append({"is_component": {"_eq": is_component}})
if liked and store_api_Key: if liked and store_api_key:
liked_filter = self.build_liked_filter() liked_filter = self.build_liked_filter()
filter_conditions.append(liked_filter) filter_conditions.append(liked_filter)
elif liked and not store_api_Key: elif liked and not store_api_key:
raise APIKeyError("You must provide an API key to filter by likes") raise APIKeyError("You must provide an API key to filter by likes")
if filter_by_user and store_api_Key: if filter_by_user and store_api_key:
user_data = user_data_var.get() user_data = user_data_var.get()
if not user_data: if not user_data:
raise ValueError("No user data") raise ValueError("No user data")
filter_conditions.append({"user_created": {"_eq": user_data["id"]}}) filter_conditions.append({"user_created": {"_eq": user_data["id"]}})
elif filter_by_user and not store_api_Key: elif filter_by_user and not store_api_key:
raise APIKeyError("You must provide an API key to filter your components") raise APIKeyError("You must provide an API key to filter your components")
else: else:
filter_conditions.append({"private": {"_eq": False}}) filter_conditions.append({"private": {"_eq": False}})
@ -477,7 +477,7 @@ class StoreService(Service):
is_component=is_component, is_component=is_component,
filter_by_user=filter_by_user, filter_by_user=filter_by_user,
liked=liked, liked=liked,
store_api_Key=store_api_key, store_api_key=store_api_key,
) )
result: List[ListComponentResponse] = [] result: List[ListComponentResponse] = []

View file

@ -17,7 +17,7 @@ def process_tags_for_post(component_dict):
async def update_components_with_user_data( async def update_components_with_user_data(
components: List["ListComponentResponse"], components: List["ListComponentResponse"],
store_service: "StoreService", store_service: "StoreService",
store_api_Key: str, store_api_key: str,
liked: bool, liked: bool,
): ):
""" """
@ -31,7 +31,7 @@ async def update_components_with_user_data(
else: else:
liked_by_user_ids = await store_service.get_liked_by_user_components( liked_by_user_ids = await store_service.get_liked_by_user_components(
component_ids=component_ids, component_ids=component_ids,
api_key=store_api_Key, api_key=store_api_key,
) )
# Now we need to set the liked_by_user attribute # Now we need to set the liked_by_user attribute
for component in components: for component in components: