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