Merge pull request #253 from presenton/feat/multiple-document-support

feat/multiple document support
This commit is contained in:
Saurav Niraula 2025-08-28 18:33:18 +05:45 committed by GitHub
commit ffe5478b08
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 43 additions and 14 deletions

View file

@ -38,7 +38,7 @@ async def stream_outlines(
documents_loader = DocumentsLoader(file_paths=presentation.file_paths)
await documents_loader.load_documents(temp_dir)
documents = documents_loader.documents
if documents:
if documents and len(documents) == 1:
additional_context = documents[0]
chunker = ScoreBasedChunker()
try:
@ -50,6 +50,8 @@ async def stream_outlines(
)
except Exception as e:
print(e)
else:
additional_context = "\n\n".join(documents)
if not presentation_outlines:
presentation_outlines_text = ""

View file

@ -20,6 +20,8 @@ from models.presentation_layout import PresentationLayoutModel
from models.presentation_structure_model import PresentationStructureModel
from models.presentation_with_slides import PresentationWithSlides
from services.documents_loader import DocumentsLoader
from services.score_based_chunker import ScoreBasedChunker
from utils.get_layout_by_name import get_layout_by_name
from services.image_generation_service import ImageGenerationService
from utils.dict_utils import deep_update
@ -321,6 +323,21 @@ async def generate_presentation_api(
presentation_outlines = None
additional_context = ""
# Process files
if request.files:
documents_loader = DocumentsLoader(file_paths=request.files)
await documents_loader.load_documents()
documents = documents_loader.documents
if documents and len(documents) == 1:
additional_context = documents[0]
chunker = ScoreBasedChunker()
chunks = await chunker.get_n_chunks(documents[0], request.n_slides)
presentation_outlines = PresentationOutlineModel(
slides=[chunk.to_slide_outline() for chunk in chunks]
)
elif documents:
additional_context = "\n\n".join(documents)
if not presentation_outlines:
presentation_outlines_text = ""
async for chunk in generate_ppt_outline(
@ -331,15 +348,16 @@ async def generate_presentation_api(
):
presentation_outlines_text += chunk
try:
presentation_outlines_json = json.loads(presentation_outlines_text)
except Exception as e:
print(e)
raise HTTPException(
status_code=400,
detail="Failed to generate presentation outlines. Please try again.",
)
presentation_outlines = PresentationOutlineModel(**presentation_outlines_json)
try:
presentation_outlines_json = json.loads(presentation_outlines_text)
except Exception as e:
print(e)
raise HTTPException(
status_code=400,
detail="Failed to generate presentation outlines. Please try again.",
)
presentation_outlines = PresentationOutlineModel(**presentation_outlines_json)
outlines = presentation_outlines.slides[: request.n_slides]
total_outlines = len(outlines)

View file

@ -1,10 +1,19 @@
from typing import Literal, Optional
from typing import List, Literal, Optional
from pydantic import BaseModel, Field
class GeneratePresentationRequest(BaseModel):
prompt: str = Field(..., description="The prompt for generating the presentation")
n_slides: int = Field(default=8, description="Number of slides to generate")
language: str = Field(default="English", description="Language for the presentation")
template: str = Field(default="general", description="Template to use for the presentation")
export_as: Literal["pptx", "pdf"] = Field(default="pptx", description="Export format")
language: str = Field(
default="English", description="Language for the presentation"
)
template: str = Field(
default="general", description="Template to use for the presentation"
)
files: Optional[List[str]] = Field(
default=None, description="Files to use for the presentation"
)
export_as: Literal["pptx", "pdf"] = Field(
default="pptx", description="Export format"
)