Watson Assistant CURL API: How to send follow up message? - php

I'm trying out IBM Watson Assistant. Ultimate goal is to integrate it with my custom PHP backend, via it's Watson Assistant's cURL API Endpoints (because there's no complete PHP SDK yet).
Let me tell what I did so far:
Imported a sample Workspace from a Training Data Set.
Then I tried this, and it works fine.
Then I tried that exact same thing via cURL API, I got a response like this: (The json output format beautified)
.
{
"intents": [
{
"intent": "locate_amenity",
"confidence": 0.999901008605957
}
],
"entities": [
{
"entity": "amenity",
"location": [
7,
10
],
"value": "gas",
"confidence": 1
}
],
"input": {
"text": "i need some gas"
},
"output": {
"text": [
"Hi. It looks like a nice drive today. What would you like me to do? "
],
"nodes_visited": [
"Start And Initialize Context"
],
"log_messages": []
},
"context": {
"conversation_id": "153c18ee-1015-4b6a-ae04-789e29bf4a05",
"system": {
"dialog_stack": [
{
"dialog_node": "root"
}
],
"dialog_turn_counter": 1,
"dialog_request_counter": 1,
"_node_output_map": {
"Start And Initialize Context": [
0,
0
]
},
"branch_exited": true,
"branch_exited_reason": "completed"
},
"AConoff": "off",
"lightonoff": "off",
"musiconoff": "off",
"appl_action": "",
"heateronoff": "off",
"volumeonoff": "off",
"wipersonoff": "off",
"default_counter": 0,
"previous_cuisine": "",
"previous_restaurant_date": "",
"previous_restaurant_time": ""
}
}
Now please let me understand 2 things here.
Question (1)
At this point, I was expecting the API to return with a message:
"There are gas stations nearby. Which one would you like to drive to?"
But why it doesn't. If then, how do I achieve it?
Question (2)
How do I properly reply back with "Go to number 5." so that the API understands I'm referring to the previous Call? (aka) How to I continue the dialog flow? (Note: I tried sending back with the previous "contexts", "entities", "intents", but it is somehow still recognised as a new message.)
Please share me an example of cURL call to follow up the previous message.
Since there's no complete PHP SDK yet, it is very hard for me to understand just by the cURL API calls. API Documentation does not explain to that details too. Please help.
Thank you all.

The message API for Watson Assistant is stateless. Everything that is needed to process a request is submitted as parameters. This includes the message itself, but also the context. The context holds the state about where in the dialog tree the conversation is. It could also hold information that is transferred from WA to the app, e.g., to process a client-side action. Or from the app to WA, e.g., with a record from a database.
Coming to your request:
Your dialog probably sends out that reponse when a new conversation is started. I see it is the same as in the "Try it out".
You would need to send a "Hi" or empty message first, wait for the reponse from WA, then send your "I need gas" together with the context data you received from WA. WHen you look into the details, you see the dialog stack, turn counter and more. The conversation ID is the identifier for that current chat.
With the above, WA's next response should be exactly like in the "Try it out" because you went down in the dialog tree.

Related

Can't update SendGrid Single Send associated lists using the API

I'm using the latest SendGrid PHP API. I can successfully create a Single Send using the API, and easily associate lists the Single Send should go to when it's eventually scheduled (by list ID). When I use the API to then update that Single Send to use different lists, the list changes are not reflected in the SendGrid dashboard - only name changes, etc. The API request is successful in code and when using Postman. SendGrid's API response to the update reflects my changes in what they return back to me. The Single Send is also in "draft mode" when I attempt this. The associated lists in the SendGrid dashboard never change.
API call to Single Send Update Endpoint (PATCH):
https://api.sendgrid.com/v3/marketing/singlesends/3ee0cd4e-62f7-21eb-8ee8-3a2e1ebc21ed
with param:
{
"name": "TESTER 2",
"send_to": {
"list_ids": [
"52ca8ad3f-9db1-4c2x-1f01-85beecbx94c2"
]
}
}
And SendGrid returns (202, successful response code):
{
"id": "3ee0cd4e-62f7-21eb-8ee8-3a2e1ebc21ed",
"name": "TESTER 2",
"status": "draft",
"categories": [],
"send_at": "2021-02-01T19:06:00Z",
"send_to": {
"list_ids": [
"52ca8ad3f-9db1-4c2x-1f01-85beecbx94c2"
],
"segment_ids": [],
"all": false
},
"updated_at": "2021-01-31T22:52:58Z",
"created_at": "2021-01-31T19:07:20Z",
"email_config": {
"subject": "Hello World",
"html_content": "Hello World!",
"plain_content": "Hello World!",
"generate_plain_content": false,
"editor": "code",
"suppression_group_id": null,
"custom_unsubscribe_url": "https://www.example.org/unsubscribe",
"sender_id": 1212111,
"ip_pool": null
}
}
But, the associated contact lists are not updated. Anyone have any suggestions? My only workaround is to simply delete the single send every time and just re-create it. I'm storing their ID's locally so this adds a bit more work on my end, but I'm not sure what else to do.
To anyone struggling with this, hopefully this will save you some time. The problem wasn't with the API at all, but with the SendGrid dashboard. You need to do a hard reload on the Single Send dashboard page to see your changes. The SendGrid dashboard is a SPA. Ugh.

