TangCheng
6 天以前 47fc68b2894ee24d6b98675f98829e648b42ace8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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;
    }
 
}