From 9876b7b43b44574695a7eaa3c18efc6399deeb2b Mon Sep 17 00:00:00 2001 From: Chen Gong Date: Thu, 7 Nov 2024 09:12:10 -0600 Subject: [PATCH 001/100] add dashboard conversation backend service --- .../Repositories/IBotSharpRepository.cs | 2 + .../Users/IUserService.cs | 2 + .../Users/Models/Dashboard.cs | 25 ++++++++++ .../BotSharp.Abstraction/Users/Models/User.cs | 1 + .../FileRepository/FileRepository.User.cs | 27 +++++++++++ .../FileRepository/FileRepository.cs | 32 +++++++++++++ .../Users/Services/UserService.cs | 17 +++++++ .../Controllers/ConversationController.cs | 12 +++++ .../Controllers/DashboardController.cs | 47 +++++++++++++++++++ .../Conversations/ConversationViewModel.cs | 1 + .../Users/UserDashboardConversationModel.cs | 26 ++++++++++ 11 files changed, 192 insertions(+) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs create mode 100644 src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs create mode 100644 src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserDashboardConversationModel.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 1471093b..963b61be 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -26,9 +26,11 @@ public interface IBotSharpRepository List GetUserByIds(List ids) => throw new NotImplementedException(); User? GetUserByAffiliateId(string affiliateId) => throw new NotImplementedException(); User? GetUserByUserName(string userName) => throw new NotImplementedException(); + Dashboard? GetDashboard(string id = null) => throw new NotImplementedException(); void CreateUser(User user) => throw new NotImplementedException(); void UpdateExistUser(string userId, User user) => throw new NotImplementedException(); void UpdateUserVerified(string userId) => throw new NotImplementedException(); + void AddDashboardConversation(string userId, string conversationId) => throw new NotImplementedException(); void UpdateUserVerificationCode(string userId, string verficationCode) => throw new NotImplementedException(); void UpdateUserPassword(string userId, string password) => throw new NotImplementedException(); void UpdateUserEmail(string userId, string email) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs index 421e217b..164017ea 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs @@ -22,4 +22,6 @@ public interface IUserService Task UpdatePassword(string newPassword, string verificationCode); Task GetUserTokenExpires(); Task UpdateUsersIsDisable(List userIds, bool isDisable); + Task AddDashboardConversation(string userId, string conversationId); + Task GetDashboard(string userId); } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs new file mode 100644 index 00000000..51d5f1a7 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BotSharp.Abstraction.Users.Models; + +public class Dashboard +{ + public IList ConversationList { get; set; } = []; +} + +public class DashboardComponent +{ + public required string Id { get; set; } + public string? Name { get; set; } +} + +public class DashboardConversation : DashboardComponent +{ + public string? ConversationId { get; set; } + public string? Instruction { get; set; } = "Default instruction: Ask bot to do something"; +} + diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs index cb48701f..2d62fe66 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs @@ -23,6 +23,7 @@ public class User public bool Verified { get; set; } public string? AffiliateId { get; set; } public bool IsDisabled { get; set; } + public List DashboardConversations { get; set; } = []; public DateTime UpdatedTime { get; set; } = DateTime.UtcNow; public DateTime CreatedTime { get; set; } = DateTime.UtcNow; } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 465ae961..0c731da1 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -41,6 +41,11 @@ public partial class FileRepository return Users.FirstOrDefault(x => x.UserName == userName.ToLower()); } + public Dashboard? GetDashboard(string id = null) + { + return Dashboards.FirstOrDefault(); + } + public void CreateUser(User user) { var userId = Guid.NewGuid().ToString(); @@ -68,4 +73,26 @@ public partial class FileRepository var path = Path.Combine(dir, USER_FILE); File.WriteAllText(path, JsonSerializer.Serialize(user, _options)); } + + public void AddDashboardConversation(string userId, string conversationId) + { + var user = GetUserById(userId); + if (user == null) return; + + // one user only has one dashboard currently + var dash = Dashboards.FirstOrDefault(); + dash ??= new(); + + var dashconv = new DashboardConversation + { + Id = Guid.NewGuid().ToString(), + ConversationId = conversationId + }; + + dash.ConversationList.Add(dashconv); + + var dir = Path.Combine(_dbSettings.FileRepository, USERS_FOLDER, userId); + var path = Path.Combine(dir, DASHBOARD_FILE); + File.WriteAllText(path, JsonSerializer.Serialize(dash, _options)); + } } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs index 46f39aaa..30a7a475 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs @@ -23,6 +23,7 @@ public partial class FileRepository : IBotSharpRepository private const string AGENT_INSTRUCTION_FILE = "instruction"; private const string AGENT_SAMPLES_FILE = "samples.txt"; private const string USER_FILE = "user.json"; + private const string DASHBOARD_FILE = "dashboard.json"; private const string USER_AGENT_FILE = "agents.json"; private const string CONVERSATION_FILE = "conversation.json"; private const string STATS_FILE = "stats.json"; @@ -74,6 +75,7 @@ public partial class FileRepository : IBotSharpRepository } private List _users = new List(); + private List _dashboards = []; private List _agents = new List(); private List _userAgents = new List(); private List _conversations = new List(); @@ -106,6 +108,36 @@ public partial class FileRepository : IBotSharpRepository } } + private IQueryable Dashboards + { + get + { + if (!_dashboards.IsNullOrEmpty()) + { + return _dashboards.AsQueryable(); + } + + var dir = Path.Combine(_dbSettings.FileRepository, USERS_FOLDER); + _dashboards = []; + if (Directory.Exists(dir)) + { + foreach (var d in Directory.GetDirectories(dir)) + { + var dashboardFile = Path.Combine(d, DASHBOARD_FILE); + if (!Directory.Exists(d) || !File.Exists(dashboardFile)) + continue; + + var json = File.ReadAllText(dashboardFile); + var dash = JsonSerializer.Deserialize(json, _options); + + if (dash == null) continue; + _dashboards.Add(dash); + } + } + return _dashboards.AsQueryable(); + } + } + private IQueryable Agents { get diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 10dbe8de..65de880c 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -640,4 +640,21 @@ public class UserService : IUserService } return true; } + + public async Task AddDashboardConversation(string userId, string conversationId) + { + var db = _services.GetRequiredService(); + db.AddDashboardConversation(userId, conversationId); + + await Task.CompletedTask; + return true; + } + + public async Task GetDashboard(string userId) + { + var db = _services.GetRequiredService(); + var dash = db.GetDashboard(); + await Task.CompletedTask; + return dash; + } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 91617a0f..00fe8ce3 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -490,6 +490,18 @@ public class ConversationController : ControllerBase } #endregion + #region miscellaneous + [HttpPut("/agent/{agentId}/conversation/{conversationId}/PinToDashboard")] + public async Task PinConversationToDashboard([FromRoute] string agentId, [FromRoute] string conversationId) + { + var userService = _services.GetRequiredService(); + + var user = await userService.GetUser(_user.Id); + var pinned = await userService.AddDashboardConversation(user.Id, conversationId); + return pinned; + } + #endregion + #region Private methods private void SetStates(IConversationService conv, NewMessageModel input) { diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs new file mode 100644 index 00000000..70b04e47 --- /dev/null +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs @@ -0,0 +1,47 @@ +using BotSharp.Abstraction.Options; +using BotSharp.Abstraction.Users.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BotSharp.OpenAPI.Controllers; + +[Authorize] +[ApiController] +public class DashboardController : ControllerBase +{ + private readonly IServiceProvider _services; + private readonly IUserIdentity _user; + + public DashboardController(IServiceProvider services, + IUserIdentity user, + BotSharpOptions options) + { + _services = services; + _user = user; + + } + #region User Components + [HttpGet("/dashboard/components")] + public async Task GetComponents(string userId) + { + var userService = _services.GetRequiredService(); + var dashboardProfile = await userService.GetDashboard(userId); + if (dashboardProfile == null) return new UserDashboardModel(); + var result = new UserDashboardModel + { + ConversationList = dashboardProfile.ConversationList.Select( + x => new UserDashboardConversationModel + { + Name = x.Name, + ConversationId = x.ConversationId, + Instruction = x.Instruction + } + ).ToList() + }; + return result; + } + #endregion +} diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs index 05f8cb89..90b4ff67 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs @@ -12,6 +12,7 @@ public class ConversationViewModel [JsonPropertyName("agent_name")] public string AgentName { get; set; } + [JsonPropertyName("title")] public string Title { get; set; } = string.Empty; public UserViewModel User { get; set; } = new UserViewModel(); diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserDashboardConversationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserDashboardConversationModel.cs new file mode 100644 index 00000000..3a5f3491 --- /dev/null +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserDashboardConversationModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace BotSharp.OpenAPI.ViewModels.Users; +public class UserDashboardModel +{ + + [JsonPropertyName("conversation_list")] + public IList ConversationList { get; set; } = []; +} + +public class UserDashboardConversationModel +{ + [JsonPropertyName("name")] + public string? Name { get; set; } + + [JsonPropertyName("conversation_id")] + public string? ConversationId { get; set; } + + [JsonPropertyName("instruction")] + public string? Instruction { get; set; } +} From a14981e0322c5f074e49876c544b9bc1f62ff2e1 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Mon, 18 Nov 2024 22:31:18 +0000 Subject: [PATCH 002/100] Add Redis timestamp --- .../Infrastructures/Events/RedisPublisher.cs | 8 ++++++-- .../Infrastructures/Events/RedisSubscriber.cs | 7 ++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index f6daa59d..08ce275c 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -24,7 +24,11 @@ public class RedisPublisher : IEventPublisher { var db = _redis.GetDatabase(); // Add a message to the stream, keeping only the latest 1 million messages - await db.StreamAddAsync(channel, "message", message, + await db.StreamAddAsync(channel, + [ + new NameValueEntry("message", message), + new NameValueEntry("timestamp", DateTime.UtcNow.ToString("o")) + ], maxLength: 1000 * 10000); _logger.LogInformation($"Published message {channel} {message}"); @@ -50,7 +54,7 @@ public class RedisPublisher : IEventPublisher } catch (Exception ex) { - _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}"); + _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}\r\n{ex}"); } } } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index 726b9358..bf6652b1 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -50,6 +50,7 @@ public class RedisSubscriber : IEventSubscriber foreach (var entry in entries) { _logger.LogInformation($"Consumer {Environment.MachineName} received: {channel} {entry.Values[0].Value}"); + await db.StreamAcknowledgeAsync(channel, group, entry.Id); try { @@ -60,11 +61,7 @@ public class RedisSubscriber : IEventSubscriber } catch (Exception ex) { - _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}"); - } - finally - { - await db.StreamAcknowledgeAsync(channel, group, entry.Id); + _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}\r\n{ex}"); } } From 6432f225e12c151791c7efe99ec5443140c5732f Mon Sep 17 00:00:00 2001 From: "jason.wang" Date: Wed, 20 Nov 2024 09:06:42 +0800 Subject: [PATCH 003/100] issues-34 --- .../Browsing/Models/PageActionArgs.cs | 3 +++ .../PlaywrightWebDriver.GoToPage.cs | 22 ++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs index fe575462..32486a09 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs @@ -47,4 +47,7 @@ public class PageActionArgs public int WaitTime { get; set; } public bool ReadInnerHTMLAsBody { get; set; } = false; + public bool IsScrollPage { get; set; } = false; + public int ScrollCount { get; set; } = 1; + public int ScrollWaitTime { get; set; } = 1; } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs index 30bd6748..156e17f0 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs @@ -8,7 +8,7 @@ public partial class PlaywrightWebDriver var context = await _instance.GetContext(message.ContextId); try { - var page = await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback, + var page = await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback, responseInMemory: args.ResponseInMemory, responseContainer: args.ResponseContainer, excludeResponseUrls: args.ExcludeResponseUrls, @@ -18,7 +18,7 @@ public partial class PlaywrightWebDriver if (args.OpenNewTab && page != null && page.Url == "about:blank") { - page = await _instance.NewPage(message, + page = await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback, responseInMemory: args.ResponseInMemory, responseContainer: args.ResponseContainer, @@ -28,7 +28,7 @@ public partial class PlaywrightWebDriver if (page == null) { - page = await _instance.NewPage(message, + page = await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback, responseInMemory: args.ResponseInMemory, responseContainer: args.ResponseContainer, @@ -44,7 +44,7 @@ public partial class PlaywrightWebDriver if (args.Selectors != null) { // 使用传入的选择器列表进行并行等待 - var tasks =args.Selectors.Select(selector => + var tasks = args.Selectors.Select(selector => page.WaitForSelectorAsync(selector, new PageWaitForSelectorOptions { Timeout = args.Timeout > 0 ? args.Timeout : 30000 @@ -77,6 +77,18 @@ public partial class PlaywrightWebDriver await Task.Delay(args.WaitTime * 1000); } + if (args.IsScrollPage) + { + var scrollCount = 0; + while (scrollCount < args.ScrollCount) + { + var previousHeight = await page.EvaluateAsync("document.body.scrollHeight"); + await page.EvaluateAsync("window.scrollTo(0, document.body.scrollHeight)"); + await page.WaitForTimeoutAsync(args.ScrollWaitTime * 1000); + scrollCount++; + }; + } + result.ResponseStatusCode = response.Status; if (response.Status == 200) { @@ -89,7 +101,7 @@ public partial class PlaywrightWebDriver } } else - { + { result.Message = response.StatusText; } } From 9ad3c7ba608fb362b8e49125bb59eec47110074c Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Wed, 20 Nov 2024 05:15:21 +0000 Subject: [PATCH 004/100] Fix FileRepository.GetUserByPhone --- .../FileRepository/FileRepository.User.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 9600bbc8..68e76cd8 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -11,9 +11,21 @@ public partial class FileRepository return Users.FirstOrDefault(x => x.Email == email.ToLower()); } - public User? GetUserByPhone(string phone) + public User? GetUserByPhone(string phone, string? role = null, string regionCode = "CN") { - return Users.FirstOrDefault(x => x.Phone == phone); + var query = Users.Where(x => x.Phone == phone); + + if (!string.IsNullOrEmpty(role)) + { + query = query.Where(x => x.Role == role); + } + + if (!string.IsNullOrEmpty(regionCode)) + { + query = query.Where(x => x.RegionCode == regionCode); + } + + return query.FirstOrDefault(); } public User? GetAffiliateUserByPhone(string phone) From e70cd70e4632a9bceca31dbdff7cb9fcdcc87929 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 20 Nov 2024 02:24:26 -0600 Subject: [PATCH 005/100] refine agent utility --- .../Agents/AgentHookBase.cs | 79 +++++++++++++++++ .../BotSharp.Abstraction/Agents/IAgentHook.cs | 2 + .../Agents/Models/AgentUtilityLoadModel.cs | 64 ++++++++++++++ .../RoutingService.HasMissingRequiredField.cs | 1 - .../Routing/RoutingService.InvokeAgent.cs | 2 - .../BotSharp.Core/Routing/RoutingService.cs | 15 ---- .../Hooks/AudioHandlerHook.cs | 51 +++-------- .../EmailHandlerPlugin.cs | 3 +- .../Hooks/EmailHandlerHook.cs | 34 ++++++++ .../Hooks/EmailHandlerUtilityHook.cs | 16 ++-- .../Hooks/EmailReaderHook.cs | 56 ------------ .../Hooks/EmailSenderHook.cs | 56 ------------ .../Helpers/MySql/MySqlDbHelpers.cs | 9 +- .../Helpers/Sqlite/SqliteDbHelpers.cs | 8 +- .../Hooks/ExcelHandlerHook.cs | 47 ++-------- .../Hooks/FileHandlerHook.cs | 86 +++++++++---------- .../Hooks/HttpHandlerHook.cs | 42 ++------- .../Hooks/KnowledgeBaseAgentHook.cs | 58 +++---------- .../Hooks/PlannerAgentHook.cs | 85 ++++-------------- .../BotSharp.Plugin.SqlDriver.csproj | 2 +- .../Enum/{Utility.cs => UtilityName.cs} | 2 +- .../Helpers/SqlDriverHelper.cs | 20 +++++ .../Hooks/GetTableDefinitionHook.cs | 84 ------------------ .../Hooks/SqlDictionaryLookupHook.cs | 84 ------------------ .../Hooks/SqlDriverAgentHook.cs | 61 +++++++++++++ .../Hooks/SqlExecutorHook.cs | 85 ------------------ .../Hooks/SqlUtilityHook.cs | 6 +- .../Settings/SqlDriverSetting.cs | 2 +- .../SqlDriverPlugin.cs | 8 +- .../BotSharp.Plugin.SqlDriver/Using.cs | 4 +- .../Hooks/OutboundPhoneCallHandlerHook.cs | 41 ++------- 31 files changed, 387 insertions(+), 726 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs create mode 100644 src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailReaderHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailSenderHook.cs rename src/Plugins/BotSharp.Plugin.SqlDriver/Enum/{Utility.cs => UtilityName.cs} (90%) create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 808f7821..17369f28 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -1,5 +1,9 @@ using BotSharp.Abstraction.Agents.Settings; +using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Functions.Models; +using BotSharp.Abstraction.Repositories; +using Microsoft.Extensions.DependencyInjection; +using System.Data; namespace BotSharp.Abstraction.Agents; @@ -52,4 +56,79 @@ public abstract class AgentHookBase : IAgentHook public virtual void OnAgentLoaded(Agent agent) { } + + public virtual void OnLoadAgentUtility(Agent agent, IEnumerable utilities) + { + if (agent.Type == AgentType.Routing || utilities.IsNullOrEmpty()) return; + + var conv = _services.GetRequiredService(); + var isConvMode = conv.IsConversationMode(); + if (!isConvMode) return; + + var render = _services.GetRequiredService(); + + agent.Functions ??= []; + var agentUtilities = agent.Utilities ?? []; + + foreach (var item in utilities) + { + if (item.UtilityName.IsNullOrEmpty() || item.Content == null) continue; + + var isEnabled = agentUtilities.Contains(item.UtilityName); + if (!isEnabled) continue; + + var (fns, prompts) = GetUtilityContent(item.Content); + + if (!fns.IsNullOrEmpty()) + { + agent.Functions.AddRange(fns); + } + + if (!prompts.IsNullOrEmpty()) + { + foreach (var prompt in prompts) + { + agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; + } + } + } + } + + private (IEnumerable, IEnumerable) GetUtilityContent(UtilityContent content) + { + var db = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + + var fns = new List(); + var prompts = new List(); + + var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); + if (agent == null) + { + return (fns, prompts); + } + + if (!content.Functions.IsNullOrEmpty()) + { + var functionNames = content.Functions?.Select(x => x.Name)?.ToList() ?? []; + fns = agent?.Functions?.Where(x => functionNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.ToList() ?? []; + } + + if (!content.Templates.IsNullOrEmpty()) + { + foreach (var template in content.Templates) + { + var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(template.Name))?.Content ?? string.Empty; + if (string.IsNullOrWhiteSpace(prompt)) continue; + + if (!template.Data.IsNullOrEmpty()) + { + prompt = render.Render(prompt, template.Data); + } + prompts.Add(prompt); + } + } + + return (fns, prompts); + } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs index 99cdadca..f8e3c545 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs @@ -31,4 +31,6 @@ public interface IAgentHook /// /// void OnAgentLoaded(Agent agent); + + void OnLoadAgentUtility(Agent agent, IEnumerable utilities); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs new file mode 100644 index 00000000..938c5546 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs @@ -0,0 +1,64 @@ +namespace BotSharp.Abstraction.Agents.Models; + +public class AgentUtilityLoadModel +{ + public string UtilityName { get; set; } + public UtilityContent Content { get; set; } + + public AgentUtilityLoadModel() + { + + } + + public AgentUtilityLoadModel(string utilityName, UtilityContent content) + { + UtilityName = utilityName; + Content = content; + } +} + + +public class UtilityContent +{ + public IEnumerable Functions { get; set; } = []; + public IEnumerable Templates { get; set; } = []; + + public UtilityContent() + { + + } +} + +public class UtilityFunction : UtilityBase +{ + public UtilityFunction() + { + + } + + public UtilityFunction(string name) + { + Name = name; + } +} + +public class UtilityTemplate : UtilityBase +{ + public Dictionary? Data { get; set; } + + public UtilityTemplate() + { + + } + + public UtilityTemplate(string name, Dictionary? data = null) + { + Name = name; + Data = data; + } +} + +public class UtilityBase +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.HasMissingRequiredField.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.HasMissingRequiredField.cs index 3b1f0566..d88b65ba 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.HasMissingRequiredField.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.HasMissingRequiredField.cs @@ -1,6 +1,5 @@ using BotSharp.Abstraction.Conversations.Enums; using BotSharp.Abstraction.Routing.Models; -using System.Drawing; namespace BotSharp.Core.Routing; diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeAgent.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeAgent.cs index 25ab3552..39c8ed23 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeAgent.cs @@ -4,13 +4,11 @@ namespace BotSharp.Core.Routing; public partial class RoutingService { - //private int _currentRecursionDepth = 0; public async Task InvokeAgent(string agentId, List dialogs) { var agentService = _services.GetRequiredService(); var agent = await agentService.LoadAgent(agentId); - //_currentRecursionDepth++; Context.IncreaseRecursiveCounter(); if (Context.CurrentRecursionDepth > agent.LlmConfig.MaxRecursionDepth) { diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs index 770acaf9..4f57571f 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs @@ -16,21 +16,6 @@ public partial class RoutingService : IRoutingService public IRoutingContext Context => _context; public Agent Router => _router; - //public int GetRecursiveCounter() - //{ - // return _currentRecursionDepth; - //} - - //public void SetRecursiveCounter(int counter) - //{ - // _currentRecursionDepth = counter; - //} - - //public void ResetRecursiveCounter() - //{ - // _currentRecursionDepth = 0; - //} - public RoutingService( IServiceProvider services, RoutingSettings settings, diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs index 80acb149..f391ac2a 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs @@ -1,5 +1,4 @@ using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; namespace BotSharp.Plugin.AudioHandler.Hooks; @@ -9,52 +8,24 @@ public class AudioHandlerHook : AgentHookBase, IAgentHook public override string SelfId => string.Empty; - public AudioHandlerHook(IServiceProvider services, AgentSettings settings) : base(services, settings) + public AudioHandlerHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) { } public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.AudioHandler); - - if (isEnabled && isConvMode) + var utilityLoad = new AgentUtilityLoadModel { - AddUtility(agent, HANDLER_AUDIO); - } + UtilityName = UtilityName.AudioHandler, + Content = new UtilityContent + { + Functions = [new(HANDLER_AUDIO)], + Templates = [new($"{HANDLER_AUDIO}.fn")] + } + }; + base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } - - private void AddUtility(Agent agent, string functionName) - { - var (prompt, fn) = GetPromptAndFunction(functionName); - - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - private (string, FunctionDef?) GetPromptAndFunction(string functionName) - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{functionName}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(functionName)); - return (prompt, loadAttachmentFn); - } } diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs index 5d7ff586..eb52b719 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs @@ -20,8 +20,7 @@ namespace BotSharp.Plugin.EmailHandler return settingService.Bind("EmailSender"); }); - services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); var emailReaderSettings = new EmailReaderSettings(); diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs new file mode 100644 index 00000000..132f84ae --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs @@ -0,0 +1,34 @@ +using BotSharp.Abstraction.Agents; +using BotSharp.Abstraction.Agents.Settings; +using BotSharp.Plugin.EmailHandler.Enums; + +namespace BotSharp.Plugin.EmailHandler.Hooks; + +public class EmailHandlerHook : AgentHookBase +{ + private static string EMAIL_READER_FN = "handle_email_reader"; + private static string EMAIL_SENDER_FN = "handle_email_sender"; + + public override string SelfId => string.Empty; + + public EmailHandlerHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) + { + } + + public override void OnAgentLoaded(Agent agent) + { + var utilityLoad = new AgentUtilityLoadModel + { + UtilityName = UtilityName.EmailHandler, + Content = new UtilityContent + { + Functions = [new(EMAIL_READER_FN), new(EMAIL_SENDER_FN)], + Templates = [new($"{EMAIL_READER_FN}.fn"), new($"{EMAIL_SENDER_FN}.fn")] + } + }; + + base.OnLoadAgentUtility(agent, [utilityLoad]); + base.OnAgentLoaded(agent); + } +} diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs index 1d801e66..7d6a3be2 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs @@ -1,18 +1,12 @@ using BotSharp.Abstraction.Agents; using BotSharp.Plugin.EmailHandler.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace BotSharp.Plugin.EmailHandler.Hooks +namespace BotSharp.Plugin.EmailHandler.Hooks; + +public class EmailHandlerUtilityHook : IAgentUtilityHook { - public class EmailHandlerUtilityHook : IAgentUtilityHook + public void AddUtilities(List utilities) { - public void AddUtilities(List utilities) - { - utilities.Add(UtilityName.EmailHandler); - } + utilities.Add(UtilityName.EmailHandler); } } diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailReaderHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailReaderHook.cs deleted file mode 100644 index beece9e2..00000000 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailReaderHook.cs +++ /dev/null @@ -1,56 +0,0 @@ -using BotSharp.Abstraction.Agents; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; -using BotSharp.Plugin.EmailHandler.Enums; - -namespace BotSharp.Plugin.EmailHandler.Hooks; - -public class EmailReaderHook : AgentHookBase -{ - private static string FUNCTION_NAME = "handle_email_reader"; - - public override string SelfId => string.Empty; - - public EmailReaderHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.EmailHandler); - - if (isConvMode && isEnabled) - { - var (prompt, fn) = GetPromptAndFunction(); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - base.OnAgentLoaded(agent); - } - - private (string, FunctionDef?) GetPromptAndFunction() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{FUNCTION_NAME}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(FUNCTION_NAME)); - return (prompt, loadAttachmentFn); - } -} diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailSenderHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailSenderHook.cs deleted file mode 100644 index 27491015..00000000 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailSenderHook.cs +++ /dev/null @@ -1,56 +0,0 @@ -using BotSharp.Abstraction.Agents; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; -using BotSharp.Plugin.EmailHandler.Enums; - -namespace BotSharp.Plugin.EmailHandler.Hooks; - -public class EmailSenderHook : AgentHookBase -{ - private static string FUNCTION_NAME = "handle_email_sender"; - - public override string SelfId => string.Empty; - - public EmailSenderHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.EmailHandler); - - if (isConvMode && isEnabled) - { - var (prompt, fn) = GetPromptAndFunction(); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - base.OnAgentLoaded(agent); - } - - private (string, FunctionDef?) GetPromptAndFunction() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{FUNCTION_NAME}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(FUNCTION_NAME)); - return (prompt, loadAttachmentFn); - } -} diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/MySql/MySqlDbHelpers.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/MySql/MySqlDbHelpers.cs index 4b86f89f..8b4c0940 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/MySql/MySqlDbHelpers.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/MySql/MySqlDbHelpers.cs @@ -1,12 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; -using BotSharp.Plugin.SqlHero.Settings; -using Microsoft.Data.Sqlite; +using BotSharp.Plugin.SqlDriver.Settings; using MySql.Data.MySqlClient; namespace BotSharp.Plugin.ExcelHandler.Helpers.MySql diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/Sqlite/SqliteDbHelpers.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/Sqlite/SqliteDbHelpers.cs index c55e1642..464fa467 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/Sqlite/SqliteDbHelpers.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Helpers/Sqlite/SqliteDbHelpers.cs @@ -1,11 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BotSharp.Plugin.SqlDriver.Settings; using Microsoft.Data.Sqlite; -using BotSharp.Plugin.SqlDriver.Models; -using BotSharp.Plugin.SqlHero.Settings; namespace BotSharp.Plugin.ExcelHandler.Helpers.Sqlite; diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs index 8716e4b1..98368bd3 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs @@ -12,47 +12,18 @@ public class ExcelHandlerHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.ExcelHandler); - - if (isEnabled && isConvMode) + var utilityLoad = new AgentUtilityLoadModel { - AddUtility(agent, HANDLER_EXCEL); - } + UtilityName = UtilityName.ExcelHandler, + Content = new UtilityContent + { + Functions = [new(HANDLER_EXCEL)], + Templates = [new($"{HANDLER_EXCEL}.fn")] + } + }; + base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } - - private void AddUtility(Agent agent, string functionName) - { - var (prompt, fn) = GetPromptAndFunction(functionName); - - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - private (string, FunctionDef?) GetPromptAndFunction(string functionName) - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{functionName}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(functionName)); - return (prompt, loadAttachmentFn); - } } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs index e9375244..c200d7fc 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs @@ -15,55 +15,47 @@ public class FileHandlerHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - - if (isConvMode) + var utilityLoads = new List { - AddUtility(agent, UtilityName.ImageGenerator, GENERATE_IMAGE_FN); - AddUtility(agent, UtilityName.ImageReader, READ_IMAGE_FN); - AddUtility(agent, UtilityName.ImageEditor, EDIT_IMAGE_FN); - AddUtility(agent, UtilityName.PdfReader, READ_PDF_FN); - - } + new AgentUtilityLoadModel + { + UtilityName = UtilityName.ImageGenerator, + Content = new UtilityContent + { + Functions = [new(GENERATE_IMAGE_FN)], + Templates = [new($"{GENERATE_IMAGE_FN}.fn")] + } + }, + new AgentUtilityLoadModel + { + UtilityName = UtilityName.ImageReader, + Content = new UtilityContent + { + Functions = [new(READ_IMAGE_FN)], + Templates = [new($"{READ_IMAGE_FN}.fn")] + } + }, + new AgentUtilityLoadModel + { + UtilityName = UtilityName.ImageEditor, + Content = new UtilityContent + { + Functions = [new(EDIT_IMAGE_FN)], + Templates = [new($"{EDIT_IMAGE_FN}.fn")] + } + }, + new AgentUtilityLoadModel + { + UtilityName = UtilityName.PdfReader, + Content = new UtilityContent + { + Functions = [new(READ_PDF_FN)], + Templates = [new($"{READ_PDF_FN}.fn")] + } + } + }; + base.OnLoadAgentUtility(agent, utilityLoads); base.OnAgentLoaded(agent); } - - private void AddUtility(Agent agent, string utility, string functionName) - { - if (!IsEnableUtility(agent, utility)) return; - - var (prompt, fn) = GetPromptAndFunction(functionName); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - private bool IsEnableUtility(Agent agent, string utility) - { - return !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(utility); - } - - private (string, FunctionDef?) GetPromptAndFunction(string functionName) - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{functionName}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(functionName)); - return (prompt, loadAttachmentFn); - } } diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs index 78ee2c09..cf9f77f2 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs @@ -1,14 +1,11 @@ using BotSharp.Abstraction.Agents; -using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; -using BotSharp.Abstraction.Repositories; namespace BotSharp.Plugin.HttpHandler.Hooks; public class HttpHandlerHook : AgentHookBase { - private static string FUNCTION_NAME = "handle_http_request"; + private static string HTTP_HANDLER_FN = "handle_http_request"; public override string SelfId => string.Empty; @@ -19,40 +16,17 @@ public class HttpHandlerHook : AgentHookBase public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.HttpHandler); - - if (isConvMode && isEnabled) + var utilityLoad = new AgentUtilityLoadModel { - var (prompt, fn) = GetPromptAndFunction(FUNCTION_NAME); - if (fn != null) + UtilityName = UtilityName.HttpHandler, + Content = new UtilityContent { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } + Functions = [new(HTTP_HANDLER_FN)], + Templates = [new($"{HTTP_HANDLER_FN}.fn")] } - } + }; + base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } - - private (string, FunctionDef?) GetPromptAndFunction(string functionName) - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{functionName}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(functionName)); - return (prompt, loadAttachmentFn); - } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs index f8296520..01c6ffd6 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs @@ -2,59 +2,29 @@ namespace BotSharp.Plugin.KnowledgeBase.Hooks; public class KnowledgeBaseAgentHook : AgentHookBase, IAgentHook { + private const string KNOWLEDGE_RETRIEVAL_FN = "knowledge_retrieval"; + public override string SelfId => string.Empty; - public KnowledgeBaseAgentHook(IServiceProvider services, AgentSettings settings) : base(services, settings) + + public KnowledgeBaseAgentHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) { } public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - - if (isConvMode) + var utilityLoad = new AgentUtilityLoadModel { - AddUtility(agent, UtilityName.KnowledgeRetrieval, "knowledge_retrieval"); - } + UtilityName = UtilityName.KnowledgeRetrieval, + Content = new UtilityContent + { + Functions = [new(KNOWLEDGE_RETRIEVAL_FN)], + Templates = [new($"{KNOWLEDGE_RETRIEVAL_FN}.fn")] + } + }; + base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } - - private void AddUtility(Agent agent, string utility, string functionName) - { - if (!IsEnableUtility(agent, utility)) return; - - var (prompt, fn) = GetPromptAndFunction(functionName); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - private bool IsEnableUtility(Agent agent, string utility) - { - return !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(utility); - } - - private (string, FunctionDef?) GetPromptAndFunction(string functionName) - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{functionName}.fn"))?.Content ?? string.Empty; - var fn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(functionName)); - return (prompt, fn); - } } diff --git a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs index 503de3d5..7c37ef8f 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs @@ -2,6 +2,10 @@ namespace BotSharp.Plugin.Planner.Hooks; public class PlannerAgentHook : AgentHookBase { + private const string PRIMARY_STAGE_FN = "plan_primary_stage"; + private const string SECONDARY_STAGE_FN = "plan_secondary_stage"; + private const string SUMMARY_FN = "plan_summary"; + public override string SelfId => BuiltInAgentId.Planner; public PlannerAgentHook(IServiceProvider services, AgentSettings settings) @@ -30,76 +34,25 @@ public class PlannerAgentHook : AgentHookBase public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.TwoStagePlanner); - - if (isConvMode && isEnabled) + var utilityLoad = new AgentUtilityLoadModel { - var (prompt, fn) = GetPromptAndFunction("plan_primary_stage"); - if (fn != null) + UtilityName = UtilityName.TwoStagePlanner, + Content = new UtilityContent { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } + Functions = [ + new(PRIMARY_STAGE_FN), + new(SECONDARY_STAGE_FN), + new(SUMMARY_FN) + ], + Templates = [ + new($"{PRIMARY_STAGE_FN}.fn"), + new($"{SECONDARY_STAGE_FN}.fn"), + new($"{SUMMARY_FN}.fn") + ] } + }; - (prompt, fn) = GetPromptAndFunction("plan_secondary_stage"); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - - (prompt, fn) = GetPromptAndFunction("plan_summary"); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - + base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } - - private (string, FunctionDef?) GetPromptAndFunction(string functionName) - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{functionName}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(functionName)); - return (prompt, loadAttachmentFn); - } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj index 6433aae1..3a090f0c 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj @@ -1,4 +1,4 @@ - + $(TargetFramework) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs similarity index 90% rename from src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs rename to src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs index 4d9142ca..159d5e7a 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs @@ -1,6 +1,6 @@ namespace BotSharp.Plugin.SqlDriver.Enum; -public class Utility +public class UtilityName { public const string SqlExecutor = "sql-executor"; public const string SqlDictionaryLookup = "sql-dictionary-lookup"; diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs new file mode 100644 index 00000000..3049b754 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs @@ -0,0 +1,20 @@ +namespace BotSharp.Plugin.SqlDriver.Helpers; + +internal static class SqlDriverHelper +{ + internal static string GetDatabaseType(IServiceProvider services) + { + var settings = services.GetRequiredService(); + var dbType = "MySQL"; + + if (!string.IsNullOrWhiteSpace(settings?.SqlServerConnectionString)) + { + dbType = "SQL Server"; + } + else if (!string.IsNullOrWhiteSpace(settings?.SqlLiteConnectionString)) + { + dbType = "SQL Lite"; + } + return dbType; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs deleted file mode 100644 index bcfd2093..00000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs +++ /dev/null @@ -1,84 +0,0 @@ -using BotSharp.Abstraction.Agents.Enums; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; -using BotSharp.Abstraction.Repositories; - -namespace BotSharp.Plugin.SqlDriver.Hooks; - -public class GetTableDefinitionHook : AgentHookBase, IAgentHook -{ - private const string SQL_EXECUTOR_TEMPLATE = "sql_table_definition.fn"; - private IEnumerable _targetSqlExecutorFunctions = new List - { - "sql_table_definition", - }; - - public override string SelfId => BuiltInAgentId.Planner; - - public GetTableDefinitionHook(IServiceProvider services, AgentSettings settings) : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(Utility.SqlTableDefinition); - - if (isConvMode && isEnabled) - { - var (prompt, fns) = GetPromptAndFunctions(); - if (!fns.IsNullOrEmpty()) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = fns; - } - else - { - agent.Functions.AddRange(fns); - } - } - } - - base.OnAgentLoaded(agent); - } - - private (string, List?) GetPromptAndFunctions() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var fns = agent?.Functions?.Where(x => _targetSqlExecutorFunctions.Contains(x.Name))?.ToList(); - - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(SQL_EXECUTOR_TEMPLATE))?.Content ?? string.Empty; - var dbType = GetDatabaseType(); - var render = _services.GetRequiredService(); - prompt = render.Render(prompt, new Dictionary - { - { "db_type", dbType } - }); - - return (prompt, fns); - } - - private string GetDatabaseType() - { - var settings = _services.GetRequiredService(); - var dbType = "MySQL"; - - if (!string.IsNullOrWhiteSpace(settings?.SqlServerConnectionString)) - { - dbType = "SQL Server"; - } - else if (!string.IsNullOrWhiteSpace(settings?.SqlLiteConnectionString)) - { - dbType = "SQL Lite"; - } - return dbType; - } -} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs deleted file mode 100644 index 534b0bf7..00000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs +++ /dev/null @@ -1,84 +0,0 @@ -using BotSharp.Abstraction.Agents.Enums; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; -using BotSharp.Abstraction.Repositories; - -namespace BotSharp.Plugin.SqlDriver.Hooks; - -public class SqlDictionaryLookupHook : AgentHookBase, IAgentHook -{ - private const string SQL_EXECUTOR_TEMPLATE = "verify_dictionary_term.fn"; - private IEnumerable _targetSqlExecutorFunctions = new List - { - "verify_dictionary_term", - }; - - public override string SelfId => BuiltInAgentId.Planner; - - public SqlDictionaryLookupHook(IServiceProvider services, AgentSettings settings) : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(Utility.SqlDictionaryLookup); - - if (isConvMode && isEnabled) - { - var (prompt, fns) = GetPromptAndFunctions(); - if (!fns.IsNullOrEmpty()) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = fns; - } - else - { - agent.Functions.AddRange(fns); - } - } - } - - base.OnAgentLoaded(agent); - } - - private (string, List?) GetPromptAndFunctions() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var fns = agent?.Functions?.Where(x => _targetSqlExecutorFunctions.Contains(x.Name))?.ToList(); - - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(SQL_EXECUTOR_TEMPLATE))?.Content ?? string.Empty; - var dbType = GetDatabaseType(); - var render = _services.GetRequiredService(); - prompt = render.Render(prompt, new Dictionary - { - { "db_type", dbType } - }); - - return (prompt, fns); - } - - private string GetDatabaseType() - { - var settings = _services.GetRequiredService(); - var dbType = "MySQL"; - - if (!string.IsNullOrWhiteSpace(settings?.SqlServerConnectionString)) - { - dbType = "SQL Server"; - } - else if (!string.IsNullOrWhiteSpace(settings?.SqlLiteConnectionString)) - { - dbType = "SQL Lite"; - } - return dbType; - } -} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs new file mode 100644 index 00000000..24c803aa --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs @@ -0,0 +1,61 @@ +using BotSharp.Abstraction.Agents.Enums; +using BotSharp.Abstraction.Agents.Settings; + +namespace BotSharp.Plugin.SqlDriver.Hooks; + +public class SqlDriverAgentHook : AgentHookBase, IAgentHook +{ + private const string SQL_TABLE_DEFINITION_FN = "sql_table_definition"; + private const string VERIFY_DICTIONARY_TERM_FN = "verify_dictionary_term"; + private const string SQL_SELECT_FN = "sql_select"; + + public override string SelfId => BuiltInAgentId.Planner; + + public SqlDriverAgentHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) + { + } + + public override void OnAgentLoaded(Agent agent) + { + var dbType = SqlDriverHelper.GetDatabaseType(_services); + var promptData = new Dictionary + { + { "db_type", dbType } + }; + + var utilityLoads = new List + { + new AgentUtilityLoadModel + { + UtilityName = UtilityName.SqlTableDefinition, + Content = new UtilityContent + { + Functions = new List { new(SQL_TABLE_DEFINITION_FN) }, + Templates = new List { new($"{SQL_TABLE_DEFINITION_FN}.fn", promptData) } + } + }, + new AgentUtilityLoadModel + { + UtilityName = UtilityName.SqlDictionaryLookup, + Content = new UtilityContent + { + Functions = new List { new(VERIFY_DICTIONARY_TERM_FN) }, + Templates = new List { new($"{VERIFY_DICTIONARY_TERM_FN}.fn", promptData) } + } + }, + new AgentUtilityLoadModel + { + UtilityName = UtilityName.SqlExecutor, + Content = new UtilityContent + { + Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, + Templates = new List { new($"sql_executor.fn", promptData) } + } + } + }; + + base.OnLoadAgentUtility(agent, utilityLoads); + base.OnAgentLoaded(agent); + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs deleted file mode 100644 index 56e932c7..00000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs +++ /dev/null @@ -1,85 +0,0 @@ -using BotSharp.Abstraction.Agents.Enums; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Functions.Models; -using BotSharp.Abstraction.Repositories; - -namespace BotSharp.Plugin.SqlDriver.Hooks; - -public class SqlExecutorHook : AgentHookBase, IAgentHook -{ - private const string SQL_EXECUTOR_TEMPLATE = "sql_executor.fn"; - private IEnumerable _targetSqlExecutorFunctions = new List - { - "sql_select", - "sql_table_definition", - }; - - public override string SelfId => string.Empty; - - public SqlExecutorHook(IServiceProvider services, AgentSettings settings) : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(Utility.SqlExecutor); - - if (isConvMode && isEnabled) - { - var (prompt, fns) = GetPromptAndFunctions(); - if (!fns.IsNullOrEmpty()) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = fns; - } - else - { - agent.Functions.AddRange(fns); - } - } - } - - base.OnAgentLoaded(agent); - } - - private (string, List?) GetPromptAndFunctions() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var fns = agent?.Functions?.Where(x => _targetSqlExecutorFunctions.Contains(x.Name))?.ToList(); - - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(SQL_EXECUTOR_TEMPLATE))?.Content ?? string.Empty; - var dbType = GetDatabaseType(); //need change-> using hook? - var render = _services.GetRequiredService(); - prompt = render.Render(prompt, new Dictionary - { - { "db_type", dbType } - }); - - return (prompt, fns); - } - - private string GetDatabaseType() - { - var settings = _services.GetRequiredService(); - var dbType = "MySQL"; - - if (!string.IsNullOrWhiteSpace(settings?.SqlServerConnectionString)) - { - dbType = "SQL Server"; - } - else if (!string.IsNullOrWhiteSpace(settings?.SqlLiteConnectionString)) - { - dbType = "SQL Lite"; - } - return dbType; - } -} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs index daac8cba..451863ff 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs @@ -4,8 +4,8 @@ public class SqlUtilityHook : IAgentUtilityHook { public void AddUtilities(List utilities) { - utilities.Add(Utility.SqlExecutor); - utilities.Add(Utility.SqlDictionaryLookup); - utilities.Add(Utility.SqlTableDefinition); + utilities.Add(UtilityName.SqlExecutor); + utilities.Add(UtilityName.SqlDictionaryLookup); + utilities.Add(UtilityName.SqlTableDefinition); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Settings/SqlDriverSetting.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Settings/SqlDriverSetting.cs index 24f12420..bff2c48c 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Settings/SqlDriverSetting.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Settings/SqlDriverSetting.cs @@ -1,4 +1,4 @@ -namespace BotSharp.Plugin.SqlHero.Settings; +namespace BotSharp.Plugin.SqlDriver.Settings; public class SqlDriverSetting { diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index 47a7883f..8e21d2b0 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -25,12 +25,10 @@ public class SqlDriverPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Using.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Using.cs index 905c4f05..3aa71b80 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Using.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Using.cs @@ -20,5 +20,5 @@ global using BotSharp.Abstraction.Settings; global using BotSharp.Plugin.SqlDriver.Hooks; global using BotSharp.Plugin.SqlDriver.Services; global using BotSharp.Plugin.SqlDriver.Enum; -global using BotSharp.Plugin.SqlHero.Settings; -global using System.Drawing; +global using BotSharp.Plugin.SqlDriver.Helpers; +global using BotSharp.Plugin.SqlDriver.Settings; diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs index 7d8d33fb..9fce1d20 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs @@ -1,14 +1,12 @@ using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Repositories; -using BotSharp.Abstraction.Utilities; using BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Enums; namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks { internal class OutboundPhoneCallHandlerHook : AgentHookBase { - private static string FUNCTION_NAME = "twilio_outbound_phone_call"; + private static string OUTBOUND_PHONE_CALL_FN = "twilio_outbound_phone_call"; public override string SelfId => string.Empty; @@ -18,41 +16,18 @@ namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks public override void OnAgentLoaded(Agent agent) { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.OutboundPhoneCall); - - if (isConvMode && isEnabled) + var utilityLoad = new AgentUtilityLoadModel { - var (prompt, fn) = GetPromptAndFunction(); - if (fn != null) + UtilityName = UtilityName.OutboundPhoneCall, + Content = new UtilityContent { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } + Functions = [new(OUTBOUND_PHONE_CALL_FN)], + Templates = [new($"{OUTBOUND_PHONE_CALL_FN}.fn")] } - } + }; + base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } - - private (string, FunctionDef) GetPromptAndFunction() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{FUNCTION_NAME}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(FUNCTION_NAME)); - return (prompt, loadAttachmentFn); - } } } From 94018db37f177e3a827a5cf4e1b6970dfb4512d2 Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Wed, 20 Nov 2024 17:42:22 +0800 Subject: [PATCH 006/100] fix: date time --- .../BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs index 4054d09d..ce4227e7 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs @@ -49,6 +49,8 @@ public class UserDocument : MongoBase Verified = Verified, RegionCode = RegionCode, Permissions = Permissions, + CreatedTime = CreatedTime, + UpdatedTime = UpdatedTime, }; } } \ No newline at end of file From 99dd39d9baff8ad616494e35d60eead44e799c0d Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 20 Nov 2024 10:13:40 -0600 Subject: [PATCH 007/100] rename --- .../Agents/AgentHookBase.cs | 14 ++++------- .../BotSharp.Abstraction/Agents/IAgentHook.cs | 2 +- ...entUtilityLoadModel.cs => AgentUtility.cs} | 15 +++++------ .../Hooks/AudioHandlerHook.cs | 4 +-- .../Hooks/EmailHandlerHook.cs | 4 +-- .../Hooks/ExcelHandlerHook.cs | 4 +-- .../Hooks/FileHandlerHook.cs | 18 ++++++------- .../Hooks/HttpHandlerHook.cs | 4 +-- .../Hooks/KnowledgeBaseAgentHook.cs | 4 +-- .../Hooks/PlannerAgentHook.cs | 4 +-- .../Hooks/SqlDriverAgentHook.cs | 25 ++++++++----------- .../Hooks/OutboundPhoneCallHandlerHook.cs | 4 +-- 12 files changed, 46 insertions(+), 56 deletions(-) rename src/Infrastructure/BotSharp.Abstraction/Agents/Models/{AgentUtilityLoadModel.cs => AgentUtility.cs} (66%) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 17369f28..7214a3d5 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -57,7 +57,7 @@ public abstract class AgentHookBase : IAgentHook { } - public virtual void OnLoadAgentUtility(Agent agent, IEnumerable utilities) + public virtual void OnLoadAgentUtility(Agent agent, IEnumerable utilities) { if (agent.Type == AgentType.Routing || utilities.IsNullOrEmpty()) return; @@ -70,14 +70,14 @@ public abstract class AgentHookBase : IAgentHook agent.Functions ??= []; var agentUtilities = agent.Utilities ?? []; - foreach (var item in utilities) + foreach (var utillity in utilities) { - if (item.UtilityName.IsNullOrEmpty() || item.Content == null) continue; + if (utillity.Name.IsNullOrEmpty() || utillity.Content == null) continue; - var isEnabled = agentUtilities.Contains(item.UtilityName); + var isEnabled = agentUtilities.Contains(utillity.Name); if (!isEnabled) continue; - var (fns, prompts) = GetUtilityContent(item.Content); + var (fns, prompts) = GetUtilityContent(utillity.Content); if (!fns.IsNullOrEmpty()) { @@ -121,10 +121,6 @@ public abstract class AgentHookBase : IAgentHook var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(template.Name))?.Content ?? string.Empty; if (string.IsNullOrWhiteSpace(prompt)) continue; - if (!template.Data.IsNullOrEmpty()) - { - prompt = render.Render(prompt, template.Data); - } prompts.Add(prompt); } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs index f8e3c545..d60f348c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs @@ -32,5 +32,5 @@ public interface IAgentHook /// void OnAgentLoaded(Agent agent); - void OnLoadAgentUtility(Agent agent, IEnumerable utilities); + void OnLoadAgentUtility(Agent agent, IEnumerable utilities); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs similarity index 66% rename from src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs rename to src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs index 938c5546..672c9f3d 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtilityLoadModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs @@ -1,18 +1,18 @@ namespace BotSharp.Abstraction.Agents.Models; -public class AgentUtilityLoadModel +public class AgentUtility { - public string UtilityName { get; set; } + public string Name { get; set; } public UtilityContent Content { get; set; } - public AgentUtilityLoadModel() + public AgentUtility() { } - public AgentUtilityLoadModel(string utilityName, UtilityContent content) + public AgentUtility(string utilityName, UtilityContent content) { - UtilityName = utilityName; + Name = utilityName; Content = content; } } @@ -44,17 +44,14 @@ public class UtilityFunction : UtilityBase public class UtilityTemplate : UtilityBase { - public Dictionary? Data { get; set; } - public UtilityTemplate() { } - public UtilityTemplate(string name, Dictionary? data = null) + public UtilityTemplate(string name) { Name = name; - Data = data; } } diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs index f391ac2a..547cd7c3 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs @@ -15,9 +15,9 @@ public class AudioHandlerHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.AudioHandler, + Name = UtilityName.AudioHandler, Content = new UtilityContent { Functions = [new(HANDLER_AUDIO)], diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs index 132f84ae..4bee4bff 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs @@ -18,9 +18,9 @@ public class EmailHandlerHook : AgentHookBase public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.EmailHandler, + Name = UtilityName.EmailHandler, Content = new UtilityContent { Functions = [new(EMAIL_READER_FN), new(EMAIL_SENDER_FN)], diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs index 98368bd3..453386ed 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs @@ -12,9 +12,9 @@ public class ExcelHandlerHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.ExcelHandler, + Name = UtilityName.ExcelHandler, Content = new UtilityContent { Functions = [new(HANDLER_EXCEL)], diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs index c200d7fc..f43c9a1d 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs @@ -15,38 +15,38 @@ public class FileHandlerHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { - var utilityLoads = new List + var utilityLoads = new List { - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.ImageGenerator, + Name = UtilityName.ImageGenerator, Content = new UtilityContent { Functions = [new(GENERATE_IMAGE_FN)], Templates = [new($"{GENERATE_IMAGE_FN}.fn")] } }, - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.ImageReader, + Name = UtilityName.ImageReader, Content = new UtilityContent { Functions = [new(READ_IMAGE_FN)], Templates = [new($"{READ_IMAGE_FN}.fn")] } }, - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.ImageEditor, + Name = UtilityName.ImageEditor, Content = new UtilityContent { Functions = [new(EDIT_IMAGE_FN)], Templates = [new($"{EDIT_IMAGE_FN}.fn")] } }, - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.PdfReader, + Name = UtilityName.PdfReader, Content = new UtilityContent { Functions = [new(READ_PDF_FN)], diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs index cf9f77f2..049f4718 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs @@ -16,9 +16,9 @@ public class HttpHandlerHook : AgentHookBase public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.HttpHandler, + Name = UtilityName.HttpHandler, Content = new UtilityContent { Functions = [new(HTTP_HANDLER_FN)], diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs index 01c6ffd6..8988c241 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs @@ -14,9 +14,9 @@ public class KnowledgeBaseAgentHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.KnowledgeRetrieval, + Name = UtilityName.KnowledgeRetrieval, Content = new UtilityContent { Functions = [new(KNOWLEDGE_RETRIEVAL_FN)], diff --git a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs index 7c37ef8f..2b098b78 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs @@ -34,9 +34,9 @@ public class PlannerAgentHook : AgentHookBase public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.TwoStagePlanner, + Name = UtilityName.TwoStagePlanner, Content = new UtilityContent { Functions = [ diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs index 24c803aa..0ad432b0 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs @@ -19,38 +19,35 @@ public class SqlDriverAgentHook : AgentHookBase, IAgentHook public override void OnAgentLoaded(Agent agent) { var dbType = SqlDriverHelper.GetDatabaseType(_services); - var promptData = new Dictionary - { - { "db_type", dbType } - }; + agent.TemplateDict["db_type"] = dbType; - var utilityLoads = new List + var utilityLoads = new List { - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.SqlTableDefinition, + Name = UtilityName.SqlTableDefinition, Content = new UtilityContent { Functions = new List { new(SQL_TABLE_DEFINITION_FN) }, - Templates = new List { new($"{SQL_TABLE_DEFINITION_FN}.fn", promptData) } + Templates = new List { new($"{SQL_TABLE_DEFINITION_FN}.fn") } } }, - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.SqlDictionaryLookup, + Name = UtilityName.SqlDictionaryLookup, Content = new UtilityContent { Functions = new List { new(VERIFY_DICTIONARY_TERM_FN) }, - Templates = new List { new($"{VERIFY_DICTIONARY_TERM_FN}.fn", promptData) } + Templates = new List { new($"{VERIFY_DICTIONARY_TERM_FN}.fn") } } }, - new AgentUtilityLoadModel + new AgentUtility { - UtilityName = UtilityName.SqlExecutor, + Name = UtilityName.SqlExecutor, Content = new UtilityContent { Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, - Templates = new List { new($"sql_executor.fn", promptData) } + Templates = new List { new($"sql_executor.fn") } } } }; diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs index 9fce1d20..664a4e80 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs @@ -16,9 +16,9 @@ namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks public override void OnAgentLoaded(Agent agent) { - var utilityLoad = new AgentUtilityLoadModel + var utilityLoad = new AgentUtility { - UtilityName = UtilityName.OutboundPhoneCall, + Name = UtilityName.OutboundPhoneCall, Content = new UtilityContent { Functions = [new(OUTBOUND_PHONE_CALL_FN)], From b7c619750ec68a57f34b3e17b67fed6106bb78bb Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 20 Nov 2024 17:10:38 -0600 Subject: [PATCH 008/100] refine agent utility --- .../Agents/AgentHookBase.cs | 25 ++++---- .../BotSharp.Abstraction/Agents/IAgentHook.cs | 4 +- .../Agents/Models/Agent.cs | 6 +- .../Agents/Models/AgentUtility.cs | 29 +++++---- .../Routing/IRoutingContext.cs | 1 + .../Users/Enums/UserAction.cs | 3 + .../Users/Enums/UserPermission.cs | 3 + .../Agents/Services/AgentService.LoadAgent.cs | 1 + .../Services/AgentService.UpdateAgent.cs | 2 +- .../FileRepository/FileRepository.Agent.cs | 2 +- .../BotSharp.Core/Routing/RoutingContext.cs | 14 ++++- .../ViewModels/Agents/AgentCreationModel.cs | 2 +- .../ViewModels/Agents/AgentUpdateModel.cs | 4 +- .../ViewModels/Agents/AgentViewModel.cs | 2 +- .../Hooks/AudioHandlerHook.cs | 8 +-- .../Hooks/EmailHandlerHook.cs | 8 +-- .../Hooks/ExcelHandlerHook.cs | 8 +-- .../Hooks/FileHandlerHook.cs | 29 +++------ .../Hooks/HttpHandlerHook.cs | 8 +-- .../Hooks/KnowledgeBaseAgentHook.cs | 8 +-- .../Collections/AgentDocument.cs | 2 +- .../Models/AgentUtilityMongoElement.cs | 60 +++++++++++++++++++ .../Repository/MongoRepository.Agent.cs | 54 ++++++----------- .../Hooks/PlannerAgentHook.cs | 24 ++++---- .../agent.json | 34 ++++++++++- .../Hooks/SqlDriverAgentHook.cs | 22 ++----- .../Hooks/OutboundPhoneCallHandlerHook.cs | 8 +-- 27 files changed, 205 insertions(+), 166 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 7214a3d5..f727403d 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -57,9 +57,9 @@ public abstract class AgentHookBase : IAgentHook { } - public virtual void OnLoadAgentUtility(Agent agent, IEnumerable utilities) + public virtual void OnAgentUtilityloaded(Agent agent) { - if (agent.Type == AgentType.Routing || utilities.IsNullOrEmpty()) return; + if (agent.Type == AgentType.Routing) return; var conv = _services.GetRequiredService(); var isConvMode = conv.IsConversationMode(); @@ -68,16 +68,13 @@ public abstract class AgentHookBase : IAgentHook var render = _services.GetRequiredService(); agent.Functions ??= []; - var agentUtilities = agent.Utilities ?? []; + agent.Utilities ??= []; - foreach (var utillity in utilities) + foreach (var utillity in agent.Utilities) { - if (utillity.Name.IsNullOrEmpty() || utillity.Content == null) continue; + if (utillity == null || string.IsNullOrWhiteSpace(utillity.Name)) continue; - var isEnabled = agentUtilities.Contains(utillity.Name); - if (!isEnabled) continue; - - var (fns, prompts) = GetUtilityContent(utillity.Content); + var (fns, prompts) = GetUtilityContent(utillity); if (!fns.IsNullOrEmpty()) { @@ -94,7 +91,7 @@ public abstract class AgentHookBase : IAgentHook } } - private (IEnumerable, IEnumerable) GetUtilityContent(UtilityContent content) + private (IEnumerable, IEnumerable) GetUtilityContent(AgentUtility utility) { var db = _services.GetRequiredService(); var render = _services.GetRequiredService(); @@ -108,15 +105,15 @@ public abstract class AgentHookBase : IAgentHook return (fns, prompts); } - if (!content.Functions.IsNullOrEmpty()) + if (!utility.Functions.IsNullOrEmpty()) { - var functionNames = content.Functions?.Select(x => x.Name)?.ToList() ?? []; + var functionNames = utility.Functions?.Select(x => x.Name)?.ToList() ?? []; fns = agent?.Functions?.Where(x => functionNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.ToList() ?? []; } - if (!content.Templates.IsNullOrEmpty()) + if (!utility.Templates.IsNullOrEmpty()) { - foreach (var template in content.Templates) + foreach (var template in utility.Templates) { var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(template.Name))?.Content ?? string.Empty; if (string.IsNullOrWhiteSpace(prompt)) continue; diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs index d60f348c..ceb212bf 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs @@ -25,12 +25,12 @@ public interface IAgentHook bool OnSamplesLoaded(List samples); + void OnAgentUtilityloaded(Agent agent); + /// /// Triggered when agent is loaded completely. /// /// /// void OnAgentLoaded(Agent agent); - - void OnLoadAgentUtility(Agent agent, IEnumerable utilities); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs index 43f0f5ba..63594d08 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs @@ -93,7 +93,7 @@ public class Agent /// /// Agent utilities /// - public List Utilities { get; set; } = new(); + public List Utilities { get; set; } = new(); /// /// Inherit from agent @@ -173,9 +173,9 @@ public class Agent return this; } - public Agent SetUtilities(List utilities) + public Agent SetUtilities(List utilities) { - Utilities = utilities ?? new List(); + Utilities = utilities ?? new List(); return this; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs index 672c9f3d..1617e173 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs @@ -2,33 +2,32 @@ namespace BotSharp.Abstraction.Agents.Models; public class AgentUtility { + [JsonPropertyName("name")] public string Name { get; set; } - public UtilityContent Content { get; set; } + + [JsonPropertyName("functions")] + public IEnumerable Functions { get; set; } = []; + + [JsonPropertyName("templates")] + public IEnumerable Templates { get; set; } = []; public AgentUtility() { } - public AgentUtility(string utilityName, UtilityContent content) + public AgentUtility( + string name, + IEnumerable? functions = null, + IEnumerable? templates = null) { - Name = utilityName; - Content = content; + Name = name; + Functions = functions ?? []; + Templates = templates ?? []; } } -public class UtilityContent -{ - public IEnumerable Functions { get; set; } = []; - public IEnumerable Templates { get; set; } = []; - - public UtilityContent() - { - - } -} - public class UtilityFunction : UtilityBase { public UtilityFunction() diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/IRoutingContext.cs b/src/Infrastructure/BotSharp.Abstraction/Routing/IRoutingContext.cs index f75e8e0e..1dd9f50a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Routing/IRoutingContext.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Routing/IRoutingContext.cs @@ -6,6 +6,7 @@ public interface IRoutingContext string FirstGoalAgentId(); bool ContainsAgentId(string agentId); string OriginAgentId { get; } + string EntryAgentId { get; } string ConversationId { get; } string MessageId { get; } void SetMessageId(string conversationId, string messageId); diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserAction.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserAction.cs index b565a260..b702ea01 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserAction.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserAction.cs @@ -1,5 +1,8 @@ namespace BotSharp.Abstraction.Users.Enums; +/// +/// User actions on agent level +/// public static class UserAction { public const string Edit = "edit"; diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserPermission.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserPermission.cs index 58dfc186..64212fe4 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserPermission.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Enums/UserPermission.cs @@ -1,5 +1,8 @@ namespace BotSharp.Abstraction.Users.Enums; +/// +/// User permission +/// public static class UserPermission { public const string CreateAgent = "create-agent"; diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs index f0a864a2..45121830 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs @@ -67,6 +67,7 @@ public partial class AgentService hook.OnSamplesLoaded(agent.Samples); } + hook.OnAgentUtilityloaded(agent); hook.OnAgentLoaded(agent); } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs index 18afb27f..1a333119 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs @@ -37,7 +37,7 @@ public partial class AgentService record.Templates = agent.Templates ?? new List(); record.Responses = agent.Responses ?? new List(); record.Samples = agent.Samples ?? new List(); - record.Utilities = agent.Utilities ?? new List(); + record.Utilities = agent.Utilities ?? new List(); if (agent.LlmConfig != null && !agent.LlmConfig.IsInherit) { record.LlmConfig = agent.LlmConfig; diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs index 7f545527..de676d28 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs @@ -151,7 +151,7 @@ namespace BotSharp.Core.Repository File.WriteAllText(agentFile, json); } - private void UpdateAgentUtilities(string agentId, List utilities) + private void UpdateAgentUtilities(string agentId, List utilities) { if (utilities == null) return; diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs index 5c1f1903..3cb1eac9 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs @@ -41,7 +41,8 @@ public class RoutingContext : IRoutingContext var agentService = _services.GetRequiredService(); _routerAgentIds = agentService.GetAgents(new AgentFilter { - Type = AgentType.Routing + Type = AgentType.Routing, + Pager = new Pagination { Size = 20 } }).Result.Items.Select(x => x.Id).ToArray(); } @@ -49,6 +50,17 @@ public class RoutingContext : IRoutingContext } } + /// + /// Entry agent + /// + public string EntryAgentId + { + get + { + return _stack.LastOrDefault() ?? string.Empty; + } + } + public bool IsEmpty => !_stack.Any(); public string GetCurrentAgentId() diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs index 78f75833..4a41a8d8 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs @@ -48,7 +48,7 @@ public class AgentCreationModel /// Combine different Agents together to form a Profile. /// public List Profiles { get; set; } = new(); - public List Utilities { get; set; } = new(); + public List Utilities { get; set; } = new(); public List RoutingRules { get; set; } = new(); public AgentLlmConfig? LlmConfig { get; set; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs index d64530c6..08e7c85c 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs @@ -34,7 +34,7 @@ public class AgentUpdateModel /// /// Utilities /// - public List? Utilities { get; set; } + public List? Utilities { get; set; } /// /// Functions @@ -81,7 +81,7 @@ public class AgentUpdateModel Templates = Templates ?? new List(), Functions = Functions ?? new List(), Responses = Responses ?? new List(), - Utilities = Utilities ?? new List(), + Utilities = Utilities ?? new List(), LlmConfig = LlmConfig }; diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs index ca814177..066cc030 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs @@ -20,7 +20,7 @@ public class AgentViewModel public List Functions { get; set; } public List Responses { get; set; } public List Samples { get; set; } - public List Utilities { get; set; } + public List Utilities { get; set; } [JsonPropertyName("is_public")] public bool IsPublic { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs index 547cd7c3..20565679 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs @@ -18,14 +18,10 @@ public class AudioHandlerHook : AgentHookBase, IAgentHook var utilityLoad = new AgentUtility { Name = UtilityName.AudioHandler, - Content = new UtilityContent - { - Functions = [new(HANDLER_AUDIO)], - Templates = [new($"{HANDLER_AUDIO}.fn")] - } + Functions = [new(HANDLER_AUDIO)], + Templates = [new($"{HANDLER_AUDIO}.fn")] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs index 4bee4bff..ae38e329 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs @@ -21,14 +21,10 @@ public class EmailHandlerHook : AgentHookBase var utilityLoad = new AgentUtility { Name = UtilityName.EmailHandler, - Content = new UtilityContent - { - Functions = [new(EMAIL_READER_FN), new(EMAIL_SENDER_FN)], - Templates = [new($"{EMAIL_READER_FN}.fn"), new($"{EMAIL_SENDER_FN}.fn")] - } + Functions = [new(EMAIL_READER_FN), new(EMAIL_SENDER_FN)], + Templates = [new($"{EMAIL_READER_FN}.fn"), new($"{EMAIL_SENDER_FN}.fn")] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs index 453386ed..de02c18a 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs @@ -15,14 +15,10 @@ public class ExcelHandlerHook : AgentHookBase, IAgentHook var utilityLoad = new AgentUtility { Name = UtilityName.ExcelHandler, - Content = new UtilityContent - { - Functions = [new(HANDLER_EXCEL)], - Templates = [new($"{HANDLER_EXCEL}.fn")] - } + Functions = [new(HANDLER_EXCEL)], + Templates = [new($"{HANDLER_EXCEL}.fn")] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs index f43c9a1d..cc0d0653 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs @@ -20,42 +20,29 @@ public class FileHandlerHook : AgentHookBase, IAgentHook new AgentUtility { Name = UtilityName.ImageGenerator, - Content = new UtilityContent - { - Functions = [new(GENERATE_IMAGE_FN)], - Templates = [new($"{GENERATE_IMAGE_FN}.fn")] - } + Functions = [new(GENERATE_IMAGE_FN)], + Templates = [new($"{GENERATE_IMAGE_FN}.fn")] }, new AgentUtility { Name = UtilityName.ImageReader, - Content = new UtilityContent - { - Functions = [new(READ_IMAGE_FN)], - Templates = [new($"{READ_IMAGE_FN}.fn")] - } + Functions = [new(READ_IMAGE_FN)], + Templates = [new($"{READ_IMAGE_FN}.fn")] }, new AgentUtility { Name = UtilityName.ImageEditor, - Content = new UtilityContent - { - Functions = [new(EDIT_IMAGE_FN)], - Templates = [new($"{EDIT_IMAGE_FN}.fn")] - } + Functions = [new(EDIT_IMAGE_FN)], + Templates = [new($"{EDIT_IMAGE_FN}.fn")] }, new AgentUtility { Name = UtilityName.PdfReader, - Content = new UtilityContent - { - Functions = [new(READ_PDF_FN)], - Templates = [new($"{READ_PDF_FN}.fn")] - } + Functions = [new(READ_PDF_FN)], + Templates = [new($"{READ_PDF_FN}.fn")] } }; - base.OnLoadAgentUtility(agent, utilityLoads); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs index 049f4718..e30fc329 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs @@ -19,14 +19,10 @@ public class HttpHandlerHook : AgentHookBase var utilityLoad = new AgentUtility { Name = UtilityName.HttpHandler, - Content = new UtilityContent - { - Functions = [new(HTTP_HANDLER_FN)], - Templates = [new($"{HTTP_HANDLER_FN}.fn")] - } + Functions = [new(HTTP_HANDLER_FN)], + Templates = [new($"{HTTP_HANDLER_FN}.fn")] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs index 8988c241..852ab0da 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs @@ -17,14 +17,10 @@ public class KnowledgeBaseAgentHook : AgentHookBase, IAgentHook var utilityLoad = new AgentUtility { Name = UtilityName.KnowledgeRetrieval, - Content = new UtilityContent - { - Functions = [new(KNOWLEDGE_RETRIEVAL_FN)], - Templates = [new($"{KNOWLEDGE_RETRIEVAL_FN}.fn")] - } + Functions = [new(KNOWLEDGE_RETRIEVAL_FN)], + Templates = [new($"{KNOWLEDGE_RETRIEVAL_FN}.fn")] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs index baa0729f..82b62b62 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs @@ -13,7 +13,7 @@ public class AgentDocument : MongoBase public List Functions { get; set; } public List Responses { get; set; } public List Samples { get; set; } - public List Utilities { get; set; } + public List Utilities { get; set; } public bool IsPublic { get; set; } public bool Disabled { get; set; } public List Profiles { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs new file mode 100644 index 00000000..0eecee90 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs @@ -0,0 +1,60 @@ +using BotSharp.Abstraction.Agents.Models; + +namespace BotSharp.Plugin.MongoStorage.Models; + +public class AgentUtilityMongoElement +{ + public string Name { get; set; } + public List Functions { get; set; } = []; + public List Templates { get; set; } = []; + + public static AgentUtilityMongoElement ToMongoElement(AgentUtility utility) + { + return new AgentUtilityMongoElement + { + Name = utility.Name, + Functions = utility.Functions?.Select(x => new UtilityFunctionMongoElement(x.Name))?.ToList() ?? [], + Templates = utility.Templates?.Select(x => new UtilityTemplateMongoElement(x.Name))?.ToList() ?? [] + }; + } + + public static AgentUtility ToDomainElement(AgentUtilityMongoElement utility) + { + return new AgentUtility + { + Name = utility.Name, + Functions = utility.Functions?.Select(x => new UtilityFunction(x.Name))?.ToList() ?? [], + Templates = utility.Templates?.Select(x => new UtilityTemplate(x.Name))?.ToList() ?? [] + }; + } +} + +public class UtilityFunctionMongoElement +{ + public string Name { get; set; } + + public UtilityFunctionMongoElement() + { + + } + + public UtilityFunctionMongoElement(string name) + { + Name = name; + } +} + +public class UtilityTemplateMongoElement +{ + public string Name { get; set; } + + public UtilityTemplateMongoElement() + { + + } + + public UtilityTemplateMongoElement(string name) + { + Name = name; + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs index d17f7f2f..3a88dc9c 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs @@ -224,13 +224,15 @@ public partial class MongoRepository _dc.Agents.UpdateOne(filter, update); } - private void UpdateAgentUtilities(string agentId, List utilities) + private void UpdateAgentUtilities(string agentId, List utilities) { if (utilities == null) return; + var elements = utilities?.Select(x => AgentUtilityMongoElement.ToMongoElement(x))?.ToList() ?? []; + var filter = Builders.Filter.Eq(x => x.Id, agentId); var update = Builders.Update - .Set(x => x.Utilities, utilities) + .Set(x => x.Utilities, elements) .Set(x => x.UpdatedTime, DateTime.UtcNow); _dc.Agents.UpdateOne(filter, update); @@ -263,7 +265,7 @@ public partial class MongoRepository .Set(x => x.Functions, agent.Functions.Select(f => FunctionDefMongoElement.ToMongoElement(f)).ToList()) .Set(x => x.Responses, agent.Responses.Select(r => AgentResponseMongoElement.ToMongoElement(r)).ToList()) .Set(x => x.Samples, agent.Samples) - .Set(x => x.Utilities, agent.Utilities) + .Set(x => x.Utilities, agent.Utilities.Select(u => AgentUtilityMongoElement.ToMongoElement(u)).ToList()) .Set(x => x.LlmConfig, AgentLlmConfigMongoElement.ToMongoElement(agent.LlmConfig)) .Set(x => x.IsPublic, agent.IsPublic) .Set(x => x.UpdatedTime, DateTime.UtcNow); @@ -406,28 +408,18 @@ public partial class MongoRepository IconUrl = x.IconUrl, Description = x.Description, Instruction = x.Instruction, - ChannelInstructions = x.ChannelInstructions? - .Select(i => ChannelInstructionMongoElement.ToMongoElement(i))? - .ToList() ?? new List(), - Templates = x.Templates? - .Select(t => AgentTemplateMongoElement.ToMongoElement(t))? - .ToList() ?? new List(), - Functions = x.Functions? - .Select(f => FunctionDefMongoElement.ToMongoElement(f))? - .ToList() ?? new List(), - Responses = x.Responses? - .Select(r => AgentResponseMongoElement.ToMongoElement(r))? - .ToList() ?? new List(), + ChannelInstructions = x.ChannelInstructions?.Select(i => ChannelInstructionMongoElement.ToMongoElement(i))?.ToList() ?? [], + Templates = x.Templates?.Select(t => AgentTemplateMongoElement.ToMongoElement(t))?.ToList() ?? [], + Functions = x.Functions?.Select(f => FunctionDefMongoElement.ToMongoElement(f))?.ToList() ?? [], + Responses = x.Responses?.Select(r => AgentResponseMongoElement.ToMongoElement(r))?.ToList() ?? [], Samples = x.Samples ?? new List(), - Utilities = x.Utilities ?? new List(), + Utilities = x.Utilities?.Select(u => AgentUtilityMongoElement.ToMongoElement(u))?.ToList() ?? [], IsPublic = x.IsPublic, Type = x.Type, InheritAgentId = x.InheritAgentId, Disabled = x.Disabled, Profiles = x.Profiles, - RoutingRules = x.RoutingRules? - .Select(r => RoutingRuleMongoElement.ToMongoElement(r))? - .ToList() ?? new List(), + RoutingRules = x.RoutingRules?.Select(r => RoutingRuleMongoElement.ToMongoElement(r))?.ToList() ?? [], LlmConfig = AgentLlmConfigMongoElement.ToMongoElement(x.LlmConfig), CreatedTime = x.CreatedDateTime, UpdatedTime = x.UpdatedDateTime @@ -505,24 +497,14 @@ public partial class MongoRepository IconUrl = agentDoc.IconUrl, Description = agentDoc.Description, Instruction = agentDoc.Instruction, - ChannelInstructions = !agentDoc.ChannelInstructions.IsNullOrEmpty() ? agentDoc.ChannelInstructions - .Select(i => ChannelInstructionMongoElement.ToDomainElement(i)) - .ToList() : new List(), - Templates = !agentDoc.Templates.IsNullOrEmpty() ? agentDoc.Templates - .Select(t => AgentTemplateMongoElement.ToDomainElement(t)) - .ToList() : new List(), - Functions = !agentDoc.Functions.IsNullOrEmpty() ? agentDoc.Functions - .Select(f => FunctionDefMongoElement.ToDomainElement(f)) - .ToList() : new List(), - Responses = !agentDoc.Responses.IsNullOrEmpty() ? agentDoc.Responses - .Select(r => AgentResponseMongoElement.ToDomainElement(r)) - .ToList() : new List(), - RoutingRules = !agentDoc.RoutingRules.IsNullOrEmpty() ? agentDoc.RoutingRules - .Select(r => RoutingRuleMongoElement.ToDomainElement(agentDoc.Id, agentDoc.Name, r)) - .ToList() : new List(), + ChannelInstructions = agentDoc.ChannelInstructions?.Select(i => ChannelInstructionMongoElement.ToDomainElement(i))?.ToList() ?? [], + Templates = agentDoc.Templates?.Select(t => AgentTemplateMongoElement.ToDomainElement(t))?.ToList() ?? [], + Functions = agentDoc.Functions?.Select(f => FunctionDefMongoElement.ToDomainElement(f)).ToList() ?? [], + Responses = agentDoc.Responses?.Select(r => AgentResponseMongoElement.ToDomainElement(r))?.ToList() ?? [], + RoutingRules = agentDoc.RoutingRules?.Select(r => RoutingRuleMongoElement.ToDomainElement(agentDoc.Id, agentDoc.Name, r))?.ToList() ?? [], LlmConfig = AgentLlmConfigMongoElement.ToDomainElement(agentDoc.LlmConfig), - Samples = agentDoc.Samples ?? new List(), - Utilities = agentDoc.Utilities ?? new List(), + Samples = agentDoc.Samples ?? [], + Utilities = agentDoc.Utilities?.Select(u => AgentUtilityMongoElement.ToDomainElement(u))?.ToList() ?? [], IsPublic = agentDoc.IsPublic, Disabled = agentDoc.Disabled, Type = agentDoc.Type, diff --git a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs index 2b098b78..60f39a7d 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs @@ -37,22 +37,18 @@ public class PlannerAgentHook : AgentHookBase var utilityLoad = new AgentUtility { Name = UtilityName.TwoStagePlanner, - Content = new UtilityContent - { - Functions = [ - new(PRIMARY_STAGE_FN), - new(SECONDARY_STAGE_FN), - new(SUMMARY_FN) - ], - Templates = [ - new($"{PRIMARY_STAGE_FN}.fn"), - new($"{SECONDARY_STAGE_FN}.fn"), - new($"{SUMMARY_FN}.fn") - ] - } + Functions = [ + new(PRIMARY_STAGE_FN), + new(SECONDARY_STAGE_FN), + new(SUMMARY_FN) + ], + Templates = [ + new($"{PRIMARY_STAGE_FN}.fn"), + new($"{SECONDARY_STAGE_FN}.fn"), + new($"{SUMMARY_FN}.fn") + ] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json index a90ef2ed..c3db4f42 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json @@ -9,7 +9,39 @@ "disabled": false, "isPublic": true, "profiles": [ "planning" ], - "utilities": [ "two-stage-planner", "sql-dictionary-lookup", "excel-handler" ], + "utilities": [ + { + "name": "two-stage-planner", + "functions": [ + { "name": "plan_primary_stage" }, + { "name": "plan_secondary_stage" }, + { "name": "plan_summary" } + ], + "templates": [ + { "name": "plan_primary_stage.fn" }, + { "name": "plan_secondary_stage.fn" }, + { "name": "plan_summary.fn" } + ] + }, + { + "name": "sql-dictionary-lookup", + "functions": [ + { "name": "verify_dictionary_term" } + ], + "templates": [ + { "name": "verify_dictionary_term.fn" } + ] + }, + { + "name": "excel-handler", + "functions": [ + { "name": "handle_excel_request" } + ], + "templates": [ + { "name": "handle_excel_request.fn" } + ] + } + ], "llmConfig": { "provider": "openai", "model": "gpt-4o", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs index 0ad432b0..c64e70f0 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs @@ -26,33 +26,23 @@ public class SqlDriverAgentHook : AgentHookBase, IAgentHook new AgentUtility { Name = UtilityName.SqlTableDefinition, - Content = new UtilityContent - { - Functions = new List { new(SQL_TABLE_DEFINITION_FN) }, - Templates = new List { new($"{SQL_TABLE_DEFINITION_FN}.fn") } - } + Functions = [new(SQL_TABLE_DEFINITION_FN)], + Templates = [new($"{SQL_TABLE_DEFINITION_FN}.fn")] }, new AgentUtility { Name = UtilityName.SqlDictionaryLookup, - Content = new UtilityContent - { - Functions = new List { new(VERIFY_DICTIONARY_TERM_FN) }, - Templates = new List { new($"{VERIFY_DICTIONARY_TERM_FN}.fn") } - } + Functions = [new(VERIFY_DICTIONARY_TERM_FN)], + Templates = [new($"{VERIFY_DICTIONARY_TERM_FN}.fn")] }, new AgentUtility { Name = UtilityName.SqlExecutor, - Content = new UtilityContent - { - Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, - Templates = new List { new($"sql_executor.fn") } - } + Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, + Templates = new List { new($"sql_executor.fn") } } }; - base.OnLoadAgentUtility(agent, utilityLoads); base.OnAgentLoaded(agent); } } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs index 664a4e80..84f0d387 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs @@ -19,14 +19,10 @@ namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks var utilityLoad = new AgentUtility { Name = UtilityName.OutboundPhoneCall, - Content = new UtilityContent - { - Functions = [new(OUTBOUND_PHONE_CALL_FN)], - Templates = [new($"{OUTBOUND_PHONE_CALL_FN}.fn")] - } + Functions = [new(OUTBOUND_PHONE_CALL_FN)], + Templates = [new($"{OUTBOUND_PHONE_CALL_FN}.fn")] }; - base.OnLoadAgentUtility(agent, [utilityLoad]); base.OnAgentLoaded(agent); } } From 970c449247a981d6af48cfc5233ab8e33e244bc0 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 20 Nov 2024 17:57:44 -0600 Subject: [PATCH 009/100] add merge utility --- .../Agents/Models/Agent.cs | 14 ++++++++++++-- .../Services/AgentService.UpdateAgent.cs | 19 ++++++++++--------- .../FileRepository/FileRepository.Agent.cs | 6 ++++-- .../ViewModels/Agents/AgentCreationModel.cs | 4 ++++ .../ViewModels/Agents/AgentUpdateModel.cs | 4 ++++ .../ViewModels/Agents/AgentViewModel.cs | 7 +++++-- .../Collections/AgentDocument.cs | 5 +++-- .../Repository/MongoRepository.Agent.cs | 9 ++++++--- .../agent.json | 1 + 9 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs index 63594d08..e9fd7c5e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs @@ -87,8 +87,12 @@ public class Agent /// /// Profile by channel /// - public List Profiles { get; set; } - = new List(); + public List Profiles { get; set; } = new(); + + /// + /// Merge utilities from entry agent + /// + public bool MergeUtility { get; set; } /// /// Agent utilities @@ -215,6 +219,12 @@ public class Agent return this; } + public Agent SetMergeUtility(bool merge) + { + MergeUtility = merge; + return this; + } + public Agent SetAgentType(string type) { Type = type; diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs index 1a333119..f871a2fe 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs @@ -1,5 +1,4 @@ using BotSharp.Abstraction.Repositories.Enums; -using BotSharp.Abstraction.Routing.Models; using BotSharp.Abstraction.Users.Enums; using BotSharp.Abstraction.Users.Models; using System.IO; @@ -28,16 +27,17 @@ public partial class AgentService record.Description = agent.Description ?? string.Empty; record.IsPublic = agent.IsPublic; record.Disabled = agent.Disabled; + record.MergeUtility = agent.MergeUtility; record.Type = agent.Type; - record.Profiles = agent.Profiles ?? new List(); - record.RoutingRules = agent.RoutingRules ?? new List(); + record.Profiles = agent.Profiles ?? []; + record.RoutingRules = agent.RoutingRules ?? []; record.Instruction = agent.Instruction ?? string.Empty; - record.ChannelInstructions = agent.ChannelInstructions ?? new List(); - record.Functions = agent.Functions ?? new List(); - record.Templates = agent.Templates ?? new List(); - record.Responses = agent.Responses ?? new List(); - record.Samples = agent.Samples ?? new List(); - record.Utilities = agent.Utilities ?? new List(); + record.ChannelInstructions = agent.ChannelInstructions ?? []; + record.Functions = agent.Functions ?? []; + record.Templates = agent.Templates ?? []; + record.Responses = agent.Responses ?? []; + record.Samples = agent.Samples ?? []; + record.Utilities = agent.Utilities ?? []; if (agent.LlmConfig != null && !agent.LlmConfig.IsInherit) { record.LlmConfig = agent.LlmConfig; @@ -90,6 +90,7 @@ public partial class AgentService .SetDescription(foundAgent.Description) .SetIsPublic(foundAgent.IsPublic) .SetDisabled(foundAgent.Disabled) + .SetMergeUtility(foundAgent.MergeUtility) .SetAgentType(foundAgent.Type) .SetProfiles(foundAgent.Profiles) .SetRoutingRules(foundAgent.RoutingRules) diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs index de676d28..07915917 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs @@ -55,7 +55,7 @@ namespace BotSharp.Core.Repository UpdateAgentLlmConfig(agent.Id, agent.LlmConfig); break; case AgentField.Utility: - UpdateAgentUtilities(agent.Id, agent.Utilities); + UpdateAgentUtilities(agent.Id, agent.MergeUtility, agent.Utilities); break; case AgentField.All: UpdateAgentAllFields(agent); @@ -151,13 +151,14 @@ namespace BotSharp.Core.Repository File.WriteAllText(agentFile, json); } - private void UpdateAgentUtilities(string agentId, List utilities) + private void UpdateAgentUtilities(string agentId, bool mergeUtility, List utilities) { if (utilities == null) return; var (agent, agentFile) = GetAgentFromFile(agentId); if (agent == null) return; + agent.MergeUtility = mergeUtility; agent.Utilities = utilities; agent.UpdatedDateTime = DateTime.UtcNow; var json = JsonSerializer.Serialize(agent, _options); @@ -291,6 +292,7 @@ namespace BotSharp.Core.Repository agent.Description = inputAgent.Description; agent.IsPublic = inputAgent.IsPublic; agent.Disabled = inputAgent.Disabled; + agent.MergeUtility = inputAgent.MergeUtility; agent.Type = inputAgent.Type; agent.Profiles = inputAgent.Profiles; agent.Utilities = inputAgent.Utilities; diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs index 4a41a8d8..32b3fdce 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs @@ -48,6 +48,9 @@ public class AgentCreationModel /// Combine different Agents together to form a Profile. /// public List Profiles { get; set; } = new(); + + public bool MergeUtility { get; set; } + public List Utilities { get; set; } = new(); public List RoutingRules { get; set; } = new(); public AgentLlmConfig? LlmConfig { get; set; } @@ -68,6 +71,7 @@ public class AgentCreationModel IsPublic = IsPublic, Type = Type, Disabled = Disabled, + MergeUtility = MergeUtility, Profiles = Profiles, RoutingRules = RoutingRules?.Select(x => RoutingRuleUpdateModel.ToDomainElement(x))?.ToList() ?? new List(), LlmConfig = LlmConfig diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs index 08e7c85c..30308c9f 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs @@ -31,6 +31,9 @@ public class AgentUpdateModel /// public List? Samples { get; set; } + [JsonPropertyName("merge_utility")] + public bool MergeUtility { get; set; } + /// /// Utilities /// @@ -73,6 +76,7 @@ public class AgentUpdateModel Description = Description ?? string.Empty, IsPublic = IsPublic, Disabled = Disabled, + MergeUtility = MergeUtility, Type = Type, Profiles = Profiles ?? new List(), RoutingRules = RoutingRules?.Select(x => RoutingRuleUpdateModel.ToDomainElement(x))?.ToList() ?? new List(), diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs index 066cc030..46dea0af 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs @@ -20,6 +20,9 @@ public class AgentViewModel public List Functions { get; set; } public List Responses { get; set; } public List Samples { get; set; } + + [JsonPropertyName("merge_utility")] + public bool MergeUtility { get; set; } public List Utilities { get; set; } [JsonPropertyName("is_public")] @@ -33,8 +36,7 @@ public class AgentViewModel [JsonPropertyName("icon_url")] public string IconUrl { get; set; } - public List Profiles { get; set; } - = new List(); + public List Profiles { get; set; } = new(); [JsonPropertyName("routing_rules")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] @@ -74,6 +76,7 @@ public class AgentViewModel Utilities = agent.Utilities, IsPublic= agent.IsPublic, Disabled = agent.Disabled, + MergeUtility = agent.MergeUtility, IconUrl = agent.IconUrl, Profiles = agent.Profiles ?? new List(), RoutingRules = agent.RoutingRules, diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs index 82b62b62..76fee1b3 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs @@ -8,14 +8,15 @@ public class AgentDocument : MongoBase public string? InheritAgentId { get; set; } public string? IconUrl { get; set; } public string Instruction { get; set; } + public bool IsPublic { get; set; } + public bool Disabled { get; set; } + public bool MergeUtility { get; set; } public List ChannelInstructions { get; set; } public List Templates { get; set; } public List Functions { get; set; } public List Responses { get; set; } public List Samples { get; set; } public List Utilities { get; set; } - public bool IsPublic { get; set; } - public bool Disabled { get; set; } public List Profiles { get; set; } public List RoutingRules { get; set; } public AgentLlmConfigMongoElement? LlmConfig { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs index 3a88dc9c..7f216b6d 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs @@ -2,7 +2,6 @@ using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Repositories.Filters; using BotSharp.Abstraction.Routing.Models; -using MongoDB.Driver; namespace BotSharp.Plugin.MongoStorage.Repository; @@ -57,7 +56,7 @@ public partial class MongoRepository UpdateAgentLlmConfig(agent.Id, agent.LlmConfig); break; case AgentField.Utility: - UpdateAgentUtilities(agent.Id, agent.Utilities); + UpdateAgentUtilities(agent.Id, agent.MergeUtility, agent.Utilities); break; case AgentField.All: UpdateAgentAllFields(agent); @@ -224,7 +223,7 @@ public partial class MongoRepository _dc.Agents.UpdateOne(filter, update); } - private void UpdateAgentUtilities(string agentId, List utilities) + private void UpdateAgentUtilities(string agentId, bool mergeUtility, List utilities) { if (utilities == null) return; @@ -232,6 +231,7 @@ public partial class MongoRepository var filter = Builders.Filter.Eq(x => x.Id, agentId); var update = Builders.Update + .Set(x => x.MergeUtility, mergeUtility) .Set(x => x.Utilities, elements) .Set(x => x.UpdatedTime, DateTime.UtcNow); @@ -256,6 +256,7 @@ public partial class MongoRepository .Set(x => x.Name, agent.Name) .Set(x => x.Description, agent.Description) .Set(x => x.Disabled, agent.Disabled) + .Set(x => x.MergeUtility, agent.MergeUtility) .Set(x => x.Type, agent.Type) .Set(x => x.Profiles, agent.Profiles) .Set(x => x.RoutingRules, agent.RoutingRules.Select(r => RoutingRuleMongoElement.ToMongoElement(r)).ToList()) @@ -418,6 +419,7 @@ public partial class MongoRepository Type = x.Type, InheritAgentId = x.InheritAgentId, Disabled = x.Disabled, + MergeUtility = x.MergeUtility, Profiles = x.Profiles, RoutingRules = x.RoutingRules?.Select(r => RoutingRuleMongoElement.ToMongoElement(r))?.ToList() ?? [], LlmConfig = AgentLlmConfigMongoElement.ToMongoElement(x.LlmConfig), @@ -507,6 +509,7 @@ public partial class MongoRepository Utilities = agentDoc.Utilities?.Select(u => AgentUtilityMongoElement.ToDomainElement(u))?.ToList() ?? [], IsPublic = agentDoc.IsPublic, Disabled = agentDoc.Disabled, + MergeUtility = agentDoc.MergeUtility, Type = agentDoc.Type, InheritAgentId = agentDoc.InheritAgentId, Profiles = agentDoc.Profiles, diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json index c3db4f42..fff27f86 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json @@ -9,6 +9,7 @@ "disabled": false, "isPublic": true, "profiles": [ "planning" ], + "mergeUtility": true, "utilities": [ { "name": "two-stage-planner", From 7786466ab71f5d5a695ff04602ef167770410cfd Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Thu, 21 Nov 2024 04:25:17 +0000 Subject: [PATCH 010/100] CheckMessageExists --- .../Infrastructures/Events/IEventPublisher.cs | 2 + .../Infrastructures/Events/RedisPublisher.cs | 92 ++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs index e242937e..68ceebd2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs @@ -13,4 +13,6 @@ public interface IEventPublisher Task PublishAsync(string channel, string message); Task ReDispatchAsync(string channel, int count = 10, string order = "asc"); + + Task ReDispatchPendingAsync(string channel, string group, int count = 10); } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index 08ce275c..2ff585d6 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -23,15 +23,54 @@ public class RedisPublisher : IEventPublisher public async Task PublishAsync(string channel, string message) { var db = _redis.GetDatabase(); + + if (CheckMessageExists(db, channel, "message", message)) + { + _logger.LogError($"The message already exists {channel} {message}"); + return; + } + // Add a message to the stream, keeping only the latest 1 million messages - await db.StreamAddAsync(channel, + var messageId = await db.StreamAddAsync(channel, [ new NameValueEntry("message", message), new NameValueEntry("timestamp", DateTime.UtcNow.ToString("o")) ], maxLength: 1000 * 10000); - _logger.LogInformation($"Published message {channel} {message}"); + _logger.LogInformation($"Published message {channel} {message} ({messageId})"); + } + + private bool CheckMessageExists(IDatabase db, string streamName, string fieldName, string desiredValue) + { + // Define the range to fetch all messages + RedisValue start = "-"; // Start from the smallest ID + RedisValue end = "+"; // End at the largest ID + int count = 10; // Number of messages to retrieve + + // Fetch the latest 10 messages + var streamEntries = db.StreamRange(streamName, start, end, count, Order.Descending); + + if (streamEntries.Length == 0) + { + return false; + } + + // Check if any message contains the specific field value + bool exists = streamEntries.Any(entry => + { + // Each entry contains a collection of Name-Value pairs + foreach (var nameValue in entry.Values) + { + if (nameValue.Name == fieldName && nameValue.Value == desiredValue) + { + return true; + } + } + return false; + }); + + return exists; } public async Task ReDispatchAsync(string channel, int count = 10, string order = "asc") @@ -58,4 +97,53 @@ public class RedisPublisher : IEventPublisher } } } + + public async Task ReDispatchPendingAsync(string channel, string group, int count = 10) + { + var db = _redis.GetDatabase(); + + // Step 1: Fetch pending messages using XPending + try + { + var pendingInfo = await db.StreamPendingAsync(channel, group); + + if (pendingInfo.PendingMessageCount == 0) + { + Console.WriteLine("No pending messages found."); + return; + } + + // Step 2: Fetch pending message IDs + List pendingMessages = new List(); + foreach (var consumer in pendingInfo.Consumers) + { + var pendingMessageIds = await db.StreamPendingMessagesAsync(channel, group, count: consumer.PendingMessageCount, consumerName: consumer.Name); + var messageIds = pendingMessageIds.Select(x => x.MessageId).ToArray(); + // Step 3: Use XClaim to fetch the actual message + var claimedMessages = await db.StreamClaimAsync(channel, group, consumer.Name, minIdleTimeInMs: 60 * 1000, messageIds); + pendingMessages.AddRange(claimedMessages); + + await db.StreamAcknowledgeAsync(channel, group, messageIds); + } + + // Step 4: Process the messages + foreach (var message in pendingMessages) + { + /*if (message.IsNull) + { + await db.StreamAcknowledgeAsync(channel, group, [message.Id]); + } + else + { + var messageId = await db.StreamAddAsync(channel, "message", message.Values[0].Value); + _logger.LogWarning($"ReDispatched message: {channel} {message.Values[0].Value} ({messageId})"); + await db.StreamDeleteAsync(channel, [messageId]); + }*/ + } + } + catch (RedisException ex) + { + Console.WriteLine($"Redis error: {ex.Message}"); + } + } } From 91e52c554785a8629274d600b95583fbd0beb0a6 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 20 Nov 2024 23:46:09 -0600 Subject: [PATCH 011/100] add disabled --- .../Agents/AgentHookBase.cs | 83 +++++++++---------- .../Agents/Models/AgentUtility.cs | 6 +- .../Models/AgentUtilityMongoElement.cs | 3 + .../agent.json | 34 +------- 4 files changed, 45 insertions(+), 81 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index f727403d..3cfc7011 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -2,6 +2,7 @@ using BotSharp.Abstraction.Agents.Settings; using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Repositories; +using BotSharp.Abstraction.Routing; using Microsoft.Extensions.DependencyInjection; using System.Data; @@ -65,63 +66,59 @@ public abstract class AgentHookBase : IAgentHook var isConvMode = conv.IsConversationMode(); if (!isConvMode) return; - var render = _services.GetRequiredService(); - agent.Functions ??= []; agent.Utilities ??= []; - foreach (var utillity in agent.Utilities) + var (functions, templates) = GetUtilityContent(agent); + + agent.Functions.AddRange(functions); + foreach (var prompt in templates) { - if (utillity == null || string.IsNullOrWhiteSpace(utillity.Name)) continue; - - var (fns, prompts) = GetUtilityContent(utillity); - - if (!fns.IsNullOrEmpty()) - { - agent.Functions.AddRange(fns); - } - - if (!prompts.IsNullOrEmpty()) - { - foreach (var prompt in prompts) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - } + agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; } } - private (IEnumerable, IEnumerable) GetUtilityContent(AgentUtility utility) + private (IEnumerable, IEnumerable) GetUtilityContent(Agent agent) { var db = _services.GetRequiredService(); - var render = _services.GetRequiredService(); + var (functionNames, templateNames) = GetUniqueContent(agent.Utilities); - var fns = new List(); - var prompts = new List(); - - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - if (agent == null) + if (agent.MergeUtility) { - return (fns, prompts); - } - - if (!utility.Functions.IsNullOrEmpty()) - { - var functionNames = utility.Functions?.Select(x => x.Name)?.ToList() ?? []; - fns = agent?.Functions?.Where(x => functionNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.ToList() ?? []; - } - - if (!utility.Templates.IsNullOrEmpty()) - { - foreach (var template in utility.Templates) + var routing = _services.GetRequiredService(); + var entryAgentId = routing.EntryAgentId; + if (!string.IsNullOrEmpty(entryAgentId)) { - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(template.Name))?.Content ?? string.Empty; - if (string.IsNullOrWhiteSpace(prompt)) continue; - - prompts.Add(prompt); + var entryAgent = db.GetAgent(entryAgentId); + var (fns, tps) = GetUniqueContent(entryAgent?.Utilities); + functionNames = functionNames.Concat(fns).Distinct().ToList(); + templateNames = templateNames.Concat(tps).Distinct().ToList(); } } - return (fns, prompts); + var ua = db.GetAgent(BuiltInAgentId.UtilityAssistant); + var functions = ua?.Functions?.Where(x => functionNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.ToList() ?? []; + var templates = ua?.Templates?.Where(x => templateNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.Select(x => x.Content)?.ToList() ?? []; + return (functions, templates); + } + + private (IEnumerable, IEnumerable) GetUniqueContent(IEnumerable? utilities) + { + if (utilities.IsNullOrEmpty()) + { + return ([], []); + } + + utilities = utilities?.Where(x => !string.IsNullOrEmpty(x.Name) && !x.Disabled)?.ToList() ?? []; + var functionNames = utilities.SelectMany(x => x.Functions) + .Where(x => !string.IsNullOrEmpty(x.Name)) + .Select(x => x.Name) + .Distinct().ToList(); + var templateNames = utilities.SelectMany(x => x.Templates) + .Where(x => !string.IsNullOrEmpty(x.Name)) + .Select(x => x.Name) + .Distinct().ToList(); + + return (functionNames, templateNames); } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs index 1617e173..40828944 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs @@ -2,13 +2,9 @@ namespace BotSharp.Abstraction.Agents.Models; public class AgentUtility { - [JsonPropertyName("name")] public string Name { get; set; } - - [JsonPropertyName("functions")] + public bool Disabled { get; set; } public IEnumerable Functions { get; set; } = []; - - [JsonPropertyName("templates")] public IEnumerable Templates { get; set; } = []; public AgentUtility() diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs index 0eecee90..c05f07ef 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentUtilityMongoElement.cs @@ -5,6 +5,7 @@ namespace BotSharp.Plugin.MongoStorage.Models; public class AgentUtilityMongoElement { public string Name { get; set; } + public bool Disabled { get; set; } public List Functions { get; set; } = []; public List Templates { get; set; } = []; @@ -13,6 +14,7 @@ public class AgentUtilityMongoElement return new AgentUtilityMongoElement { Name = utility.Name, + Disabled = utility.Disabled, Functions = utility.Functions?.Select(x => new UtilityFunctionMongoElement(x.Name))?.ToList() ?? [], Templates = utility.Templates?.Select(x => new UtilityTemplateMongoElement(x.Name))?.ToList() ?? [] }; @@ -23,6 +25,7 @@ public class AgentUtilityMongoElement return new AgentUtility { Name = utility.Name, + Disabled = utility.Disabled, Functions = utility.Functions?.Select(x => new UtilityFunction(x.Name))?.ToList() ?? [], Templates = utility.Templates?.Select(x => new UtilityTemplate(x.Name))?.ToList() ?? [] }; diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json index fff27f86..d1b5eb52 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json @@ -10,39 +10,7 @@ "isPublic": true, "profiles": [ "planning" ], "mergeUtility": true, - "utilities": [ - { - "name": "two-stage-planner", - "functions": [ - { "name": "plan_primary_stage" }, - { "name": "plan_secondary_stage" }, - { "name": "plan_summary" } - ], - "templates": [ - { "name": "plan_primary_stage.fn" }, - { "name": "plan_secondary_stage.fn" }, - { "name": "plan_summary.fn" } - ] - }, - { - "name": "sql-dictionary-lookup", - "functions": [ - { "name": "verify_dictionary_term" } - ], - "templates": [ - { "name": "verify_dictionary_term.fn" } - ] - }, - { - "name": "excel-handler", - "functions": [ - { "name": "handle_excel_request" } - ], - "templates": [ - { "name": "handle_excel_request.fn" } - ] - } - ], + "utilities": [], "llmConfig": { "provider": "openai", "model": "gpt-4o", From 5d1430dddfd12c7b76e5662794b1ef8fe2b59b7b Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 21 Nov 2024 00:50:55 -0600 Subject: [PATCH 012/100] refine agent utility hook --- .../Agents/AgentHookBase.cs | 2 +- .../Agents/IAgentService.cs | 2 +- .../Agents/IAgentUtilityHook.cs | 2 +- .../Agents/Services/AgentService.cs | 6 +-- .../Controllers/AgentController.cs | 7 +-- .../AudioHandlerPlugin.cs | 1 - .../Hooks/AudioHandlerHook.cs | 27 ---------- .../Hooks/AudioHandlerUtilityHook.cs | 13 ++++- .../EmailHandlerPlugin.cs | 1 - .../Hooks/EmailHandlerHook.cs | 30 ----------- .../Hooks/EmailHandlerUtilityHook.cs | 14 ++++- .../ExcelHandlerPlugin.cs | 6 --- .../Hooks/ExcelHandlerHook.cs | 25 --------- .../Hooks/ExcelHandlerUtilityHook.cs | 13 ++++- .../FileHandlerPlugin.cs | 1 - .../Hooks/FileHandlerHook.cs | 48 ----------------- .../Hooks/FileHandlerUtilityHook.cs | 41 +++++++++++++-- .../Hooks/HttpHandlerHook.cs | 28 ---------- .../Hooks/HttpHandlerUtilityHook.cs | 13 ++++- .../HttpHandlerPlugin.cs | 1 - .../Hooks/KnowledgeBaseAgentHook.cs | 26 ---------- .../Hooks/KnowledgeBaseUtilityHook.cs | 13 ++++- .../KnowledgeBasePlugin.cs | 1 - .../Hooks/PlannerAgentHook.cs | 24 --------- .../Hooks/PlannerUtilityHook.cs | 23 ++++++++- .../Hooks/InterpreterAgentHook.cs | 51 ------------------- .../Hooks/InterpreterUtilityHook.cs | 13 ++++- .../InterpreterPlugin.cs | 1 - .../Hooks/SqlDriverAgentHook.cs | 48 ----------------- .../Hooks/SqlUtilityHook.cs | 32 ++++++++++-- .../SqlDriverPlugin.cs | 1 - .../Hooks/OutboundPhoneCallHandlerHook.cs | 29 ----------- .../OutboundPhoneCallHandlerUtilityHook.cs | 19 +++++-- .../BotSharp.Plugin.Twilio/TwilioPlugin.cs | 1 - 34 files changed, 176 insertions(+), 387 deletions(-) delete mode 100644 src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterAgentHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs delete mode 100644 src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 3cfc7011..f195591a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -54,7 +54,7 @@ public abstract class AgentHookBase : IAgentHook return true; } - public virtual void OnAgentLoaded(Agent agent) + public virtual void OnAgentLoaded(Agent agent) { } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs index 1461cc22..b8945f40 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs @@ -59,5 +59,5 @@ public interface IAgentService PluginDef GetPlugin(string agentId); - IEnumerable GetAgentUtilities(); + IEnumerable GetAgentUtilityOptions(); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentUtilityHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentUtilityHook.cs index 9d5667b8..603ec64e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentUtilityHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentUtilityHook.cs @@ -2,5 +2,5 @@ namespace BotSharp.Abstraction.Agents; public interface IAgentUtilityHook { - void AddUtilities(List utilities); + void AddUtilities(List utilities); } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.cs index a48201d8..1dd331af 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.cs @@ -57,14 +57,14 @@ public partial class AgentService : IAgentService return userAgents; } - public IEnumerable GetAgentUtilities() + public IEnumerable GetAgentUtilityOptions() { - var utilities = new List(); + var utilities = new List(); var hooks = _services.GetServices(); foreach (var hook in hooks) { hook.AddUtilities(utilities); } - return utilities.Where(x => !string.IsNullOrWhiteSpace(x)).Distinct().OrderBy(x => x).ToList(); + return utilities.Where(x => !string.IsNullOrWhiteSpace(x.Name)).OrderBy(x => x.Name).ToList(); } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs index 5ce68c2a..40c4c03f 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Users.Enums; namespace BotSharp.OpenAPI.Controllers; @@ -153,9 +154,9 @@ public class AgentController : ControllerBase return await _agentService.DeleteAgent(agentId); } - [HttpGet("/agent/utilities")] - public IEnumerable GetAgentUtilities() + [HttpGet("/agent/utility/options")] + public IEnumerable GetAgentUtilityOptions() { - return _agentService.GetAgentUtilities(); + return _agentService.GetAgentUtilityOptions(); } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/AudioHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/AudioHandlerPlugin.cs index 2c289907..d79ca6c2 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/AudioHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/AudioHandlerPlugin.cs @@ -17,7 +17,6 @@ public class AudioHandlerPlugin : IBotSharpPlugin }); services.AddScoped(); - services.AddScoped(); services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs deleted file mode 100644 index 20565679..00000000 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerHook.cs +++ /dev/null @@ -1,27 +0,0 @@ -using BotSharp.Abstraction.Agents.Settings; - -namespace BotSharp.Plugin.AudioHandler.Hooks; - -public class AudioHandlerHook : AgentHookBase, IAgentHook -{ - private const string HANDLER_AUDIO = "handle_audio_request"; - - public override string SelfId => string.Empty; - - public AudioHandlerHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.AudioHandler, - Functions = [new(HANDLER_AUDIO)], - Templates = [new($"{HANDLER_AUDIO}.fn")] - }; - - base.OnAgentLoaded(agent); - } -} diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs index ac3f0ed7..3d1f3992 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs @@ -2,8 +2,17 @@ namespace BotSharp.Plugin.AudioHandler.Hooks; public class AudioHandlerUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private const string HANDLER_AUDIO = "handle_audio_request"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.AudioHandler); + var utility = new AgentUtility + { + Name = UtilityName.AudioHandler, + Functions = [new(HANDLER_AUDIO)], + Templates = [new($"{HANDLER_AUDIO}.fn")] + }; + + utilities.Add(utility); } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs index eb52b719..fffc8c31 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs @@ -20,7 +20,6 @@ namespace BotSharp.Plugin.EmailHandler return settingService.Bind("EmailSender"); }); - services.AddScoped(); services.AddScoped(); var emailReaderSettings = new EmailReaderSettings(); diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs deleted file mode 100644 index ae38e329..00000000 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs +++ /dev/null @@ -1,30 +0,0 @@ -using BotSharp.Abstraction.Agents; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Plugin.EmailHandler.Enums; - -namespace BotSharp.Plugin.EmailHandler.Hooks; - -public class EmailHandlerHook : AgentHookBase -{ - private static string EMAIL_READER_FN = "handle_email_reader"; - private static string EMAIL_SENDER_FN = "handle_email_sender"; - - public override string SelfId => string.Empty; - - public EmailHandlerHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.EmailHandler, - Functions = [new(EMAIL_READER_FN), new(EMAIL_SENDER_FN)], - Templates = [new($"{EMAIL_READER_FN}.fn"), new($"{EMAIL_SENDER_FN}.fn")] - }; - - base.OnAgentLoaded(agent); - } -} diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs index 7d6a3be2..a909932e 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs @@ -5,8 +5,18 @@ namespace BotSharp.Plugin.EmailHandler.Hooks; public class EmailHandlerUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private static string EMAIL_READER_FN = "handle_email_reader"; + private static string EMAIL_SENDER_FN = "handle_email_sender"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.EmailHandler); + var utility = new AgentUtility + { + Name = UtilityName.EmailHandler, + Functions = [new(EMAIL_READER_FN), new(EMAIL_SENDER_FN)], + Templates = [new($"{EMAIL_READER_FN}.fn"), new($"{EMAIL_SENDER_FN}.fn")] + }; + + utilities.Add(utility); } } diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/ExcelHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/ExcelHandlerPlugin.cs index 0111ea99..08d652f0 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/ExcelHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/ExcelHandlerPlugin.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using BotSharp.Abstraction.Plugins; using BotSharp.Abstraction.Settings; using BotSharp.Plugin.ExcelHandler.Helpers.MySql; @@ -30,7 +25,6 @@ public class ExcelHandlerPlugin : IBotSharpPlugin }); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs deleted file mode 100644 index de02c18a..00000000 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerHook.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace BotSharp.Plugin.ExcelHandler.Hooks; - -public class ExcelHandlerHook : AgentHookBase, IAgentHook -{ - private const string HANDLER_EXCEL = "handle_excel_request"; - - public override string SelfId => string.Empty; - - public ExcelHandlerHook(IServiceProvider services, AgentSettings settings) : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.ExcelHandler, - Functions = [new(HANDLER_EXCEL)], - Templates = [new($"{HANDLER_EXCEL}.fn")] - }; - - base.OnAgentLoaded(agent); - } -} - diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs index fde7533f..15c41642 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs @@ -2,8 +2,17 @@ namespace BotSharp.Plugin.ExcelHandler.Hooks; public class ExcelHandlerUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private const string HANDLER_EXCEL = "handle_excel_request"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.ExcelHandler); + var utility = new AgentUtility + { + Name = UtilityName.ExcelHandler, + Functions = [new(HANDLER_EXCEL)], + Templates = [new($"{HANDLER_EXCEL}.fn")] + }; + + utilities.Add(utility); } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs index caef8304..a8ecac6d 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs @@ -19,7 +19,6 @@ public class FileHandlerPlugin : IBotSharpPlugin return settingService.Bind("FileHandler"); }); - services.AddScoped(); services.AddScoped(); } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs deleted file mode 100644 index cc0d0653..00000000 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerHook.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace BotSharp.Plugin.FileHandler.Hooks; - -public class FileHandlerHook : AgentHookBase, IAgentHook -{ - private const string READ_IMAGE_FN = "read_image"; - private const string READ_PDF_FN = "read_pdf"; - private const string GENERATE_IMAGE_FN = "generate_image"; - private const string EDIT_IMAGE_FN = "edit_image"; - - public override string SelfId => string.Empty; - - public FileHandlerHook(IServiceProvider services, AgentSettings settings) : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoads = new List - { - new AgentUtility - { - Name = UtilityName.ImageGenerator, - Functions = [new(GENERATE_IMAGE_FN)], - Templates = [new($"{GENERATE_IMAGE_FN}.fn")] - }, - new AgentUtility - { - Name = UtilityName.ImageReader, - Functions = [new(READ_IMAGE_FN)], - Templates = [new($"{READ_IMAGE_FN}.fn")] - }, - new AgentUtility - { - Name = UtilityName.ImageEditor, - Functions = [new(EDIT_IMAGE_FN)], - Templates = [new($"{EDIT_IMAGE_FN}.fn")] - }, - new AgentUtility - { - Name = UtilityName.PdfReader, - Functions = [new(READ_PDF_FN)], - Templates = [new($"{READ_PDF_FN}.fn")] - } - }; - - base.OnAgentLoaded(agent); - } -} diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs index ce28634f..3a5a1e0c 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs @@ -2,11 +2,42 @@ namespace BotSharp.Plugin.FileHandler.Hooks; public class FileHandlerUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private const string READ_IMAGE_FN = "read_image"; + private const string READ_PDF_FN = "read_pdf"; + private const string GENERATE_IMAGE_FN = "generate_image"; + private const string EDIT_IMAGE_FN = "edit_image"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.ImageGenerator); - utilities.Add(UtilityName.ImageReader); - utilities.Add(UtilityName.ImageEditor); - utilities.Add(UtilityName.PdfReader); + + var items = new List + { + new AgentUtility + { + Name = UtilityName.ImageGenerator, + Functions = [new(GENERATE_IMAGE_FN)], + Templates = [new($"{GENERATE_IMAGE_FN}.fn")] + }, + new AgentUtility + { + Name = UtilityName.ImageReader, + Functions = [new(READ_IMAGE_FN)], + Templates = [new($"{READ_IMAGE_FN}.fn")] + }, + new AgentUtility + { + Name = UtilityName.ImageEditor, + Functions = [new(EDIT_IMAGE_FN)], + Templates = [new($"{EDIT_IMAGE_FN}.fn")] + }, + new AgentUtility + { + Name = UtilityName.PdfReader, + Functions = [new(READ_PDF_FN)], + Templates = [new($"{READ_PDF_FN}.fn")] + } + }; + + utilities.AddRange(items); } } diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs deleted file mode 100644 index e30fc329..00000000 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs +++ /dev/null @@ -1,28 +0,0 @@ -using BotSharp.Abstraction.Agents; -using BotSharp.Abstraction.Agents.Settings; - -namespace BotSharp.Plugin.HttpHandler.Hooks; - -public class HttpHandlerHook : AgentHookBase -{ - private static string HTTP_HANDLER_FN = "handle_http_request"; - - public override string SelfId => string.Empty; - - public HttpHandlerHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.HttpHandler, - Functions = [new(HTTP_HANDLER_FN)], - Templates = [new($"{HTTP_HANDLER_FN}.fn")] - }; - - base.OnAgentLoaded(agent); - } -} diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs index 17a38df5..265558ac 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs @@ -4,8 +4,17 @@ namespace BotSharp.Plugin.HttpHandler.Hooks; public class HttpHandlerUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private static string HTTP_HANDLER_FN = "handle_http_request"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.HttpHandler); + var utility = new AgentUtility + { + Name = UtilityName.HttpHandler, + Functions = [new(HTTP_HANDLER_FN)], + Templates = [new($"{HTTP_HANDLER_FN}.fn")] + }; + + utilities.Add(utility); } } diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs index 48d71ee8..9c8cab55 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs @@ -20,7 +20,6 @@ public class HttpHandlerPlugin : IBotSharpPlugin return settingService.Bind("HttpHandler"); }); - services.AddScoped(); services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs deleted file mode 100644 index 852ab0da..00000000 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseAgentHook.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace BotSharp.Plugin.KnowledgeBase.Hooks; - -public class KnowledgeBaseAgentHook : AgentHookBase, IAgentHook -{ - private const string KNOWLEDGE_RETRIEVAL_FN = "knowledge_retrieval"; - - public override string SelfId => string.Empty; - - public KnowledgeBaseAgentHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.KnowledgeRetrieval, - Functions = [new(KNOWLEDGE_RETRIEVAL_FN)], - Templates = [new($"{KNOWLEDGE_RETRIEVAL_FN}.fn")] - }; - - base.OnAgentLoaded(agent); - } -} diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs index cd428136..464fd5b2 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs @@ -2,8 +2,17 @@ namespace BotSharp.Plugin.KnowledgeBase.Hooks; public class KnowledgeBaseUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private const string KNOWLEDGE_RETRIEVAL_FN = "knowledge_retrieval"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.KnowledgeRetrieval); + var utility = new AgentUtility + { + Name = UtilityName.KnowledgeRetrieval, + Functions = [new(KNOWLEDGE_RETRIEVAL_FN)], + Templates = [new($"{KNOWLEDGE_RETRIEVAL_FN}.fn")] + }; + + utilities.Add(utility); } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs index ebb5aa63..8d89daf6 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs @@ -25,7 +25,6 @@ public class KnowledgeBasePlugin : IBotSharpPlugin services.AddSingleton(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); } diff --git a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs index 60f39a7d..d4bd1594 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs @@ -2,10 +2,6 @@ namespace BotSharp.Plugin.Planner.Hooks; public class PlannerAgentHook : AgentHookBase { - private const string PRIMARY_STAGE_FN = "plan_primary_stage"; - private const string SECONDARY_STAGE_FN = "plan_secondary_stage"; - private const string SUMMARY_FN = "plan_summary"; - public override string SelfId => BuiltInAgentId.Planner; public PlannerAgentHook(IServiceProvider services, AgentSettings settings) @@ -31,24 +27,4 @@ public class PlannerAgentHook : AgentHookBase return true; } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.TwoStagePlanner, - Functions = [ - new(PRIMARY_STAGE_FN), - new(SECONDARY_STAGE_FN), - new(SUMMARY_FN) - ], - Templates = [ - new($"{PRIMARY_STAGE_FN}.fn"), - new($"{SECONDARY_STAGE_FN}.fn"), - new($"{SUMMARY_FN}.fn") - ] - }; - - base.OnAgentLoaded(agent); - } } diff --git a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerUtilityHook.cs index 08d3f8f5..b10d02ac 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerUtilityHook.cs @@ -2,8 +2,27 @@ namespace BotSharp.Plugin.Planner.Hooks; public class PlannerUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private const string PRIMARY_STAGE_FN = "plan_primary_stage"; + private const string SECONDARY_STAGE_FN = "plan_secondary_stage"; + private const string SUMMARY_FN = "plan_summary"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.TwoStagePlanner); + var utility = new AgentUtility + { + Name = UtilityName.TwoStagePlanner, + Functions = [ + new(PRIMARY_STAGE_FN), + new(SECONDARY_STAGE_FN), + new(SUMMARY_FN) + ], + Templates = [ + new($"{PRIMARY_STAGE_FN}.fn"), + new($"{SECONDARY_STAGE_FN}.fn"), + new($"{SUMMARY_FN}.fn") + ] + }; + + utilities.Add(utility); } } diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterAgentHook.cs b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterAgentHook.cs deleted file mode 100644 index 64e0ec27..00000000 --- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterAgentHook.cs +++ /dev/null @@ -1,51 +0,0 @@ -namespace BotSharp.Plugin.PythonInterpreter.Hooks; - -public class InterpreterAgentHook : AgentHookBase -{ - private static string FUNCTION_NAME = "python_interpreter"; - - public override string SelfId => string.Empty; - - public InterpreterAgentHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(UtilityName.PythonInterpreter); - - if (isConvMode && isEnabled) - { - var (prompt, fn) = GetPromptAndFunction(); - if (fn != null) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - - if (agent.Functions == null) - { - agent.Functions = new List { fn }; - } - else - { - agent.Functions.Add(fn); - } - } - } - - base.OnAgentLoaded(agent); - } - - private (string, FunctionDef?) GetPromptAndFunction() - { - var db = _services.GetRequiredService(); - var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo($"{FUNCTION_NAME}.fn"))?.Content ?? string.Empty; - var loadAttachmentFn = agent?.Functions?.FirstOrDefault(x => x.Name.IsEqualTo(FUNCTION_NAME)); - return (prompt, loadAttachmentFn); - } -} diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterUtilityHook.cs b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterUtilityHook.cs index be37bfa1..540870be 100644 --- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Hooks/InterpreterUtilityHook.cs @@ -2,8 +2,17 @@ namespace BotSharp.Plugin.PythonInterpreter.Hooks; public class InterpreterUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private static string FUNCTION_NAME = "python_interpreter"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.PythonInterpreter); + var utility = new AgentUtility() + { + Name = UtilityName.PythonInterpreter, + Functions = [new(FUNCTION_NAME)], + Templates = [new($"{FUNCTION_NAME}.fn")] + }; + + utilities.Add(utility); } } diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/InterpreterPlugin.cs b/src/Plugins/BotSharp.Plugin.PythonInterpreter/InterpreterPlugin.cs index be2e7c06..7d195286 100644 --- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/InterpreterPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.PythonInterpreter/InterpreterPlugin.cs @@ -15,7 +15,6 @@ public class InterpreterPlugin : IBotSharpAppPlugin public void RegisterDI(IServiceCollection services, IConfiguration config) { - services.AddScoped(); services.AddScoped(); } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs deleted file mode 100644 index c64e70f0..00000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs +++ /dev/null @@ -1,48 +0,0 @@ -using BotSharp.Abstraction.Agents.Enums; -using BotSharp.Abstraction.Agents.Settings; - -namespace BotSharp.Plugin.SqlDriver.Hooks; - -public class SqlDriverAgentHook : AgentHookBase, IAgentHook -{ - private const string SQL_TABLE_DEFINITION_FN = "sql_table_definition"; - private const string VERIFY_DICTIONARY_TERM_FN = "verify_dictionary_term"; - private const string SQL_SELECT_FN = "sql_select"; - - public override string SelfId => BuiltInAgentId.Planner; - - public SqlDriverAgentHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var dbType = SqlDriverHelper.GetDatabaseType(_services); - agent.TemplateDict["db_type"] = dbType; - - var utilityLoads = new List - { - new AgentUtility - { - Name = UtilityName.SqlTableDefinition, - Functions = [new(SQL_TABLE_DEFINITION_FN)], - Templates = [new($"{SQL_TABLE_DEFINITION_FN}.fn")] - }, - new AgentUtility - { - Name = UtilityName.SqlDictionaryLookup, - Functions = [new(VERIFY_DICTIONARY_TERM_FN)], - Templates = [new($"{VERIFY_DICTIONARY_TERM_FN}.fn")] - }, - new AgentUtility - { - Name = UtilityName.SqlExecutor, - Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, - Templates = new List { new($"sql_executor.fn") } - } - }; - - base.OnAgentLoaded(agent); - } -} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs index 451863ff..566ac319 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs @@ -2,10 +2,34 @@ namespace BotSharp.Plugin.SqlDriver.Hooks; public class SqlUtilityHook : IAgentUtilityHook { - public void AddUtilities(List utilities) + private const string SQL_TABLE_DEFINITION_FN = "sql_table_definition"; + private const string VERIFY_DICTIONARY_TERM_FN = "verify_dictionary_term"; + private const string SQL_SELECT_FN = "sql_select"; + + public void AddUtilities(List utilities) { - utilities.Add(UtilityName.SqlExecutor); - utilities.Add(UtilityName.SqlDictionaryLookup); - utilities.Add(UtilityName.SqlTableDefinition); + var items = new List + { + new AgentUtility + { + Name = UtilityName.SqlTableDefinition, + Functions = [new(SQL_TABLE_DEFINITION_FN)], + Templates = [new($"{SQL_TABLE_DEFINITION_FN}.fn")] + }, + new AgentUtility + { + Name = UtilityName.SqlDictionaryLookup, + Functions = [new(VERIFY_DICTIONARY_TERM_FN)], + Templates = [new($"{VERIFY_DICTIONARY_TERM_FN}.fn")] + }, + new AgentUtility + { + Name = UtilityName.SqlExecutor, + Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, + Templates = new List { new($"sql_executor.fn") } + } + }; + + utilities.AddRange(items); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index 8e21d2b0..6a618e34 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -25,7 +25,6 @@ public class SqlDriverPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs deleted file mode 100644 index 84f0d387..00000000 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerHook.cs +++ /dev/null @@ -1,29 +0,0 @@ -using BotSharp.Abstraction.Agents.Models; -using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Enums; - -namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks -{ - internal class OutboundPhoneCallHandlerHook : AgentHookBase - { - private static string OUTBOUND_PHONE_CALL_FN = "twilio_outbound_phone_call"; - - public override string SelfId => string.Empty; - - public OutboundPhoneCallHandlerHook(IServiceProvider services, AgentSettings settings) : base(services, settings) - { - } - - public override void OnAgentLoaded(Agent agent) - { - var utilityLoad = new AgentUtility - { - Name = UtilityName.OutboundPhoneCall, - Functions = [new(OUTBOUND_PHONE_CALL_FN)], - Templates = [new($"{OUTBOUND_PHONE_CALL_FN}.fn")] - }; - - base.OnAgentLoaded(agent); - } - } -} diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs index 982fe9b1..09e8a9e4 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs @@ -1,12 +1,21 @@ +using BotSharp.Abstraction.Agents.Models; using BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Enums; -namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks +namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks; + +public class OutboundPhoneCallHandlerUtilityHook : IAgentUtilityHook { - public class OutboundPhoneCallHandlerUtilityHook : IAgentUtilityHook + private static string OUTBOUND_PHONE_CALL_FN = "twilio_outbound_phone_call"; + + public void AddUtilities(List utilities) { - public void AddUtilities(List utilities) + var utility = new AgentUtility { - utilities.Add(UtilityName.OutboundPhoneCall); - } + Name = UtilityName.OutboundPhoneCall, + Functions = [new(OUTBOUND_PHONE_CALL_FN)], + Templates = [new($"{OUTBOUND_PHONE_CALL_FN}.fn")] + }; + + utilities.Add(utility); } } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs b/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs index 2907276c..cd75cc14 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/TwilioPlugin.cs @@ -30,7 +30,6 @@ public class TwilioPlugin : IBotSharpPlugin services.AddSingleton(); services.AddHostedService(); services.AddTwilioRequestValidation(); - services.AddScoped(); services.AddScoped(); } } From f3faecb2ee15fba5e04c0060aa95561718e6610f Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 21 Nov 2024 01:01:36 -0600 Subject: [PATCH 013/100] minor change --- src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs index 3cb1eac9..bb08fcb6 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs @@ -42,7 +42,7 @@ public class RoutingContext : IRoutingContext _routerAgentIds = agentService.GetAgents(new AgentFilter { Type = AgentType.Routing, - Pager = new Pagination { Size = 20 } + Pager = new Pagination { Size = 100 } }).Result.Items.Select(x => x.Id).ToArray(); } From 93a4bd95a95c0b55a7cc00fe16e34c20a3e14fe9 Mon Sep 17 00:00:00 2001 From: YouWeiDH Date: Thu, 21 Nov 2024 17:38:16 +0800 Subject: [PATCH 014/100] hdong: split some phone number from client and admin. --- .../BotSharp.Core/Users/Services/UserService.cs | 2 +- .../Repository/MongoRepository.User.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 9e74d961..02fccb40 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -172,7 +172,7 @@ public class UserService : IUserService var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); var (id, password) = base64.SplitAsTuple(":"); var db = _services.GetRequiredService(); - var record = db.GetUserByPhone(id,"admin"); + var record = db.GetUserByPhone(id, role: "admin"); var isCanLogin = record != null && !record.IsDisabled && record.Type == UserType.Internal && new List { diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index e999e034..d71157c3 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -13,7 +13,7 @@ public partial class MongoRepository return user != null ? user.ToUser() : null; } - public User? GetUserByPhone(string phone, string role = null, string regionCode = "CN") + public User? GetUserByPhone(string phone, string role = "client", string regionCode = "CN") { string phoneSecond = string.Empty; // if phone number length is less than 4, return null @@ -25,8 +25,8 @@ public partial class MongoRepository phoneSecond = phone.StartsWith("+86") ? phone.Replace("+86", "") : $"+86{phone}"; var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) && x.Type != UserType.Affiliate - && (x.RegionCode == regionCode || string.IsNullOrWhiteSpace(x.RegionCode)) - && (role == "admin" ? x.Role == "admin" || x.Role == "root" : true)); + && (x.RegionCode == regionCode || string.IsNullOrWhiteSpace(x.RegionCode)) + && (role == "client" ? x.Role == "client" || x.Role == "user" : role == "admin" ? x.Role == "admin" || x.Role == "root" : true)); return user != null ? user.ToUser() : null; } @@ -245,7 +245,7 @@ public partial class MongoRepository user.AgentActions = agentActions; return user; } - + var agentIds = userAgents.Select(x => x.AgentId)?.Distinct().ToList(); if (!agentIds.IsNullOrEmpty()) { From 0078b97868590d93b00172c2cbbdd1c8faf9ab0b Mon Sep 17 00:00:00 2001 From: YouWeiDH Date: Thu, 21 Nov 2024 20:54:24 +0800 Subject: [PATCH 015/100] hdong:clean up for client,user and admin split logic. --- .../Repositories/IBotSharpRepository.cs | 2 +- .../Repository/FileRepository/FileRepository.User.cs | 6 +++--- .../BotSharp.Core/Users/Services/UserService.cs | 2 +- .../Repository/MongoRepository.User.cs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index f3859a3a..33be79c1 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -26,7 +26,7 @@ public interface IBotSharpRepository : IHaveServiceProvider #region User User? GetUserByEmail(string email) => throw new NotImplementedException(); - User? GetUserByPhone(string phone, string role = null, string regionCode = "CN") => throw new NotImplementedException(); + User? GetUserByPhone(string phone, string type = "client", string regionCode = "CN") => throw new NotImplementedException(); User? GetAffiliateUserByPhone(string phone) => throw new NotImplementedException(); User? GetUserById(string id) => throw new NotImplementedException(); List GetUserByIds(List ids) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 68e76cd8..962bc941 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -11,13 +11,13 @@ public partial class FileRepository return Users.FirstOrDefault(x => x.Email == email.ToLower()); } - public User? GetUserByPhone(string phone, string? role = null, string regionCode = "CN") + public User? GetUserByPhone(string phone, string? type = "client", string regionCode = "CN") { var query = Users.Where(x => x.Phone == phone); - if (!string.IsNullOrEmpty(role)) + if (!string.IsNullOrEmpty(type)) { - query = query.Where(x => x.Role == role); + query = query.Where(x => x.Type == type); } if (!string.IsNullOrEmpty(regionCode)) diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 02fccb40..45f22937 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -172,7 +172,7 @@ public class UserService : IUserService var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); var (id, password) = base64.SplitAsTuple(":"); var db = _services.GetRequiredService(); - var record = db.GetUserByPhone(id, role: "admin"); + var record = db.GetUserByPhone(id, type: "internal"); var isCanLogin = record != null && !record.IsDisabled && record.Type == UserType.Internal && new List { diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index d71157c3..d72247aa 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -13,7 +13,7 @@ public partial class MongoRepository return user != null ? user.ToUser() : null; } - public User? GetUserByPhone(string phone, string role = "client", string regionCode = "CN") + public User? GetUserByPhone(string phone, string type = "client", string regionCode = "CN") { string phoneSecond = string.Empty; // if phone number length is less than 4, return null @@ -24,9 +24,9 @@ public partial class MongoRepository phoneSecond = phone.StartsWith("+86") ? phone.Replace("+86", "") : $"+86{phone}"; - var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) && x.Type != UserType.Affiliate + var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) && (x.RegionCode == regionCode || string.IsNullOrWhiteSpace(x.RegionCode)) - && (role == "client" ? x.Role == "client" || x.Role == "user" : role == "admin" ? x.Role == "admin" || x.Role == "root" : true)); + && (x.Type == type)); return user != null ? user.ToUser() : null; } From 72127319714dc83638869f30094ae67600a8c9b3 Mon Sep 17 00:00:00 2001 From: "jason.wang" Date: Thu, 21 Nov 2024 20:57:37 +0800 Subject: [PATCH 016/100] video comment crawl --- .../Browsing/Models/PageActionArgs.cs | 3 --- .../PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs | 12 ------------ .../PlaywrightWebDriver.ScrollPage.cs | 5 +++-- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs index 32486a09..fe575462 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs @@ -47,7 +47,4 @@ public class PageActionArgs public int WaitTime { get; set; } public bool ReadInnerHTMLAsBody { get; set; } = false; - public bool IsScrollPage { get; set; } = false; - public int ScrollCount { get; set; } = 1; - public int ScrollWaitTime { get; set; } = 1; } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs index 156e17f0..ccc2148e 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs @@ -77,18 +77,6 @@ public partial class PlaywrightWebDriver await Task.Delay(args.WaitTime * 1000); } - if (args.IsScrollPage) - { - var scrollCount = 0; - while (scrollCount < args.ScrollCount) - { - var previousHeight = await page.EvaluateAsync("document.body.scrollHeight"); - await page.EvaluateAsync("window.scrollTo(0, document.body.scrollHeight)"); - await page.WaitForTimeoutAsync(args.ScrollWaitTime * 1000); - scrollCount++; - }; - } - result.ResponseStatusCode = response.Status; if (response.Status == 200) { diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ScrollPage.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ScrollPage.cs index 48538ce8..3919629e 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ScrollPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ScrollPage.cs @@ -5,7 +5,8 @@ public partial class PlaywrightWebDriver public async Task ScrollPage(MessageInfo message, PageActionArgs args) { var result = new BrowserActionResult(); - await _instance.Wait(message.ContextId); + var waitTime = args.WaitTime > 0 ? args.WaitTime : 10; + await _instance.Wait(message.ContextId, waitTime, args.WaitForNetworkIdle); var page = _instance.GetPage(message.ContextId); @@ -31,7 +32,7 @@ public partial class PlaywrightWebDriver int scrollY = await page.EvaluateAsync("document.body.scrollHeight"); // Scroll to the bottom - await page.Mouse.WheelAsync(0, -scrollY); + await page.Mouse.WheelAsync(0, scrollY); } else if (args.Direction == "top") { From 8d207cbe7a8e92516abad435231743b0fb13371d Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 21 Nov 2024 10:31:24 -0600 Subject: [PATCH 017/100] refine agent actions --- .../Users/Models/UserAuthorization.cs | 22 +++++++++++++++++++ .../Controllers/AgentController.cs | 12 ++-------- .../ViewModels/Agents/AgentViewModel.cs | 5 +---- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/UserAuthorization.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/UserAuthorization.cs index 56df6a7d..f3c4c7f0 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/UserAuthorization.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/UserAuthorization.cs @@ -22,4 +22,26 @@ public static class UserAuthorizationExtension var actions = found.Actions ?? []; return actions.Any(x => x == targetAction); } + + /// + /// Get allowed user actions on the agent. If user is admin, returns null; + /// + /// + /// + /// + public static IEnumerable? GetAllowedAgentActions(this UserAuthorization auth, string agentId) + { + if (auth == null || string.IsNullOrEmpty(agentId)) + { + return []; + } + + if (auth.IsAdmin) + { + return null; + } + + var found = auth.AgentActions.FirstOrDefault(x => x.AgentId == agentId); + return found?.Actions ?? []; + } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs index 40c4c03f..d8b701c9 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AgentController.cs @@ -1,5 +1,4 @@ using BotSharp.Abstraction.Agents.Models; -using BotSharp.Abstraction.Users.Enums; namespace BotSharp.OpenAPI.Controllers; @@ -60,11 +59,7 @@ public class AgentController : ControllerBase var userService = _services.GetRequiredService(); var auth = await userService.GetUserAuthorizations(new List { targetAgent.Id }); - - targetAgent.Editable = auth.IsAgentActionAllowed(targetAgent.Id, UserAction.Edit); - targetAgent.Chatable = auth.IsAgentActionAllowed(targetAgent.Id, UserAction.Chat); - targetAgent.Trainable = auth.IsAgentActionAllowed(targetAgent.Id, UserAction.Train); - targetAgent.Evaluable = auth.IsAgentActionAllowed(targetAgent.Id, UserAction.Evaluate); + targetAgent.Actions = auth.GetAllowedAgentActions(targetAgent.Id); return targetAgent; } @@ -91,10 +86,7 @@ public class AgentController : ControllerBase agents = pagedAgents?.Items?.Select(x => { var model = AgentViewModel.FromAgent(x); - model.Editable = auth.IsAgentActionAllowed(x.Id, UserAction.Edit); - model.Chatable = auth.IsAgentActionAllowed(x.Id, UserAction.Chat); - model.Trainable = auth.IsAgentActionAllowed(x.Id, UserAction.Train); - model.Evaluable = auth.IsAgentActionAllowed(x.Id, UserAction.Evaluate); + model.Actions = auth.GetAllowedAgentActions(x.Id); return model; })?.ToList() ?? []; diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs index 46dea0af..34b1bcc1 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs @@ -48,10 +48,7 @@ public class AgentViewModel public PluginDef Plugin { get; set; } - public bool Editable { get; set; } - public bool Chatable { get; set; } - public bool Trainable { get; set; } - public bool Evaluable { get; set; } + public IEnumerable? Actions { get; set; } [JsonPropertyName("created_datetime")] public DateTime CreatedDateTime { get; set; } From 2c77bd29add833933c994dc412fe1ca58d820963 Mon Sep 17 00:00:00 2001 From: Chen Gong Date: Thu, 21 Nov 2024 13:07:00 -0600 Subject: [PATCH 018/100] add backend services for dashboard conversation --- .../Repositories/IBotSharpRepository.cs | 2 + .../Users/IUserService.cs | 2 + .../Users/Models/Dashboard.cs | 7 +-- .../BotSharp.Abstraction/Users/Models/User.cs | 1 - .../FileRepository/FileRepository.User.cs | 42 +++++++++++++++++ .../Users/Services/UserService.cs | 21 +++++++++ .../Controllers/ConversationController.cs | 12 ++++- .../Controllers/DashboardController.cs | 26 ++++++++++ .../Collections/UserDocument.cs | 2 + .../Repository/MongoRepository.User.cs | 47 +++++++++++++++++++ 10 files changed, 154 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 963b61be..efb6bccc 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -31,6 +31,8 @@ public interface IBotSharpRepository void UpdateExistUser(string userId, User user) => throw new NotImplementedException(); void UpdateUserVerified(string userId) => throw new NotImplementedException(); void AddDashboardConversation(string userId, string conversationId) => throw new NotImplementedException(); + void RemoveDashboardConversation(string userId, string conversationId) => throw new NotImplementedException(); + void UpdateDashboardConversation(string userId, DashboardConversation dashConv) => throw new NotImplementedException(); void UpdateUserVerificationCode(string userId, string verficationCode) => throw new NotImplementedException(); void UpdateUserPassword(string userId, string password) => throw new NotImplementedException(); void UpdateUserEmail(string userId, string email) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs index 164017ea..a326f727 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs @@ -23,5 +23,7 @@ public interface IUserService Task GetUserTokenExpires(); Task UpdateUsersIsDisable(List userIds, bool isDisable); Task AddDashboardConversation(string userId, string conversationId); + Task RemoveDashboardConversation(string userId, string conversationId); + Task UpdateDashboardConversation(string userId, DashboardConversation dashConv); Task GetDashboard(string userId); } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs index 51d5f1a7..753cb390 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/Dashboard.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace BotSharp.Abstraction.Users.Models; @@ -20,6 +15,6 @@ public class DashboardComponent public class DashboardConversation : DashboardComponent { public string? ConversationId { get; set; } - public string? Instruction { get; set; } = "Default instruction: Ask bot to do something"; + public string? Instruction { get; set; } = ""; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs index 2d62fe66..cb48701f 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs @@ -23,7 +23,6 @@ public class User public bool Verified { get; set; } public string? AffiliateId { get; set; } public bool IsDisabled { get; set; } - public List DashboardConversations { get; set; } = []; public DateTime UpdatedTime { get; set; } = DateTime.UtcNow; public DateTime CreatedTime { get; set; } = DateTime.UtcNow; } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 0c731da1..4657d182 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -82,6 +82,8 @@ public partial class FileRepository // one user only has one dashboard currently var dash = Dashboards.FirstOrDefault(); dash ??= new(); + var existingConv = dash.ConversationList.FirstOrDefault(x => string.Equals(x.ConversationId, conversationId, StringComparison.OrdinalIgnoreCase)); + if (existingConv != null) return; var dashconv = new DashboardConversation { @@ -95,4 +97,44 @@ public partial class FileRepository var path = Path.Combine(dir, DASHBOARD_FILE); File.WriteAllText(path, JsonSerializer.Serialize(dash, _options)); } + + public void RemoveDashboardConversation(string userId, string conversationId) + { + var user = GetUserById(userId); + if (user == null) return; + + // one user only has one dashboard currently + var dash = Dashboards.FirstOrDefault(); + if (dash == null) return; + + var dashconv = dash.ConversationList.FirstOrDefault( + c => string.Equals(c.ConversationId, conversationId, StringComparison.OrdinalIgnoreCase)); + if (dashconv == null) return; + + dash.ConversationList.Remove(dashconv); + + var dir = Path.Combine(_dbSettings.FileRepository, USERS_FOLDER, userId); + var path = Path.Combine(dir, DASHBOARD_FILE); + File.WriteAllText(path, JsonSerializer.Serialize(dash, _options)); + } + + public void UpdateDashboardConversation(string userId, DashboardConversation dashConv) + { + var user = GetUserById(userId); + if (user == null) return; + + // one user only has one dashboard currently + var dash = Dashboards.FirstOrDefault(); + if (dash == null) return; + + var curIdx = dash.ConversationList.ToList().FindIndex( + x => string.Equals(x.ConversationId, dashConv.ConversationId, StringComparison.OrdinalIgnoreCase)); + if (curIdx < 0) return; + + dash.ConversationList[curIdx] = dashConv; + + var dir = Path.Combine(_dbSettings.FileRepository, USERS_FOLDER, userId); + var path = Path.Combine(dir, DASHBOARD_FILE); + File.WriteAllText(path, JsonSerializer.Serialize(dash, _options)); + } } diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 65de880c..3060288e 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -649,6 +649,27 @@ public class UserService : IUserService await Task.CompletedTask; return true; } + + public async Task RemoveDashboardConversation(string userId, string conversationId) + { + var db = _services.GetRequiredService(); + db.RemoveDashboardConversation(userId, conversationId); + + await Task.CompletedTask; + return true; + } + + public async Task UpdateDashboardConversation(string userId, DashboardConversation newDashConv) + { + var db = _services.GetRequiredService(); + var dashConv = db.GetDashboard(userId)?.ConversationList.FirstOrDefault(x => string.Equals(x.ConversationId, newDashConv.ConversationId)); + if (dashConv == null) return; + dashConv.Name = newDashConv.Name ?? dashConv.Name; + dashConv.Instruction = newDashConv.Instruction ?? dashConv.Instruction; + db.UpdateDashboardConversation(userId, dashConv); + await Task.CompletedTask; + return; + } public async Task GetDashboard(string userId) { diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 00fe8ce3..b42eebdf 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -491,7 +491,7 @@ public class ConversationController : ControllerBase #endregion #region miscellaneous - [HttpPut("/agent/{agentId}/conversation/{conversationId}/PinToDashboard")] + [HttpPut("/agent/{agentId}/conversation/{conversationId}/dashboard")] public async Task PinConversationToDashboard([FromRoute] string agentId, [FromRoute] string conversationId) { var userService = _services.GetRequiredService(); @@ -500,6 +500,16 @@ public class ConversationController : ControllerBase var pinned = await userService.AddDashboardConversation(user.Id, conversationId); return pinned; } + + [HttpDelete("/agent/{agentId}/conversation/{conversationId}/dashboard")] + public async Task UnpinConversationFromDashboard([FromRoute] string agentId, [FromRoute] string conversationId) + { + var userService = _services.GetRequiredService(); + + var user = await userService.GetUser(_user.Id); + var unpinned = await userService.RemoveDashboardConversation(user.Id, conversationId); + return unpinned; + } #endregion #region Private methods diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs index 70b04e47..f75467fe 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/DashboardController.cs @@ -43,5 +43,31 @@ public class DashboardController : ControllerBase }; return result; } + + [HttpPost("/dashboard/component/conversation")] + public async Task UpdateDashboardConversationInstruction(string userId, UserDashboardConversationModel dashConv) + { + if (string.IsNullOrEmpty(dashConv.Name) && string.IsNullOrEmpty(dashConv.Instruction)) + { + return; + } + var newDashConv = new DashboardConversation + { + Id = Guid.Empty.ToString(), + ConversationId = dashConv.ConversationId + }; + if (!string.IsNullOrEmpty(dashConv.Name)) + { + newDashConv.Name = dashConv.Name; + } + if (!string.IsNullOrEmpty(dashConv.Instruction)) + { + newDashConv.Instruction = dashConv.Instruction; + } + + var userService = _services.GetRequiredService(); + await userService.UpdateDashboardConversation(userId, newDashConv); + return; + } #endregion } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs index ffcd71a2..4195b641 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs @@ -23,6 +23,8 @@ public class UserDocument : MongoBase public DateTime CreatedTime { get; set; } public DateTime UpdatedTime { get; set; } + public Dashboard? Dashboard { get; set; } + public User ToUser() { return new User diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index 55c454bd..ac339a01 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -146,4 +146,51 @@ public partial class MongoRepository UpdateUserIsDisable(userId, isDisable); } } + + public void AddDashboardConversation(string userId, string conversationId) + { + var user = _dc.Users.AsQueryable() + .FirstOrDefault(x => x.Id == userId || (x.ExternalId != null && x.ExternalId == userId)); + if (user == null) return; + var curDash = user.Dashboard ?? new Dashboard(); + curDash.ConversationList.Add(new DashboardConversation + { + Id = Guid.NewGuid().ToString(), + ConversationId = conversationId + }); + + var filter = Builders.Filter.Eq(x => x.Id, userId); + var update = Builders.Update.Set(x => x.Dashboard, curDash) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + } + + public void RemoveDashboardConversation(string userId, string conversationId) + { + var user = _dc.Users.AsQueryable() + .FirstOrDefault(x => x.Id == userId || (x.ExternalId != null && x.ExternalId == userId)); + if (user == null || user.Dashboard == null || user.Dashboard.ConversationList.IsNullOrEmpty()) return; + var curDash = user.Dashboard; + var unpinConv = user.Dashboard.ConversationList.FirstOrDefault( + x => string.Equals(x.ConversationId, conversationId, StringComparison.OrdinalIgnoreCase)); + if (unpinConv == null) return; + curDash.ConversationList.Remove(unpinConv); + + var filter = Builders.Filter.Eq(x => x.Id, userId); + var update = Builders.Update.Set(x => x.Dashboard, curDash) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + } + + public void UpdateDashboardConversation(string userId, DashboardConversation dashConv) + { + var user = _dc.Users.AsQueryable() + .FirstOrDefault(x => x.Id == userId || (x.ExternalId != null && x.ExternalId == userId)); + if (user == null || user.Dashboard == null || user.Dashboard.ConversationList.IsNullOrEmpty()) return; + var curIdx = user.Dashboard.ConversationList.ToList().FindIndex( + x => string.Equals(x.ConversationId, dashConv.ConversationId, StringComparison.OrdinalIgnoreCase)); + if (curIdx < 0) return; + + var filter = Builders.Filter.Eq(x => x.Id, userId); + var update = Builders.Update.Set(x => x.Dashboard.ConversationList[curIdx], dashConv) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + } } From 0d95262bb35d003c75a48ec0193836857239715f Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Thu, 21 Nov 2024 21:33:39 +0000 Subject: [PATCH 019/100] httpContext is null --- .../Infrastructures/SharpCacheAttribute.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/SharpCacheAttribute.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/SharpCacheAttribute.cs index c8b29ecd..c8f6a674 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/SharpCacheAttribute.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/SharpCacheAttribute.cs @@ -50,7 +50,9 @@ public class SharpCacheAttribute : MoAttribute } var httpContext = Services.GetRequiredService(); - if (httpContext.HttpContext.Response.Headers["Cache-Control"].ToString().Contains("no-store")) + if (httpContext != null && + httpContext.HttpContext != null && + httpContext.HttpContext.Response.Headers["Cache-Control"].ToString().Contains("no-store")) { return; } From 54088fcc8b8b5fc6cf3577c127c0a74c4f11c07d Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Thu, 21 Nov 2024 19:37:56 -0600 Subject: [PATCH 020/100] minor change --- .../BotSharp.Core/Routing/RoutingContext.cs | 8 ++++++-- .../BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs index bb08fcb6..b0527605 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingContext.cs @@ -243,12 +243,16 @@ public class RoutingContext : IRoutingContext public Stack GetAgentStack() { - return new Stack(_stack); + var copy = _stack.ToList(); + copy.Reverse(); + return new Stack(copy); } public void SetAgentStack(Stack stack) { - _stack = new Stack(stack); + var copy = stack.ToList(); + copy.Reverse(); + _stack = new Stack(copy); } public void ResetAgentStack() diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs index 566ac319..1984ee98 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs @@ -25,8 +25,8 @@ public class SqlUtilityHook : IAgentUtilityHook new AgentUtility { Name = UtilityName.SqlExecutor, - Functions = new List { new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN) }, - Templates = new List { new($"sql_executor.fn") } + Functions = [new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN)], + Templates = [new($"sql_executor.fn")] } }; From 455cbd570960aa1fe3e647176aa54ffe00e0f459 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Thu, 21 Nov 2024 20:41:00 -0500 Subject: [PATCH 021/100] Update M.E.AI to 9.0.1-preview.1.24570.5 --- .../BotSharp.Plugin.MicrosoftExtensionsAI.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/BotSharp.Plugin.MicrosoftExtensionsAI.csproj b/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/BotSharp.Plugin.MicrosoftExtensionsAI.csproj index 9262828f..9ce69188 100644 --- a/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/BotSharp.Plugin.MicrosoftExtensionsAI.csproj +++ b/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/BotSharp.Plugin.MicrosoftExtensionsAI.csproj @@ -12,7 +12,7 @@ - + From 9fe8014ecd434f6a8f15cc68bdd4d4a2a23662a8 Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Thu, 21 Nov 2024 20:33:55 -0600 Subject: [PATCH 022/100] reset cache --- .../BotSharp.Core.SideCar/BotSharp.Core.SideCar.csproj | 2 +- .../Services/BotSharpConversationSideCar.cs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core.SideCar/BotSharp.Core.SideCar.csproj b/src/Infrastructure/BotSharp.Core.SideCar/BotSharp.Core.SideCar.csproj index 4b661c2a..b7f89568 100644 --- a/src/Infrastructure/BotSharp.Core.SideCar/BotSharp.Core.SideCar.csproj +++ b/src/Infrastructure/BotSharp.Core.SideCar/BotSharp.Core.SideCar.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs b/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs index fda96b17..ec3ad0fe 100644 --- a/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs +++ b/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs @@ -1,3 +1,5 @@ +using BotSharp.Core.Infrastructures; + namespace BotSharp.Core.SideCar.Services; public class BotSharpConversationSideCar : IConversationSideCar @@ -116,7 +118,7 @@ public class BotSharpConversationSideCar : IConversationSideCar state.ResetCurrentState(); routing.Context.ResetRecursiveCounter(); routing.Context.ResetAgentStack(); - + Utilities.ClearCache(); } private void AfterExecute() @@ -130,6 +132,7 @@ public class BotSharpConversationSideCar : IConversationSideCar state.SetCurrentState(node.State); routing.Context.SetRecursiveCounter(node.RecursiveCounter); routing.Context.SetAgentStack(node.RoutingStack); + Utilities.ClearCache(); enabled = false; } } \ No newline at end of file From 24608e456b5d444517f1cb4084fce87d0ef8660c Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 22 Nov 2024 09:58:51 -0600 Subject: [PATCH 023/100] remove space --- .../BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs index 3a5a1e0c..ab295063 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs @@ -9,7 +9,6 @@ public class FileHandlerUtilityHook : IAgentUtilityHook public void AddUtilities(List utilities) { - var items = new List { new AgentUtility From 65d5e2cf121938a8c20188f5e71b2b597beac803 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 22 Nov 2024 14:40:47 -0600 Subject: [PATCH 024/100] refine --- .../Services/ConversationStateService.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs index 8ee4c662..152b74ca 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs @@ -1,5 +1,4 @@ using BotSharp.Abstraction.Conversations.Enums; -using BotSharp.Abstraction.Users.Enums; namespace BotSharp.Core.Conversations.Services; @@ -21,13 +20,14 @@ public class ConversationStateService : IConversationStateService, IDisposable /// private ConversationState _historyStates; - public ConversationStateService(ILogger logger, + public ConversationStateService( IServiceProvider services, - IBotSharpRepository db) + IBotSharpRepository db, + ILogger logger) { - _logger = logger; _services = services; _db = db; + _logger = logger; _curStates = new ConversationState(); _historyStates = new ConversationState(); } @@ -125,8 +125,13 @@ public class ConversationStateService : IConversationStateService, IDisposable var curMsgId = routingCtx.MessageId; _historyStates = _db.GetConversationStates(conversationId); + + var endNodes = new Dictionary(); + + if (_historyStates.IsNullOrEmpty()) return endNodes; + var dialogs = _db.GetConversationDialogs(conversationId); - var userDialogs = dialogs.Where(x => x.MetaData?.Role == AgentRole.User || x.MetaData?.Role == UserRole.User) + var userDialogs = dialogs.Where(x => x.MetaData?.Role == AgentRole.User) .GroupBy(x => x.MetaData?.MessageId) .Select(g => g.First()) .OrderBy(x => x.MetaData?.CreateTime) @@ -134,9 +139,6 @@ public class ConversationStateService : IConversationStateService, IDisposable var curMsgIndex = userDialogs.FindIndex(x => !string.IsNullOrEmpty(curMsgId) && x.MetaData?.MessageId == curMsgId); curMsgIndex = curMsgIndex < 0 ? userDialogs.Count() : curMsgIndex; - var endNodes = new Dictionary(); - if (_historyStates.IsNullOrEmpty()) return endNodes; - foreach (var state in _historyStates) { var key = state.Key; From 11ceb8e013f64c96cf55da127434b60424f2d028 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Fri, 22 Nov 2024 22:38:09 -0600 Subject: [PATCH 025/100] Add EventPriority --- .../Infrastructures/Enums/EventPriority.cs | 8 +++ .../Infrastructures/Events/IEventPublisher.cs | 2 +- .../Infrastructures/Events/RedisPublisher.cs | 10 ++- .../Infrastructures/Events/RedisSubscriber.cs | 72 ++++++++++++------- 4 files changed, 63 insertions(+), 29 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/EventPriority.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/EventPriority.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/EventPriority.cs new file mode 100644 index 00000000..75c4402d --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/EventPriority.cs @@ -0,0 +1,8 @@ +namespace BotSharp.Abstraction.Infrastructures.Enums; + +public enum EventPriority +{ + Low = 1, + Medium = 2, + High = 3 +} diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs index 68ceebd2..a58adf59 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs @@ -10,7 +10,7 @@ public interface IEventPublisher /// Task BroadcastAsync(string channel, string message); - Task PublishAsync(string channel, string message); + Task PublishAsync(string channel, string message, EventPriority priority = EventPriority.Medium); Task ReDispatchAsync(string channel, int count = 10, string order = "asc"); diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index 2ff585d6..d991a45c 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Infrastructures.Enums; using StackExchange.Redis; namespace BotSharp.Core.Infrastructures.Events; @@ -20,10 +21,13 @@ public class RedisPublisher : IEventPublisher await _subscriber.PublishAsync(channel, message); } - public async Task PublishAsync(string channel, string message) + public async Task PublishAsync(string channel, string message, EventPriority priority = EventPriority.Medium) { var db = _redis.GetDatabase(); + // convert to apporiate channel by priority + channel = $"{channel}-{priority}"; + if (CheckMessageExists(db, channel, "message", message)) { _logger.LogError($"The message already exists {channel} {message}"); @@ -41,7 +45,7 @@ public class RedisPublisher : IEventPublisher _logger.LogInformation($"Published message {channel} {message} ({messageId})"); } - private bool CheckMessageExists(IDatabase db, string streamName, string fieldName, string desiredValue) + private bool CheckMessageExists(IDatabase db, string channel, string fieldName, string desiredValue) { // Define the range to fetch all messages RedisValue start = "-"; // Start from the smallest ID @@ -49,7 +53,7 @@ public class RedisPublisher : IEventPublisher int count = 10; // Number of messages to retrieve // Fetch the latest 10 messages - var streamEntries = db.StreamRange(streamName, start, end, count, Order.Descending); + var streamEntries = db.StreamRange(channel, start, end, count, Order.Descending); if (streamEntries.Length == 0) { diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index bf6652b1..f35113fe 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Infrastructures.Enums; using StackExchange.Redis; namespace BotSharp.Core.Infrastructures.Events; @@ -28,6 +29,52 @@ public class RedisSubscriber : IEventSubscriber { var db = _redis.GetDatabase(); + await CreateConsumerGroup(db, $"{channel}-{EventPriority.Low}", group); + await CreateConsumerGroup(db, $"{channel}-{EventPriority.Medium}", group); + await CreateConsumerGroup(db, $"{channel}-{EventPriority.High}", group); + + while (true) + { + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) + { + continue; + } + + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) + { + continue; + } + + await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); + } + } + + private async Task HandleGroupMessage(IDatabase db, string channel, string group, Func received) + { + var entries = await db.StreamReadGroupAsync(channel, group, Environment.MachineName, count: 1); + foreach (var entry in entries) + { + _logger.LogInformation($"Consumer {Environment.MachineName} received: {channel} {entry.Values[0].Value}"); + await db.StreamAcknowledgeAsync(channel, group, entry.Id); + + try + { + await received(channel, entry.Values[0].Value); + + // Optionally delete the message to save space + await db.StreamDeleteAsync(channel, [entry.Id]); + } + catch (Exception ex) + { + _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}\r\n{ex}"); + } + } + + return entries.Length; + } + + private async Task CreateConsumerGroup(IDatabase db, string channel, string group) + { // Create the consumer group if it doesn't exist try { @@ -43,30 +90,5 @@ public class RedisSubscriber : IEventSubscriber _logger.LogError($"Error creating consumer group: '{group}' {ex.Message}"); throw; } - - while (true) - { - var entries = await db.StreamReadGroupAsync(channel, group, Environment.MachineName, count: 1); - foreach (var entry in entries) - { - _logger.LogInformation($"Consumer {Environment.MachineName} received: {channel} {entry.Values[0].Value}"); - await db.StreamAcknowledgeAsync(channel, group, entry.Id); - - try - { - await received(channel, entry.Values[0].Value); - - // Optionally delete the message to save space - await db.StreamDeleteAsync(channel, [entry.Id]); - } - catch (Exception ex) - { - _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}\r\n{ex}"); - } - } - - await Task.Delay(Random.Shared.Next(1, 11) * 100); - } - } } From 597e26a1e070533e1405f1adfeaf17d46bf6b231 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sat, 23 Nov 2024 14:48:22 +0000 Subject: [PATCH 026/100] Allow to disable EventPriority --- .../Infrastructures/Events/IEventPublisher.cs | 2 +- .../Events/IEventSubscriber.cs | 2 +- .../Infrastructures/Events/RedisPublisher.cs | 7 ++-- .../Infrastructures/Events/RedisSubscriber.cs | 36 +++++++++++++------ 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs index a58adf59..f2276c13 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs @@ -10,7 +10,7 @@ public interface IEventPublisher /// Task BroadcastAsync(string channel, string message); - Task PublishAsync(string channel, string message, EventPriority priority = EventPriority.Medium); + Task PublishAsync(string channel, string message, EventPriority? priority = null); Task ReDispatchAsync(string channel, int count = 10, string order = "asc"); diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs index f295e54e..fa96bb35 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs @@ -4,5 +4,5 @@ public interface IEventSubscriber { Task SubscribeAsync(string channel, Func received); - Task SubscribeAsync(string channel, string group, Func received); + Task SubscribeAsync(string channel, string group, bool priorityEnabled, Func received); } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index d991a45c..27cbf566 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -21,12 +21,15 @@ public class RedisPublisher : IEventPublisher await _subscriber.PublishAsync(channel, message); } - public async Task PublishAsync(string channel, string message, EventPriority priority = EventPriority.Medium) + public async Task PublishAsync(string channel, string message, EventPriority? priority = null) { var db = _redis.GetDatabase(); // convert to apporiate channel by priority - channel = $"{channel}-{priority}"; + if (priority != null) + { + channel = $"{channel}-{priority}"; + } if (CheckMessageExists(db, channel, "message", message)) { diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index f35113fe..b93c22a2 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -25,27 +25,41 @@ public class RedisSubscriber : IEventSubscriber }); } - public async Task SubscribeAsync(string channel, string group, Func received) + public async Task SubscribeAsync(string channel, string group, bool priorityEnabled, Func received) { var db = _redis.GetDatabase(); - await CreateConsumerGroup(db, $"{channel}-{EventPriority.Low}", group); - await CreateConsumerGroup(db, $"{channel}-{EventPriority.Medium}", group); - await CreateConsumerGroup(db, $"{channel}-{EventPriority.High}", group); + if (priorityEnabled) + { + await CreateConsumerGroup(db, $"{channel}-{EventPriority.Low}", group); + await CreateConsumerGroup(db, $"{channel}-{EventPriority.Medium}", group); + await CreateConsumerGroup(db, $"{channel}-{EventPriority.High}", group); + } + else + { + await CreateConsumerGroup(db, channel, group); + } while (true) { - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) + if (priorityEnabled) { - continue; - } + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) + { + continue; + } - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) + { + continue; + } + + await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); + } + else { - continue; + await HandleGroupMessage(db, channel, group, received); } - - await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); } } From e92b72ceb520f99fe3f81badc6112cdc9a683003 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sat, 23 Nov 2024 19:19:24 +0000 Subject: [PATCH 027/100] Handle exception SubscribeAsync --- .../Infrastructures/Events/RedisSubscriber.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index b93c22a2..67dba26d 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -42,23 +42,30 @@ public class RedisSubscriber : IEventSubscriber while (true) { - if (priorityEnabled) + try { - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) + if (priorityEnabled) { - continue; - } + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) + { + continue; + } - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) + { + continue; + } + + await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); + } + else { - continue; + await HandleGroupMessage(db, channel, group, received); } - - await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); } - else + catch (Exception ex) { - await HandleGroupMessage(db, channel, group, received); + _logger.LogError($"Error processing message: {ex.Message}\r\n{ex}"); } } } From f722781be491899256b3427a19dee851db01d2e1 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sat, 23 Nov 2024 20:02:43 -0600 Subject: [PATCH 028/100] DragAndDrop --- .../Browsing/Enums/BroswerActionEnum.cs | 1 + .../Browsing/Models/ElementPosition.cs | 5 + .../Infrastructures/Events/RedisSubscriber.cs | 27 ++---- .../PlaywrightWebDriver.DoAction.cs | 92 +++++++++++++++++++ 4 files changed, 108 insertions(+), 17 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs index 8f1cee10..abdfd67b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs @@ -7,4 +7,5 @@ public enum BroswerActionEnum Typing = 3, Hover = 4, Scroll = 5, + DragAndDrop = 6 } diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementPosition.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementPosition.cs index fd95bd66..9a1ef0d3 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementPosition.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementPosition.cs @@ -5,4 +5,9 @@ public class ElementPosition public float X { get; set; } = default!; public float Y { get; set; } = default!; + + public override string ToString() + { + return $"[{X}, {Y}]"; + } } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index 67dba26d..b93c22a2 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -42,30 +42,23 @@ public class RedisSubscriber : IEventSubscriber while (true) { - try + if (priorityEnabled) { - if (priorityEnabled) + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) { - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) - { - continue; - } - - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) - { - continue; - } - - await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); + continue; } - else + + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) { - await HandleGroupMessage(db, channel, group, received); + continue; } + + await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); } - catch (Exception ex) + else { - _logger.LogError($"Error processing message: {ex.Message}\r\n{ex}"); + await HandleGroupMessage(db, channel, group, received); } } } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs index f7884beb..40fec84e 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs @@ -79,10 +79,102 @@ public partial class PlaywrightWebDriver { await locator.HoverAsync(); } + else if (action.Action == BroswerActionEnum.DragAndDrop) + { + // Locate the element to drag + var box = await locator.BoundingBoxAsync(); + + if (box != null) + { + // Calculate start position + float startX = box.X + box.Width / 2; // Start at the center of the element + float startY = box.Y + box.Height / 2; + + // Drag offsets + float offsetX = action.Position.X; + // Move horizontally + if (action.Position.Y == 0) + { + // Perform drag-and-move + // Move mouse to the start position + var mouse = page.Mouse; + await mouse.MoveAsync(startX, startY); + await mouse.DownAsync(); + + // Move mouse smoothly in increments + var tracks = GetVelocityTrack(offsetX); + foreach (var track in tracks) + { + startX += track; + await page.Mouse.MoveAsync(startX, 0, new MouseMoveOptions + { + Steps = 3 + }); + } + + // Release mouse button + await mouse.UpAsync(); + } + else + { + throw new NotImplementedException(); + } + } + } if (action.WaitTime > 0) { await Task.Delay(1000 * action.WaitTime); } } + + public static List GetVelocityTrack(float distance) + { + // Initialize the track list to store the movement distances + List track = new List(); + + // Initialize variables + float current = 0; // Current position + float mid = distance * 4 / 5; // Deceleration threshold + float t = 0.2f; // Time interval + float v = 1; // Initial velocity + + // Generate the track + while (current < distance) + { + float a; // Acceleration + + // Determine acceleration based on position + if (current < mid) + { + a = 4; // Accelerate + } + else + { + a = -3; // Decelerate + } + + // Calculate new velocity + float v0 = v; + v = v0 + a * t; + + // Calculate the movement during this interval + float move = v0 * t + 0.5f * a * t * t; + + // Update current position + if (current + move > distance) + { + move = distance - current; + track.Add((int)Math.Round(move)); + break; + } + + current += move; + + // Add rounded movement to the track + track.Add((int)Math.Round(move)); + } + + return track; + } } From 0b98fe0dfe3478c83b1c29dbfdec21c78f95db80 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sun, 24 Nov 2024 09:10:03 -0600 Subject: [PATCH 029/100] delay 100ms --- .../BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index b93c22a2..89b38a8d 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -42,6 +42,8 @@ public class RedisSubscriber : IEventSubscriber while (true) { + await Task.Delay(100); + if (priorityEnabled) { if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) From 28908d9592544e70e2ecf3c1b88a1ead2ab2c9d5 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sun, 24 Nov 2024 11:04:22 -0600 Subject: [PATCH 030/100] disable lock --- .../BotSharp.Core/Infrastructures/Events/RedisPublisher.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index 27cbf566..435451d4 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -91,7 +91,10 @@ public class RedisPublisher : IEventPublisher try { - var messageId = await db.StreamAddAsync(channel, "message", entry.Values[0].Value); + var messageId = await db.StreamAddAsync(channel, [ + new NameValueEntry("message", entry.Values[0].Value), + new NameValueEntry("timestamp", DateTime.UtcNow.ToString("o")) + ]); _logger.LogWarning($"ReDispatched message: {channel} {entry.Values[0].Value} ({messageId})"); From 5bf9173708cba9476196cd741399f96f17af600c Mon Sep 17 00:00:00 2001 From: YouWeiDH Date: Mon, 25 Nov 2024 10:32:03 +0800 Subject: [PATCH 031/100] hdong: Fix phone exist check issues. --- src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 45f22937..96447a90 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -548,7 +548,7 @@ public class UserService : IUserService } var db = _services.GetRequiredService(); - var UserByphone = db.GetUserByPhone(phone, regionCode); + var UserByphone = db.GetUserByPhone(phone, regionCode: regionCode); if (UserByphone != null && UserByphone.Verified) { return true; From dc078564ae841e5d46048e626045695d0f93f177 Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Mon, 25 Nov 2024 14:02:55 +0800 Subject: [PATCH 032/100] feat: add HideMiddleDigits --- .../Infrastructures/Utilities.cs | 34 ++++++++++++++++++- .../ViewModels/Users/UserViewModel.cs | 5 +-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs index 4cb26888..613643f4 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs @@ -23,7 +23,7 @@ public static class Utilities var data = sha256.ComputeHash(Encoding.UTF8.GetBytes(text)); var sb = new StringBuilder(); - foreach(var c in data) + foreach (var c in data) { sb.Append(c.ToString("x2")); } @@ -47,4 +47,36 @@ public static class Utilities memcache.Compact(100); } } + + public static string HideMiddleDigits(string input, bool isEmail = false) + { + if (string.IsNullOrWhiteSpace(input)) + { + return input; + } + + if (isEmail) + { + int atIndex = input.IndexOf('@'); + if (atIndex > 1) + { + string localPart = input.Substring(0, atIndex); + if (localPart.Length > 2) + { + string maskedLocalPart = $"{localPart[0]}{new string('*', localPart.Length - 2)}{localPart[^1]}"; + return $"{maskedLocalPart}@{input.Substring(atIndex + 1)}"; + } + } + } + else + { + if (input.Length > 6) + { + return $"{input.Substring(0, 3)}{new string('*', input.Length - 6)}{input.Substring(input.Length - 3)}"; + } + } + + return input; + } + } diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs index fae5873b..ff220e9d 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Users.Enums; +using BotSharp.Core.Infrastructures; using System.Text.Json.Serialization; namespace BotSharp.OpenAPI.ViewModels.Users; @@ -57,8 +58,8 @@ public class UserViewModel UserName = user.UserName, FirstName = user.FirstName, LastName = user.LastName, - Email = user.Email, - Phone = !string.IsNullOrWhiteSpace(user.Phone) ? user.Phone.Replace("+86", String.Empty) : user.Phone, + Email = Utilities.HideMiddleDigits(user.Email, true), + Phone = Utilities.HideMiddleDigits((!string.IsNullOrWhiteSpace(user.Phone) ? user.Phone.Replace("+86", String.Empty) : user.Phone)), Type = user.Type, Role = user.Role, Source = user.Source, From 9276ccede05c01a0a3f6b1b3c7a65b8bd53ed46c Mon Sep 17 00:00:00 2001 From: YouWeiDH Date: Mon, 25 Nov 2024 19:14:08 +0800 Subject: [PATCH 033/100] hdong: use userType menu and add AffiliateCode. --- .../BotSharp.Abstraction/Repositories/IBotSharpRepository.cs | 3 ++- src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs | 1 + .../Repository/FileRepository/FileRepository.User.cs | 2 +- .../BotSharp.Core/Users/Services/UserService.cs | 2 +- .../BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs | 4 +++- .../Repository/MongoRepository.User.cs | 4 ++-- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 33be79c1..73577f45 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -5,6 +5,7 @@ using BotSharp.Abstraction.Roles.Models; using BotSharp.Abstraction.Shared; using BotSharp.Abstraction.Tasks.Models; using BotSharp.Abstraction.Translation.Models; +using BotSharp.Abstraction.Users.Enums; using BotSharp.Abstraction.Users.Models; using BotSharp.Abstraction.VectorStorage.Models; @@ -26,7 +27,7 @@ public interface IBotSharpRepository : IHaveServiceProvider #region User User? GetUserByEmail(string email) => throw new NotImplementedException(); - User? GetUserByPhone(string phone, string type = "client", string regionCode = "CN") => throw new NotImplementedException(); + User? GetUserByPhone(string phone, string type = UserType.Client, string regionCode = "CN") => throw new NotImplementedException(); User? GetAffiliateUserByPhone(string phone) => throw new NotImplementedException(); User? GetUserById(string id) => throw new NotImplementedException(); List GetUserByIds(List ids) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs index 8d136dc5..df1ff190 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs @@ -23,6 +23,7 @@ public class User public bool Verified { get; set; } public string RegionCode { get; set; } = "CN"; public string? AffiliateId { get; set; } + public string? AffiliateCode { get; set; } public string? EmployeeId { get; set; } public bool IsDisabled { get; set; } public IEnumerable Permissions { get; set; } = []; diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 962bc941..317d6fc2 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -11,7 +11,7 @@ public partial class FileRepository return Users.FirstOrDefault(x => x.Email == email.ToLower()); } - public User? GetUserByPhone(string phone, string? type = "client", string regionCode = "CN") + public User? GetUserByPhone(string phone, string? type = UserType.Client, string regionCode = "CN") { var query = Users.Where(x => x.Phone == phone); diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 96447a90..3858d63d 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -172,7 +172,7 @@ public class UserService : IUserService var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); var (id, password) = base64.SplitAsTuple(":"); var db = _services.GetRequiredService(); - var record = db.GetUserByPhone(id, type: "internal"); + var record = db.GetUserByPhone(id, type: UserType.Internal); var isCanLogin = record != null && !record.IsDisabled && record.Type == UserType.Internal && new List { diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs index c55da5fa..27bdc0aa 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs @@ -13,6 +13,7 @@ public class UserCreationModel public string Type { get; set; } = UserType.Client; public string Role { get; set; } = UserRole.User; public string RegionCode { get; set; } = "CN"; + public string? AffiliateCode { get; set; } public User ToUser() { return new User @@ -25,7 +26,8 @@ public class UserCreationModel Password = Password, Role = Role, Type = Type, - RegionCode = RegionCode + RegionCode = RegionCode, + AffiliateCode = AffiliateCode }; } } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index d72247aa..8a381069 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -13,7 +13,7 @@ public partial class MongoRepository return user != null ? user.ToUser() : null; } - public User? GetUserByPhone(string phone, string type = "client", string regionCode = "CN") + public User? GetUserByPhone(string phone, string type = UserType.Client, string regionCode = "CN") { string phoneSecond = string.Empty; // if phone number length is less than 4, return null @@ -24,7 +24,7 @@ public partial class MongoRepository phoneSecond = phone.StartsWith("+86") ? phone.Replace("+86", "") : $"+86{phone}"; - var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) + var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) && (x.RegionCode == regionCode || string.IsNullOrWhiteSpace(x.RegionCode)) && (x.Type == type)); return user != null ? user.ToUser() : null; From 7d66ea3edffe686df330d3299cbd96000b0297e9 Mon Sep 17 00:00:00 2001 From: Joanna Ren <101223@smsassist.com> Date: Mon, 25 Nov 2024 13:41:15 -0600 Subject: [PATCH 034/100] update prompt --- .../templates/two_stage.summarize.liquid | 3 ++- .../BotSharp.Plugin.SqlDriver/Functions/SqlValidateFn.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid index c53abdab..d8f741a7 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid @@ -1,4 +1,5 @@ -You are a planning summarizer. You will generate the final output in JSON format with short explanation based on the task description, knowledge and related table structure and relationship. +You are a planning summarizer. You will generate the final output in JSON format based on the task description, knowledge and related table structure and relationship. +Generate a simple business explaination of the quried data for the non tech audience. Requirements: {{ summary_requirements }} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlValidateFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlValidateFn.cs index f47e022d..b712d347 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlValidateFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlValidateFn.cs @@ -62,7 +62,7 @@ public class SqlValidateFn : IFunctionCallback { Provider = agent?.LlmConfig?.Provider ?? "openai", Model = agent?.LlmConfig?.Model ?? "gpt-4o", - Message = "Correct SQL Statement", + Message = "Correct SQL Statement and keep the comments/explanations", Data = new Dictionary { { "original_sql", message.Content }, From de3621f8bf2190ef937534bdfbfc64c6fedf7eee Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 25 Nov 2024 16:13:40 -0600 Subject: [PATCH 035/100] dynamic register fluid model --- .../Templating/ITemplateRender.cs | 1 + .../BotSharp.Core/Agents/AgentPlugin.cs | 3 ++ .../Agents/Services/AgentService.Rendering.cs | 19 +++++--- .../BotSharp.Core/BotSharpCoreExtensions.cs | 4 ++ .../Conversations/ConversationPlugin.cs | 4 +- .../Templating/TemplateRender.cs | 47 ++++++++++++++++++- .../Hooks/SqlDriverAgentHook.cs | 19 ++++++++ .../SqlDriverPlugin.cs | 1 + 8 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Templating/ITemplateRender.cs b/src/Infrastructure/BotSharp.Abstraction/Templating/ITemplateRender.cs index e5ddeb61..82eff1c1 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Templating/ITemplateRender.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Templating/ITemplateRender.cs @@ -3,4 +3,5 @@ namespace BotSharp.Abstraction.Templating; public interface ITemplateRender { string Render(string template, Dictionary dict); + void Register(Type type); } diff --git a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs index 2f51f1dd..cfbc541f 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs @@ -1,6 +1,7 @@ using BotSharp.Abstraction.MLTasks; using BotSharp.Abstraction.Plugins.Models; using BotSharp.Abstraction.Settings; +using BotSharp.Abstraction.Templating; using BotSharp.Abstraction.Users.Enums; using Microsoft.Extensions.Configuration; @@ -33,6 +34,8 @@ public class AgentPlugin : IBotSharpPlugin services.AddScoped(provider => { var settingService = provider.GetRequiredService(); + var render = provider.GetRequiredService(); + render.Register(typeof(AgentSettings)); return settingService.Bind("Agent"); }); } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs index e9617d17..ba76e310 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs @@ -9,13 +9,16 @@ public partial class AgentService public string RenderedInstruction(Agent agent) { var render = _services.GetRequiredService(); - // update states var conv = _services.GetRequiredService(); + + // update states foreach (var t in conv.States.GetStates()) { agent.TemplateDict[t.Key] = t.Value; } - return render.Render(agent.Instruction, agent.TemplateDict); + + var res = render.Render(agent.Instruction, agent.TemplateDict); + return res; } public bool RenderFunction(Agent agent, FunctionDef def) @@ -108,16 +111,18 @@ public partial class AgentService public string RenderedTemplate(Agent agent, string templateName) { - // render liquid template - var render = _services.GetRequiredService(); - var template = agent.Templates.First(x => x.Name == templateName).Content; - // update states var conv = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + + var template = agent.Templates.First(x => x.Name == templateName).Content; + + // update states foreach (var t in conv.States.GetStates()) { agent.TemplateDict[t.Key] = t.Value; } + // render liquid template var content = render.Render(template, agent.TemplateDict); HookEmitter.Emit(_services, async hook => @@ -126,4 +131,4 @@ public partial class AgentService return content; } -} +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs b/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs index a60fb4fd..c5e33a4b 100644 --- a/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs +++ b/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs @@ -12,6 +12,8 @@ using BotSharp.Core.Processors; using StackExchange.Redis; using BotSharp.Core.Infrastructures.Events; using BotSharp.Core.Roles.Services; +using BotSharp.Abstraction.Templating; +using BotSharp.Core.Templating; namespace BotSharp.Core; @@ -24,6 +26,8 @@ public static class BotSharpCoreExtensions services.AddSingleton(x => interpreterSettings); services.AddSingleton(); + // Register template render + services.AddSingleton(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs b/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs index a9be6fd2..e2b11afb 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs @@ -30,6 +30,8 @@ public class ConversationPlugin : IBotSharpPlugin services.AddScoped(provider => { var settingService = provider.GetRequiredService(); + var render = provider.GetRequiredService(); + render.Register(typeof(ConversationSetting)); return settingService.Bind("Conversation"); }); @@ -48,8 +50,6 @@ public class ConversationPlugin : IBotSharpPlugin // Rich content messaging services.AddScoped(); - // Register template render - services.AddSingleton(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/BotSharp.Core/Templating/TemplateRender.cs b/src/Infrastructure/BotSharp.Core/Templating/TemplateRender.cs index 33b27177..c16a8c4b 100644 --- a/src/Infrastructure/BotSharp.Core/Templating/TemplateRender.cs +++ b/src/Infrastructure/BotSharp.Core/Templating/TemplateRender.cs @@ -1,10 +1,10 @@ -using BotSharp.Abstraction.Agents.Models; -using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Models; using BotSharp.Abstraction.Routing.Models; using BotSharp.Abstraction.Templating; using BotSharp.Abstraction.Translation.Models; using Fluid; +using System.Collections; +using System.Reflection; namespace BotSharp.Core.Templating; @@ -48,4 +48,47 @@ public class TemplateRender : ITemplateRender return template; } } + + + public void Register(Type type) + { + if (type == null || IsStringType(type)) return; + + if (IsListType(type)) + { + if (type.IsGenericType) + { + var genericType = type.GetGenericArguments()[0]; + Register(genericType); + } + } + else if (IsTrackToNextLevel(type)) + { + _options.MemberAccessStrategy.Register(type); + var props = type.GetProperties(); + foreach (var prop in props) + { + Register(prop.PropertyType); + } + } + } + + + #region Private methods + private static bool IsStringType(Type type) + { + return type == typeof(string); + } + + private static bool IsListType(Type type) + { + var interfaces = type.GetTypeInfo().ImplementedInterfaces; + return type.IsArray || interfaces.Any(x => x.Name == typeof(IEnumerable).Name); + } + + private static bool IsTrackToNextLevel(Type type) + { + return type.IsClass || type.IsInterface || type.IsAbstract; + } + #endregion } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs new file mode 100644 index 00000000..53b7866f --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs @@ -0,0 +1,19 @@ +using BotSharp.Abstraction.Agents.Settings; + +namespace BotSharp.Plugin.SqlDriver.Hooks; + +public class SqlDriverAgentHook : AgentHookBase, IAgentHook +{ + public override string SelfId => BuiltInAgentId.Planner; + + public SqlDriverAgentHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) + { + } + + public override void OnAgentLoaded(Agent agent) + { + var dbType = SqlDriverHelper.GetDatabaseType(_services); + agent.TemplateDict["db_type"] = dbType; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index 6a618e34..6bb17014 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -27,6 +27,7 @@ public class SqlDriverPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); } From 4ce52d50f6195fb7fc25e5f899b5c1d51b6a796f Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 25 Nov 2024 16:14:02 -0600 Subject: [PATCH 036/100] clean code --- src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index 6bb17014..cf4579d5 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -1,4 +1,3 @@ -using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Planning; namespace BotSharp.Plugin.SqlDriver; From 4507d99bfa1b31a9261e50274b2c5d1d907a1be3 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Mon, 25 Nov 2024 18:06:26 -0600 Subject: [PATCH 037/100] Refactor reasoner and planner --- .../{Routing => }/Planning/IExecutor.cs | 3 +- .../Planning/ITaskPlanner.cs | 14 +- .../Routing/Enums/RuleType.cs | 5 + .../Routing/Planning/IRoutingPlaner.cs | 19 --- .../Routing/Reasoning/IRoutingReasoner.cs | 30 ++++ .../BotSharp.Abstraction/Using.cs | 1 - .../BotSharp.Core/BotSharp.Core.csproj | 20 ++- .../Conversations/ConversationPlugin.cs | 4 +- .../ContinueExecuteTaskRoutingHandler.cs | 4 +- .../InterruptTaskExecutionRoutingHandler.cs | 4 +- .../RetrieveDataFromAgentRoutingHandler.cs | 4 +- .../FirstStagePlanParameter.cs | 15 -- .../TwoStagePlanner/SecondStagePlan.cs | 21 --- .../SecondStagePlanParameter.cs | 4 - .../HFPlanner.cs => Reasoning/HFReasoner.cs} | 34 +++-- .../InstructExecutor.cs | 4 +- .../NaiveReasoner.cs} | 35 ++++- .../Reasoning/OneStepForwardReasoner.cs | 137 ++++++++++++++++++ .../ReasonerHelper.cs} | 4 +- .../SequentialReasoner.cs} | 41 ++++-- .../BotSharp.Core/Routing/RoutingPlugin.cs | 14 +- .../Routing/RoutingService.GetPlanner.cs | 24 --- .../Routing/RoutingService.InstructLoop.cs | 112 ++++++++++++++ .../BotSharp.Core/Routing/RoutingService.cs | 91 +----------- .../agent.json | 4 +- ...er_prompt.hf.liquid => reasoner.hf.liquid} | 0 ...mpt.naive.liquid => reasoner.naive.liquid} | 0 .../reasoner.one-step-forward.liquid | 2 + ...oner.sequential.get_remaining_task.liquid} | 0 ...tial.liquid => reasoner.sequential.liquid} | 0 .../agent.json | 2 +- .../BotSharp.Plugin.Planner/PlannerPlugin.cs | 4 +- .../TwoStaging/TwoStageTaskPlanner.cs | 8 +- .../agent.json | 4 +- 34 files changed, 426 insertions(+), 242 deletions(-) rename src/Infrastructure/BotSharp.Abstraction/{Routing => }/Planning/IExecutor.cs (76%) delete mode 100644 src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IRoutingPlaner.cs create mode 100644 src/Infrastructure/BotSharp.Abstraction/Routing/Reasoning/IRoutingReasoner.cs delete mode 100644 src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/FirstStagePlanParameter.cs delete mode 100644 src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlan.cs delete mode 100644 src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlanParameter.cs rename src/Infrastructure/BotSharp.Core/Routing/{Planning/HFPlanner.cs => Reasoning/HFReasoner.cs} (72%) rename src/Infrastructure/BotSharp.Core/Routing/{Planning => Reasoning}/InstructExecutor.cs (91%) rename src/Infrastructure/BotSharp.Core/Routing/{Planning/NaivePlanner.cs => Reasoning/NaiveReasoner.cs} (73%) create mode 100644 src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs rename src/Infrastructure/BotSharp.Core/Routing/{Planning/PlannerHelper.cs => Reasoning/ReasonerHelper.cs} (96%) rename src/Infrastructure/BotSharp.Core/Routing/{Planning/SequentialPlanner.cs => Reasoning/SequentialReasoner.cs} (81%) delete mode 100644 src/Infrastructure/BotSharp.Core/Routing/RoutingService.GetPlanner.cs create mode 100644 src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs rename src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/{planner_prompt.hf.liquid => reasoner.hf.liquid} (100%) rename src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/{planner_prompt.naive.liquid => reasoner.naive.liquid} (100%) create mode 100644 src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid rename src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/{planner_prompt.sequential.get_remaining_task.liquid => reasoner.sequential.get_remaining_task.liquid} (100%) rename src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/{planner_prompt.sequential.liquid => reasoner.sequential.liquid} (100%) diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IExecutor.cs b/src/Infrastructure/BotSharp.Abstraction/Planning/IExecutor.cs similarity index 76% rename from src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IExecutor.cs rename to src/Infrastructure/BotSharp.Abstraction/Planning/IExecutor.cs index c8bffe6c..3362f1a4 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IExecutor.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Planning/IExecutor.cs @@ -1,6 +1,7 @@ using BotSharp.Abstraction.Functions.Models; +using BotSharp.Abstraction.Routing; -namespace BotSharp.Abstraction.Routing.Planning; +namespace BotSharp.Abstraction.Planning; public interface IExecutor { diff --git a/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs b/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs index a5668a52..67f30fb1 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs @@ -1,9 +1,19 @@ +using BotSharp.Abstraction.Functions.Models; + namespace BotSharp.Abstraction.Planning; /// /// Planning process for Task Agent +/// https://www.promptingguide.ai/techniques/cot /// -public class ITaskPlanner +public interface ITaskPlanner { - + Task GetNextInstruction(Agent router, string messageId, List dialogs); + Task AgentExecuting(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs); + Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs); + List BeforeHandleContext(FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + => dialogs; + bool AfterHandleContext(List dialogs, List taskAgentDialogs) + => true; + int MaxLoopCount => 5; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/Enums/RuleType.cs b/src/Infrastructure/BotSharp.Abstraction/Routing/Enums/RuleType.cs index 1d1913dd..c595d59c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Routing/Enums/RuleType.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Routing/Enums/RuleType.cs @@ -12,6 +12,11 @@ public class RuleType /// public const string DataValidation = "data-validation"; + /// + /// The reasoning approach name for next step + /// + public const string Reasoner = "reasoner"; + /// /// The planning approach name for next step /// diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IRoutingPlaner.cs b/src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IRoutingPlaner.cs deleted file mode 100644 index 7f3abde9..00000000 --- a/src/Infrastructure/BotSharp.Abstraction/Routing/Planning/IRoutingPlaner.cs +++ /dev/null @@ -1,19 +0,0 @@ -using BotSharp.Abstraction.Functions.Models; - -namespace BotSharp.Abstraction.Routing.Planning; - -/// -/// Task breakdown and execution plan -/// https://www.promptingguide.ai/techniques/cot -/// -public interface IRoutingPlaner -{ - Task GetNextInstruction(Agent router, string messageId, List dialogs); - Task AgentExecuting(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs); - Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs); - List BeforeHandleContext(FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) - => dialogs; - bool AfterHandleContext(List dialogs, List taskAgentDialogs) - => true; - int MaxLoopCount => 5; -} diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/Reasoning/IRoutingReasoner.cs b/src/Infrastructure/BotSharp.Abstraction/Routing/Reasoning/IRoutingReasoner.cs new file mode 100644 index 00000000..f7bb5eb4 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Routing/Reasoning/IRoutingReasoner.cs @@ -0,0 +1,30 @@ +using BotSharp.Abstraction.Functions.Models; + +namespace BotSharp.Abstraction.Routing.Reasoning; + +/// +/// Reasoning approaches for large language models (LLMs) help enhance their ability to solve complex problems, +/// handle tasks requiring logic, and provide accurate and contextually appropriate responses. +/// +public interface IRoutingReasoner +{ + string Name => "Unnamed Reasoner"; + string Description => "Each of these approaches leverages the capabilities of LLMs to reason more effectively, " + + "ensuring better performance and more coherent outputs across various types of complex tasks."; + + int MaxLoopCount => 5; + + Task GetNextInstruction(Agent router, string messageId, List dialogs); + + Task AgentExecuting(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + => Task.FromResult(true); + + Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + => Task.FromResult(true); + + List BeforeHandleContext(FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + => dialogs; + + bool AfterHandleContext(List dialogs, List taskAgentDialogs) + => true; +} diff --git a/src/Infrastructure/BotSharp.Abstraction/Using.cs b/src/Infrastructure/BotSharp.Abstraction/Using.cs index 825f7d8f..9f35c1c8 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Using.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Using.cs @@ -12,7 +12,6 @@ global using BotSharp.Abstraction.Agents.Enums; global using BotSharp.Abstraction.Infrastructures.Enums; global using BotSharp.Abstraction.Models; global using BotSharp.Abstraction.Routing.Models; -global using BotSharp.Abstraction.Routing.Planning; global using BotSharp.Abstraction.Templating; global using BotSharp.Abstraction.Translation.Attributes; global using BotSharp.Abstraction.Messaging.Enums; diff --git a/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj b/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj index 32987e69..1c82c84f 100644 --- a/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj +++ b/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj @@ -59,6 +59,11 @@ + + + + + @@ -73,10 +78,6 @@ - - - - @@ -120,16 +121,19 @@ PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + + PreserveNewest + + PreserveNewest diff --git a/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs b/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs index a9be6fd2..06dd66e2 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/ConversationPlugin.cs @@ -1,13 +1,13 @@ using BotSharp.Abstraction.Google.Settings; using BotSharp.Abstraction.Instructs; using BotSharp.Abstraction.Messaging; +using BotSharp.Abstraction.Planning; using BotSharp.Abstraction.Plugins.Models; -using BotSharp.Abstraction.Routing.Planning; using BotSharp.Abstraction.Settings; using BotSharp.Abstraction.Templating; using BotSharp.Core.Instructs; using BotSharp.Core.Messaging; -using BotSharp.Core.Routing.Planning; +using BotSharp.Core.Routing.Reasoning; using BotSharp.Core.Templating; using BotSharp.Core.Translation; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/BotSharp.Core/Routing/Handlers/ContinueExecuteTaskRoutingHandler.cs b/src/Infrastructure/BotSharp.Core/Routing/Handlers/ContinueExecuteTaskRoutingHandler.cs index 646dd481..2ee6f9d7 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Handlers/ContinueExecuteTaskRoutingHandler.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Handlers/ContinueExecuteTaskRoutingHandler.cs @@ -4,7 +4,7 @@ using BotSharp.Abstraction.Repositories; using BotSharp.Abstraction.Repositories.Filters; using BotSharp.Abstraction.Routing; using BotSharp.Abstraction.Routing.Settings; -using BotSharp.Core.Routing.Planning; +using BotSharp.Core.Routing.Reasoning; namespace BotSharp.Core.Routing.Handlers; @@ -27,7 +27,7 @@ public class ContinueExecuteTaskRoutingHandler : RoutingHandlerBase//, IRoutingH public List Planers => new List { - nameof(HFPlanner) + nameof(HFReasoner) }; public ContinueExecuteTaskRoutingHandler(IServiceProvider services, ILogger logger, RoutingSettings settings) diff --git a/src/Infrastructure/BotSharp.Core/Routing/Handlers/InterruptTaskExecutionRoutingHandler.cs b/src/Infrastructure/BotSharp.Core/Routing/Handlers/InterruptTaskExecutionRoutingHandler.cs index da58b98b..0d11f296 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Handlers/InterruptTaskExecutionRoutingHandler.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Handlers/InterruptTaskExecutionRoutingHandler.cs @@ -1,7 +1,7 @@ using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Routing; using BotSharp.Abstraction.Routing.Settings; -using BotSharp.Core.Routing.Planning; +using BotSharp.Core.Routing.Reasoning; namespace BotSharp.Core.Routing.Handlers; @@ -19,7 +19,7 @@ public class InterruptTaskExecutionRoutingHandler : RoutingHandlerBase//, IRouti public List Planers => new List { - nameof(HFPlanner) + nameof(HFReasoner) }; public InterruptTaskExecutionRoutingHandler(IServiceProvider services, ILogger logger, RoutingSettings settings) diff --git a/src/Infrastructure/BotSharp.Core/Routing/Handlers/RetrieveDataFromAgentRoutingHandler.cs b/src/Infrastructure/BotSharp.Core/Routing/Handlers/RetrieveDataFromAgentRoutingHandler.cs index 5b5b1025..038488eb 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Handlers/RetrieveDataFromAgentRoutingHandler.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Handlers/RetrieveDataFromAgentRoutingHandler.cs @@ -1,5 +1,5 @@ using BotSharp.Abstraction.Routing.Settings; -using BotSharp.Core.Routing.Planning; +using BotSharp.Core.Routing.Reasoning; namespace BotSharp.Core.Routing.Handlers; @@ -26,7 +26,7 @@ public class RetrieveDataFromAgentRoutingHandler : RoutingHandlerBase//, IRoutin public List Planers => new List { - nameof(HFPlanner) + nameof(HFReasoner) }; public RetrieveDataFromAgentRoutingHandler(IServiceProvider services, ILogger logger, RoutingSettings settings) diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/FirstStagePlanParameter.cs b/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/FirstStagePlanParameter.cs deleted file mode 100644 index 7bececc6..00000000 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/FirstStagePlanParameter.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Text.Json.Serialization; - -public class FirstStagePlanParameter -{ - [JsonPropertyName("input_args")] - public JsonDocument[] Parameters { get; set; } = new JsonDocument[0]; - - [JsonPropertyName("output_results")] - public string[] Results { get; set; } = new string[0]; - - public override string ToString() - { - return $"INPUTS:\r\n{JsonSerializer.Serialize(Parameters)}\r\n\r\nOUTPUTS:\r\n{JsonSerializer.Serialize(Results)}"; - } -} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlan.cs b/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlan.cs deleted file mode 100644 index f180c043..00000000 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlan.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Text.Json.Serialization; - -namespace BotSharp.Core.Routing.Planning; - -public class SecondStagePlan -{ - [JsonPropertyName("related_tables")] - public string[] Tables { get; set; } = new string[0]; - - [JsonPropertyName("description")] - public string Description { get; set; } = ""; - - [JsonPropertyName("tool_name")] - public string Tool { get; set; } = ""; - - [JsonPropertyName("input_args")] - public JsonDocument[] Parameters { get; set; } = new JsonDocument[0]; - - [JsonPropertyName("output_results")] - public string[] Results { get; set; } = new string[0]; -} diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlanParameter.cs b/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlanParameter.cs deleted file mode 100644 index 1d043740..00000000 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/TwoStagePlanner/SecondStagePlanParameter.cs +++ /dev/null @@ -1,4 +0,0 @@ -public class SecondStagePlanParameter : FirstStagePlanParameter -{ - -} diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/HFPlanner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs similarity index 72% rename from src/Infrastructure/BotSharp.Core/Routing/Planning/HFPlanner.cs rename to src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs index 8984da51..0c825a05 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/HFPlanner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs @@ -1,17 +1,33 @@ -using BotSharp.Abstraction.Routing.Planning; +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + +using BotSharp.Abstraction.Routing.Reasoning; using BotSharp.Abstraction.Templating; -namespace BotSharp.Core.Routing.Planning; +namespace BotSharp.Core.Routing.Reasoning; /// -/// Human feedback based planner +/// Human feedback based reasoner /// -public class HFPlanner : IRoutingPlaner +public class HFReasoner : IRoutingReasoner { private readonly IServiceProvider _services; private readonly ILogger _logger; - public HFPlanner(IServiceProvider services, ILogger logger) + public HFReasoner(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; @@ -37,7 +53,7 @@ public class HFPlanner : IRoutingPlaner { new RoleDialogModel(AgentRole.User, next) { - FunctionName = nameof(HFPlanner), + FunctionName = nameof(HFReasoner), MessageId = messageId } }; @@ -60,7 +76,7 @@ public class HFPlanner : IRoutingPlaner } // Fix LLM malformed response - PlannerHelper.FixMalformedResponse(_services, inst); + ReasonerHelper.FixMalformedResponse(_services, inst); return inst; } @@ -87,13 +103,13 @@ public class HFPlanner : IRoutingPlaner public async Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) { var context = _services.GetRequiredService(); - context.Empty(reason: $"Agent queue is cleared by {nameof(HFPlanner)}"); + context.Empty(reason: $"Agent queue is cleared by {nameof(HFReasoner)}"); return true; } private string GetNextStepPrompt(Agent router) { - var template = router.Templates.First(x => x.Name == "planner_prompt.hf").Content; + var template = router.Templates.First(x => x.Name == "reasoner.hf").Content; var render = _services.GetRequiredService(); // update states var conv = _services.GetRequiredService(); diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/InstructExecutor.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/InstructExecutor.cs similarity index 91% rename from src/Infrastructure/BotSharp.Core/Routing/Planning/InstructExecutor.cs rename to src/Infrastructure/BotSharp.Core/Routing/Reasoning/InstructExecutor.cs index a1d413f0..6bb23e97 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/InstructExecutor.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/InstructExecutor.cs @@ -1,6 +1,6 @@ -using BotSharp.Abstraction.Routing.Planning; +using BotSharp.Abstraction.Planning; -namespace BotSharp.Core.Routing.Planning; +namespace BotSharp.Core.Routing.Reasoning; public class InstructExecutor : IExecutor { diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/NaivePlanner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs similarity index 73% rename from src/Infrastructure/BotSharp.Core/Routing/Planning/NaivePlanner.cs rename to src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs index 6ebc5012..4f7bba6c 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/NaivePlanner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs @@ -1,16 +1,35 @@ +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + using BotSharp.Abstraction.Infrastructures.Enums; using BotSharp.Abstraction.Routing.Models; -using BotSharp.Abstraction.Routing.Planning; +using BotSharp.Abstraction.Routing.Reasoning; using BotSharp.Abstraction.Templating; -namespace BotSharp.Core.Routing.Planning; +namespace BotSharp.Core.Routing.Reasoning; -public class NaivePlanner : IRoutingPlaner +/// +/// simple or unsophisticated methods used to decide which specialized model or module in a system to engage for a given task. +/// +public class NaiveReasoner : IRoutingReasoner { private readonly IServiceProvider _services; private readonly ILogger _logger; - public NaivePlanner(IServiceProvider services, ILogger logger) + public NaiveReasoner(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; @@ -46,7 +65,7 @@ public class NaivePlanner : IRoutingPlaner { new RoleDialogModel(AgentRole.User, next) { - FunctionName = nameof(NaivePlanner), + FunctionName = nameof(NaiveReasoner), MessageId = messageId } }; @@ -69,7 +88,7 @@ public class NaivePlanner : IRoutingPlaner } // Fix LLM malformed response - PlannerHelper.FixMalformedResponse(_services, inst); + ReasonerHelper.FixMalformedResponse(_services, inst); return inst; } @@ -99,7 +118,7 @@ public class NaivePlanner : IRoutingPlaner } else { - context.Empty(reason: $"Agent queue is cleared by {nameof(NaivePlanner)}"); + context.Empty(reason: $"Agent queue is cleared by {nameof(NaiveReasoner)}"); // context.Push(inst.OriginalAgent, "Push user goal agent"); } return true; @@ -107,7 +126,7 @@ public class NaivePlanner : IRoutingPlaner private string GetNextStepPrompt(Agent router) { - var template = router.Templates.First(x => x.Name == "planner_prompt.naive").Content; + var template = router.Templates.First(x => x.Name == "reasoner.naive").Content; var states = _services.GetRequiredService(); var render = _services.GetRequiredService(); diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs new file mode 100644 index 00000000..97568751 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs @@ -0,0 +1,137 @@ +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + +using BotSharp.Abstraction.Infrastructures.Enums; +using BotSharp.Abstraction.Routing.Models; +using BotSharp.Abstraction.Routing.Reasoning; +using BotSharp.Abstraction.Templating; + +namespace BotSharp.Core.Routing.Reasoning; + +/// +/// One-step forward reasoning is a straightforward reasoning approach where the model or agent evaluates its current state +/// and takes the next best logical step toward the solution without extensive lookahead or planning. +/// This type of reasoning involves making a decision based on the current situation and immediate context +/// rather than considering multiple future steps or possibilities. +/// +public class OneStepForwardReasoner : IRoutingReasoner +{ + public string Name => "one-step-forward"; + + private readonly IServiceProvider _services; + private readonly ILogger _logger; + + public OneStepForwardReasoner(IServiceProvider services, ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task GetNextInstruction(Agent router, string messageId, List dialogs) + { + var next = GetNextStepPrompt(router); + + var inst = new FunctionCallFromLlm(); + + // chat completion + var completion = CompletionProvider.GetChatCompletion(_services, + provider: router?.LlmConfig?.Provider, + model: router?.LlmConfig?.Model); + + int retryCount = 0; + while (retryCount < 3) + { + string text = string.Empty; + try + { + // text completion + // text = await completion.GetCompletion(content, router.Id, messageId); + dialogs = new List + { + new RoleDialogModel(AgentRole.User, next) + { + FunctionName = Name, + MessageId = messageId + } + }; + var response = await completion.GetChatCompletions(router, dialogs); + + inst = response.Content.JsonContent(); + break; + } + catch (Exception ex) + { + _logger.LogError($"{ex.Message}: {text}"); + inst.Function = "response_to_user"; + inst.Response = ex.Message; + inst.AgentName = "Router"; + } + finally + { + retryCount++; + } + } + + // Fix LLM malformed response + ReasonerHelper.FixMalformedResponse(_services, inst); + + return inst; + } + + public async Task AgentExecuting(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + { + // Set user content as Planner's question + message.FunctionName = inst.Function; + message.FunctionArgs = inst.Arguments == null ? "{}" : JsonSerializer.Serialize(inst.Arguments); + + return true; + } + + public async Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + { + var context = _services.GetRequiredService(); + if (inst.UnmatchedAgent) + { + var unmatchedAgentId = context.GetCurrentAgentId(); + + // Exclude the wrong routed agent + var agents = router.TemplateDict["routing_agents"] as RoutableAgent[]; + router.TemplateDict["routing_agents"] = agents.Where(x => x.AgentId != unmatchedAgentId).ToArray(); + + // Handover to Router; + context.Pop(); + } + else + { + context.Empty(reason: $"Agent queue is cleared by {nameof(NaiveReasoner)}"); + // context.Push(inst.OriginalAgent, "Push user goal agent"); + } + return true; + } + + private string GetNextStepPrompt(Agent router) + { + var template = router.Templates.First(x => x.Name == "reasoner.one-step-forward").Content; + + var states = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + return render.Render(template, new Dictionary + { + { StateConst.EXPECTED_ACTION_AGENT, states.GetState(StateConst.EXPECTED_ACTION_AGENT) }, + { StateConst.EXPECTED_GOAL_AGENT, states.GetState(StateConst.EXPECTED_GOAL_AGENT) } + }); + } +} diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/PlannerHelper.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/ReasonerHelper.cs similarity index 96% rename from src/Infrastructure/BotSharp.Core/Routing/Planning/PlannerHelper.cs rename to src/Infrastructure/BotSharp.Core/Routing/Reasoning/ReasonerHelper.cs index 4500ca1d..7c8debf6 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/PlannerHelper.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/ReasonerHelper.cs @@ -1,6 +1,6 @@ -namespace BotSharp.Core.Routing.Planning; +namespace BotSharp.Core.Routing.Reasoning; -public static class PlannerHelper +public static class ReasonerHelper { /// /// Sometimes LLM hallucinates and fails to set function names correctly. diff --git a/src/Infrastructure/BotSharp.Core/Routing/Planning/SequentialPlanner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs similarity index 81% rename from src/Infrastructure/BotSharp.Core/Routing/Planning/SequentialPlanner.cs rename to src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs index f6b05375..33344c8d 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Planning/SequentialPlanner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs @@ -1,11 +1,30 @@ +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + using BotSharp.Abstraction.MLTasks; using BotSharp.Abstraction.Routing.Models; -using BotSharp.Abstraction.Routing.Planning; +using BotSharp.Abstraction.Routing.Reasoning; using BotSharp.Abstraction.Templating; -namespace BotSharp.Core.Routing.Planning; +namespace BotSharp.Core.Routing.Reasoning; -public class SequentialPlanner : IRoutingPlaner +/// +/// Sequential tasks focused reasoning approach +/// +public class SequentialReasoner : IRoutingReasoner { private readonly IServiceProvider _services; private readonly ILogger _logger; @@ -14,7 +33,7 @@ public class SequentialPlanner : IRoutingPlaner public int MaxLoopCount => 100; private FunctionCallFromLlm _lastInst; - public SequentialPlanner(IServiceProvider services, ILogger logger) + public SequentialReasoner(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; @@ -72,7 +91,7 @@ public class SequentialPlanner : IRoutingPlaner { new RoleDialogModel(AgentRole.User, next) { - FunctionName = nameof(SequentialPlanner), + FunctionName = nameof(SequentialReasoner), MessageId = messageId } }; @@ -139,7 +158,7 @@ public class SequentialPlanner : IRoutingPlaner if (message.StopCompletion) { - context.Empty(reason: $"Agent queue is cleared by {nameof(SequentialPlanner)}"); + context.Empty(reason: $"Agent queue is cleared by {nameof(SequentialReasoner)}"); return false; } @@ -154,7 +173,7 @@ public class SequentialPlanner : IRoutingPlaner private string GetNextStepPrompt(Agent router) { - var template = router.Templates.First(x => x.Name == "planner_prompt.sequential").Content; + var template = router.Templates.First(x => x.Name == "reasoner.sequential").Content; var render = _services.GetRequiredService(); return render.Render(template, new Dictionary @@ -169,11 +188,11 @@ public class SequentialPlanner : IRoutingPlaner var inst = new DecomposedStep(); var llmProviderService = _services.GetRequiredService(); - var model = llmProviderService.GetProviderModel("azure-openai", "gpt-4"); + var model = llmProviderService.GetProviderModel("openai", "gpt-4o"); // chat completion var completion = CompletionProvider.GetChatCompletion(_services, - provider: "azure-openai", + provider: "openai", model: model.Name); int retryCount = 0; @@ -185,7 +204,7 @@ public class SequentialPlanner : IRoutingPlaner var response = await completion.GetChatCompletions(new Agent { Id = router.Id, - Name = nameof(SequentialPlanner), + Name = nameof(SequentialReasoner), Instruction = systemPrompt }, dialogs); @@ -208,7 +227,7 @@ public class SequentialPlanner : IRoutingPlaner private string GetDecomposeTaskPrompt(Agent router) { - var template = router.Templates.First(x => x.Name == "planner_prompt.sequential.get_remaining_task").Content; + var template = router.Templates.First(x => x.Name == "reasoner.sequential.get_remaining_task").Content; var render = _services.GetRequiredService(); return render.Render(template, new Dictionary diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs index 7a751057..f5c2a9d6 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs @@ -1,10 +1,8 @@ -using BotSharp.Abstraction.Routing; -using BotSharp.Abstraction.Routing.Models; -using BotSharp.Abstraction.Routing.Planning; +using BotSharp.Abstraction.Routing.Reasoning; using BotSharp.Abstraction.Routing.Settings; using BotSharp.Abstraction.Settings; using BotSharp.Core.Routing.Hooks; -using BotSharp.Core.Routing.Planning; +using BotSharp.Core.Routing.Reasoning; using Microsoft.Extensions.Configuration; namespace BotSharp.Core.Routing; @@ -35,8 +33,10 @@ public class RoutingPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + services.AddScoped(); } } diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.GetPlanner.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.GetPlanner.cs deleted file mode 100644 index 0fcaa5a1..00000000 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.GetPlanner.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BotSharp.Abstraction.Routing.Enums; -using BotSharp.Abstraction.Routing.Planning; -using BotSharp.Core.Routing.Planning; - -namespace BotSharp.Core.Routing; - -public partial class RoutingService -{ - public IRoutingPlaner GetPlanner(Agent router) - { - var rule = router.RoutingRules.FirstOrDefault(x => x.Type == RuleType.Planner); - - var planner = _services.GetServices(). - FirstOrDefault(x => x.GetType().Name.EndsWith(rule.Field)); - - if (planner == null) - { - _logger.LogError($"Can't find specific planner named {rule.Field}"); - return _services.GetRequiredService(); - } - - return planner; - } -} diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs new file mode 100644 index 00000000..5b84122c --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs @@ -0,0 +1,112 @@ +using BotSharp.Abstraction.Infrastructures.Enums; +using BotSharp.Abstraction.Planning; +using BotSharp.Abstraction.Routing.Enums; +using BotSharp.Abstraction.Routing.Reasoning; +using BotSharp.Core.Routing.Reasoning; + +namespace BotSharp.Core.Routing; + +public partial class RoutingService +{ + public async Task InstructLoop(RoleDialogModel message, List dialogs) + { + RoleDialogModel response = default; + + var agentService = _services.GetRequiredService(); + var convService = _services.GetRequiredService(); + var storage = _services.GetRequiredService(); + + _router = await agentService.LoadAgent(message.CurrentAgentId); + + var states = _services.GetRequiredService(); + var executor = _services.GetRequiredService(); + + var planner = GetReasoner(_router); + + _context.Push(_router.Id); + + // Handle multi-language for input + var agentSettings = _services.GetRequiredService(); + if (agentSettings.EnableTranslator) + { + var translator = _services.GetRequiredService(); + + var language = states.GetState(StateConst.LANGUAGE, LanguageType.ENGLISH); + if (language != LanguageType.ENGLISH) + { + message.SecondaryContent = message.Content; + message.Content = await translator.Translate(_router, message.MessageId, message.Content, + language: LanguageType.ENGLISH, + clone: false); + } + } + + dialogs.Add(message); + storage.Append(convService.ConversationId, message); + + // Get first instruction + _router.TemplateDict["conversation"] = await GetConversationContent(dialogs); + var inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs); + + int loopCount = 1; + while (true) + { + await HookEmitter.Emit(_services, async hook => + await hook.OnRoutingInstructionReceived(inst, message) + ); + + // Save states + states.SaveStateByArgs(inst.Arguments); + +#if DEBUG + Console.WriteLine($"*** Next Instruction *** {inst}"); +#else + _logger.LogInformation($"*** Next Instruction *** {inst}"); +#endif + await planner.AgentExecuting(_router, inst, message, dialogs); + + // Handover to Task Agent + if (inst.HandleDialogsByPlanner) + { + var dialogWithoutContext = planner.BeforeHandleContext(inst, message, dialogs); + response = await executor.Execute(this, inst, message, dialogWithoutContext); + planner.AfterHandleContext(dialogs, dialogWithoutContext); + } + else + { + response = await executor.Execute(this, inst, message, dialogs); + } + + await planner.AgentExecuted(_router, inst, response, dialogs); + + if (loopCount >= planner.MaxLoopCount || _context.IsEmpty) + { + break; + } + + // Get next instruction from Planner + _router.TemplateDict["conversation"] = await GetConversationContent(dialogs); + inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs); + loopCount++; + } + + return response; + } + + public IRoutingReasoner GetReasoner(Agent router) + { + var rule = router.RoutingRules.FirstOrDefault(x => x.Type == RuleType.Reasoner); + + var reasoner = _services.GetServices(). + FirstOrDefault(x => x.GetType().Name.EndsWith(rule.Field)); + + if (reasoner == null) + { + _logger.LogError($"Can't find specific planner named {rule.Field}"); + // Default use NaiveReasoner + return _services.GetRequiredService(); + } + + return reasoner; + } +} diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs index 770acaf9..efe9d573 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs @@ -1,6 +1,4 @@ -using BotSharp.Abstraction.Infrastructures.Enums; using BotSharp.Abstraction.Routing.Models; -using BotSharp.Abstraction.Routing.Planning; using BotSharp.Abstraction.Routing.Settings; namespace BotSharp.Core.Routing; @@ -75,97 +73,12 @@ public partial class RoutingService : IRoutingService return response; } - public async Task InstructLoop(RoleDialogModel message, List dialogs) - { - RoleDialogModel response = default; - - var agentService = _services.GetRequiredService(); - var convService = _services.GetRequiredService(); - var storage = _services.GetRequiredService(); - - _router = await agentService.LoadAgent(message.CurrentAgentId); - - var states = _services.GetRequiredService(); - var executor = _services.GetRequiredService(); - - var planner = GetPlanner(_router); - - _context.Push(_router.Id); - - // Handle multi-language for input - var agentSettings = _services.GetRequiredService(); - if (agentSettings.EnableTranslator) - { - var translator = _services.GetRequiredService(); - - var language = states.GetState(StateConst.LANGUAGE, LanguageType.ENGLISH); - if (language != LanguageType.ENGLISH) - { - message.SecondaryContent = message.Content; - message.Content = await translator.Translate(_router, message.MessageId, message.Content, - language: LanguageType.ENGLISH, - clone: false); - } - } - - dialogs.Add(message); - storage.Append(convService.ConversationId, message); - - // Get first instruction - _router.TemplateDict["conversation"] = await GetConversationContent(dialogs); - var inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs); - - int loopCount = 1; - while (true) - { - await HookEmitter.Emit(_services, async hook => - await hook.OnRoutingInstructionReceived(inst, message) - ); - - // Save states - states.SaveStateByArgs(inst.Arguments); - -#if DEBUG - Console.WriteLine($"*** Next Instruction *** {inst}"); -#else - _logger.LogInformation($"*** Next Instruction *** {inst}"); -#endif - await planner.AgentExecuting(_router, inst, message, dialogs); - - // Handover to Task Agent - if (inst.HandleDialogsByPlanner) - { - var dialogWithoutContext = planner.BeforeHandleContext(inst, message, dialogs); - response = await executor.Execute(this, inst, message, dialogWithoutContext); - planner.AfterHandleContext(dialogs, dialogWithoutContext); - } - else - { - response = await executor.Execute(this, inst, message, dialogs); - } - - await planner.AgentExecuted(_router, inst, response, dialogs); - - if (loopCount >= planner.MaxLoopCount || _context.IsEmpty) - { - break; - } - - // Get next instruction from Planner - _router.TemplateDict["conversation"] = await GetConversationContent(dialogs); - inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs); - loopCount++; - } - - return response; - } - public List GetHandlers(Agent router) { - var planer = GetPlanner(router); + var reasoner = GetReasoner(router); return _services.GetServices() - .Where(x => x.Planers == null || x.Planers.Contains(planer.GetType().Name)) + .Where(x => x.Planers == null || x.Planers.Contains(reasoner.GetType().Name)) .Where(x => !string.IsNullOrEmpty(x.Description)) .Select((x, i) => new RoutingHandlerDef { diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json index 3159bb08..992e04f3 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json @@ -11,8 +11,8 @@ "profiles": [ "tool" ], "routingRules": [ { - "type": "planner", - "field": "HFPlanner" + "type": "reasoner", + "field": "HFReasoner" } ] } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.hf.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.hf.liquid similarity index 100% rename from src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.hf.liquid rename to src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.hf.liquid diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.naive.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.naive.liquid similarity index 100% rename from src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.naive.liquid rename to src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.naive.liquid diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid new file mode 100644 index 00000000..dd6fe616 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid @@ -0,0 +1,2 @@ +Analyze the user's problem. Which prerequisite task needs to be completed? Output the next step of routing instructions. +Check the job responsibilities of the routable Agent and do not transfer to an Agent that exceeds the scope of responsibility. \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.sequential.get_remaining_task.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.sequential.get_remaining_task.liquid similarity index 100% rename from src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.sequential.get_remaining_task.liquid rename to src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.sequential.get_remaining_task.liquid diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.sequential.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.sequential.liquid similarity index 100% rename from src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/planner_prompt.sequential.liquid rename to src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.sequential.liquid diff --git a/src/Plugins/BotSharp.Plugin.CodeDriver/data/agents/c0ded7d9-3f9d-4ef6-b7ce-56a892dcef62/agent.json b/src/Plugins/BotSharp.Plugin.CodeDriver/data/agents/c0ded7d9-3f9d-4ef6-b7ce-56a892dcef62/agent.json index 4ed8765c..038c969e 100644 --- a/src/Plugins/BotSharp.Plugin.CodeDriver/data/agents/c0ded7d9-3f9d-4ef6-b7ce-56a892dcef62/agent.json +++ b/src/Plugins/BotSharp.Plugin.CodeDriver/data/agents/c0ded7d9-3f9d-4ef6-b7ce-56a892dcef62/agent.json @@ -8,7 +8,7 @@ "updatedDateTime": "2024-11-23T00:00:00Z", "disabled": false, "isPublic": true, - "profiles": [ "database" ], + "profiles": [ "coding" ], "llmConfig": { "provider": "openai", "model": "gpt-4o", diff --git a/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs b/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs index aba02745..17d84c1c 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs @@ -1,4 +1,4 @@ -using BotSharp.Abstraction.Routing.Planning; +using BotSharp.Abstraction.Planning; using BotSharp.Plugin.Planner.TwoStaging; namespace BotSharp.Plugin.Planner; @@ -17,7 +17,7 @@ public class PlannerPlugin : IBotSharpPlugin public void RegisterDI(IServiceCollection services, IConfiguration config) { - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); } diff --git a/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs b/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs index 565115a5..47b9c03a 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs @@ -1,10 +1,10 @@ using BotSharp.Abstraction.Infrastructures.Enums; -using BotSharp.Abstraction.Routing.Planning; -using BotSharp.Core.Routing.Planning; +using BotSharp.Abstraction.Planning; +using BotSharp.Core.Routing.Reasoning; namespace BotSharp.Plugin.Planner.TwoStaging; -public partial class TwoStageTaskPlanner : IRoutingPlaner +public partial class TwoStageTaskPlanner : ITaskPlanner { private readonly IServiceProvider _services; private readonly ILogger _logger; @@ -40,7 +40,7 @@ public partial class TwoStageTaskPlanner : IRoutingPlaner inst = response.Content.JsonContent(); // Fix LLM malformed response - PlannerHelper.FixMalformedResponse(_services, inst); + ReasonerHelper.FixMalformedResponse(_services, inst); return inst; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json index 1d5aca1f..1ec4bfce 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json @@ -1,7 +1,7 @@ { "id": "beda4c12-e1ec-4b4b-b328-3df4a6687c4f", "name": "SQL Driver", - "description": "Execute the sql query in database from the latest dialog.", + "description": "Transfer to this Agent is allowed only when executable SQL statements are provided in the context.", "iconUrl": "https://cdn-icons-png.flaticon.com/512/3161/3161158.png", "type": "task", "createdDateTime": "2023-11-15T13:49:00Z", @@ -18,7 +18,7 @@ "field": "sql_statement", "required": true, "field_type": "string", - "description": "SQL statement" + "description": "SQL statement provided in the context" } ] } \ No newline at end of file From b62168a62685dada3a791b0cee01812b2997cd9c Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Mon, 25 Nov 2024 19:22:08 -0600 Subject: [PATCH 038/100] remove unnecessary function --- .../BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs index 33344c8d..959747db 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs @@ -234,9 +234,4 @@ public class SequentialReasoner : IRoutingReasoner { }); } - - public Task GetNextInstruction(Agent router, string messageId) - { - throw new NotImplementedException(); - } } From a336cc9dc5c257b3b678a7cffdac9e5d1a4869bc Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 26 Nov 2024 05:56:10 +0000 Subject: [PATCH 039/100] Fix Ad --- .../Infrastructures/Events/IEventPublisher.cs | 2 +- .../BotSharp.Abstraction/Utilities/Pagination.cs | 2 ++ .../BotSharp.Core/Infrastructures/Events/RedisPublisher.cs | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs index f2276c13..31a708bc 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs @@ -10,7 +10,7 @@ public interface IEventPublisher /// Task BroadcastAsync(string channel, string message); - Task PublishAsync(string channel, string message, EventPriority? priority = null); + Task PublishAsync(string channel, string message, EventPriority? priority = null); Task ReDispatchAsync(string channel, int count = 10, string order = "asc"); diff --git a/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs b/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs index 8e5c7f23..4d21013b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Utilities/Pagination.cs @@ -1,7 +1,9 @@ using BotSharp.Abstraction.Infrastructures; +using System.Diagnostics; namespace BotSharp.Abstraction.Utilities; +[DebuggerStepThrough] public class Pagination : ICacheKey { private int _page; diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index 435451d4..32889f4f 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -21,7 +21,7 @@ public class RedisPublisher : IEventPublisher await _subscriber.PublishAsync(channel, message); } - public async Task PublishAsync(string channel, string message, EventPriority? priority = null) + public async Task PublishAsync(string channel, string message, EventPriority? priority = null) { var db = _redis.GetDatabase(); @@ -34,7 +34,7 @@ public class RedisPublisher : IEventPublisher if (CheckMessageExists(db, channel, "message", message)) { _logger.LogError($"The message already exists {channel} {message}"); - return; + return null; } // Add a message to the stream, keeping only the latest 1 million messages @@ -46,6 +46,8 @@ public class RedisPublisher : IEventPublisher maxLength: 1000 * 10000); _logger.LogInformation($"Published message {channel} {message} ({messageId})"); + + return messageId; } private bool CheckMessageExists(IDatabase db, string channel, string fieldName, string desiredValue) From 8056369dee78bd6e52c7de14b390f992cede74c2 Mon Sep 17 00:00:00 2001 From: YouWeiDH Date: Tue, 26 Nov 2024 18:20:00 +0800 Subject: [PATCH 040/100] hdong:change affiliate code name. --- src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs | 2 +- .../BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs index df1ff190..7699a58b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs @@ -23,7 +23,7 @@ public class User public bool Verified { get; set; } public string RegionCode { get; set; } = "CN"; public string? AffiliateId { get; set; } - public string? AffiliateCode { get; set; } + public string? ReferralCode { get; set; } public string? EmployeeId { get; set; } public bool IsDisabled { get; set; } public IEnumerable Permissions { get; set; } = []; diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs index 27bdc0aa..b529a832 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs @@ -13,7 +13,7 @@ public class UserCreationModel public string Type { get; set; } = UserType.Client; public string Role { get; set; } = UserRole.User; public string RegionCode { get; set; } = "CN"; - public string? AffiliateCode { get; set; } + public string? ReferralCode { get; set; } public User ToUser() { return new User @@ -27,7 +27,7 @@ public class UserCreationModel Role = Role, Type = Type, RegionCode = RegionCode, - AffiliateCode = AffiliateCode + ReferralCode = ReferralCode }; } } From c75043d48453fd566909f0a75d7848298f7bd063 Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Tue, 26 Nov 2024 18:25:30 +0800 Subject: [PATCH 041/100] fix: remove HideMiddleDigits --- .../BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs index ff220e9d..b3183bc9 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs @@ -1,5 +1,4 @@ using BotSharp.Abstraction.Users.Enums; -using BotSharp.Core.Infrastructures; using System.Text.Json.Serialization; namespace BotSharp.OpenAPI.ViewModels.Users; @@ -58,8 +57,10 @@ public class UserViewModel UserName = user.UserName, FirstName = user.FirstName, LastName = user.LastName, - Email = Utilities.HideMiddleDigits(user.Email, true), - Phone = Utilities.HideMiddleDigits((!string.IsNullOrWhiteSpace(user.Phone) ? user.Phone.Replace("+86", String.Empty) : user.Phone)), + //Email = Utilities.HideMiddleDigits(user.Email, true), + //Phone = Utilities.HideMiddleDigits((!string.IsNullOrWhiteSpace(user.Phone) ? user.Phone.Replace("+86", String.Empty) : user.Phone)), + Email = user.Email, + Phone = !string.IsNullOrWhiteSpace(user.Phone) ? user.Phone.Replace("+86", String.Empty) : user.Phone, Type = user.Type, Role = user.Role, Source = user.Source, From 3f6a63b67c38c6ced436e7e880194182f495543c Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Tue, 26 Nov 2024 19:33:54 +0800 Subject: [PATCH 042/100] perf: Use IsNullOrWhiteSpace --- .../BotSharp.Core/Users/Services/UserService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 3858d63d..647ed59c 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -525,7 +525,7 @@ public class UserService : IUserService public async Task VerifyEmailExisting(string email) { - if (string.IsNullOrEmpty(email)) + if (string.IsNullOrWhiteSpace(email)) { return true; } @@ -542,7 +542,7 @@ public class UserService : IUserService public async Task VerifyPhoneExisting(string phone, string regionCode) { - if (string.IsNullOrEmpty(phone)) + if (string.IsNullOrWhiteSpace(phone)) { return true; } From 24f9f30a53ef9b970fff04e6935e972a75f31298 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 26 Nov 2024 11:15:26 -0600 Subject: [PATCH 043/100] fix typo --- src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs | 2 +- src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs | 2 +- .../BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index f195591a..496466e2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -58,7 +58,7 @@ public abstract class AgentHookBase : IAgentHook { } - public virtual void OnAgentUtilityloaded(Agent agent) + public virtual void OnAgentUtilityLoaded(Agent agent) { if (agent.Type == AgentType.Routing) return; diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs index ceb212bf..a3f53fb6 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs @@ -25,7 +25,7 @@ public interface IAgentHook bool OnSamplesLoaded(List samples); - void OnAgentUtilityloaded(Agent agent); + void OnAgentUtilityLoaded(Agent agent); /// /// Triggered when agent is loaded completely. diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs index 45121830..396a7d15 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs @@ -67,7 +67,7 @@ public partial class AgentService hook.OnSamplesLoaded(agent.Samples); } - hook.OnAgentUtilityloaded(agent); + hook.OnAgentUtilityLoaded(agent); hook.OnAgentLoaded(agent); } From 65ffe84ca01dd96d76f48c18add08ff9b9617629 Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Wed, 27 Nov 2024 17:23:20 +0800 Subject: [PATCH 044/100] fix: update SplitAsTuple --- .../BotSharp.Core/Infrastructures/Utilities.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs index 613643f4..db5a9a7d 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs @@ -30,10 +30,16 @@ public static class Utilities return sb.ToString(); } - public static (string, string) SplitAsTuple(this string str, string sep) + public static (string, string, string) SplitAsTuple(this string str, string sep) { var splits = str.Split(sep); - return (splits[0], splits[1]); + + if (splits.Length == 2 || string.IsNullOrWhiteSpace(splits[2])) + { + return (splits[0], splits[1], "CN"); + } + + return (splits[0], splits[1], splits[2]); } /// From fcc08859dcdc255b7766010668283e5f9bcb1a6b Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Wed, 27 Nov 2024 17:26:21 +0800 Subject: [PATCH 045/100] fix: receive regionCode --- .../BotSharp.Core/Users/Services/UserService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 647ed59c..1938302f 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -148,7 +148,7 @@ public class UserService : IUserService public async Task GetAffiliateToken(string authorization) { var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); - var (id, password) = base64.SplitAsTuple(":"); + var (id, password, regionCode) = base64.SplitAsTuple(":"); var db = _services.GetRequiredService(); var record = db.GetAffiliateUserByPhone(id); var isCanLogin = record != null && !record.IsDisabled && record.Type == UserType.Affiliate; @@ -170,7 +170,7 @@ public class UserService : IUserService public async Task GetAdminToken(string authorization) { var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); - var (id, password) = base64.SplitAsTuple(":"); + var (id, password, regionCode) = base64.SplitAsTuple(":"); var db = _services.GetRequiredService(); var record = db.GetUserByPhone(id, type: UserType.Internal); var isCanLogin = record != null && !record.IsDisabled @@ -210,13 +210,13 @@ public class UserService : IUserService public async Task GetToken(string authorization) { var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); - var (id, password) = base64.SplitAsTuple(":"); + var (id, password, regionCode) = base64.SplitAsTuple(":"); var db = _services.GetRequiredService(); var record = id.Contains("@") ? db.GetUserByEmail(id) : db.GetUserByUserName(id); if (record == null) { - record = db.GetUserByPhone(id); + record = db.GetUserByPhone(id, regionCode: regionCode); } if (record != null && record.Type == UserType.Affiliate) From ae2049c53edb206fad30840c83cc915e12bc0d10 Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Wed, 27 Nov 2024 17:27:32 +0800 Subject: [PATCH 046/100] fix: update GetUserByPhone --- .../Repository/MongoRepository.User.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index 8a381069..c2792b23 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -22,7 +22,14 @@ public partial class MongoRepository return null; } - phoneSecond = phone.StartsWith("+86") ? phone.Replace("+86", "") : $"+86{phone}"; + if (regionCode == "CN") + { + phoneSecond = (phone ?? "").StartsWith("+86") ? (phone ?? "").Replace("+86", "") : ($"+86{phone ?? ""}"); + } + else + { + phoneSecond = (phone ?? "").Substring(regionCode == "US" ? 2 : 3); + } var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) && (x.RegionCode == regionCode || string.IsNullOrWhiteSpace(x.RegionCode)) From 9793816e668c5786c548b3b0e1279ba0a1e8300a Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Wed, 27 Nov 2024 21:23:28 -0600 Subject: [PATCH 047/100] Fix sql_select dbtype --- .../Functions/ExecuteQueryFn.cs | 7 +---- .../Functions/SqlSelect.cs | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs index 99060105..f571fa6c 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs @@ -1,14 +1,8 @@ -using BotSharp.Abstraction.Agents.Enums; -using BotSharp.Abstraction.Routing; using BotSharp.Core.Infrastructures; -using BotSharp.Plugin.SqlDriver.Interfaces; -using BotSharp.Plugin.SqlDriver.Models; using Dapper; using Microsoft.Data.SqlClient; -using Microsoft.Extensions.Logging; using MySqlConnector; using Npgsql; -using System.Data.Common; namespace BotSharp.Plugin.SqlDriver.Functions; @@ -113,6 +107,7 @@ public class ExecuteQueryFn : IFunctionCallback using var connection = new SqlConnection(settings.SqlServerExecutionConnectionString ?? settings.SqlServerConnectionString); return connection.Query(string.Join("\r\n", sqlTexts)); } + private IEnumerable RunQueryInRedshift(string[] sqlTexts) { var settings = _services.GetRequiredService(); diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs index cfc9765f..eb9253e4 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs @@ -1,6 +1,6 @@ -using BotSharp.Plugin.SqlDriver.Models; using Microsoft.Data.SqlClient; using MySqlConnector; +using Npgsql; using static Dapper.SqlMapper; namespace BotSharp.Plugin.SqlDriver.Functions; @@ -26,12 +26,15 @@ public class SqlSelect : IFunctionCallback } // check if need to instantely - var settings = _services.GetRequiredService(); - var result = settings.DatabaseType switch + var dbHook = _services.GetRequiredService(); + var dbType = dbHook.GetDatabaseType(message); + + var result = dbType switch { - "MySql" => RunQueryInMySql(args), - "SqlServer" => RunQueryInSqlServer(args), - _ => throw new NotImplementedException($"Database type {settings.DatabaseType} is not supported.") + "mysql" => RunQueryInMySql(args), + "sqlserver" => RunQueryInSqlServer(args), + "redshift" => RunQueryInRedshift(args), + _ => throw new NotImplementedException($"Database type {dbType} is not supported.") }; if (result == null) @@ -70,4 +73,16 @@ public class SqlSelect : IFunctionCallback } return connection.Query(args.Statement, dictionary); } + + private IEnumerable RunQueryInRedshift(SqlStatement args) + { + var settings = _services.GetRequiredService(); + using var connection = new NpgsqlConnection(settings.RedshiftConnectionString); + var dictionary = new Dictionary(); + foreach (var p in args.Parameters) + { + dictionary["@" + p.Name] = p.Value; + } + return connection.Query(args.Statement, dictionary); + } } From 45bf766ef87514f9973ad253972c10b0b8572a11 Mon Sep 17 00:00:00 2001 From: Aden <128471249+adenchen123@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:31:20 +0800 Subject: [PATCH 048/100] Update ConversationService.cs --- .../Conversations/Services/ConversationService.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index f6326a7b..55d80c18 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -173,12 +173,14 @@ public partial class ConversationService : IConversationService var state = _services.GetRequiredService(); var channel = state.GetState("channel"); var channelId = state.GetState("channel_id"); + var userId = state.GetState("current_user_id"); var sess = new Conversation { Id = _conversationId, Channel = channel, ChannelId = channelId, - AgentId = agentId + AgentId = agentId, + UserId = userId, }; converation = await NewConversation(sess); } From da90856638f0e791247355669a271b1f25155494 Mon Sep 17 00:00:00 2001 From: AnonymousDotNet <18776095145@163.com> Date: Fri, 29 Nov 2024 17:08:27 +0800 Subject: [PATCH 049/100] fix: Add regionCode verification --- .../BotSharp.Core/Users/Services/UserService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 0cddc5b7..9bc436a7 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -570,7 +570,7 @@ public class UserService : IUserService if (!string.IsNullOrEmpty(user.Phone)) { - record = db.GetUserByPhone(user.Phone); + record = db.GetUserByPhone(user.Phone, regionCode: user.RegionCode); } if (!string.IsNullOrEmpty(user.Email)) @@ -745,7 +745,7 @@ public class UserService : IUserService await Task.CompletedTask; return true; } - + public async Task RemoveDashboardConversation(string userId, string conversationId) { var db = _services.GetRequiredService(); From 039054ad9ea5b18bafd7c49a67ae91e23f748803 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Fri, 29 Nov 2024 17:12:44 -0600 Subject: [PATCH 050/100] allow CancellationToken --- .../Infrastructures/Events/IEventSubscriber.cs | 6 +++++- .../Infrastructures/Events/RedisSubscriber.cs | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs index fa96bb35..e04c2488 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs @@ -1,8 +1,12 @@ +using System.Threading; + namespace BotSharp.Abstraction.Infrastructures.Events; public interface IEventSubscriber { Task SubscribeAsync(string channel, Func received); - Task SubscribeAsync(string channel, string group, bool priorityEnabled, Func received); + Task SubscribeAsync(string channel, string group, bool priorityEnabled, + Func received, + CancellationToken? stoppingToken = null); } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index 89b38a8d..34ff0079 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -25,7 +25,9 @@ public class RedisSubscriber : IEventSubscriber }); } - public async Task SubscribeAsync(string channel, string group, bool priorityEnabled, Func received) + public async Task SubscribeAsync(string channel, string group, bool priorityEnabled, + Func received, + CancellationToken? stoppingToken = null) { var db = _redis.GetDatabase(); @@ -44,6 +46,12 @@ public class RedisSubscriber : IEventSubscriber { await Task.Delay(100); + if (stoppingToken.HasValue && stoppingToken.Value.IsCancellationRequested) + { + _logger.LogInformation($"Stopping consumer channel & group: [{channel}, {group}]"); + break; + } + if (priorityEnabled) { if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) From 5f31ffe6587e3321238ee346146b938feff5dff2 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sat, 30 Nov 2024 15:16:04 +0000 Subject: [PATCH 051/100] Allow Event to be removed. --- .../Infrastructures/Events/IEventPublisher.cs | 2 ++ .../Infrastructures/Events/RedisPublisher.cs | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs index 31a708bc..58b18cba 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventPublisher.cs @@ -15,4 +15,6 @@ public interface IEventPublisher Task ReDispatchAsync(string channel, int count = 10, string order = "asc"); Task ReDispatchPendingAsync(string channel, string group, int count = 10); + + Task RemoveAsync(string channel, int count = 10); } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs index 32889f4f..89de2453 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisPublisher.cs @@ -158,4 +158,26 @@ public class RedisPublisher : IEventPublisher Console.WriteLine($"Redis error: {ex.Message}"); } } + + public async Task RemoveAsync(string channel, int count = 10) + { + var db = _redis.GetDatabase(); + + var entries = await db.StreamRangeAsync(channel, "-", "+", count: count, messageOrder: Order.Ascending); + foreach (var entry in entries) + { + _logger.LogInformation($"Fetched message: {channel} {entry.Values[0].Value} ({entry.Id})"); + + try + { + await db.StreamDeleteAsync(channel, [entry.Id]); + + _logger.LogWarning($"Deleted message: {channel} {entry.Values[0].Value} ({entry.Id})"); + } + catch (Exception ex) + { + _logger.LogError($"Error processing message: {ex.Message}, event id: {channel} {entry.Id}\r\n{ex}"); + } + } + } } From 4cf3531c327d94c023e11e401e2791ef087b1c16 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sun, 1 Dec 2024 17:38:17 +0000 Subject: [PATCH 052/100] Add ExecutionTimeout --- .../Repositories/BotSharpDatabaseSettings.cs | 21 +++++++++++-------- .../BotSharp.Core/BotSharp.Core.csproj | 2 +- .../BotSharp.Plugin.MongoStorage.csproj | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/BotSharpDatabaseSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/BotSharpDatabaseSettings.cs index b3c26033..19f5b141 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/BotSharpDatabaseSettings.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/BotSharpDatabaseSettings.cs @@ -2,18 +2,19 @@ namespace BotSharp.Abstraction.Repositories; public class BotSharpDatabaseSettings : DatabaseBasicSettings { - public string[] Assemblies { get; set; } - public string FileRepository { get; set; } - public string BotSharpMongoDb { get; set; } - public string TablePrefix { get; set; } - public DbConnectionSetting BotSharp { get; set; } - public string Redis { get; set; } + public string[] Assemblies { get; set; } = []; + public string FileRepository { get; set; } = string.Empty; + public string BotSharpMongoDb { get; set; } = string.Empty; + public string TablePrefix { get; set; } = string.Empty; + public DbConnectionSetting BotSharp { get; set; } = new(); + public string Redis { get; set; } = string.Empty; + public bool EnableReplica { get; set; } = true; } public class DatabaseBasicSettings { - public string Default { get; set; } - public DbConnectionSetting DefaultConnection { get; set; } + public string Default { get; set; } = string.Empty; + public DbConnectionSetting DefaultConnection { get; set; } = new(); public bool EnableSqlLog { get; set; } public bool EnableSensitiveDataLogging { get; set; } public bool EnableRetryOnFailure { get; set; } @@ -23,9 +24,11 @@ public class DbConnectionSetting { public string Master { get; set; } public string[] Slavers { get; set; } + public int ConnectionTimeout { get; set; } = 30; + public int ExecutionTimeout { get; set; } = 30; public DbConnectionSetting() { - Slavers = new string[0]; + Slavers = []; } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj b/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj index 1c82c84f..1c9955aa 100644 --- a/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj +++ b/src/Infrastructure/BotSharp.Core/BotSharp.Core.csproj @@ -190,7 +190,7 @@ - + diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj b/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj index ab14d864..dced7973 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj @@ -11,8 +11,8 @@ - - + + From 3dc76fc7f564636af94a0d99bea74327f4ddb352 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sun, 1 Dec 2024 23:06:21 +0000 Subject: [PATCH 053/100] Support port for event --- .../Events/IEventSubscriber.cs | 2 +- .../Infrastructures/Events/RedisSubscriber.cs | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs index e04c2488..465644ad 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Events/IEventSubscriber.cs @@ -6,7 +6,7 @@ public interface IEventSubscriber { Task SubscribeAsync(string channel, Func received); - Task SubscribeAsync(string channel, string group, bool priorityEnabled, + Task SubscribeAsync(string channel, string group, int? port, bool priorityEnabled, Func received, CancellationToken? stoppingToken = null); } diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs index 34ff0079..9a3c9982 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Events/RedisSubscriber.cs @@ -25,7 +25,7 @@ public class RedisSubscriber : IEventSubscriber }); } - public async Task SubscribeAsync(string channel, string group, bool priorityEnabled, + public async Task SubscribeAsync(string channel, string group, int? port, bool priorityEnabled, Func received, CancellationToken? stoppingToken = null) { @@ -42,6 +42,12 @@ public class RedisSubscriber : IEventSubscriber await CreateConsumerGroup(db, channel, group); } + var consumer = Environment.MachineName; + if (port.HasValue) + { + consumer += $"-{port}"; + } + while (true) { await Task.Delay(100); @@ -54,28 +60,28 @@ public class RedisSubscriber : IEventSubscriber if (priorityEnabled) { - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, received) > 0) + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.High}", group, consumer, received) > 0) { continue; } - if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, received) > 0) + if (await HandleGroupMessage(db, $"{channel}-{EventPriority.Medium}", group, consumer, received) > 0) { continue; } - await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, received); + await HandleGroupMessage(db, $"{channel}-{EventPriority.Low}", group, consumer, received); } else { - await HandleGroupMessage(db, channel, group, received); + await HandleGroupMessage(db, channel, group, consumer, received); } } } - private async Task HandleGroupMessage(IDatabase db, string channel, string group, Func received) + private async Task HandleGroupMessage(IDatabase db, string channel, string group, string consumer, Func received) { - var entries = await db.StreamReadGroupAsync(channel, group, Environment.MachineName, count: 1); + var entries = await db.StreamReadGroupAsync(channel, group, consumer, count: 1); foreach (var entry in entries) { _logger.LogInformation($"Consumer {Environment.MachineName} received: {channel} {entry.Values[0].Value}"); From 393acb785e8fcbf48535a625d5d9af747faf2a7f Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sun, 1 Dec 2024 23:35:43 +0000 Subject: [PATCH 054/100] Remove Aspire.MongoDB.Driver --- .../BotSharp.Plugin.MongoStorage.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj b/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj index dced7973..88709238 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/BotSharp.Plugin.MongoStorage.csproj @@ -11,7 +11,6 @@ - From 5a3478d8146fa9ecfedf59125cff49c22a870d67 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Mon, 2 Dec 2024 15:06:14 +0000 Subject: [PATCH 055/100] ShopInfoFromProductList --- .../BotSharp.Abstraction/Utilities/MathExt.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Utilities/MathExt.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Utilities/MathExt.cs b/src/Infrastructure/BotSharp.Abstraction/Utilities/MathExt.cs new file mode 100644 index 00000000..4ea18179 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Utilities/MathExt.cs @@ -0,0 +1,14 @@ +namespace BotSharp.Abstraction.Utilities; + +public static class MathExt +{ + public static int Max(int a, int b, int c) + { + return Math.Max(Math.Max(a, b), c); + } + + public static long Max(long a, long b, long c) + { + return Math.Max(Math.Max(a, b), c); + } +} From 4012305e589003f310baa448782bbf13644ba1bf Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Mon, 2 Dec 2024 15:18:16 -0600 Subject: [PATCH 056/100] Init Core.Rule module --- .../Agents/Enums/BuiltInAgentId.cs | 5 ++++ .../BotSharp.Core.Rules.csproj | 13 ++++++++++ .../BotSharp.Core.Rules/RulesPlugin.cs | 19 +++++++++++++++ .../BotSharp.Core.Rules/Using.cs | 4 ++++ .../BotSharpSideCarPlugin.cs | 6 +++-- .../BotSharp.Plugin.AnthropicAI.csproj | 2 +- ...tSharp.Plugin.JavaScriptInterpreter.csproj | 17 +++++++++++++ .../JsInterpreterPlugin.cs | 24 +++++++++++++++++++ .../BotSharp.Plugin.LLamaSharp.csproj | 2 +- .../LlamaAiModel.cs | 1 - .../Providers/TextEmbeddingProvider.cs | 8 ++++--- .../BotSharp.Plugin.PythonInterpreter.csproj | 2 +- 12 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Core.Rules/BotSharp.Core.Rules.csproj create mode 100644 src/Infrastructure/BotSharp.Core.Rules/RulesPlugin.cs create mode 100644 src/Infrastructure/BotSharp.Core.Rules/Using.cs create mode 100644 src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/BotSharp.Plugin.JavaScriptInterpreter.csproj create mode 100644 src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/JsInterpreterPlugin.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs index c3c69f08..f2f64b6b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs @@ -51,4 +51,9 @@ public class BuiltInAgentId /// Evaluate prompt and conversation /// public const string Evaluator = "dfd9b46d-d00c-40af-8a75-3fbdc2b89869"; + + /// + /// Translates user-defined natural language rules into programmatic code + /// + public const string RuleEncoder = "6acfb93c-3412-402e-9ba5-c5d3cd8f0161"; } diff --git a/src/Infrastructure/BotSharp.Core.Rules/BotSharp.Core.Rules.csproj b/src/Infrastructure/BotSharp.Core.Rules/BotSharp.Core.Rules.csproj new file mode 100644 index 00000000..caef78b8 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Rules/BotSharp.Core.Rules.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/src/Infrastructure/BotSharp.Core.Rules/RulesPlugin.cs b/src/Infrastructure/BotSharp.Core.Rules/RulesPlugin.cs new file mode 100644 index 00000000..14177437 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Rules/RulesPlugin.cs @@ -0,0 +1,19 @@ +namespace BotSharp.Core.Rules; + +public class RulesPlugin : IBotSharpPlugin +{ + public string Id => "0197c1bc-9ae6-4c56-a305-8a1b4095bebc"; + public string Name => "BotSharp Rules"; + public string Description => "Translates user-defined natural language rules into programmatic code and is responsible for executing these rules under user-specified conditions."; + public string IconUrl => "https://w7.pngwing.com/pngs/442/614/png-transparent-regulation-computer-icons-regulatory-compliance-medical-device-manufacturing-others-miscellaneous-blue-text-thumbnail.png"; + + public string[] AgentIds = + [ + BuiltInAgentId.RuleEncoder + ]; + + public void RegisterDI(IServiceCollection services, IConfiguration config) + { + + } +} diff --git a/src/Infrastructure/BotSharp.Core.Rules/Using.cs b/src/Infrastructure/BotSharp.Core.Rules/Using.cs new file mode 100644 index 00000000..d982daae --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Rules/Using.cs @@ -0,0 +1,4 @@ +global using BotSharp.Abstraction.Agents.Enums; +global using BotSharp.Abstraction.Plugins; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core.SideCar/BotSharpSideCarPlugin.cs b/src/Infrastructure/BotSharp.Core.SideCar/BotSharpSideCarPlugin.cs index efef5201..d3ace389 100644 --- a/src/Infrastructure/BotSharp.Core.SideCar/BotSharpSideCarPlugin.cs +++ b/src/Infrastructure/BotSharp.Core.SideCar/BotSharpSideCarPlugin.cs @@ -8,8 +8,10 @@ namespace BotSharp.Core.SideCar; public class BotSharpSideCarPlugin : IBotSharpPlugin { public string Id => "06e5a276-bba0-45af-9625-889267c341c9"; - public string Name => "Side Car"; - public string Description => "Provides side car for calling agent cluster in conversation"; + public string Name => "BotSharp SideCar"; + public string Description => "Provide side car pattern to to better handle Agent Cluster calls in the same conversation. Agent cluster is composed of multiple Routing Agents."; + public string? IconUrl => "https://icons.veryicon.com/png/128/internet--web/2022-alibaba-cloud-product-icon-cloud/aliyuncvc-cloud-video-conference.png"; + public SettingsMeta Settings => new SettingsMeta("SideCar"); public object GetNewSettingsInstance() => new SideCarSettings(); diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/BotSharp.Plugin.AnthropicAI.csproj b/src/Plugins/BotSharp.Plugin.AnthropicAI/BotSharp.Plugin.AnthropicAI.csproj index c5bd88d0..d053f4d6 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/BotSharp.Plugin.AnthropicAI.csproj +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/BotSharp.Plugin.AnthropicAI.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/BotSharp.Plugin.JavaScriptInterpreter.csproj b/src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/BotSharp.Plugin.JavaScriptInterpreter.csproj new file mode 100644 index 00000000..4596ce1b --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/BotSharp.Plugin.JavaScriptInterpreter.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + diff --git a/src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/JsInterpreterPlugin.cs b/src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/JsInterpreterPlugin.cs new file mode 100644 index 00000000..e3811809 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.JavaScriptInterpreter/JsInterpreterPlugin.cs @@ -0,0 +1,24 @@ +using BotSharp.Abstraction.Plugins; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace BotSharp.Plugin.JavaScriptInterpreter; + +public class JsInterpreterPlugin : IBotSharpAppPlugin +{ + public string Id => "7a5a8cd7-26d9-4ac3-9d79-d02084bea372"; + public string Name => "JavaScript Interpreter"; + public string Description => ""; + public string? IconUrl => ""; + + public void Configure(IApplicationBuilder app) + { + + } + + public void RegisterDI(IServiceCollection services, IConfiguration config) + { + + } +} diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/BotSharp.Plugin.LLamaSharp.csproj b/src/Plugins/BotSharp.Plugin.LLamaSharp/BotSharp.Plugin.LLamaSharp.csproj index bd7cf7b7..68ce651c 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/BotSharp.Plugin.LLamaSharp.csproj +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/BotSharp.Plugin.LLamaSharp.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs index 9d55dead..a7d83def 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs @@ -36,7 +36,6 @@ public class LlamaAiModel _params = new ModelParams(Path.Combine(_settings.ModelDir, model)) { ContextSize = (uint)_settings.MaxContextLength, - Seed = 1337, GpuLayerCount = _settings.NumberOfGpuLayer }; diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs index a9288064..1ec461ae 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs @@ -1,4 +1,6 @@ using System.IO; +using System.Xml.Linq; +using static System.Net.Mime.MediaTypeNames; namespace BotSharp.Plugin.LLamaSharp.Providers; @@ -19,7 +21,7 @@ public class TextEmbeddingProvider : ITextEmbedding _settings = settings; } - public Task GetVectorAsync(string text) + public async Task GetVectorAsync(string text) { if (_embedder == null) { @@ -29,10 +31,10 @@ public class TextEmbeddingProvider : ITextEmbedding _embedder = new LLamaEmbedder(weights, @params); } - return _embedder.GetEmbeddings(text); + return (await _embedder.GetEmbeddings(text)).First(); } - public Task> GetVectorsAsync(List texts) + public async Task> GetVectorsAsync(List texts) { throw new NotImplementedException(); } diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/BotSharp.Plugin.PythonInterpreter.csproj b/src/Plugins/BotSharp.Plugin.PythonInterpreter/BotSharp.Plugin.PythonInterpreter.csproj index b3293a0f..c5e3d4ff 100644 --- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/BotSharp.Plugin.PythonInterpreter.csproj +++ b/src/Plugins/BotSharp.Plugin.PythonInterpreter/BotSharp.Plugin.PythonInterpreter.csproj @@ -25,7 +25,7 @@ - + From 0f53c96b20ad70030d0dc7c1e349a4e8a219d2dc Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 2 Dec 2024 19:04:32 -0600 Subject: [PATCH 057/100] add agent utility doc --- docs/agent-utility/assets/add-utility.png | Bin 0 -> 33518 bytes docs/agent-utility/assets/agent-hook-1.png | Bin 0 -> 62720 bytes docs/agent-utility/assets/agent-hook-2.png | Bin 0 -> 57348 bytes .../assets/agent-utility-code-structure.png | Bin 0 -> 88725 bytes .../assets/agent-utility-example.png | Bin 0 -> 110005 bytes .../assets/agent-utility-hook.png | Bin 0 -> 48960 bytes .../agent-utility/assets/chat-window-demo.png | Bin 0 -> 14866 bytes docs/agent-utility/assets/dummy-http.png | Bin 0 -> 105573 bytes .../assets/register-assembly.png | Bin 0 -> 29701 bytes docs/agent-utility/assets/register-plugin.png | Bin 0 -> 78816 bytes .../assets/router-utility-ui.png | Bin 0 -> 15213 bytes docs/agent-utility/assets/router-utility.png | Bin 0 -> 27140 bytes docs/agent-utility/assets/routing-arch.png | Bin 0 -> 18164 bytes .../assets/task-agent-utility-ui.png | Bin 0 -> 4650 bytes .../assets/task-agent-utility.png | Bin 0 -> 13674 bytes .../utility-function-implementation.png | Bin 0 -> 217567 bytes docs/agent-utility/intro.md | 144 ++++++++++++++++++ .../agent.json | 4 +- 18 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 docs/agent-utility/assets/add-utility.png create mode 100644 docs/agent-utility/assets/agent-hook-1.png create mode 100644 docs/agent-utility/assets/agent-hook-2.png create mode 100644 docs/agent-utility/assets/agent-utility-code-structure.png create mode 100644 docs/agent-utility/assets/agent-utility-example.png create mode 100644 docs/agent-utility/assets/agent-utility-hook.png create mode 100644 docs/agent-utility/assets/chat-window-demo.png create mode 100644 docs/agent-utility/assets/dummy-http.png create mode 100644 docs/agent-utility/assets/register-assembly.png create mode 100644 docs/agent-utility/assets/register-plugin.png create mode 100644 docs/agent-utility/assets/router-utility-ui.png create mode 100644 docs/agent-utility/assets/router-utility.png create mode 100644 docs/agent-utility/assets/routing-arch.png create mode 100644 docs/agent-utility/assets/task-agent-utility-ui.png create mode 100644 docs/agent-utility/assets/task-agent-utility.png create mode 100644 docs/agent-utility/assets/utility-function-implementation.png create mode 100644 docs/agent-utility/intro.md diff --git a/docs/agent-utility/assets/add-utility.png b/docs/agent-utility/assets/add-utility.png new file mode 100644 index 0000000000000000000000000000000000000000..940f00ed30397f7046f8177e2e69c9eafa02d337 GIT binary patch literal 33518 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 F{|{|>q8b1I literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/agent-hook-1.png b/docs/agent-utility/assets/agent-hook-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e785bfd662ad73b266112afdfc2040bc6e7bd71 GIT binary patch literal 62720 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 z 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 bi%|UkKXqkmm~y9i00000NkvXXu0mjfrMUuy literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/agent-hook-2.png b/docs/agent-utility/assets/agent-hook-2.png new file mode 100644 index 0000000000000000000000000000000000000000..572cd99ca9b6d8fc5f87d03cc2015dcdf9bbe594 GIT binary patch literal 57348 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/agent-utility-code-structure.png b/docs/agent-utility/assets/agent-utility-code-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..9232f90e612786493daba272ffc5a17cb47eda78 GIT binary patch literal 88725 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 z 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

Ghg^+CFHfgM#D8Tb-kBaf0{xxPTKo6{K|cR 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

tgAmQMm9ctMVdf^zDV;H{&>*;D@}^j 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

1lmcxnz`gJPJ@--R61mLf=fi__VDnu4;?6M;3% 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/agent-utility-hook.png b/docs/agent-utility/assets/agent-utility-hook.png new file mode 100644 index 0000000000000000000000000000000000000000..21880411590d3ed4dda580bd4d047847dae6de0d GIT binary patch literal 48960 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 n!pw%Uo|=E}P_M)D`g+SHtf(^BR+uyO)FS65eq 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 DN00NK literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/dummy-http.png b/docs/agent-utility/assets/dummy-http.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ca8df7a949176a43359a4f5ffb41b7799f536f GIT binary patch literal 105573 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/register-assembly.png b/docs/agent-utility/assets/register-assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5a478e915c304d14d01cef682a51fa4115a24a GIT binary patch literal 29701 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/register-plugin.png b/docs/agent-utility/assets/register-plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..97ea011353b1eeec7c3d954c5a397ea475a0317c GIT binary patch literal 78816 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/router-utility.png b/docs/agent-utility/assets/router-utility.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c8bf9900226e3600646a36156d4dcbc0b3e642 GIT binary patch literal 27140 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 MSm{x*l*x<#1(%O!TL1t6 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/routing-arch.png b/docs/agent-utility/assets/routing-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..6485c3bba39df4e8e24702608c18672a3cf14d7e GIT binary patch literal 18164 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/task-agent-utility-ui.png b/docs/agent-utility/assets/task-agent-utility-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..9838673f6f1861de639e78609b1fa57940f94200 GIT binary patch literal 4650 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/assets/task-agent-utility.png b/docs/agent-utility/assets/task-agent-utility.png new file mode 100644 index 0000000000000000000000000000000000000000..902a4d8e4469561de1038114d23c2e243bf7e550 GIT binary patch literal 13674 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%0DJx1?Lrv=e4V`@YDV~{oM%(7U-AqF_36fzkm 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 literal 0 HcmV?d00001 diff --git a/docs/agent-utility/intro.md b/docs/agent-utility/intro.md new file mode 100644 index 00000000..c641b55e --- /dev/null +++ b/docs/agent-utility/intro.md @@ -0,0 +1,144 @@ +# Agent Utility + +## Introduction +This document aims to introduce the agent utility concept and provide an instruction on adding custom agent utilities in AI project “BotSharp”. We will start by explaining the mechanism of agent utility in [Section 2](#agent-utility). Then, we illustrate the custom agent utility setup and integration in [Section 3](#agent-utility-setup) and [Section 4](#agent-utility-integration), respectively. A use case will be demonstrated in [Section 5](#use-case-demo). We wrap up the document with a short summary. + +## Agent Utility +The agent utility is a unique feature that can be integrated into agent to enhance its capability. Its core principle is that it can dynamically and seamlessly add extra prompts and add task-oriented functions (or tools) during conversation, without disrupting the agent’s primary purpose. In other words, the agent utility can perform extra tasks based on the context of conversation. Typical examples of agent utility include reading images/pdf, generating image, and sending http requests. [Fig 2.1.1](#agent-utility-example) demonstrates an example of these utilities. In this example, “Chatbot” is a simple agent to answer user questions and the utilities extend its capability to explain image content, generate requested image, and send a specific http request. + +

+
+ +## Agent Utility Setup +In this section, we outline the steps to set up a custom agent utility. We start with the basic code structure and then add essential utility data, such as prompts and functions. The utility hooks are used to incorporate the utility into the agent. Finally, we give a brief overview of the utility implementation. + +### Basic Code Structure +The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent “6745151e-6d46-4a02-8de4-1c4f21c7da95” is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the prompt, function, hooks, and implementation of an http utility. + +
+ +
Fig 3.1.1 Basic code structure of an agent utility
+
+
+ +### Utility Data +For a typical agent utility, it is essential to add at least a prompt and a function. The prompt is added under the “templates” folder and its recommended name is “[function name].fn.liquid”, while the function is added under the “functions” folder and its recommended name is “[function name].json”. Once we compile the project, we can find the aggregated utility assistant folder at location: “\BotSharp\src\WebStarter\bin\Debug\net8.0\data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95”. + +### Utility Hooks +The utility hooks are used to connect the agent utility to the agent system. [Fig 3.3.1](#agent-utility-hook) demonstrates an implementation of the http utility hook, where we define the utility name, prompts and functions. Note that each utility can be used across different agents. + +
+ +
Fig 3.3.1 Agent utility hook.
+
+
+ +The agent hook is used to append the utility prompt and function during the conversation. Note that the utility data is only allowed to be included in the context of conversation. The utility mechanism is implemented in the “OnAgentUtilityLoaded” hook, and it is invoked when we load any agent. + +
+
+
+
+
+
Fig 3.3.2 Agent hook.
+
+
+ +### Utility Function Implementation +Here we introduce a simple utility function implementation. The actual content depends on what task you want this utility to fulfill. [Fig 3.4.1](#utility-func-impl) illustrates the implementation of the “handle http request” function. Note that the property “Name” must be consistent with the function added in the utility data. Here we introduce a simple utility function implementation. The actual content depends on what task you want this utility to fulfill. Fig 3.4.1 illustrates the implementation of the “handle http request” function. Note that the property “Name” must be consistent with the function added in the utility data. The “Indication” is an optional property whose content will be displayed in the chat while the user is waiting for the assistant response. + +
+ +
Fig 3.4.1 Http utility function implementation.
+
+
+ +### Utility Inheritance +Here we introduce a new feature: utility inheritance. As we are using the routing-based multi-agent architecture, different agents may come into the call stack while we are handling user requests. With the utility inheritance, the agent can not only use the utilities added to itself but also inherit the utilities from the entry agent, which is the first agent that comes into the call stack, such as a router agent. [Fig 3.5.1](#routing-architecture) illustrates a typical example of routing-based multi-agent architecture, where “Pizza Bot” is the router and "Order Inquery", "Ordering", "Payment" are task agents. When the user starts chatting, “Pizza Bot” first comes into the call stack, with "Order Inquery", "Ordering", or "Payment" joining next depending on what the user actually requests. For example, if we allow "Order Inquery" to inherit utilities, all the utilities from itself as well as “Pizza Bot” will be invoked once the "Order Inquery" agent is in action. + +
+ +
Fig 3.5.1 An example of routing-based multi-agent architecture.
+
+
+ +### Agent Setup +Here we introduce the agent setup with utilities and inheritance. As we introduced in [Section 3.3](#utility-hooks), each utility of an agent is structured with utility name, functions, and prompts. [Fig 3.6.1](#router-utility) and [Fig 3.6.2](#task-agent-utility) presents the utility configuration and utility inheritance of “Pizza Bot” and “Order Inquery”, respectively. As is displayed, we can apply the utility configuration and inheritance via agent files or agent detail ui. Note that we can uncheck the box to disable a utility ([Fig 3.6.1](#router-utility) right). + +
+
+
+
+
+
Fig 3.6.1 Router utility setup of "Pizza Bot".
+
(left: agent file, right: agent detail ui)
+
+
+ +
+
+
+
+
+
Fig 3.6.2 Utility inheritance of "Order Inquery" agent.
+
(left: agent file, right: agent detail ui)
+
+
+ + +## Agent Utility Integration +In this section, we outline the steps to integrate a custom agent utility, including registering plugin, registering assembly, and adding project reference. + +[Fig 4.1.1](#register-plugin) presents the “Http Handler Plugin” in the “BotSharp.Plugin.HttpHandler”, where we can register the hooks and other essential settings. Note that there is no need to register the function here, since it is automatically registered on the application level. + +
+ +
Fig 4.1.1 Register plugin.
+
+
+ +[Fig 4.1.2](#register-assembly) shows the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder. + +
+ +
Fig 4.1.2 Register assembly.
+
+
+ + +## Use Case Demo +In this section, we demonstrate an http utility. After we set up and integrate the custom agent utility in backend, we can start the BotSharp-UI and go to any specific agent. [Fig 5.1.1](#add-utility) shows an example of the “Chatbot” agent, where we can add any registered utilities in the highlight section. + +
+ +
Fig 5.1.1 Add http utility in Chatbot.
+
+
+ +Once we add the utility, we can initialize a conversation by clicking the bot icon at the top left corner. [Fig 5.1.2](#chat-window-demo) shows the conversation window, where we can find the number of utilities at the left panel. We can also click the agent name to go back to the agent page. + +
+ +
Fig 5.1.2 Chat window with Chatbot and http utility.
+
+
+ +Here we use dummy rest APIs (source: https://dummy.restapiexample.com/) for the demo purpose. [Fig 5.1.3](#dummy-http) displays the various http requests sent in the conversation with “Chatbot”. We can see that the “Http Handler” utility has successfully extends the agent to send http request and receive response. + +
+ +
Fig 5.1.3 Send dummy http requests.
+
+
+ +## Summary +In this document, we introduce the agent utility concept and provide a step-by-step instruction on adding custom agent utilities in AI project “BotSharp”. + +The agent utility is designed for enhancing the agent capability to perform dedicated tasks, such as sending http request, reading images, and generating images, by adding extra prompts and functions. + +The agent utility setup and integration are explained step by step in [Section 3](#agent-utility-setup) and [Section 4](#agent-utility-integration), respectively. + +We end up the document by demonstrating the Http utility, where we prove the utility can handle various http requests in the chat with agents. diff --git a/tests/BotSharp.Plugin.PizzaBot/data/agents/8970b1e5-d260-4e2c-90b1-f1415a257c18/agent.json b/tests/BotSharp.Plugin.PizzaBot/data/agents/8970b1e5-d260-4e2c-90b1-f1415a257c18/agent.json index 4da6bdd3..94746011 100644 --- a/tests/BotSharp.Plugin.PizzaBot/data/agents/8970b1e5-d260-4e2c-90b1-f1415a257c18/agent.json +++ b/tests/BotSharp.Plugin.PizzaBot/data/agents/8970b1e5-d260-4e2c-90b1-f1415a257c18/agent.json @@ -12,8 +12,8 @@ "profiles": [ "pizza" ], "routingRules": [ { - "type": "planner", - "field": "NaivePlanner" + "type": "reasoner", + "field": "NaiveReasoner" } ] } \ No newline at end of file From aaa25355e20e918917e4484ed1d361cee5e617b2 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 2 Dec 2024 19:26:32 -0600 Subject: [PATCH 058/100] change doc --- docs/agent-utility/intro.md | 361 ++++++++++++++++++++++++++++++++---- 1 file changed, 321 insertions(+), 40 deletions(-) diff --git a/docs/agent-utility/intro.md b/docs/agent-utility/intro.md index c641b55e..93599433 100644 --- a/docs/agent-utility/intro.md +++ b/docs/agent-utility/intro.md @@ -6,9 +6,9 @@ This document aims to introduce the agent utility concept and provide an instruc ## Agent Utility The agent utility is a unique feature that can be integrated into agent to enhance its capability. Its core principle is that it can dynamically and seamlessly add extra prompts and add task-oriented functions (or tools) during conversation, without disrupting the agent’s primary purpose. In other words, the agent utility can perform extra tasks based on the context of conversation. Typical examples of agent utility include reading images/pdf, generating image, and sending http requests. [Fig 2.1.1](#agent-utility-example) demonstrates an example of these utilities. In this example, “Chatbot” is a simple agent to answer user questions and the utilities extend its capability to explain image content, generate requested image, and send a specific http request. -
- -
Fig 2.1.1 Agent utility example.
+
+ +
Fig 2.1.1 Agent utility example.

@@ -18,9 +18,9 @@ In this section, we outline the steps to set up a custom agent utility. We start ### Basic Code Structure The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent “6745151e-6d46-4a02-8de4-1c4f21c7da95” is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the prompt, function, hooks, and implementation of an http utility. -
- -
Fig 3.1.1 Basic code structure of an agent utility
+
+ +
Fig 3.1.1 Basic code structure of an agent utility

@@ -28,63 +28,328 @@ The basic code structure of a typical agent utility includes prompt/function dat For a typical agent utility, it is essential to add at least a prompt and a function. The prompt is added under the “templates” folder and its recommended name is “[function name].fn.liquid”, while the function is added under the “functions” folder and its recommended name is “[function name].json”. Once we compile the project, we can find the aggregated utility assistant folder at location: “\BotSharp\src\WebStarter\bin\Debug\net8.0\data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95”. ### Utility Hooks -The utility hooks are used to connect the agent utility to the agent system. [Fig 3.3.1](#agent-utility-hook) demonstrates an implementation of the http utility hook, where we define the utility name, prompts and functions. Note that each utility can be used across different agents. +The utility hooks are used to connect the agent utility to the agent system. The code snippet below demonstrates an implementation of the http utility hook, where we define the utility name, prompts and functions. Note that each utility can be used across different agents. -
- -
Fig 3.3.1 Agent utility hook.
-
-
+```csharp +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"; + public string[] AgentIds => new[] { "87c458fc-ec5f-40ae-8ed6-05dda8a07523" }; + + public void RegisterDI(IServiceCollection services, IConfiguration config) + { + services.AddScoped(provider => + { + var settingService = provider.GetRequiredService(); + return settingService.Bind("HttpHandler"); + }); + + services.AddScoped(); + } +} +``` The agent hook is used to append the utility prompt and function during the conversation. Note that the utility data is only allowed to be included in the context of conversation. The utility mechanism is implemented in the “OnAgentUtilityLoaded” hook, and it is invoked when we load any agent. -
-
-
-
-
-
Fig 3.3.2 Agent hook.
-
-
+```csharp +public async Task LoadAgent(string id) +{ + if (string.IsNullOrEmpty(id) || id == Guid.Empty.ToString()) + { + return null; + } + + var hooks = _services.GetServices(); + + // Before agent is loaded. + foreach (var hook in hooks) + { + if (!string.IsNullOrEmpty(hook.SelfId) && hook.SelfId != id) + { + continue; + } + + hook.OnAgentLoading(ref id); + } + + var agent = await GetAgent(id); + if (agent == null) + { + return null; + } + + await InheritAgent(agent); + OverrideInstructionByChannel(agent); + AddOrUpdateParameters(agent); + + // Populate state into dictionary + agent.TemplateDict = new Dictionary(); + PopulateState(agent.TemplateDict); + + // After agent is loaded + foreach (var hook in hooks) + { + if (!string.IsNullOrEmpty(hook.SelfId) && hook.SelfId != id) + { + continue; + } + + hook.SetAget(agent); + + if (!string.IsNullOrEmpty(agent.Instruction)) + { + hook.OnInstructionLoaded(agent.Instruction, agent.TemplateDict); + } + + if (agent.Functions != null) + { + hook.OnFunctionsLoaded(agent.Functions); + } + + if (agent.Samples != null) + { + hook.OnSamplesLoaded(agent.Samples); + } + + hook.OnAgentUtilityLoaded(agent); + hook.OnAgentLoaded(agent); + } + + _logger.LogInformation($"Loaded agent {agent}."); + + return agent; +} +``` ### Utility Function Implementation -Here we introduce a simple utility function implementation. The actual content depends on what task you want this utility to fulfill. [Fig 3.4.1](#utility-func-impl) illustrates the implementation of the “handle http request” function. Note that the property “Name” must be consistent with the function added in the utility data. Here we introduce a simple utility function implementation. The actual content depends on what task you want this utility to fulfill. Fig 3.4.1 illustrates the implementation of the “handle http request” function. Note that the property “Name” must be consistent with the function added in the utility data. The “Indication” is an optional property whose content will be displayed in the chat while the user is waiting for the assistant response. +Here we introduce a simple utility function implementation. The actual content depends on what task you want this utility to fulfill. The code snippet below illustrates the implementation of the “handle http request” function. Note that the property “Name” must be consistent with the function added in the utility data. The “Indication” is an optional property whose content will be displayed in the chat while the user is waiting for the assistant response. -
- -
Fig 3.4.1 Http utility function implementation.
-
-
+```csharp +public class HandleHttpRequestFn : IFunctionCallback +{ + public string Name => "handle_http_request"; + public string Indication => "Handling http request"; + + private readonly IServiceProvider _services; + private readonly ILogger _logger; + private readonly IHttpClientFactory _httpClientFactory; + private readonly IHttpContextAccessor _context; + private readonly BotSharpOptions _options; + + public HandleHttpRequestFn(IServiceProvider services, + ILogger logger, + IHttpClientFactory httpClientFactory, + IHttpContextAccessor context, + BotSharpOptions options) + { + _services = services; + _logger = logger; + _httpClientFactory = httpClientFactory; + _context = context; + _options = options; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs, _options.JsonSerializerOptions); + var url = args?.RequestUrl; + var method = args?.HttpMethod; + var content = args?.RequestContent; + + try + { + var response = await SendHttpRequest(url, method, content); + var responseContent = await HandleHttpResponse(response); + message.Content = responseContent; + return true; + } + catch (Exception ex) + { + var msg = $"Fail when sending http request. Url: {url}, method: {method}, content: {content}"; + _logger.LogWarning($"{msg}\n(Error: {ex.Message})"); + message.Content = msg; + return false; + } + } + + private async Task SendHttpRequest(string? url, string? method, string? content) + { + if (string.IsNullOrEmpty(url)) return null; + + using var client = _httpClientFactory.CreateClient(); + AddRequestHeaders(client); + + var (uri, request) = BuildHttpRequest(url, method, content); + var response = await client.SendAsync(request); + if (response == null || !response.IsSuccessStatusCode) + { + _logger.LogWarning($"Response status code: {response?.StatusCode}"); + } + + return response; + } + + private void AddRequestHeaders(HttpClient client) + { + client.DefaultRequestHeaders.Add("Authorization", $"{_context.HttpContext.Request.Headers["Authorization"]}"); + + var settings = _services.GetRequiredService(); + var origin = !string.IsNullOrEmpty(settings.Origin) ? settings.Origin : $"{_context.HttpContext.Request.Headers["Origin"]}"; + if (!string.IsNullOrEmpty(origin)) + { + client.DefaultRequestHeaders.Add("Origin", origin); + } + } + + private (Uri, HttpRequestMessage) BuildHttpRequest(string url, string? method, string? content) + { + var httpMethod = GetHttpMethod(method); + StringContent httpContent; + + var requestUrl = url; + if (httpMethod == HttpMethod.Get) + { + httpContent = BuildHttpContent("{}"); + requestUrl = BuildQuery(url, content); + } + else + { + httpContent = BuildHttpContent(content); + } + + if (!Uri.TryCreate(requestUrl, UriKind.Absolute, out var uri)) + { + var settings = _services.GetRequiredService(); + var baseUri = new Uri(settings.BaseAddress); + uri = new Uri(baseUri, requestUrl); + } + + return (uri, new HttpRequestMessage + { + RequestUri = uri, + Method = httpMethod, + Content = httpContent + }); + } + + private HttpMethod GetHttpMethod(string? method) + { + var localMethod = method?.Trim()?.ToUpper(); + HttpMethod matchMethod; + + switch (localMethod) + { + case "GET": + matchMethod = HttpMethod.Get; + break; + case "DELETE": + matchMethod = HttpMethod.Delete; + break; + case "PUT": + matchMethod = HttpMethod.Put; + break; + case "Patch": + matchMethod = HttpMethod.Patch; + break; + default: + matchMethod = HttpMethod.Post; + break; + } + return matchMethod; + } + + private StringContent BuildHttpContent(string? content) + { + var str = string.Empty; + try + { + var json = JsonSerializer.Deserialize(content ?? "{}", _options.JsonSerializerOptions); + str = JsonSerializer.Serialize(json, _options.JsonSerializerOptions); + } + catch (Exception ex) + { + _logger.LogWarning($"Error when build http content: {content}\n(Error: {ex.Message})"); + } + + return new StringContent(str, Encoding.UTF8, MediaTypeNames.Application.Json); + } + + private string BuildQuery(string url, string? content) + { + if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(content)) return url; + + try + { + var queries = new List(); + var json = JsonSerializer.Deserialize(content, _options.JsonSerializerOptions); + var root = json.RootElement; + foreach (var prop in root.EnumerateObject()) + { + var name = prop.Name.Trim(); + var value = prop.Value.ToString().Trim(); + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value)) + { + continue; + } + + queries.Add($"{name}={value}"); + } + + if (!queries.IsNullOrEmpty()) + { + url += $"?{string.Join('&', queries)}"; + } + return url; + } + catch (Exception ex) + { + _logger.LogWarning($"Error when building url query. Url: {url}, Content: {content}\n(Error: {ex.Message})"); + return url; + } + } + + private async Task HandleHttpResponse(HttpResponseMessage? response) + { + if (response == null) return string.Empty; + + return await response.Content.ReadAsStringAsync(); + } +} +``` ### Utility Inheritance Here we introduce a new feature: utility inheritance. As we are using the routing-based multi-agent architecture, different agents may come into the call stack while we are handling user requests. With the utility inheritance, the agent can not only use the utilities added to itself but also inherit the utilities from the entry agent, which is the first agent that comes into the call stack, such as a router agent. [Fig 3.5.1](#routing-architecture) illustrates a typical example of routing-based multi-agent architecture, where “Pizza Bot” is the router and "Order Inquery", "Ordering", "Payment" are task agents. When the user starts chatting, “Pizza Bot” first comes into the call stack, with "Order Inquery", "Ordering", or "Payment" joining next depending on what the user actually requests. For example, if we allow "Order Inquery" to inherit utilities, all the utilities from itself as well as “Pizza Bot” will be invoked once the "Order Inquery" agent is in action. -
- -
Fig 3.5.1 An example of routing-based multi-agent architecture.
+
+ +
Fig 3.5.1 An example of routing-based multi-agent architecture.

### Agent Setup Here we introduce the agent setup with utilities and inheritance. As we introduced in [Section 3.3](#utility-hooks), each utility of an agent is structured with utility name, functions, and prompts. [Fig 3.6.1](#router-utility) and [Fig 3.6.2](#task-agent-utility) presents the utility configuration and utility inheritance of “Pizza Bot” and “Order Inquery”, respectively. As is displayed, we can apply the utility configuration and inheritance via agent files or agent detail ui. Note that we can uncheck the box to disable a utility ([Fig 3.6.1](#router-utility) right). -
+
-
Fig 3.6.1 Router utility setup of "Pizza Bot".
-
(left: agent file, right: agent detail ui)
+
Fig 3.6.1 Router utility setup of "Pizza Bot".
+
(left: agent file, right: agent detail ui)

+
-
Fig 3.6.2 Utility inheritance of "Order Inquery" agent.
-
(left: agent file, right: agent detail ui)
+
Fig 3.6.2 Utility inheritance of "Order Inquery" agent.
+
(left: agent file, right: agent detail ui)

@@ -92,13 +357,29 @@ Here we introduce the agent setup with utilities and inheritance. As we introduc ## Agent Utility Integration In this section, we outline the steps to integrate a custom agent utility, including registering plugin, registering assembly, and adding project reference. -[Fig 4.1.1](#register-plugin) presents the “Http Handler Plugin” in the “BotSharp.Plugin.HttpHandler”, where we can register the hooks and other essential settings. Note that there is no need to register the function here, since it is automatically registered on the application level. +The code snippet below presents the “Http Handler Plugin” in the “BotSharp.Plugin.HttpHandler”, where we can register the hooks and other essential settings. Note that there is no need to register the function here, since it is automatically registered on the application level. -
- -
Fig 4.1.1 Register plugin.
-
-
+```csharp +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"; + public string[] AgentIds => new[] { "87c458fc-ec5f-40ae-8ed6-05dda8a07523" }; + + public void RegisterDI(IServiceCollection services, IConfiguration config) + { + services.AddScoped(provider => + { + var settingService = provider.GetRequiredService(); + return settingService.Bind("HttpHandler"); + }); + + services.AddScoped(); + } +} +``` [Fig 4.1.2](#register-assembly) shows the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder. From eae6d88a25343f9445377eb68da1525afecb3895 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 2 Dec 2024 19:54:20 -0600 Subject: [PATCH 059/100] add json --- docs/agent-utility/intro.md | 84 ++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/docs/agent-utility/intro.md b/docs/agent-utility/intro.md index 93599433..9df0700e 100644 --- a/docs/agent-utility/intro.md +++ b/docs/agent-utility/intro.md @@ -8,7 +8,6 @@ The agent utility is a unique feature that can be integrated into agent to enhan
-
Fig 2.1.1 Agent utility example.

@@ -16,11 +15,10 @@ The agent utility is a unique feature that can be integrated into agent to enhan In this section, we outline the steps to set up a custom agent utility. We start with the basic code structure and then add essential utility data, such as prompts and functions. The utility hooks are used to incorporate the utility into the agent. Finally, we give a brief overview of the utility implementation. ### Basic Code Structure -The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent “6745151e-6d46-4a02-8de4-1c4f21c7da95” is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the prompt, function, hooks, and implementation of an http utility. +The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent “6745151e-6d46-4a02-8de4-1c4f21c7da95” is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the structure of prompt, function, hooks, and implementation of an http utility.
-
Fig 3.1.1 Basic code structure of an agent utility

@@ -323,33 +321,73 @@ public class HandleHttpRequestFn : IFunctionCallback ### Utility Inheritance Here we introduce a new feature: utility inheritance. As we are using the routing-based multi-agent architecture, different agents may come into the call stack while we are handling user requests. With the utility inheritance, the agent can not only use the utilities added to itself but also inherit the utilities from the entry agent, which is the first agent that comes into the call stack, such as a router agent. [Fig 3.5.1](#routing-architecture) illustrates a typical example of routing-based multi-agent architecture, where “Pizza Bot” is the router and "Order Inquery", "Ordering", "Payment" are task agents. When the user starts chatting, “Pizza Bot” first comes into the call stack, with "Order Inquery", "Ordering", or "Payment" joining next depending on what the user actually requests. For example, if we allow "Order Inquery" to inherit utilities, all the utilities from itself as well as “Pizza Bot” will be invoked once the "Order Inquery" agent is in action. -
+
-
Fig 3.5.1 An example of routing-based multi-agent architecture.

### Agent Setup -Here we introduce the agent setup with utilities and inheritance. As we introduced in [Section 3.3](#utility-hooks), each utility of an agent is structured with utility name, functions, and prompts. [Fig 3.6.1](#router-utility) and [Fig 3.6.2](#task-agent-utility) presents the utility configuration and utility inheritance of “Pizza Bot” and “Order Inquery”, respectively. As is displayed, we can apply the utility configuration and inheritance via agent files or agent detail ui. Note that we can uncheck the box to disable a utility ([Fig 3.6.1](#router-utility) right). +Here we introduce the agent setup with utilities and inheritance. As we introduced in [Section 3.3](#utility-hooks), each utility of an agent is structured with utility name, functions, and prompts. [Fig 3.6.1](#router-utility-ui) and [Fig 3.6.2](#task-agent-utility-ui) presents the utility configuration and utility inheritance of “Pizza Bot” and “Order Inquery”, respectively. As is displayed, we can apply the utility configuration and inheritance via agent files or agent detail ui. Note that we can uncheck the box to disable a utility ([Fig 3.6.2](#router-utility-ui)). -
-
-
-
-
-
Fig 3.6.1 Router utility setup of "Pizza Bot".
-
(left: agent file, right: agent detail ui)
+```json +{ + "id": "8970b1e5-d260-4e2c-90b1-f1415a257c18", + "name": "Pizza Bot", + "description": "AI assistant that can help customer place pizza order.", + "type": "routing", + "inheritAgentId": "01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a", + "createdDateTime": "2023-08-18T10:39:32.2349685Z", + "updatedDateTime": "2023-08-18T14:39:32.2349686Z", + "iconUrl": "https://cdn-icons-png.flaticon.com/512/6978/6978255.png", + "disabled": false, + "isPublic": true, + "profiles": [ "pizza" ], + "utilities": [ + { + "name": "http_handler", + "functions": [ + { "name": "handle_http_request" } + ], + "templates": [ + { "name": "handle_http_request.fn" } + ] + } + ], + "routingRules": [ + { + "type": "reasoner", + "field": "NaiveReasoner" + } + ] +} +``` +
+ + +
+


+
-
-
-
-
-
-
Fig 3.6.2 Utility inheritance of "Order Inquery" agent.
-
(left: agent file, right: agent detail ui)
+```json +{ + "name": "Order Inquiry", + "description": "Check the order status like payment, delivery or baking.", + "createdDateTime": "2023-08-18T14:39:32.2349685Z", + "updatedDateTime": "2023-08-18T14:39:32.2349686Z", + "id": "b284db86-e9c2-4c25-a59e-4649797dd130", + "disabled": false, + "isPublic": true, + "mergeUtility": true, + "profiles": [ "pizza" ] +} +``` +
+ +
+

@@ -381,11 +419,10 @@ public class HttpHandlerPlugin : IBotSharpPlugin } ``` -[Fig 4.1.2](#register-assembly) shows the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder. +[Fig 4.1.2](#register-assembly) demonstrates the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder.
-
Fig 4.1.2 Register assembly.

@@ -395,7 +432,6 @@ In this section, we demonstrate an http utility. After we set up and integrate t
-
Fig 5.1.1 Add http utility in Chatbot.

@@ -403,7 +439,6 @@ Once we add the utility, we can initialize a conversation by clicking the bot ic
-
Fig 5.1.2 Chat window with Chatbot and http utility.

@@ -411,7 +446,6 @@ Here we use dummy rest APIs (source: https://dummy.restapiexample.com/) for the
-
Fig 5.1.3 Send dummy http requests.

From b3e680354c3f741794d1c4c151088ba79d9e61b7 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 3 Dec 2024 11:39:01 -0600 Subject: [PATCH 060/100] add index --- .../agent-utility/assets/add-utility.png | Bin .../agent-utility/assets/agent-hook-1.png | Bin .../agent-utility/assets/agent-hook-2.png | Bin .../assets/agent-utility-code-structure.png | Bin .../agent-utility/assets/agent-utility-example.png | Bin .../agent-utility/assets/agent-utility-hook.png | Bin .../agent-utility/assets/chat-window-demo.png | Bin .../agent-utility/assets/dummy-http.png | Bin .../agent-utility/assets/register-assembly.png | Bin .../agent-utility/assets/register-plugin.png | Bin .../agent-utility/assets/router-utility-ui.png | Bin .../agent-utility/assets/router-utility.png | Bin .../agent-utility/assets/routing-arch.png | Bin .../agent-utility/assets/task-agent-utility-ui.png | Bin .../agent-utility/assets/task-agent-utility.png | Bin .../assets/utility-function-implementation.png | Bin docs/{ => architecture}/agent-utility/intro.md | 0 docs/index.rst | 1 + 18 files changed, 1 insertion(+) rename docs/{ => architecture}/agent-utility/assets/add-utility.png (100%) rename docs/{ => architecture}/agent-utility/assets/agent-hook-1.png (100%) rename docs/{ => architecture}/agent-utility/assets/agent-hook-2.png (100%) rename docs/{ => architecture}/agent-utility/assets/agent-utility-code-structure.png (100%) rename docs/{ => architecture}/agent-utility/assets/agent-utility-example.png (100%) rename docs/{ => architecture}/agent-utility/assets/agent-utility-hook.png (100%) rename docs/{ => architecture}/agent-utility/assets/chat-window-demo.png (100%) rename docs/{ => architecture}/agent-utility/assets/dummy-http.png (100%) rename docs/{ => architecture}/agent-utility/assets/register-assembly.png (100%) rename docs/{ => architecture}/agent-utility/assets/register-plugin.png (100%) rename docs/{ => architecture}/agent-utility/assets/router-utility-ui.png (100%) rename docs/{ => architecture}/agent-utility/assets/router-utility.png (100%) rename docs/{ => architecture}/agent-utility/assets/routing-arch.png (100%) rename docs/{ => architecture}/agent-utility/assets/task-agent-utility-ui.png (100%) rename docs/{ => architecture}/agent-utility/assets/task-agent-utility.png (100%) rename docs/{ => architecture}/agent-utility/assets/utility-function-implementation.png (100%) rename docs/{ => architecture}/agent-utility/intro.md (100%) diff --git a/docs/agent-utility/assets/add-utility.png b/docs/architecture/agent-utility/assets/add-utility.png similarity index 100% rename from docs/agent-utility/assets/add-utility.png rename to docs/architecture/agent-utility/assets/add-utility.png diff --git a/docs/agent-utility/assets/agent-hook-1.png b/docs/architecture/agent-utility/assets/agent-hook-1.png similarity index 100% rename from docs/agent-utility/assets/agent-hook-1.png rename to docs/architecture/agent-utility/assets/agent-hook-1.png diff --git a/docs/agent-utility/assets/agent-hook-2.png b/docs/architecture/agent-utility/assets/agent-hook-2.png similarity index 100% rename from docs/agent-utility/assets/agent-hook-2.png rename to docs/architecture/agent-utility/assets/agent-hook-2.png diff --git a/docs/agent-utility/assets/agent-utility-code-structure.png b/docs/architecture/agent-utility/assets/agent-utility-code-structure.png similarity index 100% rename from docs/agent-utility/assets/agent-utility-code-structure.png rename to docs/architecture/agent-utility/assets/agent-utility-code-structure.png diff --git a/docs/agent-utility/assets/agent-utility-example.png b/docs/architecture/agent-utility/assets/agent-utility-example.png similarity index 100% rename from docs/agent-utility/assets/agent-utility-example.png rename to docs/architecture/agent-utility/assets/agent-utility-example.png diff --git a/docs/agent-utility/assets/agent-utility-hook.png b/docs/architecture/agent-utility/assets/agent-utility-hook.png similarity index 100% rename from docs/agent-utility/assets/agent-utility-hook.png rename to docs/architecture/agent-utility/assets/agent-utility-hook.png diff --git a/docs/agent-utility/assets/chat-window-demo.png b/docs/architecture/agent-utility/assets/chat-window-demo.png similarity index 100% rename from docs/agent-utility/assets/chat-window-demo.png rename to docs/architecture/agent-utility/assets/chat-window-demo.png diff --git a/docs/agent-utility/assets/dummy-http.png b/docs/architecture/agent-utility/assets/dummy-http.png similarity index 100% rename from docs/agent-utility/assets/dummy-http.png rename to docs/architecture/agent-utility/assets/dummy-http.png diff --git a/docs/agent-utility/assets/register-assembly.png b/docs/architecture/agent-utility/assets/register-assembly.png similarity index 100% rename from docs/agent-utility/assets/register-assembly.png rename to docs/architecture/agent-utility/assets/register-assembly.png diff --git a/docs/agent-utility/assets/register-plugin.png b/docs/architecture/agent-utility/assets/register-plugin.png similarity index 100% rename from docs/agent-utility/assets/register-plugin.png rename to docs/architecture/agent-utility/assets/register-plugin.png diff --git a/docs/agent-utility/assets/router-utility-ui.png b/docs/architecture/agent-utility/assets/router-utility-ui.png similarity index 100% rename from docs/agent-utility/assets/router-utility-ui.png rename to docs/architecture/agent-utility/assets/router-utility-ui.png diff --git a/docs/agent-utility/assets/router-utility.png b/docs/architecture/agent-utility/assets/router-utility.png similarity index 100% rename from docs/agent-utility/assets/router-utility.png rename to docs/architecture/agent-utility/assets/router-utility.png diff --git a/docs/agent-utility/assets/routing-arch.png b/docs/architecture/agent-utility/assets/routing-arch.png similarity index 100% rename from docs/agent-utility/assets/routing-arch.png rename to docs/architecture/agent-utility/assets/routing-arch.png diff --git a/docs/agent-utility/assets/task-agent-utility-ui.png b/docs/architecture/agent-utility/assets/task-agent-utility-ui.png similarity index 100% rename from docs/agent-utility/assets/task-agent-utility-ui.png rename to docs/architecture/agent-utility/assets/task-agent-utility-ui.png diff --git a/docs/agent-utility/assets/task-agent-utility.png b/docs/architecture/agent-utility/assets/task-agent-utility.png similarity index 100% rename from docs/agent-utility/assets/task-agent-utility.png rename to docs/architecture/agent-utility/assets/task-agent-utility.png diff --git a/docs/agent-utility/assets/utility-function-implementation.png b/docs/architecture/agent-utility/assets/utility-function-implementation.png similarity index 100% rename from docs/agent-utility/assets/utility-function-implementation.png rename to docs/architecture/agent-utility/assets/utility-function-implementation.png diff --git a/docs/agent-utility/intro.md b/docs/architecture/agent-utility/intro.md similarity index 100% rename from docs/agent-utility/intro.md rename to docs/architecture/agent-utility/intro.md diff --git a/docs/index.rst b/docs/index.rst index b7c8b78e..e7934622 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -115,6 +115,7 @@ The main documentation for the site is organized into the following sections: architecture/plugin architecture/hooks architecture/routing + architecture/agent-utility/intro architecture/logging architecture/data-persistence From 47f698636d7580f0f6f5443a2ce06261dd9777dc Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 3 Dec 2024 11:52:25 -0600 Subject: [PATCH 061/100] add comments --- .../Services/BotSharpConversationSideCar.cs | 16 ++++++++++++++++ .../Services/ConversationStateService.cs | 16 ++++++++++++++++ .../Translation/TranslationService.cs | 16 ++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs b/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs index ec3ad0fe..4ddc3a43 100644 --- a/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs +++ b/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs @@ -1,3 +1,19 @@ +/***************************************************************************** + Copyright 2024 Written by Jicheng Lu. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + using BotSharp.Core.Infrastructures; namespace BotSharp.Core.SideCar.Services; diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs index 152b74ca..eedcdf9a 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs @@ -1,3 +1,19 @@ +/***************************************************************************** + Copyright 2024 Written by Jicheng Lu. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + using BotSharp.Abstraction.Conversations.Enums; namespace BotSharp.Core.Conversations.Services; diff --git a/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs b/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs index 453b2277..7b81ac10 100644 --- a/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs +++ b/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs @@ -1,3 +1,19 @@ +/***************************************************************************** + Copyright 2024 Written by Jicheng Lu. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + using BotSharp.Abstraction.Infrastructures.Enums; using BotSharp.Abstraction.MLTasks; using BotSharp.Abstraction.Options; From d6b31c5239eed94ae1d6da6bc8bb3c501f07152d Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 3 Dec 2024 13:54:17 -0600 Subject: [PATCH 062/100] Fix duplicate function loaded OnAgentUtilityLoaded --- .../BotSharp.Abstraction/Agents/AgentHookBase.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 496466e2..7759a4bf 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -71,7 +71,14 @@ public abstract class AgentHookBase : IAgentHook var (functions, templates) = GetUtilityContent(agent); - agent.Functions.AddRange(functions); + foreach (var fn in functions) + { + if (!agent.Functions.Any(x => x.Name.Equals(fn.Name, StringComparison.OrdinalIgnoreCase))) + { + agent.Functions.Add(fn); + } + } + foreach (var prompt in templates) { agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; From 49a968b8e9b20b748f2f9971f1361c542211c352 Mon Sep 17 00:00:00 2001 From: Joanna Ren <101223@smsassist.com> Date: Tue, 3 Dec 2024 15:03:26 -0600 Subject: [PATCH 063/100] add OnSourceCodeGenerated Hook --- .../Planning/IPlanningHook.cs | 3 +++ .../Reasoning/OneStepForwardReasoner.cs | 4 ++-- .../Routing/Reasoning/SequentialReasoner.cs | 2 +- .../Functions/SummaryPlanFn.cs | 10 ++++++---- .../TwoStaging/Models/SummaryPlan.cs | 3 +++ .../agent.json | 2 +- .../functions/plan_summary.json | 6 +++++- .../Hooks/SqlDriverPlanningHook.cs | 19 ++++++++++++++++--- 8 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Planning/IPlanningHook.cs b/src/Infrastructure/BotSharp.Abstraction/Planning/IPlanningHook.cs index 238dbffc..4dcff7cb 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Planning/IPlanningHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Planning/IPlanningHook.cs @@ -5,6 +5,9 @@ public interface IPlanningHook Task GetSummaryAdditionalRequirements(string planner, RoleDialogModel message) => Task.FromResult(string.Empty); + Task OnSourceCodeGenerated(string planner, RoleDialogModel msg, string language) + => Task.CompletedTask; + Task OnPlanningCompleted(string planner, RoleDialogModel msg) => Task.CompletedTask; } diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs index 97568751..eb58d3e3 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs @@ -34,7 +34,7 @@ public class OneStepForwardReasoner : IRoutingReasoner private readonly IServiceProvider _services; private readonly ILogger _logger; - public OneStepForwardReasoner(IServiceProvider services, ILogger logger) + public OneStepForwardReasoner(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; @@ -116,7 +116,7 @@ public class OneStepForwardReasoner : IRoutingReasoner } else { - context.Empty(reason: $"Agent queue is cleared by {nameof(NaiveReasoner)}"); + context.Empty(reason: $"Agent queue is cleared by {nameof(OneStepForwardReasoner)}"); // context.Push(inst.OriginalAgent, "Push user goal agent"); } return true; diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs index 959747db..77f069fc 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs @@ -33,7 +33,7 @@ public class SequentialReasoner : IRoutingReasoner public int MaxLoopCount => 100; private FunctionCallFromLlm _lastInst; - public SequentialReasoner(IServiceProvider services, ILogger logger) + public SequentialReasoner(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs index 2f5a1708..2cd16ae9 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs @@ -71,13 +71,15 @@ public class SummaryPlanFn : IFunctionCallback var summary = await GetAiResponse(plannerAgent); message.Content = summary.Content; - // Validate the sql result + // Emit event if the sql statement is generated by planner var args = JsonSerializer.Deserialize(message.FunctionArgs); - if (args.IsSqlTemplate == false) + if (args != null && !args.IsSqlTemplate && args.ContainsSqlStatements) { - await fn.InvokeFunction("validate_sql", message); + await HookEmitter.Emit(_services, async hook => + await hook.OnSourceCodeGenerated(nameof(TwoStageTaskPlanner), message, "sql") + ); } - + await HookEmitter.Emit(_services, async hook => await hook.OnPlanningCompleted(nameof(TwoStageTaskPlanner), message) ); diff --git a/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/Models/SummaryPlan.cs b/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/Models/SummaryPlan.cs index 459237a8..6b156c79 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/Models/SummaryPlan.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/Models/SummaryPlan.cs @@ -4,4 +4,7 @@ public class SummaryPlan { [JsonPropertyName("is_sql_template")] public bool IsSqlTemplate { get; set; } = false; + + [JsonPropertyName("contains_sql_statements")] + public bool ContainsSqlStatements { get; set; } = false; } diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json index d1b5eb52..91ee618c 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json @@ -1,7 +1,7 @@ { "id": "282a7128-69a1-44b0-878c-a9159b88f3b9", "name": "Planner", - "description": "Plan feasible implementation steps for user task request", + "description": "Plan feasible implementation steps for complex user task request", "type": "task", "createdDateTime": "2023-08-27T10:39:00Z", "updatedDateTime": "2023-08-27T14:39:00Z", diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_summary.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_summary.json index c13bfb25..17ec0639 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_summary.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_summary.json @@ -8,6 +8,10 @@ "type": "boolean", "description": "If user request is to generate sql template instead of actual sql statement." }, + "contains_sql_statements": { + "type": "boolean", + "description": "Set to true if the response contains sql statements." + }, "related_tables": { "type": "array", "description": "table name in planning steps", @@ -17,6 +21,6 @@ } } }, - "required": [ "related_tables", "is_sql_template" ] + "required": [ "related_tables", "is_sql_template", "contains_sql_statements" ] } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverPlanningHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverPlanningHook.cs index 94de1b04..224f8fd6 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverPlanningHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverPlanningHook.cs @@ -20,14 +20,23 @@ public class SqlDriverPlanningHook : IPlanningHook _services = services; } - public async Task OnPlanningCompleted(string planner, RoleDialogModel msg) + public async Task OnSourceCodeGenerated(string planner, RoleDialogModel msg, string language) { + // envoke validate + if (language != "sql") + { + return; + } + + var routing = _services.GetRequiredService(); + await routing.InvokeFunction("validate_sql", msg); + await HookEmitter.Emit(_services, async (hook) => { await hook.SqlGenerated(msg); }); - var settings = _services.GetRequiredService(); + var settings = _services.GetRequiredService(); if (!settings.ExecuteSqlSelectAutonomous) { var conversationStateService = _services.GetRequiredService(); @@ -51,7 +60,6 @@ public class SqlDriverPlanningHook : IPlanningHook var response = await completion.GetChatCompletions(agent, wholeDialogs); // Invoke "execute_sql" - var routing = _services.GetRequiredService(); await routing.InvokeFunction(response.FunctionName, response); msg.CurrentAgentId = agent.Id; @@ -61,6 +69,11 @@ public class SqlDriverPlanningHook : IPlanningHook msg.StopCompletion = response.StopCompletion; } + public async Task OnPlanningCompleted(string planner, RoleDialogModel msg) + { + + } + public async Task GetSummaryAdditionalRequirements(string planner, RoleDialogModel message) { var settings = _services.GetRequiredService(); From 43b9dd931d6966b0a85e334079b3cb2a221ca9da Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 3 Dec 2024 16:52:14 -0600 Subject: [PATCH 064/100] Init Crontab --- .../Agents/Enums/BuiltInAgentId.cs | 5 ++ .../Enums/ConversationChannel.cs | 1 + .../Infrastructures/IDistributedLocker.cs | 7 ++ .../Abstraction/ICrontabHook.cs | 8 ++ .../Abstraction/ICrontabService.cs | 9 +++ .../BotSharp.Core.Crontab.csproj | 28 +++++++ .../BotSharp.Core.Crontab/CrontabPlugin.cs | 40 ++++++++++ .../Models/CrontabItem.cs | 14 ++++ .../Services/CrontabService.cs | 77 +++++++++++++++++++ .../Services/CrontabWatcher.cs | 70 +++++++++++++++++ .../BotSharp.Core.Crontab/Using.cs | 7 ++ .../agent.json | 24 ++++++ .../BotSharp.Core/BotSharpCoreExtensions.cs | 2 +- .../Infrastructures/DistributedLocker.cs | 9 ++- 14 files changed, 297 insertions(+), 4 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Infrastructures/IDistributedLocker.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Using.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs index f2f64b6b..7f22c8f2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs @@ -56,4 +56,9 @@ public class BuiltInAgentId /// Translates user-defined natural language rules into programmatic code ///
public const string RuleEncoder = "6acfb93c-3412-402e-9ba5-c5d3cd8f0161"; + + /// + /// Schedule job + /// + public const string Crontab = "c2o139da-a62a-4355-8605-fdf0ffaca58e"; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Enums/ConversationChannel.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Enums/ConversationChannel.cs index cf0defbc..d03a4208 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Enums/ConversationChannel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Enums/ConversationChannel.cs @@ -7,4 +7,5 @@ public class ConversationChannel public const string Phone = "phone"; public const string Messenger = "messenger"; public const string Email = "email"; + public const string Cron = "cron"; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/IDistributedLocker.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/IDistributedLocker.cs new file mode 100644 index 00000000..2f5a8069 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/IDistributedLocker.cs @@ -0,0 +1,7 @@ +namespace BotSharp.Abstraction.Infrastructures; + +public interface IDistributedLocker +{ + bool Lock(string resource, Action action, int timeout = 30); + Task LockAsync(string resource, Func action, int timeout = 30); +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs new file mode 100644 index 00000000..49ffe54c --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs @@ -0,0 +1,8 @@ +using BotSharp.Core.Crontab.Models; + +namespace BotSharp.Core.Crontab.Abstraction; + +public interface ICrontabHook +{ + Task OnCronTriggered(CrontabItem item); +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs new file mode 100644 index 00000000..6a18018d --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs @@ -0,0 +1,9 @@ +using BotSharp.Core.Crontab.Models; + +namespace BotSharp.Core.Crontab.Abstraction; + +public interface ICrontabService +{ + Task> GetCrontable(); + Task ScheduledTimeArrived(CrontabItem item); +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj b/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj new file mode 100644 index 00000000..f1c70ad7 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + + + + + + + + PreserveNewest + + + + + + + + + + + + + diff --git a/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs b/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs new file mode 100644 index 00000000..a449cbbb --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs @@ -0,0 +1,40 @@ +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + +namespace BotSharp.Core.Crontab; + +/// +/// Crontab plugin is a time-based job scheduler in agent framework. +/// The cron system is used for automating repetitive tasks, such as trigger AI Agent to do specific task periodically. +/// +public class CrontabPlugin : IBotSharpPlugin +{ + public string Id => "3155c15e-28d3-43f7-8ead-fc43324ec21a"; + public string Name => "BotSharp Crontab"; + public string Description => "Crontab plugin is a time-based job scheduler in agent framework. The cron system is used to trigger AI Agent to do specific task periodically."; + public string IconUrl => "https://icon-library.com/images/stop-watch-icon/stop-watch-icon-10.jpg"; + + public string[] AgentIds = + [ + BuiltInAgentId.Crontab + ]; + + public void RegisterDI(IServiceCollection services, IConfiguration config) + { + services.AddScoped(); + services.AddHostedService(); + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs b/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs new file mode 100644 index 00000000..50cafd02 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs @@ -0,0 +1,14 @@ +namespace BotSharp.Core.Crontab.Models; + +public class CrontabItem +{ + public string UserId { get; set; } = null!; + public string AgentId { get; set; } = null!; + public string Topic { get; set; } = null!; + public string Cron { get; set; } = null!; + + public override string ToString() + { + return $"AgentId: {AgentId}, UserId: {UserId}, Topic: {Topic}"; + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs new file mode 100644 index 00000000..a8b5f6dd --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs @@ -0,0 +1,77 @@ +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + +using BotSharp.Abstraction.Agents.Enums; +using BotSharp.Core.Crontab.Models; +using BotSharp.Core.Infrastructures; + + +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ + +using Microsoft.Extensions.Logging; + +namespace BotSharp.Core.Crontab.Services; + +/// +/// The Crontab service schedules distributed events based on the execution times provided by users. +/// In a scalable environment, distributed locks are used to ensure that each event is triggered only once. +/// +public class CrontabService : ICrontabService +{ + private readonly IServiceProvider _services; + private ILogger _logger; + + public CrontabService(IServiceProvider services, ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task> GetCrontable() + { + return + [ + new CrontabItem + { + Cron = "*/30 * * * * *", + AgentId = BuiltInAgentId.AIAssistant, + } + ]; + } + + public async Task ScheduledTimeArrived(CrontabItem item) + { + _logger.LogInformation("ScheduledTimeArrived"); + await HookEmitter.Emit(_services, async hook => + await hook.OnCronTriggered(item) + ); + await Task.Delay(1000 * 10); + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs new file mode 100644 index 00000000..0abd050f --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs @@ -0,0 +1,70 @@ +using BotSharp.Abstraction.Infrastructures; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using NCrontab; + +namespace BotSharp.Core.Crontab.Services; + +public class CrontabWatcher : BackgroundService +{ + private readonly ILogger _logger; + private readonly IServiceProvider _services; + + public CrontabWatcher(IServiceProvider services, ILogger logger) + { + _logger = logger; + _services = services; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogInformation("Crontab Watcher background service is running."); + + using (var scope = _services.CreateScope()) + { + var locker = scope.ServiceProvider.GetRequiredService(); + + while (!stoppingToken.IsCancellationRequested) + { + var delay = Task.Delay(1000, stoppingToken); + + await locker.LockAsync("CrontabWatcher", async () => + { + await RunCronChecker(scope.ServiceProvider); + }); + + await delay; + } + + _logger.LogWarning("Crontab Watcher background service is stopped."); + } + } + + private async Task RunCronChecker(IServiceProvider services) + { + var cron = services.GetRequiredService(); + var crons = await cron.GetCrontable(); + foreach (var item in crons) + { + var schedule = CrontabSchedule.Parse(item.Cron, new CrontabSchedule.ParseOptions + { + IncludingSeconds = true // Ensure you account for seconds + }); + + // Get the current time + var currentTime = DateTime.UtcNow; + + // Get the next occurrence from the schedule + var nextOccurrence = schedule.GetNextOccurrence(currentTime.AddSeconds(-1)); + + // Check if the current time matches the schedule + bool matches = currentTime >= nextOccurrence && currentTime < nextOccurrence.AddSeconds(1); + + if (matches) + { + _logger.LogInformation($"The current time matches the cron expression {item}"); + cron.ScheduledTimeArrived(item); + } + } + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Using.cs b/src/Infrastructure/BotSharp.Core.Crontab/Using.cs new file mode 100644 index 00000000..0da87fb2 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Using.cs @@ -0,0 +1,7 @@ +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; + +global using BotSharp.Abstraction.Agents.Enums; +global using BotSharp.Abstraction.Plugins; +global using BotSharp.Core.Crontab.Services; +global using BotSharp.Core.Crontab.Abstraction; diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json new file mode 100644 index 00000000..b17e1e6d --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json @@ -0,0 +1,24 @@ +{ + "id": "c2o139da-a62a-4355-8605-fdf0ffaca58e", + "name": "Crontab", + "description": "Convert the user-specified schedule into a Cron expression, accurate to the second level.", + "iconUrl": "https://icon-library.com/images/stop-watch-icon/stop-watch-icon-10.jpg", + "type": "task", + "createdDateTime": "2024-12-03T00:00:00Z", + "updatedDateTime": "2024-12-03T00:00:00Z", + "disabled": false, + "isPublic": true, + "profiles": [ "cron" ], + "llmConfig": { + "provider": "openai", + "model": "gpt-4o-mini" + }, + "routingRules": [ + { + "field": "cron_expression", + "required": true, + "field_type": "string", + "description": "A Cron expression, accurate to the second level." + } + ] +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs b/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs index c5e33a4b..af8a9324 100644 --- a/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs +++ b/src/Infrastructure/BotSharp.Core/BotSharpCoreExtensions.cs @@ -25,7 +25,7 @@ public static class BotSharpCoreExtensions config.Bind("Interpreter", interpreterSettings); services.AddSingleton(x => interpreterSettings); - services.AddSingleton(); + services.AddSingleton(); // Register template render services.AddSingleton(); diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/DistributedLocker.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/DistributedLocker.cs index 32c7af52..48ff193f 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/DistributedLocker.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/DistributedLocker.cs @@ -1,9 +1,10 @@ +using BotSharp.Abstraction.Infrastructures; using Medallion.Threading.Redis; using StackExchange.Redis; namespace BotSharp.Core.Infrastructures; -public class DistributedLocker +public class DistributedLocker : IDistributedLocker { private readonly IConnectionMultiplexer _redis; private readonly ILogger _logger; @@ -14,7 +15,7 @@ public class DistributedLocker _logger = logger; } - public async Task Lock(string resource, Func> action, int timeoutInSeconds = 30) + public async Task LockAsync(string resource, Func action, int timeoutInSeconds = 30) { var timeout = TimeSpan.FromSeconds(timeoutInSeconds); @@ -24,9 +25,11 @@ public class DistributedLocker if (handle == null) { _logger.LogWarning($"Acquire lock for {resource} failed due to after {timeout}s timeout."); + return false; } - return await action(); + await action(); + return true; } } From 35e7cd3e9d4b0263e05ce9ea8a3e995e2d209c70 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 3 Dec 2024 17:06:06 -0600 Subject: [PATCH 065/100] Fix Mongo version issue. --- .../BotSharp.Plugin.ExcelHandler.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj b/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj index a57e28b0..e23bd5e7 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -28,7 +28,6 @@ - From e831c810a1a4dad8fd02546f1ec2d1d5a29ba77f Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Tue, 3 Dec 2024 18:52:28 -0600 Subject: [PATCH 066/100] init roles --- .../Repositories/Filters/RoleFilter.cs | 5 +++++ .../BotSharp.Core/Roles/Services/RoleService.cs | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/RoleFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/RoleFilter.cs index 35e2e1d3..7c6c738a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/RoleFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/RoleFilter.cs @@ -15,4 +15,9 @@ public class RoleFilter { return new RoleFilter(); } + + public bool IsInit() + { + return Names.IsNullOrEmpty(); + } } diff --git a/src/Infrastructure/BotSharp.Core/Roles/Services/RoleService.cs b/src/Infrastructure/BotSharp.Core/Roles/Services/RoleService.cs index 8cd7935b..9636fe18 100644 --- a/src/Infrastructure/BotSharp.Core/Roles/Services/RoleService.cs +++ b/src/Infrastructure/BotSharp.Core/Roles/Services/RoleService.cs @@ -39,7 +39,15 @@ public class RoleService : IRoleService public async Task> GetRoles(RoleFilter filter) { var db = _services.GetRequiredService(); + var roles = db.GetRoles(filter); + if (filter.IsInit() && roles.IsNullOrEmpty()) + { + await RefreshRoles(); + await Task.Delay(100); + roles = db.GetRoles(filter); + } + return roles; } From cc8eae0152db8193a2f8f039d55c0ecea09f7f83 Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Tue, 3 Dec 2024 19:32:43 -0600 Subject: [PATCH 067/100] relocate --- .../intro.md => agent-utility.md} | 18 +++++++++--------- .../agent-utility/assets/agent-hook-1.png | Bin 62720 -> 0 bytes .../agent-utility/assets/agent-hook-2.png | Bin 57348 -> 0 bytes .../assets/agent-utility-hook.png | Bin 48960 -> 0 bytes .../agent-utility/assets/register-plugin.png | Bin 78816 -> 0 bytes .../agent-utility/assets/router-utility.png | Bin 27140 -> 0 bytes .../assets/task-agent-utility.png | Bin 13674 -> 0 bytes .../utility-function-implementation.png | Bin 217567 -> 0 bytes .../agent-utility}/add-utility.png | Bin .../agent-utility-code-structure.png | Bin .../agent-utility}/agent-utility-example.png | Bin .../agent-utility}/chat-window-demo.png | Bin .../agent-utility}/dummy-http.png | Bin .../agent-utility}/register-assembly.png | Bin .../agent-utility}/router-utility-ui.png | Bin .../agent-utility}/routing-arch.png | Bin .../agent-utility}/task-agent-utility-ui.png | Bin docs/index.rst | 2 +- 18 files changed, 10 insertions(+), 10 deletions(-) rename docs/architecture/{agent-utility/intro.md => agent-utility.md} (96%) delete mode 100644 docs/architecture/agent-utility/assets/agent-hook-1.png delete mode 100644 docs/architecture/agent-utility/assets/agent-hook-2.png delete mode 100644 docs/architecture/agent-utility/assets/agent-utility-hook.png delete mode 100644 docs/architecture/agent-utility/assets/register-plugin.png delete mode 100644 docs/architecture/agent-utility/assets/router-utility.png delete mode 100644 docs/architecture/agent-utility/assets/task-agent-utility.png delete mode 100644 docs/architecture/agent-utility/assets/utility-function-implementation.png rename docs/architecture/{agent-utility/assets => assets/agent-utility}/add-utility.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/agent-utility-code-structure.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/agent-utility-example.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/chat-window-demo.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/dummy-http.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/register-assembly.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/router-utility-ui.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/routing-arch.png (100%) rename docs/architecture/{agent-utility/assets => assets/agent-utility}/task-agent-utility-ui.png (100%) diff --git a/docs/architecture/agent-utility/intro.md b/docs/architecture/agent-utility.md similarity index 96% rename from docs/architecture/agent-utility/intro.md rename to docs/architecture/agent-utility.md index 9df0700e..b25ee396 100644 --- a/docs/architecture/agent-utility/intro.md +++ b/docs/architecture/agent-utility.md @@ -7,7 +7,7 @@ This document aims to introduce the agent utility concept and provide an instruc The agent utility is a unique feature that can be integrated into agent to enhance its capability. Its core principle is that it can dynamically and seamlessly add extra prompts and add task-oriented functions (or tools) during conversation, without disrupting the agent’s primary purpose. In other words, the agent utility can perform extra tasks based on the context of conversation. Typical examples of agent utility include reading images/pdf, generating image, and sending http requests. [Fig 2.1.1](#agent-utility-example) demonstrates an example of these utilities. In this example, “Chatbot” is a simple agent to answer user questions and the utilities extend its capability to explain image content, generate requested image, and send a specific http request.
- +

@@ -18,7 +18,7 @@ In this section, we outline the steps to set up a custom agent utility. We start The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent “6745151e-6d46-4a02-8de4-1c4f21c7da95” is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the structure of prompt, function, hooks, and implementation of an http utility.
- +

@@ -322,7 +322,7 @@ public class HandleHttpRequestFn : IFunctionCallback Here we introduce a new feature: utility inheritance. As we are using the routing-based multi-agent architecture, different agents may come into the call stack while we are handling user requests. With the utility inheritance, the agent can not only use the utilities added to itself but also inherit the utilities from the entry agent, which is the first agent that comes into the call stack, such as a router agent. [Fig 3.5.1](#routing-architecture) illustrates a typical example of routing-based multi-agent architecture, where “Pizza Bot” is the router and "Order Inquery", "Ordering", "Payment" are task agents. When the user starts chatting, “Pizza Bot” first comes into the call stack, with "Order Inquery", "Ordering", or "Payment" joining next depending on what the user actually requests. For example, if we allow "Order Inquery" to inherit utilities, all the utilities from itself as well as “Pizza Bot” will be invoked once the "Order Inquery" agent is in action.
- +

@@ -365,7 +365,7 @@ Here we introduce the agent setup with utilities and inheritance. As we introduc
- +


@@ -387,7 +387,7 @@ Here we introduce the agent setup with utilities and inheritance. As we introduc
- +

@@ -422,7 +422,7 @@ public class HttpHandlerPlugin : IBotSharpPlugin [Fig 4.1.2](#register-assembly) demonstrates the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder.
- +

@@ -431,21 +431,21 @@ public class HttpHandlerPlugin : IBotSharpPlugin In this section, we demonstrate an http utility. After we set up and integrate the custom agent utility in backend, we can start the BotSharp-UI and go to any specific agent. [Fig 5.1.1](#add-utility) shows an example of the “Chatbot” agent, where we can add any registered utilities in the highlight section.
- +

Once we add the utility, we can initialize a conversation by clicking the bot icon at the top left corner. [Fig 5.1.2](#chat-window-demo) shows the conversation window, where we can find the number of utilities at the left panel. We can also click the agent name to go back to the agent page.
- +

Here we use dummy rest APIs (source: https://dummy.restapiexample.com/) for the demo purpose. [Fig 5.1.3](#dummy-http) displays the various http requests sent in the conversation with “Chatbot”. We can see that the “Http Handler” utility has successfully extends the agent to send http request and receive response.
- +

diff --git a/docs/architecture/agent-utility/assets/agent-hook-1.png b/docs/architecture/agent-utility/assets/agent-hook-1.png deleted file mode 100644 index 4e785bfd662ad73b266112afdfc2040bc6e7bd71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62720 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 z 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 bi%|UkKXqkmm~y9i00000NkvXXu0mjfrMUuy diff --git a/docs/architecture/agent-utility/assets/agent-hook-2.png b/docs/architecture/agent-utility/assets/agent-hook-2.png deleted file mode 100644 index 572cd99ca9b6d8fc5f87d03cc2015dcdf9bbe594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57348 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 diff --git a/docs/architecture/agent-utility/assets/agent-utility-hook.png b/docs/architecture/agent-utility/assets/agent-utility-hook.png deleted file mode 100644 index 21880411590d3ed4dda580bd4d047847dae6de0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48960 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 n!pw%Uo|=E}P_M)D`x{L%^-89kh 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 MSm{x*l*x<#1(%O!TL1t6 diff --git a/docs/architecture/agent-utility/assets/task-agent-utility.png b/docs/architecture/agent-utility/assets/task-agent-utility.png deleted file mode 100644 index 902a4d8e4469561de1038114d23c2e243bf7e550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13674 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%0DJx1?Lrv=e4V`@YDV~{oM%(7U-AqF_36fzkm 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 diff --git a/docs/architecture/agent-utility/assets/add-utility.png b/docs/architecture/assets/agent-utility/add-utility.png similarity index 100% rename from docs/architecture/agent-utility/assets/add-utility.png rename to docs/architecture/assets/agent-utility/add-utility.png diff --git a/docs/architecture/agent-utility/assets/agent-utility-code-structure.png b/docs/architecture/assets/agent-utility/agent-utility-code-structure.png similarity index 100% rename from docs/architecture/agent-utility/assets/agent-utility-code-structure.png rename to docs/architecture/assets/agent-utility/agent-utility-code-structure.png diff --git a/docs/architecture/agent-utility/assets/agent-utility-example.png b/docs/architecture/assets/agent-utility/agent-utility-example.png similarity index 100% rename from docs/architecture/agent-utility/assets/agent-utility-example.png rename to docs/architecture/assets/agent-utility/agent-utility-example.png diff --git a/docs/architecture/agent-utility/assets/chat-window-demo.png b/docs/architecture/assets/agent-utility/chat-window-demo.png similarity index 100% rename from docs/architecture/agent-utility/assets/chat-window-demo.png rename to docs/architecture/assets/agent-utility/chat-window-demo.png diff --git a/docs/architecture/agent-utility/assets/dummy-http.png b/docs/architecture/assets/agent-utility/dummy-http.png similarity index 100% rename from docs/architecture/agent-utility/assets/dummy-http.png rename to docs/architecture/assets/agent-utility/dummy-http.png diff --git a/docs/architecture/agent-utility/assets/register-assembly.png b/docs/architecture/assets/agent-utility/register-assembly.png similarity index 100% rename from docs/architecture/agent-utility/assets/register-assembly.png rename to docs/architecture/assets/agent-utility/register-assembly.png diff --git a/docs/architecture/agent-utility/assets/router-utility-ui.png b/docs/architecture/assets/agent-utility/router-utility-ui.png similarity index 100% rename from docs/architecture/agent-utility/assets/router-utility-ui.png rename to docs/architecture/assets/agent-utility/router-utility-ui.png diff --git a/docs/architecture/agent-utility/assets/routing-arch.png b/docs/architecture/assets/agent-utility/routing-arch.png similarity index 100% rename from docs/architecture/agent-utility/assets/routing-arch.png rename to docs/architecture/assets/agent-utility/routing-arch.png diff --git a/docs/architecture/agent-utility/assets/task-agent-utility-ui.png b/docs/architecture/assets/agent-utility/task-agent-utility-ui.png similarity index 100% rename from docs/architecture/agent-utility/assets/task-agent-utility-ui.png rename to docs/architecture/assets/agent-utility/task-agent-utility-ui.png diff --git a/docs/index.rst b/docs/index.rst index e7934622..d9dac903 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -115,7 +115,7 @@ The main documentation for the site is organized into the following sections: architecture/plugin architecture/hooks architecture/routing - architecture/agent-utility/intro + architecture/agent-utility architecture/logging architecture/data-persistence From 9803eb4e49c1cefb5254c4e2f6c0e7099e631675 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Wed, 4 Dec 2024 02:48:55 +0000 Subject: [PATCH 068/100] Fix GetReasoner. --- .../BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs | 2 ++ .../Routing/RoutingService.InstructLoop.cs | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs index 4f7bba6c..931b53e8 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/NaiveReasoner.cs @@ -29,6 +29,8 @@ public class NaiveReasoner : IRoutingReasoner private readonly IServiceProvider _services; private readonly ILogger _logger; + public string Name => "Naive Reasoner"; + public NaiveReasoner(IServiceProvider services, ILogger logger) { _services = services; diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs index 5b84122c..c3e1a8f4 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs @@ -97,14 +97,20 @@ public partial class RoutingService { var rule = router.RoutingRules.FirstOrDefault(x => x.Type == RuleType.Reasoner); + if (rule == null) + { + _logger.LogError($"Can't find any reasoner"); + return _services.GetServices().First(x => x.Name == "Naive Reasoner"); + } + var reasoner = _services.GetServices(). FirstOrDefault(x => x.GetType().Name.EndsWith(rule.Field)); if (reasoner == null) { - _logger.LogError($"Can't find specific planner named {rule.Field}"); + _logger.LogError($"Can't find specific reasoner named {rule.Field}"); // Default use NaiveReasoner - return _services.GetRequiredService(); + return _services.GetServices().First(x => x.Name == "Naive Reasoner"); } return reasoner; From 174db37958f231bb3ea4de1ed755280ceddf4fb7 Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Wed, 4 Dec 2024 00:48:09 -0600 Subject: [PATCH 069/100] fix typo --- docs/architecture/agent-utility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/agent-utility.md b/docs/architecture/agent-utility.md index b25ee396..e7100284 100644 --- a/docs/architecture/agent-utility.md +++ b/docs/architecture/agent-utility.md @@ -419,7 +419,7 @@ public class HttpHandlerPlugin : IBotSharpPlugin } ``` -[Fig 4.1.2](#register-assembly) demonstrates the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder. +[Fig 4.1.1](#register-assembly) demonstrates the utility assembly registration in “appsettings.json”. It is important to note that we are required to add the project reference to the Startup project, e.g., WebStarter. Moreover, we are required to add any new custom agent utility in the “Plugin” folder instead of the “BotSharp” folder.

From 8b7f80488bc68192c4aecdd561cabc1fd7dd89d0 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 4 Dec 2024 16:12:02 -0600 Subject: [PATCH 070/100] refine utility name --- .../Agents/AgentHookBase.cs | 5 +- .../BotSharp.Plugin.AudioHandler.csproj | 8 +- .../Enums/UtilityName.cs | 2 +- .../Functions/HandleAudioRequestFn.cs | 2 +- .../Hooks/AudioHandlerUtilityHook.cs | 3 +- ...n => util-audio-handle_audio_request.json} | 2 +- .../templates/handle_audio_request.fn.liquid | 1 - .../util-audio-handle_audio_request.fn.liquid | 1 + .../BotSharp.Plugin.EmailHandler.csproj | 17 +- .../Enums/UtilityName.cs | 13 +- .../Functions/HandleEmailReaderFn.cs | 2 +- .../Functions/HandleEmailSenderFn.cs | 2 +- .../Hooks/EmailHandlerUtilityHook.cs | 5 +- ...on => util-email-handle_email_reader.json} | 2 +- ...on => util-email-handle_email_sender.json} | 2 +- .../templates/handle_email_reader.fn.liquid | 1 - .../util-email-handle_email_reader.fn.liquid | 1 + ... util-email-handle_email_sender.fn.liquid} | 2 +- .../BotSharp.Plugin.ExcelHandler.csproj | 8 +- .../Enums/UtilityName.cs | 2 +- .../Functions/HandleExcelRequestFn.cs | 3 +- .../Hooks/ExcelHandlerUtilityHook.cs | 3 +- ...n => util-excel-handle_excel_request.json} | 2 +- .../templates/handle_excel_request.fn.liquid | 2 - .../util-excel-handle_excel_request.fn.liquid | 2 + .../BotSharp.Plugin.FileHandler.csproj | 35 ++-- .../Enums/UtilityName.cs | 8 +- .../Functions/EditImageFn.cs | 2 +- .../Functions/GenerateImageFn.cs | 2 +- .../Functions/ReadImageFn.cs | 2 +- .../Functions/ReadPdfFn.cs | 2 +- .../Hooks/FileHandlerUtilityHook.cs | 8 +- .../functions/read_image.json | 14 -- ...t_image.json => util-file-edit_image.json} | 2 +- ...age.json => util-file-generate_image.json} | 2 +- .../functions/util-file-read_image.json | 14 ++ ...{read_pdf.json => util-file-read_pdf.json} | 2 +- .../templates/edit_image.fn.liquid | 1 - .../templates/generate_image.fn.liquid | 2 - .../templates/read_image.fn.liquid | 1 - .../templates/read_pdf.fn.liquid | 1 - .../templates/util-file-edit_image.fn.liquid | 1 + .../util-file-generate_image.fn.liquid | 2 + .../templates/util-file-read_image.fn.liquid | 1 + .../templates/util-file-read_pdf.fn.liquid | 1 + .../BotSharp.Plugin.HttpHandler.csproj | 8 +- .../Enums/UtilityName.cs | 2 +- .../Functions/HandleHttpRequestFn.cs | 2 +- .../Hooks/HttpHandlerUtilityHook.cs | 3 +- ...son => util-http-handle_http_request.json} | 2 +- .../templates/handle_http_request.fn.liquid | 1 - .../util-http-handle_http_request.fn.liquid | 1 + .../BotSharp.Plugin.KnowledgeBase.csproj | 9 +- .../Enum/UtilityName.cs | 2 +- .../Functions/KnowledgeRetrievalFn.cs | 2 +- .../Hooks/KnowledgeBaseUtilityHook.cs | 3 +- ...> util-knowledge-knowledge_retrieval.json} | 2 +- ...l-knowledge-knowledge_retrieval.fn.liquid} | 2 +- .../BotSharp.Plugin.Planner.csproj | 15 +- .../Enums/UtilityName.cs | 2 +- ...util-planner-plan_primary_stage.fn.liquid} | 0 ...il-planner-plan_secondary_stage.fn.liquid} | 0 ...id => util-planner-plan_summary.fn.liquid} | 0 .../BotSharp.Plugin.SqlDriver.csproj | 25 +-- .../Enum/UtilityName.cs | 6 +- .../Hooks/SqlUtilityHook.cs | 10 +- .../UtilFunctions/GetTableDefinitionFn.cs | 168 ++++++++++++++++++ .../UtilFunctions/SqlSelect.cs | 88 +++++++++ .../UtilFunctions/VerifyDictionaryTerm.cs | 130 ++++++++++++++ ...ql_select.json => util-db-sql_select.json} | 2 +- ...json => util-db-sql_table_definition.json} | 2 +- ...on => util-db-verify_dictionary_term.json} | 2 +- .../templates/sql_table_definition.fn.liquid | 1 - ....liquid => util-db-sql_executor.fn.liquid} | 2 +- .../util-db-sql_table_definition.fn.liquid | 1 + ... util-db-verify_dictionary_term.fn.liquid} | 2 +- .../BotSharp.Plugin.Twilio.csproj | 12 +- .../Enums/UtilityName.cs | 2 +- .../Functions/HandleOutboundPhoneCallFn.cs | 2 +- .../OutboundPhoneCallHandlerUtilityHook.cs | 5 +- ...il-twilio-twilio_outbound_phone_call.json} | 2 +- ...ilio-twilio_outbound_phone_call.fn.liquid} | 2 +- 82 files changed, 553 insertions(+), 163 deletions(-) rename src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{handle_audio_request.json => util-audio-handle_audio_request.json} (94%) delete mode 100644 src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_audio_request.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-audio-handle_audio_request.fn.liquid rename src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{handle_email_reader.json => util-email-handle_email_reader.json} (95%) rename src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{handle_email_sender.json => util-email-handle_email_sender.json} (96%) delete mode 100644 src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_reader.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_reader.fn.liquid rename src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{handle_email_sender.fn.liquid => util-email-handle_email_sender.fn.liquid} (81%) rename src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{handle_excel_request.json => util-excel-handle_excel_request.json} (95%) delete mode 100644 src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_excel_request.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-excel-handle_excel_request.fn.liquid delete mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_image.json rename src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{edit_image.json => util-file-edit_image.json} (92%) rename src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{generate_image.json => util-file-generate_image.json} (90%) create mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json rename src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{read_pdf.json => util-file-read_pdf.json} (92%) delete mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/edit_image.fn.liquid delete mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/generate_image.fn.liquid delete mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_image.fn.liquid delete mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_pdf.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-edit_image.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-generate_image.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_image.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_pdf.fn.liquid rename src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{handle_http_request.json => util-http-handle_http_request.json} (95%) delete mode 100644 src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_http_request.fn.liquid create mode 100644 src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-http-handle_http_request.fn.liquid rename src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{knowledge_retrieval.json => util-knowledge-knowledge_retrieval.json} (86%) rename src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{knowledge_retrieval.fn.liquid => util-knowledge-knowledge_retrieval.fn.liquid} (63%) rename src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{plan_primary_stage.fn.liquid => util-planner-plan_primary_stage.fn.liquid} (100%) rename src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{plan_secondary_stage.fn.liquid => util-planner-plan_secondary_stage.fn.liquid} (100%) rename src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{plan_summary.fn.liquid => util-planner-plan_summary.fn.liquid} (100%) create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/GetTableDefinitionFn.cs create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/SqlSelect.cs create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/VerifyDictionaryTerm.cs rename src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{sql_select.json => util-db-sql_select.json} (98%) rename src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{sql_table_definition.json => util-db-sql_table_definition.json} (90%) rename src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{verify_dictionary_term.json => util-db-verify_dictionary_term.json} (96%) delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid rename src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{sql_executor.fn.liquid => util-db-sql_executor.fn.liquid} (78%) create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_table_definition.fn.liquid rename src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{verify_dictionary_term.fn.liquid => util-db-verify_dictionary_term.fn.liquid} (92%) rename src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/{twilio_outbound_phone_call.json => util-twilio-twilio_outbound_phone_call.json} (92%) rename src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/{twilio_outbound_phone_call.fn.liquid => util-twilio-twilio_outbound_phone_call.fn.liquid} (51%) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 7759a4bf..867d9d78 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -116,13 +116,14 @@ public abstract class AgentHookBase : IAgentHook return ([], []); } + var prefix = "util-"; utilities = utilities?.Where(x => !string.IsNullOrEmpty(x.Name) && !x.Disabled)?.ToList() ?? []; var functionNames = utilities.SelectMany(x => x.Functions) - .Where(x => !string.IsNullOrEmpty(x.Name)) + .Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith(prefix)) .Select(x => x.Name) .Distinct().ToList(); var templateNames = utilities.SelectMany(x => x.Templates) - .Where(x => !string.IsNullOrEmpty(x.Name)) + .Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith(prefix)) .Select(x => x.Name) .Distinct().ToList(); diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/BotSharp.Plugin.AudioHandler.csproj b/src/Plugins/BotSharp.Plugin.AudioHandler/BotSharp.Plugin.AudioHandler.csproj index 4ae8c7d2..ace72c5c 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/BotSharp.Plugin.AudioHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/BotSharp.Plugin.AudioHandler.csproj @@ -24,15 +24,15 @@ - - + + - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Enums/UtilityName.cs index d11bd65a..51c86863 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Enums/UtilityName.cs @@ -2,5 +2,5 @@ namespace BotSharp.Plugin.AudioHandler.Enums; public class UtilityName { - public const string AudioHandler = "audio-handler"; + public const string AudioHandler = "audio.audio-handler"; } diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Functions/HandleAudioRequestFn.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Functions/HandleAudioRequestFn.cs index 34ec530c..9c0ab4f4 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Functions/HandleAudioRequestFn.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Functions/HandleAudioRequestFn.cs @@ -5,7 +5,7 @@ namespace BotSharp.Plugin.AudioHandler.Functions; public class HandleAudioRequestFn : IFunctionCallback { - public string Name => "handle_audio_request"; + public string Name => "util-audio-handle_audio_request"; public string Indication => "Handling audio request"; private readonly IServiceProvider _serviceProvider; diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs index 3d1f3992..4cb6d61c 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/Hooks/AudioHandlerUtilityHook.cs @@ -2,7 +2,8 @@ namespace BotSharp.Plugin.AudioHandler.Hooks; public class AudioHandlerUtilityHook : IAgentUtilityHook { - private const string HANDLER_AUDIO = "handle_audio_request"; + private const string PREFIX = "util-audio-"; + private const string HANDLER_AUDIO = $"{PREFIX}handle_audio_request"; public void AddUtilities(List utilities) { diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_audio_request.json b/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-audio-handle_audio_request.json similarity index 94% rename from src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_audio_request.json rename to src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-audio-handle_audio_request.json index c0603b1a..7655f691 100644 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_audio_request.json +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-audio-handle_audio_request.json @@ -1,5 +1,5 @@ { - "name": "handle_audio_request", + "name": "util-audio-handle_audio_request", "description": "If the user requests to transcribe or summarize audio content, you need to call this function to transcribe the audio content to raw texts or provide sunmmary based on raw texts transcribed from audio", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_audio_request.fn.liquid b/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_audio_request.fn.liquid deleted file mode 100644 index 95f17ae1..00000000 --- a/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_audio_request.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Please call handle_audio_request if user wants to transcribe or summarize the content of a audio file. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-audio-handle_audio_request.fn.liquid b/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-audio-handle_audio_request.fn.liquid new file mode 100644 index 00000000..b49c3440 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.AudioHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-audio-handle_audio_request.fn.liquid @@ -0,0 +1 @@ +Please call util-audio-handle_audio_request if user wants to transcribe or summarize the content of a audio file. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj b/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj index 3aa65e97..f1a6c28e 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj @@ -11,24 +11,23 @@ - - - - - + + + + - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Enums/UtilityName.cs index b84f9c5f..e9297d8c 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Enums/UtilityName.cs @@ -1,13 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace BotSharp.Plugin.EmailHandler.Enums; -namespace BotSharp.Plugin.EmailHandler.Enums +public class UtilityName { - public class UtilityName - { - public const string EmailHandler = "email-handler"; - } + public const string EmailHandler = "email.email-handler"; } diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailReaderFn.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailReaderFn.cs index d0f11466..1833a783 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailReaderFn.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailReaderFn.cs @@ -7,7 +7,7 @@ namespace BotSharp.Plugin.EmailReader.Functions; public class HandleEmailReaderFn : IFunctionCallback { - public string Name => "handle_email_reader"; + public string Name => "util-email-handle_email_reader"; public readonly static string PROMPT_SUMMARY = "Provide a text summary of the following content."; public readonly static string RICH_CONTENT_SUMMARIZE = "is_email_summarize: true. messageId"; public readonly static string RICH_CONTENT_READ_EMAIL = "Read the email by messageId"; diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailSenderFn.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailSenderFn.cs index fa038811..a6b04e49 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailSenderFn.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailSenderFn.cs @@ -6,7 +6,7 @@ namespace BotSharp.Plugin.EmailHandler.Functions; public class HandleEmailSenderFn : IFunctionCallback { - public string Name => "handle_email_sender"; + public string Name => "util-email-handle_email_sender"; public string Indication => "Handling email send request"; private readonly IServiceProvider _services; diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs index a909932e..a99dfc8c 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerUtilityHook.cs @@ -5,8 +5,9 @@ namespace BotSharp.Plugin.EmailHandler.Hooks; public class EmailHandlerUtilityHook : IAgentUtilityHook { - private static string EMAIL_READER_FN = "handle_email_reader"; - private static string EMAIL_SENDER_FN = "handle_email_sender"; + private static string PREFIX = "util-email-"; + private static string EMAIL_READER_FN = $"{PREFIX}handle_email_reader"; + private static string EMAIL_SENDER_FN = $"{PREFIX}handle_email_sender"; public void AddUtilities(List utilities) { diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_reader.json b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-email-handle_email_reader.json similarity index 95% rename from src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_reader.json rename to src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-email-handle_email_reader.json index bcea2ac8..36e86402 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_reader.json +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-email-handle_email_reader.json @@ -1,5 +1,5 @@ { - "name": "handle_email_reader", + "name": "util-email-handle_email_reader", "description": "If the user wants to read messages from email inbox or user wants to mark an email message as read.If message id is provided, capture it but it is not required. Then call this function to read the email message or mark any message as read.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_sender.json b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-email-handle_email_sender.json similarity index 96% rename from src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_sender.json rename to src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-email-handle_email_sender.json index 730c4597..b1ebfb73 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_sender.json +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-email-handle_email_sender.json @@ -1,5 +1,5 @@ { - "name": "handle_email_sender", + "name": "util-email-handle_email_sender", "description": "If the user requests to send an email with or without attachments or files, you need to capture the email content and the recipient email address. If the user explicitly enter email subject use the same if not intelligently capture the email subject from the content. Then call this function to send out email.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_reader.fn.liquid b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_reader.fn.liquid deleted file mode 100644 index 0efb6229..00000000 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_reader.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Please call handle_email_reader if user wants to read messages from email inbox. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_reader.fn.liquid b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_reader.fn.liquid new file mode 100644 index 00000000..10708bb7 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_reader.fn.liquid @@ -0,0 +1 @@ +Please call util-email-handle_email_reader if user wants to read messages from email inbox. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_sender.fn.liquid b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_sender.fn.liquid similarity index 81% rename from src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_sender.fn.liquid rename to src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_sender.fn.liquid index eb6f0e6f..5fc29e3d 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_sender.fn.liquid +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-email-handle_email_sender.fn.liquid @@ -1,4 +1,4 @@ ** Please take a look at the conversation and decide whether user wants to send email. ** If yes, then decide whether user wants to send email with files/attachments/images or not. ** If user does not want to send email explicitly or only upload images or files, please do not respond anything email related message. -** Please call handle_email_sender if user wants to send email. \ No newline at end of file +** Please call util-email-handle_email_sender if user wants to send email. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj b/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj index e23bd5e7..08cfd79a 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/BotSharp.Plugin.ExcelHandler.csproj @@ -13,15 +13,15 @@ - - + + - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Enums/UtilityName.cs index 66ef3f36..bc689259 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Enums/UtilityName.cs @@ -2,5 +2,5 @@ namespace BotSharp.Plugin.ExcelHandler.Enums; public class UtilityName { - public const string ExcelHandler = "excel-handler"; + public const string ExcelHandler = "excel.excel-handler"; } diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs index f72492e3..270f6177 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs @@ -2,7 +2,6 @@ using System.Linq.Dynamic.Core; using BotSharp.Abstraction.Files.Enums; using BotSharp.Abstraction.Files.Models; using BotSharp.Abstraction.Files.Utilities; -using BotSharp.Plugin.ExcelHandler.Helpers.Sqlite; using BotSharp.Plugin.ExcelHandler.Models; using BotSharp.Plugin.ExcelHandler.Services; using NPOI.SS.UserModel; @@ -12,7 +11,7 @@ namespace BotSharp.Plugin.ExcelHandler.Functions; public class HandleExcelRequestFn : IFunctionCallback { - public string Name => "handle_excel_request"; + public string Name => "util-excel-handle_excel_request"; public string Indication => "Handling excel request"; private readonly IServiceProvider _serviceProvider; diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs index 15c41642..6293a832 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Hooks/ExcelHandlerUtilityHook.cs @@ -2,7 +2,8 @@ namespace BotSharp.Plugin.ExcelHandler.Hooks; public class ExcelHandlerUtilityHook : IAgentUtilityHook { - private const string HANDLER_EXCEL = "handle_excel_request"; + private static string PREFIX = "util-excel-"; + private static string HANDLER_EXCEL = $"{PREFIX}handle_excel_request"; public void AddUtilities(List utilities) { diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_excel_request.json b/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-excel-handle_excel_request.json similarity index 95% rename from src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_excel_request.json rename to src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-excel-handle_excel_request.json index 38f2faab..53381c67 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_excel_request.json +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-excel-handle_excel_request.json @@ -1,5 +1,5 @@ { - "name": "handle_excel_request", + "name": "util-excel-handle_excel_request", "description": "If the user requests to read/load data from excel/csv files, you need to call this function to load the data from excel/csv files and transform into JSON format data", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_excel_request.fn.liquid b/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_excel_request.fn.liquid deleted file mode 100644 index a3f27694..00000000 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_excel_request.fn.liquid +++ /dev/null @@ -1,2 +0,0 @@ -Please call handle_excel_request if user wants to load the data from a excel/csv file. -handle_excel_request can NOT generate excel/csv. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-excel-handle_excel_request.fn.liquid b/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-excel-handle_excel_request.fn.liquid new file mode 100644 index 00000000..53aef674 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-excel-handle_excel_request.fn.liquid @@ -0,0 +1,2 @@ +Please call util-excel-handle_excel_request if user wants to load the data from a excel/csv file. +util-excel-handle_excel_request can NOT generate excel/csv. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj b/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj index 9b097fed..2147d178 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj @@ -11,40 +11,43 @@ - - - - - - - - + + + + + + + + + + + - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Enums/UtilityName.cs index eb2b4e2b..68242202 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Enums/UtilityName.cs @@ -2,8 +2,8 @@ namespace BotSharp.Plugin.FileHandler.Enums; public class UtilityName { - public const string ImageGenerator = "image-generator"; - public const string ImageReader = "image-reader"; - public const string ImageEditor = "image-editor"; - public const string PdfReader = "pdf-reader"; + public const string ImageGenerator = "file.image-generator"; + public const string ImageReader = "file.image-reader"; + public const string ImageEditor = "file.image-editor"; + public const string PdfReader = "file.pdf-reader"; } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs index cb7139f0..87d8268b 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs @@ -4,7 +4,7 @@ namespace BotSharp.Plugin.FileHandler.Functions; public class EditImageFn : IFunctionCallback { - public string Name => "edit_image"; + public string Name => "util-file-edit_image"; public string Indication => "Editing image"; private readonly IServiceProvider _services; diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/GenerateImageFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/GenerateImageFn.cs index c3e8c147..a511ebae 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/GenerateImageFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/GenerateImageFn.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.FileHandler.Functions; public class GenerateImageFn : IFunctionCallback { - public string Name => "generate_image"; + public string Name => "util-file-generate_image"; public string Indication => "Generating image"; private readonly IServiceProvider _services; diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs index a415207e..f2e79b21 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.FileHandler.Functions; public class ReadImageFn : IFunctionCallback { - public string Name => "read_image"; + public string Name => "util-file-read_image"; public string Indication => "Reading images"; private readonly IServiceProvider _services; diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadPdfFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadPdfFn.cs index 814f943e..2aeb64a1 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadPdfFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadPdfFn.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.FileHandler.Functions; public class ReadPdfFn : IFunctionCallback { - public string Name => "read_pdf"; + public string Name => "util-file-read_pdf"; public string Indication => "Reading pdf"; private readonly IServiceProvider _services; diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs index ab295063..3409c448 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Hooks/FileHandlerUtilityHook.cs @@ -2,10 +2,10 @@ namespace BotSharp.Plugin.FileHandler.Hooks; public class FileHandlerUtilityHook : IAgentUtilityHook { - private const string READ_IMAGE_FN = "read_image"; - private const string READ_PDF_FN = "read_pdf"; - private const string GENERATE_IMAGE_FN = "generate_image"; - private const string EDIT_IMAGE_FN = "edit_image"; + private const string READ_IMAGE_FN = "util-file-read_image"; + private const string READ_PDF_FN = "util-file-read_pdf"; + private const string GENERATE_IMAGE_FN = "util-file-generate_image"; + private const string EDIT_IMAGE_FN = "util-file-edit_image"; public void AddUtilities(List utilities) { diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_image.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_image.json deleted file mode 100644 index 99daafc5..00000000 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_image.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "read_image", - "description": "If the user's request is related to analyzing images, you can call this function to analyze images.", - "parameters": { - "type": "object", - "properties": { - "user_request": { - "type": "string", - "description": "The request posted by user, which is related to analyzing requested images. User can request for multiple images to process at one time." - } - }, - "required": [ "user_request" ] - } -} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/edit_image.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json similarity index 92% rename from src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/edit_image.json rename to src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json index f513ffba..306e44dd 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/edit_image.json +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json @@ -1,5 +1,5 @@ { - "name": "edit_image", + "name": "util-file-edit_image", "description": "If the user requests you editting or changing an image or a picture, you can call this function to edit an image.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/generate_image.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-generate_image.json similarity index 90% rename from src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/generate_image.json rename to src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-generate_image.json index d9c8b70e..ba96aef0 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/generate_image.json +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-generate_image.json @@ -1,5 +1,5 @@ { - "name": "generate_image", + "name": "util-file-generate_image", "description": "If the user requests you providing or generating image or picture, you can call this function to generate image.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json new file mode 100644 index 00000000..a0f269a0 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json @@ -0,0 +1,14 @@ +{ + "name": "util-file-read_image", + "description": "If the user's request is related to analyzing images, you can call this function to analyze images.", + "parameters": { + "type": "object", + "properties": { + "user_request": { + "type": "string", + "description": "The request posted by user, which is related to analyzing requested images. User can request for multiple images to process at one time." + } + }, + "required": [ "user_request" ] + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_pdf.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_pdf.json similarity index 92% rename from src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_pdf.json rename to src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_pdf.json index 54d9424c..d6b27819 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/read_pdf.json +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_pdf.json @@ -1,5 +1,5 @@ { - "name": "read_pdf", + "name": "util-file-read_pdf", "description": "If the user's request is related to analyzing pdf files, you can call this function to analyze pdf.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/edit_image.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/edit_image.fn.liquid deleted file mode 100644 index 7fa2ac21..00000000 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/edit_image.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Please call edit_image if user wants to edit or change an image in the conversation. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/generate_image.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/generate_image.fn.liquid deleted file mode 100644 index 9ee28f9c..00000000 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/generate_image.fn.liquid +++ /dev/null @@ -1,2 +0,0 @@ -** Please call generate_image if user wants you to provide or generate an image or picture. -** If user does not generate image explicitly, please do not call generate_image. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_image.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_image.fn.liquid deleted file mode 100644 index 3ebf28cc..00000000 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_image.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Please call function read_image if user wants to describe an image or images. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_pdf.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_pdf.fn.liquid deleted file mode 100644 index 0ea6706d..00000000 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/read_pdf.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Please call function read_pdf if user wants to describe an pdf file or pdf files. diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-edit_image.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-edit_image.fn.liquid new file mode 100644 index 00000000..49ab707f --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-edit_image.fn.liquid @@ -0,0 +1 @@ +Please call util-file-edit_image if user wants to edit or change an image in the conversation. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-generate_image.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-generate_image.fn.liquid new file mode 100644 index 00000000..6d7dd619 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-generate_image.fn.liquid @@ -0,0 +1,2 @@ +** Please call util-file-generate_image if user wants you to provide or generate an image or picture. +** If user does not generate image explicitly, please do not call generate_image. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_image.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_image.fn.liquid new file mode 100644 index 00000000..76f75bd0 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_image.fn.liquid @@ -0,0 +1 @@ +Please call function util-file-read_image if user wants to describe an image or images. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_pdf.fn.liquid b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_pdf.fn.liquid new file mode 100644 index 00000000..12d08f0a --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-file-read_pdf.fn.liquid @@ -0,0 +1 @@ +Please call function util-file-read_pdf if user wants to describe an pdf file or pdf files. diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/BotSharp.Plugin.HttpHandler.csproj b/src/Plugins/BotSharp.Plugin.HttpHandler/BotSharp.Plugin.HttpHandler.csproj index 8664c654..7dc0ac87 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/BotSharp.Plugin.HttpHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/BotSharp.Plugin.HttpHandler.csproj @@ -11,11 +11,11 @@ - - + + @@ -25,10 +25,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Enums/UtilityName.cs index 2e0146bf..3a1e7cd5 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Enums/UtilityName.cs @@ -2,5 +2,5 @@ namespace BotSharp.Plugin.HttpHandler.Enums; public class UtilityName { - public const string HttpHandler = "http-handler"; + public const string HttpHandler = "http.http-handler"; } diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs index 20d2d012..d36aafba 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs @@ -7,7 +7,7 @@ namespace BotSharp.Plugin.HttpHandler.Functions; public class HandleHttpRequestFn : IFunctionCallback { - public string Name => "handle_http_request"; + public string Name => "util-http-handle_http_request"; public string Indication => "Handling http request"; private readonly IServiceProvider _services; diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs index 265558ac..d99b6084 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs @@ -4,7 +4,8 @@ namespace BotSharp.Plugin.HttpHandler.Hooks; public class HttpHandlerUtilityHook : IAgentUtilityHook { - private static string HTTP_HANDLER_FN = "handle_http_request"; + private static string PREFIX = "util-http-"; + private static string HTTP_HANDLER_FN = $"{PREFIX}handle_http_request"; public void AddUtilities(List utilities) { diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_http_request.json b/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-http-handle_http_request.json similarity index 95% rename from src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_http_request.json rename to src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-http-handle_http_request.json index c7335cee..40ce00d5 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_http_request.json +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-http-handle_http_request.json @@ -1,5 +1,5 @@ { - "name": "handle_http_request", + "name": "util-http-handle_http_request", "description": "If the user requests to send an http request, you need to capture the http method and request content, and then call this function to send the http request.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_http_request.fn.liquid b/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_http_request.fn.liquid deleted file mode 100644 index 7640d81e..00000000 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_http_request.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Please call handle_http_request if user wants to send an http request. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-http-handle_http_request.fn.liquid b/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-http-handle_http_request.fn.liquid new file mode 100644 index 00000000..2d639dd0 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-http-handle_http_request.fn.liquid @@ -0,0 +1 @@ +Please call util-http-handle_http_request if user wants to send an http request. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/BotSharp.Plugin.KnowledgeBase.csproj b/src/Plugins/BotSharp.Plugin.KnowledgeBase/BotSharp.Plugin.KnowledgeBase.csproj index 283d8b32..77a5d076 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/BotSharp.Plugin.KnowledgeBase.csproj +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/BotSharp.Plugin.KnowledgeBase.csproj @@ -1,4 +1,4 @@ - + $(TargetFramework) @@ -23,7 +23,8 @@ - + + @@ -45,10 +46,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Enum/UtilityName.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Enum/UtilityName.cs index 18a28c91..de90430d 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Enum/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Enum/UtilityName.cs @@ -2,5 +2,5 @@ namespace BotSharp.Plugin.KnowledgeBase.Enum; public class UtilityName { - public const string KnowledgeRetrieval = "knowledge-retrieval"; + public const string KnowledgeRetrieval = "knowledge.knowledge-retrieval"; } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs index 606caad9..f3f8cbf1 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.KnowledgeBase.Functions; public class KnowledgeRetrievalFn : IFunctionCallback { - public string Name => "knowledge_retrieval"; + public string Name => "util-knowledge-knowledge_retrieval"; public string Indication => "searching my brain"; diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs index 464fd5b2..700b8457 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeBaseUtilityHook.cs @@ -2,7 +2,8 @@ namespace BotSharp.Plugin.KnowledgeBase.Hooks; public class KnowledgeBaseUtilityHook : IAgentUtilityHook { - private const string KNOWLEDGE_RETRIEVAL_FN = "knowledge_retrieval"; + private static string PREFIX = "util-knowledge-"; + private static string KNOWLEDGE_RETRIEVAL_FN = $"{PREFIX}knowledge_retrieval"; public void AddUtilities(List utilities) { diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/knowledge_retrieval.json b/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-knowledge-knowledge_retrieval.json similarity index 86% rename from src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/knowledge_retrieval.json rename to src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-knowledge-knowledge_retrieval.json index b292d7d9..088f4ea6 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/knowledge_retrieval.json +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-knowledge-knowledge_retrieval.json @@ -1,5 +1,5 @@ { - "name": "knowledge_retrieval", + "name": "util-knowledge-knowledge_retrieval", "description": "Retrieve related domain knowledge to handle user request", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/knowledge_retrieval.fn.liquid b/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-knowledge-knowledge_retrieval.fn.liquid similarity index 63% rename from src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/knowledge_retrieval.fn.liquid rename to src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-knowledge-knowledge_retrieval.fn.liquid index da5e157b..f0bc60c8 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/knowledge_retrieval.fn.liquid +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-knowledge-knowledge_retrieval.fn.liquid @@ -1,3 +1,3 @@ -Call function knowledge_retrieval to retrieve related domain knowledge to handle user request. +Call function util-knowledge-knowledge_retrieval to retrieve related domain knowledge to handle user request. You must retrieve existing KnowledgeBase to get prerequisite informations before you writing SQL query; You must retrieve existing API specification from KnowledgeBase before calling a Web API; diff --git a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj index 72c4e710..fb183c77 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj +++ b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj @@ -1,4 +1,4 @@ - + $(TargetFramework) @@ -19,10 +19,9 @@ - - - - + + + @@ -53,13 +52,13 @@ PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.Planner/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.Planner/Enums/UtilityName.cs index 8a3ef6e3..7594fae0 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Enums/UtilityName.cs @@ -2,5 +2,5 @@ namespace BotSharp.Plugin.Planner.Enums; public class UtilityName { - public const string TwoStagePlanner = "two-stage-planner"; + public const string TwoStagePlanner = "planner.two-stage-planner"; } diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/plan_primary_stage.fn.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-planner-plan_primary_stage.fn.liquid similarity index 100% rename from src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/plan_primary_stage.fn.liquid rename to src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-planner-plan_primary_stage.fn.liquid diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/plan_secondary_stage.fn.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-planner-plan_secondary_stage.fn.liquid similarity index 100% rename from src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/plan_secondary_stage.fn.liquid rename to src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-planner-plan_secondary_stage.fn.liquid diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/plan_summary.fn.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-planner-plan_summary.fn.liquid similarity index 100% rename from src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/plan_summary.fn.liquid rename to src/Plugins/BotSharp.Plugin.Planner/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-planner-plan_summary.fn.liquid diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj index 3a090f0c..84ecc1ee 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj @@ -17,12 +17,6 @@ - - - - - - @@ -36,22 +30,29 @@ + + + + + + + - + PreserveNewest - + PreserveNewest - + PreserveNewest PreserveNewest - + PreserveNewest @@ -69,10 +70,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs index 159d5e7a..abb1faa2 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/UtilityName.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.SqlDriver.Enum; public class UtilityName { - public const string SqlExecutor = "sql-executor"; - public const string SqlDictionaryLookup = "sql-dictionary-lookup"; - public const string SqlTableDefinition = "sql-table-definition"; + public const string SqlExecutor = "db.sql-executor"; + public const string SqlDictionaryLookup = "db.sql-dictionary-lookup"; + public const string SqlTableDefinition = "db.sql-table-definition"; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs index 1984ee98..cdb65fc3 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs @@ -2,9 +2,11 @@ namespace BotSharp.Plugin.SqlDriver.Hooks; public class SqlUtilityHook : IAgentUtilityHook { - private const string SQL_TABLE_DEFINITION_FN = "sql_table_definition"; - private const string VERIFY_DICTIONARY_TERM_FN = "verify_dictionary_term"; - private const string SQL_SELECT_FN = "sql_select"; + private const string PREFIX = "util-db-"; + private const string SQL_TABLE_DEFINITION_FN = $"{PREFIX}sql_table_definition"; + private const string VERIFY_DICTIONARY_TERM_FN = $"{PREFIX}verify_dictionary_term"; + private const string SQL_SELECT_FN = $"{PREFIX}sql_select"; + private const string SQL_EXECUTOR_FN = $"{PREFIX}sql_executor"; public void AddUtilities(List utilities) { @@ -26,7 +28,7 @@ public class SqlUtilityHook : IAgentUtilityHook { Name = UtilityName.SqlExecutor, Functions = [new(SQL_SELECT_FN), new(SQL_TABLE_DEFINITION_FN)], - Templates = [new($"sql_executor.fn")] + Templates = [new($"{SQL_EXECUTOR_FN}.fn")] } }; diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/GetTableDefinitionFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/GetTableDefinitionFn.cs new file mode 100644 index 00000000..a4b493a3 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/GetTableDefinitionFn.cs @@ -0,0 +1,168 @@ +using Microsoft.Data.SqlClient; +using MySqlConnector; +using Npgsql; + +namespace BotSharp.Plugin.SqlDriver.UtilFunctions; + +public class GetTableDefinitionFn : IFunctionCallback +{ + public string Name => "util-db-sql_table_definition"; + public string Indication => "Obtain the relevant data structure definitions."; + private readonly IServiceProvider _services; + private readonly ILogger _logger; + + public GetTableDefinitionFn( + IServiceProvider services, + ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs); + var tables = args.Tables; + var agentService = _services.GetRequiredService(); + var dbHook = _services.GetRequiredService(); + var dbType = dbHook.GetDatabaseType(message); + + // Get table DDL from database + var tableDdls = dbType switch + { + "mysql" => GetDdlFromMySql(tables), + "sqlserver" => GetDdlFromSqlServer(tables), + "redshift" => GetDdlFromRedshift(tables), + _ => throw new NotImplementedException($"Database type {dbType} is not supported.") + }; + + message.Content = string.Join("\r\n\r\n", tableDdls); + return true; + } + + private List GetDdlFromMySql(string[] tables) + { + var settings = _services.GetRequiredService(); + var tableDdls = new List(); + using var connection = new MySqlConnection(settings.MySqlMetaConnectionString ?? settings.MySqlConnectionString); + connection.Open(); + + foreach (var table in tables) + { + try + { + var escapedTableName = MySqlHelper.EscapeString(table); + var sql = $"SHOW CREATE TABLE `{escapedTableName}`"; + + using var command = new MySqlCommand(sql, connection); + using var reader = command.ExecuteReader(); + if (reader.Read()) + { + var result = reader.GetString(1); + tableDdls.Add(result); + } + + reader.Close(); + command.Dispose(); + } + catch (Exception ex) + { + _logger.LogWarning($"Error when getting ddl statement of table {table}. {ex.Message}\r\n{ex.InnerException}"); + } + } + + connection.Close(); + return tableDdls; + } + + private List GetDdlFromSqlServer(string[] tables) + { + var settings = _services.GetRequiredService(); + var tableDdls = new List(); + using var connection = new SqlConnection(settings.SqlServerExecutionConnectionString ?? settings.SqlServerConnectionString); + connection.Open(); + + foreach (var table in tables) + { + try + { + var sql = @$"DECLARE @TableName NVARCHAR(128) = '{table}'; + DECLARE @SQL NVARCHAR(MAX) = 'CREATE TABLE ' + @TableName + ' ('; + + SELECT @SQL = @SQL + ' + ' + COLUMN_NAME + ' ' + + DATA_TYPE + + CASE + WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL AND DATA_TYPE LIKE '%char%' + THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) + ')' + WHEN DATA_TYPE IN ('decimal', 'numeric') + THEN '(' + CAST(NUMERIC_PRECISION AS VARCHAR(10)) + ',' + CAST(NUMERIC_SCALE AS VARCHAR(10)) + ')' + ELSE '' + END + ' ' + + CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END + ',' + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = @TableName + ORDER BY ORDINAL_POSITION; + + -- Remove the last comma and add closing parenthesis + SET @SQL = LEFT(@SQL, LEN(@SQL) - 1) + ');'; + + SELECT @SQL;"; + + using var command = new SqlCommand(sql, connection); + using var reader = command.ExecuteReader(); + if (reader.Read()) + { + var result = reader.GetString(0); + tableDdls.Add(result); + } + } + catch (Exception ex) + { + _logger.LogWarning($"Error when getting ddl statement of table {table}. {ex.Message}\r\n{ex.InnerException}"); + } + } + + connection.Close(); + return tableDdls; + } + + private List GetDdlFromRedshift(string[] tables) + { + var settings = _services.GetRequiredService(); + var tableDdls = new List(); + var schemas = "'onebi_hour','onebi_day'"; + using var connection = new NpgsqlConnection(settings.RedshiftConnectionString); + connection.Open(); + + foreach (var table in tables) + { + try + { + var sql = $"SELECT columnname, external_type, columnnum FROM svv_external_columns WHERE schemaname in ({schemas}) AND tablename = '{table}';"; + + using var command = new NpgsqlCommand(sql, connection); + using var reader = command.ExecuteReader(); + var ddl = $"Table {table} contains below fields: \r\n"; + while (reader.Read()) + { + /*var result = reader.GetString(0); + tableDdls.Add(result);*/ + var columnName = reader.GetString(0); + var dataType = reader.GetString(1); + ddl += $"{columnName} {dataType}\n"; + } + tableDdls.Add(ddl); + + reader.Close(); + command.Dispose(); + } + catch (Exception ex) + { + _logger.LogWarning($"Error when getting ddl statement of table {table}. {ex.Message}\r\n{ex.InnerException}"); + } + } + connection.Close(); + return tableDdls; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/SqlSelect.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/SqlSelect.cs new file mode 100644 index 00000000..5ece6ecf --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/SqlSelect.cs @@ -0,0 +1,88 @@ +using Microsoft.Data.SqlClient; +using MySqlConnector; +using Npgsql; +using static Dapper.SqlMapper; + +namespace BotSharp.Plugin.SqlDriver.UtilFunctions; + +public class SqlSelect : IFunctionCallback +{ + public string Name => "util-db-sql_select"; + private readonly IServiceProvider _services; + + public SqlSelect(IServiceProvider services) + { + _services = services; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs); + + if (args.GeneratedWithoutTableDefinition) + { + message.Content = $"Get the table definition first."; + return false; + } + + // check if need to instantely + var dbHook = _services.GetRequiredService(); + var dbType = dbHook.GetDatabaseType(message); + + var result = dbType switch + { + "mysql" => RunQueryInMySql(args), + "sqlserver" => RunQueryInSqlServer(args), + "redshift" => RunQueryInRedshift(args), + _ => throw new NotImplementedException($"Database type {dbType} is not supported.") + }; + + if (result == null) + { + message.Content = "Record not found"; + } + else + { + message.Content = JsonSerializer.Serialize(result); + args.Return.Value = message.Content; + } + + return true; + } + + private IEnumerable RunQueryInMySql(SqlStatement args) + { + var settings = _services.GetRequiredService(); + using var connection = new MySqlConnection(settings.MySqlExecutionConnectionString); + var dictionary = new Dictionary(); + foreach (var p in args.Parameters) + { + dictionary["@" + p.Name] = p.Value; + } + return connection.Query(args.Statement, dictionary); + } + + private IEnumerable RunQueryInSqlServer(SqlStatement args) + { + var settings = _services.GetRequiredService(); + using var connection = new SqlConnection(settings.SqlServerExecutionConnectionString ?? settings.SqlServerConnectionString); + var dictionary = new Dictionary(); + foreach (var p in args.Parameters) + { + dictionary["@" + p.Name] = p.Value; + } + return connection.Query(args.Statement, dictionary); + } + + private IEnumerable RunQueryInRedshift(SqlStatement args) + { + var settings = _services.GetRequiredService(); + using var connection = new NpgsqlConnection(settings.RedshiftConnectionString); + var dictionary = new Dictionary(); + foreach (var p in args.Parameters) + { + dictionary["@" + p.Name] = p.Value; + } + return connection.Query(args.Statement, dictionary); + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/VerifyDictionaryTerm.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/VerifyDictionaryTerm.cs new file mode 100644 index 00000000..2e6dbe72 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/UtilFunctions/VerifyDictionaryTerm.cs @@ -0,0 +1,130 @@ +using BotSharp.Core.Infrastructures; +using MySqlConnector; +using static Dapper.SqlMapper; + +namespace BotSharp.Plugin.SqlDriver.UtilFunctions; + +public class VerifyDictionaryTerm : IFunctionCallback +{ + public string Name => "util-db-verify_dictionary_term"; + public string Indication => "Verifying dictionary term"; + + + private readonly IServiceProvider _services; + + public VerifyDictionaryTerm(IServiceProvider services) + { + _services = services; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs); + + // get table DDL + var fn = _services.GetRequiredService(); + var msgCopy = RoleDialogModel.From(message); + await fn.InvokeFunction("sql_table_definition", msgCopy); + + // refine SQL + var agentService = _services.GetRequiredService(); + var currentAgent = await agentService.LoadAgent(message.CurrentAgentId); + var dictionarySqlPrompt = await GetDictionarySQLPrompt(args.SqlStatement, msgCopy.Content); + var agent = new Agent + { + Id = message.CurrentAgentId ?? string.Empty, + Name = "sqlDriver_DictionarySearch", + Instruction = dictionarySqlPrompt, + TemplateDict = new Dictionary(), + LlmConfig = currentAgent.LlmConfig + }; + + var response = await GetAiResponse(agent); + args = response.Content.JsonContent(); + + // check if need to instantely + IEnumerable? result = null; + if (!string.IsNullOrWhiteSpace(args.SqlStatement)) + { + var settings = _services.GetRequiredService(); + using var connection = new MySqlConnection(settings.MySqlExecutionConnectionString); + result = connection.Query(args.SqlStatement); + } + + if (result.IsNullOrEmpty()) + { + message.Content = "Record not found"; + } + else + { + message.Content = JsonSerializer.Serialize(result); + } + + var states = _services.GetRequiredService(); + var dictionaryItems = states.GetState("dictionary_items", ""); + var newItem = BuildDictionaryItem(args.Table, args.Reason, message.Content); + dictionaryItems += !string.IsNullOrWhiteSpace(newItem) ? $"\r\n{newItem}\r\n" : string.Empty; + states.SetState("dictionary_items", dictionaryItems); + + return true; + } + + private async Task GetDictionarySQLPrompt(string originalSql, string tableStructure) + { + var agentService = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + var knowledgeHooks = _services.GetServices(); + + var agent = await agentService.GetAgent(BuiltInAgentId.SqlDriver); + var template = agent.Templates.FirstOrDefault(x => x.Name == "database.dictionary.sql")?.Content ?? string.Empty; + var responseFormat = JsonSerializer.Serialize(new LookupDictionary{ }); + + return render.Render(template, new Dictionary + { + { "original_sql", originalSql }, + { "table_structure", tableStructure }, + { "response_format", responseFormat } + }); + } + + private async Task GetAiResponse(Agent agent) + { + var text = "Check and correct the SQL statement."; + var message = new RoleDialogModel(AgentRole.User, text); + + var completion = CompletionProvider.GetChatCompletion(_services, + provider: agent.LlmConfig.Provider, + model: agent.LlmConfig.Model); + + return await completion.GetChatCompletions(agent, new List { message }); + } + + private string BuildDictionaryItem(string? table, string? reason, string? result) + { + var res = string.Empty; + if (!string.IsNullOrWhiteSpace(table)) + { + res += $"Table: {table}"; + } + + if (!string.IsNullOrWhiteSpace(reason)) + { + if (!string.IsNullOrWhiteSpace(res)) + { + res += "\r\n"; + } + res += $"Reason: {reason}"; + } + + if (!string.IsNullOrWhiteSpace(result)) + { + if (!string.IsNullOrWhiteSpace(res)) + { + res += "\r\n"; + } + res += $"Result: {result}"; + } + + return res; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_select.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_select.json similarity index 98% rename from src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_select.json rename to src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_select.json index 1bcf76a3..29f04789 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_select.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_select.json @@ -1,5 +1,5 @@ { - "name": "sql_select", + "name": "util-db-sql_select", "description": "Get the specific value from table", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_table_definition.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json similarity index 90% rename from src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_table_definition.json rename to src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json index e973feb8..6e4b946c 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_table_definition.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json @@ -1,5 +1,5 @@ { - "name": "sql_table_definition", + "name": "util-db-sql_table_definition", "description": "Get table structure from database by table name", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/verify_dictionary_term.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-verify_dictionary_term.json similarity index 96% rename from src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/verify_dictionary_term.json rename to src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-verify_dictionary_term.json index 64502c62..c354c105 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/verify_dictionary_term.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-verify_dictionary_term.json @@ -1,5 +1,5 @@ { - "name": "verify_dictionary_term", + "name": "util-db-verify_dictionary_term", "description": "Get id from dictionary table by keyword. Call this function only if need_lookup_dictionary is true, is_table_from_knowledge is true and is_insert is false. You can only query one table at a time. The table name must come from the global/domain knowledge.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid deleted file mode 100644 index 9a8dee70..00000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Call sql_table_definition to get the table definition of the table. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_executor.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_executor.fn.liquid similarity index 78% rename from src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_executor.fn.liquid rename to src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_executor.fn.liquid index edcb4bef..f3dd7faf 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_executor.fn.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_executor.fn.liquid @@ -1,6 +1,6 @@ You are connecting to {{ db_type }} database. You can run provided SQL statements by following {{ db_type }} rules. -Please call function sql_select if user wants to get or retrieve data from data tables. +Please call function util-db-sql_select if user wants to get or retrieve data from data tables. If there are any parameters, please add them in the WHERE clause, each of which starts with "@". Avoid returning the entire record and only return the fields you need. For example, SELECT Id FROM table WHERE Id=@Id AND Name=@Name diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_table_definition.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_table_definition.fn.liquid new file mode 100644 index 00000000..3d8ad563 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-sql_table_definition.fn.liquid @@ -0,0 +1 @@ +Call util-db-sql_table_definition to get the table definition of the table. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/verify_dictionary_term.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-verify_dictionary_term.fn.liquid similarity index 92% rename from src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/verify_dictionary_term.fn.liquid rename to src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-verify_dictionary_term.fn.liquid index 6a9b06e8..12712215 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/verify_dictionary_term.fn.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-db-verify_dictionary_term.fn.liquid @@ -1,4 +1,4 @@ -Rules to call verify_dictionary_term: +Rules to call util-db-verify_dictionary_term: ===== 1. The table name must come from the planning in conversation. 2. You must return the id and name/code for existing dictionary. diff --git a/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj b/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj index 662bf344..aff07e81 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj +++ b/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj @@ -7,17 +7,17 @@ $(GeneratePackageOnBuild) $(SolutionDir)packages - + - - + + - + - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Enums/UtilityName.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Enums/UtilityName.cs index 66abcd3a..63252a57 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Enums/UtilityName.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Enums/UtilityName.cs @@ -2,6 +2,6 @@ namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Enums { public class UtilityName { - public const string OutboundPhoneCall = "twilio-outbound-phone-call"; + public const string OutboundPhoneCall = "twilio.twilio-outbound-phone-call"; } } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HandleOutboundPhoneCallFn.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HandleOutboundPhoneCallFn.cs index b9c77a71..a14564ba 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HandleOutboundPhoneCallFn.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HandleOutboundPhoneCallFn.cs @@ -16,7 +16,7 @@ namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Functions private readonly BotSharpOptions _options; private readonly TwilioSetting _twilioSetting; - public string Name => "twilio_outbound_phone_call"; + public string Name => "util-twilio-twilio_outbound_phone_call"; public string Indication => "Dialing the number"; public HandleOutboundPhoneCallFn( diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs index 09e8a9e4..32639c9a 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs @@ -5,14 +5,15 @@ namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Hooks; public class OutboundPhoneCallHandlerUtilityHook : IAgentUtilityHook { - private static string OUTBOUND_PHONE_CALL_FN = "twilio_outbound_phone_call"; + private static string PREFIX = "util-twilio-"; + private static string OUTBOUND_PHONE_CALL_FN = $"{PREFIX}twilio_outbound_phone_call"; public void AddUtilities(List utilities) { var utility = new AgentUtility { Name = UtilityName.OutboundPhoneCall, - Functions = [new(OUTBOUND_PHONE_CALL_FN)], + Functions = [new($"{OUTBOUND_PHONE_CALL_FN}")], Templates = [new($"{OUTBOUND_PHONE_CALL_FN}.fn")] }; diff --git a/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/twilio_outbound_phone_call.json b/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-twilio-twilio_outbound_phone_call.json similarity index 92% rename from src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/twilio_outbound_phone_call.json rename to src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-twilio-twilio_outbound_phone_call.json index 8a49f441..768c6fde 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/twilio_outbound_phone_call.json +++ b/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-twilio-twilio_outbound_phone_call.json @@ -1,5 +1,5 @@ { - "name": "twilio_outbound_phone_call", + "name": "util-twilio-twilio_outbound_phone_call", "description": "If the user wants to initiate a phone call, you need to capture the phone number and compose the message the users wants to send. Then call this function to make an outbound call via Twilio.", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/twilio_outbound_phone_call.fn.liquid b/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-twilio-twilio_outbound_phone_call.fn.liquid similarity index 51% rename from src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/twilio_outbound_phone_call.fn.liquid rename to src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-twilio-twilio_outbound_phone_call.fn.liquid index 55210a34..3bfb7dc2 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/twilio_outbound_phone_call.fn.liquid +++ b/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-twilio-twilio_outbound_phone_call.fn.liquid @@ -1,2 +1,2 @@ ** Please take a look at the conversation and decide whether user wants to make an outbound call. -** Please call handle_outbound_call if user wants to make an outbound call. \ No newline at end of file +** Please call util-twilio-twilio_outbound_phone_call if user wants to make an outbound call. \ No newline at end of file From 8570bda4bb2f32f49af155c548c27cb9ee458764 Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Thu, 5 Dec 2024 11:11:16 -0600 Subject: [PATCH 071/100] crontab --- .../Agents/Enums/BuiltInAgentId.cs | 5 -- .../Conversations/Models/RoleDialogModel.cs | 2 + .../BotSharp.Core.Crontab.csproj | 8 +++- .../BotSharp.Core.Crontab/CrontabPlugin.cs | 8 ++-- .../BotSharp.Core.Crontab/Enum/UtilityName.cs | 6 +++ .../Functions/ScheduleTaskFn.cs | 36 ++++++++++++++ .../Hooks/CrontabUtilityHook.cs | 25 ++++++++++ .../Models/CrontabItem.cs | 8 ++-- .../Models/ScheduleTaskArgs.cs | 21 +++++++++ .../Services/CrontabService.cs | 28 +++++++++-- .../Services/CrontabWatcher.cs | 2 +- .../BotSharp.Core.Crontab/Using.cs | 6 +++ .../functions/util-crontab-schedule_task.json | 31 ++++++++++++ .../util-crontab-schedule_task.fn.liquid | 1 + .../agent.json | 24 ---------- .../Infrastructures/HookEmitter.cs | 4 +- .../agent.json | 2 +- .../BotSharp.Plugin.ChatHub.csproj | 1 + .../BotSharp.Plugin.ChatHub/ChatHubPlugin.cs | 2 + .../Hooks/ChatHubCrontabHook.cs | 46 ++++++++++++++++++ .../BotSharp.Plugin.SqlDriver.csproj | 1 + .../Hooks/SqlDriverCrontabHook.cs | 47 +++++++++++++++++++ .../SqlDriverPlugin.cs | 2 + .../agent.json | 6 +-- .../functions/sql_select.json | 4 +- 25 files changed, 272 insertions(+), 54 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Enum/UtilityName.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json create mode 100644 src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid delete mode 100644 src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json create mode 100644 src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs index 7f22c8f2..f2f64b6b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs @@ -56,9 +56,4 @@ public class BuiltInAgentId /// Translates user-defined natural language rules into programmatic code ///
public const string RuleEncoder = "6acfb93c-3412-402e-9ba5-c5d3cd8f0161"; - - /// - /// Schedule job - /// - public const string Crontab = "c2o139da-a62a-4355-8605-fdf0ffaca58e"; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs index 679527a3..5a67216d 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs @@ -2,9 +2,11 @@ using BotSharp.Abstraction.Conversations.Enums; using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Messaging; using BotSharp.Abstraction.Messaging.Models.RichContent; +using System.Diagnostics; namespace BotSharp.Abstraction.Conversations.Models; +[DebuggerStepThrough] public class RoleDialogModel : ITrackableMessage { /// diff --git a/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj b/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj index f1c70ad7..0740b6fa 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj +++ b/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj @@ -7,11 +7,15 @@ - + + - + + PreserveNewest + + PreserveNewest diff --git a/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs b/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs index a449cbbb..26f5cfad 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/CrontabPlugin.cs @@ -14,6 +14,8 @@ limitations under the License. ******************************************************************************/ +using BotSharp.Core.Crontab.Hooks; + namespace BotSharp.Core.Crontab; /// @@ -27,13 +29,9 @@ public class CrontabPlugin : IBotSharpPlugin public string Description => "Crontab plugin is a time-based job scheduler in agent framework. The cron system is used to trigger AI Agent to do specific task periodically."; public string IconUrl => "https://icon-library.com/images/stop-watch-icon/stop-watch-icon-10.jpg"; - public string[] AgentIds = - [ - BuiltInAgentId.Crontab - ]; - public void RegisterDI(IServiceCollection services, IConfiguration config) { + services.AddScoped(); services.AddScoped(); services.AddHostedService(); } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Enum/UtilityName.cs b/src/Infrastructure/BotSharp.Core.Crontab/Enum/UtilityName.cs new file mode 100644 index 00000000..eba15bd9 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Enum/UtilityName.cs @@ -0,0 +1,6 @@ +namespace BotSharp.Core.Crontab.Enum; + +public class UtilityName +{ + public const string ScheduleTask = "crontab.schedule-task"; +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs new file mode 100644 index 00000000..cb4986b0 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs @@ -0,0 +1,36 @@ +using BotSharp.Abstraction.Routing; +using BotSharp.Abstraction.Users; + +namespace BotSharp.Core.Crontab.Functions; + +public class ScheduleTaskFn : IFunctionCallback +{ + public string Name => "schedule_task"; + private readonly IServiceProvider _services; + + public ScheduleTaskFn(IServiceProvider services) + { + _services = services; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs); + + var routing = _services.GetRequiredService(); + var user = _services.GetRequiredService(); + var crontabItem = new CrontabItem + { + Topic = args.Topic, + Description = args.Description, + Cron = args.Cron, + Script = args.Script, + Language = args.Language, + UserId = user.Id, + AgentId = routing.EntryAgentId, + ConversationId = routing.ConversationId + }; + + return true; + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs b/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs new file mode 100644 index 00000000..1a71849e --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs @@ -0,0 +1,25 @@ +using BotSharp.Abstraction.Agents.Models; +using BotSharp.Core.Crontab.Enum; + +namespace BotSharp.Core.Crontab.Hooks; + +public class CrontabUtilityHook : IAgentUtilityHook +{ + private const string PREFIX = "util-crontab-"; + private const string SCHEDULE_TASK_FN = $"{PREFIX}schedule_task"; + + public void AddUtilities(List utilities) + { + var items = new List + { + new AgentUtility + { + Name = UtilityName.ScheduleTask, + Functions = [new(SCHEDULE_TASK_FN)], + Templates = [new($"{SCHEDULE_TASK_FN}.fn")] + } + }; + + utilities.AddRange(items); + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs b/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs index 50cafd02..c3fab2e8 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs @@ -1,14 +1,14 @@ namespace BotSharp.Core.Crontab.Models; -public class CrontabItem +public class CrontabItem : ScheduleTaskArgs { public string UserId { get; set; } = null!; public string AgentId { get; set; } = null!; - public string Topic { get; set; } = null!; - public string Cron { get; set; } = null!; + public string ConversationId { get; set; } = null!; + public string ExecutionResult { get; set; } = null!; public override string ToString() { - return $"AgentId: {AgentId}, UserId: {UserId}, Topic: {Topic}"; + return $"{Topic}: {Description} [AgentId: {AgentId}, UserId: {UserId}]"; } } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs b/src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs new file mode 100644 index 00000000..af1bb23f --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs @@ -0,0 +1,21 @@ +using System.Text.Json.Serialization; + +namespace BotSharp.Core.Crontab.Models; + +public class ScheduleTaskArgs +{ + [JsonPropertyName("cron_expression")] + public string Cron { get; set; } = null!; + + [JsonPropertyName("topic")] + public string Topic { get; set; } = null!; + + [JsonPropertyName("description")] + public string Description { get; set; } = null!; + + [JsonPropertyName("script")] + public string Script { get; set; } = null!; + + [JsonPropertyName("language")] + public string Language { get; set; } = null!; +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs index a8b5f6dd..ea91fd5b 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs @@ -15,6 +15,8 @@ ******************************************************************************/ using BotSharp.Abstraction.Agents.Enums; +using BotSharp.Abstraction.Conversations; +using BotSharp.Abstraction.Routing; using BotSharp.Core.Crontab.Models; using BotSharp.Core.Infrastructures; @@ -56,22 +58,38 @@ public class CrontabService : ICrontabService public async Task> GetCrontable() { + var convService = _services.GetRequiredService(); + var conv = await convService.GetConversation("73a9ee27-d597-4739-958f-3bd79760ac8e"); + if (!conv.States.ContainsKey("cron_expression")) + { + return []; + } + return [ new CrontabItem { - Cron = "*/30 * * * * *", - AgentId = BuiltInAgentId.AIAssistant, + Topic = conv.States["topic"], + Cron = conv.States["cron_expression"], + Description = conv.States["description"], + Script = conv.States["script"], + Language = conv.States["language"] } ]; } public async Task ScheduledTimeArrived(CrontabItem item) { - _logger.LogInformation("ScheduledTimeArrived"); - await HookEmitter.Emit(_services, async hook => + _logger.LogDebug($"ScheduledTimeArrived {item}"); + + var hooks = _services.GetServices(); + foreach(var hook in hooks) + { + await hook.OnCronTriggered(item); + } + /*await HookEmitter.Emit(_services, async hook => await hook.OnCronTriggered(item) - ); + );*/ await Task.Delay(1000 * 10); } } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs index 0abd050f..f29bd069 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs @@ -62,7 +62,7 @@ public class CrontabWatcher : BackgroundService if (matches) { - _logger.LogInformation($"The current time matches the cron expression {item}"); + _logger.LogDebug($"The current time matches the cron expression {item}"); cron.ScheduledTimeArrived(item); } } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Using.cs b/src/Infrastructure/BotSharp.Core.Crontab/Using.cs index 0da87fb2..42563238 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Using.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Using.cs @@ -1,7 +1,13 @@ +global using System.Text.Json; + global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; global using BotSharp.Abstraction.Agents.Enums; +global using BotSharp.Abstraction.Agents; global using BotSharp.Abstraction.Plugins; +global using BotSharp.Abstraction.Conversations.Models; +global using BotSharp.Abstraction.Functions; global using BotSharp.Core.Crontab.Services; global using BotSharp.Core.Crontab.Abstraction; +global using BotSharp.Core.Crontab.Models; diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json new file mode 100644 index 00000000..eba05ef4 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json @@ -0,0 +1,31 @@ +{ + "name": "schedule_task", + "description": "Set up a scheduled task", + "parameters": { + "type": "object", + "properties": { + "cron_expression": { + "type": "string", + "description": "cron expression include seconds" + }, + "topic": { + "type": "string", + "description": "task topic in 1-3 keywords related to business entities" + }, + "description": { + "type": "string", + "description": "task description without cron infromation, should include all key business entities" + }, + "script": { + "type": "string", + "description": "task related script, commands or provided function with parameters" + }, + "language": { + "type": "string", + "enum": ["sql", "function"], + "description": "script programming language" + } + }, + "required": [ "cron_expression", "topic", "description", "script", "language" ] + } +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid new file mode 100644 index 00000000..0c132546 --- /dev/null +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid @@ -0,0 +1 @@ +Call schedule_task if user needs to set up a scheduled task with appropriate programming script and language type. \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json deleted file mode 100644 index b17e1e6d..00000000 --- a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/c2o139da-a62a-4355-8605-fdf0ffaca58e/agent.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "c2o139da-a62a-4355-8605-fdf0ffaca58e", - "name": "Crontab", - "description": "Convert the user-specified schedule into a Cron expression, accurate to the second level.", - "iconUrl": "https://icon-library.com/images/stop-watch-icon/stop-watch-icon-10.jpg", - "type": "task", - "createdDateTime": "2024-12-03T00:00:00Z", - "updatedDateTime": "2024-12-03T00:00:00Z", - "disabled": false, - "isPublic": true, - "profiles": [ "cron" ], - "llmConfig": { - "provider": "openai", - "model": "gpt-4o-mini" - }, - "routingRules": [ - { - "field": "cron_expression", - "required": true, - "field_type": "string", - "description": "A Cron expression, accurate to the second level." - } - ] -} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/HookEmitter.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/HookEmitter.cs index 943386e1..454ed840 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/HookEmitter.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/HookEmitter.cs @@ -15,7 +15,7 @@ public static class HookEmitter { try { - logger.LogInformation($"Emit hook action on {action.Method.Name}({hook.GetType().Name})"); + logger.LogDebug($"Emit hook action on {action.Method.Name}({hook.GetType().Name})"); action(hook); if (option.OnlyOnce) @@ -43,7 +43,7 @@ public static class HookEmitter { try { - logger.LogInformation($"Emit hook action on {action.Method.Name}({hook.GetType().Name})"); + logger.LogDebug($"Emit hook action on {action.Method.Name}({hook.GetType().Name})"); await action(hook); if (option.OnlyOnce) diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json index 992e04f3..0a82ae0a 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json @@ -8,7 +8,7 @@ "iconUrl": "https://cdn.iconscout.com/icon/premium/png-256-thumb/route-1613278-1368497.png", "disabled": false, "isPublic": true, - "profiles": [ "tool" ], + "profiles": [ "planning", "fallback", "human" ], "routingRules": [ { "type": "reasoner", diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/BotSharp.Plugin.ChatHub.csproj b/src/Plugins/BotSharp.Plugin.ChatHub/BotSharp.Plugin.ChatHub.csproj index 4f076a9e..4268cf38 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/BotSharp.Plugin.ChatHub.csproj +++ b/src/Plugins/BotSharp.Plugin.ChatHub/BotSharp.Plugin.ChatHub.csproj @@ -19,6 +19,7 @@ + diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs b/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs index 5bd9a8ce..1eaad66d 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Loggers; using BotSharp.Abstraction.Routing; +using BotSharp.Core.Crontab.Abstraction; using BotSharp.Plugin.ChatHub.Hooks; using Microsoft.Extensions.Configuration; @@ -23,5 +24,6 @@ public class ChatHubPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs new file mode 100644 index 00000000..4b475e73 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs @@ -0,0 +1,46 @@ +using BotSharp.Core.Crontab.Abstraction; +using BotSharp.Core.Crontab.Models; +using Microsoft.AspNetCore.SignalR; + +namespace BotSharp.Plugin.ChatHub.Hooks; + +public class ChatHubCrontabHook : ICrontabHook +{ + private readonly IServiceProvider _services; + private readonly IHubContext _chatHub; + private readonly IUserIdentity _user; + private readonly IConversationStorage _storage; + private readonly BotSharpOptions _options; + + public ChatHubCrontabHook(IServiceProvider services, + IHubContext chatHub, + IUserIdentity user, + IConversationStorage storage, + BotSharpOptions options) + { + _services = services; + _chatHub = chatHub; + _user = user; + _storage = storage; + _options = options; + } + + public async Task OnCronTriggered(CrontabItem item) + { + var json = JsonSerializer.Serialize(new ChatResponseModel() + { + ConversationId = item.ConversationId, + MessageId = Guid.NewGuid().ToString(), + Text = item.ExecutionResult, + Function = "", + Sender = new UserViewModel() + { + FirstName = "Crontab", + LastName = "AI", + Role = AgentRole.Assistant + } + }, _options.JsonSerializerOptions); + + await _chatHub.Clients.User(item.UserId).SendAsync("OnNotificationGenerated", json); + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj index 84ecc1ee..dbd3228d 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj @@ -107,6 +107,7 @@ + diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs new file mode 100644 index 00000000..64629fcb --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs @@ -0,0 +1,47 @@ +using BotSharp.Core.Crontab.Abstraction; +using BotSharp.Core.Crontab.Models; +using Microsoft.EntityFrameworkCore.Query; + +namespace BotSharp.Plugin.SqlDriver.Hooks; + +public class SqlDriverCrontabHook : ICrontabHook +{ + private readonly IServiceProvider _services; + private readonly ILogger _logger; + public SqlDriverCrontabHook(IServiceProvider services, ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task OnCronTriggered(CrontabItem item) + { + if (item.Language != "sql") + { + return; + } + + _logger.LogWarning($"Crontab item triggered: {item.Topic}. Run {item.Language}: {item.Script}"); + + var conv = _services.GetRequiredService(); + conv.SetConversationId("73a9ee27-d597-4739-958f-3bd79760ac8e", []); + + var message = new RoleDialogModel(AgentRole.User, $"Run the query") + { + FunctionName = "sql_select", + FunctionArgs = JsonSerializer.Serialize(new SqlStatement + { + Statement = item.Script, + Reason = item.Description + }) + }; + var routing = _services.GetRequiredService(); + routing.Context.Push("ec46f15b-8790-400f-a37f-1e7995b7d6e2"); + await routing.InvokeFunction("sql_select", message); + + item.ConversationId = conv.ConversationId; + item.AgentId = BuiltInAgentId.SqlDriver; + item.UserId = "41021346"; + item.ExecutionResult = message.Content; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index cf4579d5..d6fe125b 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Planning; +using BotSharp.Core.Crontab.Abstraction; namespace BotSharp.Plugin.SqlDriver; @@ -29,5 +30,6 @@ public class SqlDriverPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json index 1ec4bfce..00d1e0b3 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json @@ -1,7 +1,7 @@ { "id": "beda4c12-e1ec-4b4b-b328-3df4a6687c4f", "name": "SQL Driver", - "description": "Transfer to this Agent is allowed only when executable SQL statements are provided in the context.", + "description": "Transfer to this Agent only when executable SQL statements are explicitly provided in the context.", "iconUrl": "https://cdn-icons-png.flaticon.com/512/3161/3161158.png", "type": "task", "createdDateTime": "2023-11-15T13:49:00Z", @@ -11,14 +11,14 @@ "profiles": [ "database" ], "llmConfig": { "provider": "openai", - "model": "gpt-4o" + "model": "gpt-4o-2024-11-20" }, "routingRules": [ { "field": "sql_statement", "required": true, "field_type": "string", - "description": "SQL statement provided in the context" + "description": "SQL statement explicitly provided in the context." } ] } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_select.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_select.json index bd5b88ce..f2aa4c36 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_select.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_select.json @@ -1,12 +1,12 @@ { "name": "sql_select", - "description": "Execute the reporting related query in the database and get the result", + "description": "Execute the provided query in the database and get the result.", "parameters": { "type": "object", "properties": { "sql_statement": { "type": "string", - "description": "SQL statement with SELECT" + "description": "SQL statement with SELECT provided in context." }, "reason": { "type": "string", From c24b6683f465b198491e69f7e911c42ee76d4d81 Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Thu, 5 Dec 2024 17:32:45 -0600 Subject: [PATCH 072/100] Test --- .../data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json | 2 +- .../instructions/instruction.liquid | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json index 91ee618c..1f91baca 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json @@ -1,7 +1,7 @@ { "id": "282a7128-69a1-44b0-878c-a9159b88f3b9", "name": "Planner", - "description": "Plan feasible implementation steps for complex user task request", + "description": "Plan feasible implementation steps for complex user task request, including generating sql query", "type": "task", "createdDateTime": "2023-08-27T10:39:00Z", "updatedDateTime": "2023-08-27T14:39:00Z", diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/instructions/instruction.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/instructions/instruction.liquid index 89bcd49b..00da3cd6 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/instructions/instruction.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/instructions/instruction.liquid @@ -15,6 +15,7 @@ Don't run the planning process repeatedly if you have already got the result of Function verify_dictionary_term CAN'T generate INSERT SQL Statement. The table name must come from the relevant knowledge. has_found_relevant_knowledge must be true. Do not introduce your actions or intentions in any way. +Only extract the Data related request, ignore the other request, such as schedule job, make phone call etc. {% if global_knowledges != empty -%} ===== From ddbed01cda81e6d6ea9dfd87870f1616e8e4817c Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Thu, 5 Dec 2024 18:09:33 -0600 Subject: [PATCH 073/100] fix naming of util-crontab-schedule_task --- .../BotSharp.Core.Crontab/Services/CrontabService.cs | 2 +- .../functions/util-crontab-schedule_task.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs index ea91fd5b..d09f9260 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs @@ -60,7 +60,7 @@ public class CrontabService : ICrontabService { var convService = _services.GetRequiredService(); var conv = await convService.GetConversation("73a9ee27-d597-4739-958f-3bd79760ac8e"); - if (!conv.States.ContainsKey("cron_expression")) + if (conv == null || !conv.States.ContainsKey("cron_expression")) { return []; } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json index eba05ef4..4f866ce1 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json @@ -1,5 +1,5 @@ { - "name": "schedule_task", + "name": "util-crontab-schedule_task", "description": "Set up a scheduled task", "parameters": { "type": "object", From 9bbea3bece958d7a8d0c00d6c85fbbc3366c57c5 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 6 Dec 2024 00:57:46 -0600 Subject: [PATCH 074/100] add common agent hook --- .../Agents/AgentHookBase.cs | 73 ---------------- .../BotSharp.Core/Agents/AgentPlugin.cs | 2 + .../Agents/Hooks/CommonAgentHook.cs | 83 +++++++++++++++++++ 3 files changed, 85 insertions(+), 73 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index 867d9d78..a3746ca8 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -1,10 +1,5 @@ using BotSharp.Abstraction.Agents.Settings; -using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Functions.Models; -using BotSharp.Abstraction.Repositories; -using BotSharp.Abstraction.Routing; -using Microsoft.Extensions.DependencyInjection; -using System.Data; namespace BotSharp.Abstraction.Agents; @@ -60,73 +55,5 @@ public abstract class AgentHookBase : IAgentHook public virtual void OnAgentUtilityLoaded(Agent agent) { - if (agent.Type == AgentType.Routing) return; - - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - if (!isConvMode) return; - - agent.Functions ??= []; - agent.Utilities ??= []; - - var (functions, templates) = GetUtilityContent(agent); - - foreach (var fn in functions) - { - if (!agent.Functions.Any(x => x.Name.Equals(fn.Name, StringComparison.OrdinalIgnoreCase))) - { - agent.Functions.Add(fn); - } - } - - foreach (var prompt in templates) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } - } - - private (IEnumerable, IEnumerable) GetUtilityContent(Agent agent) - { - var db = _services.GetRequiredService(); - var (functionNames, templateNames) = GetUniqueContent(agent.Utilities); - - if (agent.MergeUtility) - { - var routing = _services.GetRequiredService(); - var entryAgentId = routing.EntryAgentId; - if (!string.IsNullOrEmpty(entryAgentId)) - { - var entryAgent = db.GetAgent(entryAgentId); - var (fns, tps) = GetUniqueContent(entryAgent?.Utilities); - functionNames = functionNames.Concat(fns).Distinct().ToList(); - templateNames = templateNames.Concat(tps).Distinct().ToList(); - } - } - - var ua = db.GetAgent(BuiltInAgentId.UtilityAssistant); - var functions = ua?.Functions?.Where(x => functionNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.ToList() ?? []; - var templates = ua?.Templates?.Where(x => templateNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.Select(x => x.Content)?.ToList() ?? []; - return (functions, templates); - } - - private (IEnumerable, IEnumerable) GetUniqueContent(IEnumerable? utilities) - { - if (utilities.IsNullOrEmpty()) - { - return ([], []); - } - - var prefix = "util-"; - utilities = utilities?.Where(x => !string.IsNullOrEmpty(x.Name) && !x.Disabled)?.ToList() ?? []; - var functionNames = utilities.SelectMany(x => x.Functions) - .Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith(prefix)) - .Select(x => x.Name) - .Distinct().ToList(); - var templateNames = utilities.SelectMany(x => x.Templates) - .Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith(prefix)) - .Select(x => x.Name) - .Distinct().ToList(); - - return (functionNames, templateNames); } } diff --git a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs index cfbc541f..51b0da05 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs @@ -3,6 +3,7 @@ using BotSharp.Abstraction.Plugins.Models; using BotSharp.Abstraction.Settings; using BotSharp.Abstraction.Templating; using BotSharp.Abstraction.Users.Enums; +using BotSharp.Core.Agents.Hooks; using Microsoft.Extensions.Configuration; namespace BotSharp.Core.Agents; @@ -30,6 +31,7 @@ public class AgentPlugin : IBotSharpPlugin { services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(provider => { diff --git a/src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs b/src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs new file mode 100644 index 00000000..78420fad --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs @@ -0,0 +1,83 @@ +namespace BotSharp.Core.Agents.Hooks; + +public class CommonAgentHook : AgentHookBase +{ + public override string SelfId => string.Empty; + + public CommonAgentHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) + { + } + + public override void OnAgentUtilityLoaded(Agent agent) + { + if (agent.Type == AgentType.Routing) return; + + var conv = _services.GetRequiredService(); + var isConvMode = conv.IsConversationMode(); + if (!isConvMode) return; + + agent.Functions ??= []; + agent.Utilities ??= []; + + var (functions, templates) = GetUtilityContent(agent); + + foreach (var fn in functions) + { + if (!agent.Functions.Any(x => x.Name.Equals(fn.Name, StringComparison.OrdinalIgnoreCase))) + { + agent.Functions.Add(fn); + } + } + + foreach (var prompt in templates) + { + agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; + } + } + + private (IEnumerable, IEnumerable) GetUtilityContent(Agent agent) + { + var db = _services.GetRequiredService(); + var (functionNames, templateNames) = GetUniqueContent(agent.Utilities); + + if (agent.MergeUtility) + { + var routing = _services.GetRequiredService(); + var entryAgentId = routing.EntryAgentId; + if (!string.IsNullOrEmpty(entryAgentId)) + { + var entryAgent = db.GetAgent(entryAgentId); + var (fns, tps) = GetUniqueContent(entryAgent?.Utilities); + functionNames = functionNames.Concat(fns).Distinct().ToList(); + templateNames = templateNames.Concat(tps).Distinct().ToList(); + } + } + + var ua = db.GetAgent(BuiltInAgentId.UtilityAssistant); + var functions = ua?.Functions?.Where(x => functionNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.ToList() ?? []; + var templates = ua?.Templates?.Where(x => templateNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))?.Select(x => x.Content)?.ToList() ?? []; + return (functions, templates); + } + + private (IEnumerable, IEnumerable) GetUniqueContent(IEnumerable? utilities) + { + if (utilities.IsNullOrEmpty()) + { + return ([], []); + } + + var prefix = "util-"; + utilities = utilities?.Where(x => !string.IsNullOrEmpty(x.Name) && !x.Disabled)?.ToList() ?? []; + var functionNames = utilities.SelectMany(x => x.Functions) + .Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith(prefix)) + .Select(x => x.Name) + .Distinct().ToList(); + var templateNames = utilities.SelectMany(x => x.Templates) + .Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith(prefix)) + .Select(x => x.Name) + .Distinct().ToList(); + + return (functionNames, templateNames); + } +} From e1e56b596af5ebb557ef49cb79bf4c2105f52f5c Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 6 Dec 2024 01:27:57 -0600 Subject: [PATCH 075/100] rename --- .../Agents/Models/AgentUtility.cs | 5 +++++ .../BotSharp.Core/Agents/AgentPlugin.cs | 2 +- .../{CommonAgentHook.cs => BasicAgentHook.cs} | 4 ++-- .../Routing/RoutingService.InstructLoop.cs | 20 +++++++++---------- 4 files changed, 17 insertions(+), 14 deletions(-) rename src/Infrastructure/BotSharp.Core/Agents/Hooks/{CommonAgentHook.cs => BasicAgentHook.cs} (96%) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs index 40828944..ce39c568 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentUtility.cs @@ -21,6 +21,11 @@ public class AgentUtility Functions = functions ?? []; Templates = templates ?? []; } + + public override string ToString() + { + return Name; + } } diff --git a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs index 51b0da05..b21772a1 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/AgentPlugin.cs @@ -31,7 +31,7 @@ public class AgentPlugin : IBotSharpPlugin { services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(provider => { diff --git a/src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs b/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs similarity index 96% rename from src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs rename to src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs index 78420fad..2a4a7374 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Hooks/CommonAgentHook.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs @@ -1,10 +1,10 @@ namespace BotSharp.Core.Agents.Hooks; -public class CommonAgentHook : AgentHookBase +public class BasicAgentHook : AgentHookBase { public override string SelfId => string.Empty; - public CommonAgentHook(IServiceProvider services, AgentSettings settings) + public BasicAgentHook(IServiceProvider services, AgentSettings settings) : base(services, settings) { } diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs index c3e1a8f4..18f330a3 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs @@ -2,7 +2,6 @@ using BotSharp.Abstraction.Infrastructures.Enums; using BotSharp.Abstraction.Planning; using BotSharp.Abstraction.Routing.Enums; using BotSharp.Abstraction.Routing.Reasoning; -using BotSharp.Core.Routing.Reasoning; namespace BotSharp.Core.Routing; @@ -21,7 +20,7 @@ public partial class RoutingService var states = _services.GetRequiredService(); var executor = _services.GetRequiredService(); - var planner = GetReasoner(_router); + var reasoner = GetReasoner(_router); _context.Push(_router.Id); @@ -46,7 +45,7 @@ public partial class RoutingService // Get first instruction _router.TemplateDict["conversation"] = await GetConversationContent(dialogs); - var inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs); + var inst = await reasoner.GetNextInstruction(_router, message.MessageId, dialogs); int loopCount = 1; while (true) @@ -63,30 +62,30 @@ public partial class RoutingService #else _logger.LogInformation($"*** Next Instruction *** {inst}"); #endif - await planner.AgentExecuting(_router, inst, message, dialogs); + await reasoner.AgentExecuting(_router, inst, message, dialogs); // Handover to Task Agent if (inst.HandleDialogsByPlanner) { - var dialogWithoutContext = planner.BeforeHandleContext(inst, message, dialogs); + var dialogWithoutContext = reasoner.BeforeHandleContext(inst, message, dialogs); response = await executor.Execute(this, inst, message, dialogWithoutContext); - planner.AfterHandleContext(dialogs, dialogWithoutContext); + reasoner.AfterHandleContext(dialogs, dialogWithoutContext); } else { response = await executor.Execute(this, inst, message, dialogs); } - await planner.AgentExecuted(_router, inst, response, dialogs); + await reasoner.AgentExecuted(_router, inst, response, dialogs); - if (loopCount >= planner.MaxLoopCount || _context.IsEmpty) + if (loopCount >= reasoner.MaxLoopCount || _context.IsEmpty) { break; } // Get next instruction from Planner _router.TemplateDict["conversation"] = await GetConversationContent(dialogs); - inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs); + inst = await reasoner.GetNextInstruction(_router, message.MessageId, dialogs); loopCount++; } @@ -103,8 +102,7 @@ public partial class RoutingService return _services.GetServices().First(x => x.Name == "Naive Reasoner"); } - var reasoner = _services.GetServices(). - FirstOrDefault(x => x.GetType().Name.EndsWith(rule.Field)); + var reasoner = _services.GetServices().FirstOrDefault(x => x.GetType().Name.EndsWith(rule.Field)); if (reasoner == null) { From 6d1f1b75545c0bc04f6b1797c390f628dd2cc8d9 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Fri, 6 Dec 2024 09:49:34 -0600 Subject: [PATCH 076/100] fix util-crontab name --- .../BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs | 3 ++- .../BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs index cb4986b0..70d3b410 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs @@ -1,11 +1,12 @@ using BotSharp.Abstraction.Routing; using BotSharp.Abstraction.Users; +using BotSharp.Core.Crontab.Hooks; namespace BotSharp.Core.Crontab.Functions; public class ScheduleTaskFn : IFunctionCallback { - public string Name => "schedule_task"; + public string Name => $"{CrontabUtilityHook.PREFIX}schedule_task"; private readonly IServiceProvider _services; public ScheduleTaskFn(IServiceProvider services) diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs b/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs index 1a71849e..ed150861 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Hooks/CrontabUtilityHook.cs @@ -5,7 +5,7 @@ namespace BotSharp.Core.Crontab.Hooks; public class CrontabUtilityHook : IAgentUtilityHook { - private const string PREFIX = "util-crontab-"; + public const string PREFIX = "util-crontab-"; private const string SCHEDULE_TASK_FN = $"{PREFIX}schedule_task"; public void AddUtilities(List utilities) From ba855bc7cc2706457777c2b9d12eae96e6f073fa Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Sat, 7 Dec 2024 13:47:17 -0800 Subject: [PATCH 077/100] introduce ConversationHookProvider to avoid ordering conversartion hooks in runtime --- .../Conversations/ConversationHookProvider.cs | 20 +++++++++++++++++++ .../ConversationService.TruncateMessage.cs | 2 +- .../ConversationService.UpdateBreakpoint.cs | 6 +++--- .../Services/ConversationService.cs | 3 ++- .../Functions/HumanInterventionNeededFn.cs | 6 +++--- .../Routing/RoutingService.InvokeFunction.cs | 6 +++--- .../BotSharp.Plugin.ChatHub/ChatHubPlugin.cs | 1 + 7 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookProvider.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookProvider.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookProvider.cs new file mode 100644 index 00000000..00393da4 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookProvider.cs @@ -0,0 +1,20 @@ +namespace BotSharp.Abstraction.Conversations; + +public class ConversationHookProvider +{ + public IEnumerable Hooks { get; } + + private readonly Lazy> _hooksOrderByPriority; + + public IEnumerable HooksOrderByPriority + => _hooksOrderByPriority.Value; + + public ConversationHookProvider(IEnumerable conversationHooks) + { + Hooks = conversationHooks; + _hooksOrderByPriority = new Lazy>(() => + { + return conversationHooks.OrderBy(hook => hook.Priority).ToArray(); + }); + } +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.TruncateMessage.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.TruncateMessage.cs index ccc074e8..1a75d717 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.TruncateMessage.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.TruncateMessage.cs @@ -9,7 +9,7 @@ public partial class ConversationService : IConversationService var deleteMessageIds = db.TruncateConversation(conversationId, messageId, cleanLog: true); fileStorage.DeleteMessageFiles(conversationId, deleteMessageIds, messageId, newMessageId); - var hooks = _services.GetServices().ToList(); + var hooks = _services.GetServices(); foreach (var hook in hooks) { await hook.OnMessageDeleted(conversationId, messageId); diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs index 8f88f44f..75a0bbfb 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs @@ -31,9 +31,9 @@ public partial class ConversationService : IConversationService states.CleanStates(excludedStates); } - var hooks = _services.GetServices() - .OrderBy(x => x.Priority) - .ToList(); + var hooks = _services + .GetRequiredService() + .HooksOrderByPriority; // Before executing functions foreach (var hook in hooks) diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index 55d80c18..03ff8aa4 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -103,7 +103,8 @@ public partial class ConversationService : IConversationService db.CreateNewConversation(record); - var hooks = _services.GetServices().ToList(); + var hooks = _services.GetServices(); + foreach (var hook in hooks) { // If user connect agent first time diff --git a/src/Infrastructure/BotSharp.Core/Routing/Functions/HumanInterventionNeededFn.cs b/src/Infrastructure/BotSharp.Core/Routing/Functions/HumanInterventionNeededFn.cs index d0c26be0..719dd805 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Functions/HumanInterventionNeededFn.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Functions/HumanInterventionNeededFn.cs @@ -15,9 +15,9 @@ public class HumanInterventionNeededFn : IFunctionCallback public async Task Execute(RoleDialogModel message) { - var hooks = _services.GetServices() - .OrderBy(x => x.Priority) - .ToList(); + var hooks = _services + .GetRequiredService() + .HooksOrderByPriority; foreach (var hook in hooks) { diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeFunction.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeFunction.cs index 64b96136..fb074dfc 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeFunction.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeFunction.cs @@ -18,9 +18,9 @@ public partial class RoutingService var clonedMessage = RoleDialogModel.From(message); clonedMessage.FunctionName = name; - var hooks = _services.GetServices() - .OrderBy(x => x.Priority) - .ToList(); + var hooks = _services + .GetRequiredService() + .HooksOrderByPriority; var progressService = _services.GetService(); diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs b/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs index 1eaad66d..e7cf082f 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/ChatHubPlugin.cs @@ -22,6 +22,7 @@ public class ChatHubPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); From 4fa714ff874c35a80e1c12a9515ac8634d7b4b2c Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Sun, 8 Dec 2024 18:29:04 -0600 Subject: [PATCH 078/100] add crontab storage --- BotSharp.sln | 11 +++ .../BotSharp.Abstraction.csproj | 2 +- .../Crontab}/Models/CrontabItem.cs | 15 ++- .../Crontab/Models/CrontabItemFilter.cs | 26 +++++ .../Crontab}/Models/ScheduleTaskArgs.cs | 4 +- .../Repositories/IBotSharpRepository.cs | 5 + .../BotSharp.Abstraction/Using.cs | 3 +- .../Abstraction/ICrontabHook.cs | 2 - .../Abstraction/ICrontabService.cs | 2 - .../BotSharp.Core.Crontab.csproj | 5 +- .../Services/CrontabService.cs | 1 - .../BotSharp.Core.Crontab/Using.cs | 4 +- .../FileRepository/FileRepository.Crontab.cs | 96 +++++++++++++++++++ .../FileRepository/FileRepository.cs | 4 +- src/Infrastructure/BotSharp.Core/Using.cs | 2 +- .../Hooks/ChatHubCrontabHook.cs | 2 +- .../Collections/CrontabItemDocument.cs | 53 ++++++++++ .../MongoDbContext.cs | 3 + .../Repository/MongoRepository.Crontab.cs | 73 ++++++++++++++ .../Hooks/SqlDriverCrontabHook.cs | 3 +- src/WebStarter/WebStarter.csproj | 3 +- src/WebStarter/appsettings.json | 1 + 22 files changed, 300 insertions(+), 20 deletions(-) rename src/Infrastructure/{BotSharp.Core.Crontab => BotSharp.Abstraction/Crontab}/Models/CrontabItem.cs (51%) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs rename src/Infrastructure/{BotSharp.Core.Crontab => BotSharp.Abstraction/Crontab}/Models/ScheduleTaskArgs.cs (85%) create mode 100644 src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs create mode 100644 src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs create mode 100644 src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs diff --git a/BotSharp.sln b/BotSharp.sln index 52b3f9d0..5baf8d10 100644 --- a/BotSharp.sln +++ b/BotSharp.sln @@ -121,6 +121,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Core.SideCar", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.VertexAI", "src\Plugins\BotSharp.Plugin.LangChain\BotSharp.Plugin.VertexAI.csproj", "{7DA2DCD0-551B-432E-AA5C-22DDD3ED459B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Core.Crontab", "src\Infrastructure\BotSharp.Core.Crontab\BotSharp.Core.Crontab.csproj", "{F812BAAE-5A7D-4DF7-8E71-70696B51C61F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -489,6 +491,14 @@ Global {7DA2DCD0-551B-432E-AA5C-22DDD3ED459B}.Release|Any CPU.Build.0 = Release|Any CPU {7DA2DCD0-551B-432E-AA5C-22DDD3ED459B}.Release|x64.ActiveCfg = Release|Any CPU {7DA2DCD0-551B-432E-AA5C-22DDD3ED459B}.Release|x64.Build.0 = Release|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Debug|x64.ActiveCfg = Debug|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Debug|x64.Build.0 = Debug|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Release|Any CPU.Build.0 = Release|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Release|x64.ActiveCfg = Release|Any CPU + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -547,6 +557,7 @@ Global {F57F4862-F8D4-44A1-AC12-5C131B5C9785} = {51AFE054-AE99-497D-A593-69BAEFB5106F} {6D3A54F9-4792-41DB-BE7D-4F7B1D918EAE} = {E29DC6C4-5E57-48C5-BCB0-6B8F84782749} {7DA2DCD0-551B-432E-AA5C-22DDD3ED459B} = {D5293208-2BEF-42FC-A64C-5954F61720BA} + {F812BAAE-5A7D-4DF7-8E71-70696B51C61F} = {E29DC6C4-5E57-48C5-BCB0-6B8F84782749} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19} diff --git a/src/Infrastructure/BotSharp.Abstraction/BotSharp.Abstraction.csproj b/src/Infrastructure/BotSharp.Abstraction/BotSharp.Abstraction.csproj index 5be126b8..9b31ae6f 100644 --- a/src/Infrastructure/BotSharp.Abstraction/BotSharp.Abstraction.csproj +++ b/src/Infrastructure/BotSharp.Abstraction/BotSharp.Abstraction.csproj @@ -1,4 +1,4 @@ - + $(TargetFramework) diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs similarity index 51% rename from src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs rename to src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs index c3fab2e8..6d4eee5a 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Models/CrontabItem.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs @@ -1,12 +1,25 @@ -namespace BotSharp.Core.Crontab.Models; +namespace BotSharp.Abstraction.Crontab.Models; public class CrontabItem : ScheduleTaskArgs { + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("user_id")] public string UserId { get; set; } = null!; + + [JsonPropertyName("agent_id")] public string AgentId { get; set; } = null!; + + [JsonPropertyName("conversation_id")] public string ConversationId { get; set; } = null!; + + [JsonPropertyName("execution_result")] public string ExecutionResult { get; set; } = null!; + [JsonPropertyName("created_time")] + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; + public override string ToString() { return $"{Topic}: {Description} [AgentId: {AgentId}, UserId: {UserId}]"; diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs new file mode 100644 index 00000000..f273b7d1 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs @@ -0,0 +1,26 @@ +namespace BotSharp.Abstraction.Crontab.Models; + +public class CrontabItemFilter : Pagination +{ + [JsonPropertyName("user_ids")] + public IEnumerable? UserIds { get; set; } + + [JsonPropertyName("agent_ids")] + public IEnumerable? AgentIds { get; set; } + + [JsonPropertyName("conversation_ids")] + public IEnumerable? ConversationIds { get; set; } + + [JsonPropertyName("topics")] + public IEnumerable? Topics { get; set; } + + public CrontabItemFilter() + { + + } + + public static CrontabItemFilter Empty() + { + return new CrontabItemFilter(); + } +} diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs similarity index 85% rename from src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs rename to src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs index af1bb23f..b0a02bbd 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Models/ScheduleTaskArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs @@ -1,6 +1,4 @@ -using System.Text.Json.Serialization; - -namespace BotSharp.Core.Crontab.Models; +namespace BotSharp.Abstraction.Crontab.Models; public class ScheduleTaskArgs { diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 037e0037..be8a970e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -145,4 +145,9 @@ public interface IBotSharpRepository : IHaveServiceProvider bool DeleteKnolwedgeBaseFileMeta(string collectionName, string vectorStoreProvider, Guid? fileId = null); PagedItems GetKnowledgeBaseFileMeta(string collectionName, string vectorStoreProvider, KnowledgeFileFilter filter); #endregion + + #region Crontab + bool InsertCrontabItem(CrontabItem item) => throw new NotImplementedException(); + PagedItems GetCrontabItems(CrontabItemFilter filter) => throw new NotImplementedException(); + #endregion } diff --git a/src/Infrastructure/BotSharp.Abstraction/Using.cs b/src/Infrastructure/BotSharp.Abstraction/Using.cs index 9f35c1c8..592803c2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Using.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Using.cs @@ -17,4 +17,5 @@ global using BotSharp.Abstraction.Translation.Attributes; global using BotSharp.Abstraction.Messaging.Enums; global using BotSharp.Abstraction.Files.Models; global using BotSharp.Abstraction.Files.Enums; -global using BotSharp.Abstraction.Knowledges.Models; \ No newline at end of file +global using BotSharp.Abstraction.Knowledges.Models; +global using BotSharp.Abstraction.Crontab.Models; \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs index 49ffe54c..1738ef5e 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabHook.cs @@ -1,5 +1,3 @@ -using BotSharp.Core.Crontab.Models; - namespace BotSharp.Core.Crontab.Abstraction; public interface ICrontabHook diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs index 6a18018d..39c13779 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Abstraction/ICrontabService.cs @@ -1,5 +1,3 @@ -using BotSharp.Core.Crontab.Models; - namespace BotSharp.Core.Crontab.Abstraction; public interface ICrontabService diff --git a/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj b/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj index 0740b6fa..cc072fe6 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj +++ b/src/Infrastructure/BotSharp.Core.Crontab/BotSharp.Core.Crontab.csproj @@ -21,7 +21,6 @@ - @@ -29,4 +28,8 @@ + + + + diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs index d09f9260..0c6981e7 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs @@ -17,7 +17,6 @@ using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Routing; -using BotSharp.Core.Crontab.Models; using BotSharp.Core.Infrastructures; diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Using.cs b/src/Infrastructure/BotSharp.Core.Crontab/Using.cs index 42563238..0420faf7 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Using.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Using.cs @@ -4,10 +4,10 @@ global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; global using BotSharp.Abstraction.Agents.Enums; +global using BotSharp.Abstraction.Crontab.Models; global using BotSharp.Abstraction.Agents; global using BotSharp.Abstraction.Plugins; global using BotSharp.Abstraction.Conversations.Models; global using BotSharp.Abstraction.Functions; global using BotSharp.Core.Crontab.Services; -global using BotSharp.Core.Crontab.Abstraction; -global using BotSharp.Core.Crontab.Models; +global using BotSharp.Core.Crontab.Abstraction; \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs new file mode 100644 index 00000000..964ac5ba --- /dev/null +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs @@ -0,0 +1,96 @@ +using System.IO; + +namespace BotSharp.Core.Repository; + +public partial class FileRepository +{ + public bool InsertCrontabItem(CrontabItem item) + { + if (item == null) + { + return false; + } + + try + { + var baseDir = Path.Combine(_dbSettings.FileRepository, CRONTAB_FOLDER); + item.Id = Guid.NewGuid().ToString(); + var dir = Path.Combine(baseDir, item.Id); + + if (Directory.Exists(dir)) + { + return false; + } + + Directory.CreateDirectory(dir); + Thread.Sleep(50); + + var itemFile = Path.Combine(dir, CRONTAB_FILE); + var json = JsonSerializer.Serialize(item, _options); + File.WriteAllText(itemFile, json); + return true; + } + catch (Exception ex) + { + _logger.LogError($"Error when saving crontab item: {ex.Message}\r\n{ex.InnerException}"); + return false; + } + } + + + public PagedItems GetCrontabItems(CrontabItemFilter filter) + { + + if (filter == null) + { + filter = CrontabItemFilter.Empty(); + } + + var records = new List(); + var dir = Path.Combine(_dbSettings.FileRepository, CRONTAB_FOLDER); + + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + var totalDirs = Directory.GetDirectories(dir); + foreach (var d in totalDirs) + { + var file = Path.Combine(d, CRONTAB_FILE); + if (!File.Exists(file)) continue; + + var json = File.ReadAllText(file); + var record = JsonSerializer.Deserialize(json, _options); + if (record == null) continue; + + var matched = true; + if (filter?.AgentIds != null) + { + matched = matched && filter.AgentIds.Contains(record.AgentId); + } + if (filter?.ConversationIds != null) + { + matched = matched && filter.ConversationIds.Contains(record.ConversationId); + } + if (filter?.UserIds != null) + { + matched = matched && filter.UserIds.Contains(record.UserId); + } + if (filter?.Topics != null) + { + matched = matched && filter.Topics.Contains(record.Topic); + } + + if (!matched) continue; + + records.Add(record); + } + + return new PagedItems + { + Items = records.OrderByDescending(x => x.CreatedTime).Skip(filter.Offset).Take(filter.Size), + Count = records.Count(), + }; + } +} diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs index 57fbcb91..cf5852a4 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs @@ -55,6 +55,9 @@ public partial class FileRepository : IBotSharpRepository private const string PLUGIN_CONFIG_FILE = "config.json"; private const string STATS_FILE = "stats.json"; + private const string CRONTAB_FOLDER = "crontabs"; + private const string CRONTAB_FILE = "crontab.json"; + public FileRepository( IServiceProvider services, BotSharpDatabaseSettings dbSettings, @@ -88,7 +91,6 @@ public partial class FileRepository : IBotSharpRepository private List _agents = new List(); private List _roleAgents = new List(); private List _userAgents = new List(); - private List _conversations = new List(); private PluginConfig? _pluginConfig = null; private IQueryable Roles diff --git a/src/Infrastructure/BotSharp.Core/Using.cs b/src/Infrastructure/BotSharp.Core/Using.cs index f68cba9b..4a74f1d0 100644 --- a/src/Infrastructure/BotSharp.Core/Using.cs +++ b/src/Infrastructure/BotSharp.Core/Using.cs @@ -14,7 +14,7 @@ global using BotSharp.Abstraction.Routing; global using BotSharp.Abstraction.Plugins; global using BotSharp.Abstraction.Agents; global using BotSharp.Abstraction.Conversations; -global using BotSharp.Abstraction.Knowledges; +global using BotSharp.Abstraction.Crontab.Models; global using BotSharp.Abstraction.Users; global using BotSharp.Abstraction.Roles; global using BotSharp.Abstraction.Roles.Models; diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs index 4b475e73..4f7ef3d2 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubCrontabHook.cs @@ -1,5 +1,5 @@ +using BotSharp.Abstraction.Crontab.Models; using BotSharp.Core.Crontab.Abstraction; -using BotSharp.Core.Crontab.Models; using Microsoft.AspNetCore.SignalR; namespace BotSharp.Plugin.ChatHub.Hooks; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs new file mode 100644 index 00000000..ae85f639 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs @@ -0,0 +1,53 @@ +using BotSharp.Abstraction.Crontab.Models; + +namespace BotSharp.Plugin.MongoStorage.Collections; + +public class CrontabItemDocument : MongoBase +{ + public string UserId { get; set; } + public string AgentId { get; set; } + public string ConversationId { get; set; } + public string ExecutionResult { get; set; } + public string Cron { get; set; } + public string Topic { get; set; } + public string Description { get; set; } + public string Script { get; set; } + public string Language { get; set; } + public DateTime CreatedTime { get; set; } = DateTime.UtcNow; + + public static CrontabItem ToDomainModel(CrontabItemDocument item) + { + return new CrontabItem + { + Id = item.Id, + UserId = item.UserId, + AgentId = item.AgentId, + ConversationId = item.ConversationId, + ExecutionResult = item.ExecutionResult, + Cron = item.Cron, + Topic = item.Topic, + Description = item.Description, + Script = item.Script, + Language = item.Language, + CreatedTime = item.CreatedTime + }; + } + + public static CrontabItemDocument ToMongoModel(CrontabItem item) + { + return new CrontabItemDocument + { + Id = item.Id, + UserId = item.UserId, + AgentId = item.AgentId, + ConversationId = item.ConversationId, + ExecutionResult = item.ExecutionResult, + Cron = item.Cron, + Topic = item.Topic, + Description = item.Description, + Script = item.Script, + Language = item.Language, + CreatedTime = item.CreatedTime + }; + } +} diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs index b91c35fe..89eb18ad 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs @@ -165,4 +165,7 @@ public class MongoDbContext public IMongoCollection RoleAgents => Database.GetCollection($"{_collectionPrefix}_RoleAgents"); + + public IMongoCollection CrontabItems + => Database.GetCollection($"{_collectionPrefix}_CronTabItems"); } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs new file mode 100644 index 00000000..aa645a84 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs @@ -0,0 +1,73 @@ +using BotSharp.Abstraction.Crontab.Models; +using Microsoft.Extensions.Logging; + +namespace BotSharp.Plugin.MongoStorage.Repository; + +public partial class MongoRepository +{ + public bool InsertCrontabItem(CrontabItem item) + { + if (item == null) + { + return false; + } + + try + { + item.Id = Guid.NewGuid().ToString(); + var cronDoc = CrontabItemDocument.ToMongoModel(item); + _dc.CrontabItems.InsertOne(cronDoc); + return true; + } + catch (Exception ex) + { + _logger.LogError($"Error when saving crontab item: {ex.Message}\r\n{ex.InnerException}"); + return false; + } + } + + + public PagedItems GetCrontabItems(CrontabItemFilter filter) + { + if (filter == null) + { + filter = CrontabItemFilter.Empty(); + } + + var cronBuilder = Builders.Filter; + var cronFilters = new List>() { cronBuilder.Empty }; + + // Filter conversations + if (filter?.AgentIds != null) + { + cronFilters.Add(cronBuilder.In(x => x.AgentId, filter.AgentIds)); + } + if (filter?.ConversationIds != null) + { + cronFilters.Add(cronBuilder.In(x => x.ConversationId, filter.ConversationIds)); + } + if (filter?.Topics != null) + { + cronFilters.Add(cronBuilder.In(x => x.Topic, filter.Topics)); + } + if (filter?.UserIds != null) + { + cronFilters.Add(cronBuilder.In(x => x.UserId, filter.UserIds)); + } + + // Sort and paginate + var filterDef = cronBuilder.And(cronFilters); + var sortDef = Builders.Sort.Descending(x => x.CreatedTime); + + var cronDocs = _dc.CrontabItems.Find(filterDef).Sort(sortDef).Skip(filter.Offset).Limit(filter.Size).ToList(); + var count = _dc.CrontabItems.CountDocuments(filterDef); + + var crontabItems = cronDocs.Select(x => CrontabItemDocument.ToDomainModel(x)).ToList(); + + return new PagedItems + { + Items = crontabItems, + Count = (int)count + }; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs index 64629fcb..88133881 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs @@ -1,6 +1,5 @@ +using BotSharp.Abstraction.Crontab.Models; using BotSharp.Core.Crontab.Abstraction; -using BotSharp.Core.Crontab.Models; -using Microsoft.EntityFrameworkCore.Query; namespace BotSharp.Plugin.SqlDriver.Hooks; diff --git a/src/WebStarter/WebStarter.csproj b/src/WebStarter/WebStarter.csproj index a8f819d6..cb107490 100644 --- a/src/WebStarter/WebStarter.csproj +++ b/src/WebStarter/WebStarter.csproj @@ -1,4 +1,4 @@ - + $(TargetFramework) @@ -29,6 +29,7 @@ + diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 8c4cd9aa..c3d4bdd5 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -328,6 +328,7 @@ "Assemblies": [ "BotSharp.Core", "BotSharp.Core.SideCar", + "BotSharp.Core.Crontab", "BotSharp.Logger", "BotSharp.Plugin.MongoStorage", "BotSharp.Plugin.Dashboard", From 774cbd9b77bf662c2bea5bf4b5e994a2de380edc Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 10 Dec 2024 12:30:41 -0600 Subject: [PATCH 079/100] Support multi-planner. --- .../Agents/Enums/AgentType.cs | 2 +- .../Agents/Enums/BuiltInAgentId.cs | 5 --- .../Crontab/Models/CrontabItem.cs | 2 +- .../Crontab/Models/CrontabItemFilter.cs | 4 +- .../Crontab/Models/ScheduleTaskArgs.cs | 13 +++++- .../Planning/ITaskPlanner.cs | 1 + .../Routing/Models/RoutableAgent.cs | 3 ++ .../Functions/ScheduleTaskFn.cs | 11 +++-- .../Services/CrontabService.cs | 44 ++----------------- .../functions/util-crontab-schedule_task.json | 37 +++++++++++----- .../FileRepository/FileRepository.Crontab.cs | 5 ++- .../Routing/Hooks/RoutingAgentHook.cs | 9 +++- .../Routing/Reasoning/HFReasoner.cs | 1 + .../Reasoning/OneStepForwardReasoner.cs | 2 +- .../BotSharp.Core/Routing/RoutingPlugin.cs | 3 +- .../Routing/RoutingService.InstructLoop.cs | 2 +- .../BotSharp.Core/Routing/RoutingService.cs | 11 +++-- .../agent.json | 6 ++- .../Collections/CrontabItemDocument.cs | 12 ++--- .../Repository/MongoRepository.Crontab.cs | 4 +- .../BotSharp.Plugin.Planner.csproj | 8 ++++ .../Enums/PlannerAgentId.cs | 9 ++++ .../Functions/PrimaryStagePlanFn.cs | 6 +-- .../Functions/SecondaryStagePlanFn.cs | 4 +- .../Functions/SummaryPlanFn.cs | 9 ++-- .../Hooks/PlannerAgentHook.cs | 4 +- .../BotSharp.Plugin.Planner/PlannerPlugin.cs | 9 +++- .../Sequential/SequentialPlanner.cs} | 23 +++++----- .../TwoStaging/TwoStageTaskPlanner.cs | 39 ++++++++++++---- src/Plugins/BotSharp.Plugin.Planner/Using.cs | 14 +++--- .../agent.json | 8 ++-- .../templates/two_stage.1st.plan.liquid | 3 +- .../agent.json | 19 ++++++++ .../instructions/instruction.liquid | 15 +++++++ .../Hooks/SqlDriverAgentHook.cs | 2 +- .../Hooks/SqlDriverCrontabHook.cs | 18 +++++--- 36 files changed, 221 insertions(+), 146 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs rename src/{Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs => Plugins/BotSharp.Plugin.Planner/Sequential/SequentialPlanner.cs} (91%) create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/instructions/instruction.liquid diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentType.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentType.cs index 53d64a07..455e87ff 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentType.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentType.cs @@ -10,7 +10,7 @@ public class AgentType /// /// Planning agent /// - public const string Planning = "plan"; + public const string Planning = "planning"; public const string Evaluating = "evaluation"; diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs index f2f64b6b..ecdda1c7 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/BuiltInAgentId.cs @@ -32,11 +32,6 @@ public class BuiltInAgentId /// public const string Learner = "01acc3e5-0af7-49e6-ad7a-a760bd12dc40"; - /// - /// Plan feasible implementation steps for complex problems - /// - public const string Planner = "282a7128-69a1-44b0-878c-a9159b88f3b9"; - /// /// SQL statement generation /// diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs index 6d4eee5a..4c50fafc 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs @@ -22,6 +22,6 @@ public class CrontabItem : ScheduleTaskArgs public override string ToString() { - return $"{Topic}: {Description} [AgentId: {AgentId}, UserId: {UserId}]"; + return $"{Title}: {Description} [AgentId: {AgentId}, UserId: {UserId}]"; } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs index f273b7d1..71c82e05 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs @@ -11,8 +11,8 @@ public class CrontabItemFilter : Pagination [JsonPropertyName("conversation_ids")] public IEnumerable? ConversationIds { get; set; } - [JsonPropertyName("topics")] - public IEnumerable? Topics { get; set; } + [JsonPropertyName("titles")] + public IEnumerable? Titles { get; set; } public CrontabItemFilter() { diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs index b0a02bbd..b40819ec 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs @@ -5,12 +5,21 @@ public class ScheduleTaskArgs [JsonPropertyName("cron_expression")] public string Cron { get; set; } = null!; - [JsonPropertyName("topic")] - public string Topic { get; set; } = null!; + [JsonPropertyName("title")] + public string Title { get; set; } = null!; [JsonPropertyName("description")] public string Description { get; set; } = null!; + [JsonPropertyName("to_do_list")] + public ScheduleTaskItemArgs[] Tasks { get; set; } = null!; +} + +public class ScheduleTaskItemArgs +{ + [JsonPropertyName("topic")] + public string Topic { get; set; } = null!; + [JsonPropertyName("script")] public string Script { get; set; } = null!; diff --git a/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs b/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs index 67f30fb1..2bd8da83 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Planning/ITaskPlanner.cs @@ -8,6 +8,7 @@ namespace BotSharp.Abstraction.Planning; /// public interface ITaskPlanner { + string Name => "Unamed Task Planner"; Task GetNextInstruction(Agent router, string messageId, List dialogs); Task AgentExecuting(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs); Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs); diff --git a/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutableAgent.cs b/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutableAgent.cs index 14fd6826..861f3f2f 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutableAgent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Routing/Models/RoutableAgent.cs @@ -13,6 +13,9 @@ public class RoutableAgent [JsonPropertyName("description")] public string Description { get; set; } = string.Empty; + [JsonPropertyName("type")] + public string Type { get; set; } = AgentType.Task; + [JsonPropertyName("profiles")] public List Profiles { get; set; } = new List(); diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs index 70d3b410..aee47f95 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Repositories; using BotSharp.Abstraction.Routing; using BotSharp.Abstraction.Users; using BotSharp.Core.Crontab.Hooks; @@ -22,16 +23,18 @@ public class ScheduleTaskFn : IFunctionCallback var user = _services.GetRequiredService(); var crontabItem = new CrontabItem { - Topic = args.Topic, + Title = args.Title, Description = args.Description, Cron = args.Cron, - Script = args.Script, - Language = args.Language, UserId = user.Id, AgentId = routing.EntryAgentId, - ConversationId = routing.ConversationId + ConversationId = routing.ConversationId, + Tasks = args.Tasks, }; + var db = _services.GetRequiredService(); + // var ret = db.InsertCrontabItem(crontabItem); + return true; } } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs index 0c6981e7..e5e68cc0 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs @@ -14,28 +14,7 @@ limitations under the License. ******************************************************************************/ -using BotSharp.Abstraction.Agents.Enums; -using BotSharp.Abstraction.Conversations; -using BotSharp.Abstraction.Routing; -using BotSharp.Core.Infrastructures; - - -/***************************************************************************** - Copyright 2024 Written by Haiping Chen. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -******************************************************************************/ - +using BotSharp.Abstraction.Repositories; using Microsoft.Extensions.Logging; namespace BotSharp.Core.Crontab.Services; @@ -57,24 +36,9 @@ public class CrontabService : ICrontabService public async Task> GetCrontable() { - var convService = _services.GetRequiredService(); - var conv = await convService.GetConversation("73a9ee27-d597-4739-958f-3bd79760ac8e"); - if (conv == null || !conv.States.ContainsKey("cron_expression")) - { - return []; - } - - return - [ - new CrontabItem - { - Topic = conv.States["topic"], - Cron = conv.States["cron_expression"], - Description = conv.States["description"], - Script = conv.States["script"], - Language = conv.States["language"] - } - ]; + var repo = _services.GetRequiredService(); + var crontable = repo.GetCrontabItems(CrontabItemFilter.Empty()); + return crontable.Items.ToList(); } public async Task ScheduledTimeArrived(CrontabItem item) diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json index 4f866ce1..320f4d71 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json @@ -8,24 +8,37 @@ "type": "string", "description": "cron expression include seconds" }, - "topic": { + "title": { "type": "string", - "description": "task topic in 1-3 keywords related to business entities" + "description": "task short title" }, "description": { "type": "string", - "description": "task description without cron infromation, should include all key business entities" + "description": "the task summary" }, - "script": { - "type": "string", - "description": "task related script, commands or provided function with parameters" - }, - "language": { - "type": "string", - "enum": ["sql", "function"], - "description": "script programming language" + "to_do_list": { + "type": "array", + "description": "task to do list, should include all key business entities", + "items": { + "type": "object", + "properties": { + "topic": { + "type": "string", + "description": "task topic in 1-3 keywords related to the step" + }, + "script": { + "type": "string", + "description": "task related script, function with parameters or plain text" + }, + "language": { + "type": "string", + "enum": [ "function", "sql", "python", "text" ], + "description": "programming language script, function or plain text" + } + } + } } }, - "required": [ "cron_expression", "topic", "description", "script", "language" ] + "required": [ "cron_expression", "title", "description", "to_do_list" ] } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs index 964ac5ba..f7a05240 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs @@ -1,3 +1,4 @@ +using BotSharp.Abstraction.Crontab.Models; using System.IO; namespace BotSharp.Core.Repository; @@ -77,9 +78,9 @@ public partial class FileRepository { matched = matched && filter.UserIds.Contains(record.UserId); } - if (filter?.Topics != null) + if (filter?.Titles != null) { - matched = matched && filter.Topics.Contains(record.Topic); + matched = matched && filter.Titles.Contains(record.Title); } if (!matched) continue; diff --git a/src/Infrastructure/BotSharp.Core/Routing/Hooks/RoutingAgentHook.cs b/src/Infrastructure/BotSharp.Core/Routing/Hooks/RoutingAgentHook.cs index a847f078..f83afedf 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Hooks/RoutingAgentHook.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Hooks/RoutingAgentHook.cs @@ -1,4 +1,3 @@ -using BotSharp.Abstraction.Functions; using BotSharp.Abstraction.Routing.Enums; using BotSharp.Abstraction.Routing.Settings; @@ -26,6 +25,14 @@ public class RoutingAgentHook : AgentHookBase var routing = _services.GetRequiredService(); var agents = routing.GetRoutableAgents(_agent.Profiles); + // 过滤 Planner + var planningRule = _agent.RoutingRules.FirstOrDefault(x => x.Type == "planner"); + if (planningRule != null) + { + var planners = agents.Where(x => x.Type == AgentType.Planning && x.Name != planningRule.Field).ToArray(); + agents = agents.Except(planners).ToArray(); + } + // Postprocess agent required fields, remove it if the states exists var states = _services.GetRequiredService(); foreach (var agent in agents) diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs index 0c825a05..e7d9b49e 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/HFReasoner.cs @@ -24,6 +24,7 @@ namespace BotSharp.Core.Routing.Reasoning; /// public class HFReasoner : IRoutingReasoner { + public string Name => "Human-Feedback Reasoner"; private readonly IServiceProvider _services; private readonly ILogger _logger; diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs index eb58d3e3..7e6d2624 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Reasoning/OneStepForwardReasoner.cs @@ -29,7 +29,7 @@ namespace BotSharp.Core.Routing.Reasoning; /// public class OneStepForwardReasoner : IRoutingReasoner { - public string Name => "one-step-forward"; + public string Name => "One-Step-Forward-Reasoner"; private readonly IServiceProvider _services; private readonly ILogger _logger; diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs index f5c2a9d6..c5317ba4 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingPlugin.cs @@ -35,8 +35,7 @@ public class RoutingPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); - services.AddScoped(); - + services.AddScoped(); } } diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs index 18f330a3..b7dc6cc3 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.InstructLoop.cs @@ -102,7 +102,7 @@ public partial class RoutingService return _services.GetServices().First(x => x.Name == "Naive Reasoner"); } - var reasoner = _services.GetServices().FirstOrDefault(x => x.GetType().Name.EndsWith(rule.Field)); + var reasoner = _services.GetServices().FirstOrDefault(x => x.Name == rule.Field); if (reasoner == null) { diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs index d3eb2b1c..ef32f018 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs @@ -82,11 +82,10 @@ public partial class RoutingService : IRoutingService var filter = new AgentFilter { - Disabled = false, - Type = AgentType.Task + Disabled = false }; var agents = db.GetAgents(filter); - var records = agents.SelectMany(x => + var records = agents.Where(x => x.Type == AgentType.Task || x.Type == AgentType.Planning).SelectMany(x => { x.RoutingRules.ForEach(r => { @@ -108,16 +107,16 @@ public partial class RoutingService : IRoutingService var filter = new AgentFilter { - Disabled = false, - Type = AgentType.Task + Disabled = false }; var agents = db.GetAgents(filter); - var routableAgents = agents.Select(x => new RoutableAgent + var routableAgents = agents.Where(x => x.Type == AgentType.Task || x.Type == AgentType.Planning).Select(x => new RoutableAgent { AgentId = x.Id, Description = x.Description, Name = x.Name, + Type = x.Type, Profiles = x.Profiles, RequiredFields = x.RoutingRules .Where(p => p.Required) diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json index 0a82ae0a..ae99df17 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json @@ -12,7 +12,11 @@ "routingRules": [ { "type": "reasoner", - "field": "HFReasoner" + "field": "One-Step-Forward-Reasoner" + }, + { + "type": "planner", + "field": "Sequential-Planner" } ] } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs index ae85f639..c098ea53 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs @@ -9,10 +9,8 @@ public class CrontabItemDocument : MongoBase public string ConversationId { get; set; } public string ExecutionResult { get; set; } public string Cron { get; set; } - public string Topic { get; set; } + public string Title { get; set; } public string Description { get; set; } - public string Script { get; set; } - public string Language { get; set; } public DateTime CreatedTime { get; set; } = DateTime.UtcNow; public static CrontabItem ToDomainModel(CrontabItemDocument item) @@ -25,10 +23,8 @@ public class CrontabItemDocument : MongoBase ConversationId = item.ConversationId, ExecutionResult = item.ExecutionResult, Cron = item.Cron, - Topic = item.Topic, + Title = item.Title, Description = item.Description, - Script = item.Script, - Language = item.Language, CreatedTime = item.CreatedTime }; } @@ -43,10 +39,8 @@ public class CrontabItemDocument : MongoBase ConversationId = item.ConversationId, ExecutionResult = item.ExecutionResult, Cron = item.Cron, - Topic = item.Topic, + Title = item.Title, Description = item.Description, - Script = item.Script, - Language = item.Language, CreatedTime = item.CreatedTime }; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs index aa645a84..fdd816d4 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs @@ -46,9 +46,9 @@ public partial class MongoRepository { cronFilters.Add(cronBuilder.In(x => x.ConversationId, filter.ConversationIds)); } - if (filter?.Topics != null) + if (filter?.Titles != null) { - cronFilters.Add(cronBuilder.In(x => x.Topic, filter.Topics)); + cronFilters.Add(cronBuilder.In(x => x.Title, filter.Titles)); } if (filter?.UserIds != null) { diff --git a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj index fb183c77..f80327cc 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj +++ b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj @@ -19,6 +19,8 @@ + + @@ -52,6 +54,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs b/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs new file mode 100644 index 00000000..0776d7f1 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Http; + +namespace BotSharp.Plugin.Planner.Enums; + +public class PlannerAgentId +{ + public const string TwoStagePlanner = "282a7128-69a1-44b0-878c-a9159b88f3b9"; + public const string SequentialPlanner = "3e75e818-a139-48a8-9e22-4662548c13a3"; +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/PrimaryStagePlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/PrimaryStagePlanFn.cs index 84378158..fa1b7166 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/PrimaryStagePlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/PrimaryStagePlanFn.cs @@ -49,8 +49,8 @@ public class PrimaryStagePlanFn : IFunctionCallback var prompt = await GetFirstStagePlanPrompt(message, task.Requirements, knowledges); var plannerAgent = new Agent { - Id = BuiltInAgentId.Planner, - Name = "FirstStagePlanner", + Id = message.CurrentAgentId, + Name = Name, Instruction = prompt, TemplateDict = new Dictionary(), LlmConfig = currentAgent.LlmConfig @@ -70,7 +70,7 @@ public class PrimaryStagePlanFn : IFunctionCallback var render = _services.GetRequiredService(); var knowledgeHooks = _services.GetServices(); - var agent = await agentService.GetAgent(BuiltInAgentId.Planner); + var agent = await agentService.GetAgent(PlannerAgentId.TwoStagePlanner); var template = agent.Templates.FirstOrDefault(x => x.Name == "two_stage.1st.plan")?.Content ?? string.Empty; var responseFormat = JsonSerializer.Serialize(new FirstStagePlan{}); diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs index be780f51..5044139c 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs @@ -53,8 +53,8 @@ public class SecondaryStagePlanFn : IFunctionCallback var plannerAgent = new Agent { - Id = BuiltInAgentId.Planner, - Name = "SecondStagePlanner", + Id = PlannerAgentId.TwoStagePlanner, + Name = Name, Instruction = prompt, TemplateDict = new Dictionary(), LlmConfig = currentAgent.LlmConfig diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs index 2cd16ae9..cfc306f4 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs @@ -1,8 +1,5 @@ -using BotSharp.Abstraction.Planning; using BotSharp.Plugin.Planner.TwoStaging; using BotSharp.Plugin.Planner.TwoStaging.Models; -using static System.Net.Mime.MediaTypeNames; -using System.Text.RegularExpressions; namespace BotSharp.Plugin.Planner.Functions; @@ -62,8 +59,8 @@ public class SummaryPlanFn : IFunctionCallback var plannerAgent = new Agent { - Id = BuiltInAgentId.Planner, - Name = "SummaryPlanner", + Id = PlannerAgentId.TwoStagePlanner, + Name = Name, Instruction = prompt, LlmConfig = currentAgent.LlmConfig }; @@ -93,7 +90,7 @@ public class SummaryPlanFn : IFunctionCallback var render = _services.GetRequiredService(); var knowledgeHooks = _services.GetServices(); - var agent = await agentService.GetAgent(BuiltInAgentId.Planner); + var agent = await agentService.GetAgent(PlannerAgentId.TwoStagePlanner); var template = agent.Templates.FirstOrDefault(x => x.Name == "two_stage.summarize")?.Content ?? string.Empty; var additionalRequirements = new List(); diff --git a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs index d4bd1594..8c6f2635 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Hooks/PlannerAgentHook.cs @@ -2,7 +2,7 @@ namespace BotSharp.Plugin.Planner.Hooks; public class PlannerAgentHook : AgentHookBase { - public override string SelfId => BuiltInAgentId.Planner; + public override string SelfId => PlannerAgentId.TwoStagePlanner; public PlannerAgentHook(IServiceProvider services, AgentSettings settings) : base(services, settings) @@ -19,7 +19,7 @@ public class PlannerAgentHook : AgentHookBase { var k = hook.GetGlobalKnowledges(new RoleDialogModel(AgentRole.User, template) { - CurrentAgentId = BuiltInAgentId.Planner + CurrentAgentId = PlannerAgentId.TwoStagePlanner }).Result; Knowledges.AddRange(k); } diff --git a/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs b/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs index 17d84c1c..b139cde2 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs @@ -1,4 +1,4 @@ -using BotSharp.Abstraction.Planning; +using BotSharp.Plugin.Planner.Sequential; using BotSharp.Plugin.Planner.TwoStaging; namespace BotSharp.Plugin.Planner; @@ -13,10 +13,15 @@ public class PlannerPlugin : IBotSharpPlugin public string Description => "Provide AI with different planning approaches to improve AI's ability to solve complex problems."; public string IconUrl => "https://e7.pngegg.com/pngimages/775/350/png-clipart-action-plan-computer-icons-plan-miscellaneous-text-thumbnail.png"; - public string[] AgentIds => [ BuiltInAgentId.Planner ]; + public string[] AgentIds => + [ + PlannerAgentId.TwoStagePlanner, + PlannerAgentId.SequentialPlanner + ]; public void RegisterDI(IServiceCollection services, IConfiguration config) { + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs b/src/Plugins/BotSharp.Plugin.Planner/Sequential/SequentialPlanner.cs similarity index 91% rename from src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs rename to src/Plugins/BotSharp.Plugin.Planner/Sequential/SequentialPlanner.cs index 77f069fc..043c7380 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Reasoning/SequentialReasoner.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Sequential/SequentialPlanner.cs @@ -14,26 +14,23 @@ limitations under the License. ******************************************************************************/ -using BotSharp.Abstraction.MLTasks; -using BotSharp.Abstraction.Routing.Models; -using BotSharp.Abstraction.Routing.Reasoning; -using BotSharp.Abstraction.Templating; - -namespace BotSharp.Core.Routing.Reasoning; +namespace BotSharp.Plugin.Planner.Sequential; /// -/// Sequential tasks focused reasoning approach +/// A Sequential Planner for a large language model (LLM) is a framework or methodology to execute some list tasks in a predefined order by the user, +/// LLM can follow to produce an organized and coherent output. +/// Sequential Planners are useful for tasks that involve multiple stages of reasoning, information retrieval, or interdependent subtasks. /// -public class SequentialReasoner : IRoutingReasoner +public class SequentialPlanner : ITaskPlanner { private readonly IServiceProvider _services; private readonly ILogger _logger; - + public string Name => "Sequential-Planner"; public bool HideDialogContext => true; public int MaxLoopCount => 100; private FunctionCallFromLlm _lastInst; - public SequentialReasoner(IServiceProvider services, ILogger logger) + public SequentialPlanner(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; @@ -91,7 +88,7 @@ public class SequentialReasoner : IRoutingReasoner { new RoleDialogModel(AgentRole.User, next) { - FunctionName = nameof(SequentialReasoner), + FunctionName = nameof(SequentialPlanner), MessageId = messageId } }; @@ -158,7 +155,7 @@ public class SequentialReasoner : IRoutingReasoner if (message.StopCompletion) { - context.Empty(reason: $"Agent queue is cleared by {nameof(SequentialReasoner)}"); + context.Empty(reason: $"Agent queue is cleared by {nameof(SequentialPlanner)}"); return false; } @@ -204,7 +201,7 @@ public class SequentialReasoner : IRoutingReasoner var response = await completion.GetChatCompletions(new Agent { Id = router.Id, - Name = nameof(SequentialReasoner), + Name = nameof(SequentialPlanner), Instruction = systemPrompt }, dialogs); diff --git a/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs b/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs index 47b9c03a..6935bfbf 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/TwoStaging/TwoStageTaskPlanner.cs @@ -1,13 +1,38 @@ -using BotSharp.Abstraction.Infrastructures.Enums; -using BotSharp.Abstraction.Planning; -using BotSharp.Core.Routing.Reasoning; +/***************************************************************************** + Copyright 2024 Written by Haiping Chen. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +******************************************************************************/ namespace BotSharp.Plugin.Planner.TwoStaging; +/// +/// The Two-Stage Planner approach in large language models(LLMs) is an effective strategy to handle complex tasks by breaking them into manageable steps. +/// This involves creating a high-level plan in the first stage and then drilling down into the details in the second stage. +/// +/// Primary stage: +/// The LLM generates a structured overview or roadmap for solving the problem. +/// The focus here is on creating a broad and logically organized set of actions or categories that guide the overall process. +/// +/// Secondary stage: +/// For each step or component in the high-level plan, the LLM elaborates with specific actions, tools, or techniques. +/// The focus shifts to operationalizing the roadmap. +/// public partial class TwoStageTaskPlanner : ITaskPlanner { private readonly IServiceProvider _services; private readonly ILogger _logger; + public string Name => "Two-Stage-Planner"; public int MaxLoopCount => 10; public TwoStageTaskPlanner(IServiceProvider services, ILogger logger) @@ -23,8 +48,8 @@ public partial class TwoStageTaskPlanner : ITaskPlanner // chat completion var completion = CompletionProvider.GetChatCompletion(_services, - provider: router?.LlmConfig?.Provider, - model: router?.LlmConfig?.Model); + provider: router?.LlmConfig?.Provider, + model: router?.LlmConfig?.Model); // text completion dialogs = new List @@ -36,12 +61,10 @@ public partial class TwoStageTaskPlanner : ITaskPlanner } }; var response = await completion.GetChatCompletions(router, dialogs); - inst = response.Content.JsonContent(); // Fix LLM malformed response ReasonerHelper.FixMalformedResponse(_services, inst); - return inst; } @@ -99,7 +122,7 @@ public partial class TwoStageTaskPlanner : ITaskPlanner private async Task GetNextStepPrompt(Agent router) { var agentService = _services.GetRequiredService(); - var planner = await agentService.LoadAgent(BuiltInAgentId.Planner); + var planner = await agentService.LoadAgent(PlannerAgentId.TwoStagePlanner); var template = planner.Templates.First(x => x.Name == "two_stage.next").Content; var states = _services.GetRequiredService(); var render = _services.GetRequiredService(); diff --git a/src/Plugins/BotSharp.Plugin.Planner/Using.cs b/src/Plugins/BotSharp.Plugin.Planner/Using.cs index 1e6737df..50db1596 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Using.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Using.cs @@ -18,19 +18,19 @@ global using BotSharp.Abstraction.Conversations; global using BotSharp.Abstraction.Functions.Models; global using BotSharp.Abstraction.Repositories; global using BotSharp.Abstraction.Utilities; - global using BotSharp.Abstraction.Conversations.Models; global using BotSharp.Abstraction.Functions; global using BotSharp.Abstraction.Routing; global using BotSharp.Abstraction.Templating; - global using BotSharp.Abstraction.Knowledges; global using BotSharp.Abstraction.Knowledges.Settings; -global using BotSharp.Abstraction.Knowledges.Enums; -global using BotSharp.Abstraction.VectorStorage.Models; -global using BotSharp.Abstraction.VectorStorage.Extensions; +global using BotSharp.Abstraction.Infrastructures.Enums; +global using BotSharp.Abstraction.Planning; +global using BotSharp.Abstraction.MLTasks; +global using BotSharp.Abstraction.Routing.Models; + +global using BotSharp.Core.Infrastructures; +global using BotSharp.Core.Routing.Reasoning; global using BotSharp.Plugin.Planner.Hooks; global using BotSharp.Plugin.Planner.Enums; - -global using BotSharp.Core.Infrastructures; \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json index 1f91baca..7f837847 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/agent.json @@ -1,8 +1,8 @@ { "id": "282a7128-69a1-44b0-878c-a9159b88f3b9", - "name": "Planner", - "description": "Plan feasible implementation steps for complex user task request, including generating sql query", - "type": "task", + "name": "Two-Stage-Planner", + "description": "Plan feasible steps for complex user task request, including generating sql query", + "type": "planning", "createdDateTime": "2023-08-27T10:39:00Z", "updatedDateTime": "2023-08-27T14:39:00Z", "iconUrl": "https://e7.pngegg.com/pngimages/775/350/png-clipart-action-plan-computer-icons-plan-miscellaneous-text-thumbnail.png", @@ -13,7 +13,7 @@ "utilities": [], "llmConfig": { "provider": "openai", - "model": "gpt-4o", + "model": "gpt-4o-2024-11-20", "max_recursion_depth": 10 } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid index 190edf8c..306f4214 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid @@ -15,7 +15,8 @@ Thinking process: 4. Output all the subtasks as much detail as possible in JSON: [{{ response_format }}] 5. You can NOT generate the final query before calling function plan_summary. -Note:If the task includes repeat steps,e.g.same steps for multiple elements, only generate a single detailed solution without repeating steps for each elements. You can add multiple items in the input and output args. +Note: +* If the task includes repeat steps,e.g.same steps for multiple elements, only generate a single detailed solution without repeating steps for each elements. {% if global_knowledges != empty -%} ===== diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json new file mode 100644 index 00000000..59231a43 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json @@ -0,0 +1,19 @@ +{ + "id": "3e75e818-a139-48a8-9e22-4662548c13a3", + "name": "Sequential-Planner", + "description": "Plan an ordered plan steps to execute some tasks in a predefined order by the user", + "type": "planning", + "createdDateTime": "2023-08-27T10:39:00Z", + "updatedDateTime": "2023-08-27T14:39:00Z", + "iconUrl": "https://www.shutterstock.com/image-vector/sequential-process-glyph-icon-order-260nw-1015790182.jpg", + "disabled": false, + "isPublic": true, + "profiles": [ "planning" ], + "mergeUtility": true, + "utilities": [], + "llmConfig": { + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "max_recursion_depth": 10 + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/instructions/instruction.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/instructions/instruction.liquid new file mode 100644 index 00000000..25e26106 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/instructions/instruction.liquid @@ -0,0 +1,15 @@ +You are a Task Planner. you will breakdown user business requirements into excutable sub-steps. +Follow the instructions below to plan and execute tasks: + +1. Look at all the steps first, think carefully, and decide which step to do first. +2. Look at the description of each step, and use the existing functions and tools to plan the execution steps. + +{% if global_knowledges != empty -%} +===== +Global Knowledge: +Current date time is: {{ "now" | date: "%Y-%m-%d %H:%M" }} +{% for k in global_knowledges %} +{{ k }} +{% endfor %} +===== +{%- endif %} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs index 53b7866f..14205493 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverAgentHook.cs @@ -4,7 +4,7 @@ namespace BotSharp.Plugin.SqlDriver.Hooks; public class SqlDriverAgentHook : AgentHookBase, IAgentHook { - public override string SelfId => BuiltInAgentId.Planner; + public override string SelfId => string.Empty; public SqlDriverAgentHook(IServiceProvider services, AgentSettings settings) : base(services, settings) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs index 88133881..7f645cd9 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs @@ -1,4 +1,6 @@ using BotSharp.Abstraction.Crontab.Models; +using BotSharp.Abstraction.Models; +using BotSharp.Abstraction.SideCar; using BotSharp.Core.Crontab.Abstraction; namespace BotSharp.Plugin.SqlDriver.Hooks; @@ -15,16 +17,22 @@ public class SqlDriverCrontabHook : ICrontabHook public async Task OnCronTriggered(CrontabItem item) { - if (item.Language != "sql") + /*var conv = _services.GetRequiredService(); + conv.SetConversationId("abd9df25-2210-4e4d-80d7-48b6a3b905a8", []); + + if (item.Language == "text") + { + var sidecar = _services.GetService(); + var response = await sidecar.SendMessage(BuiltInAgentId.AIAssistant, item.Description, states: new List()); + return; + } + else if (item.Language != "sql") { return; } _logger.LogWarning($"Crontab item triggered: {item.Topic}. Run {item.Language}: {item.Script}"); - var conv = _services.GetRequiredService(); - conv.SetConversationId("73a9ee27-d597-4739-958f-3bd79760ac8e", []); - var message = new RoleDialogModel(AgentRole.User, $"Run the query") { FunctionName = "sql_select", @@ -41,6 +49,6 @@ public class SqlDriverCrontabHook : ICrontabHook item.ConversationId = conv.ConversationId; item.AgentId = BuiltInAgentId.SqlDriver; item.UserId = "41021346"; - item.ExecutionResult = message.Content; + item.ExecutionResult = message.Content;*/ } } From 0de06a92971722b32477e59cd42a62c0d7059bdf Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 10 Dec 2024 12:50:13 -0600 Subject: [PATCH 080/100] temp save --- .../Crontab/Models/CrontabItem.cs | 3 -- .../Repositories/IBotSharpRepository.cs | 2 +- .../FileRepository/FileRepository.Crontab.cs | 30 ++++++++----------- .../FileRepository/FileRepository.cs | 3 +- .../Collections/CrontabItemDocument.cs | 2 -- .../MongoRepository.Conversation.cs | 5 +++- .../Repository/MongoRepository.Crontab.cs | 2 +- 7 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs index 6d4eee5a..32f0ec7b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs @@ -2,9 +2,6 @@ namespace BotSharp.Abstraction.Crontab.Models; public class CrontabItem : ScheduleTaskArgs { - [JsonPropertyName("id")] - public string Id { get; set; } - [JsonPropertyName("user_id")] public string UserId { get; set; } = null!; diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index be8a970e..ccfc8dfb 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -147,7 +147,7 @@ public interface IBotSharpRepository : IHaveServiceProvider #endregion #region Crontab - bool InsertCrontabItem(CrontabItem item) => throw new NotImplementedException(); + bool InsertCrontabItem(CrontabItem cron) => throw new NotImplementedException(); PagedItems GetCrontabItems(CrontabItemFilter filter) => throw new NotImplementedException(); #endregion } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs index 964ac5ba..c24aff7b 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs @@ -4,30 +4,24 @@ namespace BotSharp.Core.Repository; public partial class FileRepository { - public bool InsertCrontabItem(CrontabItem item) + public bool InsertCrontabItem(CrontabItem cron) { - if (item == null) + if (cron == null || string.IsNullOrWhiteSpace(cron.ConversationId)) { return false; } try { - var baseDir = Path.Combine(_dbSettings.FileRepository, CRONTAB_FOLDER); - item.Id = Guid.NewGuid().ToString(); - var dir = Path.Combine(baseDir, item.Id); - - if (Directory.Exists(dir)) + var baseDir = Path.Combine(_dbSettings.FileRepository, _conversationSettings.DataDir, cron.ConversationId); + if (!Directory.Exists(baseDir)) { return false; } - Directory.CreateDirectory(dir); - Thread.Sleep(50); - - var itemFile = Path.Combine(dir, CRONTAB_FILE); - var json = JsonSerializer.Serialize(item, _options); - File.WriteAllText(itemFile, json); + var cronFile = Path.Combine(baseDir, CRON_FILE); + var json = JsonSerializer.Serialize(cronFile, _options); + File.WriteAllText(cronFile, json); return true; } catch (Exception ex) @@ -47,17 +41,17 @@ public partial class FileRepository } var records = new List(); - var dir = Path.Combine(_dbSettings.FileRepository, CRONTAB_FOLDER); + var baseDir = Path.Combine(_dbSettings.FileRepository, _conversationSettings.DataDir); - if (!Directory.Exists(dir)) + if (!Directory.Exists(baseDir)) { - Directory.CreateDirectory(dir); + Directory.CreateDirectory(baseDir); } - var totalDirs = Directory.GetDirectories(dir); + var totalDirs = Directory.GetDirectories(baseDir); foreach (var d in totalDirs) { - var file = Path.Combine(d, CRONTAB_FILE); + var file = Path.Combine(d, CRON_FILE); if (!File.Exists(file)) continue; var json = File.ReadAllText(file); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs index cf5852a4..6a718d65 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.cs @@ -55,8 +55,7 @@ public partial class FileRepository : IBotSharpRepository private const string PLUGIN_CONFIG_FILE = "config.json"; private const string STATS_FILE = "stats.json"; - private const string CRONTAB_FOLDER = "crontabs"; - private const string CRONTAB_FILE = "crontab.json"; + private const string CRON_FILE = "cron.json"; public FileRepository( IServiceProvider services, diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs index ae85f639..1f9ee075 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs @@ -19,7 +19,6 @@ public class CrontabItemDocument : MongoBase { return new CrontabItem { - Id = item.Id, UserId = item.UserId, AgentId = item.AgentId, ConversationId = item.ConversationId, @@ -37,7 +36,6 @@ public class CrontabItemDocument : MongoBase { return new CrontabItemDocument { - Id = item.Id, UserId = item.UserId, AgentId = item.AgentId, ConversationId = item.ConversationId, diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index ccbfc1af..cdd78ae2 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -56,6 +56,7 @@ public partial class MongoRepository var filterPromptLog = Builders.Filter.In(x => x.ConversationId, conversationIds); var filterContentLog = Builders.Filter.In(x => x.ConversationId, conversationIds); var filterStateLog = Builders.Filter.In(x => x.ConversationId, conversationIds); + var conbTabItems = Builders.Filter.In(x => x.ConversationId, conversationIds); var exeLogDeleted = _dc.ExectionLogs.DeleteMany(filterExeLog); var promptLogDeleted = _dc.LlmCompletionLogs.DeleteMany(filterPromptLog); @@ -63,11 +64,13 @@ public partial class MongoRepository var stateLogDeleted = _dc.StateLogs.DeleteMany(filterStateLog); var statesDeleted = _dc.ConversationStates.DeleteMany(filterSates); var dialogDeleted = _dc.ConversationDialogs.DeleteMany(filterDialog); + var cronDeleted = _dc.CrontabItems.DeleteMany(conbTabItems); var convDeleted = _dc.Conversations.DeleteMany(filterConv); return convDeleted.DeletedCount > 0 || dialogDeleted.DeletedCount > 0 || statesDeleted.DeletedCount > 0 || exeLogDeleted.DeletedCount > 0 || promptLogDeleted.DeletedCount > 0 - || contentLogDeleted.DeletedCount > 0 || stateLogDeleted.DeletedCount > 0; + || contentLogDeleted.DeletedCount > 0 || stateLogDeleted.DeletedCount > 0 + || convDeleted.DeletedCount > 0; } [SideCar] diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs index aa645a84..fc1be72f 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs @@ -14,8 +14,8 @@ public partial class MongoRepository try { - item.Id = Guid.NewGuid().ToString(); var cronDoc = CrontabItemDocument.ToMongoModel(item); + cronDoc.Id = Guid.NewGuid().ToString(); _dc.CrontabItems.InsertOne(cronDoc); return true; } From 275aea422c4a42a32ccae9a24c7e4fe3d5349326 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 10 Dec 2024 13:45:48 -0600 Subject: [PATCH 081/100] sync cron --- .../Crontab/Models/CrontabItemFilter.cs | 3 -- .../Crontab/Models/ScheduleTaskArgs.cs | 2 +- .../FileRepository/FileRepository.Crontab.cs | 6 +--- .../Collections/CrontabItemDocument.cs | 3 ++ .../Models/CronTaskMongoElement.cs | 30 +++++++++++++++++++ .../Repository/MongoRepository.Crontab.cs | 4 --- 6 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.MongoStorage/Models/CronTaskMongoElement.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs index 71c82e05..7a949dc2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItemFilter.cs @@ -11,9 +11,6 @@ public class CrontabItemFilter : Pagination [JsonPropertyName("conversation_ids")] public IEnumerable? ConversationIds { get; set; } - [JsonPropertyName("titles")] - public IEnumerable? Titles { get; set; } - public CrontabItemFilter() { diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs index b40819ec..df11160a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs @@ -12,7 +12,7 @@ public class ScheduleTaskArgs public string Description { get; set; } = null!; [JsonPropertyName("to_do_list")] - public ScheduleTaskItemArgs[] Tasks { get; set; } = null!; + public ScheduleTaskItemArgs[] Tasks { get; set; } = []; } public class ScheduleTaskItemArgs diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs index 9ee8ffb1..8ea21948 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs @@ -21,7 +21,7 @@ public partial class FileRepository } var cronFile = Path.Combine(baseDir, CRON_FILE); - var json = JsonSerializer.Serialize(cronFile, _options); + var json = JsonSerializer.Serialize(cron, _options); File.WriteAllText(cronFile, json); return true; } @@ -72,10 +72,6 @@ public partial class FileRepository { matched = matched && filter.UserIds.Contains(record.UserId); } - if (filter?.Titles != null) - { - matched = matched && filter.Titles.Contains(record.Title); - } if (!matched) continue; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs index a2bba5f4..10e633d7 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs @@ -11,6 +11,7 @@ public class CrontabItemDocument : MongoBase public string Cron { get; set; } public string Title { get; set; } public string Description { get; set; } + public IEnumerable Tasks { get; set; } = []; public DateTime CreatedTime { get; set; } = DateTime.UtcNow; public static CrontabItem ToDomainModel(CrontabItemDocument item) @@ -24,6 +25,7 @@ public class CrontabItemDocument : MongoBase Cron = item.Cron, Title = item.Title, Description = item.Description, + Tasks = item.Tasks?.Select(x => CronTaskMongoElement.ToDomainElement(x))?.ToArray() ?? [], CreatedTime = item.CreatedTime }; } @@ -39,6 +41,7 @@ public class CrontabItemDocument : MongoBase Cron = item.Cron, Title = item.Title, Description = item.Description, + Tasks = item.Tasks?.Select(x => CronTaskMongoElement.ToMongoElement(x))?.ToList() ?? [], CreatedTime = item.CreatedTime }; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/CronTaskMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/CronTaskMongoElement.cs new file mode 100644 index 00000000..099286b8 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/CronTaskMongoElement.cs @@ -0,0 +1,30 @@ +using BotSharp.Abstraction.Crontab.Models; + +namespace BotSharp.Plugin.MongoStorage.Models; + +public class CronTaskMongoElement +{ + public string Topic { get; set; } + public string Script { get; set; } + public string Language { get; set; } + + public static CronTaskMongoElement ToMongoElement(ScheduleTaskItemArgs model) + { + return new CronTaskMongoElement + { + Topic = model.Topic, + Script = model.Script, + Language = model.Language + }; + } + + public static ScheduleTaskItemArgs ToDomainElement(CronTaskMongoElement model) + { + return new ScheduleTaskItemArgs + { + Topic = model.Topic, + Script = model.Script, + Language = model.Language + }; + } +} diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs index f499e186..43611e71 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs @@ -46,10 +46,6 @@ public partial class MongoRepository { cronFilters.Add(cronBuilder.In(x => x.ConversationId, filter.ConversationIds)); } - if (filter?.Titles != null) - { - cronFilters.Add(cronBuilder.In(x => x.Title, filter.Titles)); - } if (filter?.UserIds != null) { cronFilters.Add(cronBuilder.In(x => x.UserId, filter.UserIds)); From 0c5c0c81c58187c8e42c6613da0b95db4cf52ce2 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 10 Dec 2024 15:16:03 -0600 Subject: [PATCH 082/100] add delete cron --- .../Repositories/IBotSharpRepository.cs | 3 +- .../Functions/ScheduleTaskFn.cs | 2 +- .../Services/CrontabWatcher.cs | 32 ++++++++++------- .../FileRepository/FileRepository.Crontab.cs | 34 +++++++++++++++++-- .../Repository/MongoRepository.Crontab.cs | 26 +++++++++++--- 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index ccfc8dfb..61982cc4 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -147,7 +147,8 @@ public interface IBotSharpRepository : IHaveServiceProvider #endregion #region Crontab - bool InsertCrontabItem(CrontabItem cron) => throw new NotImplementedException(); + bool UpsertCrontabItem(CrontabItem cron) => throw new NotImplementedException(); + bool DeleteCrontabItem(string conversationId) => throw new NotImplementedException(); PagedItems GetCrontabItems(CrontabItemFilter filter) => throw new NotImplementedException(); #endregion } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs index aee47f95..87a1bad6 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs @@ -33,7 +33,7 @@ public class ScheduleTaskFn : IFunctionCallback }; var db = _services.GetRequiredService(); - // var ret = db.InsertCrontabItem(crontabItem); + // var ret = db.UpsertCrontabItem(crontabItem); return true; } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs index f29bd069..a7db1220 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs @@ -46,24 +46,32 @@ public class CrontabWatcher : BackgroundService var crons = await cron.GetCrontable(); foreach (var item in crons) { - var schedule = CrontabSchedule.Parse(item.Cron, new CrontabSchedule.ParseOptions + try { - IncludingSeconds = true // Ensure you account for seconds - }); + var schedule = CrontabSchedule.Parse(item.Cron, new CrontabSchedule.ParseOptions + { + IncludingSeconds = true // Ensure you account for seconds + }); - // Get the current time - var currentTime = DateTime.UtcNow; + // Get the current time + var currentTime = DateTime.UtcNow; - // Get the next occurrence from the schedule - var nextOccurrence = schedule.GetNextOccurrence(currentTime.AddSeconds(-1)); + // Get the next occurrence from the schedule + var nextOccurrence = schedule.GetNextOccurrence(currentTime.AddSeconds(-1)); - // Check if the current time matches the schedule - bool matches = currentTime >= nextOccurrence && currentTime < nextOccurrence.AddSeconds(1); + // Check if the current time matches the schedule + bool matches = currentTime >= nextOccurrence && currentTime < nextOccurrence.AddSeconds(1); - if (matches) + if (matches) + { + _logger.LogDebug($"The current time matches the cron expression {item}"); + cron.ScheduledTimeArrived(item); + } + } + catch (Exception ex) { - _logger.LogDebug($"The current time matches the cron expression {item}"); - cron.ScheduledTimeArrived(item); + _logger.LogWarning($"Error when running cron task ({item.ConversationId}, {item.Title}, {item.Cron}): {ex.Message}\r\n{ex.InnerException}"); + continue; } } } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs index 8ea21948..5d3eb865 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Crontab.cs @@ -1,11 +1,10 @@ -using BotSharp.Abstraction.Crontab.Models; using System.IO; namespace BotSharp.Core.Repository; public partial class FileRepository { - public bool InsertCrontabItem(CrontabItem cron) + public bool UpsertCrontabItem(CrontabItem cron) { if (cron == null || string.IsNullOrWhiteSpace(cron.ConversationId)) { @@ -32,6 +31,37 @@ public partial class FileRepository } } + public bool DeleteCrontabItem(string conversationId) + { + if (string.IsNullOrWhiteSpace(conversationId)) + { + return false; + } + + try + { + var baseDir = Path.Combine(_dbSettings.FileRepository, _conversationSettings.DataDir, conversationId); + if (!Directory.Exists(baseDir)) + { + return false; + } + + var cronFile = Path.Combine(baseDir, CRON_FILE); + if (!File.Exists(cronFile)) + { + return false; + } + + File.Delete(cronFile); + return true; + } + catch (Exception ex) + { + _logger.LogError($"Error when deleting crontab item (${conversationId}): {ex.Message}\r\n{ex.InnerException}"); + return false; + } + } + public PagedItems GetCrontabItems(CrontabItemFilter filter) { diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs index 43611e71..a40fc827 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Crontab.cs @@ -5,9 +5,9 @@ namespace BotSharp.Plugin.MongoStorage.Repository; public partial class MongoRepository { - public bool InsertCrontabItem(CrontabItem item) + public bool UpsertCrontabItem(CrontabItem item) { - if (item == null) + if (item == null || string.IsNullOrWhiteSpace(item.ConversationId)) { return false; } @@ -16,7 +16,12 @@ public partial class MongoRepository { var cronDoc = CrontabItemDocument.ToMongoModel(item); cronDoc.Id = Guid.NewGuid().ToString(); - _dc.CrontabItems.InsertOne(cronDoc); + + var filter = Builders.Filter.Eq(x => x.ConversationId, item.ConversationId); + var result = _dc.CrontabItems.ReplaceOne(filter, cronDoc, new ReplaceOptions + { + IsUpsert = true + }); return true; } catch (Exception ex) @@ -27,6 +32,19 @@ public partial class MongoRepository } + public bool DeleteCrontabItem(string conversationId) + { + if (string.IsNullOrWhiteSpace(conversationId)) + { + return false; + } + + var filter = Builders.Filter.Eq(x => x.ConversationId, conversationId); + var result = _dc.CrontabItems.DeleteMany(filter); + return result.DeletedCount > 0; + } + + public PagedItems GetCrontabItems(CrontabItemFilter filter) { if (filter == null) @@ -37,7 +55,7 @@ public partial class MongoRepository var cronBuilder = Builders.Filter; var cronFilters = new List>() { cronBuilder.Empty }; - // Filter conversations + // Filter cron if (filter?.AgentIds != null) { cronFilters.Add(cronBuilder.In(x => x.AgentId, filter.AgentIds)); From b37e119cbec9a55f20acb695e33608cec57e2995 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 10 Dec 2024 15:48:49 -0600 Subject: [PATCH 083/100] init dialog in side car --- .../SideCar/IConversationSideCar.cs | 3 ++- .../Services/BotSharpConversationSideCar.cs | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/SideCar/IConversationSideCar.cs b/src/Infrastructure/BotSharp.Abstraction/SideCar/IConversationSideCar.cs index 9a1316fb..84b65573 100644 --- a/src/Infrastructure/BotSharp.Abstraction/SideCar/IConversationSideCar.cs +++ b/src/Infrastructure/BotSharp.Abstraction/SideCar/IConversationSideCar.cs @@ -9,5 +9,6 @@ public interface IConversationSideCar List GetConversationDialogs(string conversationId); void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint); ConversationBreakpoint? GetConversationBreakpoint(string conversationId); - Task SendMessage(string agentId, string text, PostbackMessageModel? postback = null, List? states = null); + Task SendMessage(string agentId, string text, + PostbackMessageModel? postback = null, List? states = null, List? dialogs = null); } diff --git a/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs b/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs index 4ddc3a43..59087311 100644 --- a/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs +++ b/src/Infrastructure/BotSharp.Core.SideCar/Services/BotSharpConversationSideCar.cs @@ -80,9 +80,9 @@ public class BotSharpConversationSideCar : IConversationSideCar } public async Task SendMessage(string agentId, string text, - PostbackMessageModel? postback = null, List? states = null) + PostbackMessageModel? postback = null, List? states = null, List? dialogs = null) { - BeforeExecute(); + BeforeExecute(dialogs); var response = await InnerExecute(agentId, text, postback, states); AfterExecute(); return response; @@ -114,7 +114,7 @@ public class BotSharpConversationSideCar : IConversationSideCar return response; } - private void BeforeExecute() + private void BeforeExecute(List? dialogs) { enabled = true; var state = _services.GetRequiredService(); @@ -123,8 +123,8 @@ public class BotSharpConversationSideCar : IConversationSideCar var node = new ConversationContext { State = state.GetCurrentState(), - Dialogs = new(), - Breakpoints = new(), + Dialogs = dialogs ?? [], + Breakpoints = [], RecursiveCounter = routing.Context.GetRecursiveCounter(), RoutingStack = routing.Context.GetAgentStack() }; From 67689cc63b661024cd8048d76a9169131597bb01 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 11 Dec 2024 11:48:16 -0600 Subject: [PATCH 084/100] refine doc --- docs/architecture/agent-utility.md | 16 ++++++++-------- .../assets/agent-utility/add-utility.png | Bin 33518 -> 32434 bytes .../agent-utility-code-structure.png | Bin 88725 -> 82872 bytes .../agent-utility/router-utility-ui.png | Bin 15213 -> 13041 bytes .../Plugins/Models/PluginDef.cs | 5 +++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/architecture/agent-utility.md b/docs/architecture/agent-utility.md index e7100284..b65dea8c 100644 --- a/docs/architecture/agent-utility.md +++ b/docs/architecture/agent-utility.md @@ -4,7 +4,7 @@ This document aims to introduce the agent utility concept and provide an instruction on adding custom agent utilities in AI project “BotSharp”. We will start by explaining the mechanism of agent utility in [Section 2](#agent-utility). Then, we illustrate the custom agent utility setup and integration in [Section 3](#agent-utility-setup) and [Section 4](#agent-utility-integration), respectively. A use case will be demonstrated in [Section 5](#use-case-demo). We wrap up the document with a short summary. ## Agent Utility -The agent utility is a unique feature that can be integrated into agent to enhance its capability. Its core principle is that it can dynamically and seamlessly add extra prompts and add task-oriented functions (or tools) during conversation, without disrupting the agent’s primary purpose. In other words, the agent utility can perform extra tasks based on the context of conversation. Typical examples of agent utility include reading images/pdf, generating image, and sending http requests. [Fig 2.1.1](#agent-utility-example) demonstrates an example of these utilities. In this example, “Chatbot” is a simple agent to answer user questions and the utilities extend its capability to explain image content, generate requested image, and send a specific http request. +The agent utility is a unique feature that can be integrated into agent to enhance its capability. Its core principle is that it can dynamically and seamlessly add extra prompts and add task-oriented functions (or tools) during conversation, without disrupting the agent’s primary purpose. In other words, the agent utility can perform extra tasks based on the context of conversation. Typical examples of agent utility include reading images/pdf, generating image, and sending http requests. [Fig 2.1.1](#agent-utility-example) demonstrates an example of these utilities. In this example, “Chatbot” is a simple agent to answer user questions, and the utilities extend its capability to explain image content, generate requested image, and send a specific http request.
@@ -15,7 +15,7 @@ The agent utility is a unique feature that can be integrated into agent to enhan In this section, we outline the steps to set up a custom agent utility. We start with the basic code structure and then add essential utility data, such as prompts and functions. The utility hooks are used to incorporate the utility into the agent. Finally, we give a brief overview of the utility implementation. ### Basic Code Structure -The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent “6745151e-6d46-4a02-8de4-1c4f21c7da95” is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the structure of prompt, function, hooks, and implementation of an http utility. +The basic code structure of a typical agent utility includes prompt/function data, hooks, and function implementation. We can add specific utility prompts and functions in different projects. Note that the agent **“6745151e-6d46-4a02-8de4-1c4f21c7da95”** is considered as a dedicated utility assistant, and every prompt and function can be optionally used as a utility. [Fig 3.1.1](#agent-utility-code-structure) presents the structure of prompt, function, hooks, and implementation of an http utility.
@@ -23,7 +23,7 @@ The basic code structure of a typical agent utility includes prompt/function dat
### Utility Data -For a typical agent utility, it is essential to add at least a prompt and a function. The prompt is added under the “templates” folder and its recommended name is “[function name].fn.liquid”, while the function is added under the “functions” folder and its recommended name is “[function name].json”. Once we compile the project, we can find the aggregated utility assistant folder at location: “\BotSharp\src\WebStarter\bin\Debug\net8.0\data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95”. +For a typical agent utility, it is essential to add at least one prompt and one function. The utility name is formatted as **“[plugin name].[utility name]”**, such as “http.http-handler”. The prompt is added under the “templates” folder and its recommended name is **“util-[plugin name]-[function name].fn.liquid”**, while the function is added under the “functions” folder and its recommended name is **“util-[plugin name]-[function name].json”**. Once we compile the project, we can find the aggregated utility assistant folder at location: **“\BotSharp\src\WebStarter\bin\Debug\net8.0\data\agents\6745151e-6d46-4a02-8de4-1c4f21c7da95”**. ### Utility Hooks The utility hooks are used to connect the agent utility to the agent system. The code snippet below demonstrates an implementation of the http utility hook, where we define the utility name, prompts and functions. Note that each utility can be used across different agents. @@ -50,7 +50,7 @@ public class HttpHandlerPlugin : IBotSharpPlugin } ``` -The agent hook is used to append the utility prompt and function during the conversation. Note that the utility data is only allowed to be included in the context of conversation. The utility mechanism is implemented in the “OnAgentUtilityLoaded” hook, and it is invoked when we load any agent. +The agent hook is used to append the utility prompt and function during the conversation. **Note that the utility data is only allowed to be included in the context of conversation**. The utility mechanism is implemented in the **“OnAgentUtilityLoaded”** hook, and it is invoked when we load any agent. ```csharp public async Task LoadAgent(string id) @@ -128,7 +128,7 @@ Here we introduce a simple utility function implementation. The actual content d ```csharp public class HandleHttpRequestFn : IFunctionCallback { - public string Name => "handle_http_request"; + public string Name => "util-http-handle_http_request"; public string Indication => "Handling http request"; private readonly IServiceProvider _services; @@ -344,12 +344,12 @@ Here we introduce the agent setup with utilities and inheritance. As we introduc "profiles": [ "pizza" ], "utilities": [ { - "name": "http_handler", + "name": "http.http-handler", "functions": [ - { "name": "handle_http_request" } + { "name": "util-http-handle_http_request" } ], "templates": [ - { "name": "handle_http_request.fn" } + { "name": "util-http-handle_http_request.fn" } ] } ], diff --git a/docs/architecture/assets/agent-utility/add-utility.png b/docs/architecture/assets/agent-utility/add-utility.png index 940f00ed30397f7046f8177e2e69c9eafa02d337..cda3472d64c7b08acd8f85bec030a3ab7406e903 100644 GIT binary patch literal 32434 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 F{|{|>q8b1I diff --git a/docs/architecture/assets/agent-utility/agent-utility-code-structure.png b/docs/architecture/assets/agent-utility/agent-utility-code-structure.png index 9232f90e612786493daba272ffc5a17cb47eda78..8b2c4458f041e7ff66ebebf3ef833bd7ddc24dde 100644 GIT binary patch literal 82872 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
`@+))#)D>aPjF@&n4q#h#CX99!BjZ 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%0A?Y;# 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 literal 88725 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 z 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

Ghg^+CFHfgM#D8Tb-kBaf0{xxPTKo6{K|cR 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 bT}qNo!|ZOTlftpJ0ZMXe&%evOdH>%4n+OW= literal 15213 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 diff --git a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs index 2624bc17..0e2be5f9 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginDef.cs @@ -6,14 +6,15 @@ public class PluginDef public string Name { get; set; } public string Description { get; set; } public string Assembly { get; set; } + [JsonPropertyName("is_core")] - public bool IsCore => Assembly == "BotSharp.Core" || Assembly == "BotSharp.Core.SideCar"; + public bool IsCore => Assembly?.StartsWith("BotSharp.Core") == true; [JsonPropertyName("icon_url")] public string? IconUrl { get; set; } [JsonPropertyName("agent_ids")] - public string[] AgentIds { get; set; } = new string[0]; + public string[] AgentIds { get; set; } = []; [JsonPropertyName("settings_name")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] From 5c7af586ecea191f4c81b2c8b1499277354ff6e6 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Wed, 11 Dec 2024 16:02:22 -0600 Subject: [PATCH 085/100] crontab only allow 1 minute. --- .../Crontab/Models/ScheduleTaskArgs.cs | 3 + .../Functions/ScheduleTaskFn.cs | 39 +++++++++---- .../Services/CrontabService.cs | 10 +--- .../Services/CrontabWatcher.cs | 4 +- .../functions/util-crontab-schedule_task.json | 10 +++- .../util-crontab-schedule_task.fn.liquid | 3 +- .../agent.json | 2 +- .../reasoner.one-step-forward.liquid | 3 +- .../agent.json | 2 +- .../Helpers/SqlDriverHelper.cs | 6 +- .../Hooks/SqlDriverCrontabHook.cs | 55 +++++++++---------- 11 files changed, 79 insertions(+), 58 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs index df11160a..af28374a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/ScheduleTaskArgs.cs @@ -5,6 +5,9 @@ public class ScheduleTaskArgs [JsonPropertyName("cron_expression")] public string Cron { get; set; } = null!; + [JsonPropertyName("less_than_60_seconds")] + public bool LessThan60Seconds { get; set; } = false; + [JsonPropertyName("title")] public string Title { get; set; } = null!; diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs index 87a1bad6..b538cb3d 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Functions/ScheduleTaskFn.cs @@ -18,22 +18,37 @@ public class ScheduleTaskFn : IFunctionCallback public async Task Execute(RoleDialogModel message) { var args = JsonSerializer.Deserialize(message.FunctionArgs); + if (args.LessThan60Seconds) + { + message.Content = "Cron expression should not include seconds."; + return false; + } var routing = _services.GetRequiredService(); var user = _services.GetRequiredService(); - var crontabItem = new CrontabItem - { - Title = args.Title, - Description = args.Description, - Cron = args.Cron, - UserId = user.Id, - AgentId = routing.EntryAgentId, - ConversationId = routing.ConversationId, - Tasks = args.Tasks, - }; - var db = _services.GetRequiredService(); - // var ret = db.UpsertCrontabItem(crontabItem); + + if (string.IsNullOrEmpty(args.Cron)) + { + var ret = db.DeleteCrontabItem(routing.ConversationId); + message.Content = $"Task schedule canceled result: {ret}"; + } + else + { + var crontabItem = new CrontabItem + { + Title = args.Title, + Description = args.Description, + Cron = args.Cron, + UserId = user.Id, + AgentId = routing.EntryAgentId, + ConversationId = routing.ConversationId, + Tasks = args.Tasks, + }; + + var ret = db.UpsertCrontabItem(crontabItem); + message.Content = $"Task scheduled result: {ret}"; + } return true; } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs index e5e68cc0..78b737a0 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabService.cs @@ -15,6 +15,7 @@ ******************************************************************************/ using BotSharp.Abstraction.Repositories; +using BotSharp.Core.Infrastructures; using Microsoft.Extensions.Logging; namespace BotSharp.Core.Crontab.Services; @@ -45,14 +46,9 @@ public class CrontabService : ICrontabService { _logger.LogDebug($"ScheduledTimeArrived {item}"); - var hooks = _services.GetServices(); - foreach(var hook in hooks) - { - await hook.OnCronTriggered(item); - } - /*await HookEmitter.Emit(_services, async hook => + await HookEmitter.Emit(_services, async hook => await hook.OnCronTriggered(item) - );*/ + ); await Task.Delay(1000 * 10); } } diff --git a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs index a7db1220..5a48f58b 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs +++ b/src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs @@ -48,9 +48,11 @@ public class CrontabWatcher : BackgroundService { try { + // strip seconds from cron expression + item.Cron = string.Join(" ", item.Cron.Split(' ').TakeLast(5)); var schedule = CrontabSchedule.Parse(item.Cron, new CrontabSchedule.ParseOptions { - IncludingSeconds = true // Ensure you account for seconds + IncludingSeconds = false // Ensure you account for seconds }); // Get the current time diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json index 320f4d71..04131fe1 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-crontab-schedule_task.json @@ -1,12 +1,16 @@ { "name": "util-crontab-schedule_task", - "description": "Set up a scheduled task", + "description": "Set up or cancel a scheduled task", "parameters": { "type": "object", "properties": { "cron_expression": { "type": "string", - "description": "cron expression include seconds" + "description": "cron expression. Set value as empty if user wants to cancel schedule." + }, + "less_than_60_seconds": { + "type": "boolean", + "description": "whether schedule interval is less than 60 seconds" }, "title": { "type": "string", @@ -39,6 +43,6 @@ } } }, - "required": [ "cron_expression", "title", "description", "to_do_list" ] + "required": [ "cron_expression", "include_seconds", "title", "description", "to_do_list" ] } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid index 0c132546..17f9cc86 100644 --- a/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid +++ b/src/Infrastructure/BotSharp.Core.Crontab/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/util-crontab-schedule_task.fn.liquid @@ -1 +1,2 @@ -Call schedule_task if user needs to set up a scheduled task with appropriate programming script and language type. \ No newline at end of file +Call util-crontab-schedule_task if user needs to set up a scheduled task with appropriate programming script and language type. +Set cron_expression as empty if user wants to cancel schedule. \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json index ae99df17..cfd0d779 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json @@ -16,7 +16,7 @@ }, { "type": "planner", - "field": "Sequential-Planner" + "field": "Two-Stage-Planner" } ] } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid index dd6fe616..a492175b 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/reasoner.one-step-forward.liquid @@ -1,2 +1,3 @@ Analyze the user's problem. Which prerequisite task needs to be completed? Output the next step of routing instructions. -Check the job responsibilities of the routable Agent and do not transfer to an Agent that exceeds the scope of responsibility. \ No newline at end of file +Check the job responsibilities of the routable Agent and do not transfer to an Agent that exceeds the scope of responsibility. +If the user request may require other tools or services, route to the planner agent. diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json index 59231a43..68a8d48b 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/3e75e818-a139-48a8-9e22-4662548c13a3/agent.json @@ -1,7 +1,7 @@ { "id": "3e75e818-a139-48a8-9e22-4662548c13a3", "name": "Sequential-Planner", - "description": "Plan an ordered plan steps to execute some tasks in a predefined order by the user", + "description": "Plan an execution steps for the user complex task, especially if the tasks are in a predefined order by the user", "type": "planning", "createdDateTime": "2023-08-27T10:39:00Z", "updatedDateTime": "2023-08-27T14:39:00Z", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs index 3049b754..b8576c83 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Helpers/SqlDriverHelper.cs @@ -5,15 +5,15 @@ internal static class SqlDriverHelper internal static string GetDatabaseType(IServiceProvider services) { var settings = services.GetRequiredService(); - var dbType = "MySQL"; + var dbType = "mysql"; if (!string.IsNullOrWhiteSpace(settings?.SqlServerConnectionString)) { - dbType = "SQL Server"; + dbType = "sqlserver"; } else if (!string.IsNullOrWhiteSpace(settings?.SqlLiteConnectionString)) { - dbType = "SQL Lite"; + dbType = "sqllite"; } return dbType; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs index 7f645cd9..985da6b8 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverCrontabHook.cs @@ -17,38 +17,37 @@ public class SqlDriverCrontabHook : ICrontabHook public async Task OnCronTriggered(CrontabItem item) { - /*var conv = _services.GetRequiredService(); - conv.SetConversationId("abd9df25-2210-4e4d-80d7-48b6a3b905a8", []); + var conv = _services.GetRequiredService(); + conv.SetConversationId(item.ConversationId, []); - if (item.Language == "text") - { - var sidecar = _services.GetService(); - var response = await sidecar.SendMessage(BuiltInAgentId.AIAssistant, item.Description, states: new List()); - return; - } - else if (item.Language != "sql") - { - return; - } + _logger.LogWarning($"Crontab item triggered: {item.Title}. {item.Description}"); - _logger.LogWarning($"Crontab item triggered: {item.Topic}. Run {item.Language}: {item.Script}"); - - var message = new RoleDialogModel(AgentRole.User, $"Run the query") + foreach (var task in item.Tasks) { - FunctionName = "sql_select", - FunctionArgs = JsonSerializer.Serialize(new SqlStatement + if (task.Language == "text") { - Statement = item.Script, - Reason = item.Description - }) - }; - var routing = _services.GetRequiredService(); - routing.Context.Push("ec46f15b-8790-400f-a37f-1e7995b7d6e2"); - await routing.InvokeFunction("sql_select", message); + var sidecar = _services.GetService(); + var response = await sidecar.SendMessage(BuiltInAgentId.AIAssistant, $"{item.ExecutionResult}\r\n{task.Script}", states: new List()); + } + else if (task.Language == "sql") + { + var message = new RoleDialogModel(AgentRole.User, $"Run the query") + { + FunctionName = "sql_select", + FunctionArgs = JsonSerializer.Serialize(new SqlStatement + { + Statement = task.Script, + Reason = item.Description + }) + }; + var routing = _services.GetRequiredService(); + routing.Context.Push(BuiltInAgentId.SqlDriver); + await routing.InvokeFunction("sql_select", message); - item.ConversationId = conv.ConversationId; - item.AgentId = BuiltInAgentId.SqlDriver; - item.UserId = "41021346"; - item.ExecutionResult = message.Content;*/ + item.AgentId = BuiltInAgentId.SqlDriver; + item.UserId = "41021346"; + item.ExecutionResult += message.Content + "\r\n"; + } + } } } From 1e974441ff47ec43658492e15cb64549900b0dab Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Wed, 11 Dec 2024 17:16:59 -0800 Subject: [PATCH 086/100] ChatHubConversationHook priority --- .../Conversations/ConversationHookBase.cs | 18 +++++++----------- .../ConversationService.SendMessage.cs | 6 ++---- .../Hooks/ChatHubConversationHook.cs | 1 + 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookBase.cs index 9239b865..da87646e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookBase.cs @@ -2,27 +2,23 @@ namespace BotSharp.Abstraction.Conversations; public abstract class ConversationHookBase : IConversationHook { - protected Agent _agent; - public Agent Agent => _agent; + public Agent Agent { get; private set; } - protected Conversation _conversation; - public Conversation Conversation => _conversation; + public Conversation Conversation { get; private set; } - protected List _dialogs; - public List Dialogs => _dialogs; + public List Dialogs { get; private set; } - protected int _priority = 0; - public int Priority => _priority; + public int Priority { get; protected set; } = 0; public IConversationHook SetAgent(Agent agent) { - _agent = agent; + Agent = agent; return this; } public IConversationHook SetConversation(Conversation conversation) { - _conversation = conversation; + Conversation = conversation; return this; } @@ -37,7 +33,7 @@ public abstract class ConversationHookBase : IConversationHook public virtual Task OnDialogsLoaded(List dialogs) { - _dialogs = dialogs; + Dialogs = dialogs; return Task.CompletedTask; } diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs index 375cf3e6..bdf43c8a 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs @@ -28,7 +28,7 @@ public partial class ConversationService var dialogs = conv.GetDialogHistory(); var statistics = _services.GetRequiredService(); - var hooks = _services.GetServices().ToList(); + var hookProvider = _services.GetRequiredService(); RoleDialogModel response = message; bool stopCompletion = false; @@ -44,9 +44,7 @@ public partial class ConversationService message.Payload = replyMessage.Payload; } - // Before chat completion hook - hooks = ReOrderConversationHooks(hooks); - foreach (var hook in hooks) + foreach (var hook in hookProvider.HooksOrderByPriority) { hook.SetAgent(agent) .SetConversation(conversation); diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs index b282fa53..6b425b4b 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs @@ -29,6 +29,7 @@ public class ChatHubConversationHook : ConversationHookBase _chatHub = chatHub; _user = user; _options = options; + Priority = -1; // Make sure this hook is the top one. } public override async Task OnConversationInitialized(Conversation conversation) From 4489683eebbc82720d2ab676dde9660fc7ba8998 Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Wed, 11 Dec 2024 17:44:29 -0800 Subject: [PATCH 087/100] access public properties directly --- .../Evaluations/EvaluationConversationHook.cs | 22 +++++++++---------- .../Hooks/RateLimitConversationHook.cs | 2 +- .../RoutingConversationHook.cs | 6 ++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Evaluations/EvaluationConversationHook.cs b/src/Infrastructure/BotSharp.Core/Evaluations/EvaluationConversationHook.cs index bfc0c1ec..b315b683 100644 --- a/src/Infrastructure/BotSharp.Core/Evaluations/EvaluationConversationHook.cs +++ b/src/Infrastructure/BotSharp.Core/Evaluations/EvaluationConversationHook.cs @@ -15,45 +15,45 @@ public class EvaluationConversationHook : ConversationHookBase public override Task OnMessageReceived(RoleDialogModel message) { - if (_conversation != null && _convSettings.EnableExecutionLog) + if (Conversation != null && _convSettings.EnableExecutionLog) { - _logger.Append(_conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}"); + _logger.Append(Conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}"); } return base.OnMessageReceived(message); } public override Task OnFunctionExecuted(RoleDialogModel message) { - if (_conversation != null && _convSettings.EnableExecutionLog) + if (Conversation != null && _convSettings.EnableExecutionLog) { - _logger.Append(_conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.FunctionName}({message.FunctionArgs}) => {message.Content}"); + _logger.Append(Conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.FunctionName}({message.FunctionArgs}) => {message.Content}"); } return base.OnFunctionExecuted(message); } public override Task OnResponseGenerated(RoleDialogModel message) { - if (_conversation != null && _convSettings.EnableExecutionLog) + if (Conversation != null && _convSettings.EnableExecutionLog) { - _logger.Append(_conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}"); - } + _logger.Append(Conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}"); + } return base.OnResponseGenerated(message); } public override Task OnHumanInterventionNeeded(RoleDialogModel message) { - if (_conversation != null && _convSettings.EnableExecutionLog) + if (Conversation != null && _convSettings.EnableExecutionLog) { - _logger.Append(_conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})"); + _logger.Append(Conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})"); } return base.OnHumanInterventionNeeded(message); } public override Task OnConversationEnding(RoleDialogModel message) { - if (_conversation != null && _convSettings.EnableExecutionLog) + if (Conversation != null && _convSettings.EnableExecutionLog) { - _logger.Append(_conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})"); + _logger.Append(Conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})"); } return base.OnConversationEnding(message); } diff --git a/src/Infrastructure/BotSharp.Logger/Hooks/RateLimitConversationHook.cs b/src/Infrastructure/BotSharp.Logger/Hooks/RateLimitConversationHook.cs index 1cb09f3e..a9a9478f 100644 --- a/src/Infrastructure/BotSharp.Logger/Hooks/RateLimitConversationHook.cs +++ b/src/Infrastructure/BotSharp.Logger/Hooks/RateLimitConversationHook.cs @@ -34,7 +34,7 @@ public class RateLimitConversationHook : ConversationHookBase } // Check message sending frequency - var userSents = _dialogs.Where(x => x.Role == AgentRole.User) + var userSents = Dialogs.Where(x => x.Role == AgentRole.User) .TakeLast(2).ToList(); if (userSents.Count > 1) diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingConversationHook.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingConversationHook.cs index b7fab29e..b65e45c5 100644 --- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingConversationHook.cs +++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/RoutingConversationHook.cs @@ -42,7 +42,7 @@ public class RoutingConversationHook: ConversationHookBase // Render by template var templateService = _services.GetRequiredService(); - var response = await templateService.RenderIntentResponse(_agent.Id, message); + var response = await templateService.RenderIntentResponse(Agent.Id, message); if (!string.IsNullOrEmpty(response)) { @@ -54,7 +54,7 @@ public class RoutingConversationHook: ConversationHookBase public override async Task OnResponseGenerated(RoleDialogModel message) { var routerSettings = _services.GetRequiredService(); - bool saveFlag = _agent.Type != AgentType.Routing; + bool saveFlag = Agent.Type != AgentType.Routing; if (saveFlag) { @@ -63,7 +63,7 @@ public class RoutingConversationHook: ConversationHookBase var rootDataPath = agentService.GetDataDir(); string rawDataDir = Path.Combine(rootDataPath, "raw_data", $"agent.{message.CurrentAgentId}.txt"); - var lastThreeDialogs = _dialogs.Where(x => x.Role == AgentRole.User || x.Role == AgentRole.Assistant) + var lastThreeDialogs = Dialogs.Where(x => x.Role == AgentRole.User || x.Role == AgentRole.Assistant) .Select(x => x.Content.Replace('\r', ' ').Replace('\n', ' ')) .TakeLast(3) .ToArray(); From 96eac1f26ffcfa6c7013f923e8aac21c14e48ffc Mon Sep 17 00:00:00 2001 From: Gil Zhang Date: Thu, 12 Dec 2024 11:28:00 +0800 Subject: [PATCH 088/100] Add Conversation Title Alias --- .../Conversations/IConversationService.cs | 1 + .../Conversations/Models/Conversation.cs | 1 + .../Filters/ConversationFilter.cs | 1 + .../Repositories/IBotSharpRepository.cs | 1 + .../Services/ConversationService.cs | 8 +++++++ .../Repository/BotSharpDbContext.cs | 2 ++ .../FileRepository.Conversation.cs | 20 ++++++++++++++++ .../Controllers/ConversationController.cs | 24 +++++++++++++++++++ .../Conversations/ConversationViewModel.cs | 4 ++++ .../UpdateConversationTitleAliasModel.cs | 9 +++++++ .../Collections/ConversationDocument.cs | 1 + .../MongoRepository.Conversation.cs | 15 ++++++++++++ 12 files changed, 87 insertions(+) create mode 100644 src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/UpdateConversationTitleAliasModel.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs index ffb4986a..6a04e796 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs @@ -12,6 +12,7 @@ public interface IConversationService Task GetConversation(string id); Task> GetConversations(ConversationFilter filter); Task UpdateConversationTitle(string id, string title); + Task UpdateConversationTitleAlias(string id, string titleAlias); Task UpdateConversationTags(string conversationId, List tags); Task UpdateConversationMessage(string conversationId, UpdateMessageRequest request); Task> GetLastConversations(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs index 5ded2c7c..a485a9c4 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/Conversation.cs @@ -13,6 +13,7 @@ public class Conversation /// public string? TaskId { get; set; } public string Title { get; set; } = string.Empty; + public string TitleAlias { get; set; } = string.Empty; [JsonIgnore] public List Dialogs { get; set; } = new(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs index ab1a0a9f..23543049 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/Filters/ConversationFilter.cs @@ -8,6 +8,7 @@ public class ConversationFilter /// public string? Id { get; set; } public string? Title { get; set; } + public string? TitleAlias { get; set; } public string? AgentId { get; set; } public string? Status { get; set; } public string? Channel { get; set; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 61982cc4..fa6f074c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -86,6 +86,7 @@ public interface IBotSharpRepository : IHaveServiceProvider Conversation GetConversation(string conversationId); PagedItems GetConversations(ConversationFilter filter); void UpdateConversationTitle(string conversationId, string title); + void UpdateConversationTitleAlias(string conversationId, string titleAlias); bool UpdateConversationTags(string conversationId, List tags); bool UpdateConversationMessage(string conversationId, UpdateMessageRequest request); void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint); diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index 55d80c18..67b0b1b0 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -51,6 +51,14 @@ public partial class ConversationService : IConversationService return conversation; } + public async Task UpdateConversationTitleAlias(string id, string titleAlias) + { + var db = _services.GetRequiredService(); + db.UpdateConversationTitleAlias(id, titleAlias); + var conversation = db.GetConversation(id); + return conversation; + } + public async Task UpdateConversationTags(string conversationId, List tags) { var db = _services.GetRequiredService(); diff --git a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs index d2c519eb..165dc34b 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs @@ -105,6 +105,8 @@ public class BotSharpDbContext : Database, IBotSharpRepository public void UpdateConversationTitle(string conversationId, string title) => throw new NotImplementedException(); + public void UpdateConversationTitleAlias(string conversationId, string titleAlias) + => throw new NotImplementedException(); public bool UpdateConversationTags(string conversationId, List tags) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs index fd13936c..34345271 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -134,6 +134,22 @@ namespace BotSharp.Core.Repository } } } + public void UpdateConversationTitleAlias(string conversationId, string titleAlias) + { + var convDir = FindConversationDirectory(conversationId); + if (!string.IsNullOrEmpty(convDir)) + { + var convFile = Path.Combine(convDir, CONVERSATION_FILE); + var content = File.ReadAllText(convFile); + var record = JsonSerializer.Deserialize(content, _options); + if (record != null) + { + record.TitleAlias = titleAlias; + record.UpdatedTime = DateTime.UtcNow; + File.WriteAllText(convFile, JsonSerializer.Serialize(record, _options)); + } + } + } public bool UpdateConversationTags(string conversationId, List tags) { @@ -356,6 +372,10 @@ namespace BotSharp.Core.Repository { matched = matched && record.Title.Contains(filter.Title); } + if (filter?.TitleAlias != null) + { + matched = matched && record.TitleAlias.Contains(filter.TitleAlias); + } if (filter?.AgentId != null) { matched = matched && record.AgentId == filter.AgentId; diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 389bf96f..266c5ac5 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -223,6 +223,30 @@ public class ConversationController : ControllerBase return response != null; } + [HttpPut("/conversation/{conversationId}/update-title-alias")] + public async Task UpdateConversationTitleAlias([FromRoute] string conversationId, [FromBody] UpdateConversationTitleAliasModel newTile) + { + var userService = _services.GetRequiredService(); + var conversationService = _services.GetRequiredService(); + + var user = await userService.GetUser(_user.Id); + var filter = new ConversationFilter + { + Id = conversationId, + UserId = user.Role != UserRole.Admin ? user.Id : null + }; + var conversations = await conversationService.GetConversations(filter); + + if (conversations.Items.IsNullOrEmpty()) + { + return false; + } + + var response = await conversationService.UpdateConversationTitleAlias(conversationId, newTile.NewTitleAlias); + return response != null; + } + + [HttpPut("/conversation/{conversationId}/update-tags")] public async Task UpdateConversationTags([FromRoute] string conversationId, [FromBody] UpdateConversationRequest request) { diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs index 90b4ff67..a660a525 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ConversationViewModel.cs @@ -15,6 +15,9 @@ public class ConversationViewModel [JsonPropertyName("title")] public string Title { get; set; } = string.Empty; + [JsonPropertyName("title_alias")] + public string TitleAlias { get; set; } = string.Empty; + public UserViewModel User { get; set; } = new UserViewModel(); public string Event { get; set; } @@ -48,6 +51,7 @@ public class ConversationViewModel }, AgentId = sess.AgentId, Title = sess.Title, + TitleAlias = sess.TitleAlias, Channel = sess.Channel, Status = sess.Status, TaskId = sess.TaskId, diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/UpdateConversationTitleAliasModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/UpdateConversationTitleAliasModel.cs new file mode 100644 index 00000000..5d9ac2fd --- /dev/null +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/UpdateConversationTitleAliasModel.cs @@ -0,0 +1,9 @@ +using System.ComponentModel.DataAnnotations; + +namespace BotSharp.OpenAPI.ViewModels.Conversations; + +public class UpdateConversationTitleAliasModel +{ + [Required] + public string NewTitleAlias { get; set; } +} diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDocument.cs index 28b0391a..52c26b52 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/ConversationDocument.cs @@ -6,6 +6,7 @@ public class ConversationDocument : MongoBase public string UserId { get; set; } public string? TaskId { get; set; } public string Title { get; set; } + public string TitleAlias { get; set; } public string Channel { get; set; } public string ChannelId { get; set; } public string Status { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index cdd78ae2..468f467a 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -114,6 +114,17 @@ public partial class MongoRepository _dc.Conversations.UpdateOne(filterConv, updateConv); } + public void UpdateConversationTitleAlias(string conversationId, string titleAlias) + { + if (string.IsNullOrEmpty(conversationId)) return; + + var filterConv = Builders.Filter.Eq(x => x.Id, conversationId); + var updateConv = Builders.Update + .Set(x => x.UpdatedTime, DateTime.UtcNow) + .Set(x => x.TitleAlias, titleAlias); + + _dc.Conversations.UpdateOne(filterConv, updateConv); + } public bool UpdateConversationTags(string conversationId, List tags) { @@ -301,6 +312,10 @@ public partial class MongoRepository { convFilters.Add(convBuilder.Regex(x => x.Title, new BsonRegularExpression(filter.Title, "i"))); } + if (!string.IsNullOrEmpty(filter?.TitleAlias)) + { + convFilters.Add(convBuilder.Regex(x => x.Title, new BsonRegularExpression(filter.TitleAlias, "i"))); + } if (!string.IsNullOrEmpty(filter?.AgentId)) { convFilters.Add(convBuilder.Eq(x => x.AgentId, filter.AgentId)); From 7f6845b2686b5a431f361dd17947afc85ee8ea11 Mon Sep 17 00:00:00 2001 From: "songguo.zeng" Date: Thu, 12 Dec 2024 16:02:09 +0800 Subject: [PATCH 089/100] AII-400 --- .../Agents/AgentHookBase.cs | 5 ++++ .../BotSharp.Abstraction/Agents/IAgentHook.cs | 2 ++ .../Agents/Services/AgentService.LoadAgent.cs | 27 ++++++++++++++++--- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index a3746ca8..f4d30523 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -56,4 +56,9 @@ public abstract class AgentHookBase : IAgentHook public virtual void OnAgentUtilityLoaded(Agent agent) { } + + public virtual void OnAgentLoadFilter(Agent agent) + { + + } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs index a3f53fb6..a329134b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs @@ -33,4 +33,6 @@ public interface IAgentHook /// /// void OnAgentLoaded(Agent agent); + + void OnAgentLoadFilter(Agent agent); } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs index 396a7d15..3ae49385 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs @@ -5,9 +5,8 @@ namespace BotSharp.Core.Agents.Services; public partial class AgentService { - public static ConcurrentDictionary> AgentParameterTypes = new(); + public static ConcurrentDictionary> AgentParameterTypes = new(); - [MemoryCache(10 * 60, perInstanceCache: true)] public async Task LoadAgent(string id) { if (string.IsNullOrEmpty(id) || id == Guid.Empty.ToString()) @@ -15,6 +14,26 @@ public partial class AgentService return null; } + Agent agent = await GetLoadAgent(id); + OnAgentLoadFilter(agent); + return agent; + } + + private void OnAgentLoadFilter(Agent? agent) + { + if (agent != null && agent.Type == AgentType.Routing) + { + var hooks = _services.GetServices(); + foreach (var hook in hooks) + { + hook.OnAgentLoadFilter(agent); + } + } + } + + [MemoryCache(10 * 60, perInstanceCache: true)] + private async Task GetLoadAgent(string id) + { var hooks = _services.GetServices(); // Before agent is loaded. @@ -106,14 +125,14 @@ public partial class AgentService { var agentId = agent.Id ?? agent.Name; if (AgentParameterTypes.ContainsKey(agentId)) return; - + AddOrUpdateRoutesParameters(agentId, agent.RoutingRules); AddOrUpdateFunctionsParameters(agentId, agent.Functions); } private void AddOrUpdateRoutesParameters(string agentId, List routingRules) { - if(!AgentParameterTypes.TryGetValue(agentId, out var parameterTypes)) + if (!AgentParameterTypes.TryGetValue(agentId, out var parameterTypes)) { parameterTypes = new(); } From 8d8fd758d934952f4f980b7b10ae71401d8f5a1a Mon Sep 17 00:00:00 2001 From: "songguo.zeng" Date: Thu, 12 Dec 2024 18:02:00 +0800 Subject: [PATCH 090/100] AII-400 --- .../Agents/AgentHookBase.cs | 5 ----- .../BotSharp.Abstraction/Agents/IAgentHook.cs | 2 -- .../Agents/Services/AgentService.LoadAgent.cs | 21 +------------------ 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs index f4d30523..a3746ca8 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/AgentHookBase.cs @@ -56,9 +56,4 @@ public abstract class AgentHookBase : IAgentHook public virtual void OnAgentUtilityLoaded(Agent agent) { } - - public virtual void OnAgentLoadFilter(Agent agent) - { - - } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs index a329134b..a3f53fb6 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentHook.cs @@ -33,6 +33,4 @@ public interface IAgentHook /// /// void OnAgentLoaded(Agent agent); - - void OnAgentLoadFilter(Agent agent); } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs index 3ae49385..0e9c2e3c 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.LoadAgent.cs @@ -7,6 +7,7 @@ public partial class AgentService { public static ConcurrentDictionary> AgentParameterTypes = new(); + [MemoryCache(10 * 60, perInstanceCache: true)] public async Task LoadAgent(string id) { if (string.IsNullOrEmpty(id) || id == Guid.Empty.ToString()) @@ -14,26 +15,6 @@ public partial class AgentService return null; } - Agent agent = await GetLoadAgent(id); - OnAgentLoadFilter(agent); - return agent; - } - - private void OnAgentLoadFilter(Agent? agent) - { - if (agent != null && agent.Type == AgentType.Routing) - { - var hooks = _services.GetServices(); - foreach (var hook in hooks) - { - hook.OnAgentLoadFilter(agent); - } - } - } - - [MemoryCache(10 * 60, perInstanceCache: true)] - private async Task GetLoadAgent(string id) - { var hooks = _services.GetServices(); // Before agent is loaded. From 6efe291526cf0e7b8a747ae25a0821e7846aebbe Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 12 Dec 2024 17:20:27 -0600 Subject: [PATCH 091/100] allow image urls in image-reader --- .../Functions/ReadImageFn.cs | 18 +++++++++++++++--- .../LlmContexts/LlmContextIn.cs | 8 ++++++++ .../functions/util-file-read_image.json | 8 ++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs index f2e79b21..9918d5bf 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs @@ -23,8 +23,8 @@ public class ReadImageFn : IFunctionCallback var agentService = _services.GetRequiredService(); var wholeDialogs = conv.GetDialogHistory(); - var dialogs = AssembleFiles(conv.ConversationId, wholeDialogs); - var agent = await agentService.LoadAgent(BuiltInAgentId.UtilityAssistant); + var dialogs = AssembleFiles(conv.ConversationId, args?.ImageUrls, wholeDialogs); + var agent = await agentService.LoadAgent(message.CurrentAgentId ?? BuiltInAgentId.UtilityAssistant); var fileAgent = new Agent { Id = agent?.Id ?? Guid.Empty.ToString(), @@ -38,7 +38,7 @@ public class ReadImageFn : IFunctionCallback return true; } - private List AssembleFiles(string conversationId, List dialogs) + private List AssembleFiles(string conversationId, IEnumerable? imageUrls, List dialogs) { if (dialogs.IsNullOrEmpty()) { @@ -66,6 +66,18 @@ public class ReadImageFn : IFunctionCallback }).ToList(); } + if (!imageUrls.IsNullOrEmpty()) + { + var lastDialog = dialogs.Last(); + var files = lastDialog.Files ?? []; + var addnFiles = imageUrls.Select(x => x?.Trim()) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Select(x => new BotSharpFile { FileUrl = x }).ToList(); + + files.AddRange(addnFiles); + lastDialog.Files = files; + } + return dialogs; } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/LlmContexts/LlmContextIn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/LlmContexts/LlmContextIn.cs index 9917cb74..a35e83bd 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/LlmContexts/LlmContextIn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/LlmContexts/LlmContextIn.cs @@ -11,4 +11,12 @@ public class LlmContextIn [JsonPropertyName("image_description")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ImageDescription { get; set; } + + //[JsonPropertyName("image_url")] + //[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + //public string? ImageUrl { get; set; } + + [JsonPropertyName("image_urls")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public IEnumerable? ImageUrls { get; set; } } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json index a0f269a0..b8dda8b1 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-read_image.json @@ -7,6 +7,14 @@ "user_request": { "type": "string", "description": "The request posted by user, which is related to analyzing requested images. User can request for multiple images to process at one time." + }, + "image_urls": { + "type": "array", + "description": "The image, photo or picture urls that user requests for analysis. They typically start with 'http' or 'https'. If user doesn't include any url, then leave this array empty. Please remove any duplicated urls", + "items": { + "type": "string", + "description": "The image, photo or picture url that user requests for analysis. It typically starts with http or https." + } } }, "required": [ "user_request" ] From 51a319a3bc3e3032e68ddb13e41168bbc7fe1ae1 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 12 Dec 2024 17:22:11 -0600 Subject: [PATCH 092/100] minor change --- .../BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs index 9918d5bf..e2c4f8c2 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/ReadImageFn.cs @@ -24,7 +24,8 @@ public class ReadImageFn : IFunctionCallback var wholeDialogs = conv.GetDialogHistory(); var dialogs = AssembleFiles(conv.ConversationId, args?.ImageUrls, wholeDialogs); - var agent = await agentService.LoadAgent(message.CurrentAgentId ?? BuiltInAgentId.UtilityAssistant); + var agentId = !string.IsNullOrWhiteSpace(message.CurrentAgentId) ? message.CurrentAgentId : BuiltInAgentId.UtilityAssistant; + var agent = await agentService.LoadAgent(agentId); var fileAgent = new Agent { Id = agent?.Id ?? Guid.Empty.ToString(), From f78425cffab83f0ccd86a034fbfa740bdf6542b5 Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Thu, 12 Dec 2024 20:44:26 -0800 Subject: [PATCH 093/100] added unit test --- tests/UnitTest/MainTest.cs | 30 ++++++++++++++++++++++++++++++ tests/UnitTest/UnitTest.csproj | 8 +++++++- tests/UnitTest/UnitTest1.cs | 11 ----------- 3 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 tests/UnitTest/MainTest.cs delete mode 100644 tests/UnitTest/UnitTest1.cs diff --git a/tests/UnitTest/MainTest.cs b/tests/UnitTest/MainTest.cs new file mode 100644 index 00000000..2e4c29bf --- /dev/null +++ b/tests/UnitTest/MainTest.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.DependencyInjection; +using BotSharp.Abstraction.Conversations; +using BotSharp.Core.Evaluations; +using BotSharp.Plugin.ChatHub.Hooks; + +namespace UnitTest +{ + [TestClass] + public class MainTest + { + [TestMethod] + public void TestConversationHookProvider() + { + var services = new ServiceCollection(); + + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + var serviceProvider = services.BuildServiceProvider(); + var conversationHookProvider = serviceProvider.GetService(); + + Assert.AreEqual(3, conversationHookProvider.Hooks.Count()); + + // ChatHubConversationHook has the top priority + Assert.IsInstanceOfType(conversationHookProvider.HooksOrderByPriority.FirstOrDefault()); + } + } +} \ No newline at end of file diff --git a/tests/UnitTest/UnitTest.csproj b/tests/UnitTest/UnitTest.csproj index be924573..3e1831ae 100644 --- a/tests/UnitTest/UnitTest.csproj +++ b/tests/UnitTest/UnitTest.csproj @@ -13,10 +13,16 @@ + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + + diff --git a/tests/UnitTest/UnitTest1.cs b/tests/UnitTest/UnitTest1.cs deleted file mode 100644 index ab3cd866..00000000 --- a/tests/UnitTest/UnitTest1.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace UnitTest -{ - [TestClass] - public class UnitTest1 - { - [TestMethod] - public void TestMethod1() - { - } - } -} \ No newline at end of file From 42ad511c7e3c58a0bc9a9d9ae6555b840783e8c3 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 13 Dec 2024 14:34:17 -0600 Subject: [PATCH 094/100] add agent max message count --- .../Agents/Enums/AgentField.cs | 3 ++- .../Agents/Models/Agent.cs | 8 ++++++ .../Repositories/IBotSharpRepository.cs | 2 +- .../Agents/Hooks/BasicAgentHook.cs | 2 +- .../Services/AgentService.UpdateAgent.cs | 1 + .../Services/ConversationService.cs | 17 +++++++++++- .../Repository/BotSharpDbContext.cs | 2 +- .../FileRepository/FileRepository.Agent.cs | 19 +++++++++++++- .../ViewModels/Agents/AgentCreationModel.cs | 3 +++ .../ViewModels/Agents/AgentUpdateModel.cs | 4 +++ .../ViewModels/Agents/AgentViewModel.cs | 5 ++++ .../Collections/AgentDocument.cs | 1 + .../Repository/MongoRepository.Agent.cs | 26 ++++++++++++++----- 13 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs index 1bb221d3..34e8ac19 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Enums/AgentField.cs @@ -17,7 +17,8 @@ public enum AgentField Response, Sample, LlmConfig, - Utility + Utility, + MaxMessageCount } public enum AgentTaskField diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs index e9fd7c5e..41b3800c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs @@ -104,6 +104,12 @@ public class Agent /// public string? InheritAgentId { get; set; } + ///

+ /// Maximum message count when load conversation + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public int? MaxMessageCount { get; set; } + public List RoutingRules { get; set; } = new(); /// @@ -133,6 +139,8 @@ public class Agent Knowledges = agent.Knowledges, IsPublic = agent.IsPublic, Disabled = agent.Disabled, + MergeUtility = agent.MergeUtility, + MaxMessageCount = agent.MaxMessageCount, Profiles = agent.Profiles, RoutingRules = agent.RoutingRules, LlmConfig = agent.LlmConfig, diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 61982cc4..a848b619 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -53,7 +53,7 @@ public interface IBotSharpRepository : IHaveServiceProvider #region Agent void UpdateAgent(Agent agent, AgentField field); - Agent? GetAgent(string agentId); + Agent? GetAgent(string agentId, bool basicsOnly = false); List GetAgents(AgentFilter filter); List GetUserAgents(string userId); void BulkInsertAgents(List agents); diff --git a/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs b/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs index 2a4a7374..65d454c8 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs @@ -47,7 +47,7 @@ public class BasicAgentHook : AgentHookBase var entryAgentId = routing.EntryAgentId; if (!string.IsNullOrEmpty(entryAgentId)) { - var entryAgent = db.GetAgent(entryAgentId); + var entryAgent = db.GetAgent(entryAgentId, basicsOnly: true); var (fns, tps) = GetUniqueContent(entryAgent?.Utilities); functionNames = functionNames.Concat(fns).Distinct().ToList(); templateNames = templateNames.Concat(tps).Distinct().ToList(); diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs index f871a2fe..ffea8f8d 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs @@ -28,6 +28,7 @@ public partial class AgentService record.IsPublic = agent.IsPublic; record.Disabled = agent.Disabled; record.MergeUtility = agent.MergeUtility; + record.MaxMessageCount = agent.MaxMessageCount; record.Type = agent.Type; record.Profiles = agent.Profiles ?? []; record.RoutingRules = agent.RoutingRules ?? []; diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index 55d80c18..d586b421 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -153,7 +153,10 @@ public partial class ConversationService : IConversationService } } - return dialogs.TakeLast(lastCount).ToList(); + var agentMsgCount = GetAgentMessageCount(); + var count = agentMsgCount.HasValue && agentMsgCount.Value > 0 ? agentMsgCount.Value : lastCount; + + return dialogs.TakeLast(count).ToList(); } public void SetConversationId(string conversationId, List states, bool isReadOnly = false) @@ -192,4 +195,16 @@ public partial class ConversationService : IConversationService { return !string.IsNullOrWhiteSpace(_conversationId); } + + + private int? GetAgentMessageCount() + { + var db = _services.GetRequiredService(); + var routingCtx = _services.GetRequiredService(); + + if (string.IsNullOrEmpty(routingCtx.EntryAgentId)) return null; + + var agent = db.GetAgent(routingCtx.EntryAgentId, basicsOnly: true); + return agent?.MaxMessageCount; + } } diff --git a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs index d2c519eb..ad2b19b8 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs @@ -16,7 +16,7 @@ public class BotSharpDbContext : Database, IBotSharpRepository #endregion #region Agent - public Agent GetAgent(string agentId) + public Agent GetAgent(string agentId, bool basicsOnly = false) => throw new NotImplementedException(); public List GetAgents(AgentFilter filter) diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs index 07915917..a838870f 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Agent.cs @@ -57,6 +57,9 @@ namespace BotSharp.Core.Repository case AgentField.Utility: UpdateAgentUtilities(agent.Id, agent.MergeUtility, agent.Utilities); break; + case AgentField.MaxMessageCount: + UpdateAgentMaxMessageCount(agent.Id, agent.MaxMessageCount); + break; case AgentField.All: UpdateAgentAllFields(agent); break; @@ -283,6 +286,17 @@ namespace BotSharp.Core.Repository File.WriteAllText(agentFile, json); } + private void UpdateAgentMaxMessageCount(string agentId, int? maxMessageCount) + { + var (agent, agentFile) = GetAgentFromFile(agentId); + if (agent == null) return; + + agent.MaxMessageCount = maxMessageCount; + agent.UpdatedDateTime = DateTime.UtcNow; + var json = JsonSerializer.Serialize(agent, _options); + File.WriteAllText(agentFile, json); + } + private void UpdateAgentAllFields(Agent inputAgent) { var (agent, agentFile) = GetAgentFromFile(inputAgent.Id); @@ -298,6 +312,7 @@ namespace BotSharp.Core.Repository agent.Utilities = inputAgent.Utilities; agent.RoutingRules = inputAgent.RoutingRules; agent.LlmConfig = inputAgent.LlmConfig; + agent.MaxMessageCount = inputAgent.MaxMessageCount; agent.UpdatedDateTime = DateTime.UtcNow; var json = JsonSerializer.Serialize(agent, _options); File.WriteAllText(agentFile, json); @@ -329,7 +344,7 @@ namespace BotSharp.Core.Repository return responses; } - public Agent? GetAgent(string agentId) + public Agent? GetAgent(string agentId, bool basicsOnly = false) { var agentDir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir); var dir = Directory.GetDirectories(agentDir).FirstOrDefault(x => x.Split(Path.DirectorySeparatorChar).Last() == agentId); @@ -342,6 +357,8 @@ namespace BotSharp.Core.Repository var record = JsonSerializer.Deserialize(json, _options); if (record == null) return null; + if (basicsOnly) return record; + var (defaultInstruction, channelInstructions) = FetchInstructions(dir); var functions = FetchFunctions(dir); var samples = FetchSamples(dir); diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs index 32b3fdce..44c257df 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs @@ -51,6 +51,8 @@ public class AgentCreationModel public bool MergeUtility { get; set; } + public int? MaxMessageCount { get; set; } + public List Utilities { get; set; } = new(); public List RoutingRules { get; set; } = new(); public AgentLlmConfig? LlmConfig { get; set; } @@ -72,6 +74,7 @@ public class AgentCreationModel Type = Type, Disabled = Disabled, MergeUtility = MergeUtility, + MaxMessageCount = MaxMessageCount, Profiles = Profiles, RoutingRules = RoutingRules?.Select(x => RoutingRuleUpdateModel.ToDomainElement(x))?.ToList() ?? new List(), LlmConfig = LlmConfig diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs index 30308c9f..141f0662 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs @@ -57,6 +57,9 @@ public class AgentUpdateModel public bool Disabled { get; set; } + [JsonPropertyName("max_message_count")] + public int? MaxMessageCount { get; set; } + /// /// Profile by channel /// @@ -77,6 +80,7 @@ public class AgentUpdateModel IsPublic = IsPublic, Disabled = Disabled, MergeUtility = MergeUtility, + MaxMessageCount = MaxMessageCount, Type = Type, Profiles = Profiles ?? new List(), RoutingRules = RoutingRules?.Select(x => RoutingRuleUpdateModel.ToDomainElement(x))?.ToList() ?? new List(), diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs index 34b1bcc1..36a8900f 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentViewModel.cs @@ -46,6 +46,10 @@ public class AgentViewModel [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public AgentLlmConfig? LlmConfig { get; set; } + [JsonPropertyName("max_message_count")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public int? MaxMessageCount { get; set; } + public PluginDef Plugin { get; set; } public IEnumerable? Actions { get; set; } @@ -75,6 +79,7 @@ public class AgentViewModel Disabled = agent.Disabled, MergeUtility = agent.MergeUtility, IconUrl = agent.IconUrl, + MaxMessageCount = agent.MaxMessageCount, Profiles = agent.Profiles ?? new List(), RoutingRules = agent.RoutingRules, LlmConfig = agent.LlmConfig, diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs index 76fee1b3..3a775025 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/AgentDocument.cs @@ -11,6 +11,7 @@ public class AgentDocument : MongoBase public bool IsPublic { get; set; } public bool Disabled { get; set; } public bool MergeUtility { get; set; } + public int? MaxMessageCount { get; set; } public List ChannelInstructions { get; set; } public List Templates { get; set; } public List Functions { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs index 7f216b6d..9bd72e3e 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Agent.cs @@ -9,7 +9,7 @@ public partial class MongoRepository { public void UpdateAgent(Agent agent, AgentField field) { - if (agent == null || string.IsNullOrEmpty(agent.Id)) return; + if (agent == null || string.IsNullOrWhiteSpace(agent.Id)) return; switch (field) { @@ -58,6 +58,9 @@ public partial class MongoRepository case AgentField.Utility: UpdateAgentUtilities(agent.Id, agent.MergeUtility, agent.Utilities); break; + case AgentField.MaxMessageCount: + UpdateAgentMaxMessageCount(agent.Id, agent.MaxMessageCount); + break; case AgentField.All: UpdateAgentAllFields(agent); break; @@ -158,10 +161,8 @@ public partial class MongoRepository private void UpdateAgentInstructions(string agentId, string instruction, List? channelInstructions) { - if (string.IsNullOrWhiteSpace(agentId)) return; - var instructionElements = channelInstructions?.Select(x => ChannelInstructionMongoElement.ToMongoElement(x))? - .ToList() ?? new List(); + .ToList() ?? []; var filter = Builders.Filter.Eq(x => x.Id, agentId); var update = Builders.Update @@ -200,7 +201,7 @@ public partial class MongoRepository private void UpdateAgentResponses(string agentId, List responses) { - if (responses == null) return; + if (responses == null || string.IsNullOrWhiteSpace(agentId)) return; var responsesToUpdate = responses.Select(r => AgentResponseMongoElement.ToMongoElement(r)).ToList(); var filter = Builders.Filter.Eq(x => x.Id, agentId); @@ -249,6 +250,16 @@ public partial class MongoRepository _dc.Agents.UpdateOne(filter, update); } + private void UpdateAgentMaxMessageCount(string agentId, int? maxMessageCount) + { + var filter = Builders.Filter.Eq(x => x.Id, agentId); + var update = Builders.Update + .Set(x => x.MaxMessageCount, maxMessageCount) + .Set(x => x.UpdatedTime, DateTime.UtcNow); + + _dc.Agents.UpdateOne(filter, update); + } + private void UpdateAgentAllFields(Agent agent) { var filter = Builders.Filter.Eq(x => x.Id, agent.Id); @@ -258,6 +269,7 @@ public partial class MongoRepository .Set(x => x.Disabled, agent.Disabled) .Set(x => x.MergeUtility, agent.MergeUtility) .Set(x => x.Type, agent.Type) + .Set(x => x.MaxMessageCount, agent.MaxMessageCount) .Set(x => x.Profiles, agent.Profiles) .Set(x => x.RoutingRules, agent.RoutingRules.Select(r => RoutingRuleMongoElement.ToMongoElement(r)).ToList()) .Set(x => x.Instruction, agent.Instruction) @@ -277,7 +289,7 @@ public partial class MongoRepository #endregion - public Agent? GetAgent(string agentId) + public Agent? GetAgent(string agentId, bool basicsOnly = false) { var agent = _dc.Agents.AsQueryable().FirstOrDefault(x => x.Id == agentId); if (agent == null) return null; @@ -420,6 +432,7 @@ public partial class MongoRepository InheritAgentId = x.InheritAgentId, Disabled = x.Disabled, MergeUtility = x.MergeUtility, + MaxMessageCount = x.MaxMessageCount, Profiles = x.Profiles, RoutingRules = x.RoutingRules?.Select(r => RoutingRuleMongoElement.ToMongoElement(r))?.ToList() ?? [], LlmConfig = AgentLlmConfigMongoElement.ToMongoElement(x.LlmConfig), @@ -513,6 +526,7 @@ public partial class MongoRepository Type = agentDoc.Type, InheritAgentId = agentDoc.InheritAgentId, Profiles = agentDoc.Profiles, + MaxMessageCount = agentDoc.MaxMessageCount }; } } From b2334decff0c714bfdb9c1a97a69e72a8a529a1c Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Sat, 14 Dec 2024 08:35:37 -0800 Subject: [PATCH 095/100] tried to fix the unit tests --- tests/UnitTest/MainTest.cs | 49 ++++++++++++++++++++++++++++------ tests/UnitTest/UnitTest.csproj | 2 -- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/tests/UnitTest/MainTest.cs b/tests/UnitTest/MainTest.cs index 2e4c29bf..4d2698d5 100644 --- a/tests/UnitTest/MainTest.cs +++ b/tests/UnitTest/MainTest.cs @@ -1,7 +1,5 @@ using Microsoft.Extensions.DependencyInjection; using BotSharp.Abstraction.Conversations; -using BotSharp.Core.Evaluations; -using BotSharp.Plugin.ChatHub.Hooks; namespace UnitTest { @@ -13,18 +11,53 @@ namespace UnitTest { var services = new ServiceCollection(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); var serviceProvider = services.BuildServiceProvider(); var conversationHookProvider = serviceProvider.GetService(); - + Assert.AreEqual(3, conversationHookProvider.Hooks.Count()); - // ChatHubConversationHook has the top priority - Assert.IsInstanceOfType(conversationHookProvider.HooksOrderByPriority.FirstOrDefault()); + var prevHook = default(IConversationHook); + + // Assert priority + foreach (var hook in conversationHookProvider.HooksOrderByPriority) + { + if (prevHook != null) + { + Assert.IsTrue(prevHook.Priority < hook.Priority); + } + + prevHook = hook; + } + } + + class TestHookA : ConversationHookBase + { + public TestHookA() + { + Priority = 1; + } + } + + class TestHookB : ConversationHookBase + { + public TestHookA() + { + Priority = 2; + } + } + + class TestHookC : ConversationHookBase + { + public TestHookA() + { + Priority = 3; + } } } } \ No newline at end of file diff --git a/tests/UnitTest/UnitTest.csproj b/tests/UnitTest/UnitTest.csproj index 3e1831ae..67e7d504 100644 --- a/tests/UnitTest/UnitTest.csproj +++ b/tests/UnitTest/UnitTest.csproj @@ -22,7 +22,5 @@ - - From 4fde52456a18a9c12b503f3ff0073ac9577eaba2 Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Sat, 14 Dec 2024 08:35:45 -0800 Subject: [PATCH 096/100] removed unused code --- .../Services/ConversationService.SendMessage.cs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs index bdf43c8a..f60d32cf 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs @@ -171,18 +171,4 @@ public partial class ConversationService // Add to dialog history _storage.Append(_conversationId, response); } - - private List ReOrderConversationHooks(List hooks) - { - var target = "ChatHubConversationHook"; - var chathub = hooks.FirstOrDefault(x => x.GetType().Name == target); - var otherHooks = hooks.Where(x => x.GetType().Name != target).ToList(); - - if (chathub != null) - { - var newHooks = new List { chathub }.Concat(otherHooks); - return newHooks.ToList(); - } - return hooks; - } } From 7089f8f39fcb0c7dcdcf5e6aa803c69b66157906 Mon Sep 17 00:00:00 2001 From: Kerry Jiang Date: Sat, 14 Dec 2024 09:25:19 -0800 Subject: [PATCH 097/100] tried to fix the unit tests --- tests/UnitTest/MainTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/UnitTest/MainTest.cs b/tests/UnitTest/MainTest.cs index 4d2698d5..307855e4 100644 --- a/tests/UnitTest/MainTest.cs +++ b/tests/UnitTest/MainTest.cs @@ -46,7 +46,7 @@ namespace UnitTest class TestHookB : ConversationHookBase { - public TestHookA() + public TestHookB() { Priority = 2; } @@ -54,7 +54,7 @@ namespace UnitTest class TestHookC : ConversationHookBase { - public TestHookA() + public TestHookC() { Priority = 3; } From 387bbe98c61e6826cc59f05460498b957ccb9b6a Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 16 Dec 2024 10:17:50 -0600 Subject: [PATCH 098/100] add count in cron tab --- .../BotSharp.Abstraction/Crontab/Models/CrontabItem.cs | 9 +++++++++ .../Collections/CrontabItemDocument.cs | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs index a8acdc79..6a9dd43a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs @@ -14,6 +14,15 @@ public class CrontabItem : ScheduleTaskArgs [JsonPropertyName("execution_result")] public string ExecutionResult { get; set; } = null!; + [JsonPropertyName("execution_count")] + public int ExecutionCount { get; set; } + + [JsonPropertyName("max_execution_count")] + public int MaxExecutionCount { get; set; } + + [JsonPropertyName("expire_seconds")] + public int ExpireSeconds { get; set; } = 60; + [JsonPropertyName("created_time")] public DateTime CreatedTime { get; set; } = DateTime.UtcNow; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs index 10e633d7..dc04d2e4 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs @@ -11,6 +11,9 @@ public class CrontabItemDocument : MongoBase public string Cron { get; set; } public string Title { get; set; } public string Description { get; set; } + public int ExecutionCount { get; set; } + public int MaxExecutionCount { get; set; } + public int ExpireSeconds { get; set; } = 60; public IEnumerable Tasks { get; set; } = []; public DateTime CreatedTime { get; set; } = DateTime.UtcNow; @@ -25,6 +28,9 @@ public class CrontabItemDocument : MongoBase Cron = item.Cron, Title = item.Title, Description = item.Description, + ExecutionCount = item.ExecutionCount, + MaxExecutionCount = item.MaxExecutionCount, + ExpireSeconds = item.ExpireSeconds, Tasks = item.Tasks?.Select(x => CronTaskMongoElement.ToDomainElement(x))?.ToArray() ?? [], CreatedTime = item.CreatedTime }; @@ -41,6 +47,9 @@ public class CrontabItemDocument : MongoBase Cron = item.Cron, Title = item.Title, Description = item.Description, + ExecutionCount = item.ExecutionCount, + MaxExecutionCount = item.MaxExecutionCount, + ExpireSeconds = item.ExpireSeconds, Tasks = item.Tasks?.Select(x => CronTaskMongoElement.ToMongoElement(x))?.ToList() ?? [], CreatedTime = item.CreatedTime }; From 47135c8fb45086c4d6b1d584dfd67c45928376b9 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Mon, 16 Dec 2024 10:18:50 -0600 Subject: [PATCH 099/100] revert --- .../Collections/CrontabItemDocument.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs index dc04d2e4..39622d4c 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/CrontabItemDocument.cs @@ -13,7 +13,7 @@ public class CrontabItemDocument : MongoBase public string Description { get; set; } public int ExecutionCount { get; set; } public int MaxExecutionCount { get; set; } - public int ExpireSeconds { get; set; } = 60; + public int ExpireSeconds { get; set; } public IEnumerable Tasks { get; set; } = []; public DateTime CreatedTime { get; set; } = DateTime.UtcNow; From 00320fef21ce042d37449ac75c5810617551fb78 Mon Sep 17 00:00:00 2001 From: Joanna Ren <101223@smsassist.com> Date: Mon, 16 Dec 2024 17:22:28 -0600 Subject: [PATCH 100/100] update sql planner --- .../agent.json | 2 +- .../BotSharp.Plugin.Planner.csproj | 30 +++++ .../Enums/PlannerAgentId.cs | 3 +- .../Functions/SummaryPlanFn.cs | 9 -- .../BotSharp.Plugin.Planner/PlannerPlugin.cs | 5 +- .../Functions/SqlGenerationFn.cs | 127 ++++++++++++++++++ .../SqlGeneration/Functions/SqlReviewFn.cs | 38 ++++++ .../SqlGeneration/Models/FirstStagePlan.cs | 39 ++++++ .../Models/PrimaryRequirementRequest.cs | 13 ++ .../SqlGeneration/Models/SecondStagePlan.cs | 19 +++ .../Models/SecondaryBreakdownTask.cs | 13 ++ .../SqlGeneration/Models/SqlReviewArgs.cs | 13 ++ .../SqlGeneration/SqlGenerationPlanner.cs | 107 +++++++++++++++ .../agent.json | 19 +++ .../functions/plan_primary_stage.json | 47 +++++++ .../functions/plan_secondary_stage.json | 18 +++ .../functions/sql_generation.json | 26 ++++ .../functions/sql_review.json | 22 +++ .../instructions/instruction.liquid | 33 +++++ .../templates/two_stage.1st.plan.liquid | 39 ++++++ .../templates/two_stage.2nd.plan.liquid | 22 +++ .../templates/two_stage.next.liquid | 12 ++ .../templates/two_stage.summarize.liquid | 29 ++++ .../util-db-sql_table_definition.json | 12 +- .../agent.json | 2 +- .../functions/sql_table_definition.json | 12 +- .../instructions/instruction.liquid | 2 +- 27 files changed, 690 insertions(+), 23 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlGenerationFn.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlReviewFn.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/FirstStagePlan.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/PrimaryRequirementRequest.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondStagePlan.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondaryBreakdownTask.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SqlReviewArgs.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/SqlGenerationPlanner.cs create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/agent.json create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_primary_stage.json create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_secondary_stage.json create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_generation.json create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_review.json create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/instructions/instruction.liquid create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.1st.plan.liquid create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.2nd.plan.liquid create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.next.liquid create mode 100644 src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.summarize.liquid diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json index cfd0d779..5e4186dc 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json @@ -16,7 +16,7 @@ }, { "type": "planner", - "field": "Two-Stage-Planner" + "field": "SQL-Planner" } ] } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj index f80327cc..886964b5 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj +++ b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj @@ -69,6 +69,36 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs b/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs index 0776d7f1..ce603861 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Enums/PlannerAgentId.cs @@ -1,9 +1,8 @@ -using Microsoft.AspNetCore.Http; - namespace BotSharp.Plugin.Planner.Enums; public class PlannerAgentId { public const string TwoStagePlanner = "282a7128-69a1-44b0-878c-a9159b88f3b9"; public const string SequentialPlanner = "3e75e818-a139-48a8-9e22-4662548c13a3"; + public const string SqlPlanner = "da7aad2c-8112-48a2-ab7b-1f87da524741"; } diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs index cfc306f4..b89bcc35 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs @@ -68,15 +68,6 @@ public class SummaryPlanFn : IFunctionCallback var summary = await GetAiResponse(plannerAgent); message.Content = summary.Content; - // Emit event if the sql statement is generated by planner - var args = JsonSerializer.Deserialize(message.FunctionArgs); - if (args != null && !args.IsSqlTemplate && args.ContainsSqlStatements) - { - await HookEmitter.Emit(_services, async hook => - await hook.OnSourceCodeGenerated(nameof(TwoStageTaskPlanner), message, "sql") - ); - } - await HookEmitter.Emit(_services, async hook => await hook.OnPlanningCompleted(nameof(TwoStageTaskPlanner), message) ); diff --git a/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs b/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs index b139cde2..9ece599f 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/PlannerPlugin.cs @@ -1,4 +1,5 @@ using BotSharp.Plugin.Planner.Sequential; +using BotSharp.Plugin.Planner.SqlGeneration; using BotSharp.Plugin.Planner.TwoStaging; namespace BotSharp.Plugin.Planner; @@ -16,13 +17,15 @@ public class PlannerPlugin : IBotSharpPlugin public string[] AgentIds => [ PlannerAgentId.TwoStagePlanner, - PlannerAgentId.SequentialPlanner + PlannerAgentId.SequentialPlanner, + PlannerAgentId.SqlPlanner ]; public void RegisterDI(IServiceCollection services, IConfiguration config) { services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); } diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlGenerationFn.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlGenerationFn.cs new file mode 100644 index 00000000..e89f533a --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlGenerationFn.cs @@ -0,0 +1,127 @@ +using BotSharp.Plugin.Planner.TwoStaging; +using BotSharp.Plugin.Planner.TwoStaging.Models; + +namespace BotSharp.Plugin.Planner.Functions; + +public class SqlGenerationFn : IFunctionCallback +{ + public string Name => "sql_generation"; + public string Indication => "Organizing and summarizing the final SQL statements."; + + private readonly IServiceProvider _services; + private readonly ILogger _logger; + + public SqlGenerationFn( + IServiceProvider services, + ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task Execute(RoleDialogModel message) + { + var fn = _services.GetRequiredService(); + var agentService = _services.GetRequiredService(); + var states = _services.GetRequiredService(); + + states.SetState("max_tokens", "4096"); + var currentAgent = await agentService.LoadAgent(message.CurrentAgentId); + var taskRequirement = states.GetState("requirement_detail"); + + // Get table names + var steps = states.GetState("planning_result").JsonArrayContent(); + var allTables = new List(); + var ddlStatements = string.Empty; + var domainKnowledge = states.GetState("planning_result"); + domainKnowledge += "\r\n" + states.GetState("domain_knowledges"); + var dictionaryItems = states.GetState("dictionary_items"); + var excelImportResult = states.GetState("excel_import_result"); + + foreach (var step in steps) + { + allTables.AddRange(step.Tables); + } + var distinctTables = allTables.Distinct().ToList(); + + var msgCopy = RoleDialogModel.From(message); + msgCopy.FunctionArgs = JsonSerializer.Serialize(new + { + tables = distinctTables, + }); + await fn.InvokeFunction("sql_table_definition", msgCopy); + ddlStatements += "\r\n" + msgCopy.Content; + states.SetState("table_ddls", ddlStatements); + + // Summarize and generate query + var prompt = await GetSummaryPlanPrompt(msgCopy, taskRequirement, domainKnowledge, dictionaryItems, ddlStatements, excelImportResult); + _logger.LogInformation($"Summary plan prompt:\r\n{prompt}"); + + var plannerAgent = new Agent + { + Id = PlannerAgentId.TwoStagePlanner, + Name = Name, + Instruction = prompt, + LlmConfig = currentAgent.LlmConfig + }; + + var summary = await GetAiResponse(plannerAgent); + message.Content = summary.Content; + + /*await HookEmitter.Emit(_services, async hook => + await hook.OnPlanningCompleted(nameof(TwoStageTaskPlanner), message) + );*/ + + return true; + } + + private async Task GetSummaryPlanPrompt(RoleDialogModel message, string taskDescription, string domainKnowledge, string dictionaryItems, string ddlStatement, string excelImportResult) + { + var agentService = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + var knowledgeHooks = _services.GetServices(); + + var agent = await agentService.GetAgent(PlannerAgentId.TwoStagePlanner); + var template = agent.Templates.FirstOrDefault(x => x.Name == "two_stage.summarize")?.Content ?? string.Empty; + + var additionalRequirements = new List(); + await HookEmitter.Emit(_services, async x => + { + var requirement = await x.GetSummaryAdditionalRequirements(nameof(TwoStageTaskPlanner), message); + additionalRequirements.Add(requirement); + }); + + var globalKnowledges = new List(); + foreach (var hook in knowledgeHooks) + { + var k = await hook.GetGlobalKnowledges(message); + globalKnowledges.AddRange(k); + } + + return render.Render(template, new Dictionary + { + { "task_description", taskDescription }, + { "summary_requirements", string.Join("\r\n", additionalRequirements) }, + { "global_knowledges", globalKnowledges }, + { "domain_knowledges", domainKnowledge }, + { "dictionary_items", dictionaryItems }, + { "table_structure", ddlStatement }, + { "excel_import_result", excelImportResult } + }); + } + private async Task GetAiResponse(Agent plannerAgent) + { + var conv = _services.GetRequiredService(); + var wholeDialogs = conv.GetDialogHistory(); + + // Append text + wholeDialogs.Last().Content += "\n\nIf the table structure didn't mention auto incremental, the data field id needs to insert id manually and you need to use max(id).\nFor example, you should use SET @id = select max(id) from table;"; + wholeDialogs.Last().Content += "\n\nTry if you can generate a single query to fulfill the needs."; + + var completion = CompletionProvider.GetChatCompletion(_services, + provider: plannerAgent.LlmConfig.Provider, + model: plannerAgent.LlmConfig.Model); + + return await completion.GetChatCompletions(plannerAgent, wholeDialogs); + } +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlReviewFn.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlReviewFn.cs new file mode 100644 index 00000000..7c14d5f4 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Functions/SqlReviewFn.cs @@ -0,0 +1,38 @@ +using BotSharp.Plugin.Planner.SqlGeneration.Models; +using BotSharp.Plugin.Planner.TwoStaging; +using BotSharp.Plugin.Planner.TwoStaging.Models; + +namespace BotSharp.Plugin.Planner.SqlGeneration.Functions; + +public class SqlReviewFn : IFunctionCallback +{ + public string Name => "sql_review"; + public string Indication => "Currently reviewing SQL statement"; + + private readonly IServiceProvider _services; + private readonly ILogger _logger; + + public SqlReviewFn( + IServiceProvider services, + ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs); + if (!message.Content.StartsWith("```sql")) + { + message.Content = $"```sql\r\n{args.SqlStatement}\r\n```"; + } + if (args != null && !args.IsSqlTemplate && args.ContainsSqlStatements) + { + await HookEmitter.Emit(_services, async hook => + await hook.OnSourceCodeGenerated(nameof(TwoStageTaskPlanner), message, "sql") + ); + } + return true; + } +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/FirstStagePlan.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/FirstStagePlan.cs new file mode 100644 index 00000000..17ca9f0e --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/FirstStagePlan.cs @@ -0,0 +1,39 @@ +namespace BotSharp.Plugin.Planner.SqlGeneration.Models; + +public class FirstStagePlan +{ + [JsonPropertyName("task_detail")] + public string Task { get; set; } = ""; + + //[JsonPropertyName("reason")] + //public string Reason { get; set; } = ""; + + [JsonPropertyName("step")] + public int Step { get; set; } = -1; + + [JsonPropertyName("need_breakdown_task")] + public bool NeedAdditionalInformation { get; set; } = false; + + [JsonPropertyName("need_lookup_dictionary")] + public bool NeedLookupDictionary { get; set; } = false; + + [JsonPropertyName("related_tables")] + public string[] Tables { get; set; } = []; + + [JsonPropertyName("has_found_relevant_knowledge")] + public bool HasFoundRelevantKnowledge { get; set; } = false; + + //[JsonPropertyName("related_urls")] + //public string[] Urls { get; set; } = []; + + //[JsonPropertyName("input_args")] + //public JsonDocument[] Parameters { get; set; } = []; + + //[JsonPropertyName("output_results")] + //public string[] Results { get; set; } = []; + + public override string ToString() + { + return $"STEP {Step}: {Task}"; + } +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/PrimaryRequirementRequest.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/PrimaryRequirementRequest.cs new file mode 100644 index 00000000..6a15faba --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/PrimaryRequirementRequest.cs @@ -0,0 +1,13 @@ +namespace BotSharp.Plugin.Planner.SqlGeneration.Models; + +public class PrimaryRequirementRequest +{ + [JsonPropertyName("requirement_detail")] + public string Requirements { get; set; } = null!; + + [JsonPropertyName("questions")] + public string[] Questions { get; set; } = []; + + [JsonPropertyName("norm_questions")] + public string[] NormQuestions { get; set; } = []; +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondStagePlan.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondStagePlan.cs new file mode 100644 index 00000000..49f78f23 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondStagePlan.cs @@ -0,0 +1,19 @@ +namespace BotSharp.Plugin.Planner.SqlGeneration.Models; + +public class SecondStagePlan +{ + [JsonPropertyName("related_tables")] + public string[] Tables { get; set; } = []; + + [JsonPropertyName("need_lookup_dictionary")] + public bool NeedLookupDictionary { get; set; } = false; + + [JsonPropertyName("description")] + public string Description { get; set; } = ""; + + [JsonPropertyName("input_args")] + public JsonDocument[] Parameters { get; set; } = []; + + [JsonPropertyName("output_results")] + public string[] Results { get; set; } = []; +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondaryBreakdownTask.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondaryBreakdownTask.cs new file mode 100644 index 00000000..671c6353 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SecondaryBreakdownTask.cs @@ -0,0 +1,13 @@ +namespace BotSharp.Plugin.Planner.SqlGeneration.Models; + +public class SecondaryBreakdownTask +{ + [JsonPropertyName("task_description")] + public string TaskDescription { get; set; } = null!; + + [JsonPropertyName("solution_search_question")] + public string SolutionQuestion { get; set; } = null!; + + [JsonPropertyName("need_lookup_dictionary")] + public bool NeedLookupDictionary { get; set; } +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SqlReviewArgs.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SqlReviewArgs.cs new file mode 100644 index 00000000..29ec186f --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/Models/SqlReviewArgs.cs @@ -0,0 +1,13 @@ +namespace BotSharp.Plugin.Planner.SqlGeneration.Models; + +public class SqlReviewArgs +{ + [JsonPropertyName("is_sql_template")] + public bool IsSqlTemplate { get; set; } = false; + + [JsonPropertyName("contains_sql_statements")] + public bool ContainsSqlStatements { get; set; } = false; + + [JsonPropertyName("sql_statement")] + public string SqlStatement { get; set; } = string.Empty; +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/SqlGenerationPlanner.cs b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/SqlGenerationPlanner.cs new file mode 100644 index 00000000..52571578 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/SqlGeneration/SqlGenerationPlanner.cs @@ -0,0 +1,107 @@ +namespace BotSharp.Plugin.Planner.SqlGeneration; + +public class SqlGenerationPlanner : ITaskPlanner +{ + private readonly IServiceProvider _services; + private readonly ILogger _logger; + public string Name => "SQL-Planner"; + public int MaxLoopCount => 10; + + public SqlGenerationPlanner(IServiceProvider services, ILogger logger) + { + _services = services; + _logger = logger; + } + + public async Task GetNextInstruction(Agent router, string messageId, List dialogs) + { + var inst = new FunctionCallFromLlm(); + var nextStepPrompt = await GetNextStepPrompt(router); + + // chat completion + var completion = CompletionProvider.GetChatCompletion(_services, + provider: router?.LlmConfig?.Provider, + model: router?.LlmConfig?.Model); + + // text completion + dialogs = new List + { + new RoleDialogModel(AgentRole.User, nextStepPrompt) + { + FunctionName = nameof(SqlGenerationPlanner), + MessageId = messageId + } + }; + var response = await completion.GetChatCompletions(router, dialogs); + inst = response.Content.JsonContent(); + + // Fix LLM malformed response + ReasonerHelper.FixMalformedResponse(_services, inst); + return inst; + } + + public List BeforeHandleContext(FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + { + var question = inst.Response; + + var taskAgentDialogs = new List + { + new RoleDialogModel(AgentRole.User, question) + { + MessageId = message.MessageId, + } + }; + + return taskAgentDialogs; + } + + public bool AfterHandleContext(List dialogs, List taskAgentDialogs) + { + dialogs.AddRange(taskAgentDialogs.Skip(1)); + + return true; + } + + public async Task AgentExecuting(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + { + // Set user content as Planner's question + message.FunctionName = inst.Function; + message.FunctionArgs = inst.Arguments == null ? "{}" : JsonSerializer.Serialize(inst.Arguments); + return true; + } + + public async Task AgentExecuted(Agent router, FunctionCallFromLlm inst, RoleDialogModel message, List dialogs) + { + var context = _services.GetRequiredService(); + + if (message.StopCompletion) + { + context.Empty(reason: $"Agent queue is cleared by {nameof(SqlGenerationPlanner)}"); + return false; + } + + if (dialogs.Last().Role == AgentRole.Assistant) + { + context.Empty(); + return false; + } + + var routing = _services.GetRequiredService(); + routing.Context.ResetRecursiveCounter(); + return true; + } + + private async Task GetNextStepPrompt(Agent router) + { + var agentService = _services.GetRequiredService(); + var planner = await agentService.LoadAgent(PlannerAgentId.TwoStagePlanner); + var template = planner.Templates.First(x => x.Name == "two_stage.next").Content; + var states = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + return render.Render(template, new Dictionary + { + { StateConst.EXPECTED_ACTION_AGENT, states.GetState(StateConst.EXPECTED_ACTION_AGENT) }, + { StateConst.EXPECTED_GOAL_AGENT, states.GetState(StateConst.EXPECTED_GOAL_AGENT) } + }); + } +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/agent.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/agent.json new file mode 100644 index 00000000..4d01b4e2 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/agent.json @@ -0,0 +1,19 @@ +{ + "id": "da7aad2c-8112-48a2-ab7b-1f87da524741", + "name": "SQL-Planner", + "description": "Plan feasible steps for user task related to sql generation, generate sql statement and/or review the sql statement that can be derived from context", + "type": "planning", + "createdDateTime": "2023-08-27T10:39:00Z", + "updatedDateTime": "2023-08-27T14:39:00Z", + "iconUrl": "https://e7.pngegg.com/pngimages/775/350/png-clipart-action-plan-computer-icons-plan-miscellaneous-text-thumbnail.png", + "disabled": false, + "isPublic": true, + "profiles": [ "planning" ], + "mergeUtility": true, + "utilities": [], + "llmConfig": { + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "max_recursion_depth": 10 + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_primary_stage.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_primary_stage.json new file mode 100644 index 00000000..5fefe691 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_primary_stage.json @@ -0,0 +1,47 @@ +{ + "name": "plan_primary_stage", + "description": "Plan the high level steps to finish the task", + "parameters": { + "type": "object", + "properties": { + "requirement_detail": { + "type": "string", + "description": "User requirements related to data tasks in detail, don't miss any information especially for those line items, values and numbers." + }, + "questions": { + "type": "array", + "description": "Break down user data requirements in details and in multiple ways, don't miss any entity type/value. The output format must be string array.", + "items": { + "type": "string", + "description": "Question converted from requirement in different ways to search in the knowledge base, be short and you can refer to the global knowledge.One question should contain only one main topic that with one entity type." + } + }, + "norm_questions": { + "type": "array", + "description": "normalize the generated questions, remove specific entity value. The output format must be string array.", + "items": { + "type": "string", + "description": "Normalized question" + } + }, + "entities": { + "type": "array", + "description": "entities with type and value", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "entity type" + }, + "value": { + "type": "string", + "description": "entity value" + } + } + } + } + }, + "required": [ "requirement_detail", "questions" ] + } +} diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_secondary_stage.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_secondary_stage.json new file mode 100644 index 00000000..ca6b3d0b --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/plan_secondary_stage.json @@ -0,0 +1,18 @@ +{ + "name": "plan_secondary_stage", + "description": "Based on the primary stage planning, make more detail steps of the second stage if the primary stage needs more information.", + "parameters": { + "type": "object", + "properties": { + "task_description": { + "type": "string", + "description": "task description from primary steps" + }, + "solution_search_question": { + "type": "string", + "description": "Generate question to find the knowledge for text. Be short" + } + }, + "required": [ "task_description", "solution_search_question" ] + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_generation.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_generation.json new file mode 100644 index 00000000..98e40785 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_generation.json @@ -0,0 +1,26 @@ +{ + "name": "sql_generation", + "description": "Based on the planning steps, summarize the planning steps and output final steps.", + "parameters": { + "type": "object", + "properties": { + "is_sql_template": { + "type": "boolean", + "description": "If user request is to generate sql template instead of actual sql statement." + }, + "contains_sql_statements": { + "type": "boolean", + "description": "Set to true if the response contains sql statements." + }, + "related_tables": { + "type": "array", + "description": "table name in planning steps", + "items": { + "type": "string", + "description": "table name" + } + } + }, + "required": [ "related_tables", "is_sql_template", "contains_sql_statements" ] + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_review.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_review.json new file mode 100644 index 00000000..ad360e3c --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/functions/sql_review.json @@ -0,0 +1,22 @@ +{ + "name": "sql_review", + "description": "Verify and optimize sql statement", + "parameters": { + "type": "object", + "properties": { + "sql_statement": { + "type": "string", + "description": "sql statement, must including sql identifier that wrapped with ```sql \r\n```" + }, + "is_sql_template": { + "type": "boolean", + "description": "If user request is to generate sql template instead of actual sql statement." + }, + "contains_sql_statements": { + "type": "boolean", + "description": "Set to true if the response contains sql statements." + } + }, + "required": [ "sql_statement", "is_sql_template", "contains_sql_statements" ] + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/instructions/instruction.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/instructions/instruction.liquid new file mode 100644 index 00000000..52e498e5 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/instructions/instruction.liquid @@ -0,0 +1,33 @@ +You're a SQL planner and reviewer, your goal is using function sql_generation and sql_review to response. +You are going convert the user requirement into sql statements. +The user is dealing with a complex problem, and you need to break this complex problem into several small tasks to more easily solve the user's needs. +Follow these steps strictly and in order. + +1. If user raised a new task, call plan_primary_stage to generate the primary plan. + If the sql response can be generate directly based on the context, directly go to step 6 to call function sql_review. +2. If need_lookup_dictionary is True, call verify_dictionary_term to verify or get the enum/term/dictionary value. Pull id and name. + * If you no items retured, you can pull 100 records from the table and look for the match. + * If need_lookup_dictionary is False, skip calling verify_dictionary_term. +3. If need_breakdown_task is true, call plan_secondary_stage for the specific primary stage. +4. Repeat step 3 until you processed all the primary steps. +5. Call sql_generation function to generate SQL statements. +6. Call sql_review function to review SQL statements. This is the step you must go through before reply to the user. + + +{% if global_knowledges != empty -%} +===== +Global Knowledge: +Current date time is: {{ "now" | date: "%Y-%m-%d %H:%M" }} +{% for k in global_knowledges %} +{{ k }} +{% endfor %} +===== +{%- endif %} + + +==== IMPORTANT SYSTEM INSTRUCTION ==== +* The verify_dictionary_term function CAN'T generate INSERT SQL Statement. +* The table name must come from the relevant knowledge. has_found_relevant_knowledge must be true. +* Do not introduce your actions or intentions in any way. +* You MUST explicitly call function sql_review even the sql query is provided in previous context. + diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.1st.plan.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.1st.plan.liquid new file mode 100644 index 00000000..306f4214 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.1st.plan.liquid @@ -0,0 +1,39 @@ +You are a Task Planner. you will breakdown user business requirements into excutable sub-tasks. + +Thinking process: +1. Reference to "Domain Knowledge" if there is relevant knowledge; +2. Breakdown task into subtasks. + - The subtask should contain all needed parameters for subsequent steps. + - If limited information provided and there are furture information needed, or miss relationship between steps, set the need_breakdown_task to true. + - If there is extra knowledge or relationship needed between steps, set the need_breakdown_task to true for both steps. + - If the solution mentioned "related solutions" is needed, set the need_breakdown_task to true. + - You should find the relationships between data structure based on the domain knowledge strictly. If lack of information, set the need_breakdown_task to true. + - If you need to lookup the dictionary to verify or get the enum/term/dictionary value(exclude example data from attachment), set the need_lookup_dictionary to true. + - Don't set need_lookup_dictionary to true for attachment data. + - Seperate the dictionary lookup and need additional information/knowledge into different subtask. +3. Input argument must reference to corresponding variable name that retrieved by previous steps, variable name must start with '@'; +4. Output all the subtasks as much detail as possible in JSON: [{{ response_format }}] +5. You can NOT generate the final query before calling function plan_summary. + +Note: +* If the task includes repeat steps,e.g.same steps for multiple elements, only generate a single detailed solution without repeating steps for each elements. + +{% if global_knowledges != empty -%} +===== +Global Knowledge: +{% for k in global_knowledges %} +{{ k }} +{% endfor %} +{%- endif %} + +{% if domain_knowledges != empty -%} +===== +Domain Knowledge: +{% for k in domain_knowledges %} +{{ k }} +{% endfor %} +{%- endif %} +===== + +Task description: +{{ task_description }} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.2nd.plan.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.2nd.plan.liquid new file mode 100644 index 00000000..81e22fe8 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.2nd.plan.liquid @@ -0,0 +1,22 @@ +Reference to "Primary Planning" and the additional knowledge included. Breakdown task into multiple steps. +* The step should contains all needed parameters. +* The parameters can be extracted from the original task. +* You need to list all the steps in detail. Finding relationships should also be a step. +* When generate the steps, you should find the relationships between data structure based on the provided knowledge strictly. +* If need_lookup_dictionary is true, call verify_dictionary_term to verify or get the enum/term/dictionary value. Pull id and name/code. +* Output all the steps as much detail as possible in JSON: [{{ response_format }}] + +Additional Requirements: +* "output_results" is variable name that needed to be used in the next step. + +===== +Sub Task Description: +{{ task_description }} + +===== +Primary Planning: +{{ primary_plan }} + +===== +Additional Knowledge: +{{ additional_knowledge }} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.next.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.next.liquid new file mode 100644 index 00000000..f7388be6 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.next.liquid @@ -0,0 +1,12 @@ +What is the next step based on the CONVERSATION? +Route to the last handling agent in priority. +{% if expected_next_action_agent != empty -%} +Expected next action agent is {{ expected_next_action_agent }}. +{%- else -%} +Next action agent is inferred based on user lastest response. +{%- endif %} +{% if expected_user_goal_agent != empty -%} +Expected user goal agent is {{ expected_user_goal_agent }}. +{%- else -%} +User goal agent is inferred based on user initial request. +{%- endif %} diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.summarize.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.summarize.liquid new file mode 100644 index 00000000..ef0e3ae3 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/da7aad2c-8112-48a2-ab7b-1f87da524741/templates/two_stage.summarize.liquid @@ -0,0 +1,29 @@ +You are a planning summarizer. You will generate the final output in JSON format based on the task description, knowledge and related table structure and relationship. +Generate a simple business explaination of the quried data for the non tech audience. call sql_review as the final step after generating the sql statement. + +Requirements: +{{ summary_requirements }} + +===== +Task description: +{{ task_description }} + +===== +Global Knowledges: +{{ global_knowledges }} + +===== +Domain Knowledges: +{{ domain_knowledges }} + +===== +Dictionary Items: +{{ dictionary_items }} + +===== +Table Structure: +{{ table_structure }} + +===== +Attached Excel Information: +{{ excel_import_result }} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json index 6e4b946c..0f808afe 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-db-sql_table_definition.json @@ -4,15 +4,19 @@ "parameters": { "type": "object", "properties": { - "table": { - "type": "string", - "description": "table name" + "tables": { + "type": "array", + "description": "table name in planning steps", + "items": { + "type": "string", + "description": "table name" + } }, "reason": { "type": "string", "description": "the reason why you need to call sql_table_definition" } }, - "required": [ "table", "reason" ] + "required": [ "tables", "reason" ] } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json index 00d1e0b3..9f902a01 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json @@ -1,7 +1,7 @@ { "id": "beda4c12-e1ec-4b4b-b328-3df4a6687c4f", "name": "SQL Driver", - "description": "Transfer to this Agent only when executable SQL statements are explicitly provided in the context.", + "description": "Transfer to this Agent when user mentions to execute the sql statement. Only call when executable SQL statements are explicitly provided in the context.", "iconUrl": "https://cdn-icons-png.flaticon.com/512/3161/3161158.png", "type": "task", "createdDateTime": "2023-11-15T13:49:00Z", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json index 748202b4..580ee339 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json @@ -4,11 +4,15 @@ "parameters": { "type": "object", "properties": { - "table": { - "type": "string", - "description": "table need to check" + "tables": { + "type": "array", + "description": "table name in planning steps", + "items": { + "type": "string", + "description": "table name" + } } }, - "required": [ "table" ] + "required": [ "tables" ] } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instructions/instruction.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instructions/instruction.liquid index 8daddf49..7cc97bb0 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instructions/instruction.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instructions/instruction.liquid @@ -1,4 +1,4 @@ -You're a SQL driver who can find the database information or query the data. +You're a SQL driver who can execute the sql statement. Your response must meet below requirements: * You can only execute the SQL from the conversation. You can't generate one by yourself;