diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor index b2eaa88c..2a9fdeb5 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor @@ -15,6 +15,16 @@ } break; + case AssistantUiCompontentType.WEB_CONTENT_READER: + if (component is AssistantWebContentReader webContent && this.webContentFields.TryGetValue(webContent.Name, out var webState)) + { + + } + break; case AssistantUiCompontentType.DROPDOWN: if (component is AssistantDropdown assistantDropdown) diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs index d4ceea00..8a8de8a6 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs @@ -34,6 +34,7 @@ public partial class AssistantDynamic : AssistantBaseCore private Dictionary inputFields = new(); private Dictionary dropdownFields = new(); private Dictionary switchFields = new(); + private Dictionary webContentFields = new(); protected override void OnInitialized() { @@ -72,6 +73,16 @@ public partial class AssistantDynamic : AssistantBaseCore this.switchFields.Add(switchComponent.Name, switchComponent.Value); } break; + case AssistantUiCompontentType.WEB_CONTENT_READER: + if (component is AssistantWebContentReader webContent) + { + this.webContentFields.Add(webContent.Name, new WebContentState + { + Preselect = webContent.Preselect, + PreselectContentCleanerAgent = webContent.PreselectContentCleanerAgent, + }); + } + break; } } base.OnInitialized(); @@ -83,6 +94,11 @@ public partial class AssistantDynamic : AssistantBaseCore { this.inputFields[entry.Key] = string.Empty; } + foreach (var entry in this.webContentFields) + { + entry.Value.Content = string.Empty; + entry.Value.AgentIsRunning = false; + } } protected override bool MightPreselectValues() @@ -133,6 +149,21 @@ public partial class AssistantDynamic : AssistantBaseCore } } break; + case AssistantUiCompontentType.WEB_CONTENT_READER: + if (component is AssistantWebContentReader webContent && + this.webContentFields.TryGetValue(webContent.Name, out var webState)) + { + if (!string.IsNullOrWhiteSpace(webContent.UserPrompt)) + { + prompt += $"{Environment.NewLine}context:{Environment.NewLine}{webContent.UserPrompt}{Environment.NewLine}---{Environment.NewLine}"; + } + + if (!string.IsNullOrWhiteSpace(webState.Content)) + { + prompt += $"user prompt:{Environment.NewLine}{webState.Content}"; + } + } + break; default: prompt += $"{userInput}{Environment.NewLine}"; break; diff --git a/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs b/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs new file mode 100644 index 00000000..70a6977a --- /dev/null +++ b/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs @@ -0,0 +1,9 @@ +namespace AIStudio.Assistants.Dynamic; + +public sealed class WebContentState +{ + public string Content { get; set; } = string.Empty; + public bool Preselect { get; set; } + public bool PreselectContentCleanerAgent { get; set; } + public bool AgentIsRunning { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/assistants/plugin.lua b/app/MindWork AI Studio/Plugins/assistants/plugin.lua index 6aa14462..df679ca1 100644 --- a/app/MindWork AI Studio/Plugins/assistants/plugin.lua +++ b/app/MindWork AI Studio/Plugins/assistants/plugin.lua @@ -142,6 +142,15 @@ ASSISTANT = { } } }, + { + ["Type"] = "WEB_CONTENT_READER", -- allows the user to fetch a URL and clean it + ["Props"] = { + ["Name"] = "", -- required + ["UserPrompt"] = "", + ["Preselect"] = false, -- automatically show the reader when the assistant opens + ["PreselectContentCleanerAgent"] = true -- run the content cleaner by default + } + }, } }, } diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs index ffe39504..bb1b581a 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs @@ -33,6 +33,8 @@ public class AssistantComponentFactory return new AssistantText { Props = props, Children = children }; case AssistantUiCompontentType.LIST: return new AssistantList { Props = props, Children = children }; + case AssistantUiCompontentType.WEB_CONTENT_READER: + return new AssistantWebContentReader { Props = props, Children = children }; default: LOGGER.LogError($"Unknown assistant component type!\n{type} is not a supported assistant component type"); throw new Exception($"Unknown assistant component type: {type}"); diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantUiCompontentType.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantUiCompontentType.cs index 08b89359..1a0568b4 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantUiCompontentType.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantUiCompontentType.cs @@ -12,4 +12,5 @@ public enum AssistantUiCompontentType HEADING, TEXT, LIST, + WEB_CONTENT_READER, } diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantWebContentReader.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantWebContentReader.cs new file mode 100644 index 00000000..f3ba7223 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantWebContentReader.cs @@ -0,0 +1,36 @@ +namespace AIStudio.Tools.PluginSystem.Assistants.DataModel; + +public class AssistantWebContentReader : AssistantComponentBase +{ + public override AssistantUiCompontentType Type => AssistantUiCompontentType.WEB_CONTENT_READER; + public Dictionary Props { get; set; } = new(); + public List Children { get; set; } = new(); + + public string Name + { + get => this.Props.TryGetValue(nameof(this.Name), out var v) + ? v.ToString() ?? string.Empty + : string.Empty; + set => this.Props[nameof(this.Name)] = value; + } + + public string UserPrompt + { + get => this.Props.TryGetValue(nameof(this.UserPrompt), out var v) + ? v.ToString() ?? string.Empty + : string.Empty; + set => this.Props[nameof(this.UserPrompt)] = value; + } + + public bool Preselect + { + get => this.Props.TryGetValue(nameof(this.Preselect), out var v) && v is true; + set => this.Props[nameof(this.Preselect)] = value; + } + + public bool PreselectContentCleanerAgent + { + get => this.Props.TryGetValue(nameof(this.PreselectContentCleanerAgent), out var v) && v is true; + set => this.Props[nameof(this.PreselectContentCleanerAgent)] = value; + } +} diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/ComponentPropSpecs.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/ComponentPropSpecs.cs index 71b16ed6..dd3aaa61 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/ComponentPropSpecs.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/ComponentPropSpecs.cs @@ -45,5 +45,9 @@ public static class ComponentPropSpecs required: ["Items"], optional: [] ), + [AssistantUiCompontentType.WEB_CONTENT_READER] = new( + required: ["Name"], + optional: ["UserPrompt", "Preselect", "PreselectContentCleanerAgent"] + ), }; }