From edacfb196bde6d8b927c5f06478f558fcf772dd1 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Thu, 29 Jan 2026 13:07:52 +0100 Subject: [PATCH] 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