From b33b44de99b9ae4b29da1b1d220e0daa57284823 Mon Sep 17 00:00:00 2001 From: sauravniraula Date: Thu, 28 Aug 2025 14:55:12 +0545 Subject: [PATCH] fix: icon finder services reinitiating in every request --- servers/fastapi/api/v1/ppt/endpoints/files.py | 2 +- servers/fastapi/api/v1/ppt/endpoints/icons.py | 5 ++--- servers/fastapi/api/v1/ppt/endpoints/outlines.py | 2 +- .../fastapi/api/v1/ppt/endpoints/presentation.py | 15 ++++----------- servers/fastapi/api/v1/ppt/endpoints/slide.py | 4 ---- servers/fastapi/services/__init__.py | 4 ---- servers/fastapi/services/icon_finder_service.py | 7 +++++-- servers/fastapi/services/temp_file_service.py | 3 +++ servers/fastapi/utils/export_utils.py | 2 +- servers/fastapi/utils/process_slides.py | 8 +++----- 10 files changed, 20 insertions(+), 32 deletions(-) diff --git a/servers/fastapi/api/v1/ppt/endpoints/files.py b/servers/fastapi/api/v1/ppt/endpoints/files.py index 25936e6a..c63b6689 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/files.py +++ b/servers/fastapi/api/v1/ppt/endpoints/files.py @@ -5,7 +5,7 @@ from fastapi import APIRouter, Body, File, UploadFile from constants.documents import UPLOAD_ACCEPTED_FILE_TYPES from models.decomposed_file_info import DecomposedFileInfo -from services import TEMP_FILE_SERVICE +from services.temp_file_service import TEMP_FILE_SERVICE from services.documents_loader import DocumentsLoader from utils.randomizers import get_random_uuid from utils.validators import validate_files diff --git a/servers/fastapi/api/v1/ppt/endpoints/icons.py b/servers/fastapi/api/v1/ppt/endpoints/icons.py index 36116f53..5d71791e 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/icons.py +++ b/servers/fastapi/api/v1/ppt/endpoints/icons.py @@ -1,11 +1,10 @@ from typing import List from fastapi import APIRouter -from services.icon_finder_service import IconFinderService +from services.icon_finder_service import ICON_FINDER_SERVICE ICONS_ROUTER = APIRouter(prefix="/icons", tags=["Icons"]) @ICONS_ROUTER.get("/search", response_model=List[str]) async def search_icons(query: str, limit: int = 20): - icon_finder_service = IconFinderService() - return await icon_finder_service.search_icons(query, limit) + return await ICON_FINDER_SERVICE.search_icons(query, limit) diff --git a/servers/fastapi/api/v1/ppt/endpoints/outlines.py b/servers/fastapi/api/v1/ppt/endpoints/outlines.py index f53c8bab..d5a2b963 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/outlines.py +++ b/servers/fastapi/api/v1/ppt/endpoints/outlines.py @@ -7,7 +7,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from models.presentation_outline_model import PresentationOutlineModel from models.sql.presentation import PresentationModel from models.sse_response import SSECompleteResponse, SSEResponse, SSEStatusResponse -from services import TEMP_FILE_SERVICE +from services.temp_file_service import TEMP_FILE_SERVICE from services.database import get_async_session from services.documents_loader import DocumentsLoader from services.score_based_chunker import ScoreBasedChunker diff --git a/servers/fastapi/api/v1/ppt/endpoints/presentation.py b/servers/fastapi/api/v1/ppt/endpoints/presentation.py index 6ae10f8b..e42c58a5 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/presentation.py +++ b/servers/fastapi/api/v1/ppt/endpoints/presentation.py @@ -2,7 +2,7 @@ import asyncio import json import os import random -from typing import Annotated, List, Literal, Optional +from typing import Annotated, List, Optional from fastapi import APIRouter, Body, Depends, HTTPException from fastapi.responses import StreamingResponse from sqlalchemy import delete @@ -21,7 +21,6 @@ from models.presentation_structure_model import PresentationStructureModel from models.presentation_with_slides import PresentationWithSlides from utils.get_layout_by_name import get_layout_by_name -from services.icon_finder_service import IconFinderService from services.image_generation_service import ImageGenerationService from utils.dict_utils import deep_update from utils.export_utils import export_presentation @@ -30,7 +29,7 @@ from models.sql.slide import SlideModel from models.sse_response import SSECompleteResponse, SSEResponse from services.database import get_async_session -from services import TEMP_FILE_SERVICE +from services.temp_file_service import TEMP_FILE_SERVICE from models.sql.presentation import PresentationModel from services.pptx_presentation_creator import PptxPresentationCreator from utils.asset_directory_utils import get_exports_directory, get_images_directory @@ -197,7 +196,6 @@ async def stream_presentation( ) image_generation_service = ImageGenerationService(get_images_directory()) - icon_finder_service = IconFinderService() async def inner(): structure = presentation.get_structure() @@ -234,9 +232,7 @@ async def stream_presentation( # This will mutate slide async_assets_generation_tasks.append( - process_slide_and_fetch_assets( - image_generation_service, icon_finder_service, slide - ) + process_slide_and_fetch_assets(image_generation_service, slide) ) yield SSEResponse( @@ -386,7 +382,6 @@ async def generate_presentation_api( ) image_generation_service = ImageGenerationService(get_images_directory()) - icon_finder_service = IconFinderService() async_asset_generation_tasks = [] # 7. Generate slide content and save slides @@ -407,9 +402,7 @@ async def generate_presentation_api( content=slide_content, ) async_asset_generation_tasks.append( - process_slide_and_fetch_assets( - image_generation_service, icon_finder_service, slide - ) + process_slide_and_fetch_assets(image_generation_service, slide) ) slides.append(slide) slide_contents.append(slide_content) diff --git a/servers/fastapi/api/v1/ppt/endpoints/slide.py b/servers/fastapi/api/v1/ppt/endpoints/slide.py index e1ec9e6b..7d42b884 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/slide.py +++ b/servers/fastapi/api/v1/ppt/endpoints/slide.py @@ -1,4 +1,3 @@ -import importlib from typing import Annotated, Optional from fastapi import APIRouter, Body, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession @@ -6,7 +5,6 @@ from sqlalchemy.ext.asyncio import AsyncSession from models.sql.presentation import PresentationModel from models.sql.slide import SlideModel from services.database import get_async_session -from services.icon_finder_service import IconFinderService from services.image_generation_service import ImageGenerationService from utils.asset_directory_utils import get_images_directory from utils.llm_calls.edit_slide import get_edited_slide_content @@ -42,12 +40,10 @@ async def edit_slide( ) image_generation_service = ImageGenerationService(get_images_directory()) - icon_finder_service = IconFinderService() # This will mutate edited_slide_content new_assets = await process_old_and_new_slides_and_fetch_assets( image_generation_service, - icon_finder_service, slide.content, edited_slide_content, ) diff --git a/servers/fastapi/services/__init__.py b/servers/fastapi/services/__init__.py index a1d47d50..e69de29b 100644 --- a/servers/fastapi/services/__init__.py +++ b/servers/fastapi/services/__init__.py @@ -1,4 +0,0 @@ -from services.temp_file_service import TempFileService - - -TEMP_FILE_SERVICE = TempFileService() diff --git a/servers/fastapi/services/icon_finder_service.py b/servers/fastapi/services/icon_finder_service.py index 6d3c0398..3584f3af 100644 --- a/servers/fastapi/services/icon_finder_service.py +++ b/servers/fastapi/services/icon_finder_service.py @@ -11,9 +11,9 @@ class IconFinderService: self.client = chromadb.PersistentClient( path="chroma", settings=Settings(anonymized_telemetry=False) ) - print('Initializing icons collection...') + print("Initializing icons collection...") self._initialize_icons_collection() - print('Icons collection initialized.') + print("Icons collection initialized.") def _initialize_icons_collection(self): self.embedding_function = ONNXMiniLM_L6_V2() @@ -51,3 +51,6 @@ class IconFinderService: n_results=k, ) return [f"/static/icons/bold/{each}.png" for each in result["ids"][0]] + + +ICON_FINDER_SERVICE = IconFinderService() diff --git a/servers/fastapi/services/temp_file_service.py b/servers/fastapi/services/temp_file_service.py index eaa09e97..c687f708 100644 --- a/servers/fastapi/services/temp_file_service.py +++ b/servers/fastapi/services/temp_file_service.py @@ -65,3 +65,6 @@ class TempFileService: def cleanup_base_dir(self): self.cleanup_temp_dir(self.base_dir) + + +TEMP_FILE_SERVICE = TempFileService() diff --git a/servers/fastapi/utils/export_utils.py b/servers/fastapi/utils/export_utils.py index 1c5db64d..e75f49cc 100644 --- a/servers/fastapi/utils/export_utils.py +++ b/servers/fastapi/utils/export_utils.py @@ -8,7 +8,7 @@ from pathvalidate import sanitize_filename from models.pptx_models import PptxPresentationModel from models.presentation_and_path import PresentationAndPath from services.pptx_presentation_creator import PptxPresentationCreator -from services import TEMP_FILE_SERVICE +from services.temp_file_service import TEMP_FILE_SERVICE from utils.asset_directory_utils import get_exports_directory from utils.randomizers import get_random_uuid diff --git a/servers/fastapi/utils/process_slides.py b/servers/fastapi/utils/process_slides.py index 91c2d829..b3c605fa 100644 --- a/servers/fastapi/utils/process_slides.py +++ b/servers/fastapi/utils/process_slides.py @@ -3,7 +3,7 @@ from typing import List, Tuple from models.image_prompt import ImagePrompt from models.sql.image_asset import ImageAsset from models.sql.slide import SlideModel -from services.icon_finder_service import IconFinderService +from services.icon_finder_service import ICON_FINDER_SERVICE from services.image_generation_service import ImageGenerationService from utils.asset_directory_utils import get_images_directory from utils.dict_utils import get_dict_at_path, get_dict_paths_with_key, set_dict_at_path @@ -11,7 +11,6 @@ from utils.dict_utils import get_dict_at_path, get_dict_paths_with_key, set_dict async def process_slide_and_fetch_assets( image_generation_service: ImageGenerationService, - icon_finder_service: IconFinderService, slide: SlideModel, ) -> List[ImageAsset]: @@ -33,7 +32,7 @@ async def process_slide_and_fetch_assets( for icon_path in icon_paths: __icon_query__parent = get_dict_at_path(slide.content, icon_path) async_tasks.append( - icon_finder_service.search_icons(__icon_query__parent["__icon_query__"]) + ICON_FINDER_SERVICE.search_icons(__icon_query__parent["__icon_query__"]) ) results = await asyncio.gather(*async_tasks) @@ -60,7 +59,6 @@ async def process_slide_and_fetch_assets( async def process_old_and_new_slides_and_fetch_assets( image_generation_service: ImageGenerationService, - icon_finder_service: IconFinderService, old_slide_content: dict, new_slide_content: dict, ) -> List[ImageAsset]: @@ -138,7 +136,7 @@ async def process_old_and_new_slides_and_fetch_assets( continue async_icon_fetch_tasks.append( - icon_finder_service.search_icons(new_icon["__icon_query__"]) + ICON_FINDER_SERVICE.search_icons(new_icon["__icon_query__"]) ) new_icons_fetch_status.append(True)