Search code examples
nlpactions-on-googleapi-ai

Request timeout in API.AI


I have an API.ai agent that sends a request (comes from the user) to a webhook which needs a lot of processing (more than 5 sec) to get the answer. As far as I know, that there is no way to increase the response timeout in API.ai

So, I have created 2 intents. The first one simply will call my webhook to start the processing the result, and at the same time the webhook will reply to the user, "Your request is under processing...". The second intent has an event and action. The purpose of the new event is just to display the result to the user. Once the result is ready, my backend application will send a curl statement to trigger the event in the second intent with the necessary parameter modifications like sessionID, v, and time zone … etc.

I have received the following JSON from API.AI (I created an example to simplify my case):

{   "id": "de31ee96-c42f-4f2d-8461-ee39279ec2ed",   "timestamp": "2017-09-27T13:39:46.932Z",   "lang": "en",   "result": {
    "source": "agent",
    "resolvedQuery": "custom_event",
    "action": "test",
    "actionIncomplete": false,
    "parameters": {
      "user_name": "Sam"
    },
    "contexts": [
      {
        "name": "welcoming-followup",
        "parameters": {
          "name.original": "",
          "user_name": "Sam",
          "name": "",
          "user_name.original": ""
        },
        "lifespan": 2
      }
    ],
    "metadata": {
      "intentId": "c196a388-16ac-4966-b55c-7cd999a7d680",
      "webhookUsed": false,
      "webhookForSlotFillingUsed": "false",
      "intentName": "Welcoming"
    },
    "fulfillment": {
      "speech": "Hello Sam",
      "messages": [
        {
          "type": 0,
          "speech": "Hello Sam"
        }
      ]
    },
    "score": 1.0   },   "status": {
    "code": 200,
    "errorType": "success"   },   "sessionId": "67cb28fd-6871-750c-d668-d0b736b763ec" }

Here is the curl statement that was sent by my backend.

The curl statement is: curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer I INSERTED THE CORRECT CODE HERE" --data "{'event':{ 'name': 'custom_event', 'data': {'name': 'Sam'}}, 'timezone':'America/New_York', 'lang':'en', 'sessionId':'a6ac2555-4b19-40f8-92ec-397f6a042dde'}" "https://api.api.ai/v1/query?v=20150910"

As shown from the above JSON, the API.ai agent received the trigger successfully. But, The response that I have specified in the “Response Section” does not appear to the user.

I attached a screenshot for the second intent in the API.ai agent.

Note: I tried the agent in developer console, WebDemo and Slack. None of them shown to me (as a user) the specified response.

I am not sure if I did something wrong? screenshot of the second intent


Solution

  • API.AI is not really meant to handle event-driven activities. It is meant to be the intermediary in a conversation - so the normal pattern is:

    1. User says something
    2. API.AI processes this, possibly with a webhook, and sends a response.

    Devices such as Google Home do not have a way to get a notification, so unless the user says something (step 1), then you will never get to step 2.

    When you try to trigger it manually, API.AI is treating your trigger as the step 1, and it is replying to your trigger. It has no way to send that reply back to the Assistant because it isn't having a conversation with the Assistant at that moment - it is having a conversation with however you manually triggered it.

    There isn't really a good way to do what you want right now. We know notifications are coming to the Assistant eventually (it was announced at I/O 2017), but we don't know if it will have an API or what it will look like. The Transaction API does have notifications as part of it, but Transactions are meant for activities where you are purchasing or reserving something. If you need to, you can use something like Firebase Cloud Messaging to let your user know they can ask for the result, but that's a sub-optimal experience.