From edacfb196bde6d8b927c5f06478f558fcf772dd1 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Thu, 29 Jan 2026 13:07:52 +0100 Subject: [PATCH 1/8] Create a new Assistant --- .../Assistants/PowerPoint/PowerPoint.razor | 8 + .../Assistants/PowerPoint/PowerPoint.razor.cs | 169 ++++++++++++++++++ .../Settings/SettingsDialogPowerPoint.razor | 28 +++ .../SettingsDialogPowerPoint.razor.cs | 7 + 4 files changed, 212 insertions(+) create mode 100644 app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor create mode 100644 app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs create mode 100644 app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor create mode 100644 app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor.cs diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor new file mode 100644 index 00000000..49e811a9 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -0,0 +1,8 @@ +@attribute [Route(Routes.ASSISTANT_SYNONYMS)] +@inherits AssistantBaseCore + + + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs new file mode 100644 index 00000000..bbbe2293 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -0,0 +1,169 @@ +using Microsoft.AspNetCore.Components; +using AIStudio.Chat; +using AIStudio.Dialogs.Settings; + +namespace AIStudio.Assistants.PowerPoint; + +public partial class PowerPoint : AssistantBaseCore +{ + public override Tools.Components Component => Tools.Components.SYNONYMS_ASSISTANT; + + protected override string Title => T("Synonyms"); + + protected override string Description => T("Find synonyms for words or phrases."); + + protected override string SystemPrompt => + $""" + You have a PhD in linguistics. Therefore, you are an expert in the {this.SystemPromptLanguage()} language. + You receive a word or phrase as input. You might also receive some context. You then provide + a list of synonyms as a Markdown list. + + First, derive possible meanings from the word, phrase, and context, when available. Then, provide + possible synonyms for each meaning. + + Example for the word "learn" and the language English (US): + + Derive possible meanings (*this list is not part of the output*): + - Meaning "to learn" + - Meaning "to retain" + + Next, provide possible synonyms for each meaning, which is your output: + + # Meaning "to learn" + - absorb + - study + - acquire + - advance + - practice + + # Meaning "to retain" + - remember + - note + - realize + + You do not ask follow-up questions and never repeat the task instructions. When you do not know + any synonyms for the given word or phrase, you state this. Your output is always in + the {this.SystemPromptLanguage()} language. + """; + + protected override bool AllowProfiles => false; + + protected override IReadOnlyList FooterButtons => []; + + protected override string SubmitText => T("Find synonyms"); + + protected override Func SubmitAction => this.FindSynonyms; + + protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with + { + SystemPrompt = SystemPrompts.DEFAULT, + }; + + protected override void ResetForm() + { + this.inputText = string.Empty; + this.inputContext = string.Empty; + if (!this.MightPreselectValues()) + { + this.selectedLanguage = CommonLanguages.AS_IS; + this.customTargetLanguage = string.Empty; + } + } + + protected override bool MightPreselectValues() + { + if (this.SettingsManager.ConfigurationData.Synonyms.PreselectOptions) + { + this.selectedLanguage = this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage; + this.customTargetLanguage = this.SettingsManager.ConfigurationData.Synonyms.PreselectedOtherLanguage; + return true; + } + + return false; + } + + private string inputText = string.Empty; + private string inputContext = string.Empty; + private CommonLanguages selectedLanguage; + private string customTargetLanguage = string.Empty; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_SYNONYMS_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputContext = deferredContent; + + await base.OnInitializedAsync(); + } + + #endregion + + private string? ValidatingText(string text) + { + if(string.IsNullOrWhiteSpace(text)) + return T("Please provide a word or phrase as input."); + + return null; + } + + private string? ValidateCustomLanguage(string language) + { + if(this.selectedLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language)) + return T("Please provide a custom language."); + + return null; + } + + private string SystemPromptLanguage() + { + var lang = this.selectedLanguage switch + { + CommonLanguages.AS_IS => "source", + CommonLanguages.OTHER => this.customTargetLanguage, + + _ => $"{this.selectedLanguage.Name()}", + }; + + if (string.IsNullOrWhiteSpace(lang)) + return "source"; + + return lang; + } + + private string UserPromptContext() + { + if(string.IsNullOrWhiteSpace(this.inputContext)) + return string.Empty; + + return $""" + The given context is: + + ``` + {this.inputContext} + ``` + + """; + } + + private async Task FindSynonyms() + { + await this.form!.Validate(); + if (!this.inputIsValid) + return; + + this.CreateChatThread(); + var time = this.AddUserRequest( + $""" + {this.UserPromptContext()} + The given word or phrase is: + + ``` + {this.inputText} + ``` + """); + + await this.AddAIResponseAsync(time); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor new file mode 100644 index 00000000..46b5b8f2 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor @@ -0,0 +1,28 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + @T("Assistant: Synonyms Options") + + + + + + + @if (this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + @T("Close") + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor.cs new file mode 100644 index 00000000..da9bc0c7 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor.cs @@ -0,0 +1,7 @@ +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogPowerPoint : SettingsDialogBase +{ +} \ No newline at end of file From 51154ec6b38268e472ca42718c87cd875038691a Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Thu, 29 Jan 2026 13:50:20 +0100 Subject: [PATCH 2/8] Integrate the assistant into the code --- .../Assistants/PowerPoint/PowerPoint.razor | 4 ++-- .../Assistants/PowerPoint/PowerPoint.razor.cs | 8 ++++---- .../Dialogs/Settings/SettingsDialogPowerPoint.razor | 4 ++-- app/MindWork AI Studio/Pages/Assistants.razor | 4 +++- app/MindWork AI Studio/Routes.razor.cs | 3 ++- app/MindWork AI Studio/Tools/Components.cs | 1 + app/MindWork AI Studio/Tools/ComponentsExtensions.cs | 1 + 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor index 49e811a9..5f915ade 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -1,8 +1,8 @@ -@attribute [Route(Routes.ASSISTANT_SYNONYMS)] +@attribute [Route(Routes.ASSISTANT_POWERPOINT)] @inherits AssistantBaseCore - \ No newline at end of file + diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index bbbe2293..5a0c586c 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -6,11 +6,11 @@ namespace AIStudio.Assistants.PowerPoint; public partial class PowerPoint : AssistantBaseCore { - public override Tools.Components Component => Tools.Components.SYNONYMS_ASSISTANT; + public override Tools.Components Component => Tools.Components.POWER_POINT_ASSISTANT; - protected override string Title => T("Synonyms"); + protected override string Title => T("Power Point"); - protected override string Description => T("Find synonyms for words or phrases."); + protected override string Description => T("Create and refine PowerPoint slide text from a topic or outline."); protected override string SystemPrompt => $""" @@ -50,7 +50,7 @@ Derive possible meanings (*this list is not part of the output*): protected override IReadOnlyList FooterButtons => []; - protected override string SubmitText => T("Find synonyms"); + protected override string SubmitText => T("Create Power Point"); protected override Func SubmitAction => this.FindSynonyms; diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor index 46b5b8f2..553883b1 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPowerPoint.razor @@ -5,12 +5,12 @@ - @T("Assistant: Synonyms Options") + @T("Assistant: Power Point Options") - + @if (this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage is CommonLanguages.OTHER) { diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index 250aa06c..6003e1b3 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -37,7 +37,8 @@ (Components.AGENDA_ASSISTANT, PreviewFeatures.NONE), (Components.JOB_POSTING_ASSISTANT, PreviewFeatures.NONE), (Components.LEGAL_CHECK_ASSISTANT, PreviewFeatures.NONE), - (Components.ICON_FINDER_ASSISTANT, PreviewFeatures.NONE) + (Components.ICON_FINDER_ASSISTANT, PreviewFeatures.NONE), + (Components.POWER_POINT_ASSISTANT, PreviewFeatures.NONE) )) { @@ -51,6 +52,7 @@ + } diff --git a/app/MindWork AI Studio/Routes.razor.cs b/app/MindWork AI Studio/Routes.razor.cs index 836cab0e..a4a633d6 100644 --- a/app/MindWork AI Studio/Routes.razor.cs +++ b/app/MindWork AI Studio/Routes.razor.cs @@ -22,6 +22,7 @@ public sealed partial class Routes public const string ASSISTANT_EMAIL = "/assistant/email"; public const string ASSISTANT_LEGAL_CHECK = "/assistant/legal-check"; public const string ASSISTANT_SYNONYMS = "/assistant/synonyms"; + public const string ASSISTANT_POWERPOINT = "/assistant/powerpoint"; public const string ASSISTANT_MY_TASKS = "/assistant/my-tasks"; public const string ASSISTANT_JOB_POSTING = "/assistant/job-posting"; public const string ASSISTANT_BIAS = "/assistant/bias-of-the-day"; @@ -29,4 +30,4 @@ public sealed partial class Routes public const string ASSISTANT_AI_STUDIO_I18N = "/assistant/ai-studio/i18n"; public const string ASSISTANT_DOCUMENT_ANALYSIS = "/assistant/document-analysis"; // ReSharper restore InconsistentNaming -} \ No newline at end of file +} diff --git a/app/MindWork AI Studio/Tools/Components.cs b/app/MindWork AI Studio/Tools/Components.cs index 1004188c..f8c6f6d1 100644 --- a/app/MindWork AI Studio/Tools/Components.cs +++ b/app/MindWork AI Studio/Tools/Components.cs @@ -19,6 +19,7 @@ public enum Components BIAS_DAY_ASSISTANT, ERI_ASSISTANT, DOCUMENT_ANALYSIS_ASSISTANT, + POWER_POINT_ASSISTANT, // ReSharper disable InconsistentNaming I18N_ASSISTANT, diff --git a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs index 54eb2cfa..dd488ffa 100644 --- a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs +++ b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs @@ -43,6 +43,7 @@ public static class ComponentsExtensions Components.ERI_ASSISTANT => TB("ERI Server"), Components.I18N_ASSISTANT => TB("Localization Assistant"), Components.DOCUMENT_ANALYSIS_ASSISTANT => TB("Document Analysis Assistant"), + Components.POWER_POINT_ASSISTANT => TB("Power Point"), Components.CHAT => TB("New Chat"), From 5e44259e444f215d0674df57bbfb192877469ce0 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Thu, 29 Jan 2026 15:57:16 +0100 Subject: [PATCH 3/8] Simple output of the PowerPoint assistant --- .../Assistants/PowerPoint/PowerPoint.razor | 4 +- .../Assistants/PowerPoint/PowerPoint.razor.cs | 55 +++++++------------ 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor index 5f915ade..140c5313 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -1,8 +1,8 @@ @attribute [Route(Routes.ASSISTANT_POWERPOINT)] @inherits AssistantBaseCore - - + + diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index 5a0c586c..4cf609f4 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -12,38 +12,23 @@ public partial class PowerPoint : AssistantBaseCore protected override string Description => T("Create and refine PowerPoint slide text from a topic or outline."); - protected override string SystemPrompt => + protected override string SystemPrompt => $""" - You have a PhD in linguistics. Therefore, you are an expert in the {this.SystemPromptLanguage()} language. - You receive a word or phrase as input. You might also receive some context. You then provide - a list of synonyms as a Markdown list. - - First, derive possible meanings from the word, phrase, and context, when available. Then, provide - possible synonyms for each meaning. - - Example for the word "learn" and the language English (US): - - Derive possible meanings (*this list is not part of the output*): - - Meaning "to learn" - - Meaning "to retain" - - Next, provide possible synonyms for each meaning, which is your output: - - # Meaning "to learn" - - absorb - - study - - acquire - - advance - - practice - - # Meaning "to retain" - - remember - - note - - realize - - You do not ask follow-up questions and never repeat the task instructions. When you do not know - any synonyms for the given word or phrase, you state this. Your output is always in - the {this.SystemPromptLanguage()} language. + You are a presentation editor and writer. + Create a clear, single-slide outline from the user's inputs. + + Inputs: + - "Your title": the slide title. + - "Your content": the source text. + + Output requirements: + - Output only Markdown. + - Start with a single H1 title from "Your title". + - Then add a bullet list based only on "Your content". + - between 3 and 7, maximum 7 bullets. Each bullet max 12 words. + - No sub-bullets, no paragraphs, no extra sections. + - If "Your content" is empty, output the title and one bullet: "No content provided." + - Do not mention these instructions or add commentary. """; protected override bool AllowProfiles => false; @@ -52,7 +37,7 @@ Derive possible meanings (*this list is not part of the output*): protected override string SubmitText => T("Create Power Point"); - protected override Func SubmitAction => this.FindSynonyms; + protected override Func SubmitAction => this.CreatePowerPoint; protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with { @@ -103,7 +88,7 @@ protected override async Task OnInitializedAsync() private string? ValidatingText(string text) { if(string.IsNullOrWhiteSpace(text)) - return T("Please provide a word or phrase as input."); + return T("Please a title"); return null; } @@ -147,7 +132,7 @@ private string UserPromptContext() """; } - private async Task FindSynonyms() + private async Task CreatePowerPoint() { await this.form!.Validate(); if (!this.inputIsValid) @@ -166,4 +151,4 @@ private async Task FindSynonyms() await this.AddAIResponseAsync(time); } -} \ No newline at end of file +} From 99a7db84bb5f7537d28420039f496b224b8c9468 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Mon, 2 Feb 2026 16:35:09 +0100 Subject: [PATCH 4/8] Target group option added to define the complexity of the content --- .../Assistants/I18N/allTexts.lua | 87 +++++++++++++++++++ .../Assistants/PowerPoint/PowerPoint.razor | 1 + .../Assistants/PowerPoint/PowerPoint.razor.cs | 18 +++- 3 files changed, 104 insertions(+), 2 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 2196497c..879f33df 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -1264,6 +1264,57 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = -- Please provide a custom language. UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T656744944"] = "Please provide a custom language." +-- Please provide a target group. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T1252056165"] = "Please provide a target group." + +-- Your title +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T1790167032"] = "Your title" + +-- Power Point +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2194178916"] = "Power Point" + +-- Create and refine PowerPoint slide text from a topic or outline. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2255686621"] = "Create and refine PowerPoint slide text from a topic or outline." + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2591284123"] = "Language" + +-- Target group +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2709966651"] = "Target group" + +-- Create Power Point +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T3145212510"] = "Create Power Point" + +-- Please a title +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T3359269886"] = "Please a title" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T3848935911"] = "Custom target language" + +-- Your content +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T526734495"] = "Your content" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T656744944"] = "Please provide a custom language." + +-- Children +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::TARGETGROUPEXTENSIONS::T188567026"] = "Children" + +-- Students +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::TARGETGROUPEXTENSIONS::T2905889225"] = "Students" + +-- Scientists +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::TARGETGROUPEXTENSIONS::T332785734"] = "Scientists" + +-- No target group +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::TARGETGROUPEXTENSIONS::T3644477204"] = "No target group" + +-- Office workers +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::TARGETGROUPEXTENSIONS::T3873911022"] = "Office workers" + +-- Executive committee +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::TARGETGROUPEXTENSIONS::T537362216"] = "Executive committee" + -- Please provide a text as input. You might copy the desired text from a document or a website. UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." @@ -4297,6 +4348,33 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] -- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T711745239"] = "When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model." +-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T183953912"] = "When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model." + +-- No Power Point options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T2203742337"] = "No Power Point options are preselected" + +-- Preselect Power Point options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T2253853076"] = "Preselect Power Point options?" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T2345162613"] = "Which language should be preselected?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T2382415529"] = "Preselect another language" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T2571465005"] = "Preselect the language" + +-- Power Point options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T3094929560"] = "Power Point options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T3448155331"] = "Close" + +-- Assistant: Power Point Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPOWERPOINT::T426362386"] = "Assistant: Power Point Options" + -- Edit Profile UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1143111468"] = "Edit Profile" @@ -4825,6 +4903,12 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1934717573"] = "Check grammar and -- Translate text into another language. UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T209791153"] = "Translate text into another language." +-- Power Point +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2194178916"] = "Power Point" + +-- Create and refine PowerPoint slide text from a topic or outline. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2255686621"] = "Create and refine PowerPoint slide text from a topic or outline." + -- Generate an e-mail for a given context. UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2383649630"] = "Generate an e-mail for a given context." @@ -5722,6 +5806,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar -- Legal Check Assistant UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant" +-- Power Point +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2194178916"] = "Power Point" + -- Job Posting Assistant UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2212811874"] = "Job Posting Assistant" diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor index 140c5313..3ce4bf46 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -5,4 +5,5 @@ + diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index 4cf609f4..f75d12f0 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -1,5 +1,4 @@ -using Microsoft.AspNetCore.Components; -using AIStudio.Chat; +using AIStudio.Chat; using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.PowerPoint; @@ -20,6 +19,7 @@ You are a presentation editor and writer. Inputs: - "Your title": the slide title. - "Your content": the source text. + {this.selectedTargetGroup.Prompt()} Output requirements: - Output only Markdown. @@ -48,6 +48,9 @@ protected override void ResetForm() { this.inputText = string.Empty; this.inputContext = string.Empty; + this.expertInField = string.Empty; + this.selectedTargetGroup = TargetGroup.NO_CHANGE; + this.customTargetGroup = string.Empty; if (!this.MightPreselectValues()) { this.selectedLanguage = CommonLanguages.AS_IS; @@ -71,6 +74,9 @@ protected override bool MightPreselectValues() private string inputContext = string.Empty; private CommonLanguages selectedLanguage; private string customTargetLanguage = string.Empty; + private string expertInField = string.Empty; + private TargetGroup selectedTargetGroup; + private string customTargetGroup = string.Empty; #region Overrides of ComponentBase @@ -101,6 +107,14 @@ protected override async Task OnInitializedAsync() return null; } + private string? ValidateTargetGroup(string group) + { + if(this.selectedTargetGroup == TargetGroup.NO_CHANGE && string.IsNullOrWhiteSpace(group)) + return T("Please provide a target group."); + + return null; + } + private string SystemPromptLanguage() { var lang = this.selectedLanguage switch From 96bcc33071a49edef3196633b6b4874e6abb1c98 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Tue, 3 Feb 2026 15:27:53 +0100 Subject: [PATCH 5/8] Add Button and Option "Use file content as input" --- .../Assistants/PowerPoint/PowerPoint.razor | 6 ++-- .../Assistants/PowerPoint/PowerPoint.razor.cs | 29 +++---------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor index 3ce4bf46..3c15afcb 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -2,8 +2,10 @@ @inherits AssistantBaseCore - - + + + + diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index f75d12f0..c2f6e3c6 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -15,9 +15,11 @@ public partial class PowerPoint : AssistantBaseCore $""" You are a presentation editor and writer. Create a clear, single-slide outline from the user's inputs. + {this.selectedTargetLanguage.PromptTranslation(this.customTargetLanguage)} Inputs: - - "Your title": the slide title. + - "Your title": the slide title. + {this.inputText} - "Your content": the source text. {this.selectedTargetGroup.Prompt()} @@ -77,6 +79,7 @@ protected override bool MightPreselectValues() private string expertInField = string.Empty; private TargetGroup selectedTargetGroup; private string customTargetGroup = string.Empty; + private CommonLanguages selectedTargetLanguage; #region Overrides of ComponentBase @@ -106,30 +109,6 @@ protected override async Task OnInitializedAsync() return null; } - - private string? ValidateTargetGroup(string group) - { - if(this.selectedTargetGroup == TargetGroup.NO_CHANGE && string.IsNullOrWhiteSpace(group)) - return T("Please provide a target group."); - - return null; - } - - private string SystemPromptLanguage() - { - var lang = this.selectedLanguage switch - { - CommonLanguages.AS_IS => "source", - CommonLanguages.OTHER => this.customTargetLanguage, - - _ => $"{this.selectedLanguage.Name()}", - }; - - if (string.IsNullOrWhiteSpace(lang)) - return "source"; - - return lang; - } private string UserPromptContext() { From 3b0939819b91412c32873e5cd111243a90938265 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Wed, 4 Feb 2026 15:52:29 +0100 Subject: [PATCH 6/8] Update PowerPoint assistant: improve Markdown formatting instructions and refine UI text labels --- app/MindWork AI Studio/Assistants/I18N/allTexts.lua | 7 ++----- .../Assistants/PowerPoint/PowerPoint.razor.cs | 8 ++++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 879f33df..e6db2523 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -1264,9 +1264,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = -- Please provide a custom language. UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T656744944"] = "Please provide a custom language." --- Please provide a target group. -UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T1252056165"] = "Please provide a target group." - -- Your title UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T1790167032"] = "Your title" @@ -1276,8 +1273,8 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2194178916"] = " -- Create and refine PowerPoint slide text from a topic or outline. UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2255686621"] = "Create and refine PowerPoint slide text from a topic or outline." --- Language -UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2591284123"] = "Language" +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T237828418"] = "Target language" -- Target group UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::POWERPOINT::POWERPOINT::T2709966651"] = "Target group" diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index c2f6e3c6..07330c00 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -22,13 +22,17 @@ You are a presentation editor and writer. {this.inputText} - "Your content": the source text. {this.selectedTargetGroup.Prompt()} + + - You are a Markdown formatter. + - Your task is to identify headings in the input text that are marked with either # (for h1–h6) or **bold text** (used as pseudo-headings). + - Convert all such headings into proper Markdown subheadings using ## for subheadings (level 2), preserving the original text. + - Do not change any other content. + - between 3 and 7, maximum 7 bullets per heading. Each bullet max 12 words. Output requirements: - Output only Markdown. - Start with a single H1 title from "Your title". - Then add a bullet list based only on "Your content". - - between 3 and 7, maximum 7 bullets. Each bullet max 12 words. - - No sub-bullets, no paragraphs, no extra sections. - If "Your content" is empty, output the title and one bullet: "No content provided." - Do not mention these instructions or add commentary. """; From e99fa14a4c9d724f29eade85a14682fb6dbe4538 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Fri, 6 Feb 2026 12:11:25 +0100 Subject: [PATCH 7/8] Add option "Number of sheets" and "Time specification" --- .../Assistants/PowerPoint/PowerPoint.razor | 16 +++++++ .../Assistants/PowerPoint/PowerPoint.razor.cs | 43 +++++++++++++------ 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor index 3c15afcb..470254f0 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -6,6 +6,22 @@ + + + + + + + + + + diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index 07330c00..6b117a03 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -12,27 +12,33 @@ public partial class PowerPoint : AssistantBaseCore protected override string Description => T("Create and refine PowerPoint slide text from a topic or outline."); protected override string SystemPrompt => - $""" - You are a presentation editor and writer. + $$""" + You are a professional presentation editor and writer. Create a clear, single-slide outline from the user's inputs. - {this.selectedTargetLanguage.PromptTranslation(this.customTargetLanguage)} + {{this.selectedTargetLanguage.PromptTranslation(this.customTargetLanguage)}} Inputs: - - "Your title": the slide title. - {this.inputText} + - "Your title": the main title. + {{this.inputText}} - "Your content": the source text. - {this.selectedTargetGroup.Prompt()} + {{this.selectedTargetGroup.Prompt()}} - - You are a Markdown formatter. - - Your task is to identify headings in the input text that are marked with either # (for h1–h6) or **bold text** (used as pseudo-headings). - - Convert all such headings into proper Markdown subheadings using ## for subheadings (level 2), preserving the original text. - - Do not change any other content. - - between 3 and 7, maximum 7 bullets per heading. Each bullet max 12 words. + Rule for creating the individual subheadings: + - If {{this.numberOfSheets}} is NOT 0 + - Generate exactly {{this.numberOfSheets}} precise subheadings, each heading represents one slide in a presentation. + - If {{this.timeSpecification}} is NOT 0 + - Generate exactly {{this.calculatedNumberOfSlides}} precise subheadings, each heading represents one slide in a presentation. + - If either parameter is 0, ignore that rules. + + - Each subheadings must have: + - A clear, concise, and thematically meaningful heading. + - 3 to 7 bullet points (max 7) summarizing the slide’s content. + - Each bullet point must be max 12 words. Output requirements: - Output only Markdown. - Start with a single H1 title from "Your title". - - Then add a bullet list based only on "Your content". + - Then add headings with own bullet lists based only on "Your content". - If "Your content" is empty, output the title and one bullet: "No content provided." - Do not mention these instructions or add commentary. """; @@ -84,7 +90,10 @@ protected override bool MightPreselectValues() private TargetGroup selectedTargetGroup; private string customTargetGroup = string.Empty; private CommonLanguages selectedTargetLanguage; - + private double numberOfSheets; + private decimal timeSpecification; + private int calculatedNumberOfSlides = 0; + #region Overrides of ComponentBase protected override async Task OnInitializedAsync() @@ -114,6 +123,11 @@ protected override async Task OnInitializedAsync() return null; } + private int CalculateNumberOfSlides() + { + return this.calculatedNumberOfSlides = (int)Math.Round(this.timeSpecification / (decimal)1.5); + } + private string UserPromptContext() { if(string.IsNullOrWhiteSpace(this.inputContext)) @@ -135,11 +149,12 @@ private async Task CreatePowerPoint() if (!this.inputIsValid) return; + this.calculatedNumberOfSlides = this.timeSpecification > 0 ? this.CalculateNumberOfSlides() : 0; + this.CreateChatThread(); var time = this.AddUserRequest( $""" {this.UserPromptContext()} - The given word or phrase is: ``` {this.inputText} From 766fbf16b66abceece0394bf6c2bbaf7b305e400 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Mon, 9 Feb 2026 14:40:09 +0100 Subject: [PATCH 8/8] Update SystemPrompt rules --- .../Assistants/PowerPoint/PowerPoint.razor | 2 +- .../Assistants/PowerPoint/PowerPoint.razor.cs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor index 470254f0..cc380fcc 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor @@ -18,7 +18,7 @@ + Min="0.0" /> diff --git a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs index 6b117a03..a48c6514 100644 --- a/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs +++ b/app/MindWork AI Studio/Assistants/PowerPoint/PowerPoint.razor.cs @@ -32,8 +32,9 @@ You are a professional presentation editor and writer. - Each subheadings must have: - A clear, concise, and thematically meaningful heading. - - 3 to 7 bullet points (max 7) summarizing the slide’s content. + - 1 to 7 bullet points (maximum 7) summarizing the slide’s content — use as many as needed, but never more than 7. - Each bullet point must be max 12 words. + - Place *** on its own line immediately before each heading. Output requirements: - Output only Markdown. @@ -91,7 +92,7 @@ protected override bool MightPreselectValues() private string customTargetGroup = string.Empty; private CommonLanguages selectedTargetLanguage; private double numberOfSheets; - private decimal timeSpecification; + private double timeSpecification; private int calculatedNumberOfSlides = 0; #region Overrides of ComponentBase @@ -125,7 +126,7 @@ protected override async Task OnInitializedAsync() private int CalculateNumberOfSlides() { - return this.calculatedNumberOfSlides = (int)Math.Round(this.timeSpecification / (decimal)1.5); + return this.calculatedNumberOfSlides = (int)Math.Round(this.timeSpecification / 1.5); } private string UserPromptContext()