Getting error while using LUIS recognizer - bots

Whenever I'm trying to get response using below code, I'm getting exception 'Response status code does not indicate success: 404 (Not Found).'. Please help me out.
var luisApp = new LuisApplication(configuration["LuisAppId"], configuration["LuisAPIKey"], configuration["LuisAPIHostName"]);
var recognizerResult = await recognizer.RecognizeAsync(turnContext, cancellationToken);

If you are talking about LUIS recognizer class, I will highly suggest you check properties and anything else according to the document:
PROPERTIES
applicationId
Your models application Id from LUIS
endpoint
(Optional) LUIS endpoint with a default of https://westus.api.cognitive.microsoft.com
endpointKey
Endpoint key for talking to LUIS
https://learn.microsoft.com/en-us/javascript/api/botbuilder-ai/luisapplication?view=botbuilder-ts-latest

One thing that I forgot to apply (while developing the solution), was that the LUIS application has to be deployment to the production slot as well. If that does not happen, you'll get that 404 as well. Just wanted to share, in case others need it.

Related

Need help and guidance for accessing operationId in nodejs application

We are using nodejs as my backend application and react native in front end. And azure application insights for logging. In UI side, we are redirecting to Stripe checkout page(external page) for payment and then coming back to our application's confirmation page. Here we are loosing the flow on end-to-end transaction. My requirement is to link pre-stripe and post-stripe operation into one single flow. For this my approach of solving this problem is accessing OPERATIONID and pass it to stripe and receive it back from Stripe and use it in confirmation page so that we will one single flow. I Need help in guiding me to the right documentation/ solution proposals.
I read some articles(eg: How to get Application Insights operation id in javascript?) and figured out that operationId is a uniqueID which gets created out of my application and cant access it in the application. I tried to use below code and got response of that operationID as "ai.operation.id" but seems like this is not the right pattern(value) of operationId.
import { defaultClient } from 'applicationinsights';
const telemetryClient = defaultClient;
// tslint:disable-next-line:no-console
console.log(telemetryClient.context.keys[`operationId`]);
The main function of operationId is to help tracking distributed systems so you can correlate requests. So as given in this documentation in nodejs client, you should set the setDistributedTracingMode to appInsights.DistributedTracingModes.AI_AND_W3C as shown below.
const appInsights = require("applicationinsights");
appInsights
.setup("<your ikey>")
.setDistributedTracingMode(appInsights.DistributedTracingModes.AI_AND_W3C)
.start()
You should be able to get the operation id using the following code snippet.
const AppInsights = require("applicationinsights");
var context = AppInsights.getCorrelationContext();
var oid = context.operation.id;
If it does not solve your problem then, I would suggest you to set telemetry.context.operation.id to be a unique id by yourself and confirm if this is tracked by the Application Insights properly.
Also note that the latest version of the JavaScript SDK (SDK v2) for Application Insights have some changes as given in this document.
Moved context.operation to context.telemetryTrace. Some fields were also changed (operation.id --> telemetryTrace.traceID).
To keep the trace ID unique, where you previously used Util.newId(), now use Util.generateW3CId(). Both ultimately end up being the operation ID.
For more information read this log custom telemetry document.

azure - keep receiving 404 for a cognitive service I just signed up?

