From 2afc8c63915a6fb4d7b2d08da8c124005c827817 Mon Sep 17 00:00:00 2001 From: krut_ni Date: Mon, 10 Nov 2025 17:01:49 +0100 Subject: [PATCH] added DynamicAssistantDropdown to accomodate lua structure; included overrides from base Assistant for chat functionality --- .../Assistants/Dynamic/AssistantDynamic.razor | 21 ++++-- .../Dynamic/AssistantDynamic.razor.cs | 70 ++++++++++++++++--- .../Components/DynamicAssistantDropdown.razor | 17 +++++ .../DynamicAssistantDropdown.razor.cs | 33 +++++++++ .../Assistants/PluginAssistants.cs | 9 +++ 5 files changed, 133 insertions(+), 17 deletions(-) create mode 100644 app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor create mode 100644 app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor index b1947cc3..1859192b 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor @@ -9,19 +9,26 @@ case AssistantUiCompontentType.TEXT_AREA: if (component is AssistantTextArea textArea) { - + } break; - + + case AssistantUiCompontentType.DROPDOWN: + if (component is AssistantDropdown assistantDropdown) + { + + } + break; + case AssistantUiCompontentType.PROVIDER_SELECTION: if (component is AssistantProviderSelection providerSelection) { } break; - - default: - break; } -} - +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs index 418ede95..cb6926ce 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs @@ -10,18 +10,26 @@ public partial class AssistantDynamic : AssistantBaseCore { [Parameter] public AssistantForm? RootComponent { get; set; } = null!; + + protected override string Title => this.title; + protected override string Description => this.description; + protected override string SystemPrompt => this.systemPrompt; + protected override bool AllowProfiles => this.allowProfiles; + protected override string SubmitText => this.submitText; + protected override Func SubmitAction => this.Submit; + public override Tools.Components Component { get; } private string? inputText; private string title = string.Empty; private string description = string.Empty; private string systemPrompt = string.Empty; private bool allowProfiles = true; - - protected override string Title => this.title; - protected override string Description => this.description; - protected override string SystemPrompt => this.systemPrompt; - protected override bool AllowProfiles => this.allowProfiles; - public override Tools.Components Component { get; } + private string submitText = string.Empty; + private string selectedTargetLanguage = string.Empty; + private string customTargetLanguage = string.Empty; + + private Dictionary inputFields = new(); + protected override void OnInitialized() { var guid = Guid.Parse("958312de-a9e7-4666-901f-4d5b61647efb"); @@ -32,21 +40,63 @@ public partial class AssistantDynamic : AssistantBaseCore this.title = assistantPlugin.AssistantTitle; this.description = assistantPlugin.AssistantDescription; this.systemPrompt = assistantPlugin.SystemPrompt; + this.submitText = assistantPlugin.SubmitText; this.allowProfiles = assistantPlugin.AllowProfiles; } + + foreach (var component in this.RootComponent!.Children) + { + switch (component.Type) + { + case AssistantUiCompontentType.TEXT_AREA: + if (component is AssistantTextArea textArea) + { + this.inputFields.Add(textArea.Name, string.Empty); + } + break; + } + } base.OnInitialized(); } protected override void ResetForm() { - throw new NotImplementedException(); + foreach (var entry in this.inputFields) + { + this.inputFields[entry.Key] = string.Empty; + } } protected override bool MightPreselectValues() { - throw new NotImplementedException(); + Console.WriteLine("throw new NotImplementedException();"); + return false; } - protected override string SubmitText { get; } - protected override Func SubmitAction { get; } + private string? ValidateCustomLanguage(string value) => string.Empty; + + private string CollectUserPrompt() + { + var prompt = string.Empty; + foreach (var entry in this.inputFields) + { + prompt += $"{entry.Value}{Environment.NewLine}"; + } + return prompt; + } + + private async Task Submit() + { + this.CreateChatThread(); + var time = this.AddUserRequest( + $""" + + The given text is: + + --- + {this.CollectUserPrompt()} + """); + + await this.AddAIResponseAsync(time); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor new file mode 100644 index 00000000..b826881a --- /dev/null +++ b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor @@ -0,0 +1,17 @@ + + + @foreach (var item in Items) + { + + @item.Display + + } + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs new file mode 100644 index 00000000..7d4a72ce --- /dev/null +++ b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AIStudio.Tools.PluginSystem.Assistants.DataModel; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace AIStudio.Components +{ + public partial class DynamicAssistantDropdown : ComponentBase + { + [Parameter] + public List Items { get; set; } = new(); + + [Parameter] + public AssistantDropdownItem Default { get; set; } = new(); + + [Parameter] + public string Value { get; set; } = string.Empty; + + [Parameter] + public EventCallback ValueChanged { get; set; } + + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public Func ValidateSelection { get; set; } = _ => null; + + [Parameter] + public string Icon { get; set; } = Icons.Material.Filled.ArrowDropDown; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistants.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistants.cs index d0993fe1..3797001c 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistants.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistants.cs @@ -14,6 +14,7 @@ public sealed class PluginAssistants(bool isInternal, LuaState state, PluginType public string AssistantTitle { get; set; } = string.Empty; public string AssistantDescription { get; set; } = string.Empty; public string SystemPrompt { get; set; } = string.Empty; + public string SubmitText { get; set; } = string.Empty; public bool AllowProfiles { get; set; } = true; public void TryLoad() @@ -64,6 +65,13 @@ public sealed class PluginAssistants(bool isInternal, LuaState state, PluginType return false; } + if (!assistantTable.TryGetValue("SubmitText", out var assistantSubmitTextValue) || + !assistantSubmitTextValue.TryRead(out var assistantSubmitText)) + { + message = TB("The ASSISTANT table does not contain a valid system prompt."); + return false; + } + if (!assistantTable.TryGetValue("AllowProfiles", out var assistantAllowProfilesValue) || !assistantAllowProfilesValue.TryRead(out var assistantAllowProfiles)) { @@ -74,6 +82,7 @@ public sealed class PluginAssistants(bool isInternal, LuaState state, PluginType this.AssistantTitle = assistantTitle; this.AssistantDescription = assistantDescription; this.SystemPrompt = assistantSystemPrompt; + this.SubmitText = assistantSubmitText; this.AllowProfiles = assistantAllowProfiles; // Ensure that the UI table exists nested in the ASSISTANT table and is a valid Lua table: