diff --git a/src/Infrastructure/BotSharp.Abstraction/Plugins/IBotSharpPlugin.cs b/src/Infrastructure/BotSharp.Abstraction/Plugins/IBotSharpPlugin.cs index 7717e9e6..f7f87060 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Plugins/IBotSharpPlugin.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Plugins/IBotSharpPlugin.cs @@ -6,6 +6,10 @@ namespace BotSharp.Abstraction.Plugins; public interface IBotSharpPlugin { + /// + /// Plugin id (guid) + /// + string Id { get; } string Name => ""; string Description => ""; string IconUrl => "https://avatars.githubusercontent.com/u/44989469?s=200&v=4"; diff --git a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginConfig.cs b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginConfig.cs new file mode 100644 index 00000000..aa77bf77 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginConfig.cs @@ -0,0 +1,7 @@ +namespace BotSharp.Abstraction.Plugins.Models; + +public class PluginConfig +{ + public List EnabledPlugins { get; set; } + = new List(); +} diff --git a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs index 0781d850..7f009ce0 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs @@ -12,5 +12,7 @@ public class PluginDef [JsonPropertyName("with_agent")] public bool WithAgent { get; set; } + public bool Enabled { get; set; } + public PluginMenuDef[] Menus { get; set; } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index b8ca82a7..acdb4d73 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Plugins.Models; using BotSharp.Abstraction.Repositories.Filters; using BotSharp.Abstraction.Repositories.Models; using BotSharp.Abstraction.Users.Models; @@ -9,6 +10,11 @@ public interface IBotSharpRepository int Transaction(Action action); void Add(object entity); + #region Plugin + PluginConfig GetPluginConfig(); + void SavePluginConfig(PluginConfig config); + #endregion + #region User User? GetUserByEmail(string email); User? GetUserById(string id); diff --git a/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj b/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj index 4c32c9ea..2838133b 100644 --- a/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj +++ b/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 @@ -51,6 +51,7 @@ + @@ -72,6 +73,9 @@ PreserveNewest + + PreserveNewest + diff --git a/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs b/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs index 4b0ed022..47b03c59 100644 --- a/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs +++ b/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.IO; using System.Reflection; using System.Xml; +using BotSharp.Abstraction.Repositories; namespace BotSharp.Core.Plugins; @@ -50,7 +51,7 @@ public class PluginLoader _modules.Add(module); _plugins.Add(new PluginDef { - Id = module.GetType().FullName, + Id = module.Id, Name = name, Description = module.Description, Assembly = assemblyName, @@ -76,11 +77,45 @@ public class PluginLoader }); } - public List GetPlugins() + public List GetPlugins(IServiceProvider services) { + // Apply user configurations + var db = services.GetRequiredService(); + var config = db.GetPluginConfig(); + foreach (var plugin in _plugins) + { + plugin.Enabled = config.EnabledPlugins.Contains(plugin.Id); + } return _plugins; } + public PluginDef UpdatePluginStatus(IServiceProvider services, string id, bool enable) + { + var plugin = _plugins.First(x => x.Id == id); + plugin.Enabled = enable; + + // save to config + var db = services.GetRequiredService(); + var config = db.GetPluginConfig(); + if (enable) + { + if (!config.EnabledPlugins.Exists(x => x == id)) + { + config.EnabledPlugins.Add(id); + db.SavePluginConfig(config); + } + } + else + { + if (config.EnabledPlugins.Exists(x => x == id)) + { + config.EnabledPlugins.Remove(id); + db.SavePluginConfig(config); + } + } + return plugin; + } + public string GetSummaryComment(Type member) { string summary = string.Empty; diff --git a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs index c3e5ad5e..9a395edf 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Agents.Models; +using BotSharp.Abstraction.Plugins.Models; using BotSharp.Abstraction.Repositories; using BotSharp.Abstraction.Repositories.Filters; using BotSharp.Abstraction.Repositories.Models; @@ -17,7 +18,6 @@ public class BotSharpDbContext : Database, IBotSharpRepository public IQueryable Conversations => throw new NotImplementedException(); - public int Transaction(Action action) { DatabaseFacade database = base.GetMaster(typeof(TTableInterface)).Database; @@ -67,6 +67,10 @@ public class BotSharpDbContext : Database, IBotSharpRepository } } + #region Plugin + public PluginConfig GetPluginConfig() => throw new NotImplementedException(); + public void SavePluginConfig(PluginConfig config) => throw new NotImplementedException(); + #endregion #region Agent public Agent GetAgent(string agentId) diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.Plugin.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.Plugin.cs new file mode 100644 index 00000000..75ba0e0b --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.Plugin.cs @@ -0,0 +1,38 @@ +using BotSharp.Abstraction.Plugins.Models; +using System.IO; + +namespace BotSharp.Core.Repository; + +public partial class FileRepository +{ + public PluginConfig GetPluginConfig() + { + if (_pluginConfig != null) + { + return _pluginConfig; + } + + var dir = Path.Combine(_dbSettings.FileRepository, "plugins"); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + var configFile = Path.Combine(dir, "config.json"); + if (!File.Exists(configFile)) + { + _pluginConfig = new PluginConfig(); + return _pluginConfig; + } + + var json = File.ReadAllText(configFile); + _pluginConfig = JsonSerializer.Deserialize(json, _options); + + return _pluginConfig; + } + + public void SavePluginConfig(PluginConfig config) + { + var configFile = Path.Combine(_dbSettings.FileRepository, "plugins", "config.json"); + File.WriteAllText(configFile, JsonSerializer.Serialize(config, _options)); + } +} diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.Transaction.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.Transaction.cs new file mode 100644 index 00000000..d19db2b7 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.Transaction.cs @@ -0,0 +1,82 @@ +using BotSharp.Abstraction.Agents.Models; +using BotSharp.Abstraction.Users.Models; +using System.IO; + +namespace BotSharp.Core.Repository; + +public partial class FileRepository +{ + public void Add(object entity) + { + if (entity is Agent agent) + { + _agents.Add(agent); + _changedTableNames.Add(nameof(Agent)); + } + else if (entity is User user) + { + _users.Add(user); + _changedTableNames.Add(nameof(User)); + } + else if (entity is UserAgent userAgent) + { + _userAgents.Add(userAgent); + _changedTableNames.Add(nameof(UserAgent)); + } + } + + private readonly List _changedTableNames = new List(); + public int Transaction(Action action) + { + _changedTableNames.Clear(); + action(); + + // Persist to disk + foreach (var table in _changedTableNames) + { + if (table == nameof(Agent)) + { + foreach (var agent in _agents) + { + var dir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agent.Id); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + var path = Path.Combine(dir, AGENT_FILE); + File.WriteAllText(path, JsonSerializer.Serialize(agent, _options)); + } + } + else if (table == nameof(User)) + { + foreach (var user in _users) + { + var dir = Path.Combine(_dbSettings.FileRepository, "users", user.Id); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + var path = Path.Combine(dir, USER_FILE); + File.WriteAllText(path, JsonSerializer.Serialize(user, _options)); + } + } + else if (table == nameof(UserAgent)) + { + _userAgents.GroupBy(x => x.UserId) + .Select(x => x.Key).ToList() + .ForEach(uid => + { + var agents = _userAgents.Where(x => x.UserId == uid).ToList(); + if (agents.Any()) + { + var dir = Path.Combine(_dbSettings.FileRepository, "users", uid); + var path = Path.Combine(dir, USER_AGENT_FILE); + File.WriteAllText(path, JsonSerializer.Serialize(agents, _options)); + } + }); + } + } + + return _changedTableNames.Count; + } +} diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs index f862e6a2..bba73858 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs @@ -10,10 +10,11 @@ using BotSharp.Abstraction.Repositories.Models; using BotSharp.Abstraction.Routing.Settings; using BotSharp.Abstraction.Evaluations.Settings; using System.Text.Encodings.Web; +using BotSharp.Abstraction.Plugins.Models; namespace BotSharp.Core.Repository; -public class FileRepository : IBotSharpRepository +public partial class FileRepository : IBotSharpRepository { private readonly IServiceProvider _services; private readonly BotSharpDatabaseSettings _dbSettings; @@ -31,6 +32,7 @@ public class FileRepository : IBotSharpRepository private const string DIALOG_FILE = "dialogs.txt"; private const string STATE_FILE = "state.json"; private const string EXECUTION_LOG_FILE = "execution.log"; + private const string PLUGIN_CONFIG_FILE = "config.json"; public FileRepository( IServiceProvider services, @@ -59,6 +61,7 @@ public class FileRepository : IBotSharpRepository private List _agents = new List(); private List _userAgents = new List(); private List _conversations = new List(); + private PluginConfig? _pluginConfig = null; private IQueryable Users { @@ -150,81 +153,6 @@ public class FileRepository : IBotSharpRepository } } - public void Add(object entity) - { - if (entity is Agent agent) - { - _agents.Add(agent); - _changedTableNames.Add(nameof(Agent)); - } - else if (entity is User user) - { - _users.Add(user); - _changedTableNames.Add(nameof(User)); - } - else if (entity is UserAgent userAgent) - { - _userAgents.Add(userAgent); - _changedTableNames.Add(nameof(UserAgent)); - } - } - - List _changedTableNames = new List(); - public int Transaction(Action action) - { - _changedTableNames.Clear(); - action(); - - // Persist to disk - foreach (var table in _changedTableNames) - { - if (table == nameof(Agent)) - { - foreach (var agent in _agents) - { - var dir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agent.Id); - if (!Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - var path = Path.Combine(dir, AGENT_FILE); - File.WriteAllText(path, JsonSerializer.Serialize(agent, _options)); - } - } - else if (table == nameof(User)) - { - foreach (var user in _users) - { - var dir = Path.Combine(_dbSettings.FileRepository, "users", user.Id); - if (!Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - var path = Path.Combine(dir, USER_FILE); - File.WriteAllText(path, JsonSerializer.Serialize(user, _options)); - } - } - else if (table == nameof(UserAgent)) - { - _userAgents.GroupBy(x => x.UserId) - .Select(x => x.Key).ToList() - .ForEach(uid => - { - var agents = _userAgents.Where(x => x.UserId == uid).ToList(); - if (agents.Any()) - { - var dir = Path.Combine(_dbSettings.FileRepository, "users", uid); - var path = Path.Combine(dir, USER_AGENT_FILE); - File.WriteAllText(path, JsonSerializer.Serialize(agents, _options)); - } - }); - } - } - - return _changedTableNames.Count; - } - - #region Agent public void UpdateAgent(Agent agent, AgentField field) { diff --git a/src/Infrastructure/BotSharp.Core/data/plugins/config.json b/src/Infrastructure/BotSharp.Core/data/plugins/config.json new file mode 100644 index 00000000..a68ea077 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/data/plugins/config.json @@ -0,0 +1,9 @@ +{ + "Comment": "User can change this configuration dynamically and reflect updates to UI.", + "EnabledPlugins": [ + "058094a7-4ad3-4284-b94d-ac1373cf63d8", + "65185362-392c-44fd-a023-95a198824436", + "5b18ca9b-82ed-494b-b121-e3499661edb0", + "6e52d42d-1e23-406b-8599-36af36c83209" + ] +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/PluginController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/PluginController.cs index 734421f7..f695d882 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/PluginController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/PluginController.cs @@ -20,7 +20,7 @@ public class PluginController : ControllerBase public List GetPlugins() { var loader = _services.GetRequiredService(); - return loader.GetPlugins(); + return loader.GetPlugins(_services); } [HttpGet("/plugin/menu")] @@ -40,11 +40,29 @@ public class PluginController : ControllerBase new PluginMenuDef("Settings", link: "/page/setting", icon: "bx bx-cog", weight: 32), }; var loader = _services.GetRequiredService(); - foreach (var plugin in loader.GetPlugins()) + foreach (var plugin in loader.GetPlugins(_services)) { + if (!plugin.Enabled) + { + continue; + } menus.AddRange(plugin.Menus); } menus = menus.OrderBy(x => x.Weight).ToList(); return menus; } + + [HttpPost("/plugin/{id}/enable")] + public PluginDef EnablePlugin([FromRoute] string id) + { + var loader = _services.GetRequiredService(); + return loader.UpdatePluginStatus(_services, id, true); + } + + [HttpPost("/plugin/{id}/disable")] + public PluginDef DisablePluginStats([FromRoute] string id) + { + var loader = _services.GetRequiredService(); + return loader.UpdatePluginStatus(_services, id, false); + } } diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiPlugin.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiPlugin.cs index d4f40b62..ee16b6e4 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiPlugin.cs @@ -1,6 +1,5 @@ using BotSharp.Abstraction.MLTasks; using BotSharp.Abstraction.Plugins; -using BotSharp.Abstraction.Utilities; using BotSharp.Plugin.AzureOpenAI.Providers; using BotSharp.Plugin.AzureOpenAI.Settings; using Microsoft.Extensions.Configuration; @@ -14,6 +13,7 @@ namespace BotSharp.Platform.AzureAi; /// public class AzureOpenAiPlugin : IBotSharpPlugin { + public string Id => "65185362-392c-44fd-a023-95a198824436"; public string Name => "Azure OpenAI"; public string Description => "Azure OpenAI Service (ChatGPT 3.5 Turbo / 4.0)"; public string IconUrl => "https://nanfor.com/cdn/shop/files/cursos-propios-Azure-openAI.jpg?v=1692877741"; diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs b/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs index 23e7e6d0..710d1a41 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs @@ -9,6 +9,7 @@ namespace BotSharp.Plugin.ChatHub; /// public class ChatHubPlugin : IBotSharpPlugin { + public string Id => "6e52d42d-1e23-406b-8599-36af36c83209"; public string Name => "Chat Hub"; public string Description => "A communication channel connects agents and users in real-time."; public string IconUrl => "https://media.zeemly.com/media/product/chatrandom.png"; diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/GoogleAiPlugin.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/GoogleAiPlugin.cs index fd6b06c8..b0c827d7 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/GoogleAiPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/GoogleAiPlugin.cs @@ -6,6 +6,7 @@ namespace BotSharp.Plugin.GoogleAI; public class GoogleAiPlugin : IBotSharpPlugin { + public string Id => "962ff441-2b40-4db4-b530-49efb1688a75"; public string Name => "Google AI"; public string Description => "Making AI helpful for everyone (PaLM 2, Gemini)"; public string IconUrl => "https://vectorseek.com/wp-content/uploads/2021/12/Google-AI-Logo-Vector.png"; diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs index 3482d041..9efcec99 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs @@ -4,6 +4,7 @@ namespace BotSharp.Plugin.HttpHandler; public class HttpHandlerPlugin : IBotSharpPlugin { + public string Id => "2c1eb1c4-16e5-4c65-8ee4-032324c26b81"; public string Name => "HTTP Handler"; public string Description => "Empower agent to handle HTTP request in RESTful API or GraphQL"; public string IconUrl => "https://lirp.cdn-website.com/6f8d6d8a/dms3rep/multi/opt/API_Icon-640w.png"; diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs index 78adad84..d82ac83f 100644 --- a/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs @@ -8,6 +8,7 @@ namespace BotSharp.Plugin.HuggingFace; public class HuggingFacePlugin : IBotSharpPlugin { + public string Id => "4495c3d6-49bd-464e-92fb-c99049854cb7"; public string Name => "Hugging Face"; public string Description => "The Home of Machine Learning - Create, discover and collaborate on ML better."; public string IconUrl => "https://upload.wikimedia.org/wikipedia/he/e/ee/Hugging_Face_logo.png"; diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs index a9316c54..eb41f859 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs @@ -5,6 +5,7 @@ namespace BotSharp.Plugin.KnowledgeBase; public class KnowledgeBasePlugin : IBotSharpPlugin { + public string Id => "f1625e9f-8de5-467b-b230-556364d8b117"; public string Name => "Knowledge Base"; public string Description => "Embedding private data and feed them into LLM in the conversation."; public string IconUrl => "https://cdn-icons-png.flaticon.com/512/9592/9592995.png"; diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/MemVecDb/MemVecDbPlugin.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/MemVecDb/MemVecDbPlugin.cs index e88aefa1..4710faea 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/MemVecDb/MemVecDbPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/MemVecDb/MemVecDbPlugin.cs @@ -4,6 +4,7 @@ namespace BotSharp.Plugin.KnowledgeBase.MemVecDb; public class MemVecDbPlugin : IBotSharpPlugin { + public string Id => "5ae38f52-4fa4-4f7c-8582-0a00d1f9a412"; public string Name => "Memory Vector DB"; public string Description => "Store text embedding, search similar text from memory."; public void RegisterDI(IServiceCollection services, IConfiguration config) diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/LLamaSharpPlugin.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/LLamaSharpPlugin.cs index 3e060526..84ffffb2 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/LLamaSharpPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/LLamaSharpPlugin.cs @@ -5,6 +5,7 @@ namespace BotSharp.Plugins.LLamaSharp; public class LLamaSharpPlugin : IBotSharpPlugin { + public string Id => "3999f668-9fbf-4a91-bd4d-df5b7dfcd90e"; public string Name => "LLamaSharp"; public string Description => "The C#/.NET binding of llama.cpp. Run local LLaMA/GPT model easily and fast in C#!"; public string IconUrl => "https://raw.githubusercontent.com/SciSharp/LLamaSharp/master/Assets/LLamaSharpLogo.png"; diff --git a/src/Plugins/BotSharp.Plugin.MetaAI/MetaAiPlugin.cs b/src/Plugins/BotSharp.Plugin.MetaAI/MetaAiPlugin.cs index df5a3d0e..f9e6b4b4 100644 --- a/src/Plugins/BotSharp.Plugin.MetaAI/MetaAiPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.MetaAI/MetaAiPlugin.cs @@ -11,6 +11,7 @@ namespace BotSharp.Plugin.MetaAI; public class MetaAiPlugin : IBotSharpPlugin { + public string Id => "5b18ca9b-82ed-494b-b121-e3499661edb0"; public string Name => "Meta AI"; public string Description => "Innovating with the freedom to explore, discover and apply AI at scale."; public string IconUrl => "https://static.xx.fbcdn.net/rsrc.php/yJ/r/C1E_YZIckM5.svg"; diff --git a/src/Plugins/BotSharp.Plugin.MetaMessenger/MetaMessengerPlugin.cs b/src/Plugins/BotSharp.Plugin.MetaMessenger/MetaMessengerPlugin.cs index 3bc19755..680c7ae7 100644 --- a/src/Plugins/BotSharp.Plugin.MetaMessenger/MetaMessengerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.MetaMessenger/MetaMessengerPlugin.cs @@ -7,6 +7,7 @@ namespace BotSharp.Plugin.MetaMessenger; /// public class MetaMessengerPlugin : IBotSharpPlugin { + public string Id => "3694d49c-ddc4-43ea-b019-4d3b373ad570"; public string Name => "Meta Messenger"; public string Description => "Messaging service that allows users to connect with others and share content."; public string IconUrl => "https://static.xx.fbcdn.net/rsrc.php/yJ/r/C1E_YZIckM5.svg"; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs index ac142536..dadacb4c 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs @@ -7,6 +7,7 @@ namespace BotSharp.Plugin.MongoStorage; /// public class MongoStoragePlugin : IBotSharpPlugin { + public string Id => "058094a7-4ad3-4284-b94d-ac1373cf63d8"; public string Name => "MongoDB Storage"; public string Description => "MongoDB as the repository, store data in document."; public string IconUrl => "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrFrT-_0VYV4PraApwSUmsf4pBGWgvLTaLZGUd7942FxjErsA5iaL4n5Q7CplOmVtwEQ&usqp=CAU"; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs index 0f7a2750..9ad633ed 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs @@ -2,6 +2,7 @@ using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Conversations.Models; using BotSharp.Abstraction.Evaluations.Settings; using BotSharp.Abstraction.Functions.Models; +using BotSharp.Abstraction.Plugins.Models; using BotSharp.Abstraction.Repositories.Filters; using BotSharp.Abstraction.Repositories.Models; using BotSharp.Abstraction.Routing.Models; @@ -175,6 +176,18 @@ public class MongoRepository : IBotSharpRepository return _changedTableNames.Count; } + #region Plugin + public PluginConfig GetPluginConfig() + { + return new PluginConfig(); + } + + public void SavePluginConfig(PluginConfig config) + { + + } + #endregion + #region Agent public void UpdateAgent(Agent agent, AgentField field) { @@ -971,5 +984,6 @@ public class MongoRepository : IBotSharpRepository _dc.LlmCompletionLogs.UpdateOne(filter, update, _options); } + #endregion } diff --git a/src/Plugins/BotSharp.Plugin.PaddleSharp/PaddleSharpPlugin.cs b/src/Plugins/BotSharp.Plugin.PaddleSharp/PaddleSharpPlugin.cs index 91ae91b9..55b337d4 100644 --- a/src/Plugins/BotSharp.Plugin.PaddleSharp/PaddleSharpPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.PaddleSharp/PaddleSharpPlugin.cs @@ -10,6 +10,7 @@ namespace BotSharp.Plugin.PaddleOCR; public class PaddleSharpPlugin : IBotSharpPlugin { + public string Id => "89746428-e2a1-415d-a9da-5eeaee8bb358"; public string Name => "PaddlePaddle"; public string Description => "An Open-Source Deep Learning Platform Originated from Industrial Practice"; public string IconUrl => "https://miro.medium.com/v2/resize:fit:549/1*oZeecXkOoTzEYp-btIKwxw.jpeg"; diff --git a/src/Plugins/BotSharp.Plugin.Qdrant/QdrantPlugin.cs b/src/Plugins/BotSharp.Plugin.Qdrant/QdrantPlugin.cs index 92ce9372..ad151aed 100644 --- a/src/Plugins/BotSharp.Plugin.Qdrant/QdrantPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.Qdrant/QdrantPlugin.cs @@ -7,6 +7,7 @@ namespace BotSharp.Plugin.Qdrant; public class QdrantPlugin : IBotSharpPlugin { + public string Id => "9e087f80-0f50-45bf-a87a-c1099af8f18e"; public string Name => "Qdrant"; public string Description => "Vector Database - Make the most of your Unstructured Data"; public string IconUrl => "https://qdrant.tech/images/logo_with_text.png"; diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingSpeederPlugin.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingSpeederPlugin.cs index c3dac3a2..e72bdacf 100644 --- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingSpeederPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingSpeederPlugin.cs @@ -10,6 +10,7 @@ namespace BotSharp.Plugin.RoutingSpeeder; public class RoutingSpeederPlugin : IBotSharpPlugin { + public string Id => "e7dff028-462d-47d2-85aa-dc56a6d362ee"; public void RegisterDI(IServiceCollection services, IConfiguration config) { var settings = new RouterSpeederSettings(); diff --git a/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelPlugin.cs b/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelPlugin.cs index c35bf0a1..9525abe0 100644 --- a/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelPlugin.cs @@ -11,6 +11,7 @@ namespace BotSharp.Plugin.SemanticKernel /// public class SemanticKernelPlugin : IBotSharpPlugin { + public string Id => "849e5ab9-276f-4cf1-8041-c089fe1a1aeb"; /// public string Name => "Semantic Kernel"; diff --git a/src/Plugins/BotSharp.Plugin.TelegramBots/TelegramBotsPlugin.cs b/src/Plugins/BotSharp.Plugin.TelegramBots/TelegramBotsPlugin.cs index 86952750..3672fd8f 100644 --- a/src/Plugins/BotSharp.Plugin.TelegramBots/TelegramBotsPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.TelegramBots/TelegramBotsPlugin.cs @@ -7,6 +7,7 @@ namespace BotSharp.Plugin.TelegramBots { public class TelegramBotsPlugin : IBotSharpPlugin { + public string Id => "6cc8c2f0-0958-4ace-adec-1df609ec9e00"; public string Name => "Telegram Bots"; public string Description => "Bots are small applications that run entirely within the Telegram app."; diff --git a/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs b/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs index cba9ba30..844f74ab 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs @@ -4,6 +4,7 @@ namespace BotSharp.Plugin.Twilio; public class TwilioPlugin : IBotSharpPlugin { + public string Id => "943ffd4d-ac8b-44aa-8a1c-38c9279c1b65"; public string Name => "Twilio"; public string Description => "Communication APIs for SMS, Voice, Video & Authentication"; diff --git a/src/Plugins/BotSharp.Plugin.WeChat/WeChatPlugin.cs b/src/Plugins/BotSharp.Plugin.WeChat/WeChatPlugin.cs index 82c184a6..c3fbe8b8 100644 --- a/src/Plugins/BotSharp.Plugin.WeChat/WeChatPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.WeChat/WeChatPlugin.cs @@ -18,6 +18,7 @@ namespace BotSharp.Plugin.WeChat; public class WeChatPlugin : IBotSharpAppPlugin { + public string Id => "f5e5113b-c1de-4d69-b4b1-9bc6efed7253"; public string Name => "Tecent Wechat"; public string Description => "Free messaging and calling app, support voice,photo,video and text messages."; public string IconUrl => "https://i.pinimg.com/originals/66/c9/44/66c94415043811725165e59b371a0aa2.png"; diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/WebDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.WebDriver/WebDriverPlugin.cs index 26af3ae7..7abd0264 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/WebDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/WebDriverPlugin.cs @@ -6,6 +6,7 @@ namespace BotSharp.Plugin.Playwrights; public class WebDriverPlugin : IBotSharpPlugin { + public string Id => "f0e26bc3-cfde-4b63-845c-c9c542abea44"; public string Name => "Web Driver"; public string Description => "Empower agent to manipulate web browser in automation tools."; public string IconUrl => "https://cdn-icons-png.flaticon.com/512/8576/8576378.png"; diff --git a/tests/BotSharp.Plugin.PizzaBot/PizzaBotPlugin.cs b/tests/BotSharp.Plugin.PizzaBot/PizzaBotPlugin.cs index 6946bf83..806e5fc6 100644 --- a/tests/BotSharp.Plugin.PizzaBot/PizzaBotPlugin.cs +++ b/tests/BotSharp.Plugin.PizzaBot/PizzaBotPlugin.cs @@ -5,6 +5,7 @@ namespace BotSharp.Plugin.PizzaBot; public class PizzaBotPlugin : IBotSharpPlugin { + public string Id => "1c8270eb-de63-4ca0-8903-654d83ce5ece"; public string Name => "Pizza AI Assistant"; public string Description => "An example of an enterprise-grade AI Chatbot."; public string IconUrl => "https://cdn-icons-png.flaticon.com/512/6978/6978255.png";