0

I am trying to pass parameter value from google actions to my fulfillment. However, I am not able to get only the parameter value. How should I able to get only "Asda" under newName field from the argument? Do I have to extract it from conv (like conv.inputs.arguments[1].rawText)? if like this, then what is the purpose of having a name for the parameter?

Request JSON from Google Actions:

{
  "user": {
    "userId": "ABwppHEAPgcgb2yFUFURYFEJGg4VdAVcL9UKO9cS7a7rVfAMr9ht67LzgrmMseTvb5mmJjbjj7UV",
    "locale": "en-US",
    "lastSeen": "2018-05-15T01:08:55Z",
    "userStorage": "{\"data\":{}}"
  },
  "conversation": {
    "conversationId": "1526346570079",
    "type": "NEW"
  },
  "inputs": [
    {
      "intent": "com.example.test.RENAME",
      "rawInputs": [
        {
          "inputType": "KEYBOARD",
          "query": "Talk to GoTestApp to rename Asda"
        }
      ],
      "arguments": [
        {
          "name": "trigger_query",
          "rawText": "rename Asda",
          "textValue": "rename Asda"
        },
        {
          "name": "newName",
          "rawText": "Asda",
          "textValue": "Asda"
        }
      ]
    }
  ],
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      },
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      }
    ]
  },
  "isInSandbox": true,
  "availableSurfaces": [
    {
      "capabilities": [
        {
          "name": "actions.capability.SCREEN_OUTPUT"
        },
        {
          "name": "actions.capability.AUDIO_OUTPUT"
        }
      ]
    }
  ]
}

My code of Fulfillment side:

app.intent('com.example.test.RENAME', (conv, input, arg) => {
  console.log(input); //print Talk to GoTestApp to rename Asda
  console.log(arg); //only print "rename Asda"
  console.log(arg[1]) //only print "e"
}

Action Package action:

  "name": "RENAME",
  "intent": {
    "name": "com.example.test.RENAME",
    "parameters": [{
      "name": "newName",
      "type": "SchemaOrg_Text"
    }],
    "trigger": {
      "queryPatterns": [
        "rename $SchemaOrg_Text:newName"
      ]
    }
  },
  "fulfillment": {
    "conversationName": "example"
  }
}
holopekochan
  • 595
  • 2
  • 10
  • 18

2 Answers2

1

Looks like you want to get an Actions SDK argument by name, which then you can use:

const newName = conv.arguments.get('newName')

This will return the rawText of the argument.

Argument retrieval is pretty complicated so there's actually 4 ways to retrieve arguments either by name or by list.

conv.arguments.get (which is a shortcut for conv.arguments.parsed.get) will get an argument by name returning the inferred property excluding name and status and returning textValue with last priority.

conv.arguments.status.get can be used to get a status argument by name.

The most common use case is when there is only one argument, so there's a shortcut for retrieving the single argument via the intent handler like you mentioned.

app.intent('intent.name', (conv, input, arg, status) => {
  console.log(arg); // print the parsed single argument like `rawText` if exists
  console.log(status) // print the single argument status if exists
}

To get the raw argument by name without doing any inferred parsing, you can use conv.arguments.raw.get. Then you can manually extract out the properties like rawText or textValue yourself.

With each of these getters for arguments, there's a corresponding way to retrieve by order with an array: conv.arguments.parsed.list, conv.arguments.status.list, and conv.arguments.raw.list.

conv.arguments is also iterable for raw values, so if you want to loop through the raw arguments, just do:

for (const arg of conv.arguments) {
  const value = arg.rawText;
}
Shuyang Chen
  • 448
  • 3
  • 10
0

If your 'newName' is a parameter defined in dialogflow, then you can easily access it with conv like this:

let newN = conv.parameters['newName'];
Rémi C.
  • 339
  • 2
  • 12