Merge pull request #250 from presenton/perf/load-icon-finder-once
perf/load icon finder once
This commit is contained in:
commit
2fd1e39a00
10 changed files with 20 additions and 32 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
from services.temp_file_service import TempFileService
|
||||
|
||||
|
||||
TEMP_FILE_SERVICE = TempFileService()
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -65,3 +65,6 @@ class TempFileService:
|
|||
|
||||
def cleanup_base_dir(self):
|
||||
self.cleanup_temp_dir(self.base_dir)
|
||||
|
||||
|
||||
TEMP_FILE_SERVICE = TempFileService()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue