drachtio/drachtio-freeswitch-modules

Available regions for mod_dialogflow

Closed this issue · 10 comments

Hello,

https://cloud.google.com/dialogflow/es/docs/how/region#detect-intent-region-java

Flows in Dialogflow are by default in the "global" region. However, is there any support for flows that are deployed in a different region? I tried contacting a flow deployed in "Europe | Belgium | europe-west1" for example and it failed

I realized that the region was hardcoded as the global one in here
The global URL is "dialogflow.googleapis.com"
The other URLs for specific regions have a prefix such as "europe-west1-dialogflow.googleapis.com"

Our infrastructure consists of FreeSWITCH + Drachtio Server + a Drachtio App

Error logs:
FreeSWITCH:
google_glue.cpp:316 StreamingDetectIntentRequest finished with err com.google.apps.framework.request.NotFoundException: No DesignTimeAgent found for project '<PROJECTID>'. (5):

Drachtio App:
5 NOT_FOUND: com.google.apps.framework.request.NotFoundException: No DesignTimeAgent found for project '<PROJECTID>'.","code":5,"details":"com.google.apps.framework.request.NotFoundException: No DesignTimeAgent found for project '<PROJECTID>'

I think the change would be more than that, that session name would need to be different as well?

true, the session name would also have to be changed depending on the region
projects/PROJECT_ID/locations/REGION_ID/agent/sessions/SESSION_ID

do you think this is something that will be supported by drachtio in the future?

Yes, I would like to support this. Just trying to figure out how to make it backwards compatible. Right now, someone can specify a project as either

project-id

or

project-id:environment

it seems like I need to provide a way for someone to additionally specify location-id

I've made changes to support this but not working yet. Following the instructions here, but getting back an error:

Request had invalid authentication credentials. 
Expected OAuth 2 access token, login cookie or other valid authentication credential.

One thing not clear in the instructions is this statement they make:

 if you need to manually provide a credentials file in your code, you need to take one additional step 
when calling a regionalized endpoint. Set the scope to https://www.googleapis.com/auth/cloud-platform 
when generating your authentication credentials

They then give an example of doing so in Java; however, I can not find any place in the C++ grpc api to accomplish the same thing (i.e., setting the scope). If anyone with knowledge in this area wants to contribute a thought, please do. Otherwise I'm kind of blocked at the moment..

In case anyone is interested, here is a gist of a grpc debug log when I try to connect to a dialogflow agent in europe-west1.

I'm creating the credentials like this:

	auto callCreds = grpc::ServiceAccountJWTAccessCredentials(var, INT64_MAX);
	auto creds = grpc::CompositeChannelCredentials(channelCreds, callCreds);
	m_channel = grpc::CreateChannel(endpoint, creds);

where 'var' has the json key for the service account of the gcp project associated with the dialogflow agent.

current changes are on the feature/dialogflow-location-support branch.

I've also updated to grpc v1.39.1 for testing on this branch.

this is addressed in PR 67.

Will close this issue once merged

here is an example shell script showing how to build with the proper versions of grpc and googleapis

ansible script updated here