google 上的操作 - 如何处理长 运行 操作

actions on google - how to handle long running operations

我有 AoG 操作登录到外部后端,一旦登录它就可以通过外部后端的 API 控制特定的设备。 Action 基本上通过 arm section XYdisarm section garage 等命令控制家庭警报。在控制警报之前,必须先登录,这需要相当长的时间(大约 20-30 秒)。这比 AoG 实际允许的超时时间长得多。我在 actions.intent.MAIN 处理程序中作为异步操作启动登录(即不等待处理程序中的登录结果),只是告诉用户在几秒钟内告诉命令(arm/disarm 车库等) .我还实施了 push notification ,效果很好。推送通知的问题在于它只是在移动 phone 上弹出而没有任何声音,用户必须打开通知并点击它。然后它将触发意图并执行请求的操作。

这不是很好的用户体验(通常我想在回家时在车上使用我的动作,并且可以在不需要触摸 phone 的情况下解除家庭警报,点击通知等)。

知道如何以更合适的方式实施它吗?我真的很感激 google 助理真的可以重新发起对话并告诉我类似这样的话:'hey I am already logged in into alarm service provider, what do you want me to do now?'。

对于处理类似问题的任何建议,我将不胜感激。

我正在使用 Node.JS 的 ActionsSDK 来构建我的动作。

AoG "take initiative of starting a conversation" 的唯一途径是通过推送通知。助手无法在一段时间后或发生事件时发起对话。

也许另一种方法可能是仅在您的操作未能执行长事件序列时才发送推送通知,并且触发操作可以调用意图重试。假设是一切都很好,除非这么说。

您还可以通知用户,操作启动后需要几秒钟才能完成,并实施后续意图以处理用户询问 "Is it done?""How's it going?"。使其成为检查进度的流程的一部分,但假设它应该是成功的。

您可以通过在 Firebase 中创建一个与此类似的子项的任务队列来轻松地错位较长的 运行 后台进程。

firebase.database().ref("tasks").push({action: "disarm_garage"});

然后你创建一个云函数触发器来处理它

functions.database.ref('tasks/{id}').onCreate((snap) => {
    const action = snap.val().action;
    switch (action) {
        case 'disarm_garage':
            // ...
            break;
    }

    // Remove the task after processing
    return snap.ref.remove();
});

这将确保您有足够的时间在后台完成任务而不会阻塞对话。

您已经了解了智能助理发起(或重新发起)对话的方式。动作真的是为对话而设计的,对话中停顿 30 秒会很尴尬。

您的另一个选择是使用媒体回复作为您对登录用户的回复的一部分(或者作为您欢迎意图的一部分?不完全清楚,但方法是一样的)。这会让你播放 "hold music" 几秒钟。在音乐播放结束时,一个 actions.intent.MEDIA_STATUS 将发送到您的操作,您可以使用它来确保登录已完成,如果是,则适当地响应用户。