From 149de9a62d08cdade78342de177c784504925648 Mon Sep 17 00:00:00 2001
From: 103048 <103048@MJ0AJ7XO-LNPC>
Date: Thu, 11 Jul 2024 11:02:14 -0500
Subject: [PATCH] Code improvement based on feedback.
---
.../Email/Settings/EmailHandlerSettings.cs | 11 ++
.../Email/Settings/EmailPluginSettings.cs | 12 --
.../BotSharp.Plugin.EmailHandler.csproj | 8 +-
.../EmailHandlerPlugin.cs | 2 +-
.../Functions/HandleEmailRequestFn.cs | 120 +++++++++---------
.../Hooks/EmailHandlerHook.cs | 79 ++++++------
.../functions/handle_email_request.json | 0
.../templates/handle_email_request.fn.liquid | 0
8 files changed, 115 insertions(+), 117 deletions(-)
create mode 100644 src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailHandlerSettings.cs
delete mode 100644 src/Infrastructure/BotSharp.Abstraction/Email/Settings/EmailPluginSettings.cs
rename src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/{00000000-0000-0000-0000-000000000000 => 6745151e-6d46-4a02-8de4-1c4f21c7da95}/functions/handle_email_request.json (100%)
rename src/Plugins/BotSharp.Plugin.EmailHandler/data/agents/{00000000-0000-0000-0000-000000000000 => 6745151e-6d46-4a02-8de4-1c4f21c7da95}/templates/handle_email_request.fn.liquid (100%)
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