From 4f6bdec82b2a085806265e0d2be95c6847d9a6a3 Mon Sep 17 00:00:00 2001 From: krut_ni Date: Mon, 23 Feb 2026 16:33:24 +0100 Subject: [PATCH] added a file content reader as a component for the assistant builder --- .../Assistants/Dynamic/AssistantDynamic.razor | 6 +++++ .../Dynamic/AssistantDynamic.razor.cs | 27 +++++++++++++++++++ .../Assistants/Dynamic/FileContentState.cs | 6 +++++ .../Assistants/Dynamic/WebContentState.cs | 6 ++--- .../Plugins/assistants/plugin.lua | 7 +++++ .../Assistants/AssistantComponentFactory.cs | 2 ++ .../DataModel/AssistantFileContentReader.cs | 24 +++++++++++++++++ .../DataModel/AssistantUiCompontentType.cs | 1 + .../DataModel/ComponentPropSpecs.cs | 4 +++ 9 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 app/MindWork AI Studio/Assistants/Dynamic/FileContentState.cs create mode 100644 app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantFileContentReader.cs diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor index 2a9fdeb5..f7887f6a 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor @@ -25,6 +25,12 @@ @bind-PreselectContentCleanerAgent="@webState.PreselectContentCleanerAgent" /> } break; + case AssistantUiCompontentType.FILE_CONTENT_READER: + if (component is AssistantFileContentReader fileContent && this.fileContentFields.TryGetValue(fileContent.Name, out var fileState)) + { + + } + 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 8a8de8a6..72c4c3bb 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs +++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs @@ -35,6 +35,7 @@ public partial class AssistantDynamic : AssistantBaseCore private Dictionary dropdownFields = new(); private Dictionary switchFields = new(); private Dictionary webContentFields = new(); + private Dictionary fileContentFields = new(); protected override void OnInitialized() { @@ -83,6 +84,12 @@ public partial class AssistantDynamic : AssistantBaseCore }); } break; + case AssistantUiCompontentType.FILE_CONTENT_READER: + if (component is AssistantFileContentReader fileContent) + { + this.fileContentFields.Add(fileContent.Name, new FileContentState()); + } + break; } } base.OnInitialized(); @@ -99,6 +106,10 @@ public partial class AssistantDynamic : AssistantBaseCore entry.Value.Content = string.Empty; entry.Value.AgentIsRunning = false; } + foreach (var entry in this.fileContentFields) + { + entry.Value.Content = string.Empty; + } } protected override bool MightPreselectValues() @@ -164,6 +175,21 @@ public partial class AssistantDynamic : AssistantBaseCore } } break; + case AssistantUiCompontentType.FILE_CONTENT_READER: + if (component is AssistantFileContentReader fileContent && + this.fileContentFields.TryGetValue(fileContent.Name, out var fileState)) + { + if (!string.IsNullOrWhiteSpace(fileContent.UserPrompt)) + { + prompt += $"{Environment.NewLine}context:{Environment.NewLine}{fileContent.UserPrompt}{Environment.NewLine}---{Environment.NewLine}"; + } + + if (!string.IsNullOrWhiteSpace(fileState.Content)) + { + prompt += $"user prompt:{Environment.NewLine}{fileState.Content}"; + } + } + break; default: prompt += $"{userInput}{Environment.NewLine}"; break; @@ -192,4 +218,5 @@ public partial class AssistantDynamic : AssistantBaseCore var time = this.AddUserRequest(this.CollectUserPrompt()); await this.AddAIResponseAsync(time); } + } diff --git a/app/MindWork AI Studio/Assistants/Dynamic/FileContentState.cs b/app/MindWork AI Studio/Assistants/Dynamic/FileContentState.cs new file mode 100644 index 00000000..f7e0da60 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/Dynamic/FileContentState.cs @@ -0,0 +1,6 @@ +namespace AIStudio.Assistants.Dynamic; + +internal sealed class FileContentState +{ + public string Content { get; set; } = string.Empty; +} diff --git a/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs b/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs index 70a6977a..d9398f05 100644 --- a/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs +++ b/app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs @@ -1,9 +1,9 @@ -namespace AIStudio.Assistants.Dynamic; +namespace AIStudio.Assistants.Dynamic; -public sealed class WebContentState +internal 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 df679ca1..7a60cfbe 100644 --- a/app/MindWork AI Studio/Plugins/assistants/plugin.lua +++ b/app/MindWork AI Studio/Plugins/assistants/plugin.lua @@ -151,6 +151,13 @@ ASSISTANT = { ["PreselectContentCleanerAgent"] = true -- run the content cleaner by default } }, + { + ["Type"] = "FILE_CONTENT_READER", -- allows the user to load local files + ["Props"] = { + ["Name"] = "", -- required + ["UserPrompt"] = "" + } + }, } }, } diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs index bb1b581a..dae13bf7 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantComponentFactory.cs @@ -35,6 +35,8 @@ public class AssistantComponentFactory return new AssistantList { Props = props, Children = children }; case AssistantUiCompontentType.WEB_CONTENT_READER: return new AssistantWebContentReader { Props = props, Children = children }; + case AssistantUiCompontentType.FILE_CONTENT_READER: + return new AssistantFileContentReader { 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/AssistantFileContentReader.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantFileContentReader.cs new file mode 100644 index 00000000..f521bb70 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantFileContentReader.cs @@ -0,0 +1,24 @@ +namespace AIStudio.Tools.PluginSystem.Assistants.DataModel; + +public class AssistantFileContentReader : AssistantComponentBase +{ + public override AssistantUiCompontentType Type => AssistantUiCompontentType.FILE_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; + } +} 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 1a0568b4..99d264c2 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantUiCompontentType.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantUiCompontentType.cs @@ -13,4 +13,5 @@ public enum AssistantUiCompontentType TEXT, LIST, WEB_CONTENT_READER, + FILE_CONTENT_READER, } 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 dd3aaa61..41001325 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/ComponentPropSpecs.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/ComponentPropSpecs.cs @@ -49,5 +49,9 @@ public static class ComponentPropSpecs required: ["Name"], optional: ["UserPrompt", "Preselect", "PreselectContentCleanerAgent"] ), + [AssistantUiCompontentType.FILE_CONTENT_READER] = new( + required: ["Name"], + optional: ["UserPrompt"] + ), }; }