新版Google Actions及Actions SDK获取用户输入方法咨询
在新版Google Action Builder中实现类似旧版TEXT意图的用户输入捕获
我完全理解你想沿用旧版那种直接捕获用户任意文本输入的需求——毕竟旧版的actions.intent.TEXT用起来确实省心。新版Action Builder虽然改用了场景(Scenes)和自定义意图(Intents)的架构,但我们可以通过以下步骤实现几乎一样的效果:
1. 创建一个自定义"自由文本捕获"意图
首先要替代旧版的TEXT意图,我们需要自己建一个能捕获任意用户输入的自定义意图:
- 打开Action Builder的「Intents」模块,点击「Create intent」,给它起个好记的名字(比如
CaptureFreeText)。 - 在「Training phrases」区域,添加几个示例短语,比如
$user_input、随便说点什么这类。关键是要把占位符(比如$user_input)关联到**@sys.any**系统实体——这个实体能匹配任何形式的文本输入,完美替代旧版TEXT意图的全局捕获能力。 - 在「Parameters」标签页,确认参数名(比如
user_input)已经绑定到@sys.any,并且设置为「Required」(确保必须捕获到这个输入)。
2. 在场景中配置意图触发
接下来要让你的场景知道什么时候触发这个意图:
- 进入「Scenes」模块,打开你需要处理用户输入的目标场景。
- 在场景的「States」里,找到你要等待用户输入的状态(比如
Start状态,或者新建一个WaitForUserInput状态)。 - 在该状态的「Transitions」设置中,添加一个触发条件:当用户触发
CaptureFreeText意图时,跳转到对应的处理逻辑(比如一个自定义handler)。 - 如果想实现类似旧版的"全局捕获"(不管用户说什么都触发),可以把这个意图设置为场景的Fallback Intent——当没有匹配到其他更具体的意图时,自动触发它。
3. 在代码中获取用户输入
不管你用Action Builder内置的Code Editor,还是本地用Actions SDK开发,都可以这样获取输入:
方式一:Action Builder Code Editor(内联代码)
// 对应场景中绑定的handler函数 async function handleUserInput(inputs) { // inputs里的user_input就是你在意图中定义的参数名 const userInput = inputs.user_input; console.log('用户输入内容:', userInput); // 这里写你的业务逻辑,比如回复用户 return { prompt: { firstSimple: { speech: `我收到你的输入啦:${userInput}` } } }; }
方式二:本地Actions SDK开发
const { conversation } = require('@assistant/conversation'); const app = conversation(); // 绑定场景中设置的handler名称 app.handle('handleUserInput', async (conv) => { // 从intent参数中获取解析后的用户输入 const userInput = conv.intent.params.user_input.resolved; console.log('用户输入:', userInput); // 回复用户 conv.add(`你刚才说的是:${userInput}`); }); module.exports = app;
关键注意点
- 新版中不再有全局的
actions.intent.TEXT意图,所有文本捕获都需要通过自定义意图+@sys.any实体实现。 - 如果你的Action需要在多个场景中捕获自由输入,可以把这个
CaptureFreeText意图设置为全局意图(在Intent设置中开启「Global」选项),这样所有场景都能触发它。
内容的提问来源于stack exchange,提问作者sai ramam chavatapalli
相关产品推荐
相关产品推荐

