package com.smtaiserver.smtaiserver.javaai.qwen.agent; import java.util.Map.Entry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dom4j.Document; import org.dom4j.Element; import org.mozilla.javascript.Context; import com.smtaiserver.smtaiserver.core.SMTAIServerRequest; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord; import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError; import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap; import com.smtaiserver.smtaiserver.javaai.llm.core.SMTLLMConnect; import com.smtaiserver.smtaiserver.javaai.qwen.agent.script.SMTQwenAgentScriptJet; import com.smtservlet.util.Json; import com.smtservlet.util.SMTStatic; public class SMTQwenAgentJavascript extends SMTQwenAgent { private static Logger _logger = LogManager.getLogger(SMTQwenAgentJavascript.class); protected String _prompt; @Override public void initInstance(DBRecord rec) throws Exception { super.initInstance(rec); try { Document doc = SMTStatic.convStrToXmlDoc("" + rec.getString("clz_arguments") + ""); Element xmlPrompt = (Element)doc.selectSingleNode("ROOT/PROMPT"); _prompt = xmlPrompt.getText(); if(this._mapName2Argument.size() > 0) { StringBuilder sbArgs = new StringBuilder(); sbArgs.append("其中系统提供的参数是:\n"); for(Entry entry : this._mapName2Argument.entrySet()) { sbArgs.append(entry.getKey() + " : " + entry.getValue()._prompt + "\n"); } _prompt += sbArgs.toString(); } } catch(Exception ex) { throw new Exception("init mertic agent error : " + this._agentId, ex); } } @Override public SMTJavaAIError callAgents(String jsonPath, Json jsonArgs, SMTLLMConnect llm, String question, SMTAIServerRequest tranReq) throws Exception { int maxCount = 1; // 失败最多尝试3次 for(int j = 1; j <= maxCount; j ++) { // 分析生成js代码 String jsCode = llm.callWithMessage(new String[] {_prompt}, question, tranReq).replace("\r", ""); tranReq.traceLLMDebug(jsCode); jsCode = SMTStatic.convLLMAnswerToJavascript(jsCode); jsCode = "function ffffff(){" + jsCode + "};ffffff();"; //String jsCode = "var arr = testRS(); var l = arr[0]; for(var i in arr){}"; try(ASTDBMap dbMap = new ASTDBMap()) { // 执行脚本 SMTQwenAgentScriptJet scriptJet = new SMTQwenAgentScriptJet(jsonArgs, dbMap, tranReq); try { Context cx = scriptJet.entryContext(); try { scriptJet.executeScript(cx, jsCode); break; } finally { Context.exit(); } } catch(Exception ex) { StringBuilder sbCode = new StringBuilder(); String[] lines = jsCode.replace("\r", "").split("\n"); for(int i = 0; i < lines.length; i ++) { sbCode.append(String.format("%04d %s", i + 1, lines[i]) + "\n"); _logger.fatal(String.format("%04d %s", i + 1, lines[i])); } tranReq.sendChunkedBlock("begin", "解析失败(" + ex.getMessage() + "),重新解析"); if(j < maxCount) _logger.fatal("execute js agent error : " + this.getAgentId() + "\n" + sbCode, ex); else throw new Exception("execute js agent error : " + this.getAgentId() + "\n" + sbCode + "\n" + SMTStatic.toString(ex)); } } } return null; } }