Serverless Watson Deployment? (Questions about integrations with other RESTful services)

181 Views Asked by At

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:

  1. Instructions on how to connect their specific device (PC, Mac, Chromebook, Xbox, Apple TV, etc.)
  2. 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.)
  3. 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:

  1. 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.

  2. 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

There are 2 best solutions below

4
On

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.

0
On

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!