Dialogflow CX 使用 State Handlers 来控制对话路径,这与使用 Contexts 的 Dialogflow ES 不同。
对于 Dialogflow CX,您可以使用 END_SESSION symbolic transition target 结束当前会话。一旦调用了 END_SESSION 转换目标,它就会清除当前会话,并且下一次用户输入将在 Default Start Flow 的 start page 处重新启动会话。
要实现您想要的用例,您必须为其创建自己的实现。请注意,仅当您将 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,locationId,agentId,sessionId, languageCode, event);
} catch (IOException e){
System.out.println(e.getMessage());
}
}
}
// [END dialogflow_cx_detect_intent_event]