Introduction:
I feel like I’m missing something terribly obvious about how Watson Assistant should be designed at an architecture level, but maybe I’m not.
The specific problem I’m having is that I can’t seem to get API calls for information back into the conversation.
The bigger issue is that I’m not sure I setting this all up correctly for the long-haul of what I’m trying to accomplish.
Purpose:
I am building a 24/7 customer-service Tier 1 helpdesk for our managed networks. A user of one of our networks should, via SMS, Web chat, Facebook messenger, and eventually phone call, be able to ask for:
- Instructions on how to connect their specific device (PC, Mac, Chromebook, Xbox, Apple TV, etc.)
- Ask for help troubleshooting if the instructions don’t result in a successful connection. (Step by step instructions for deleting the saved network, restarting the wireless card, etc.)
- Help creating a case – at which point the conversation becomes Watson asking for a bunch of information, like what time and date they first experienced the problem, any other times/dates they experienced the problem, their MAC address, etc. etc.
Problems:
I have most of the dialog built and working well. Getting information via Entities, saving to context variables, spitting them back out to make the conversation work, digressions, etc. all working.
I cannot, for the life of me, figure out what I am doing wrong when trying to GET information from an external API.
We have a ‘daily password’ for our guest networks, and we would like a user who asks for the daily password to receive it. This involves a very simple GET request to a publicly accessible server.
I have built a BlueMix/IBM Cloud function that works perfectly, but I can’t seem to successfully call or receive information back from it.
Watson Error:
Error when updating output with output of dialog node id [node_66_xxxxxxxxxx]. Node output is [{"text":{"values":["Today's password for <? $guestNetwork.ssid ?> is <? $guestNetwork.password ?>"],"selection_policy":"sequential"}}] SpEL evaluation error: Expression [ $guestNetwork.ssid ] converted to [ context['guestNetwork'].ssid ] at position 0: EL1007E: Property or field 'ssid' cannot be found on null (and there is 1 more error in the log)
This error leads me to believe I am not properly defining the result variable in Watson, or improperly trying to retrieve it in conversation – because I do know my code returns the SSID and Password when I run it in BlueMix Console.
JSON for the action itself (and yes, I am setting the credentials in the previous node):
{
"output": {
"text": {
"values": [
"Today's password for <? $guestNetwork.ssid ?> is <? $guestNetwork.psk ?>"
],
"selection_policy": "sequential"
}
},
"actions": [
{
"name": "get-http-resource/getGuestNetworkPassword",
"type": "server",
"credentials": "$private.myCredentials",
"result_variable": "$guestNetwork"
}
]
}
Question:
-
Is my idea of a ‘serverless’ Watson possible by using Watson <-> IBM Cloud <-> external services? We don’t currently have an ‘application’ or a server, it’s all integrations between existing services.
-
Can anyone help me understand what I’m doing wrong when trying to access that variable?
Bonus points: How do I know to access the variable only after the action has completed successfully in IBM cloud? Basically, if accessing the information via the IBM Cloud function I wrote takes 1.5 seconds, do I need to pause the dialog for 1.5 seconds? Or am I completely missing the point for how to get external info in and out of Watson?
EDIT:
After watching Mitch’s video, I have changed a couple things around, and the error message has evolved to this:“Error when updating output with output of dialog node id
[node_66_1533646714776]. Node output is [{“text”:{“values”:[“Today’s
password for is “],”selection_policy”:”sequential”}}] SpEL evaluation error:
Expression [ $guestNetwork[‘ssid’] ] converted to [
context[‘guestNetwork’][‘ssid’] ] at position 24: EL1012E: Cannot
index into a null value” error.
2
Answers
We re-created the action using the default package (not having it in a sub-package), and it started working immediately.
Things to note: Watson dialog editor does not like dashes in the package name.
Thanks Mitch!
Without seeing your dialog, its a guess, but most common error I see is that you just need to jump to a child dialog node after doing the action call. You cannot do the action call and show the response in the same dialog node, as dialog needs a chance to run the action.
Its outlined in my video here:
https://ibm-dte.mybluemix.net/ibm-watson-assistant?refresh
see the video on dialog callouts. Its 13 minutes long I’m sure you only need about 2 of them, but still, should help.
What you are trying to do is definitely possible, especially if it works from within the cloud function environment.