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 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 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 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; } }