Riot API server callback

I am making website to organize tournaments in League of Legends game. I have problem with receiving data about completed games from automatic callback.
The steps which we take:
We register provider with tournament-v3:
http://example.pl/riotcallbackinfo
on server EUNE
and recive id=10xx
We register tournament, and create tournament code successfully.
tournamentId=256xxx
code: EUNE043bb-xxx4d390-xxxx-4f2c-xxxx-4dc266xxxxxx
3. We play game with generated tournament code and completed it successfully.
After the match we should receive some data to our url:
example.pl/riotcallbackinfo
but nothing is sending. We have log system to check every time someone call this url and there is no information about calling it by riot api.
We can get data about this completed game using match-api-v3 and it is looked, like game is finished successfully.
We tried to register also http://example.pl:80/riotcallbackinfo url, but with no success.
To backed we use Laravel PHP 5.4. The documentation says:
"The following ports are forwarded to your Homestead environment:
HTTP: 8000 → Forwards To 80"
Lobby events for this game are:
{
"eventList": [
{
"timestamp": "1498128797694",
"summonerId": "23509512",
"eventType": "PracticeGameCreatedEvent"
},
{
"timestamp": "1498128833935",
"eventType": "GameAllocationStartedEvent"
},
{
"timestamp": "1498128803131",
"eventType": "ChampSelectStartedEvent"
},
{
"timestamp": "1498128798414",
"summonerId": "34477543",
"eventType": "PlayerJoinedGameEvent"
},
{
"timestamp": "1498128834399",
"eventType": "GameAllocatedToLsmEvent"
}
]
}
We have tested our url method with Postman and sending your sample JSON response and everything worked fine. Even if our method is broke we should see something in log. Our log is set at the beginning of the method.
Could you suggest us, were could have problem? Why couldn’t we get data from automatic callback? There is problem with our URL or is something what we understand wrong?
Thank you in advance for your help

GA not tracking certain actions

Our site is tracking CC and other transaction just fine, but has a problem with EFT transactions.
I have established that we are writing to the socket that is listening for GA calls with the correct information (compared it to another action that is being tracked correctly).
I need some help debugging the issue and was wondering if there was anywhere on the GA interface that I could see attempted and failed calls?
The moment you see it in the interface it's by definition not a failed call so, no, but there is a debugger extension that writes errors (if any) to the browser console.
If you do your tracking serverside (as you are talking about sockets) you could log the outgoing tracking calls to a file and send them to the debug endpoint by inserting the word "debug" after the hostname (so this would look something like google-analytics.com/debug/collect?v=1&tid=.....).
The debug endpoint will return a json response that points out missing or invalid fields. Example response below:
{
"hitParsingResult": [ {
"valid": false,
"parserMessage": [ {
"messageType": "ERROR",
"description": "The value provided for parameter 'tid' is invalid. Please see http://..... for details.",
"messageCode": "VALUE_INVALID",
"parameter": "tid"
} ],
"hit": "/debug/collect?v=1\u0026_v=j41d\u0026a=335525335\u0026t=pageview\u0026_s=1\u0026dl=file%3A%2F%2F%2FUsers%2Fepierstorff%2FDesktop%2Ftest.html\u0026dp=http%3A%2F%2F%2FUsers%2Fepierstorff%2FDesktop%2Ftest.html\u0026ul=de\u0026de=windows-1252\u0026dt=OFfline\u0026sd=24-bit\u0026sr=2560x1440\u0026vp=2385x678\u0026je=0\u0026fl=21.0%20r0\u0026_u=QEAAAIABI~\u0026jid=2113413999\u0026cid=761062822.1461745183\u0026tid=UA-XXXXXX-X\u0026_r=1\u0026z=140208380"
} ],
"parserMessage": [ {
"messageType": "INFO",
"description": "Found 1 hit in the request."
} ]
}

