I have created a chat bot in Watson Assistant (see attached workspace file). In "try it" it gives correct results.
I have created a client application to consume this chat using ASP.NET Core. There, I am saving the context. Still, the result I am getting is different than "try it".
Steps to simulate the issue:
me: Hello
reply from watson: Hello, please enter your Supplier Number for authentication.
me: 135587-1239848
reply from watson: For authentication purpose, I have sent an One Time Password (OTP) to your registered mobile number for supplier [135587-1239848]. Please enter the 6 digit OTP number
me: 121212
reply from watson: Welcome Richie. I am Shery from EXL. How can I help you today?
me: where is my invoice ?
reply from watson: Sure Richie, I can help with that! Can you please provide the Invoice number?
Till the 8th step both "try it" and ASP.NET Core client application return the same results. But at 8th step my client application again says "For authentication purpose, I have sent an One Time Password (OTP) to your registered mobile number for supplier [135587-1239848]. Please enter the 6 digit OTP number" instead of Sure Richie, I can help with that! Can you please provide the Invoice number?
Please suggest. Attached asp.net code (WatsonAPI.txt) as well what I am passing to WATSON API.
public string CallConversation(string input)
{
if (_conversation == null)
{
//_conversation = new ConversationService(_username.ToString(), _password.ToString(), "2018-05-16");
_conversation = new ConversationService(_username.ToString(), _password.ToString(), "2018-02-16");
_conversation.Endpoint = _url.ToString();
_workspaceID = _workspaceID.ToString();
}
MessageRequest messageRequest = new MessageRequest()
{
Input = new InputData()
{
//Text = _questionArray[questionIndex]
Text = input//Console.ReadLine()
},
AlternateIntents = true
};
// if (_questionContext != null)
if (Session["Context"] != null)
{
_questionContext = (dynamic)Session["Context"];
messageRequest.Context = new Context();
messageRequest.Context.ConversationId = _questionContext.conversation_id;
messageRequest.Context.System = _questionContext.system;
}
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var result = _conversation.Message(_workspaceID, messageRequest);
//Console.WriteLine(string.Format("result: {0}", JsonConvert.SerializeObject(result, Formatting.Indented)));
string strResult = "";
if (((Newtonsoft.Json.Linq.JProperty)((Newtonsoft.Json.Linq.JContainer)result.Output).First) != null)
strResult = string.Format(((Newtonsoft.Json.Linq.JProperty)((Newtonsoft.Json.Linq.JContainer)result.Output).First).Value.ToString().Replace(Environment.NewLine, ""));
//int intstart = strResult.IndexOf('"');
//Console.WriteLine(strResult.Replace("[", "").Replace("]", "").Replace("\"", "").Trim());
string strOutput = strResult.Replace("[", "").Replace("]", "").Replace("\"", "").Trim();
if (strResult.Contains("Welcome Richie. I am Shery from EXL."))
{
strOutput = "Welcome " + Convert.ToString(Session["supplierName"]) + ". I am Shery from EXL. How can I help you today?";
}
if (strResult.Contains("I have sent an One Time Password (OTP) to your registered mobile number for supplier "))
{
List<string> lstInvoicedetais = new List<string>();
lstInvoicedetais = strResult.Split('[').ToList<string>();
supplierNumber = lstInvoicedetais[2].ToString();
lstInvoicedetais = supplierNumber.Split(']').ToList<string>();
supplierNumber = lstInvoicedetais[0].ToString();
supplierName = ValidateSupplierByNumber(supplierNumber);
if (string.IsNullOrEmpty(supplierName))
{
strOutput = "Invalid Supplier number [" + supplierNumber + "]. Please enter correct supplier number.";
result.Context.supplierNumber = "0";
//_questionContext.supplierNumber = "";
setContext = false;
Session["supplierNumber"] = null;
Session["supplierName"] = null;
}
else
{
Session["supplierNumber"] = supplierNumber;
Session["supplierName"] = supplierName;
//strOutput = "Invalid Supplier number [" + supplierName + "]. Please enter correct supplier number.";
}
}
if (strResult.Contains("Sure Richie, I can help with that! Can you please provide the Invoice number?"))
{
strOutput = strOutput.Replace("Richie", Convert.ToString(Session["supplierName"]));
//strOutput = strResult;
}
if (strResult.Contains("Let me fetch the details you requested for Invoice"))
{
//List<chatSummary> lstChatSummary = new List<chatSummary>();
//lstChatSummary = (List<chatSummary>)Session["lstChatSummary"];
//lstChatSummary.Add(new chatSummary()
//{
// ByUser = "User: ",
// Message = strResult
//});
//Session["lstChatSummary"] = lstChatSummary;
//AddRowtoTable("User:", strResult);
strValue.Append(Environment.NewLine + "Bot: " + strOutput.ToString());
//textBox1.Text = strValue.ToString();
//textBox1.Text = string.Empty;
//textBox1.AppendText(strValue.ToString());
string strMessage = string.Empty;
invoiceNumber = SearchbyInvoice(strResult, (string)Session["supplierNumber"], out strMessage);
List<chatSummary> lstChatSummary = (List<chatSummary>)Session["lstChatSummary"];
if (strMessage != string.Empty)
{
lstChatSummary.Add(new chatSummary()
{
ByUser = "BOT: ",
Message = strMessage
});
}
strMessage = "Hope I provided the information you are looking for. Is there anything else that I can help you ?";
strOutput = strMessage;
}
if (strResult.Contains("Please provide Invoice Amount for the invoice Dated"))
{
List<string> lstInvoicedetais = new List<string>();
lstInvoicedetais = strResult.Split('[').ToList<string>();
invoiceDate = lstInvoicedetais[2].ToString();
lstInvoicedetais = invoiceDate.Split(']').ToList<string>();
invoiceDate = lstInvoicedetais[0].ToString();
SearchbyInvoiceDate(invoiceDate, supplierNumber, out string strMessage);
List<chatSummary> lstChatSummary = (List<chatSummary>)Session["lstChatSummary"];
if (strMessage != string.Empty)
{
lstChatSummary.Add(new chatSummary()
{
ByUser = "BOT: ",
Message = strMessage
});
}
strMessage = "Hope I provided the information you are looking for. Is there anything else that I can help you ?";
strOutput = strMessage;
//strOutput = "Commeted above";
}
if (strResult.Contains("Searching for the invoice with invoice date"))
{
strValue.Append(Environment.NewLine + "Bot: " + strOutput.ToString());
//textBox1.Text = strValue.ToString();
//textBox1.Text = string.Empty;
//textBox1.AppendText(strValue.ToString());
List<string> lstInvoicedetais = new List<string>();
lstInvoicedetais = strResult.Split('[').ToList<string>();
invoiceAmt = lstInvoicedetais[3].ToString();
lstInvoicedetais = invoiceAmt.Split(']').ToList<string>();
invoiceAmt = lstInvoicedetais[0].ToString();
}
_questionIndex++;
if (setContext == true)
{
_questionContext = result.Context;
Session["Context"] = result.Context;
}
else
{
setContext = true;
}
//if (questionIndex < 100)
// CallConversation(_questionIndex);
return strOutput;
}
{"name":"Test_VendorEnquiry","intents":[{"intent":"Notavailable","examples":[{"text":"I don�t know"},{"text":"I am not sure"},{"text":"I don�t have it"},{"text":"I do not know"},{"text":"I do not have it"},{"text":"not sure"}],"description":null},{"intent":"Invoice_Status","examples":[{"text":"Let me know status of my inovice"},{"text":"I want to know my invoice status"},{"text":"I want to know status of my Invoice"},{"text":"what is my invoice status"},{"text":"Let me know status of my invoice ?"},{"text":"where is my invoice ?"},{"text":"In what state my invoice is ?"},{"text":"Is my invoice is processed ?"}],"description":null},{"intent":"greetings","examples":[{"text":"hi"},{"text":"hi how are u"},{"text":"hi there"},{"text":"Hi watson"},{"text":"hiya"},{"text":"Hola"},{"text":"I am not feeling good"},{"text":"howdy"},{"text":"How are you doing?"},{"text":"yo"},{"text":"yello"},{"text":"namaste"},{"text":"hola como estas"},{"text":"Its not that good"},{"text":"I'm feeling good thanks"},{"text":"greetings"},{"text":"aloha"},{"text":"bad"},{"text":"bonjour"},{"text":"buenos dias"},{"text":"ciao"},{"text":"feeling bit low"},{"text":"g'day"},{"text":"good"},{"text":"good day"},{"text":"good evening"},{"text":"good how are you"},{"text":"good morning"},{"text":"Hello"},{"text":"Hello, how are you?"},{"text":"Hello Watson"},{"text":"hey"},{"text":"heya"},{"text":"hey there"}],"description":null},{"intent":"goodbyes","examples":[{"text":"adieu"},{"text":"gotta go"},{"text":"good night"},{"text":"good day"},{"text":"good bye"},{"text":"goodbye"},{"text":"farewell"},{"text":"cya"},{"text":"bye now"},{"text":"bye bye"},{"text":"BYE"},{"text":"au revoir"},{"text":"adios"},{"text":"gtg"},{"text":"have to go"},{"text":"have to leave"},{"text":"have to run"},{"text":"I'm leaving"},{"text":"later"},{"text":"laters"},{"text":"logging off"},{"text":"my time is up"},{"text":"need to go"},{"text":"need to leave"},{"text":"need to run"},{"text":"ok bye"},{"text":"out of time"},{"text":"over and out"},{"text":"see ya"},{"text":"see ya later"},{"text":"see ya soon"},{"text":"see you"},{"text":"see you later"},{"text":"see you soon"},{"text":"should be going"},{"text":"should go"},{"text":"signing off"},{"text":"signing out"},{"text":"so long"},{"text":"thanks watson"},{"text":"thank you for your help"},{"text":"then bye"},{"text":"time to go"},{"text":"toodles"},{"text":"got to go"},{"text":"gotta run"}],"description":null}],"entities":[{"entity":"OTPNumber","values":[{"type":"patterns","value":"OTPNumber","metadata":null,"patterns":["(\\d{6})"]}],"metadata":null,"description":null},{"entity":"sys-person","values":[],"metadata":null,"description":null},{"entity":"sys-time","values":[],"metadata":null,"description":null},{"entity":"InvoiceNumformat","values":[{"type":"patterns","value":"invoiceNumFormat","metadata":null,"patterns":["^[a-zA-Z0-9]+$"]}],"metadata":null,"description":null},{"entity":"sys-date","values":[],"metadata":null,"description":null},{"entity":"sys-percentage","values":[],"metadata":null,"description":null},{"entity":"sys-currency","values":[],"metadata":null,"description":null},{"entity":"sys-number","values":[],"metadata":null,"description":null},{"entity":"sys-location","values":[],"metadata":null,"description":null},{"entity":"supplierNumber","values":[{"type":"patterns","value":"suppNumber","metadata":null,"patterns":["(\\d{6})-(\\d{7})","(\\d{5})-(\\d{6})","(\\d{6})-(\\d{6})","(\\d{5})-(\\d{7})","(\\d{4})-(\\d{7})"]}],"metadata":null,"description":null,"fuzzy_match":true}],"language":"en","metadata":{"api_version":{"major_version":"v1","minor_version":"2017-05-26"}},"description":"","dialog_nodes":[{"type":"standard","title":"Send OTP for Supplier","output":{"text":{"values":["For authentication purpose, I have sent an One Time Password (OTP) to your registered mobile number for supplier [$supplierNumber]. Please enter the 6 digit OTP number"],"selection_policy":"sequential"}},"parent":"node_1_1533652772745","context":{"supplierNumber":"<? input.text ?>"},"metadata":{},"next_step":null,"conditions":"#supplierNumber","description":null,"dialog_node":"node_2_1533653340211","previous_sibling":null},{"type":"standard","title":"If invoice date is not avilable","output":{"text":{"values":["Need to have at least Invoice Number or Invoice Date."],"selection_policy":"sequential"}},"parent":"node_5_1533723730779","context":null,"metadata":{},"next_step":null,"conditions":"#Notavailable","description":null,"dialog_node":"node_9_1533723922103","previous_sibling":"node_6_1533723769818"},{"type":"standard","title":"Search with Invoice date & Invoice Amount","output":{"text":{"values":["Please provide Invoice Amount for the invoice Dated [$InvoiceDate]."],"selection_policy":"sequential"}},"parent":"node_5_1533723730779","context":{"InvoiceDate":"#sys-date"},"metadata":{},"next_step":null,"conditions":"#sys-date","description":null,"dialog_node":"node_6_1533723769818","previous_sibling":null},{"type":"standard","title":"If invoice number is not there","output":{"text":{"values":["Please provide Invoice Date ?"],"selection_policy":"sequential"}},"parent":"node_3_1533653519184","context":null,"metadata":{},"next_step":null,"conditions":"#Notavailable","description":null,"dialog_node":"node_5_1533723730779","previous_sibling":"node_4_1533723673094"},{"type":"standard","title":"Search with Invoice Number","output":{"text":{"values":["Let me fetch the details you requested for Invoice [$InvoiceNumber] . Please hold on for a moment..."],"selection_policy":"sequential"}},"parent":"node_3_1533653519184","context":null,"metadata":{},"next_step":null,"conditions":"#InvoiceNumformat","description":null,"dialog_node":"node_4_1533723673094","previous_sibling":null},{"type":"standard","title":"Search with Invoice Date and Amount","output":{"text":{"values":["Searching for the invoice with invoice date [$InvoiceDate] with amount [$InvoiceAmount]. Please wait..."],"selection_policy":"sequential"}},"parent":"node_6_1533723769818","context":{"InvoiceAmount":"#sys-currency"},"metadata":{},"next_step":null,"conditions":"#sys-currency","description":null,"dialog_node":"node_8_1533723852451","previous_sibling":"node_7_1533723817717"},{"type":"standard","title":"If invoice amount is not available","output":{"text":{"values":["Need to have both Invoice amount and Invoice Date to search invoice status. So please let us know Invoice Number or Invoice Date."],"selection_policy":"sequential"}},"parent":"node_6_1533723769818","context":null,"metadata":{},"next_step":null,"conditions":"#Notavailable","description":null,"dialog_node":"node_7_1533723817717","previous_sibling":null},{"type":"standard","title":"Enter OTP and proceed with Invoice Search","output":{"text":{"values":[],"selection_policy":"sequential"}},"parent":"node_2_1533653340211","context":{"SupplierValidated":"True"},"metadata":{},"next_step":{"behavior":"jump_to","selector":"body","dialog_node":"node_3_1533653519184"},"conditions":"#OTPNumber && $InvoiceStatusRequested==2","description":null,"dialog_node":"node_4_1533714921647","previous_sibling":"node_2_1533714230483"},{"type":"standard","title":"Enter OTP and ask what user wants to know","output":{"text":{"values":["Welcome Richie. I am Shery from EXL. How can I help you today?"],"selection_policy":"sequential"}},"parent":"node_2_1533653340211","context":{"SupplierValidated":"True"},"metadata":{},"next_step":null,"conditions":"#OTPNumber && $supplierNumber!=0 && $InvoiceStatusRequested!=2","description":null,"dialog_node":"node_2_1533714230483","previous_sibling":null},{"type":"standard","title":null,"output":{"text":{"values":[],"selection_policy":"sequential"}},"parent":null,"context":{"InvoiceStatusRequested":2},"metadata":{},"next_step":{"behavior":"jump_to","selector":"body","dialog_node":"node_1_1533652772745"},"conditions":"#Invoice_Status && $supplierNumber:0","description":null,"dialog_node":"node_1_1533800680816","previous_sibling":"node_1_1533652772745"},{"type":"standard","title":"Vendor Validation","output":{"text":{"values":["Hello, please enter your Supplier Number for authentication.","please provide your Supplier Number to assist you better."],"selection_policy":"sequential"}},"parent":null,"context":null,"metadata":{},"next_step":null,"conditions":"#greetings && $supplierNumber:0","description":null,"dialog_node":"node_1_1533652772745","previous_sibling":"node_1_1533713219851"},{"type":"standard","title":"Vendor already Validated","output":{"text":{"values":["Sure Richie, I can help with that! Can you please provide the Invoice number?"],"selection_policy":"sequential"}},"parent":null,"context":{"InvoiceStatusRequested":2},"metadata":{},"next_step":null,"conditions":"#Invoice_Status && $supplierNumber!=0 && $SupplierValidated==\"True\"","description":null,"dialog_node":"node_3_1533653519184","previous_sibling":"node_1_1533800680816"},{"type":"standard","title":null,"output":{"text":{"values":[],"selection_policy":"sequential"}},"parent":null,"context":null,"metadata":{},"next_step":{"behavior":"jump_to","selector":"condition","dialog_node":"node_2_1533653340211"},"conditions":"$supplierNumber:0 && #supplierNumber","description":null,"dialog_node":"node_5_1533715230884","previous_sibling":"Welcome"},{"type":"standard","title":"Goodbye","output":{"text":{"values":["Thank you. Good day"],"selection_policy":"sequential"}},"parent":null,"context":null,"metadata":{},"next_step":null,"conditions":"#goodbyes","description":null,"dialog_node":"node_10_1533724000756","previous_sibling":"node_3_1533653519184"},{"type":"standard","title":null,"output":{"text":{"values":[],"selection_policy":"sequential"}},"parent":null,"context":null,"metadata":{},"next_step":{"behavior":"jump_to","selector":"body","dialog_node":"node_1_1533652772745"},"conditions":"#greetings && $supplierNumber!=0","description":null,"dialog_node":"node_1_1533713219851","previous_sibling":"node_1_1533722523080"},{"type":"standard","title":"Anything else","output":{"text":{"values":["I didn't understand. You can try rephrasing.","Can you reword your statement? I'm not understanding.","I didn't get your meaning."],"selection_policy":"sequential"}},"parent":null,"context":null,"metadata":{},"next_step":null,"conditions":"anything_else","description":null,"dialog_node":"Anything else","previous_sibling":"node_10_1533724000756"},{"type":"standard","title":"Validate OTP if not entered","output":{"text":{"values":[],"selection_policy":"sequential"}},"parent":null,"context":{"InvoiceStatusRequested":2},"metadata":{},"next_step":{"behavior":"jump_to","selector":"body","dialog_node":"node_2_1533653340211"},"conditions":"$supplierNumber!=0 && $SupplierValidated!=\"True\" && #Invoice_Status","description":null,"dialog_node":"node_1_1533722523080","previous_sibling":"node_5_1533715230884"},{"type":"standard","title":"Welcome","output":{"text":{"values":["Hi, welcome to EXL Vendor Information Portal. Can you please provide your Supplier Number so that I can assist you better"],"selection_policy":"sequential"}},"parent":null,"context":{"supplierNumber":0,"SupplierValidated":"False","InvoiceStatusRequested":0},"metadata":{},"next_step":null,"conditions":"welcome","description":null,"dialog_node":"Welcome","previous_sibling":null}],"workspace_id":"ea8429e3-5eaa-4e94-935a-916bf3a769be","counterexamples":[],"system_settings":null,"learning_opt_out":false}
A couple comments:
Is your client app using the same API version as the "Try it"?
It is bad programming style to check for exact responses in your app. What happens if you change the response in Watson Assistant or support multiple languages? Use a combination of intents and placeholders. It is faster, too.
Do you really send back all context variables to correctly process the conditions for the dialog nodes? How is OTPNumber checked? Is it missing in the case of your app?