如何让Session实体作为Dialogflow的一部分检测意图

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”模块来设置会话实体。(请注意,这与用于处理实现的d​​ialogflow-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 )函数获取entitiesSessionEntityType中用于的值的映射,并返回将用于构建完整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 )与多声环境一起传递给多声环境,其中包含了我们在会话中使用的一些信息。它确保了nameentityOverrideMode在正确设置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底部设置的属性。该代码使用此作为parentsession构建值时

其他两个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”的实体类型之一,定义为开发者实体。

这就是我卡住的地方。一切看起来都正确。似乎应该为此会话正确设置会话实体。看起来应该使用这些值。但这似乎从未如此。

到底是怎么回事?所有帮助将大大赞赏。(您甚至没有读到问题的末尾?如果是的话,谢谢!我知道这很长,但是希望尽可能完整。)

Pri*_*ner 5

这似乎是一个错误-我从其他开发人员那里得到了反馈,他们看到同样的问题,有时是在以前工作的代码上。

已在https://issuetracker.google.com/issues/133166381处打开了一个错误以跟踪问题。给它加注星号,表明您有类似的问题并跟踪进度。