179 lines
4.1 KiB
Python
179 lines
4.1 KiB
Python
from datetime import datetime
|
|
from enum import Enum
|
|
from typing import List, Literal, Optional
|
|
from fastapi import UploadFile
|
|
from pydantic import BaseModel, Field
|
|
|
|
from api.models import OllamaModelMetadata
|
|
from ppt_config_generator.models import SlideMarkdownModel
|
|
from ppt_generator.models.pptx_models import PptxPresentationModel
|
|
from ppt_generator.models.query_and_prompt_models import (
|
|
IconCategoryEnum,
|
|
ImagePromptWithThemeAndAspectRatio,
|
|
)
|
|
from ppt_generator.models.slide_model import SlideModel
|
|
from api.sql_models import PresentationSqlModel, SlideSqlModel
|
|
from ollama._types import ModelDetails
|
|
|
|
|
|
class ThemeEnum(Enum):
|
|
DARK = "dark"
|
|
LIGHT = "light"
|
|
ROYAL_BLUE = "royal_blue"
|
|
CREAM = "cream"
|
|
LIGHT_RED = "light_red"
|
|
DARK_PINK = "dark_pink"
|
|
FAINT_YELLOW = "faint_yellow"
|
|
|
|
|
|
class DocumentsAndImagesPath(BaseModel):
|
|
documents: Optional[List[str]] = None
|
|
images: Optional[List[str]] = None
|
|
|
|
|
|
class GenerateResearchReportRequest(BaseModel):
|
|
language: Optional[str] = None
|
|
query: str
|
|
|
|
|
|
class DecomposeDocumentsRequest(DocumentsAndImagesPath):
|
|
pass
|
|
|
|
|
|
class GeneratePresentationRequirementsRequest(BaseModel):
|
|
prompt: Optional[str] = None
|
|
n_slides: int
|
|
language: str
|
|
documents: Optional[List[str]] = None
|
|
research_reports: Optional[List[str]] = None
|
|
images: Optional[List[str]] = None
|
|
|
|
|
|
class GenerateOutlinesRequest(BaseModel):
|
|
presentation_id: str
|
|
|
|
|
|
class PresentationGenerateRequest(BaseModel):
|
|
presentation_id: str
|
|
theme: Optional[dict] = None
|
|
images: Optional[List[str]] = None
|
|
outlines: List[SlideMarkdownModel]
|
|
title: Optional[str] = None
|
|
|
|
|
|
class GenerateImageRequest(BaseModel):
|
|
presentation_id: str
|
|
prompt: ImagePromptWithThemeAndAspectRatio
|
|
|
|
|
|
class SearchImageRequest(BaseModel):
|
|
presentation_id: str
|
|
query: Optional[str] = None
|
|
page: int = 1
|
|
limit: int = 10
|
|
|
|
|
|
class SearchIconRequest(BaseModel):
|
|
presentation_id: str
|
|
query: Optional[str] = None
|
|
category: Optional[IconCategoryEnum] = None
|
|
page: int = 1
|
|
limit: int = 10
|
|
|
|
|
|
class SlideEditRequest(BaseModel):
|
|
index: int
|
|
prompt: str
|
|
|
|
|
|
class EditPresentationRequest(BaseModel):
|
|
presentation_id: str
|
|
watermark: bool = True
|
|
changes: List[SlideEditRequest]
|
|
|
|
|
|
class EditPresentationSlideRequest(BaseModel):
|
|
presentation_id: str
|
|
index: int
|
|
prompt: str
|
|
|
|
|
|
class UpdatePresentationThemeRequest(BaseModel):
|
|
presentation_id: str
|
|
theme: Optional[dict] = None
|
|
|
|
|
|
class ExportAsRequest(BaseModel):
|
|
presentation_id: str
|
|
pptx_model: PptxPresentationModel
|
|
|
|
|
|
class DecomposeDocumentsResponse(BaseModel):
|
|
documents: dict
|
|
|
|
|
|
class PresentationAndSlides(BaseModel):
|
|
presentation: PresentationSqlModel
|
|
slides: List[SlideSqlModel]
|
|
|
|
def to_response_dict(self):
|
|
presentation = self.presentation.model_dump(mode="json")
|
|
return {
|
|
"presentation": presentation,
|
|
"slides": [each.model_dump(mode="json") for each in self.slides],
|
|
}
|
|
|
|
|
|
class PresentationUpdateRequest(BaseModel):
|
|
presentation_id: str
|
|
slides: List[SlideModel]
|
|
|
|
|
|
class PresentationAndUrl(BaseModel):
|
|
presentation_id: str
|
|
url: str
|
|
|
|
|
|
class PresentationAndUrls(BaseModel):
|
|
presentation_id: str
|
|
urls: List[str]
|
|
|
|
|
|
class PresentationAndPath(BaseModel):
|
|
presentation_id: str
|
|
path: str
|
|
|
|
|
|
class PresentationAndPaths(BaseModel):
|
|
presentation_id: str
|
|
paths: List[str]
|
|
|
|
|
|
class PresentationPathAndEditPath(PresentationAndPath):
|
|
edit_path: str
|
|
|
|
|
|
class UpdatePresentationTitlesRequest(BaseModel):
|
|
presentation_id: str
|
|
titles: List[str]
|
|
|
|
|
|
class GeneratePresentationRequest(BaseModel):
|
|
prompt: str
|
|
n_slides: int = Field(default=8, ge=5, le=15)
|
|
language: str = Field(default="English")
|
|
theme: ThemeEnum = Field(default=ThemeEnum.LIGHT)
|
|
documents: Optional[List[UploadFile]] = None
|
|
export_as: Literal["pptx", "pdf"] = Field(default="pptx")
|
|
|
|
|
|
class OllamaModelStatusResponse(BaseModel):
|
|
name: str
|
|
size: Optional[int] = None
|
|
downloaded: Optional[int] = None
|
|
status: str
|
|
done: bool
|
|
|
|
|
|
class OllamaSupportedModelsResponse(BaseModel):
|
|
models: List[OllamaModelMetadata]
|