package com.smtaiserver.smtaiserver.javaai.jsonflow.node;
|
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Set;
|
|
import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
|
import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
|
import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowExecArg;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowManager;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowNodeOnlyOutput;
|
import com.smtaiserver.smtaiserver.javaai.llm.core.SMTLLMConnect;
|
import com.smtservlet.util.Json;
|
import com.smtservlet.util.SMTJsonWriter;
|
import com.smtservlet.util.SMTStatic;
|
|
public class SMTJsonFlowNodeProcedure extends SMTJsonFlowNodeOnlyOutput
|
{
|
private String _procId;
|
|
@Override
|
public void initInstane(SMTJsonFlowManager manager, Json jsonNode) throws Exception
|
{
|
super.initInstane(manager, jsonNode);
|
|
Json jsonValues = jsonNode.getJsonPath("data|group_params|0|params|0|value", false);
|
if(jsonValues == null || !jsonValues.isString())
|
throw new Exception("flow json agenet not set call agent id");
|
_procId = jsonValues.asString();
|
}
|
|
@Override
|
public SMTJavaAIError executeFlowNode(SMTJsonFlowExecArg execArg) throws Exception
|
{
|
SMTJavaAIError error;
|
if("assessment".equals(_procId))
|
{
|
execArg._tranReq.sendChunkedBlock("begin", "开始评估结果集");
|
error = callProc_assessment(execArg);
|
}
|
else
|
{
|
return new SMTJavaAIError("未知工作流操作:" + _procId);
|
}
|
if(error != null)
|
return error;
|
|
return super.executeFlowNode(execArg);
|
}
|
|
private SMTJavaAIError callProc_assessment(SMTJsonFlowExecArg execArg) throws Exception
|
{
|
// 获取要评估的结果集
|
List<SMTJsonWriter> listJsonWrResult = execArg._tranReq.getResultJsonWrList();
|
if(listJsonWrResult == null || listJsonWrResult.size() == 0)
|
{
|
execArg._tranReq.sendChunkedBlock("begin", "无任何结果集需要评估");
|
return null;
|
}
|
|
// 对结果进行评估
|
for(SMTJsonWriter jsonWrResult : listJsonWrResult)
|
{
|
Json jsonResult = jsonWrResult.getRootJson();
|
Set<String> setExistAgentKey = new HashSet<>();
|
SMTJsonWriter jsonWrConclusion = new SMTJsonWriter(true);
|
for(Json jsonSummary : jsonResult.getJson("summary").asJsonList())
|
{
|
String agentKey = jsonSummary.safeGetStr("agent_key", "");
|
if(setExistAgentKey.contains(agentKey))
|
continue;
|
|
if(!"recordset".equals(jsonSummary.safeGetStr("type", "")))
|
continue;
|
|
setExistAgentKey.add(agentKey);
|
|
SMTLLMConnect llm = SMTAIServerApp.getApp().allocLLMConnect(null);
|
try
|
{
|
parseRecordsetTypeConclusionWithLLM(agentKey, llm, jsonSummary, execArg._tranReq, jsonWrConclusion);
|
}
|
finally
|
{
|
llm.close();
|
}
|
}
|
}
|
|
|
return null;
|
}
|
|
private SMTJavaAIError parseRecordsetTypeConclusionWithLLM(String agentKey, SMTLLMConnect llm, Json jsonSummary, SMTAIServerRequest tranReq, SMTJsonWriter jsonWrConclusion) throws Exception
|
{
|
tranReq.sendChunkedBlock("begin", "分析[" + jsonSummary.safeGetStr("title", "") + "]的数据");
|
|
StringBuilder sbQuestion = new StringBuilder();
|
sbQuestion.append("以下是[" + jsonSummary.safeGetStr("title", "") + "]的数据,请对其进行分析,并提炼出最精简的结果。\n");
|
|
String unitName = jsonSummary.safeGetStr("unit", null);
|
|
|
boolean isFirst = true;
|
int maxCol = 0;
|
for(Json jsonCol : jsonSummary.getJson("cols").asJsonList())
|
{
|
if(isFirst)
|
isFirst = false;
|
else
|
sbQuestion.append(",");
|
|
String colName = jsonCol.safeGetStr("title", "值");
|
if(!SMTStatic.isNullOrEmpty(unitName) && "value".equals(jsonCol.safeGetStr("type", "")))
|
sbQuestion.append(colName + "(" + unitName + ")");
|
else
|
sbQuestion.append(colName);
|
maxCol ++;
|
}
|
sbQuestion.append("\n");
|
|
for(Json jsonRow : jsonSummary.getJson("values").asJsonList())
|
{
|
List<Json> listJsonRow = jsonRow.asJsonList();
|
for(int i = 0; i < maxCol; i ++)
|
{
|
if(i > 0)
|
sbQuestion.append(",");
|
Json jsonValue = listJsonRow.get(i);
|
if(jsonValue.isNull())
|
{
|
sbQuestion.append("");
|
}
|
else
|
{
|
sbQuestion.append(listJsonRow.get(i).asString());
|
}
|
}
|
sbQuestion.append("\n");
|
|
if(sbQuestion.length() > 4096)
|
break;
|
}
|
|
String answer = llm.callWithMessage(null, sbQuestion.toString(), tranReq).replace("\r", "");
|
|
jsonWrConclusion.beginMap(null);
|
{
|
jsonWrConclusion.addKeyValue("agent_key", agentKey);
|
jsonWrConclusion.addKeyValue("report", answer);
|
}
|
jsonWrConclusion.endMap();
|
|
tranReq.sendChunkedBlock("conclusion", jsonWrConclusion.getRootJson());
|
|
return null;
|
}
|
}
|