This is super werid.
So I just created my resource group and signed up for a cognitive service.
pretty sure i have the right key and the right resource url.
yet I kept receiving "404 resource not" found for every api call i made to it.
Anyone ever ran into a problem similiar to this? And what do you think what might be the problem here? Will super appreicate any suggestions & recommendtions on how to resolve it!
solved it.. imageSearchEndPoint in
const client = new ImageSearchClient(cognitiveServiceCredentials, {
endpoint: imageSearchEndPoint,
});
(of the #azure/cognitiveservices-imagesearch) should just be the full domain name and not the full api url
i.e. https://meow.cognitiveservices.azure.com/ and not https://meow.cognitiveservices.azure.com/bing/v7.0.

Wrong recipient error while using SignIn after switching Dialogflow agents

I made a new Dialogflow agent and transferred my code, which was working on the previous agent, to the new one. One of the main things my agent does is account linking using the SignIn helper. I also got a new clientID in my Google Assistant console and pasted it in my code.
Now however I get this error in my NGROK: {"error":"Wrong recipient, payload audience != requiredAudience"}
I assume the problem is related to Dialogflow's clientID, which I replaced in my code after transferring to a new agent. The problem? I have no idea what the error means and the internet isn't helping me understand it too much, since I'm not advanced at this yet.
This is how I link my clientID as described here: https://developers.google.com/assistant/identity/google-sign-in
const app = dialogflow({
clientId: 'xxxxxxxxxxxxxx.apps.googleusercontent.com',
debug: false,
});
Does anyone know what the problem might be/have experience with this error? I know it isn't in my code, since it worked before.

application not found with luis api version 3.0 preview

I was testing the new preview 3.0 version for LUIS on the test console available at "https://westus.dev.cognitive.microsoft.com/docs/services/luis-endpoint-api-v3-0-preview/operations/5cb0a9459a1fe8fa44c28dd8/console" .
Despite I am using the same key and app id that correctly work for version 2.0 I get as response the error message "The application wasn't found. Please make sure that the application is published to this region".
The ID for the application I inserted in the console form is published for westus region, the error message seems not truthful.
Anybody else is having the same issue?
Thanks
It seems like a bug in the documentation. Please try adding /slot/{slotName}/ before the predict keyword, where slotName is either staging or production. So the url becomes:
https://westus.api.cognitive.microsoft.com/luis/v3.0-preview/apps/{appId}/versions/{versionId}/slots/{slotName}/predict?query={query}
An example would be:
https://westus.api.cognitive.microsoft.com/luis/v3.0-preview/apps/a1fc3658-a4c5-4fb2-88d3-69ba49e7abad/versions/0.1/slots/production/predict?query={query}
Thanks for your reply.
I added the /slot/production or /slot/staging part to the URL but this seems not to be enough for me.
After this change I get a 404 error as answer:
{
"error": {
"statusCode": 404,
"message": "Resource not found"
}
}
This is a new feature introduced in v3. We now allow publishing to the endpoint using the version Id instead of publishing to a slot. Since the version publishing isn't supported in the UI currently, you won't be able to publish to a version (yet). For now, use the publishing slot as Omar suggests.
Below the working Request URL produced by the get published slot prediction console, available at https://westus.dev.cognitive.microsoft.com/docs/services/luis-endpoint-api-v3-0-preview/operations/5cb0a91e54c9db63d589f433/console :
https://westus.api.cognitive.microsoft.com/luis/v3.0-preview/apps/{APPID}/slots/Production/predict?query={QUERY}&verbose=true&log=true&show-all-intents=true
Thanks

Is it possible to lookup a database in a Dialogflow intent?

I'm trying to make an app using DialogFlow which finds a specific object in a specific place.
This is a generic example.
The user would say something like "Where to I find Dog in Europe" and the app would reply with "Dog can be found in Europe via: breeding, finding it out in the wild or by buying it"
considering Dog as input1 and europe as input2
Ideally the app should be able to cross reference input1 and input2 to find the correct response. Can I implement a database like structure and do this?
You can't access a database from Dialogflow directly, but you can build your own fulfillment backend that can do anything you want. It communicates with Dialogflow via HTTP requests/responses in the Dialogflow Webhook format.
Here is an example fulfillment that reads data from Firebase database - https://github.com/actions-on-google/dialogflow-updates-nodejs
You can't access a database directly in Dialog flow, but you can build your own fulfillment back end. I have been using Airtable as a database and Integromat and Webhooks to query the database and parse the results back to Dialogflow. As a novice coder I found this to be the simnplest way.
KaySubb is right, you can make a fulfillment that reads data from a firebase database(or firestore).
You can do this turning on fulfillment at the bottom page of the intent page.
First go to https://console.firebase.google.com/ (login with google account) and you should be able to see your google cloud platform project.
To use firebase, you need to first install it. Get node.js as you need npm first. I'm not sure what OS you're on but go into command line or terminal and type.
npm install firebase --save
then type:
firebase login
this will authenticate your login and connect your project when you deploy.
Then use go to the directory you want to create your project in:
firebase init functions
Select your project and select javascript, install all dependencies
Now go to functions and open the index.js file. Here you can change you write code needed in js.
Write your functions and type:
firebase deploy
in the command line open in the file directory. When it completes, it will
give you a link. This as the webhook URL in dialogflow (it should start with
https://us-central). If you see only 1 link which says
console.firebase.google.com....... then open that link on a browser, click on
"functions" on the left side of the screen and get the link from there.
This should get you started with firebase, now you can link your project to firebase fulfillment. There is great firestore explanation here
https://www.youtube.com/watch?v=kdk6MhhI8oc
But I'll give you a brief explanation:
On the top of your index.js file you will need:
const functions = require('firebase-functions');
var admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);
var firestore = admin.firestore();
The basic code is here:
exports.webhook = functions.https.onRequest((request, response) => {
switch(request.body.result.action){
case 'saveData':
let params = request.body.result.parameters
firestore.collection('colName').doc('docName').add({
name:params.name
age:params.age
}).then(() => {
response.send({
speech:
`this is a response for "${params.name}".`
});
})
.catch((e => {
console.log('Error getting documents', e);
response.send({
speech:
`Sorry, something has gone wrong. Try again and if the problem persists, please report it.`
});
}))
break;
default:
}
})
I'll explain what it does:
You need the switch to decide which intent to do. request.body.result.action returns the action name (write this in dialogflow just above the parameters).
Once that is decided request.body.result.parameters give you the parameters from the intent. params.______ gives you the parameter.
I would definitely recommend reading the official documentation:
https://firebase.google.com/docs/firestore/quickstart
to help understand the data structure to help create the ideal database for you. Essentially a collection is a list and within that a doc is one entry. You can name them yourself of using the entries from param.
respond.send is what the bot will reply to the user, I've also shown how to use the parameters in the response.
.catch will just store any errors in the log, you can read the log in console.firebase.google.com.... open your project and click on function. There will be a place to read logs there. You can check any errors encountered over there.
default: will output whatever default response you wrote on dialogflow at the bottom of the intent.
Hope this helps,comment any questions. I have gone through a huge amount as concisely as I could. This will take some time to get used to and become good at, follow the docs and the youtube videos if you have a lot of trouble!
If you're having even more trouble, there is a slack that helps people that I can direct you to.

Resources