Merge pull request #250 from presenton/perf/load-icon-finder-once

perf/load icon finder once
This commit is contained in:
Saurav Niraula 2025-08-28 14:56:27 +05:45 committed by GitHub
commit 2fd1e39a00
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 20 additions and 32 deletions

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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,
)

View file

@ -1,4 +0,0 @@
from services.temp_file_service import TempFileService
TEMP_FILE_SERVICE = TempFileService()

View file

@ -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()

View file

@ -65,3 +65,6 @@ class TempFileService:
def cleanup_base_dir(self):
self.cleanup_temp_dir(self.base_dir)
TEMP_FILE_SERVICE = TempFileService()

View file

@ -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

View file

@ -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)