diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs index 2a1c7cd02..6078dd7bc 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs @@ -348,6 +348,10 @@ await HookEmitter.Emit(_services, async hook => await HookEmitter.Emit(_services, x => x.OnUserDisconnected(request)); } } + else if (request.CallStatus == "busy") + { + await HookEmitter.Emit(_services, x => x.OnCallBusyStatus(request)); + } return Ok(); } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioCallStatusHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioCallStatusHook.cs index bbc243c34..899cc5260 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioCallStatusHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioCallStatusHook.cs @@ -10,4 +10,13 @@ public interface ITwilioCallStatusHook Task OnRecordingCompleted(ConversationalVoiceRequest request); Task OnTranscribeCompleted(ConversationalVoiceRequest request); Task OnVoicemailStarting(ConversationalVoiceRequest request); + + /// + /// 1. The recipient's phone line is already engaged. + /// 2. Some users block unknown or spam calls, which may cause a "busy" status. + /// 3. Some carriers explicitly return a busy signal instead of routing the call to voicemail. + /// + /// + /// + Task OnCallBusyStatus(ConversationalVoiceRequest request); } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Models/ConversationalVoiceRequest.cs b/src/Plugins/BotSharp.Plugin.Twilio/Models/ConversationalVoiceRequest.cs index b5a55561d..d9dde562a 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Models/ConversationalVoiceRequest.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Models/ConversationalVoiceRequest.cs @@ -39,9 +39,6 @@ public class ConversationalVoiceRequest : VoiceRequest [FromForm] public int MachineDetectionDuration { get; set; } - [FromForm] - public int Duration { get; set; } - [FromForm] public int CallDuration { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs index 905a22537..afe6b89c6 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs @@ -145,14 +145,17 @@ private async Task ForkConversation(LlmContextIn args, Title = args.InitialMessage }); + var messageId = Guid.NewGuid().ToString(); convStorage.Append(newConversationId, new List { new RoleDialogModel(AgentRole.User, "Hi") { + MessageId = messageId, CurrentAgentId = entryAgentId }, new RoleDialogModel(AgentRole.Assistant, args.InitialMessage) { + MessageId = messageId, CurrentAgentId = entryAgentId } }); @@ -160,6 +163,7 @@ private async Task ForkConversation(LlmContextIn args, convService.SetConversationId(newConversationId, [ new MessageState(StateConst.ORIGIN_CONVERSATION_ID, originConversationId), + new MessageState("channel", "phone"), new MessageState("phone_from", call.From), new MessageState("phone_direction", call.Direction), new MessageState("phone_number", call.To),