feat: add endpoint to get starter projects (#3370)

* feat(api): Add endpoint to get list of starter projects with error handling.

* feat: Add test for getting starter projects with valid API key.

* [autofix.ci] apply automated fixes

* refactor(langflow): Update function name from get_all_graphs_dump to get_starter_projects_dump.

* bug: fixes route collision

* bug: fixes serialization

* chore: move endpoint to new file

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: italojohnny <italojohnnydosanjos@gmail.com>
This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-08-19 19:32:17 -03:00 • committed by GitHub
commit b588ac071a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 48 additions and 6 deletions

View file

@ -14,6 +14,7 @@ from langflow.api.v1 import (
validate_router, validate_router,
variables_router, variables_router,
folders_router, folders_router,
starter_projects_router,
) )
router = APIRouter( router = APIRouter(
@ -31,3 +32,4 @@ router.include_router(variables_router)
router.include_router(files_router) router.include_router(files_router)
router.include_router(monitor_router) router.include_router(monitor_router)
router.include_router(folders_router) router.include_router(folders_router)
router.include_router(starter_projects_router)

View file

@ -10,6 +10,7 @@ from langflow.api.v1.users import router as users_router
from langflow.api.v1.validate import router as validate_router from langflow.api.v1.validate import router as validate_router
from langflow.api.v1.variable import router as variables_router from langflow.api.v1.variable import router as variables_router
from langflow.api.v1.folders import router as folders_router from langflow.api.v1.folders import router as folders_router
from langflow.api.v1.starter_projects import router as starter_projects_router
__all__ = [ __all__ = [
"chat_router", "chat_router",
@ -24,4 +25,5 @@ __all__ = [
"monitor_router", "monitor_router",
"files_router", "files_router",
"folders_router", "folders_router",
"starter_projects_router",
] ]

View file

@ -1,17 +1,15 @@
import io import io
import json import json
import re import re
import zipfile
from datetime import datetime, timezone from datetime import datetime, timezone
from typing import List from typing import List
from uuid import UUID from uuid import UUID
import zipfile
from fastapi.responses import StreamingResponse
from langflow.services.database.models.transactions.crud import get_transactions_by_flow_id
from langflow.services.database.models.vertex_builds.crud import get_vertex_builds_by_flow_id
import orjson import orjson
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
from fastapi.encoders import jsonable_encoder from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
from loguru import logger from loguru import logger
from sqlmodel import Session, and_, col, select from sqlmodel import Session, and_, col, select
@ -20,10 +18,12 @@ from langflow.api.v1.schemas import FlowListCreate
from langflow.initial_setup.setup import STARTER_FOLDER_NAME from langflow.initial_setup.setup import STARTER_FOLDER_NAME
from langflow.services.auth.utils import get_current_active_user from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.flow import Flow, FlowCreate, FlowRead, FlowUpdate from langflow.services.database.models.flow import Flow, FlowCreate, FlowRead, FlowUpdate
from langflow.services.database.models.flow.utils import get_webhook_component_in_flow, delete_flow_by_id from langflow.services.database.models.flow.utils import delete_flow_by_id, get_webhook_component_in_flow
from langflow.services.database.models.folder.constants import DEFAULT_FOLDER_NAME from langflow.services.database.models.folder.constants import DEFAULT_FOLDER_NAME
from langflow.services.database.models.folder.model import Folder from langflow.services.database.models.folder.model import Folder
from langflow.services.database.models.transactions.crud import get_transactions_by_flow_id
from langflow.services.database.models.user.model import User from langflow.services.database.models.user.model import User
from langflow.services.database.models.vertex_builds.crud import get_vertex_builds_by_flow_id
from langflow.services.deps import get_session, get_settings_service from langflow.services.deps import get_session, get_settings_service
from langflow.services.settings.service import SettingsService from langflow.services.settings.service import SettingsService

View file

@ -0,0 +1,26 @@
from typing import List
from fastapi import APIRouter, Depends, HTTPException
from loguru import logger
from langflow.graph.graph.schema import GraphDump
from langflow.services.database.models.user.model import User
from langflow.services.auth.utils import get_current_active_user
from langflow.initial_setup.load import get_starter_projects_dump
router = APIRouter(prefix="/starter-projects", tags=["Flows"])
@router.get("/", response_model=List[GraphDump], status_code=200)
def get_starter_projects(
*,
current_user: User = Depends(get_current_active_user),
):
"""Get a list of starter projects."""
try:
flows = get_starter_projects_dump()
return flows
except Exception as exc:
logger.error(exc)
raise HTTPException(status_code=500, detail=str(exc)) from exc

View file

@ -4,6 +4,7 @@ import inspect
import os import os
import traceback import traceback
import types import types
import json
from enum import Enum from enum import Enum
from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, Dict, Iterator, List, Mapping, Optional, Set from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, Dict, Iterator, List, Mapping, Optional, Set
@ -103,7 +104,12 @@ class Vertex:
self._custom_component._set_input_value(name, value) self._custom_component._set_input_value(name, value)
def to_data(self): def to_data(self):
return self._data try:
data = json.loads(json.dumps(self._data, default=str))
except TypeError:
data = self._data
return data
def add_component_instance(self, component_instance: "Component"): def add_component_instance(self, component_instance: "Component"):
component_instance.set_vertex(self) component_instance.set_vertex(self)

View file

@ -671,3 +671,9 @@ def test_invalid_flow_id(client, created_api_key):
response = client.post(f"/api/v1/run/{flow_id}", headers=headers) response = client.post(f"/api/v1/run/{flow_id}", headers=headers)
assert response.status_code == status.HTTP_404_NOT_FOUND, response.text assert response.status_code == status.HTTP_404_NOT_FOUND, response.text
# Check if the error detail is as expected # Check if the error detail is as expected
def test_starter_projects(client, created_api_key):
headers = {"x-api-key": created_api_key.api_key}
response = client.get("/api/v1/starter-projects/", headers=headers)
assert response.status_code == status.HTTP_200_OK, response.text