Xây dựng hành động trò chuyện (Dialogflow)

Bạn xác định cuộc trò chuyện cho Hành động của mình bằng phương thức thực hiện. Mã này được triển khai dưới dạng một webhook chứa logic trò chuyện của nhân viên hỗ trợ Dialogflow. Phương thức thực hiện sẽ cho Hành động của bạn biết việc cần làm khi người dùng đưa ra yêu cầu.

Đối với Canvas tương tác, phương thức thực hiện của bạn cũng truyền đạt thông tin về ứng dụng web của bạn cho Trợ lý. Bạn có thể sử dụng HtmlResponse để yêu cầu Trợ lý kết xuất ứng dụng web. HtmlResponse cũng có thể cung cấp nội dung cập nhật cho data, mà logic tuỳ chỉnh của ứng dụng web sử dụng để thực hiện các thay đổi đối với ứng dụng web của bạn.

Trang này trình bày cách sử dụng HtmlResponse trong phương thức thực hiện và các nguyên tắc chung về việc sử dụng loại phản hồi này.

Phản hồi HTML

Để chuyển tiếp thông tin về ứng dụng web của bạn đến Trợ lý, bạn phải đưa HtmlResponse vào phương thức thực hiện theo ý định cụ thể. HtmlResponse có thể chứa URL của ứng dụng web và dữ liệu cập nhật ứng dụng web. Khi bạn gửi HtmlResponse, các bước sau đây sẽ diễn ra:

  1. Việc thực hiện ý định đã khớp sẽ gửi một HtmlResponse đến thiết bị.
  2. Thiết bị sử dụng URL trong HtmlResponse để tải ứng dụng web.
  3. Tải trọng JSON data được truyền đến ứng dụng web trong một lệnh gọi lại.
  4. Hành động trò chuyện sẽ gửi một HtmlResponse mới để gửi nội dung cập nhật hoặc tải trạng thái mới.

Phương thức thực hiện mẫu

Phần trích dẫn sau đây từ mã thực hiện mẫu cho thấy cách triển khai HtmlResponse:

const functions = require('firebase-functions');
const {dialogflow, HtmlResponse} = require('actions-on-google');

const app = dialogflow({debug: true});
app.intent('welcome', (conv) => {
  conv.ask('Welcome! Do you want me to change color or pause spinning?');
  conv.ask(new HtmlResponse({
    url: 'https://your-web-app.com',
  }));
});

// map of human speakable colors to color values
const tints = {
  red: 0xFF0000,
  green: 0x00FF00,
  blue: 0x0000FF,
};
app.intent('color', (conv, {color}) => {
  if (color in tints) {
    conv.ask(`Ok, I changed my color to ${color}. What else?`);
    conv.ask(new HtmlResponse({
      data: {
        tint: tints[color],
      },
    }));
    return;
  }
  conv.ask(`Sorry, I don't know that color. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      query: conv.query,
    },
  }));
});
app.intent('start', (conv) => {
  conv.ask(`Ok, I'm spinning. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      spin: true,
    },
  }));
});

app.intent('pause', (conv) => {
  conv.ask(`Ok, I paused spinning. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      spin: false,
    },
  }));
});

app.intent('restart game', (conv) => {
  conv.ask(new HtmlResponse({
    data: {
      command: 'RESTART_GAME',
    },
  }));
});

exports.conversation = functions.https.onRequest(app);

Ý định welcome

Trong đoạn mã trên, việc thực hiện ý định welcome sẽ gửi một HtmlResponse kèm theo URL của ứng dụng web. Trợ lý sẽ nhận được dữ liệu này và tải HTML và JavaScript tại địa chỉ đó.

...
app.intent('welcome', (conv) => {
  conv.ask('Welcome! Do you want me to change color or pause spinning?');
  conv.ask(new HtmlResponse({
    url: 'https://your-web-app.com',
  }));
});
...

Các ý định khác

HtmlResponse trong phương thức thực hiện cho các ý định khác sẽ chuyển các giá trị biến (tint hoặc spin trong mẫu) đến ứng dụng web. Logic tuỳ chỉnh cho ứng dụng web sử dụng các giá trị này để cập nhật các phần tử (ảnh động, màu sắc, v.v.):

...
app.intent('start', (conv) => {
  conv.ask(`Ok, I'm spinning. What else?`);
  conv.ask(new HtmlResponse({
    data: {
      spin: true,
    },
  }));
});
...

Nguyên tắc và hạn chế

Hãy lưu ý các nguyên tắc và quy định hạn chế sau đây đối với HtmlResponse khi tạo phương thức thực hiện:

  • Mỗi ý định trong phương thức thực hiện của bạn phải bao gồm một HtmlResponse. Nếu một ý định không bao gồm HtmlResponse, ứng dụng web sẽ bị đóng.
  • Bạn chỉ cần đưa URL của ứng dụng web vào ý định đầu tiên mà bạn gửi cho người dùng (thường là ý định Welcome).
  • HtmlResponse phải có kích thước từ 50 kb trở xuống.