构建 fulfillment (Dialogflow)

Fulfillment 定义了 Action 项目要获取的对话界面 用户输入以及处理输入并最终完成 Action 的逻辑。

概览

你的执行方式会接收来自 Google 助理的请求、处理该请求 响应。这种来回式请求和响应流程推动了 直至您最终满足初始用户请求。

以下步骤介绍了如何使用 Actions 构建 fulfillment SDK 与 Node.js 或 Java/Kotlin 客户端库:

  1. 初始化 ActionsSdkApp 对象
  2. 在执行方式逻辑中创建用于处理请求的函数

构建对话框

初始化 ActionsSdkApp 对象

以下代码会实例化 ActionsSdkApp 并为 Google Cloud Functions 进行一些样板 Node.js 设置:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Actions SDK (Node.js)
'use strict';

const {actionssdk} = require('actions-on-google');
const functions = require('firebase-functions');

const app = actionssdk({debug: true});

app.intent('actions.intent.MAIN', (conv) => {
  conv.ask('Hi!');
});

// More intent handling if needed
exports.myFunction = functions.https.onRequest(app);
Actions SDK (Java)
ResponseBuilder responseBuilder = getResponseBuilder(request).add("Hi!");
return responseBuilder.build();
JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Hi!"
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ]
    }
  ],
  "conversationToken": "{\"data\":{}}",
  "userStorage": "{\"data\":{}}"
}

创建用于处理请求的函数

当用户说出某个短语时,您会收到来自 Google 助理的请求。接收者 实现请求中的意图,创建用于处理 触发的 intent。

如需处理请求,请执行以下操作:

  1. 执行处理用户输入所需的任何逻辑。

  2. 调用 conv.ask() 函数,传递您要显示的响应。 作为参数。

以下代码展示了如何构建简单的响应:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Actions SDK (Node.js)
conv.ask(`Hi! Say something, and I'll repeat it.`);
Actions SDK (Java)
ResponseBuilder responseBuilder =
    getResponseBuilder(request).add("Hi! Say something, and I'll repeat it.");
return responseBuilder.build();
JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Hi! Say something, and I'll repeat it."
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ]
    }
  ],
  "conversationToken": "{\"data\":{}}",
  "userStorage": "{\"data\":{}}"
}

处理 intent

在获得所有可处理触发的 intent 的函数后,使用 app.intent 执行以下操作 为意图分配处理程序。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Actions SDK (Node.js)
app.intent('actions.intent.TEXT', (conv) => {
  // handle text intent.
});
app.intent('actions.intent.MAIN', (conv) => {
  // handle main intent.
});
Actions SDK (Java)
@ForIntent("actions.intent.MAIN")
public ActionResponse main(ActionRequest request) {
  // handle main intent
  // ...
}

@ForIntent("actions.intent.TEXT")
public ActionResponse text(ActionRequest request) {
  // handle text intent
  // ...
}

结束对话

如果您不再需要任何用户输入并想要结束对话, 调用 conv.close() 函数。 此函数会指示 Google 助理向用户说出文本,并通过关闭麦克风结束对话。

处理主调用 intent

当用户触发 app.intent.action.MAIN intent 时,您通常不会 需要执行任何用户输入处理。如果您的操作包 并且涵盖了许多用例,最好通过告诉用户 提供一些自己可以做的事

  1. 调用 conv.ask() 函数,将您的响应作为参数传递。 Google 助理会向用户说出你的回复 等待用户触发您指定的某个 intent。

以下代码段展示了如何处理简单的欢迎 intent:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Actions SDK (Node.js)
// handle the initialTrigger
function handleMainIntent(conv, input) {
  conv.ask(input);
}
Actions SDK (Java)
private ActionResponse handleMainIntent(ResponseBuilder rb, String input) {
  return rb.add(input).build();
}

对话状态

如果您使用的是对话 HTTP/JSON webhook API,则可以维护 使用 JSON 格式的对象 (conversationToken) 传递对话状态 。如果您 使用 Node.js 客户端库,您需要 可以直接对 conv.data 字段执行读写操作。此字段 会在请求和响应之间自动来回传递。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Actions SDK (Node.js)
conv.data = {something: 10};
let value = conv.data.something;
Actions SDK (Java)
ResponseBuilder rb = getResponseBuilder(request);
rb.getConversationData().put("something", 10);
Object value = rb.getConversationData().get("something");