diff --git a/src/Infrastructure/BotSharp.Core/Routing/Handlers/RouteToAgentRoutingHandler.cs b/src/Infrastructure/BotSharp.Core/Routing/Handlers/RouteToAgentRoutingHandler.cs index 6faf6471a..94539b9b8 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Handlers/RouteToAgentRoutingHandler.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Handlers/RouteToAgentRoutingHandler.cs @@ -11,18 +11,18 @@ public class RouteToAgentRoutingHandler : RoutingHandlerBase, IRoutingHandler public List Parameters => new List { - /*new ParameterPropertyDef("next_action_reason", + new ParameterPropertyDef("next_action_reason", "the reason why route to this virtual agent.", - required: true),*/ + required: true), new ParameterPropertyDef("next_action_agent", "agent for next action based on user latest response, if user is replying last agent's question, you must route to this agent.", required: true), new ParameterPropertyDef("args", "useful parameters of next action agent, format: { }", type: "object"), - /*new ParameterPropertyDef("user_goal_description", + new ParameterPropertyDef("user_goal_description", "user goal based on user initial task.", - required: true),*/ + required: true), new ParameterPropertyDef("user_goal_agent", "agent who can acheive user initial task.", required: true), diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-0af7-49e6-ad7a-a760bd12dc4d/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-0af7-49e6-ad7a-a760bd12dc4d/agent.json index a7fd580e6..c54a67e00 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-0af7-49e6-ad7a-a760bd12dc4d/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-0af7-49e6-ad7a-a760bd12dc4d/agent.json @@ -7,5 +7,9 @@ "updatedDateTime": "2024-05-07T10:00:00Z", "disabled": false, "isPublic": true, + "llmConfig": { + "provider": "openai", + "model": "gpt-4o-mini" + }, "profiles": [ "fallback" ] } diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instructions/instruction.liquid b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instructions/instruction.liquid index 182a25841..bc614f81e 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instructions/instruction.liquid +++ b/src/Infrastructure/BotSharp.Core/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instructions/instruction.liquid @@ -19,6 +19,7 @@ Follow these steps to handle user request: # {{ handler.description}} {% if handler.parameters and handler.parameters != empty -%} Parameters: + - function: {{ handler.name }} {% for p in handler.parameters -%} - {{ p.name }} {% if p.required -%}(required){%- endif %}: {{ p.description }}{{ "\r\n " }} {%- endfor %} diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs index 9521e8ff0..a89c64648 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs @@ -47,15 +47,16 @@ public async Task ReceiveCallerMessage([FromRoute] string conversat var messageQueue = _services.GetRequiredService(); var sessionManager = _services.GetRequiredService(); var messages = await sessionManager.RetrieveStagedCallerMessagesAsync(conversationId, seqNum); - if (!string.IsNullOrWhiteSpace(request.SpeechResult)) + string text = (request.SpeechResult + "\r\n" + request.Digits).Trim(); + if (!string.IsNullOrWhiteSpace(text)) { - messages.Add(request.SpeechResult); - await sessionManager.StageCallerMessageAsync(conversationId, seqNum, request.SpeechResult); + messages.Add(text); + await sessionManager.StageCallerMessageAsync(conversationId, seqNum, text); } VoiceResponse response; if (messages.Count == 0 && seqNum == 0) { - response = twilio.ReturnInstructions("twilio/welcome.mp3", $"twilio/voice/{conversationId}/receive/{seqNum}?states={states}", true); + response = twilio.ReturnInstructions("twilio/welcome.mp3", $"twilio/voice/{conversationId}/receive/{seqNum}?states={states}", true, timeout: 2); } else { diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Services/TwilioService.cs b/src/Plugins/BotSharp.Plugin.Twilio/Services/TwilioService.cs index 718741a1c..309d627c8 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Services/TwilioService.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Services/TwilioService.cs @@ -54,7 +54,8 @@ public VoiceResponse ReturnInstructions(string message) { Input = new List() { - Gather.InputEnum.Speech + Gather.InputEnum.Speech, + Gather.InputEnum.Dtmf }, Action = new Uri($"{_settings.CallbackHost}/twilio/voice/{twilioSetting.AgentId}") }; @@ -70,7 +71,8 @@ public VoiceResponse ReturnInstructions(string speechPath, string callbackPath, { Input = new List() { - Gather.InputEnum.Speech + Gather.InputEnum.Speech, + Gather.InputEnum.Dtmf }, Action = new Uri($"{_settings.CallbackHost}/{callbackPath}"), SpeechModel = Gather.SpeechModelEnum.PhoneCall, @@ -109,7 +111,11 @@ public VoiceResponse HoldOn(int interval, string message = null) var response = new VoiceResponse(); var gather = new Gather() { - Input = new List() { Gather.InputEnum.Speech }, + Input = new List() + { + Gather.InputEnum.Speech, + Gather.InputEnum.Dtmf + }, Action = new Uri($"{_settings.CallbackHost}/twilio/voice/{twilioSetting.AgentId}"), ActionOnEmptyResult = true };