Node SDK中清除Dialogflow传入Agent上下文失效问题求助
解决Dialogflow Webhook中移除传入上下文的问题
我懂你的困扰——刚接触Dialogflow上下文控制时,很容易搞混传入和传出上下文的边界。你试的clearContext、setContext({lifespan:0})其实是有效的,但它们的作用不是修改当前请求里已经存在的传入上下文,而是告诉Dialogflow在下一轮会话中不再保留这个上下文。
为什么你的代码看起来“无效”?
- 传入上下文(incoming contexts)是Dialogflow调用Webhook时,已经携带的当前会话状态,Webhook没法修改这个已经发过来的内容。你在日志里看到请求里还有
loggedin上下文是正常的,因为那是当前请求的一部分。 agent.clearContext('loggedin')和agent.setContext({name: 'loggedin', lifespan: 0})的作用是设置传出上下文,让Dialogflow处理完这次响应后,把loggedin上下文的生命周期设为0,这样下一次用户发请求时,这个上下文就不会再出现在传入请求里了。agent.clearOutgoingContexts()只会清除你在当前Webhook中新增的传出上下文,对原本的传入上下文无效,这也是它名字的由来。
正确的处理方式
如果你想让loggedin上下文在后续会话中消失,你的代码逻辑其实是对的,只是要明确它的作用时机。下面是加上注释说明的修正版代码:
'use strict'; const { WebhookClient } = require('dialogflow-fulfillment'); const { Card, Suggestion } = require('dialogflow-fulfillment'); exports.MyAgent = (request, response) => { const agent = new WebhookClient({ request, response }); const test_context = function(agent){ // 告诉Dialogflow,在下一轮会话中清除loggedin上下文 agent.clearContext('loggedin'); // 或者用下面的写法,效果完全一致 // agent.setContext({ name: 'loggedin', lifespan: 0 }); // 可以添加响应内容来验证操作 agent.add('已标记清除loggedin上下文,下一轮会话将不再携带它'); } let intentMap = new Map(); intentMap.set('test_contexts', test_context); agent.handleRequest(intentMap); }
额外说明:当前轮次需要忽略传入上下文怎么办?
如果只是在当前Webhook逻辑里不需要用到loggedin上下文,直接在代码里不读取它就行——传入上下文只是会话状态的标识,不会强制你的逻辑必须使用它。要是担心它影响后续意图匹配,只要确保传出上下文里清除了它,下一轮会话就不会有问题了。
内容的提问来源于stack exchange,提问作者Ollie
相关产品推荐
相关产品推荐

