如何禁用自定义 Alexa 技能中的某些意图?

How to disable certain intents in custom Alexa skill?

...
CountryIntent{ ... };
CityIntent{ ... };
YesIntent{ ... };
FallBackIntent{ ... };
...

我正在构建自定义 Alexa 技能。用户从 CountryIntent 调用 CityIntent。但是,如果用户不小心说了 YES,他会从 CountryIntent 调用 YesIntent;那将是不正确的逻辑。 如何禁用 YesIntent 以便用户在不小心说 YES?

时调用 FallBackIntent

您无法禁用意图。通过建立意图,您可以教会您理解人类所说的特定 sentences/words 的技能 - 一旦学会,就很难忘记。

您实际上可以做的是构建一个 state machine and keep the current state of your conversation in SessionAttribute。然后在每个意图中你必须检查对话处于哪种状态并根据你的逻辑行动 - 所以在你的情况下当你期待城市并且有人说 "Yes" 时,你的技能应该再次询问城市并忽略"yes" 回答。

同意@slawciu。处理 yes/no 响应的最佳方法是跟踪 session attributes

中的最后一个意图

对于您的情况,您可以启用对城市意图的验证以仅接受有效的城市名称,从而无需处理不正确的响应。

您可以启用您编码的任何处理程序来处理 YesIntent,方法是将其添加为处理程序的 canHandle 中的真实条件,并且您可以将其与会话值匹配,以便不同的处理程序可以使用根据上下文使用。

这是一个例子。

let attributes = await handlerInput.attributesManager.getSessionAttributes();

    return ((Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
      && Alexa.getIntentName(handlerInput.requestEnvelope) === 'CityIntent')
      || (Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest' && 
         Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.YesIntent' &&
         attributes.last === "City"));

因此,如果他们明确点击了 CityIntent,或者他们之前点击了它(并且您将其存储在 attributes.last 中)但回答“是”,它就会被触发。

在您知道他们可能会回答“是”时使用 FallbackIntent 是一种反模式。当他们说出您 意想不到的话时,就会使用它。你期望“是”,所以主动处理它。