presenton/servers/fastapi/ppt_generator/slide_generator.py
2025-05-11 00:23:50 +05:45

141 lines
4.7 KiB
Python

from typing import Optional
import os
from langchain_google_genai import ChatGoogleGenerativeAI
from ppt_generator.fix_validation_errors import get_validated_response
from ppt_generator.models.content_type_models import (
CONTENT_TYPE_MAPPING,
)
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from ppt_generator.models.other_models import SlideType, SlideTypeModel
from ppt_generator.models.slide_model import SlideModel
prompt_template_from_slide = ChatPromptTemplate.from_messages(
[
(
"system",
"""
Edit Slide data based on provided prompt, follow mentioned steps and notes and provide structured output.
# Notes
- Provide output in language mentioned in **Input**.
- The goal is to change Slide data based on the provided prompt.
- Do not change **Image prompts** and **Icon queries** if not asked for in prompt.
- Generate **Image prompts** and **Icon queries** if asked to generate or change image or icons in prompt.
- Ensure there are no line breaks in the JSON.
- Do not use special characters for highlighting.
{notes}
**Go through all notes and steps and make sure they are followed, including mentioned constraints**
""",
),
(
"user",
"""
- Prompt: {prompt}
- Output Language: {language}
- Image Prompts and Icon Queries Language: English
- Theme: {theme}
- Slide data: {slide_data}
""",
),
]
)
prompt_template_from_slide_type = ChatPromptTemplate.from_messages(
[
(
"system",
"""
Select a Slide Type based on provided user prompt and current slide data.
Select slide based on following slide description and make sure it matches user requirement:
# Slide Types (Slide Type : Slide Description)
- **1**: contains title, description and image.
- **2**: contains title and list of items.
- **4**: contains title and list of items with images.
- **5**: contains title, description and a graph.
- **6**: contains title, description and list of items.
- **7**: contains title and list of items with icons.
- **8**: contains title, description and list of items with icons.
- **9**: contains title, list of items and a graph.
- **10**: contains title, list of inforgraphic charts with supporting information.
- **11**: contains title, a single inforgraphic chart and description.
# Notes
- Do not select different slide type than current unless absolutely necessary as per user prompt.
**Go through all notes and steps and make sure they are followed, including mentioned constraints**
""",
),
(
"user",
"""
- User Prompt: {prompt}
- Current Slide Data: {slide_data}
- Current Slide Type: {slide_type}
""",
),
]
)
async def get_edited_slide_content_model(
prompt: str,
slide_type: SlideType,
slide: SlideModel,
theme: Optional[dict] = None,
language: Optional[str] = None,
):
model = (
ChatOpenAI(model="gpt-4.1-mini")
if os.getenv("LLM") == "openai"
else ChatGoogleGenerativeAI(model="gemini-2.0-flash")
)
content_type_model_type = CONTENT_TYPE_MAPPING[slide_type]
chain = prompt_template_from_slide | model.with_structured_output(
content_type_model_type.model_json_schema()
)
slide_data = slide.content.model_dump_json()
return await get_validated_response(
chain,
{
"prompt": prompt,
"language": language or "English",
"theme": theme,
"slide_data": slide_data,
"notes": "",
},
content_type_model_type,
)
async def get_slide_type_from_prompt(
prompt: str,
slide: SlideModel,
) -> SlideTypeModel:
model = (
ChatOpenAI(model="gpt-4.1-mini")
if os.getenv("LLM") == "openai"
else ChatGoogleGenerativeAI(model="gemini-2.0-flash")
)
chain = prompt_template_from_slide_type | model.with_structured_output(
SlideTypeModel.model_json_schema()
)
slide_data = slide.content.model_dump_json()
return await get_validated_response(
chain,
{
"prompt": prompt,
"slide_data": slide_data,
"slide_type": slide.type,
},
SlideTypeModel,
)