如何为 Google 助理(Google 主页)包装现有的聊天机器人
How to wrap an existing chatbot for Google Assistant (Google Home)
今天我们的网站有一个聊天机器人,它不是使用 Google 技术构建的。该机器人有一个 JSON REST API,您可以将问题发送到该机器人,并回复相应的答案。所以所有的意图和实体都由现有的聊天机器人解决。
在 Google 智能助理/Google 主页中包装此功能的最佳方式是什么?
对我来说,我似乎需要从发送到我们的网络服务的 JSON 中提取 "original" 问题(当我启用 fullfilment 时)。
但是由于上下文是用来交换的"state"我必须找到一种方法来在对话流和我们自己的聊天机器人之间交换上下文(见上文)。
但也许还有其他方法?它(调用我们的聊天机器人)可以直接完成吗(没有 DialogFlow 作为中间人)?
对于那些不知道我在说什么的人来说,这是其中的一种回应可能还不够,而对于知道我在说什么的人来说太多了。这里是:
在我看来,您似乎需要使用 Actions SDK 而不是 Dialog 流来构建 Action。然后你在你的动作中实现一个文本 "intent" - 即每次用户说话时运行的文本。在该文本意图中,您向 AoG 平台询问文本 - 请参阅 getRawInput()。现在你做两件事。第一,您获取原始输入并将其传递给您的机器人。第二,你 return 承诺告诉 AoG 你正在处理回复,但你还没有。一旦承诺得到履行 - 即当您的机器人回复时 - 您可以使用从您的机器人那里获得的文本进行回复。
我这里有一个名为法国鹦鹉的示例动作 https://github.com/unclewill/french_parrot。就语言而言,它只是像鹦鹉一样简单地回答它听到的任何内容。它还会转到翻译服务来翻译文本和 return 对应的(松散的)法语。
如果您选择接受,您的任务是获取样本,撕掉用于翻译服务的代码并插入用于您的机器人的代码。 :-)
我应该提两件事。第一,它不是 "idiomatic" Node 或 JavaScript 您会在我的示例中找到的。我能说什么 - 我认为世界其他地方都感到困惑。真的。第二,我有大约 50 行的最小样本,避免了此处的翻译 https://github.com/unclewill/parrot。另一种选择是使用它作为基础并添加代码来调用你的机器人和 Promise-y 代码来等待它。
如果你走后一条路线,请从操作包中删除触发短语 (action.json)。
所以您已经有一个处理用户输入并发回响应的后端,并且您想用它来处理新的输入流(来自 Google 助手)?
这实际上是我的情况,我有一个 Facebook Messenger ChatBot 服务,最近开始为其开发 Google Home Action。
很简单。您只需要:
- 在此处创建一个动作 https://console.actions.google.com
- 从这里下载 GActions-Cli https://developers.google.com/actions/tools/gactions-cli
- 创建一个 JSON 文件
action.[fr/en/de/it].json
(选择一种语言)。该文件是定义您的意图和 URL 到您的 webhook(后端和 google 助手之间的中间件)的意思。它可能看起来像这样:
{
"locale": "en",
"actions": [
{
"name": "MAIN",
"description": "Default Welcome Intent",
"fulfillment": {
"conversationName": "app name"
},
"intent": {
"name": "actions.intent.MAIN",
"trigger": {
"queryPatterns": [
"Talk to app name"
]
}
}
}
],
"conversations": {
"app name": {
"name": "app name",
"url": "https://your_nodejs_middleware.com/"
}
}
}
- 使用
gactions update --action_package action.en.json --project PROJECT_ID
上传 JSON 文件
- AFAIK,只有一个 Node.js 客户端库用于 Actions-on-google https://github.com/actions-on-google/actions-on-google-nodejs 这就是为什么在访问后端之前需要一个 Node.js 中间件的原因
- 现在,用户输入将发送到托管在 https://your_nodejs_middleware.com/ 的 Node.js 中间件(app.js),它可能如下所示:
//require express and all required staff to build a Node.js server,
//look on internet how to build a simple web server in Node.js
//if you a new to this domain. const {
ActionsSdkApp } = require('actions-on-google');
app.post('/', (req, res) => {
req.body = JSON.parse(req.body);
const app = new ActionsSdkApp({
request: req,
response: res
});
// Create functions to handle requests here
function mainIntent(app) {
let inputPrompt = app.buildInputPrompt(false,
'Hey! Welcome to app name!');
app.ask(inputPrompt);
}
function respond(app) {
let userInput = app.getRawInput();
//HERE you get what user typed/said to Google Assistant.
//NOW you can send the input to your BACKEND, process it, get the response_from_your_backend and send it back
app.ask(response_from_your_backend);
}
let actionMap = new Map();
actionMap.set('actions.intent.MAIN', mainIntent);
actionMap.set('actions.intent.TEXT', respond);
app.handleRequest(actionMap); });
希望对您有所帮助!
感谢大家的帮助,解决方案的主要部分已经给出,但我在这里总结一下
- action.json 将所有内容传递给 fullfilment 服务
- 中间人(在我的例子中 IBM Cloud Function)在服务之间映射 JSON
- 通过 conversationToken 分享 context/state 属性
您可以在此处找到演示:Hey Google talk to Watson
今天我们的网站有一个聊天机器人,它不是使用 Google 技术构建的。该机器人有一个 JSON REST API,您可以将问题发送到该机器人,并回复相应的答案。所以所有的意图和实体都由现有的聊天机器人解决。
在 Google 智能助理/Google 主页中包装此功能的最佳方式是什么?
对我来说,我似乎需要从发送到我们的网络服务的 JSON 中提取 "original" 问题(当我启用 fullfilment 时)。
但是由于上下文是用来交换的"state"我必须找到一种方法来在对话流和我们自己的聊天机器人之间交换上下文(见上文)。
但也许还有其他方法?它(调用我们的聊天机器人)可以直接完成吗(没有 DialogFlow 作为中间人)?
对于那些不知道我在说什么的人来说,这是其中的一种回应可能还不够,而对于知道我在说什么的人来说太多了。这里是:
在我看来,您似乎需要使用 Actions SDK 而不是 Dialog 流来构建 Action。然后你在你的动作中实现一个文本 "intent" - 即每次用户说话时运行的文本。在该文本意图中,您向 AoG 平台询问文本 - 请参阅 getRawInput()。现在你做两件事。第一,您获取原始输入并将其传递给您的机器人。第二,你 return 承诺告诉 AoG 你正在处理回复,但你还没有。一旦承诺得到履行 - 即当您的机器人回复时 - 您可以使用从您的机器人那里获得的文本进行回复。
我这里有一个名为法国鹦鹉的示例动作 https://github.com/unclewill/french_parrot。就语言而言,它只是像鹦鹉一样简单地回答它听到的任何内容。它还会转到翻译服务来翻译文本和 return 对应的(松散的)法语。
如果您选择接受,您的任务是获取样本,撕掉用于翻译服务的代码并插入用于您的机器人的代码。 :-)
我应该提两件事。第一,它不是 "idiomatic" Node 或 JavaScript 您会在我的示例中找到的。我能说什么 - 我认为世界其他地方都感到困惑。真的。第二,我有大约 50 行的最小样本,避免了此处的翻译 https://github.com/unclewill/parrot。另一种选择是使用它作为基础并添加代码来调用你的机器人和 Promise-y 代码来等待它。
如果你走后一条路线,请从操作包中删除触发短语 (action.json)。
所以您已经有一个处理用户输入并发回响应的后端,并且您想用它来处理新的输入流(来自 Google 助手)?
这实际上是我的情况,我有一个 Facebook Messenger ChatBot 服务,最近开始为其开发 Google Home Action。
很简单。您只需要:
- 在此处创建一个动作 https://console.actions.google.com
- 从这里下载 GActions-Cli https://developers.google.com/actions/tools/gactions-cli
- 创建一个 JSON 文件
action.[fr/en/de/it].json
(选择一种语言)。该文件是定义您的意图和 URL 到您的 webhook(后端和 google 助手之间的中间件)的意思。它可能看起来像这样:
{ "locale": "en", "actions": [ { "name": "MAIN", "description": "Default Welcome Intent", "fulfillment": { "conversationName": "app name" }, "intent": { "name": "actions.intent.MAIN", "trigger": { "queryPatterns": [ "Talk to app name" ] } } } ], "conversations": { "app name": { "name": "app name", "url": "https://your_nodejs_middleware.com/" } } }
- 使用
gactions update --action_package action.en.json --project PROJECT_ID
上传 JSON 文件
- AFAIK,只有一个 Node.js 客户端库用于 Actions-on-google https://github.com/actions-on-google/actions-on-google-nodejs 这就是为什么在访问后端之前需要一个 Node.js 中间件的原因
- 现在,用户输入将发送到托管在 https://your_nodejs_middleware.com/ 的 Node.js 中间件(app.js),它可能如下所示:
//require express and all required staff to build a Node.js server, //look on internet how to build a simple web server in Node.js //if you a new to this domain. const { ActionsSdkApp } = require('actions-on-google'); app.post('/', (req, res) => { req.body = JSON.parse(req.body); const app = new ActionsSdkApp({ request: req, response: res }); // Create functions to handle requests here function mainIntent(app) { let inputPrompt = app.buildInputPrompt(false, 'Hey! Welcome to app name!'); app.ask(inputPrompt); } function respond(app) { let userInput = app.getRawInput(); //HERE you get what user typed/said to Google Assistant. //NOW you can send the input to your BACKEND, process it, get the response_from_your_backend and send it back app.ask(response_from_your_backend); } let actionMap = new Map(); actionMap.set('actions.intent.MAIN', mainIntent); actionMap.set('actions.intent.TEXT', respond); app.handleRequest(actionMap); });
希望对您有所帮助!
感谢大家的帮助,解决方案的主要部分已经给出,但我在这里总结一下
- action.json 将所有内容传递给 fullfilment 服务
- 中间人(在我的例子中 IBM Cloud Function)在服务之间映射 JSON
- 通过 conversationToken 分享 context/state 属性
您可以在此处找到演示:Hey Google talk to Watson