Pri*_*ner 4 node.js google-cloud-platform actions-on-google dialogflow-es
我有一个实体,应该使用用户特定的信息在每个会话中进行更新。当我使用Dialogflow v1时,这已经奏效了,我以为它可以与v2一起工作,但是现在我遇到了很多问题。
我相信我正确设置了会话实体信息,但是对于使用它的Intent,它仅在使用来自开发者实体的值时才匹配。
如何获得使用会话实体的权限?更新时我做错什么了吗?我使用了错误的会话ID吗?有没有一种方法可以更好地验证或测试我使用的是正确的ID还是正确更新的Entity?这只是一个错误吗?
一切的文档如下。
该项目配置为使用v2并允许使用beta功能,尽管我也尝试过不使用beta功能的情况。
只有三个Intent。捕获失败的后备意图,获取欢迎事件的欢迎意图以及应该捕获应该与“代码”实体匹配的入口代码的“进入”意图。他们所有人都使用webhook来实现。
如“入口”意图中所示,它使用“代码”实体,这是系统中唯一的开发者实体
该代码在单独的模块中具有大多数Dialogflow特定的工作,该模块使用npm中的“ dialogflow”模块来设置会话实体。(请注意,这与用于处理实现的dialogflow-fulfillment模块不同。我正在使用多声音库来实现,但这没关系。)(它也使用firebase函数在其上运行,但是我不这样做认为这些都不相关。)
从package.json中:
"dependencies": {
"dialogflow": "^0.9.0",
"firebase-admin": "~7.0.0",
"firebase-functions": "^2.2.0",
"multivocal": "^0.11.1"
},
Run Code Online (Sandbox Code Playgroud)
导入为dialogflow
,指定要使用的API版本:
const dialogflow = require('dialogflow').v2beta1;
Run Code Online (Sandbox Code Playgroud)
我在下面显示的功能调用envToConfig(env)
了环境(一个多声的概念,它只存储相关信息,包括Dialogflow parent
和证书信息)并返回需要传递给的配置dialogflow.SessionEntityTypesClient( config )
。鉴于在后续调用中没有抛出任何错误,它似乎可以正常工作。
该makeEntityType( name, entityMap )
函数获取entities
在SessionEntityType中用于的值的映射,并返回将用于构建完整SessionEntityType的对象。这里name
提供的是显示名称。
function makeEntityType( name, entityMap ){
let ret = {
displayName: name,
entities: []
};
Object.keys( entityMap ).map( key => {
let val = entityMap[key];
let entity = {
value: key,
synonyms: [key, ...val]
};
ret.entities.push( entity );
});
return ret;
}
exports.makeEntityType = makeEntityType;
Run Code Online (Sandbox Code Playgroud)
由此产生的结果将setSessionEntity( env, entityType )
与多声环境一起传递给多声环境,其中包含了我们在会话中使用的一些信息。它确保了name
和entityOverrideMode
在正确设置entityType
,然后尝试创建它。我也尝试过使用PATCH,它的行为方式相同。它还记录了大量日志,稍后将在运行时证明它确实有效。
function setSessionEntity( env, entityType ){
const config = envToConfig( env );
const client = new dialogflow.SessionEntityTypesClient( config );
let parent = env.dialogflow.parent;
if( entityType.displayName && !entityType.name ){
entityType.name = `${parent}/entityTypes/${entityType.displayName}`;
}
if( !entityType.entityOverrideMode ){
entityType.entityOverrideMode = 'ENTITY_OVERRIDE_MODE_OVERRIDE';
}
console.log('setSessionEntity parent',parent);
const request = {
parent: parent,
sessionEntityType: entityType
};
console.log('setSessionEntity request',JSON.stringify(request,null,1));
return client.createSessionEntityType( request )
.then( create => {
console.log('setSessionEntity created',JSON.stringify(create,null,1));
return Promise.resolve( env );
})
.catch( err => {
console.error('setSessionEntity problem creating',err);
return Promise.resolve( env );
})
}
exports.setSessionEntity = setSessionEntity;
Run Code Online (Sandbox Code Playgroud)
对于调试,我还有一个列出会话实体的函数:
function listSessionEntities( env ){
let parent = env.dialogflow && env.dialogflow.parent;
console.log('listSessionEntities parent', parent);
if( !parent ){
return Promise.resolve( env );
}
const config = envToConfig( env );
const client = new dialogflow.SessionEntityTypesClient( config );
const request = {
parent: parent
};
return client.listSessionEntityTypes(request)
.then( result => {
console.log('listSessionEntities', JSON.stringify(result,null,1));
})
.catch( err => {
console.log('listSessionEntities err', err);
})
.then( () => Promise.resolve( env ) );
}
exports.listSessionEntities = listSessionEntities;
Run Code Online (Sandbox Code Playgroud)
调用此代码的代码将其导入为Dialogflow
:
const Dialogflow = require('./dialogflow');
Run Code Online (Sandbox Code Playgroud)
作为所有webhook调用的一部分,该listSessionEntities()
函数在任何特定处理程序之前被调用:
function debugSessionEntities( env ){
return Dialogflow.listSessionEntities( env );
}
Run Code Online (Sandbox Code Playgroud)
触发“欢迎意图”时,它将“代码”会话实体设置为具有两种新类型,这些新类型应覆盖在“代码”开发者实体中定义的类型:
function handleWelcome( env ){
const entityType = Dialogflow.makeEntityType('code',{
'alpha': [],
'bravo': []
});
return Dialogflow.setSessionEntity( env, entityType )
.then( env => Multivocal.handleDefault( env ) );
}
Run Code Online (Sandbox Code Playgroud)
当我通过模拟器运行此命令时,它不会使用设置的会话实体类型,但仍会响应开发者实体类型。(使用真实设备的工作方式相同。)
在模拟器中,这是在“欢迎意图”的“请求”选项卡中报告的内容:
{
"responseId": "55a9eb06-ce05-48f9-8a56-b993fa512aee",
"queryResult": {
"queryText": "GOOGLE_ASSISTANT_WELCOME",
"action": "multivocal.welcome",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentText": "Hello! How can I help you?",
"fulfillmentMessages": [
{
"text": {
"text": [
"Greetings! How can I assist?"
]
}
}
],
"outputContexts": [
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/google_assistant_welcome"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_screen_output"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_audio_output"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_account_linking"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/google_assistant_input_type_keyboard"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_media_response_audio"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_web_browser"
}
],
"intent": {
"name": "projects/session-test-XXXXX/agent/intents/ca79c951-4d75-4b2b-acd4-7dac2f81856e",
"displayName": "welcome"
},
"intentDetectionConfidence": 1,
"languageCode": "en-us"
},
"originalDetectIntentRequest": {
"source": "google",
"version": "2",
"payload": {
"isInSandbox": true,
"surface": {
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.ACCOUNT_LINKING"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.WEB_BROWSER"
}
]
},
"requestType": "SIMULATOR",
"inputs": [
{
"rawInputs": [
{
"query": "Talk to my test app",
"inputType": "KEYBOARD"
}
],
"intent": "actions.intent.MAIN"
}
],
"user": {
"userStorage": "{\"UserId\":\"ABwppHHd40lIZ1o0bRERAKlHNtNcS2qFtz7NbRQnb31AQDFuV41VPFQivXwwpQGtv_5SlsZNp0N3kxalIIXXXXXX\",\"NumVisits\":1}",
"lastSeen": "2019-05-18T19:12:38Z",
"locale": "en-US",
"userId": "ABwppHHd40lIZ1o0bRERAKlHNtNcS2qFtz7NbRQnb31AQDFuV41VPFQivXwwpQGtv_5SlsZNp0N3kxalIIXXXXXX"
},
"conversation": {
"conversationId": "ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX",
"type": "NEW"
},
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
}
]
}
},
"session": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX"
}
Run Code Online (Sandbox Code Playgroud)
最值得注意的是从session
底部设置的属性。该代码使用此作为parent
和session
构建值时
其他两个Intent的请求对象相似,并且所有的取值都相同session
。没有任何响应对象值得注意。
触发“欢迎意图”后,对的调用就listSessionEntities()
毫不奇怪地显示还没有:
info: listSessionEntities parent projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX
info: listSessionEntities [
[],
null,
null
]
Run Code Online (Sandbox Code Playgroud)
在parent
似乎已经从正确的值session
但是。
当用于欢迎意图的处理程序去并创建会话实体时,事情似乎可以正常进行:
info: setSessionEntity request {
"parent": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX",
"sessionEntityType": {
"displayName": "code",
"entities": [
{
"value": "alpha",
"synonyms": [
"alpha"
]
},
{
"value": "bravo",
"synonyms": [
"bravo"
]
}
],
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/entityTypes/code",
"entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE"
}
}
info: setSessionEntity created [
{
"entities": [
{
"synonyms": [
"alpha"
],
"value": "alpha"
},
{
"synonyms": [
"bravo"
],
"value": "bravo"
}
],
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/entityTypes/code",
"entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE"
},
null,
null
]
Run Code Online (Sandbox Code Playgroud)
将parent
看起来是一样的session
,并且name
似乎遵循正确的格式,包括具有“/ entityTypes /”后面的显示名称的所述附加部件。
当我尝试使用代码“ alpha”调用它时,该代码应触发“ entry”意图,但它会触发“后备意图”。调用listSessionEntities()
似乎显示了具有我们期望的实体类型的“代码”实体,即使与“ alpha”都不匹配。
info: listSessionEntities parent projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX
info: listSessionEntities [
[
{
"entities": [
{
"synonyms": [
"alpha"
],
"value": "alpha"
},
{
"synonyms": [
"bravo"
],
"value": "bravo"
}
],
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/entityTypes/code",
"entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE"
}
],
null,
null
]
Run Code Online (Sandbox Code Playgroud)
同样,一切看起来都正确。当我再次使用“ zulu”尝试时,它显示了对的调用相同的内容listSessionEntites()
,但是这次它与“ entry” Intent匹配,因为“ zulu”是“ code”的实体类型之一,定义为开发者实体。
这就是我卡住的地方。一切看起来都正确。似乎应该为此会话正确设置会话实体。看起来应该使用这些值。但这似乎从未如此。
到底是怎么回事?所有帮助将大大赞赏。(您甚至没有读到问题的末尾?如果是的话,谢谢!我知道这很长,但是希望尽可能完整。)
这似乎是一个错误-我从其他开发人员那里得到了反馈,他们看到同样的问题,有时是在以前工作的代码上。
已在https://issuetracker.google.com/issues/133166381处打开了一个错误以跟踪问题。给它加注星号,表明您有类似的问题并跟踪进度。
归档时间: |
|
查看次数: |
670 次 |
最近记录: |