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("<ROOT>" + rec.getString("clz_arguments") + "</ROOT>");
|
Element xmlPrompt = (Element)doc.selectSingleNode("ROOT/PROMPT");
|
|
_prompt = xmlPrompt.getText();
|
|
if(this._mapName2Argument.size() > 0)
|
{
|
StringBuilder sbArgs = new StringBuilder();
|
sbArgs.append("其中系统提供的参数是:\n");
|
for(Entry<String, AgentArgument> 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;
|
}
|
|
}
|