From e86bc5259ab942dfafd5700f028033380fe4a364 Mon Sep 17 00:00:00 2001 From: sauravniraula Date: Sat, 12 Jul 2025 18:46:30 +0545 Subject: [PATCH] fix(env): changes SQL_URL to database url, feat(fastapi): returns first slide with presentation --- docker-compose.yml | 8 ++++---- .../handlers/generate_presentation.py | 1 + .../handlers/get_presentations.py | 16 +++++++++++++-- .../handlers/list_available_custom_models.py | 14 +++++++++++++ .../api/routers/presentation/models.py | 20 +++++++++++++++++++ .../api/routers/presentation/router.py | 19 +++++++++++------- servers/fastapi/api/services/database.py | 6 +++--- 7 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 servers/fastapi/api/routers/presentation/handlers/list_available_custom_models.py diff --git a/docker-compose.yml b/docker-compose.yml index 871db042..38211c6c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,7 +20,7 @@ services: - CUSTOM_LLM_API_KEY=${CUSTOM_LLM_API_KEY} - CUSTOM_MODEL=${CUSTOM_MODEL} - PEXELS_API_KEY=${PEXELS_API_KEY} - - SQL_URL=${SQL_URL} + - DATABASE_URL=${DATABASE_URL} production-gpu: # image: ghcr.io/presenton/presenton:latest @@ -50,7 +50,7 @@ services: - CUSTOM_LLM_API_KEY=${CUSTOM_LLM_API_KEY} - CUSTOM_MODEL=${CUSTOM_MODEL} - PEXELS_API_KEY=${PEXELS_API_KEY} - - SQL_URL=${SQL_URL} + - DATABASE_URL=${DATABASE_URL} development: build: @@ -74,7 +74,7 @@ services: - CUSTOM_LLM_API_KEY=${CUSTOM_LLM_API_KEY} - CUSTOM_MODEL=${CUSTOM_MODEL} - PEXELS_API_KEY=${PEXELS_API_KEY} - - SQL_URL=${SQL_URL} + - DATABASE_URL=${DATABASE_URL} development-gpu: build: @@ -105,4 +105,4 @@ services: - CUSTOM_LLM_API_KEY=${CUSTOM_LLM_API_KEY} - CUSTOM_MODEL=${CUSTOM_MODEL} - PEXELS_API_KEY=${PEXELS_API_KEY} - - SQL_URL=${SQL_URL} \ No newline at end of file + - DATABASE_URL=${DATABASE_URL} \ No newline at end of file diff --git a/servers/fastapi/api/routers/presentation/handlers/generate_presentation.py b/servers/fastapi/api/routers/presentation/handlers/generate_presentation.py index 55c4dfc3..2d707e3f 100644 --- a/servers/fastapi/api/routers/presentation/handlers/generate_presentation.py +++ b/servers/fastapi/api/routers/presentation/handlers/generate_presentation.py @@ -153,6 +153,7 @@ class GeneratePresentationHandler(FetchAssetsOnPresentationGenerationMixin): print("-" * 40) print("Exporting Presentation") export_request_body["presentation_id"] = self.presentation_id + print(export_request_body) export_request = ExportAsRequest(**export_request_body) presentation_and_path = await ExportAsPptxHandler(export_request).post( diff --git a/servers/fastapi/api/routers/presentation/handlers/get_presentations.py b/servers/fastapi/api/routers/presentation/handlers/get_presentations.py index d7d09951..809a99c8 100644 --- a/servers/fastapi/api/routers/presentation/handlers/get_presentations.py +++ b/servers/fastapi/api/routers/presentation/handlers/get_presentations.py @@ -1,5 +1,6 @@ from sqlmodel import select, exists from api.models import LogMetadata +from api.routers.presentation.models import PresentationWithOneSlide from api.services.logging import LoggingService from api.sql_models import PresentationSqlModel, SlideSqlModel from api.services.database import get_sql_session @@ -18,8 +19,19 @@ class GetPresentationsHandler: ) ) ).all() - presentations.sort(key=lambda x: x.created_at, reverse=True) + presentations_with_slide = [] + for presentation in presentations: + slide = sql_session.exec( + select(SlideSqlModel) + .where(SlideSqlModel.presentation == presentation.id) + .where(SlideSqlModel.index == 0) + ).first() + presentations_with_slide.append( + PresentationWithOneSlide.from_presentation_and_slide( + presentation, slide + ) + ) logging_service.logger.info( logging_service.message( @@ -27,4 +39,4 @@ class GetPresentationsHandler: ), extra=log_metadata.model_dump(), ) - return presentations + return presentations_with_slide diff --git a/servers/fastapi/api/routers/presentation/handlers/list_available_custom_models.py b/servers/fastapi/api/routers/presentation/handlers/list_available_custom_models.py new file mode 100644 index 00000000..dbdf88d8 --- /dev/null +++ b/servers/fastapi/api/routers/presentation/handlers/list_available_custom_models.py @@ -0,0 +1,14 @@ +from typing import Optional +from api.services.logging import LoggingService +from api.models import LogMetadata +from api.utils.model_utils import list_available_custom_models + + +class ListAvailableCustomModelsHandler: + + def __init__(self, url: Optional[str] = None, api_key: Optional[str] = None): + self.url = url + self.api_key = api_key + + async def get(self, logging_service: LoggingService, log_metadata: LogMetadata): + return await list_available_custom_models(self.url, self.api_key) diff --git a/servers/fastapi/api/routers/presentation/models.py b/servers/fastapi/api/routers/presentation/models.py index fb63b3c7..70af5abc 100644 --- a/servers/fastapi/api/routers/presentation/models.py +++ b/servers/fastapi/api/routers/presentation/models.py @@ -177,3 +177,23 @@ class OllamaModelStatusResponse(BaseModel): class OllamaSupportedModelsResponse(BaseModel): models: List[OllamaModelMetadata] + + +class PresentationWithOneSlide(BaseModel): + id: str + created_at: datetime + theme: Optional[dict] = None + title: Optional[str] = None + slide: SlideSqlModel + + @classmethod + def from_presentation_and_slide( + cls, presentation: PresentationSqlModel, slide: SlideSqlModel + ): + return cls( + id=presentation.id, + created_at=presentation.created_at, + theme=presentation.theme, + title=presentation.title, + slide=slide, + ) diff --git a/servers/fastapi/api/routers/presentation/router.py b/servers/fastapi/api/routers/presentation/router.py index 3b3a0894..825ea14c 100644 --- a/servers/fastapi/api/routers/presentation/router.py +++ b/servers/fastapi/api/routers/presentation/router.py @@ -1,7 +1,6 @@ from typing import Annotated, List, Optional import uuid from fastapi import APIRouter, BackgroundTasks, Body, File, Form, UploadFile -import openai from api.models import SessionModel from api.request_utils import RequestUtils @@ -35,6 +34,9 @@ from api.routers.presentation.handlers.generate_outlines import ( ) from api.routers.presentation.handlers.get_presentation import GetPresentationHandler from api.routers.presentation.handlers.get_presentations import GetPresentationsHandler +from api.routers.presentation.handlers.list_available_custom_models import ( + ListAvailableCustomModelsHandler, +) from api.routers.presentation.handlers.list_ollama_pulled_models import ( ListPulledOllamaModelsHandler, ) @@ -80,13 +82,10 @@ from api.routers.presentation.models import ( SearchImageRequest, UpdatePresentationThemeRequest, PresentationUpdateRequest, + PresentationWithOneSlide, ) from api.sql_models import PresentationSqlModel -from api.utils.model_utils import get_llm_client, list_available_custom_models from api.utils.utils import handle_errors -from image_processor.images_finder import ( - generate_image_google, -) from ppt_generator.models.slide_model import SlideModel route_prefix = "/api/v1/ppt" @@ -94,7 +93,7 @@ presentation_router = APIRouter(prefix=route_prefix) @presentation_router.get( - "/user_presentations", response_model=List[PresentationSqlModel] + "/user_presentations", response_model=List[PresentationWithOneSlide] ) async def get_user_presentations(): request_utils = RequestUtils(f"{route_prefix}/user_presentations") @@ -398,4 +397,10 @@ async def list_custom_models( url: Annotated[Optional[str], Body()] = None, api_key: Annotated[Optional[str], Body()] = None, ): - return await list_available_custom_models(url, api_key) + request_utils = RequestUtils(f"{route_prefix}/models/list/custom") + logging_service, log_metadata = await request_utils.initialize_logger() + return await handle_errors( + ListAvailableCustomModelsHandler(url, api_key).get, + logging_service, + log_metadata, + ) diff --git a/servers/fastapi/api/services/database.py b/servers/fastapi/api/services/database.py index ea9f3cd1..ece0430d 100644 --- a/servers/fastapi/api/services/database.py +++ b/servers/fastapi/api/services/database.py @@ -4,14 +4,14 @@ from sqlalchemy import create_engine from sqlmodel import Session -sql_url = os.getenv("SQL_URL") or "sqlite:///" + os.path.join( +database_url = os.getenv("DATABASE_URL") or "sqlite:///" + os.path.join( os.getenv("APP_DATA_DIRECTORY"), "fastapi.db" ) connect_args = {} -if "sqlite" in sql_url: +if "sqlite" in database_url: connect_args["check_same_thread"] = False -sql_engine = create_engine(sql_url, connect_args=connect_args) +sql_engine = create_engine(database_url, connect_args=connect_args) @contextmanager