如何解决Dialogflow CX |如何关闭/重置对话
如何从 Java 应用程序以编程方式关闭或重置对话?。根据 Dialogflow CX 文档,“会话保持活动状态,其数据在为会话发送最后一个请求后存储 30 分钟。”
我想让会话保持活动的时间更短。例如,如果我希望会话处于活动状态 5 分钟,当用户在上一条消息后 5 分钟或更长时间发送消息时,会话必须重新开始,并且必须关闭之前的流并且必须删除上下文参数。
在 Dialogflow ES 中,可以使用 ContextsClient,但新版本不提供 ContextsClient 类。
解决方法
Dialogflow CX 使用 State Handlers 来控制对话路径,这与使用 Contexts 的 Dialogflow ES 不同。
对于 Dialogflow CX,您可以使用 END_SESSION symbolic transition target 结束当前会话。调用 END_SESSION 转换目标后,它会清除当前会话,下一个用户输入将在 start page 的 Default Start Flow 处重新启动会话。
要实现您想要的用例,您必须为其创建自己的实现。请注意,以下解决方案仅适用于将 Dialogflow CX 代理集成到自定义前端的情况。
首先,您应该将 Event Handler 添加到您的所有 Pages - 以便在对话流的任何部分都可以访问事件处理程序。在此事件处理程序中,定义自定义事件 - 例如:clearsession。然后,将其 Transition 设置为 End Session 页面。一旦 clearsession 事件被调用,它将结束当前会话。
然后,使用您自己的业务逻辑,您可以创建一个自定义函数,作为每个用户查询的计时器。一旦计时器达到 5 分钟,您的自定义应用程序应以编程方式向您的 CX 代理发送 detectIntent request。此detectIntent 请求必须包含当前会话ID 和自定义事件(来自之前创建的事件处理程序)。
以下是使用 detectIntent 调用自定义事件的示例 Java Client Library 请求:
// [START dialogflow_cx_detect_intent_event]
import com.google.api.gax.rpc.ApiException;
import com.google.cloud.dialogflow.cx.v3.*;
import com.google.common.collect.Maps;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class DetectIntent {
// DialogFlow API Detect Intent sample with event input.
public static Map<String,QueryResult> detectIntentEvent(
String projectId,String locationId,String agentId,String sessionId,String languageCode,String event)
throws IOException,ApiException {
SessionsSettings.Builder sessionsSettingsBuilder = SessionsSettings.newBuilder();
if (locationId.equals("global")) {
sessionsSettingsBuilder.setEndpoint("dialogflow.googleapis.com:443");
} else {
sessionsSettingsBuilder.setEndpoint(locationId + "-dialogflow.googleapis.com:443");
}
SessionsSettings sessionsSettings = sessionsSettingsBuilder.build();
Map<String,QueryResult> queryResults = Maps.newHashMap();
// Instantiates a client
try (SessionsClient sessionsClient = SessionsClient.create(sessionsSettings)) {
// Set the session name using the projectID (my-project-id),locationID (global),agentID
// (UUID),and sessionId (UUID).
SessionName session = SessionName.of(projectId,locationId,agentId,sessionId);
System.out.println("Session Path: " + session.toString());
EventInput.Builder eventInput = EventInput.newBuilder().setEvent(event);
// Build the query with the EventInput and language code (en-US).
QueryInput queryInput =
QueryInput.newBuilder().setEvent(eventInput).setLanguageCode(languageCode).build();
// Build the DetectIntentRequest with the SessionName and QueryInput.
DetectIntentRequest request =
DetectIntentRequest.newBuilder()
.setSession(session.toString())
.setQueryInput(queryInput)
.build();
// Performs the detect intent request.
DetectIntentResponse response = sessionsClient.detectIntent(request);
// Display the query result.
QueryResult queryResult = response.getQueryResult();
System.out.println("====================");
System.out.format(
"Detected Intent: %s (confidence: %f)\n",queryResult.getIntent().getDisplayName(),queryResult.getIntentDetectionConfidence());
}
return queryResults;
}
public static void main(String[] args) {
String projectId = "<project-id>";
String locationId = "<location-id>";
String agentId = "<agent-id>";
String sessionId = "<current-session-id>";
String languageCode = "<language-code>";
String event = "clearsession";
try{
detectIntentEvent(projectId,sessionId,languageCode,event);
} catch (IOException e){
System.out.println(e.getMessage());
}
}
}
// [END dialogflow_cx_detect_intent_event]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。