diff --git a/src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailHandlerSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailHandlerSettings.cs new file mode 100644 index 00000000..e51972a8 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailHandlerSettings.cs @@ -0,0 +1,11 @@ +namespace BotSharp.Abstraction.Email.Settings; + +public class EmailHandlerSettings +{ + public string EmailAddress { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string Username { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public string SMTPServer { get; set; } = string.Empty; + public int SMTPPort { get; set; } +} diff --git a/src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailPluginSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailPluginSettings.cs deleted file mode 100644 index 4eb08e0d..00000000 --- a/src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailPluginSettings.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace BotSharp.Abstraction.Email.Settings -{ - public class EmailPluginSettings - { - public string EmailAddress { get; set; } = string.Empty; - public string Name { get; set; } = string.Empty; - public string Username { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public string SMTPServer { get; set; } = string.Empty; - public int SMTPPort { get; set; } - } -} diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj b/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj index 64f72470..f5995e96 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/BotSharp.Plugin.EmailHandler.csproj @@ -11,15 +11,15 @@ - - + + - + PreserveNewest - + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs index 444464fb..ed472fc5 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/EmailHandlerPlugin.cs @@ -23,7 +23,7 @@ namespace BotSharp.Plugin.EmailHandler services.AddScoped(provider => { var settingService = provider.GetRequiredService(); - return settingService.Bind("EmailPlugin"); + return settingService.Bind("EmailHandler"); }); services.AddScoped(); diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailRequestFn.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailRequestFn.cs index 12c24e3a..731e338b 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailRequestFn.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailRequestFn.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Email.Settings; using BotSharp.Plugin.EmailHandler.LlmContexts; +using MailKit; using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.AspNetCore.Http; @@ -7,72 +8,71 @@ using Microsoft.Extensions.Logging; using MimeKit; using System.Net.Http; -namespace BotSharp.Plugin.EmailHandler.Functions +namespace BotSharp.Plugin.EmailHandler.Functions; + +public class HandleEmailRequestFn : IFunctionCallback { - public class HandleEmailRequestFn : IFunctionCallback + public string Name => "handle_email_request"; + public string Indication => "Handling email request"; + + private readonly IServiceProvider _services; + private readonly ILogger _logger; + private readonly IHttpClientFactory _httpClientFactory; + private readonly IHttpContextAccessor _context; + private readonly BotSharpOptions _options; + private readonly EmailHandlerSettings _emailSettings; + + public HandleEmailRequestFn(IServiceProvider services, + ILogger logger, + IHttpClientFactory httpClientFactory, + IHttpContextAccessor context, + BotSharpOptions options, + EmailHandlerSettings emailPluginSettings) { - public string Name => "handle_email_request"; - public string Indication => "Handling email request"; + _services = services; + _logger = logger; + _httpClientFactory = httpClientFactory; + _context = context; + _options = options; + _emailSettings = emailPluginSettings; + } + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs, _options.JsonSerializerOptions); + var recipient = args?.ToAddress; + var body = args?.Content; + var subject = args?.Subject; - private readonly IServiceProvider _services; - private readonly ILogger _logger; - private readonly IHttpClientFactory _httpClientFactory; - private readonly IHttpContextAccessor _context; - private readonly BotSharpOptions _options; - private readonly EmailPluginSettings _emailSettings; - - public HandleEmailRequestFn(IServiceProvider services, - ILogger logger, - IHttpClientFactory httpClientFactory, - IHttpContextAccessor context, - BotSharpOptions options, - EmailPluginSettings emailPluginSettings) + try { - _services = services; - _logger = logger; - _httpClientFactory = httpClientFactory; - _context = context; - _options = options; - _emailSettings = emailPluginSettings; + var mailMessage = new MimeMessage(); + mailMessage.From.Add(new MailboxAddress(_emailSettings.Name, _emailSettings.EmailAddress)); + mailMessage.To.Add(new MailboxAddress("", recipient)); + mailMessage.Subject = subject; + mailMessage.Body = new TextPart("plain") + { + Text = body + }; + var response = await HandleSendEmailBySMTP(mailMessage); + _logger.LogWarning($"Email successfully send over to {recipient}. Email Subject: {subject} [{response}]"); + message.Content = response; + return true; } - public async Task Execute(RoleDialogModel message) + catch (Exception ex) { - var args = JsonSerializer.Deserialize(message.FunctionArgs, _options.JsonSerializerOptions); - var recipient = args?.ToAddress; - var body = args?.Content; - var subject = args?.Subject; - - try - { - var mailMessage = new MimeMessage(); - mailMessage.From.Add(new MailboxAddress(_emailSettings.Name, _emailSettings.EmailAddress)); - mailMessage.To.Add(new MailboxAddress("", recipient)); - mailMessage.Subject = subject; - mailMessage.Body = new TextPart("plain") - { - Text = body - }; - await HandleSendEmailBySMTP(mailMessage); - message.Content = $"Email successfully send over to {recipient}. Email Subject: {subject}"; - return true; - } - catch (Exception ex) - { - var msg = $"Failed to send the email. {ex.Message}"; - _logger.LogWarning($"{msg}\n(Error: {ex.Message})"); - message.Content = msg; - return false; - } - } - public async Task HandleSendEmailBySMTP(MimeMessage mailMessage) - { - using (var smtpClient = new SmtpClient()) - { - await smtpClient.ConnectAsync(_emailSettings.SMTPServer, _emailSettings.SMTPPort, SecureSocketOptions.StartTls); - await smtpClient.AuthenticateAsync(_emailSettings.EmailAddress, _emailSettings.Password); - await smtpClient.SendAsync(mailMessage); - smtpClient.Disconnect(true); - } + var msg = $"Failed to send the email. {ex.Message}"; + _logger.LogError($"{msg}\n(Error: {ex.Message})"); + message.Content = msg; + return false; } } + + public async Task HandleSendEmailBySMTP(MimeMessage mailMessage) + { + using var smtpClient = new SmtpClient(); + await smtpClient.ConnectAsync(_emailSettings.SMTPServer, _emailSettings.SMTPPort, SecureSocketOptions.StartTls); + await smtpClient.AuthenticateAsync(_emailSettings.EmailAddress, _emailSettings.Password); + var response = await smtpClient.SendAsync(mailMessage); + return response; + } } diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs index dfa60a68..41c97eba 100644 --- a/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.EmailHandler/Hooks/EmailHandlerHook.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Agents; +using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Agents.Settings; using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Repositories; @@ -9,56 +10,54 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BotSharp.Plugin.EmailHandler.Hooks +namespace BotSharp.Plugin.EmailHandler.Hooks; + +public class EmailHandlerHook : AgentHookBase { - public class EmailHandlerHook : AgentHookBase + private static string FUNCTION_NAME = "handle_email_request"; + + public override string SelfId => string.Empty; + + public EmailHandlerHook(IServiceProvider services, AgentSettings settings) + : base(services, settings) { - private static string UTILITY_ASSISTANT = Guid.Empty.ToString(); - private static string FUNCTION_NAME = "handle_email_request"; + } + public override void OnAgentLoaded(Agent agent) + { + var conv = _services.GetRequiredService(); + var isConvMode = conv.IsConversationMode(); + var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(Utility.EmailHandler); - public override string SelfId => string.Empty; - - public EmailHandlerHook(IServiceProvider services, AgentSettings settings) - : base(services, settings) + if (isConvMode && isEnabled) { - } - public override void OnAgentLoaded(Agent agent) - { - var conv = _services.GetRequiredService(); - var isConvMode = conv.IsConversationMode(); - var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(Utility.EmailHandler); - - if (isConvMode && isEnabled) + var (prompt, fn) = GetPromptAndFunction(); + if (fn != null) { - var (prompt, fn) = GetPromptAndFunction(); - if (fn != null) + if (!string.IsNullOrWhiteSpace(prompt)) { - if (!string.IsNullOrWhiteSpace(prompt)) - { - agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; - } + 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); - } + 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(UTILITY_ASSISTANT); - 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); - } + 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/data/agents/00000000-0000-0000-0000-000000000000/functions/handle_email_request.json b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_request.json similarity index 100% rename from src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/00000000-0000-0000-0000-000000000000/functions/handle_email_request.json rename to src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/handle_email_request.json diff --git a/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/00000000-0000-0000-0000-000000000000/templates/handle_email_request.fn.liquid b/src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_request.fn.liquid similarity index 100% rename from src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/00000000-0000-0000-0000-000000000000/templates/handle_email_request.fn.liquid rename to src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/handle_email_request.fn.liquid