diff --git a/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs b/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs index 7df6041e..ccacac63 100644 --- a/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs @@ -1,9 +1,12 @@ -using AIStudio.Dialogs.Settings; +using System.Text; +using AIStudio.Dialogs.Settings; namespace AIStudio.Assistants.Meta; public partial class AssistantMetaAssistant : AssistantBaseCore { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(nameof(AssistantMetaAssistant)); + protected override Tools.Components Component => Tools.Components.META_ASSISTANT; protected override string Title => T("Assistant Builder"); protected override string Description => string.Empty; @@ -18,6 +21,8 @@ public partial class AssistantMetaAssistant : AssistantBaseCore protected override bool HasSettingsPanel { get; } private bool isAgentRunning; + private AssistantCategory selectedCategory; + private string customCategory = string.Empty; private static readonly AssistantContextFile[] ASSISTANT_CONTEXT_FILES = [ new("Assistant plugin schema", "Plugins/assistants/README.md", IsRequired: true), @@ -28,39 +33,66 @@ public partial class AssistantMetaAssistant : AssistantBaseCore string Title, string RelativePath, bool IsRequired); - + #region Overrides of ComponentBase - + protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); } - + #endregion - + protected override void ResetForm() { - return; + this.selectedCategory = AssistantCategory.AS_IS; + this.customCategory = string.Empty; } protected override bool MightPreselectValues() { return false; } - + private string AssembleSystemPrompt() => string.Empty; + private string? ValidatingCategory(AssistantCategory category) + { + if(category is AssistantCategory.AS_IS) + return T("Please select an assistant category."); + + return null; + } + + private string? ValidateCustomCategory(string category) + { + if(this.selectedCategory is AssistantCategory.OTHER && string.IsNullOrWhiteSpace(category)) + return T("Please provide a custom category."); + + return null; + } + private async Task GenerateLuaAssistant() { + await this.Form!.Validate(); + if (!this.InputIsValid) + return; + this.CreateChatThread(); var time = this.AddUserRequest( $""" + Assistant category: {this.GetSelectedCategoryName()} + Remind me to replace this placeholder with the real lua plugin context """); - + await this.AddAIResponseAsync(time); } + private string GetSelectedCategoryName() => this.selectedCategory is AssistantCategory.OTHER + ? this.customCategory + : this.selectedCategory.Name(); + private static async Task ReadAppResourceTextAsync(string relativePath) { relativePath = relativePath.Replace('\\', '/'); @@ -80,4 +112,34 @@ public partial class AssistantMetaAssistant : AssistantBaseCore return await reader.ReadToEndAsync(); #endif } + + private async Task LoadAssistantBuilderContextAsync() + { + var builder = new StringBuilder(); + + foreach (var contextFile in ASSISTANT_CONTEXT_FILES) + { + var content = await ReadAppResourceTextAsync(contextFile.RelativePath); + if (string.IsNullOrWhiteSpace(content)) + { + LOGGER.LogError($"The context for \"{contextFile.Title}\" could not be read from the assembly. Path: {contextFile.RelativePath}"); + if (contextFile.IsRequired) + { + await MessageBus.INSTANCE.SendError(new (Icons.Material.Filled.SettingsSuggest, string.Format(T("The Assistant-Builder was not able to read the plugin manifest and therefore cannot safely generate your assistant right now.")))); + this.isAgentRunning = true; + return string.Empty; + } + continue; + } + + builder.AppendLine($"# {contextFile.Title}"); + builder.AppendLine($"Source: {contextFile.RelativePath}"); + builder.AppendLine(""); + builder.AppendLine(content.Trim()); + builder.AppendLine(""); + builder.AppendLine(); + } + + return builder.ToString().Trim(); + } }