是否可以通过Java设置上下文变量的值。我已经修改了节点json并在要从本地数据库设置数据的result属性中的该操作中添加了一个操作。所以我正在用Java代码获取操作,并尝试设置操作对象的result属性的值,以下是我正在尝试但无法正常工作的代码。有人可以为此建议一种更好的方法。
if(response.getActions()!=null) {
System.out.println("actions : "+response.getActions());
for (int i = 0; i < response.getActions().size(); i++) {
System.out.println(" i : "+response.getActions().get(i).getName());
if(response.getActions().get(i).getName()=="Apply_For_Loan") {
response.getActions().get(i).setResultVariable("123");
}
}
}
在下面的上下文中设置result_variable的值是我的代码。
if(response.getActions().get(i).getName().equals("Apply_For_Loan")) {
System.out.println("in action");
Assistant service = new Assistant("2018-12-12");
service.setUsernameAndPassword(userId, password);
service.setEndPoint(endPoint);
String result=response.getActions().get(i).getResultVariable();
Context context = response.getContext();
context.put(result, "123");
MessageOptions msg=new MessageOptions.Builder(watsonId)
.input(new InputData.Builder("Apply For Loan").build())
.context(context)
.build();
response=service.message(msg).execute();
System.out.println("msg : "+response);
}
下面是我重新执行助理呼叫后得到的响应。
{
"output": {
"generic": [
{
"response_type": "text",
"text": "Hello RSR, you loan application of 5420 is created. Please note the Loan Number for future use "
}
],
"text": [
"Hello RSR, you loan application of 5420 is created. Please note the Loan Number for future use "
],
"nodes_visited": [
"node_1_1544613102320",
"node_1_1544613102320"
],
"log_messages": []
},
"input": {
"text": "Apply For Loan"
},
"intents": [
{
"intent": "ApplyForLoan",
"confidence": 1.0
}
],
"entities": [],
"context": {
"number": 9.971070056E9,
"$Loan_Number": "123",
"system": {
"initialized": true,
"dialog_stack": [
{
"dialog_node": "node_1_1544613102320"
}
],
"dialog_turn_counter": 3.0,
"dialog_request_counter": 3.0,
"_node_output_map": {
"node_1_1544613102320": {
"0": [
0.0
]
}
},
"branch_exited": true,
"branch_exited_reason": "completed"
},
"Mail_Id": "Email_Id",
"conversation_id": "b59c7a02-2cc6-4149-ae29-602796ab22e1",
"person": "RSR",
"rupees": 5420.0
},
"actions": [
{
"name": "Apply_For_Loan",
"type": "client",
"parameters": {
"pername": "RSR",
"loanamount": 5420.0
},
"result_variable": "$Loan_Number"
}
]
}
在以上响应中,$ Loan_Number是我已从java代码更新的结果变量,并且我在输出文本中使用的相同result_variable返回$ Loan_Number,但在输出文本中它仍为空白,并且在操作中也是如此还是空白?
答案 0 :(得分:0)
您的问题的简单答案是“否”,您无法使用setResultVariable
在JSON模型中进行任何设置。它应该像这样工作:
1)在您的Dialognode上定义一个操作
result_variable
定义了<result_variable_name>
,例如该操作的结果应存储在对话上下文中。如果执行某些服务器端操作,则会从指定的上下文位置读取结果。在此示例中,位置为context.result_of_action
,context
可以省略。更多详细信息,请参见here。
2)在Java Client中处理操作
DialogNodeAction action = response.getActions().get(0);
final String result_variable = action.getResultVariable();
result_variable
就像一个键。您可以从数据库中获取值并将其添加到上下文中:
Context context = response.getContext();
context.put(result_variable, "value from DB");
new MessageOptions.Builder("Your ID")
.input(new InputData.Builder("Your response").build())
.context(context) // setting context
.build();
最后,Watson Assistant对话框(或其他一些应用程序)可以从客户端获取结果:
"context": {
"result_of_action": "value from DB",
使用Gson
从JSON解析使用Java API读取的对象,并且在构建新的API调用时需要将其重新解析回JSON。
问题更新后编辑
在您的示例中:
"actions": [
{
"name": "Apply_For_Loan",
"type": "client",
"parameters": {
"pername": "RSR",
"loanamount": 5420.0
},
"result_variable": "$Loan_Number"
}
键result_variable
告诉您应用中的其他模块在哪里可以找到操作结果。因此,$Loan_Number
不应是会话上下文中的值的值,而应是键(一种方法合同)。
假设您将值设置为 context.my_result ,那么Watson Assistant应当能够在下一个对话框节点“ context.my_result”下从DB访问“ 123”。