How to look up user information from Google GAIA ID?

I've been working on a Hangouts.json parser for Google's Takeout service that takes all of the conversations, attachments, and miscellaneous information from the json file and populates a database with everything. I've finished everything but the only information the json file provides for who sent what is a GAIA ID that I've been able to figure out is the unique ID Google uses between their services. The problem is I don't know how to look up any other information about the user such as the name they identify with or their email.
I know most of the information is publicly available as you can take the GAIA ID and put it into a URL like: https://plus.google.com/u/0/#####################/about where the #'s are the GAIA ID. This page will reveal their screen name publicly. When a email address is unknown the same thing can be inferred by using: reply-######################profiles.google.com where this will also be able to be used to contact them.
Ideally I'd like to be able to look up a user's screen name without having to parse that public Google+ page at least but a true email would be great as well. So ideally I'd like an API or other resource to look up screen names and / or email info from a GAIA ID.
IMPORTANT UPDATE
March 2019: This answer is still getting up votes, however Google are withdrawing / have withdrawn the Google Plus API.
You will need an alternative solution as this will no longer apply.
Original Reply
Use the Google Plus API: https://developers.google.com/+/api/
I've not tested specifically with Hangouts (I never knew there was a Hongouts API!) but it returns details given IDs from other APIs.
You can test it out here: https://developers.google.com/apis-explorer/#p/plus/v1/plus.people.get to see what you'll get.
The Gaia ID may be obtained with the People API, by requesting the metadata in the personFields.
You may try it with the Google APIs Explorer (sample links are provided below).
For any of your contacts (provided he/she is a google user), using the people.connections/list resource :
People API - people.connections/list - personFields=names,metadata
(I have included the names value in the personFields for better illustration, though it is not required to retrieve the Gaia Id)
Sample output (1XXXXXXXXXXXXXXXXXXXX is the Gaia Id):
{
"connections": [
{
"resourceName": "people/c42",
"etag": "...",
"metadata": {
"sources": [
{
"type": "CONTACT",
...
},
{
"type": "PROFILE",
"id": "1XXXXXXXXXXXXXXXXXXXX",
...
"profileMetadata": {
"objectType": "PERSON",
"userTypes": [
"GOOGLE_USER"
]
}
}
....
],
"objectType": "PERSON"
}
"names": [
{
...
"displayName": "John Doe",
...
}
]
},
...
}
For yourself or any user using the people/get resource
People API - people/get - personFields=metadata
In the resourceName field :
use people/me to obtain your informations.
use the resourceName value previously retrieved in a people.connections.list request to retrieve another user informations
Sample output (1XXXXXXXXXXXXXXXXXXXX is the Gaia Id):
{
"resourceName": "people/...",
"etag": "....",
"metadata": {
"sources": [
{
"type": "PROFILE",
"id": "1XXXXXXXXXXXXXXXXXXXX",
"etag": "...",
"profileMetadata": {
"objectType": "PERSON",
"userTypes": [
"GOOGLE_USER"
]
}
...
},
...
],
"objectType": "PERSON"
}
}
Go to google chat.
create a chat with the person you want to find gaia id.
tag the person in the chat window
(#name of person)
right click the name, click "Inspect"
There you will find the ID
data-user-id="10xxxxxxxxxxxxxxxxxxx
#Name of person

Google Datastore returning "503 Backend Error"

I'm sending the following request to the Google Datastore API, via the PHP client, and i'm getting a "503 Backend Error" without any other information. I tried the online client available here, but the error is the same. Maybe something is malformed on my request? The documentation wasn't very helpful:
{
"mode": "NON_TRANSACTIONAL",
"mutation": {
"upsert": [
{
"key": {
"path": [
{
"kind": "Log"
}
]
},
"properties": {
"event": {
"indexed": false,
"stringValue": "new_order"
},
"dataType": {
"indexed": false,
"stringValue": "test"
}
}
}
]
}
}
Any ideas of what might be causing this behavior? Or how to enable more detailed feedback from the API?
When you perform POST https://www.googleapis.com/datastore/<APIversion>/datasets/<datasetId>/commit, make sure that if you created your project using the old Admin Console that your datasetId in the URL is the App Engine application ID, and that if you created your project using the Developer Console, that your datasetId is the project ID you see in the Developer Console.
Also, if you created your project through the new Developer Console, try toggling the API on and off.
Finally, check that you are completing the OAuth flow properly, all your client ID info makes sense, and that you are setting up the right scopes, etc...

Categories