Alexa Custom Slot Type: No value in intent
Asked Answered
G

4

7

I've already posted this question to the amazon developer forum but don't receive an answer there. I guess Stackoverflow should've been the first choice from the beginning:

From my understanding if I use a Custom Slot Type even if the list of its possible values does not contain the spoken word the spoken word is still passed to the function. The documentation says

A custom slot type is not the equivalent of an enumeration. Values outside the list may still be returned if recognized by the spoken language understanding system.

Now I have a Custom Slot Type LIST_OF_PERSONS with values Matthias|Max and an utterance of

EmployeeDetailsIntent {Person} 

If I call this intend with a value not in LIST_OF_PERSONS the Intent still gets called but the JSON does not contain a "value" key for the Slot:

"request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.a943e233-0713-4ea5-beba-d9287edb6083",
    "locale": "de-DE",
    "timestamp": "2017-03-09T14:38:29Z",
    "intent": {
      "name": "EmployeeDetailsIntent",
      "slots": {
        "Person": {
          "name": "Person"
        }
      }
    }
  }

Is this "works as designed" or a bug? How do I access the spoken word in the Intent then? As this.event.request.intent.slots.Person.value is undefined?

My code lives in AWS lambda and I'm using the nodejs alexa-sdk Version 1.0.7. The language of my Skill is German.

Gynaecology answered 10/3, 2017 at 15:8 Comment(3)
Wierd. I've never had a case where the 'value' attribute was missing from the slot info. One thing I would note is that my lists of words for custom slots are line separated. You appear to be using a bar separator?Coltun
The bar/pipe separator is just what the Amazon dev console show me as a summary. When I edit the values they are line separated as requiredGynaecology
Then all I can suggest is that you try the same skill and intents with en-US locale because the problem might be specific to de-DE since it is much newer and less used.Coltun
F
4

(disclaimer: this post summarises my own "workaround". It might or might not be the "best way". Seems to have worked for me so thought I would share / document it here briefly)

I've recently bumped into similar issues for an utterance that looks like this:

"tell me about {townName}"

If I say "tell me about London", it works.

If I say "tell me about" (deliberately missing a {townName}), the program "dies" (and returns a JSON looking similar to your one, with undefined this.event.request.intent.slots.townName.value)

Though I'm not 100% sure whether this is meant to be a "feature" (i.e. we need to write smarter code to work around this) or "problem" (i.e. Alexa team needs to address or fix). This scenario has caused a real issue when it came to the certification process for me recently.

To get through this, I've implemented a workaround (or fix, whatever you call it) to avoid Alexa from "dying" as a result of this edge case.

From the Alexa skill-sample-nodejs-trivia index.js file, I've found a snippet function that helped me work around this (I've edited it a bit for my example for simplicity):

function isAnswerSlotValid(intent) {
    var answerSlotFilled = intent && intent.slots &&
        intent.slots.townName && intent.slots.townName.value;
    return answerSlotFilled
}

(i.e. this function returns True for valid values for the slot townName and and False for undefined / otherwise).

When it comes to defining the intent, I could use this function to "get around" an empty slot value scenario:

var startHandlers = Alexa.CreateStateHandler(states.START,{

  // bla bla bla//

  "AnswerIntent": function() {  

    // handel missing slot value
    var answerSlotValid = isAnswerSlotValid(this.event.request.intent);

    if (answerSlotValid && moreConditions) {
      // do something fun
    }
    else {
      // handle empty slot scenario
    }
  }

  // bla bla bla//

}

Would be interested to see if there are better / more "proper" solutions to this to handle empty / undefined slots more elegantly.

Flintlock answered 21/6, 2017 at 13:45 Comment(0)
S
1

I have seen this happen when an intent has both utterances with and without a slot. For example:

myIntent what makes a car go fast myIntent what makes a {CAR_TYPE} go fast

where CAR_TYPE has a list of different types of cars.

myIntent still needs to define the slot CAR_TYPE for the myIntent in the schema, but the first intent doesn't use it. In this case, it might be best to include 'car' in CAR_TYPE and eliminate the first utterance. In other cases though, the sentence grammar really doesn't permit it, so you need to expect an empty slot like you're seeing.

Sacring answered 13/3, 2017 at 12:3 Comment(0)
L
1

I believe the issue is that utterances using a Custom Slot Type must be used with at least one other value.

For example

EmployeeDetailsIntent get {Person}

will work, while

EmployeeDetailsIntent {Person} 

will not

Licking answered 19/6, 2017 at 17:56 Comment(0)
M
1

Had same thing, get custom slot name, but value was missing in Json Input. Worked with normal slots. Using Alexa Developer Console. Had to add an "ID" value to my custom slot values and then I started getting values. I thought I had tried that before but maybe I had not put an ID on each value. That did the trick for me though where the other answers did not work for me.

Misguided answered 12/4, 2019 at 22:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.