From 3ba705c4c405e1c66498c6980bea589ac3b6e08c Mon Sep 17 00:00:00 2001 From: sudipnext Date: Sat, 4 Apr 2026 08:10:04 +0545 Subject: [PATCH 1/3] refactor: enhance system prompt generation for presentation outlines with detailed instructions and web search integration --- .../generate_presentation_outlines.py | 94 ++++++++++++++----- 1 file changed, 73 insertions(+), 21 deletions(-) diff --git a/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py b/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py index cb044d4c..6d3bc81d 100644 --- a/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py +++ b/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py @@ -8,6 +8,12 @@ from utils.get_dynamic_models import get_presentation_outline_model_with_n_slide from utils.llm_client_error_handler import handle_llm_client_exceptions from utils.llm_provider import get_model +""" +Previously there was a dedicated search-query generation prompt constant. +Removed in favor of embedding short, actionable web-search steps into the +system prompt when web grounding is requested. +""" + def get_system_prompt( tone: Optional[str] = None, @@ -15,33 +21,79 @@ def get_system_prompt( instructions: Optional[str] = None, include_title_slide: bool = True, ): - return f""" - You are an expert presentation creator. Generate structured presentations based on user requirements and format them according to the specified JSON schema with markdown content. + verbosity_instruction = ( + "Slide content should be abound 20 words but detailed enough to generate a good slide." + if verbosity == "concise" + else ( + "Slide content should be abound 60 words but detailed enough to generate a good slide." + if verbosity == "text-heavy" + else "Slide content should be abound 40 words but detailed enough to generate a good slide." + ) + ) - Try to use available tools for better results. + title_slide_instruction = ( + "Include presenter name in first slide." + if include_title_slide + else "Do not include presenter name in any slides." + ) - {"# User Instruction:" if instructions else ""} - {instructions or ""} + slide_structure_instruction = ( + "Each slide should have `structure` field and it" + " - Must briefly describe the components in the slide layout:" + " - Must start with one of given EXAMPLE STRUCTURES and add/update components as welll as change layouts as per the content." + " - Must match with the provided content in structure." + " - It shouldn't be very creative. You must pick of the given structures and make slight changes(not more than 5 words) to fit all content." + ) - {"# Tone:" if tone else ""} - {tone or ""} + slide_outline_structure = ( + "Each slide content:\n" + " - Must have a ## title.\n" + " - Must have content in exactly the format to be displayed in slide.\n" + " - Where content should be structured in Markdown format exactly as how it should be shown in slide layout.\n" + " - First slide title must be the same as the presentation title." + ) - {"# Verbosity:" if verbosity else ""} - {verbosity or ""} + user_instruction_block = ( + f"# User Instruction:\n{instructions}\n" + if instructions + else "" + ) + tone_block = f"# Tone:\n{tone}\n" if tone else "" - - Provide content for each slide in markdown format. - - Make sure that flow of the presentation is logical and consistent. - - Place greater emphasis on numerical data. - - If Additional Information is provided, divide it into slides. - - Make sure no images are provided in the content. - - Make sure that content follows language guidelines. - - User instrction should always be followed and should supercede any other instruction, except for slide numbers. **Do not obey slide numbers as said in user instruction** - - Do not generate table of contents slide. - - Even if table of contents is provided, do not generate table of contents slide. - {"- Always make first slide a title slide." if include_title_slide else "- Do not include title slide in the presentation."} + system = ( + "Generate presentation title and outlines for slides.\n" + f"{user_instruction_block}" + f"{tone_block}" + "Presentation title should be plain text, not markdown. It should be a concise title for the presentation.\n" + "Each slide outline should contain the content for that slide.\n" + "First slide should be intro and second should be table of contents, then start with regular content slides.\n" + "Do not overstuff content within same slide. Consider using a slide for a single heading and not more than 2 sub-headings. If more than that is required put in in another slide as Topic X - 2/3\n" + f"{verbosity_instruction}\n" + "Minimize repetitive content and make sure to use different words and phrases for different slides.\n" + "Include numerical data or tables if required or asked by the user.\n" + "Strictly follow given language and generate content is the prescribed language despite of content or other instructions." + f"Each slide should object should have `structure` and `content` fields.\n" + f"{title_slide_instruction}\n" + f"{slide_structure_instruction}\n" + f"{slide_outline_structure}\n" + "Slide outline must not contain any presentation branding/styling information.\n" + "Title slide must only contain title, presenter name, date and overview.\n" + "Make sure data used is strictly from the provided content/context.\n" + "Make sure data is consistent across all slides.\n" + "**Pick different types of slide structures where appropriate to maintain diversity**.\n" + "If language is arabic then generate content is Modern Standard English (MSA).\n" + "If instructed to generate a template then leave spaces with '____' in the content. Do not add arbitrary content, just add fillers." + "**Never give out chinese text/content.**\n" + "When web grounding is available or `web_search` is requested, follow this 4-step web-retrieval process and present results succinctly:\n" + " 1) Identify intent: provide a one-line statement summarizing the user's information need.\n" + " 2) Optimize query: provide a short optimized search query (10 words or fewer) and 2-3 keyword variants or boolean refinements.\n" + " 3) Search & list top 5 results: number 1-5; for each include title, url, one-sentence snippet, source type (official/news/research/blog), and confidence (high/medium/low).\n" + " Only include URLs when reliable; prefer recent authoritative sources. Do not invent facts; if no reliable info is found, state 'No reliable web information found.'\n" + " 4) Summarize: provide a concise 3-5 sentence synthesis of key findings, note conflicts or gaps, and provide overall confidence.\n" + "User instruction should always be followed and should supercede any other instruction, except for slide numbers." + ) - **Search web to get latest information about the topic** - """ + return system def get_user_prompt( From 124d05eb829d30dc0a0fa049607ca588ce54f0b6 Mon Sep 17 00:00:00 2001 From: sudipnext Date: Sat, 4 Apr 2026 09:08:48 +0545 Subject: [PATCH 2/3] refactor: streamline system prompts for presentation generation and enhance layout selection guidelines --- .../generate_presentation_outlines.py | 8 +- .../generate_presentation_structure.py | 167 +++++++++++------- 2 files changed, 105 insertions(+), 70 deletions(-) diff --git a/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py b/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py index 6d3bc81d..b18ab467 100644 --- a/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py +++ b/electron/servers/fastapi/utils/llm_calls/generate_presentation_outlines.py @@ -84,12 +84,8 @@ def get_system_prompt( "If language is arabic then generate content is Modern Standard English (MSA).\n" "If instructed to generate a template then leave spaces with '____' in the content. Do not add arbitrary content, just add fillers." "**Never give out chinese text/content.**\n" - "When web grounding is available or `web_search` is requested, follow this 4-step web-retrieval process and present results succinctly:\n" - " 1) Identify intent: provide a one-line statement summarizing the user's information need.\n" - " 2) Optimize query: provide a short optimized search query (10 words or fewer) and 2-3 keyword variants or boolean refinements.\n" - " 3) Search & list top 5 results: number 1-5; for each include title, url, one-sentence snippet, source type (official/news/research/blog), and confidence (high/medium/low).\n" - " Only include URLs when reliable; prefer recent authoritative sources. Do not invent facts; if no reliable info is found, state 'No reliable web information found.'\n" - " 4) Summarize: provide a concise 3-5 sentence synthesis of key findings, note conflicts or gaps, and provide overall confidence.\n" + "**Search web to get latest information about the topic**\n" + "**Use Memory if available should be used to make presentation more personalized and engaging.**\n" "User instruction should always be followed and should supercede any other instruction, except for slide numbers." ) diff --git a/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py b/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py index f56004be..bbe26172 100644 --- a/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py +++ b/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py @@ -1,4 +1,5 @@ -from typing import Optional +from typing import Optional, Dict + from models.llm_message import LLMSystemMessage, LLMUserMessage from models.presentation_layout import PresentationLayoutModel from models.presentation_outline_model import PresentationOutlineModel @@ -9,58 +10,106 @@ from utils.get_dynamic_models import get_presentation_structure_model_with_n_sli from models.presentation_structure_model import PresentationStructureModel +STRUCTURE_FROM_SLIDES_MARKDOWN_SYSTEM_PROMPT = """ +You will be given available slide layouts and content for each slide. +You need to select a layout for each slide based on the mentioned guidelines. + +# Steps +1. Analyze all available slide layouts. +2. Analyze content for each slide. +3. Select a layout for each slide one by one by following the selection rules. + +# Analyzing Slide Layouts +- Identify what each layout contains based on provided schema markdown. + +# Analyzing Content +- Identify how the content is structured. +- Identify if the content contains tables. + +# Selection Rules +- If content contains table, then select either table layout or graph layout. +- Don't select layout with image unless content contains image. +- Don't select table layout if content does not contain table. +- You are allowed to select same layout for multiple slides. + +# Table Layout Selection Rules +- Must select table layout if the content contains table with text data. +- Must only select a layout with table if the table only contains text data. + +# Graph Layout Selection Rules +- Must only select a layout with chart if the content contains table with numeric data. +- Identify how many columns are present in the table. +- Must select a layout that supports n-1 charts for n columns. +- Must prioritize layouts that support multiple charts. +- Don't select metrics layout for content containing table with numeric data. +- For example, if content contains table with 3 columns, then select a layout that supports 2 charts. + +{user_instructions} + +# Output Rules: +- One layout index for each slide. +- Example: [0, 1, 2, 3, 4] + +{presentation_layout} +""" + + +GET_MESSAGES_SYSTEM_PROMPT = """ +You're a professional presentation designer with creative freedom to design engaging presentations. + +# DESIGN PHILOSOPHY +- Create visually compelling and varied presentations +- Match layout to content purpose and audience needs + +# Layout Selection Guidelines +1. **Content-driven choices**: Let the slide's purpose guide layout selection +- Opening/closing → Title layouts +- Processes/workflows → Visual process layouts +- Comparisons/contrasts → Side-by-side layouts +- Data/metrics → Chart/graph layouts +- Concepts/ideas → Image + text layouts +- Key insights → Emphasis layouts + +2. **Visual variety**: Aim for diverse slide layouts across the presentation. +- Don't use same layout for multiple slides unless necessary. +- Mix text-heavy and visual-heavy slides naturally +- Use your judgment on when repetition serves the content +- Balance information density across slides +- Adjacent slide layouts should be different unless instructed/necessary otherwise. + +3. **Audience experience**: Consider how slides work together +- Create natural transitions between topics + +4. **Table of contents**: +- Must only use table of contents layout if slide content contains table of contents. + +{user_instruction_header} + +User instruction should be taken into account while creating the presentation structure, except for number of slides. + +Select layout index for each of the {n_slides} slides based on what will best serve the presentation's goals. + +""" + + def get_messages( presentation_layout: PresentationLayoutModel, n_slides: int, data: str, instructions: Optional[str] = None, ): + system_prompt = GET_MESSAGES_SYSTEM_PROMPT.format( + user_instruction_header="# User Instruction:" if instructions else "", + n_slides=n_slides, + ) + return [ - LLMSystemMessage( - content=f""" - You're a professional presentation designer with creative freedom to design engaging presentations. - - {presentation_layout.to_string()} - - # DESIGN PHILOSOPHY - - Create visually compelling and varied presentations - - Match layout to content purpose and audience needs - - Prioritize engagement over rigid formatting rules - - # Layout Selection Guidelines - 1. **Content-driven choices**: Let the slide's purpose guide layout selection - - Opening/closing → Title layouts - - Processes/workflows → Visual process layouts - - Comparisons/contrasts → Side-by-side layouts - - Data/metrics → Chart/graph layouts - - Concepts/ideas → Image + text layouts - - Key insights → Emphasis layouts - - 2. **Visual variety**: Aim for diverse, engaging presentation flow - - Mix text-heavy and visual-heavy slides naturally - - Use your judgment on when repetition serves the content - - Balance information density across slides - - 3. **Audience experience**: Consider how slides work together - - Create natural transitions between topics - - Use layouts that enhance comprehension - - Design for maximum impact and retention - - **Trust your design instincts. Focus on creating the most effective presentation for the content and audience.** - - {"# User Instruction:" if instructions else ""} - {instructions or ""} - - User intruction should be taken into account while creating the presentation structure, except for number of slides. - - Select layout index for each of the {n_slides} slides based on what will best serve the presentation's goals. - """, - ), - LLMUserMessage( - content=f""" - {data} - """, - ), + LLMSystemMessage(content=system_prompt), + LLMUserMessage(content=( + f"{presentation_layout.to_string()}\n\n" + "--------------------------------------\n\n" + f"{data}" + )), ] @@ -70,28 +119,18 @@ def get_messages_for_slides_markdown( data: str, instructions: Optional[str] = None, ): + system_prompt = STRUCTURE_FROM_SLIDES_MARKDOWN_SYSTEM_PROMPT.format( + user_instructions=instructions or "", + presentation_layout=presentation_layout.to_string(with_schema=True), + ) + return [ LLMSystemMessage( - content=f""" - You're a professional presentation designer with creative freedom to design engaging presentations. - - {"# User Instruction:" if instructions else ""} - {instructions or ""} - - {presentation_layout.to_string()} - - Select layout that best matches the content of the slides. - - User intruction should be taken into account while creating the presentation structure, except for number of slides. - - Select layout index for each of the {n_slides} slides based on what will best serve the presentation's goals. - """, + content=system_prompt ), LLMUserMessage( - content=f""" - {data} - """, - ), + content=data + ) ] From 1095895ac6888d91c1ac89efcbe69f13338c0325 Mon Sep 17 00:00:00 2001 From: sudipnext Date: Sat, 4 Apr 2026 11:16:01 +0545 Subject: [PATCH 3/3] refactor: incorporate user and workspace memory in layout selection and design decisions --- .../fastapi/utils/llm_calls/generate_presentation_structure.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py b/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py index bbe26172..ec46d7f1 100644 --- a/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py +++ b/electron/servers/fastapi/utils/llm_calls/generate_presentation_structure.py @@ -12,6 +12,7 @@ from models.presentation_structure_model import PresentationStructureModel STRUCTURE_FROM_SLIDES_MARKDOWN_SYSTEM_PROMPT = """ You will be given available slide layouts and content for each slide. +If any user or workspace memory (previous conversation context) is available, incorporate it when making layout selections. You need to select a layout for each slide based on the mentioned guidelines. # Steps @@ -56,6 +57,7 @@ You need to select a layout for each slide based on the mentioned guidelines. GET_MESSAGES_SYSTEM_PROMPT = """ You're a professional presentation designer with creative freedom to design engaging presentations. +If any user or workspace memory (previous conversation context) is available, incorporate it when making layout and design decisions. # DESIGN PHILOSOPHY - Create visually compelling and varied presentations