Merge branch 'dev' of github.com:logspace-ai/langflow into dev
This commit is contained in:
commit
907c2d7606
4 changed files with 46 additions and 66 deletions
|
|
@ -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."
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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] = []
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue