From 68591aab38c2e63c3f9dae2d7a397e5b7a58f17f Mon Sep 17 00:00:00 2001 From: sauravniraula Date: Wed, 30 Jul 2025 10:30:03 +0545 Subject: [PATCH] fix(fastapi): adds explicit language guidelines for slide generation and edit --- .../api/v1/ppt/endpoints/presentation.py | 2 +- servers/fastapi/chroma/chroma.sqlite3 | Bin 4329472 -> 4329472 bytes servers/fastapi/utils/llm_calls/edit_slide.py | 23 ++++++++++++------ .../utils/llm_calls/generate_slide_content.py | 20 ++++++++++----- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/servers/fastapi/api/v1/ppt/endpoints/presentation.py b/servers/fastapi/api/v1/ppt/endpoints/presentation.py index c7a537b9..82d8f6aa 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/presentation.py +++ b/servers/fastapi/api/v1/ppt/endpoints/presentation.py @@ -218,7 +218,7 @@ async def stream_presentation( for i, slide_layout_index in enumerate(structure.slides): slide_layout = layout.slides[slide_layout_index] slide_content = await get_slide_content_from_type_and_outline( - slide_layout, outline.slides[i] + slide_layout, outline.slides[i], presentation.language ) slide = SlideModel( presentation=presentation_id, diff --git a/servers/fastapi/chroma/chroma.sqlite3 b/servers/fastapi/chroma/chroma.sqlite3 index d42dcf5ad61b0b30ca3f6f8183a6c7f6c1a76400..b39add05b436b0776ee982fc10d5d906a4f1ed75 100644 GIT binary patch delta 311 zcmWm9M-ssR069 delta 300 zcmWm9Ne;mP06DWF+~XV< z)Qh$e)aUNel4Qj&UEMkD<@?^0gP|V{U4RHPBv@dD4R$!-gbQwXAVYx{KKKzp5FvyS zfr=<%h(kjHNu-cQ23h2gM*&5YP(}q+)KEtQO|;NP2VL~g#{ff&FvbK^%rM6SOZ@Mv Jx1q1MpC4zrcdY;b diff --git a/servers/fastapi/utils/llm_calls/edit_slide.py b/servers/fastapi/utils/llm_calls/edit_slide.py index 20c87c53..9069a459 100644 --- a/servers/fastapi/utils/llm_calls/edit_slide.py +++ b/servers/fastapi/utils/llm_calls/edit_slide.py @@ -1,6 +1,5 @@ import asyncio import json -from typing import Optional from models.presentation_layout import SlideLayoutModel from models.sql.slide import SlideModel @@ -21,24 +20,32 @@ system_prompt = """ - 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 in prompt. + - Make sure to follow language guidelines. **Go through all notes and steps and make sure they are followed, including mentioned constraints** """ -def get_user_prompt(prompt: str, slide_data: dict, language: Optional[str] = None): +def get_user_prompt(prompt: str, slide_data: dict, language: str): return f""" - - Prompt: {prompt} - - Output Language: {language} - - Image Prompts and Icon Queries Language: English - - Slide data: {slide_data} + ## Icon Query And Image Prompt Language + English + + ## Slide Content Language + {language} + + ## Prompt + {prompt} + + ## Slide data + {slide_data} """ def get_prompt_to_edit_slide_content( prompt: str, slide_data: dict, - language: Optional[str] = None, + language: str, ): return [ { @@ -56,7 +63,7 @@ async def get_edited_slide_content( prompt: str, slide_layout: SlideLayoutModel, slide: SlideModel, - language: Optional[str] = None, + language: str, ): model = get_large_model() response_schema = remove_fields_from_schema( diff --git a/servers/fastapi/utils/llm_calls/generate_slide_content.py b/servers/fastapi/utils/llm_calls/generate_slide_content.py index 0d487bbb..e4fe86b0 100644 --- a/servers/fastapi/utils/llm_calls/generate_slide_content.py +++ b/servers/fastapi/utils/llm_calls/generate_slide_content.py @@ -24,12 +24,19 @@ system_prompt = """ - Provide prompt to generate image on "__image_prompt__" property. - Provide query to search icon on "__icon_query__" property. - Do not use markdown formatting in slide body. - - **Strictly follow the max and min character limit for every property in the slide.** + - Make sure to follow language guidelines. + **Strictly follow the max and min character limit for every property in the slide.** """ -def get_user_prompt(title: str, outline: str): +def get_user_prompt(title: str, outline: str, language: str): return f""" + ## Icon Query And Image Prompt Language + English + + ## Slide Content Language + {language} + ## Slide Title {title} @@ -38,7 +45,7 @@ def get_user_prompt(title: str, outline: str): """ -def get_prompt_to_generate_slide_content(title: str, outline: str): +def get_prompt_to_generate_slide_content(title: str, outline: str, language: str): return [ { @@ -47,13 +54,13 @@ def get_prompt_to_generate_slide_content(title: str, outline: str): }, { "role": "user", - "content": get_user_prompt(title, outline), + "content": get_user_prompt(title, outline, language), }, ] async def get_slide_content_from_type_and_outline( - slide_layout: SlideLayoutModel, outline: SlideOutlineModel + slide_layout: SlideLayoutModel, outline: SlideOutlineModel, language: str ): model = get_large_model() @@ -68,6 +75,7 @@ async def get_slide_content_from_type_and_outline( messages=get_prompt_to_generate_slide_content( outline.title, outline.body, + language, ), response_format={ "type": "json_schema", @@ -83,7 +91,7 @@ async def get_slide_content_from_type_and_outline( response = await asyncio.to_thread( client.models.generate_content, model=model, - contents=[get_user_prompt(outline.title, outline.body)], + contents=[get_user_prompt(outline.title, outline.body, language)], config=GenerateContentConfig( system_instruction=system_prompt, response_mime_type="application/json",