From 423388e18fad14431d9afe88974df68d5c8a070d Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sun, 18 Aug 2024 12:31:46 +0200 Subject: [PATCH] Added the possibility to send an assistant's result to another assistant --- .../Components/AssistantBase.razor | 16 +++++++ .../Components/AssistantBase.razor.cs | 33 ++++++++++++++ .../Pages/Agenda/AssistantAgenda.razor.cs | 12 +++++ .../Pages/Coding/AssistantCoding.razor.cs | 14 ++++++ .../AssistantGrammarSpelling.razor.cs | 14 +++++- .../IconFinder/AssistantIconFinder.razor.cs | 44 ++++++++++++------- .../AssistantRewriteImprove.razor.cs | 12 ++++- .../Components/Pages/SendToAssistant.cs | 14 ++++++ .../Pages/SendToAssistantExtensions.cs | 20 +++++++++ .../AssistantTextSummarizer.razor.cs | 12 +++++ .../Translation/AssistantTranslation.razor.cs | 12 +++++ app/MindWork AI Studio/Tools/Event.cs | 9 ++++ app/MindWork AI Studio/Tools/SendToButton.cs | 15 +++++++ .../wwwroot/changelog/v0.8.9.md | 5 +++ 14 files changed, 214 insertions(+), 18 deletions(-) create mode 100644 app/MindWork AI Studio/Components/Pages/SendToAssistant.cs create mode 100644 app/MindWork AI Studio/Components/Pages/SendToAssistantExtensions.cs create mode 100644 app/MindWork AI Studio/Tools/SendToButton.cs create mode 100644 app/MindWork AI Studio/wwwroot/changelog/v0.8.9.md diff --git a/app/MindWork AI Studio/Components/AssistantBase.razor b/app/MindWork AI Studio/Components/AssistantBase.razor index 33058cd6..363cc220 100644 --- a/app/MindWork AI Studio/Components/AssistantBase.razor +++ b/app/MindWork AI Studio/Components/AssistantBase.razor @@ -1,4 +1,6 @@ @using AIStudio.Chat +@using AIStudio.Components.Pages +@using AIStudio.Tools @this.Title @@ -51,6 +53,20 @@ @buttonData.Text break; + + case SendToButton sendToButton: + + @foreach (var assistant in Enum.GetValues().OrderBy(n => n.Name().Length)) + { + if(assistant is Pages.SendToAssistant.NONE || sendToButton.Self == assistant) + continue; + + + @assistant.Name() + + } + + break; } } diff --git a/app/MindWork AI Studio/Components/AssistantBase.razor.cs b/app/MindWork AI Studio/Components/AssistantBase.razor.cs index 7ea611e9..494db193 100644 --- a/app/MindWork AI Studio/Components/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBase.razor.cs @@ -1,10 +1,13 @@ using AIStudio.Chat; +using AIStudio.Components.Pages; using AIStudio.Provider; using AIStudio.Settings; using AIStudio.Tools; using Microsoft.AspNetCore.Components; +using Path = AIStudio.Components.Pages.Path; + namespace AIStudio.Components; public abstract partial class AssistantBase : ComponentBase @@ -160,4 +163,34 @@ public abstract partial class AssistantBase : ComponentBase return icon; } + + private Task SendToAssistant(SendToAssistant assistant, SendToButton sendToButton) + { + var contentToSend = sendToButton.UseResultingContentBlockData switch + { + false => sendToButton.GetData(), + true => this.resultingContentBlock?.Content switch + { + ContentText textBlock => textBlock.Text, + _ => string.Empty, + }, + }; + + var (eventItem, path) = assistant switch + { + Pages.SendToAssistant.AGENDA_ASSISTANT => (Event.SEND_TO_AGENDA_ASSISTANT, Path.ASSISTANT_AGENDA), + Pages.SendToAssistant.CODING_ASSISTANT => (Event.SEND_TO_CODING_ASSISTANT, Path.ASSISTANT_CODING), + Pages.SendToAssistant.REWRITE_ASSISTANT => (Event.SEND_TO_REWRITE_ASSISTANT, Path.ASSISTANT_REWRITE), + Pages.SendToAssistant.TRANSLATION_ASSISTANT => (Event.SEND_TO_TRANSLATION_ASSISTANT, Path.ASSISTANT_TRANSLATION), + Pages.SendToAssistant.ICON_FINDER_ASSISTANT => (Event.SEND_TO_ICON_FINDER_ASSISTANT, Path.ASSISTANT_ICON_FINDER), + Pages.SendToAssistant.GRAMMAR_SPELLING_ASSISTANT => (Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT, Path.ASSISTANT_GRAMMAR_SPELLING), + Pages.SendToAssistant.TEXT_SUMMARIZER_ASSISTANT => (Event.SEND_TO_TEXT_SUMMARIZER_ASSISTANT, Path.ASSISTANT_SUMMARIZER), + + _ => (Event.NONE, Path.ASSISTANTS), + }; + + MessageBus.INSTANCE.DeferMessage(this, eventItem, contentToSend); + this.NavigationManager.NavigateTo(path); + return Task.CompletedTask; + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor.cs b/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor.cs index ba679070..be056a69 100644 --- a/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor.cs @@ -93,6 +93,14 @@ public partial class AssistantAgenda : AssistantBaseCore - Mary Jane: Work package 3 """; + protected override IReadOnlyList FooterButtons => + [ + new SendToButton + { + Self = SendToAssistant.AGENDA_ASSISTANT, + }, + ]; + private string inputTopic = string.Empty; private string inputName = string.Empty; private string inputContent = string.Empty; @@ -145,6 +153,10 @@ public partial class AssistantAgenda : AssistantBaseCore this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider); } + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_AGENDA_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputContent = deferredContent; + await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs index f0e552e3..ac6a2c1d 100644 --- a/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs @@ -1,5 +1,7 @@ using System.Text; +using AIStudio.Tools; + namespace AIStudio.Components.Pages.Coding; public partial class AssistantCoding : AssistantBaseCore @@ -24,6 +26,14 @@ public partial class AssistantCoding : AssistantBaseCore When the user asks in a different language than English, you answer in the same language! """; + protected override IReadOnlyList FooterButtons => + [ + new SendToButton + { + Self = SendToAssistant.CODING_ASSISTANT, + }, + ]; + private readonly List codingContexts = new(); private bool provideCompilerMessages; private string compilerMessages = string.Empty; @@ -39,6 +49,10 @@ public partial class AssistantCoding : AssistantBaseCore this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Coding.PreselectedProvider); } + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_CODING_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.questions = deferredContent; + await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Components/Pages/GrammarSpelling/AssistantGrammarSpelling.razor.cs b/app/MindWork AI Studio/Components/Pages/GrammarSpelling/AssistantGrammarSpelling.razor.cs index a1ec9f70..3d7916c2 100644 --- a/app/MindWork AI Studio/Components/Pages/GrammarSpelling/AssistantGrammarSpelling.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/GrammarSpelling/AssistantGrammarSpelling.razor.cs @@ -28,8 +28,14 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore protected override IReadOnlyList FooterButtons => [ new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.correctedText)), - }; - + new SendToButton + { + Self = SendToAssistant.GRAMMAR_SPELLING_ASSISTANT, + UseResultingContentBlockData = false, + GetData = () => string.IsNullOrWhiteSpace(this.correctedText) ? this.inputText : this.correctedText + }, + ]; + #region Overrides of ComponentBase protected override async Task OnInitializedAsync() @@ -41,6 +47,10 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedProvider); } + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputText = deferredContent; + await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs b/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs index d1f54e5e..72547580 100644 --- a/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs @@ -1,3 +1,5 @@ +using AIStudio.Tools; + namespace AIStudio.Components.Pages.IconFinder; public partial class AssistantIconFinder : AssistantBaseCore @@ -5,21 +7,6 @@ public partial class AssistantIconFinder : AssistantBaseCore private string inputContext = string.Empty; private IconSources selectedIconSource; - #region Overrides of ComponentBase - - protected override async Task OnInitializedAsync() - { - if (this.SettingsManager.ConfigurationData.IconFinder.PreselectOptions) - { - this.selectedIconSource = this.SettingsManager.ConfigurationData.IconFinder.PreselectedSource; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.IconFinder.PreselectedProvider); - } - - await base.OnInitializedAsync(); - } - - #endregion - protected override string Title => "Icon Finder"; protected override string Description => @@ -40,7 +27,34 @@ public partial class AssistantIconFinder : AssistantBaseCore related to the keyword "buildings" might be the best match. Provide your keywords in a Markdown list without quotation marks. """; + + protected override IReadOnlyList FooterButtons => + [ + new SendToButton + { + Self = SendToAssistant.ICON_FINDER_ASSISTANT, + }, + ]; + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + if (this.SettingsManager.ConfigurationData.IconFinder.PreselectOptions) + { + this.selectedIconSource = this.SettingsManager.ConfigurationData.IconFinder.PreselectedSource; + this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.IconFinder.PreselectedProvider); + } + + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_ICON_FINDER_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputContext = deferredContent; + + await base.OnInitializedAsync(); + } + + #endregion + private string? ValidatingContext(string context) { if(string.IsNullOrWhiteSpace(context)) diff --git a/app/MindWork AI Studio/Components/Pages/RewriteImprove/AssistantRewriteImprove.razor.cs b/app/MindWork AI Studio/Components/Pages/RewriteImprove/AssistantRewriteImprove.razor.cs index bd4c5664..c2feff8c 100644 --- a/app/MindWork AI Studio/Components/Pages/RewriteImprove/AssistantRewriteImprove.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/RewriteImprove/AssistantRewriteImprove.razor.cs @@ -28,7 +28,13 @@ public partial class AssistantRewriteImprove : AssistantBaseCore protected override IReadOnlyList FooterButtons => [ - new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.rewrittenText)) + new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.rewrittenText)), + new SendToButton + { + Self = SendToAssistant.REWRITE_ASSISTANT, + UseResultingContentBlockData = false, + GetData = () => string.IsNullOrWhiteSpace(this.rewrittenText) ? this.inputText : this.rewrittenText, + }, ]; #region Overrides of ComponentBase @@ -43,6 +49,10 @@ public partial class AssistantRewriteImprove : AssistantBaseCore this.selectedWritingStyle = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle; } + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_REWRITE_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputText = deferredContent; + await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Components/Pages/SendToAssistant.cs b/app/MindWork AI Studio/Components/Pages/SendToAssistant.cs new file mode 100644 index 00000000..4a12621b --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/SendToAssistant.cs @@ -0,0 +1,14 @@ +namespace AIStudio.Components.Pages; + +public enum SendToAssistant +{ + NONE = 0, + + GRAMMAR_SPELLING_ASSISTANT, + ICON_FINDER_ASSISTANT, + REWRITE_ASSISTANT, + TRANSLATION_ASSISTANT, + AGENDA_ASSISTANT, + CODING_ASSISTANT, + TEXT_SUMMARIZER_ASSISTANT, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/SendToAssistantExtensions.cs b/app/MindWork AI Studio/Components/Pages/SendToAssistantExtensions.cs new file mode 100644 index 00000000..cbb4748f --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/SendToAssistantExtensions.cs @@ -0,0 +1,20 @@ +namespace AIStudio.Components.Pages; + +public static class SendToAssistantExtensions +{ + public static string Name(this SendToAssistant assistant) + { + return assistant switch + { + SendToAssistant.GRAMMAR_SPELLING_ASSISTANT => "Grammar & Spelling Assistant", + SendToAssistant.TEXT_SUMMARIZER_ASSISTANT => "Text Summarizer Assistant", + SendToAssistant.ICON_FINDER_ASSISTANT => "Icon Finder Assistant", + SendToAssistant.TRANSLATION_ASSISTANT => "Translation Assistant", + SendToAssistant.REWRITE_ASSISTANT => "Rewrite Assistant", + SendToAssistant.AGENDA_ASSISTANT => "Agenda Assistant", + SendToAssistant.CODING_ASSISTANT => "Coding Assistant", + + _ => "Send to ...", + }; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs b/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs index f0badef0..696cffb0 100644 --- a/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs @@ -23,6 +23,14 @@ public partial class AssistantTextSummarizer : AssistantBaseCore a summary with the requested complexity. In any case, do not add any information. """; + protected override IReadOnlyList FooterButtons => + [ + new SendToButton + { + Self = SendToAssistant.TEXT_SUMMARIZER_ASSISTANT, + }, + ]; + private string inputText = string.Empty; private bool isAgentRunning; private CommonLanguages selectedTargetLanguage; @@ -43,6 +51,10 @@ public partial class AssistantTextSummarizer : AssistantBaseCore this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedProvider); } + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_TEXT_SUMMARIZER_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputText = deferredContent; + await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor.cs b/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor.cs index e4f49708..0b12e43b 100644 --- a/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor.cs @@ -19,6 +19,14 @@ public partial class AssistantTranslation : AssistantBaseCore language requires, e.g., shorter sentences, you should split the text into shorter sentences. """; + protected override IReadOnlyList FooterButtons => + [ + new SendToButton + { + Self = SendToAssistant.TRANSLATION_ASSISTANT, + }, + ]; + private bool liveTranslation; private bool isAgentRunning; private string inputText = string.Empty; @@ -38,6 +46,10 @@ public partial class AssistantTranslation : AssistantBaseCore this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Translation.PreselectedProvider); } + var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_TRANSLATION_ASSISTANT).FirstOrDefault(); + if (deferredContent is not null) + this.inputText = deferredContent; + await base.OnInitializedAsync(); } diff --git a/app/MindWork AI Studio/Tools/Event.cs b/app/MindWork AI Studio/Tools/Event.cs index 3d124d78..84e780f5 100644 --- a/app/MindWork AI Studio/Tools/Event.cs +++ b/app/MindWork AI Studio/Tools/Event.cs @@ -15,4 +15,13 @@ public enum Event // Chat events: HAS_CHAT_UNSAVED_CHANGES, RESET_CHAT_STATE, + + // Send assistant events: + SEND_TO_GRAMMAR_SPELLING_ASSISTANT, + SEND_TO_ICON_FINDER_ASSISTANT, + SEND_TO_REWRITE_ASSISTANT, + SEND_TO_TRANSLATION_ASSISTANT, + SEND_TO_AGENDA_ASSISTANT, + SEND_TO_CODING_ASSISTANT, + SEND_TO_TEXT_SUMMARIZER_ASSISTANT, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/SendToButton.cs b/app/MindWork AI Studio/Tools/SendToButton.cs new file mode 100644 index 00000000..4baad16b --- /dev/null +++ b/app/MindWork AI Studio/Tools/SendToButton.cs @@ -0,0 +1,15 @@ +using AIStudio.Components.Pages; + +namespace AIStudio.Tools; + +public readonly record struct SendToButton() : IButtonData +{ + public ButtonTypes Type => ButtonTypes.SEND_TO; + + public Func GetData { get; init; } = () => string.Empty; + + public bool UseResultingContentBlockData { get; init; } = true; + + public SendToAssistant Self { get; init; } = SendToAssistant.NONE; + +} \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.8.9.md b/app/MindWork AI Studio/wwwroot/changelog/v0.8.9.md new file mode 100644 index 00000000..2036a8d5 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.8.9.md @@ -0,0 +1,5 @@ +# v0.8.9, build 171 +- Added the possibility to send an assistant's result to another assistant +- Refactored page paths +- Refactored assistant footer buttons +- Refactored message bus to support deferred messages \ No newline at end of file