diff --git a/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj b/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj
index 72714388..5b83d77d 100644
--- a/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj
+++ b/src/Plugins/BotSharp.Plugin.Twilio/BotSharp.Plugin.Twilio.csproj
@@ -13,6 +13,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest
diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HangupPhoneCallFn.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HangupPhoneCallFn.cs
index cd755306..5a7eb3f3 100644
--- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HangupPhoneCallFn.cs
+++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/HangupPhoneCallFn.cs
@@ -1,5 +1,4 @@
using BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.LlmContexts;
-using Microsoft.VisualBasic;
using Twilio.Rest.Api.V2010.Account;
using Task = System.Threading.Tasks.Task;
diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/TextMessageFn.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/TextMessageFn.cs
new file mode 100644
index 00000000..c7c6fc88
--- /dev/null
+++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/TextMessageFn.cs
@@ -0,0 +1,49 @@
+using BotSharp.Abstraction.Options;
+using BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.LlmContexts;
+using Twilio.Rest.Api.V2010.Account;
+
+namespace BotSharp.Plugin.Twilio.OutboundPhoneCallHandler.Functions;
+
+public class TextMessageFn : IFunctionCallback
+{
+ private readonly IServiceProvider _services;
+ private readonly ILogger _logger;
+ private readonly TwilioSetting _twilioSetting;
+
+ public string Name => "util-twilio-text_message";
+ public string Indication => "Sending text message";
+
+ public TextMessageFn(
+ IServiceProvider services,
+ ILogger logger,
+ TwilioSetting twilioSetting)
+ {
+ _services = services;
+ _logger = logger;
+ _twilioSetting = twilioSetting;
+ }
+
+ public async Task Execute(RoleDialogModel message)
+ {
+ var args = JsonSerializer.Deserialize(message.FunctionArgs, BotSharpOptions.defaultJsonOptions);
+
+ // Send the message
+ var twilioMessage = MessageResource.Create(
+ to: args.PhoneNumber,
+ from: _twilioSetting.MessagingShortCode,
+ body: args.InitialMessage
+ );
+
+ if (twilioMessage.Status == MessageResource.StatusEnum.Queued)
+ {
+ message.Content = $"Queued message to {args.PhoneNumber}: {args.InitialMessage} [MESSAGING SID: {twilioMessage.Sid}]";
+ message.StopCompletion = true;
+ }
+ else
+ {
+ message.Content = twilioMessage.ErrorMessage;
+ }
+
+ return true;
+ }
+}
diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs
index 692610ff..fa0b3179 100644
--- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs
+++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Hooks/OutboundPhoneCallHandlerUtilityHook.cs
@@ -8,6 +8,7 @@ public class OutboundPhoneCallHandlerUtilityHook : IAgentUtilityHook
private static string PREFIX = "util-twilio-";
private static string OUTBOUND_PHONE_CALL_FN = $"{PREFIX}outbound_phone_call";
private static string HANGUP_PHONE_CALL_FN = $"{PREFIX}hangup_phone_call";
+ public static string TEXT_MESSAGE_FN = $"{PREFIX}text_message";
public void AddUtilities(List utilities)
{
@@ -17,7 +18,8 @@ public class OutboundPhoneCallHandlerUtilityHook : IAgentUtilityHook
Functions =
[
new($"{OUTBOUND_PHONE_CALL_FN}"),
- new($"{HANGUP_PHONE_CALL_FN}")
+ new($"{HANGUP_PHONE_CALL_FN}"),
+ new($"{TEXT_MESSAGE_FN}")
],
Templates =
[
diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Settings/TwilioSetting.cs b/src/Plugins/BotSharp.Plugin.Twilio/Settings/TwilioSetting.cs
index 81629a9e..2de42ec8 100644
--- a/src/Plugins/BotSharp.Plugin.Twilio/Settings/TwilioSetting.cs
+++ b/src/Plugins/BotSharp.Plugin.Twilio/Settings/TwilioSetting.cs
@@ -18,6 +18,8 @@ public class TwilioSetting
public string ApiSecret { get; set; }
public string CallbackHost { get; set; }
+ public string? MessagingShortCode { get; set; }
+
///
/// Default Agent Id to handle inbound phone call
///
diff --git a/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-twilio-text_message.json b/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-twilio-text_message.json
new file mode 100644
index 00000000..a4340410
--- /dev/null
+++ b/src/Plugins/BotSharp.Plugin.Twilio/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-twilio-text_message.json
@@ -0,0 +1,18 @@
+{
+ "name": "util-twilio-text_message",
+ "description": "If the user wants to send SMS message to a phone.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "phone_number": {
+ "type": "string",
+ "description": "The phone number which will receive message. It needs to be a valid phone number starting with +1."
+ },
+ "initial_message": {
+ "type": "string",
+ "description": "The initial message which will be sent."
+ }
+ },
+ "required": [ "phone_number", "initial_message" ]
+ }
+}
\ No newline at end of file