WIP: Working out a data model and an example lua file to turn it into assistants

This commit is contained in:
nilsk 2025-07-21 14:38:08 +02:00
parent 6116c03f7c
commit b9a9f2d823
12 changed files with 245 additions and 0 deletions

View File

@ -0,0 +1,85 @@
require("icon")
-- The ID for this plugin:
ID = "43065dbc-78d0-45b7-92be-f14c2926e2dc"
-- The icon for the plugin:
ICON_SVG = SVG
-- The name of the plugin:
NAME = "MindWork AI Studio - German / Deutsch"
-- The description of the plugin:
DESCRIPTION = "Dieses Plugin bietet deutsche Sprachunterstützung für MindWork AI Studio."
-- The version of the plugin:
VERSION = "1.0.0"
-- The type of the plugin:
TYPE = "LANGUAGE"
-- The authors of the plugin:
AUTHORS = {"MindWork AI Community"}
-- The support contact for the plugin:
SUPPORT_CONTACT = "MindWork AI Community"
-- The source URL for the plugin:
SOURCE_URL = "https://github.com/MindWorkAI/AI-Studio"
-- The categories for the plugin:
CATEGORIES = { "ASSISTANT" }
-- The target groups for the plugin:
TARGET_GROUPS = { "EVERYONE" }
-- The flag for whether the plugin is maintained:
IS_MAINTAINED = true
-- When the plugin is deprecated, this message will be shown to users:
DEPRECATION_MESSAGE = ""
ASSISTANT = {
Name = "Grammatik- und Rechtschreibprüfung",
Description = "Grammatik und Rechtschreibung eines Textes überprüfen.",
UI = {
Type = "Form",
Children = {
{
Type = "TextArea",
Props = {
Name = "input",
Label = "Ihre Eingabe zur Überprüfung"
}
},
{
Type = "Dropdown",
Props = {
Name = "language",
Label = "Sprache",
Default = "Sprache nicht angeben",
Items = {
{ Value = "de-DE", Display = "Deutsch" },
{ Value = "en-UK", Display = "Englisch (UK)" },
{ Value = "en-US", Display = "Englisch (US)" },
}
}
},
{
Type = "ProviderSelection",
Props = {
Name = "Anbieter",
Label = "LLM auswählen"
}
},
{
Type = "Button",
Props = {
Name = "submit",
Text = "Korrekturlesen",
Action = "OnSubmit"
}
},
}
},
}

View File

@ -0,0 +1,24 @@
namespace AIStudio.Tools.PluginSystem;
public class AssistantButton : AssistantComponentBase
{
public override AssistantUiCompontentType Type => AssistantUiCompontentType.BUTTON;
public Dictionary<string, object> Props { get; set; } = new();
public List<IAssistantComponent> 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 Text
{
get => this.Props.TryGetValue(nameof(this.Text), out var v) ? v.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Text)] = value;
}
public string Action
{
get => this.Props.TryGetValue(nameof(this.Action), out var v) ? v.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Action)] = value;
}
}

View File

@ -0,0 +1,8 @@
namespace AIStudio.Tools.PluginSystem;
public abstract class AssistantComponentBase : IAssistantComponent
{
public abstract AssistantUiCompontentType Type { get; }
public Dictionary<string, object> Props { get; }
public List<IAssistantComponent> Children { get; }
}

View File

@ -0,0 +1,29 @@
namespace AIStudio.Tools.PluginSystem;
public class AssistantDropdown : AssistantComponentBase
{
public override AssistantUiCompontentType Type => AssistantUiCompontentType.DROPDOWN;
public Dictionary<string, object> Props { get; set; } = new();
public List<IAssistantComponent> 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 Label
{
get => this.Props.TryGetValue(nameof(this.Label), out var v) ? v.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Label)] = value;
}
public string Default
{
get => this.Props.TryGetValue(nameof(this.Default), out var v) ? v.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Default)] = value;
}
public List<AssistantDropdownItem> Items
{
get => this.Props.TryGetValue(nameof(this.Items), out var v) && v is List<AssistantDropdownItem> list ? list : [];
set => this.Props[nameof(this.Items)] = value;
}
}

View File

@ -0,0 +1,7 @@
namespace AIStudio.Tools.PluginSystem;
public class AssistantDropdownItem
{
public string Value { get; set; } = string.Empty;
public string Display { get; set; } = string.Empty;
}

View File

@ -0,0 +1,8 @@
namespace AIStudio.Tools.PluginSystem;
public class AssistantForm : AssistantComponentBase
{
public override AssistantUiCompontentType Type => AssistantUiCompontentType.FORM;
public Dictionary<string, object> Props { get; set; } = new();
public List<IAssistantComponent> Children { get; set; } = new();
}

View File

@ -0,0 +1,19 @@
namespace AIStudio.Tools.PluginSystem;
public class AssistantProviderSelection : AssistantComponentBase
{
public override AssistantUiCompontentType Type => AssistantUiCompontentType.PROVIDER_SELECTION;
public Dictionary<string, object> Props { get; set; } = new();
public List<IAssistantComponent> 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 Label
{
get => this.Props.TryGetValue(nameof(this.Label), out var v) ? v.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Label)] = value;
}
}

View File

@ -0,0 +1,26 @@
namespace AIStudio.Tools.PluginSystem;
public class AssistantTextArea : AssistantComponentBase
{
public override AssistantUiCompontentType Type => AssistantUiCompontentType.TEXT_AREA;
public Dictionary<string, object> Props { get; set; } = new();
public List<IAssistantComponent> Children { get; set; } = new();
public string Name
{
get => this.Props.TryGetValue(nameof(this.Name), out var val) ? val.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Name)] = value;
}
public string Label
{
get => this.Props.TryGetValue(nameof(this.Label), out var val) ? val.ToString() ?? string.Empty : string.Empty;
set => this.Props[nameof(this.Label)] = value;
}
public bool ReadOnly
{
get => this.Props.TryGetValue(nameof(this.ReadOnly), out var val) && val is true;
set => this.Props[nameof(this.ReadOnly)] = value;
}
}

View File

@ -0,0 +1,11 @@
namespace AIStudio.Tools.PluginSystem;
public enum AssistantUiCompontentType
{
FORM,
TEXT_AREA,
BUTTON,
CHECKBOX,
DROPDOWN,
PROVIDER_SELECTION,
}

View File

@ -0,0 +1,8 @@
namespace AIStudio.Tools.PluginSystem;
public interface IAssistantComponent
{
AssistantUiCompontentType Type { get; }
Dictionary<string, object> Props { get; }
List<IAssistantComponent> Children { get; }
}

View File

@ -0,0 +1,19 @@
using Lua;
namespace AIStudio.Tools.PluginSystem;
public sealed class PluginAssistants : PluginBase
{
private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PluginAssistants).Namespace, nameof(PluginAssistants));
private static readonly ILogger<PluginAssistants> LOGGER = Program.LOGGER_FACTORY.CreateLogger<PluginAssistants>();
public string AssistantTitle { get; set;} = string.Empty;
private string AssistantDescription {get; set;} = string.Empty;
public PluginAssistants(bool isInternal, LuaState state, PluginType type) : base(isInternal, state, type)
{
}
}

View File

@ -30,4 +30,5 @@ public enum PluginCategory
FICTION, FICTION,
WRITING, WRITING,
CONTENT_CREATION, CONTENT_CREATION,
ASSISTANT,
} }