Agentflow 示例

【Dify】多轮智能对话工作流AgentFlow AgentFlow是基于Dify平台的多轮智能对话工作流,通过简洁的节点设计实现高效问答与任务处理。该工作流以gpt-4o-mini语言模型为核心,包含启动、智能解析和回复输出三个自动化环节,支持多轮交互式对话。典型应用场景包括智能旅行顾问、客户服务助手等,能自动收集信息并生成个性化回复。系统无需复杂配置,兼容未来图片问答等扩展功能,适合快速构建智能对话场景。开发者可通过相关文档进一步学习AIGC与Agent工作流应用。(149字) 阅读详情

 交流QQ群:26651479


范例:

/***************************** 产生一个Excel檔 ********************************/
/*
 当Agenda系统要和外界系统作沟通的时候,可以利用Java所提供的Runtime对象来达成。也就是当用户想要去呼叫某一系统起来时(如Word、Excel…等),就可以使用此一对象。不过当被呼叫起来的系统不再被程序使用时,请记的要进行资源回收的动作,以防止资源一直被占用而无法释放。以下的范例先将Table组件的数据值输出成以“,”为区隔的字符串档案之功能写成一个Function,以模块化整个Script结构。接着再产生一个Excel文件并呼叫Excel应用程序。
*/

// 将 table资料转成以“,”隔开的csv檔
function fn_toexcel(f_row,f_col) {
    var str   = "";
    var s_1 = "";
    for (i = 0;i <= f_row;i++) {
        for (j = 0;j <= f_col; j++) {
            s_1 = table.getValueAt(i,j) + ",";
            str   = str + s_1;
        }
        filetext.println(str);
        str = "";
    }
}
var s_dir = "c://report//monthly//月报表.csv"; //档案位置
var filetext1 = new Packages.java.io.FileWriter(s_dir,false); //开档
var filetext   = new Packages.java.io.PrintWriter(filetext1);
var table = Form.getComponent("table1");
//表头
var s_1 =  Form.getValue("查询年份");
var s_2 =  Form.getValue("查询月份");
var str  = "查询月份:" + s_1 +"年" + s_2 + "月";
filetext.println(str);
//取资料
var str  = "产品名称,客户批号,进货日期,投入日期,备注" ;
filetext.println(str);
//表身
fn_toexcel((table.getRowCount()-1),27);
filetext1.close();
//启动
var rt = java.lang.Runtime.getRuntime();
var str2 = "start "+ s_dir;
rt.exec(str2);
/***************************** 产生Excel檔 结束 ********************************/

 

范例:使用常数的方式、取出目前Task的状态
var Task =  Form.getCurrentTask();
var mID=Task.getRealExecutor();
java.lang.System.out.println("Task.TASK_STATE_READY="+ Task.TASK_STATE_READY);
var tasklist = Client.getTaskOfMember(mID,Constant.TASK_STATE_READY);
Form.setValue("TASK_STATE_READY",tasklist.toString());
var tasklist = Client.getTaskOfMember(mID,Constant.TASK_STATE_RUNNING);
Form.setValue("TASK_STATE_RUNNING",tasklist.toString());
var tasklist = Client.getTaskOfMember(mID, Constant.TASK_STATE_SUSPENDED);
Form.setValue("TASK_STATE_SUSPENDED",tasklist.toString());
var tasklist = Client.getTaskOfMember(mID,Constant.TASK_STATE_COMPLETE);
Form.setValue("TASK_STATE_COMPLETE",tasklist.toString());

 

范例:FormAPI:setComplete(于okAction控管窗体是否允许进行完成送出)
if ((iSubDays==0) && (iSubHour==0) && (iSubMinu==0)) {
    dlg.showMessageDialog(Form,"请假时数为0,请重新输入!");
    Form.setComplete(false);
} else {
    Form.setComplete(true);
}


范例:ClientAPI:设定/读取/移除一个Client Site区域对象
//在 postAction 中抓取一些数据, 存下来供其他组件的Action来使用,如此避免每次都要重抓一次
{state1:
    var myTaskList = Client.getTaskOfMember("MEMxxxxxxx", Constant.TASK_STATE_ALL);
    // 将此数据存到 Client 数据
    Client.setLocalObject("myTaskList1",myTaskList);
    var data = Client.SQLloadValue("SELECT .... FROM ......");
    // 将此数据存到 Client 数据
    Client.setLocalObject("dataXX",data);
} 
//某个 button 的 Action
{
    // 取回原先存的数据
    var list = Client.getLocalObject("myTaskList1");
    if(list != null) {
    //do something
    }
    // 取回原先存的数据
    var data = Client.get("dataXX");
    if(data != null) {
        //do something
    }
}


范例: ClientAPI:Client site to do "completeTask"
※因为Form.closeForm()会有去update State,因此撰写顺序非常重要,否则Task会有残留的工作现象。
if (Client != null) {
    var t = Form.getCurrentTask();
    if (Client.checkTaskComplete(t)) {
        Form.closeForm();
        Client.setArtInsExitState(t.getArtInstance());                  
        Client.completeTask(t);
    }
}


范例:ClientAPI:检查用户输入密码的正确性
var dlg = new Packages.javax.swing.JOptionPane();
var LoginID    = Form.getValue("账号");
var Password = Form.getValue("密码");
dlg.showMessageDialog(Form,'checkPassword='+ Client.checkPassword(LoginID,Password));


范例: ClientAPI:for Form create(建立窗体)
a. JPanel createForm(String artID, String artInsID)
var panel = Client.createForm("ART00000000000","Ans000000000603");
if (panel != null) {
    var dlg = new Packages.javax.swing.JDialog();
    dlg.getContentPane().add(panel);
    dlg.setSize(panel.getSize());
    dlg.setVisible(true);
}

b. JPanel createForm(String artInsID)
var dlg = new Packages.javax.swing.JOptionPane();
var panel = Client.createForm("Ans000000000603");
if (panel == null) {
    dlg.showMessageDialog(Form,"查无此窗体");
}


/***************************** ClientAPI:寄送E-mail ********************************/
// 目前的Task资料
var task = Form.getCurrentTask();
// 目前的用户数据
var myMemberData = Client.getCurrentMember();
// 前一步骤的使用者名字
var frontUserName = task.getFrontUser();
// 前一步骤的用户数据
var memberData = Client.getMember(frontUserName);
if(memberData != null) {

    // 产生新的内部讯息数据
    var msg = new Packages.pe.pase.PASEMessage();
    msg.setSendID(myMemberData.getID());        // 传送者ID
    msg.setSendName(myMemberData.getName());    // 传送者名字
    msg.setRecID(memberData.getID());           // 收信者ID
    msg.setRecName(memberData.getName());       // 收信者名字
    msg.setTitle("工作回复通知");               // 讯息主旨
    //取得窗体夹文件
    var msgForm = new Packages.pe.pase.MsgAttachFormData (Form.getArtInstance().getID(),task.getID());
    var vc = new java.util.Vector();
    vc.add(msgForm);
    msg.setAttachList(vc);
    // 讯息内容
    var content = memberData.getName() + " 启动了「"  + task.getName() + "」工作。";
    msg.setMsg(content);
    msg.setTime(java.lang.System.currentTimeMillis()); // 讯息产生时间
    Client.sendPASEMessage(msg);

    // 寄发 信件到该员工 e-mail
    var from = myMemberData.getEmail();  // 信件来源 e-mail
    var to = memberData.getEmail();      // 信件目的地 e-mail
    var subject = "工作回复通知";          // 信件主旨
    // 信件内容
    var data = memberData.getName() + " 启动了「" + task.getName() + "」工作。"
    // 传送e-mail给该员工
    Client.sendMail(from,to,subject,data);
}
/***************************** 寄送E-mail 结束 ********************************/

 

范例:ServerAPI:寄送E-mail的做法
var from = "abc@flowring.com";
var toMember = Server.getMember(MyTask.getMemberID());
var to = toMember.getEmail();
var title = "mail Title ";
var data = "mail Content";
Server.sendMail(from,to,title,data);


范例:ServerAPI:Server Site 自动执行时,改变文件状态的作法
var PastStateID  = "AST01211255679951671";  //自动审核通过 的状态代码   可由 PDE 得知.
var falseStateID = "AST01221255681777281";  //自动不审核通过 的状态代码 可由 PDE 得知.
var ati = MyTask.getArtInstance();
var holiday = java.lang.Integer.parseInt( ati.getAppValue("Holiday") );
var totalDay = java.lang.Integer.parseInt( ati.getAppValue("TotalDay") );
if ( totalDay > holiday ) {
    Server.setArtInsState(ati,falseStateID);
}
else {
    Server.setArtInsState(ati,PastStateID);
}

 

范例:ClientAPI:可改变文件状态
Client.setArtInsState(PASEartInstance artInstance, String stateID);


范例:Server Site:取出会签的意见内容
var csInstance = MyTask.getCSInstance();
var note  = csInstance.getNote();
MyTask.getArtInstance().setAppValue("会签意见",note);


范例:Client Site:取出会签的意见内容
var task = Form.getCurrentTask();
var csInstance =task.getCSInstance();
var note  = csInstance.getNote();
Form.setValue("会签意见",note);

 

范例:Server API:
/* announceOnlineClient(), 于流程执行时传送讯息到Client端目前此API支持三种方式
      0:在Client显示一个对话盒
      1:在Client端的执行窗口上显示一段文字
      2:让Client端的PC喇叭发出声音
注意,这些通知讯息只有在该Client on line时才会显示。
*/
var clientMsg1 = new Packages.pe.pase.ClientMessage(0); // 对话盒
var param1 = new Packages.java.util.HashMap();
param1.put("title","===== test title ====");      //对话盒的标题
param1.put("content","some message for you");     //对话盒的内容
clientMsg1.setParam(param1);
var clientMsg2 = new Packages.pe.pase.ClientMessage(1); // 显示文字
var param2 = new Packages.java.lang.String("dump this message on screen");  //文字内容
clientMsg2.setParam(param2);
var clientMsg3 = new Packages.pe.pase.ClientMessage(2); // 发出声音
var param3 = new Packages.java.lang.Integer(10);  // 次数
clientMsg3.setParam(param3);
Server.announceOnlineClient("yschen",clientMsg1);  // 送出第一个讯息
Server.announceOnlineClient("yschen",clientMsg2);  // 送出第二个讯息
Server.announceOnlineClient("yschen",clientMsg3);  // 送出第三个讯息

 


/***************************** 设定定时执行及解除定时执行 ********************************
Server API:
注意事项:
1.在server端控制
2.命令为以一长字符串输入,如下例之command写法,和一般的script写法同,但原为"处改为/",原为/n改为//n。
3.不论执行过否的命令行,在SERVER没有重新启动的情形下不会被移除,要自行移除。
//根据窗体上客户类别下不同的时间控制,
//于时间到时将本node上的数据通知前一node的user
//但本node的user需要在填入数据后按暂停才能将现有的资料传回上一node  */

var refList=MyTask.getRefArtifactList();
var refArtInstance=refList.get(0);
var cusRank = refArtInstance.getAppValue("客户类别");
var initiator = refArtInstance.getAppValue("受理人");
//time control, set different timer according to different types of customer
//script to be executed at the specified time
//get data from Artifact 010416
var command = "var refList = MyTask.getRefArtifactList();";
command += "var refArtInstance = refList.get(0);";
command += "var date = refArtInstance.getAppValue(/"日期/");";
command += "var time = refArtInstance.getAppValue(/"时间/");";
command += "var cusRank = refArtInstance.getAppValue(/"客户类别/");";
command += "var cusName = refArtInstance.getAppValue(/"客户名称/");";
command += "var site = refArtInstance.getAppValue(/"障碍地点A/");";
command += "var cscMemberName = refArtInstance.getAppValue(/"受理人/");";
command += "var artInstance = MyTask.getArtInstance();";
command += "var handleRecord = artInstance.getAppValue(/"处理记录/");";
command += "var text = date +/" /"+ time
        + /"送出之障碍申告单尚未完成请注意!//n//n客户名称 : /"
        + cusName + /"//n客户类别 : /" + cusRank 
        + /"//n障碍地点 : /" + site + /"//n处理情形 : /" +handleRecord;";
command += "java.lang.System.out.println(text);";
//send Message to online user
command += "var clientMsg1 = new Packages.pe.pase.ClientMessage(0);";
command += "var param1 = new Packages.java.util.HashMap();";
command += "param1.put(/"title/",/"!!!WARNING!!!/");";
command += "param1.put(/"content/",text);";
command += "clientMsg1.setParam(param1);";
command += "var clientMsg3 = new Packages.pe.pase.ClientMessage(2);";
command += "var param3 = new Packages.java.lang.Integer(5);";
command += "clientMsg3.setParam(param3);";
command += "Server.announceOnlineClient(cscMemberName,clientMsg1);";
command += "Server.announceOnlineClient(cscMemberName,clientMsg3);";
if (cusRank == "A"){
    var date = new Packages.pase.agenda.MyDate();
    var now = date.getCurrentDate("Y/M/D/H/m");
    var ann = date.addMin(now,1);
    var taskID = MyTask.getID();
    for (var i=0;i<10;i++){
        var ann = date.addMin(ann,1);
        //setTimeControl
        Server.createCronScript(ann, command, taskID);
    }
}
/***************************** 设定定时执行及解除定时执行 结束 ********************************/

 

范例:ClientAPI:createProcess相关用法
//createProcess传回TaskID
var taskID = Client.createProcess(userId,flowId,args);  
//getTask传回Task Object
var task = Client.getTask(taskID);
//getTaskState传回TaskState
var taskState = task.getTaskState();
if (taskState == Constant.TASK_STATE_READY){
    Packages.javax.swing.JOptionDialog().showMessageDialog(Form, "taskState is READY!!");
}


范例:ClientAPI:createProcessByRandom(String pID, HashMap arg)
//配置参数数据结构
var hashTable = new java.util.HashMap();
//由窗体读取参数数据
var name = Form.getValue("姓名");
//将数据放入HashTable
hashTable.put("姓名",name);
//随机选取启动流程的人员
var taskID = Client.createProcessByRandom("PRO0006972270347090",hashTable);


范例:Server, Client API: getManagerRole(String id)
//首先寻找主要职务之Manager, 如无设定则任易选取一种职务之Manager.
var mr = getManagerRole("MEM00000");
//寻找此职务之Manager. 如输入之职务"ROL00000"本身为主管,则寻找其主管。
var mr = getManagerRole("ROL00000");
//寻找此部门之主管。
var mr = getManagerRole("DEP00000");
//寻找此公司之最高主管。
var mr = getManagerRole("company");

 

范例:AttachFile组件
var attachFileCmp = Form.getComponent("AttachFile1");
attachFileCmp.setProperty("attach",false); // 关掉 attach 功能
attachFileCmp.setProperty("uploadAll",true);// 上传档案


范例:AttachFile组件properties : "FileList", "FileCount"
var attachFileCmp1 = Form.getComponent("夹档1");
var attachFileCmp2 = Form.getComponent("夹档2");
//取得所有档案
var filelist = attachFileCmp1.getProperty("FileList");
//配置文件案给另一AttachFile组件
attachFileCmp2.setProperty("FileList",filelist);
//加入档案给另一AttachFile组件
attachFileCmp2.setProperty("AppendFileList",filelist);
//取得档案数
var count = attachFileCmp1.getProperty("FileCount")


范例:改变Label组件的文字颜色
var lab=Form.getComponent("Label4");
lab.setForeground(Packages.java.awt.Color.blue); //文字颜色改成蓝色


范例:Table组件,改变table标题的作法
//改table标题的用法
var spane = Form.getComponent("Table1");
var table = spane.getViewport().getView();
//此行为取出第一行的标题0,1,2....为第几行
var str = table.getColumnModel().getColumn(0).getHeaderValue();
//此行为改第一行的标题0,1,2...为第几行
table.getColumnModel().getColumn(0).setHeaderValue("西瓜");
spane.repaint();


范例:Table组件,加入comboBox的作法
//改table某column的editor用法
//可以在没有设定editor为combobox情形下改为combobox
var table = Form.getComponent("Table1").getViewport().getView();
var combo = new Packages.javax.swing.JComboBox();
combo.addItem("主机");
combo.addItem("屏幕");
combo.addItem("键盘");
var editor = new Packages.javax.swing.DefaultCellEditor(combo);
//此行为改第一行的editor,0,1,2...为第几行
table.getColumnModel().getColumn(0).setCellEditor(editor);


范例:Table组件,加入自定义的Vector,并放进Table.string column的作法
var vc1 = new java.util.Vector();
vc1.add("计算机主机");
vc1.add("计算机屏幕");
vc1.add("键盘");
vc1.add("鼠标");
var tb=Form.getComponent("Table1");
tb.newRow();
tb.setValueAt("采购单一",0,"String");
tb.setValueAt(10,0,"Integer");
tb.setValueAt(false,0,"Boolean");
tb.setValueAt(vc1,0,"JComboBox");


范例:Table组件:每列计算加总的作法
var sum = 0;
var price = 0;
var table = Form.getComponent("table1");
if (table.getRowCount() > 1) {
    for(var i=0;i<table.getRowCount()-1;i++) {
        if ((table.getValueAt(i,"金额") != "")) {
            price = java.lang.Double.parseDouble(table.getValueAt(i,"金额"));
            sum = sum + price;
        }
    }
}


范例:Table组件:隐藏或还原被隐藏域的作法
目前Table隐藏域,仅提供暂时性的隐藏,亦即当窗体关闭再开启又会恢复全貌的字段数。
var dlg = new Packages.javax.swing.JOptionPane();
var table = Form.getComponent("Table");// 取得 MyTable 对象
table.setColHiding("字段三");         // 隐藏"字段三"
var strArr = table.getColHidingByName();// 取出被隐藏的域名
dlg.showMessageDialog(Form,strArr);
table.resetColHiding();   // 取消所有隐藏的效果


范例:Table组件:formula使用方法
Table组件提供formula编辑器,使用规则为 SQL语法 + @{域名}
@{域名} :表示数据条件会依用户在所指定字段的内容值而取出对应的查询结果。
//依所输入的"员工编号"此字段的数据值,取出对应的员工姓名(Name)。
SELECT Name FROM Mem_GenInf WHERE ID = @{员工编号}


范例:BarCode组件:设定BarCode Value的内容值
var cBarCode = Form.getComponent("BarCode1");
cBarCode.setProperty("code","9999");


范例:ComboBox组件:放入两个ITEM以上的作法
//一般的写法,只能将一组ITEM的数据放入ComboBox
var adder = new Packages.pase.agenda.MyComboBoxAdder(Client);
var comp = Form.getComponent("ComboBox1");
adder.addItems(comp,"Name","select Distinct Name from Rol_GenInf");
//多笔的处理后放入
var combo = Form.getComponent("ComboBox1"); 
combo.removeAllItems();             //先清掉ComboBox中原有资料
var str = "select Distinct Name,ID from Rol_GenInf"; //取出两组数据
var t7 = Client.SQLloadValue(str);
for (var i=0;i<t7.size();i++) {
    var ht = t7.get(i);
    var aa = ht.get("Name");
    var bb = ht.get("ID");
    if (aa.length() > 0 ) {            
        // cc=aa+bb中,如aa是null,会出现错误(但bb是null则不会), 故要挡aa是null的情形
        var cc = aa + bb;  
        // 可直接用addItem放入
        combo.addItem(cc);          
    } else { 
    // aa是null,则直接放入bb
    combo.addItem(bb);
    }
}


范例:使用 SQL 语法
//Select
var SQLText="SELECT Name FROM Mem_GenInf WHERE ID = /"MEM000001/"";
var DataSet = Client.SQLloadValue(SQLText);
if (DataSet.size()>0) {
    var sRecord = DataSet.get(0);
    var sName = sRecord.get("Name");
    Form.setValue("姓名",sName);
}
//Insert
var SQLText = " insert IDTEMP (ID) VALUES ('456')  ";
Client.SQLinsertValue(SQLText);
//Update
var iTotal=1000;
var t_qty =20;
var SQLText = " UPDATE ART961723240490_Ins SET ITEM23 = "+iTotal+ " WHERE  ITEM23 = '+t_qty;
Client.SQLupdateValue(SQLText);
//Delete
var SQLText = " delete from Task  ";
Client.SQLdeleteValue(SQLText);


范例:Script 撰写 Function 的作法:
// function checknull(s)
function checknull(s) {
    if ( s == null ) { s = "";}
    return s 
}
// main 
var ht1 =new java.util.HashMap();
var sNum = Form.getValue("赠品需求单号码");
sNum = checknull(sNum);
ht1.put("赠品需求单号码",sNum);


范例:显示询问的对话盒
var yesnoDlg = new Packages.javax.swing.JOptionPane();
var n = yesnoDlg.showConfirmDialog(Form,"无批号,是否结案?","结案","1");
if (n == 0) {  //表示Yes
    ....
}


范例:设定Button Enable/Disable
var tfObject = Form.getComponent("Button1");
tfObject.setEnabled(false);    // (1) false:表示Disable  (2)true :表示Enable


范例:透过程序启动 Button、RadioButton、CheckBox 内程序
var bt = Form.getComponent("Button1");
bt.doClick();
var rb = Form.getComponent("RadioButton1");
rb.doClick();
var cb = Form.getComponent("CheckBox1");
cb.doClick();


范例:取得文件编号
var Task = Form.getCurrentTask();
var alnstance = Task.getArtInstance();
var No=alnstance.getMyID();
Form.setValue("文件编号",No);


范例:取得公司组织架构下成员姓名并放置窗体下拉式选单Combobox中
var adder = new Packages.pase.agenda.MyComboBoxAdder(Client);
var comp1 = Form.getComponent("代理人");
adder.addItems(comp1,"UserName","select UserName from Mem_GenInf");

 

范例:取出员工相关信息的作法
取出员工相关信息(使用前题:没有被设定代理人)
// Get login User MyID,Name
var cMember = Client.getCurrentMember();
Form.setValue("申请者员工编号",cMember.getMyID());
Form.setValue("申请者",cMember.getName());
// Get Role DATA ON CURRENTLY
var mdr = cMember.getMemberDR(Task.getRoleID());
if(mdr != null) {
    Form.setValue("申请者职称",mdr.getRoleName());
    Form.setValue("申请者职称编号",mdr.getRoleID());
    Form.setValue("申请者单位",mdr.getDepartmentName());
    Form.setValue("申请者单位代号",mdr.getDepartmentID());
} else {
    Form.setValue("申请者职称","Unknown");
    Form.setValue("申请者职称编号","Unknown");
    Form.setValue("申请者单位","Unknown");
    Form.setValue("申请者单位代号","Unknown");
}
取出当时Task执行者的信息
// Default login User Name to set asking for person
var Task =  Form.getCurrentTask();
var mID=Task.getRealExecutor(); //Task实际执行者
var cMember = Client.getMemberByID(mID);
// Get Role,Department 
var mdr = cMember.getMemberDR(Task.getRoleID());
if(mdr != null) {
    Form.setValue("职称",mdr.getRoleName());
    Form.setValue("单位",mdr.getDepartmentName());
} else {
    Form.setValue("职称","Unknown");
    Form.setValue("单位","Unknown");
}

取出员工新方式(有无设定代理人,都可以正常被取出)
// Get login User MyID,Name
var Task =  Form.getCurrentTask();
var mID=Task.getRealExecutor(); //Task实际执行者
var cMember = Client.getMemberByID(mID);
Form.setValue("员工编号",cMember.getMyID());
Form.setValue("姓名",cMember.getName());
// Get Department Name & Role Name
var Str = java.lang.String(cMember.getRoleList().get(0));
var iStr=Str.indexOf("-");
var sDepName = java.lang.String(Str.substring(0,(iStr-1))).trim();
var sRoleName = java.lang.String(Str.substring((iStr+1),Str.length())).trim();
Form.setValue("单位",sDepName);
Form.setValue("职称",sRoleName);

 

范例:将Task 一次送给许多人
若希望将下列的流程A分派给同一个职务的所有人执行
流程A:START -> 1 -> 2 -> 3 -> END
先设计另一个流程B,于B中获得所要分派人的名单,再使用createProcess 来启动多个流程A
流程B:START -> 1 -> END
其中1 设定为自动执行的流程,并在其【职务设定】->【执行动作】中撰写所需的Script
// 取得所要分派的职务
var role = Server.getRole("ROL0002982310491040");
if( role != null) {
    // 取出此职务下的所有职员
    var memberlist = role.getMemberList();
    for (var i=0;i<memberlist.size();i++) {
        var mID = memberlist.get(i);
        var args = new Packages.java.util.HashMap();
        // 呼叫 createProcess, 启动流程A
        Server.createProcess(mID,"PRO0018982766454101",args);
    }
}
写好后,只要用户起动流程B,就可以一次启动多个流程A,将工作分派给同一个职务下的每个人。


范例:取出参考文件的内容数据
//取出参考文件"请料单"的域值
var task = Form.getCurrentTask();                              
var refList = task.getRefArtifactList();
if (refList.size() >0) {
    // 取出第一份参考文件
    var aInstance = refList.get(0);
    // 取出参考文件中"请料单号"字段的内容值
    var str = aInstance.getAppValue("请料单号");
    // 将取出的资料设定到目前正在作用的窗体上
    Form.setValue("已请料单号",str);
    //取出参考文件中Table组件的内容值
    var Ins_tb = aInstance.getAppDataMap();
    // 原本参考文件Table组件命名为T3
    var tb = Ins_tb.get("T3");
    if (tb.size() > 0) {
        var table = Form.getComponent("T1");
        for (var i=0;i<tb.size();i++) {
            var ht = tb.get(i);
            var row = table.newRow() - 1;
            table.setValueAt(ht.get("ITEM1"),row,"序号");
            table.setValueAt(ht.get("ITEM2"),row,"料号");
            table.setValueAt(ht.get("ITEM3"),row,"原料名称");
            table.setValueAt(ht.get("ITEM4"),row,"单位");
            table.setValueAt(ht.get("ITEM5"),row,"申请数量");
        }
    }
}

 

范例:检查目前Task是否来自代理他人工作的作法
var dlg = new Packages.javax.swing.JOptionPane();
var tsk = Form.getCurrentTask();
var memID = tsk.getMemberID();
var realID = tsk.getRealExecutor();
if (memID.equals(realID)) {
    dlg.showMessageDialog(Form,"没有代理任何人工作");
} else {
    var mr = Client.getMemberByID(memID);
    dlg.showMessageDialog(Form,"代理:"+mr.getName());
}


范例:将Vector的值放入List Object的使用方法
var sSql = " select Name from Art_GenInf";
var RecordSet = Client.SQLloadValue(sSql);
var vc1 = new java.util.Vector();
if (RecordSet.size() > 0 ) {
    for (i=0;i < RecordSet.size() ;i++) {
        vc1.add(RecordSet.get(i).get("Name"));
    }
}
var list = (Packages.javax.swing.JList)
(Form.getComponent("List1").getViewport().getView());
list.setListData(vc1);


范例:Array的使用方法
var table = Form.getComponent("Table1");
var rCount = table.getRowCount();
// 加入此两行
var cCom = new Array(rCount);
var cNam = new Array(rCount);
for(var i=0; i<rCount; i++) {
    cCom[i] = table.getValueAt(i,"制令");
    cNam[i] = table.getValueAt(i,"客户");
    var Ustr = "update ART0015979544766775_Ins set ITEM35='"+cCom[i]+ "' where ITEM141='"+cNam[i]+"'";
    Client.SQLupdateValue(Ustr);
}


范例:Server:会签流程前置动作
//在分派会签成员阶段,系统会先执行此段Script。
//此段Script的目的在新增一个参与会签成员。
{CSANNEX:
    var mem = new Array(3);
    mem[0] = "MEM0050991632102697";
    var member = Server.getMemberByID(mem[0]);
    mem[1] = member.getMainRoleID();
    var memDR = member.getMemberDR(mem[1]);
    mem[2] = memDR.getDepartmentID();
    MyTask.addAuditMember(mem);
}
//会签在加签阶段,系统会先执行此段Script。
//此段Script的目的在将所有的参与会签成员的名字、职务、与部门放进会签单内。
{CSAUDIT:
    var str = new java.lang.String();
    var auditList = MyTask.getAuditList();
    for(var i = 0;i < auditList.size();i++) {
        var mem = auditList.get(i);
        str += ("/nMem == " + Server.getMemberByID(mem[0]).getName());
        str += (" ;Role == " + Server.getRole(mem[1]).getName());
        if(mem[2] == "company") 
            str += (" ;Dep == " + Server.getCompany().getName());
        else
            str += (" ;Dep == " + Server.getDepartment(mem[2]).getName());
    }
    MyTask.getCSInstance().setNote(str);
}


范例:Server:会签流程后置动作
//当会签在分派成员阶段的工作结束之后,系统会去执行此段Script。
//此段Script的目的在将分派成员阶段设定完毕的参与会签成员在多加一个人员。
{CSANNEX:
    var mem = new Array(3);
    mem[0] = "MEM0050991632102697";
    var member = Server.getMemberByID(mem[0]);
    mem[1] = member.getMainRoleID();
    var memDR = member.getMemberDR(mem[1]);
    mem[2] = memDR.getDepartmentID();
    MyTask.addAuditMember(mem);
}
//当会签在加签阶段工作完成后,系统会去执行此段Script。
//此段Script的目的在将所有的参与会签成员的名字、职务、与部门列在会签意见之后。
{CSAUDIT:
    var str = MyTask.getCSInstance().getNote();
    var auditList = MyTask.getAuditList();
    for(var i = 0;i < auditList.size();i++) {
        var mem = auditList.get(i);
        str += ("/nMem == " + Server.getMemberByID(mem[0]).getName());
        str += (" ;Role == " + Server.getRole(mem[1]).getName());
        if(mem[2] == "company") 
            str += (" ;Dep == " + Server.getCompany().getName());
        else
            str += (" ;Dep == " + Server.getDepartment(mem[2]).getName());
    }
    MyTask.getCSInstance().setNote(str);
}

 

范例:【分派动作】
//将此一工作的执行者更改为原本执行者的主管
{
    var managerRole = Server.getManagerRole(MyTask.getRoleID());
    var memberList = managerRole.getMemberList();
    MyTask.setRealExecutor(memberList.get(0));
    MyTask.setMemberID(memberList.get(0));
    MyTask.setRoleID(managerRole.getID());
    Server.updateTask(MyTask);
}


范例:【从数据库直接读取基本数据】
{
    //读取使用者名字、LoginID、EMail、说明
    var memID = Client.getCurrentMember().getID();
    var memLoadStr = "select UserName, LoginID, EMail, Synopsis from "
        + "Mem_GenInf where MemID = '"+memID+"'";
    var memResult = Client.SQLloadValue(memLoadStr);
    var memData = memResult.get(0);
    var str = "[利用数据库取得数据]/n姓名:"+memData.get("UserName")
        + "/nEMail:"+memData.get("EMail")+"/nID:"+memID
        + "/nLoginID:"+memData.get("LoginID")
        + "/nSynopsis:"+memData.get("Synopsis")+"/n";
//读取职务名称以及部门ID
    var roleLoadStr = "select a.Name, a.DepID from Rol_GenInf a, Rol_Mem b "
        + "where b.MemID = '"+memID+"' AND b.RolID = a.RolID";
    var roleResult = Client.SQLloadValue(roleLoadStr);
    var depID = roleResult.get(0).get("DepID");
    //读取部门名称
    var depLoadStr = "select Name from Dep_GenInf where DepID='"+depID+"'";
    var depResult = Client.SQLloadValue(depLoadStr);
    str = str + "部门:"+depResult.get(0).get("Name")
        + "/n职称:"+roleResult.get(0).get("Name")+"/n";
    //读取目前时间
    var today = new Packages.pase.agenda.MyDate();
    var now = today.getCurrentDate("Y/M/D H:m");
    str += now;
    //将数据显示在电子表单上
    Form.setValue("board", str);
}


范例:【防呆】
防呆指的就是在电子表单里一些该填的数据没有填的话,系统就会做出一些预防措施以避免流程发生错误。
所有组件的防呆检查动作几乎都一样,就是一一去检查各组件里的字段是否该填的没填,接着再做出一些预防措施。
一般的防呆动作都是在送出窗体时才做,因此通常都是写在LayerPane的okAction方法里面。
范例中是使用Table组件,一检查到有字段未填时,系统就会显示出一个窗口并且阻止流程完成送出。
{初始化:
    //检查Table中的字段是否有留白
    ////Table中的最后一行通常都是空白的,且如果Table只有一行数据的话,
 ////有可能没有最后的空白行,所以在检查时需分开检查。
    var CheckValue = "";
    var table = Form.getComponent("Table1");
    if (table.getRowCount() == 1) {
        if (table.getValueAt(0,"项目名称") == "") {
            CheckValue = "项目名称";
        } else if (table.getValueAt(0,"单价") == "") {
            CheckValue = "单价";
        } else if (table.getValueAt(0,"数量") == "") {
            CheckValue = "数量";
        } else if (table.getValueAt(0,"总价") == "") {
            CheckValue = "总价";
        }
    } else {
        for(var i=0;i<table.getRowCount()-1;i++) {
            if (table.getValueAt(i,"项目名称") == "") {
                CheckValue = "项目名称";
                break;
            } else if (table.getValueAt(i,"单价") == "") {
                CheckValue = "单价";
                break;
            } else if (table.getValueAt(i,"数量") == "") {
                CheckValue = "数量";
                break;
            } else if (table.getValueAt(i,"总价") == "") {
                CheckValue = "总价";
                break;
            }    
        }
    }
 
    if(CheckValue != "") { //Table字段有留白
        //显示出警告对话框
        Packages.javax.swing.JOptionPane.showMessageDialog(
Client.getClientMainFrame(), CheckValue+"字段未填写!",   
"工作未完成", Packages.javax.swing.JOptionPane.ERROR_MESSAGE);
        //阻止流程完成送出
        Form.setComplete(false);
    } else {    //Table字段没有留白
        //流程完成并送出
        Form.setComplete(true);
    }
}

 

范例:【多重流程、电子邮件与夹文件带至新流程】
多重流程指的是一对多流程的分发。此范例内有用到两个流程,流程A及流程B,流程A是由部门主管所执行的,当执行完毕之后会将流程A的电子表单里面的内容传到流程B的电子表单里面,如果流程A中有夹文件,则此夹档亦会一起传送到流程B,接着将流程B分派给部门内除了主管之外的所有人去执行,并且会寄封电子邮件通知所有成员尽速完成工作。
流程A的流程为:STARTStep1END。分派流程B到部门其他成员、传送电子表单内容以及寄送电子邮件的程序代码是写在流程A电子表单中LayerPane的postAction方法里。
{State1:
    //将流程A电子表单数据读取出来放进HashMap里
    var args = new Packages.java.util.HashMap();
    args.put("title", Form.getValue("标题"));
    //将流程A电子表单的附加文件读取出来放进HashMap里
    args.put("file", Form.getComponent("附加檔").getProperty("FileList"));
    //读取部门成员
    var dep = Client.getDepartment("DEP00031011150625115");
    var roleList = dep.getRoleList();
    for(var i = 0;i < roleList.size();i++) {
        var roleID = roleList.get(i);
        //如果职务为主管,则不再进行以下的动作
        if(roleID == "ROL00061011150634569") continue;
        var role = Client.getRole(roleID);
        var memList = role.getMemberList();
        //将流程B分派给部门内部其他成员
        for(var j = 0;j < memList.size();j++) {
            var memID = memList.get(j);
            //分派流程B,内存流程A电子表单数据的HashMap为参数传给流程B
            Client.createProcess(memID, "PRO00571011930907386", args);  
            //寄封电子邮件通知成员尽快完成流程B
            //电子邮件的出处
var from = "guest@test.com";   
//电子邮件的目的地
var to = Client.getMember(memID).getEmail();   
//电子邮件的主题
            var subject = "工作通知";   
            //电子邮件的内容
            var text = "Dear All:/n        请尽快完成流程B/nManager";   
            Client.sendMail(from, to, subject, text);
        }
    }
}
 流程B的流程为:STARTStep1Step2END。由于流程B已经被一一
的分派给所需执行此流程的成员,因此在流程B中只需将流程A所传过来的
电子表单数据读取出来,此段程序代码写在流程B电子表单中LayerPane的
preAction方法里。程序代码如下。
{ALL:
    //读取流程A在建构流程B时所传的HashMap参数   
    var task = Form.getCurrentTask();  
    var parentID = task.getParentID();  
    var globals = Client.getGlobals(parentID);  
    if (globals != null) {   
        //读取传过来的数据
    var title = globals.get("title");
        Form.setValue("title", title);
        //读取流程B的附加文件的数据
        var attachFileCmp = Form.getComponent("附加檔");
        //设定附加文件的属性
        attachFileCmp.setProperty("delete", false);
        //读取流程A传过来的附加文件的数据
        var fileList = globals.get("file");
        if(fileList != null) {
            //将流程A附加文件内的档案存到流程B附加文件内
            attachFileCmp.setProperty("AppendFileList", fileList);
        }
    }   
}

 

范例:【会签】
会签流程中有三个状态,此范例就分别针对这三种状态做不同的事情。程序代码是写在LayerPane的preAction方法里面。
{ALL:
    var tsk = Form.getCurrentTask();
    //csannex;指派会签人员分派成员
    if(tsk.getTaskType().equals("csannex")) {
        //范例中的此部份只在提醒指派会签人员要进行分派成员的动作
        Form.setValue("board", "请分派参与会签成员。");
    }
    //csaudit;参与会签成员正在进行会签动作
    if(tsk.getTaskType().equals("csaudit")) {
        //范例中的此部份会将参与会签成员的名单列在窗体上
        var list = tsk.getAuditList();
        var listStr = "指派会签人员所分派的参与会签成员名单如下。";
        for(var i = 0;i < list.size();i++) {
            var data = list.get(i);
            //参与会签成员
            var memberName = Client.getMemberByID(data[0]);
            //参与会签成员所担任的职务
            var roleName = Client.getRole(data[1]);
            //参与会签成员所在的部门
            var depName = Client.getDepartment(data[2]);
            listStr = listStr +"/n"+depName+"/"+roleName+"/"+memberName;
        }
        Form.setValue("board", listStr);
    }
    //csreview;审查者检视会签内容
    if(tsk.getTaskType().equals("csreview")) {
        var content = "会签意见汇整如下。";
        //读取汇整之后的会签内容
        content = content + "/n" + tsk.getCSInstance().getNote();
        Form.setValue("board", content);
    }
}


范例:【参考文件】
此范例的目的在将参考文件里的内容传到作用文件里。程序代码是写在作用文件中LayerPane的preAction方法里面,将其列在下方。
{初始化:
    var task=Form.getCurrentTask();
    //取得所有的参考文件,在refList这个Vector里面的对象都是PASEartInstance
    var refList=task.getRefArtifactList();
    if (refList.size() > 0) {
        var aInstance=refList.get(0);
        //将列在第一份的参考文件的内容传到作用文件上
        Form.setValue("board",aInstance.getAppValue("board"));
    }
}


 

AgentFlow自定义表单开发实践指南 AgentFlow工作流引擎是业务流程自动化领域的革命性产品,它起源于对复杂业务流程管理需求的深刻理解。工作流引擎不仅提供了传统的工作流管理功能,如任务分配、流程监控和异常处理,还具有诸多核心优势,如高度的可定制性、易用性及与各种业务系统的无缝集成能力。通过AgentFlow工作流引擎,企业可以构建出高度灵活的业务流程管理系统,不仅支持表单的自动化处理,还能实现复杂的业务逻辑和数据处理。这种高度的灵活性和强大的功能让企业能够快速适应市场变化,提高业务处理效率。 阅读详情

相关推荐

从平衡车到寻迹小车:IMU963RA九轴陀螺仪实战避坑与四元数融合指南

本文详细解析了IMU963RA九轴陀螺仪在机器人姿态控制中的应用,重点探讨了从六轴升级到九轴系统的技术路径及四元数融合算法。通过实战案例,揭示了如何利用地磁计补偿陀螺积分漂移,并提供硬件集成、传感器校准及算法实现的完整解决方案,有效将8小时漂移控制在2度以内。

weixin_27219587的博客 253

Agentflow 学习

串签为将工作按照参与成员的顺序一一的交付下去。/***************************** 启动流程后获得其内容 结束 ********************************//***************************** 启动流程后获得其内容 ********************************//************** 例 1 面板(Layerpane) 的openFormAction ***********************/

qq_39306234的博客 1800

别再手动折腾了!PICO Unity SDK 一键配置开发环境保姆级教程(含PDC串流调试)

本文详细介绍了PICO Unity SDK的一键配置功能,帮助开发者快速搭建VR开发环境。通过自动化配置流程,大幅减少手动设置时间,提升开发效率。文章还涵盖了PDC串流调试技巧和常见问题解决方案,是PICO VR开发的实用指南。

weixin_30335575的博客 450

【亲测免费】 探索Agentflow:将复杂的工作流简化为JSON

探索Agentflow:将复杂的工作流简化为JSON 在处理大型语言模型(LLMs)时,如何构建和执行工作流程常常是一项挑战。但这一切都将随着Agentflow的出现而改变。Agentflow是一个强大的工具,它以简单的JSON格式让你能够编写出复杂的LLM工作流,并实现动态输出和自定义功能。让我们一起深入了解这个创新项目。 项目介绍 Agentflow的设计理念是简单与强大的结合。它允许你用接近...

gitblog_00055的博客 1058

PPT+视频 | 详解智能营销增益模型(uplift model)

分享营销增益模型的原理和常见的建模及评估方法,并以淘票票智能票补为例介绍uplift model技术的实践经验。

阿里文娱技术 8626

避坑指南:CoppeliaSim逆运动学仿真常见报错解决方案(附UR5+RG2爪完整Lua脚本)

本文针对CoppeliaSim机器人仿真中常见的逆运动学报错问题,提供了详细的避坑指南和解决方案。文章以UR5机械臂与RG2夹爪组合为例,深入剖析了模型装配、Dummy节点配置、Lua脚本编写等关键步骤中的常见错误,并附带了完整的、带错误处理的脚本代码,帮助用户快速定位并解决IK仿真失败问题,提升仿真效率。

weixin_29054399的博客 267

AgentFlow框架:用在线强化学习打造超越GPT-4o的小而强大智能体系统

AgentFlow是由四个专业智能体(规划器、执行器、验证器、生成器)组成的新范式,通过Flow-GRPO流中强化学习算法实时优化系统。以Qwen-2.5-7B-Instruct为基座的AgentFlow在10个基准测试中表现优异,搜索、智能体、数学和科学任务分别提升14.9%、14.0%、14.5%和4.1%,超越GPT-4o等大模型50倍规模的模型。研究表明,合理的系统设计和训练方法比单纯堆砌参数更有效,"协同能力"可能取代"规模"成为衡量智能的新指标。

star_nwe的博客 1142

如何绘制电气绝缘图(GB9706.1-2007和GB9706.1-2020差异)

是用来描述要考虑设备的绝缘状况和它们的值 ,从而便于和相关部门交流和沟通,如权威机构和检测实验室等。本文为绝缘图的实例, 包括所有相关的绝缘路径以及介电强度,爬电距离和电气间隙的值。

学海无涯的专栏 1万+

AI智能体“边做边学”入门到精通,斯坦福AgentFlow框架,收藏这篇就够了!

在人工智能领域,大型语言模型(LLM)正从“单打独斗”的聊天机器人,进化为能调用工具、规划步骤、协作完成复杂任务的“智能体”(Agent)。然而,当前的智能体系统面临一个核心困境:要么是静态的、靠预设规则驱动的“提线木偶”,要么是训练起来极其困难、难以适应新任务的“笨学生”。

m0_59235245的博客 1320

线结构光相机原理详解以及精度控制总结

摘要:线阵结构光相机是工业三维检测的核心设备,结合线阵相机的高分辨率与结构光的主动三维成像能力。其工作原理基于线激光投射、逐线扫描、亚像素级条纹提取及三角测量法实现三维重建。精度受硬件、校准、环境和算法四因素影响,需通过优化硬件选型(如小像元相机、窄线宽激光)、精准校准(相机内参、激光平面)、环境控制(遮光、隔振、恒温)及算法优化(Steger算法、点云后处理)来提升。典型应用(卷材、轨道检测)中深度精度可达5-20μm,需根据场景需求平衡参数配置。

start_up_go的博客 940

【温室气体】GOSAT 数据产品

【温室气体】GOSAT 数据产品

WW、forever的博客 238

终极教程:用AgentFlow构建迭代式AI开发循环(附代码示例)

AgentFlow是一款强大的AI工作流编排工具,能够以图形化方式编程管理数千个智能体和工具,帮助开发者构建高效的迭代式AI开发循环。通过本文的完整指南,即使是新手也能快速掌握如何利用AgentFlow实现自动化的代码生成与优化流程。 ## 🚀 为什么选择AgentFlow构建AI开发循环? 在传统AI开发中,开发者往往需要手动协调多个模型、反复调整参数并验证结果,这一过程不仅耗时且难以规模

gitblog_00785的博客 398

【机器人学】常用的小车底盘运动学模型推导(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对小车底盘运动学模型介绍做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容对于小车的分析,仅仅考虑XY轴的线速度和Z轴的角速度,不考虑和横滚和俯仰的速度,【防盗标记–盒子君hzj】也不考虑Z轴的高度变化【即:车底盘的运动可以用三个独立变量来描述:x轴平动、y轴平动、yaw轴转动】

qq_35635374的博客 1931

Agentflow 学习笔记

交流QQ群:26651479 1.Agentflow 的安装:     1) 须先安装有JVM,如JDK/JRE        下载地址:http://java.sun.com/downloads/        设置环境变量:如果是Win2000,xp使用鼠标右击“我的电脑”->属性->高级->环境变量               系统变量->新建->变量名:JAVA_HOME 变

daillo的专栏 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Agentflow 项目使用教程

Agentflow 项目使用教程 目录结构及介绍 Agentflow 项目的目录结构如下: agentflow/ ├── github/ │ └── workflows/ │ ├── agentflow │ └── tests ├── flake8 ├── gitignore ├── LICENSE ├── README.md ├── example.env ├── r...

gitblog_00880的博客 565

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

零基础学习AgentFlow:从安装到部署的完整路线图

想要掌握AI智能体编排技术吗?AgentFlow是一个强大的开源工具,能够帮助你以编程方式编排数千个AI智能体,构建复杂的依赖图工作流。无论你是AI开发者、运维工程师还是自动化流程爱好者,这份完整的AgentFlow学习路线图将带你从零开始,快速上手这个革命性的智能体编排框架。 ## 🚀 AgentFlow是什么?为什么需要它? AgentFlow是一个Python库,专门用于编排Codex

gitblog_00188的博客 436

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AgentFlow实战教程:从环境配置到运行推理的完整指南

AgentFlow是一款强大的智能代理系统优化工具,能够帮助开发者快速构建和部署高效的AI代理应用。本教程将带你从环境配置开始,逐步掌握AgentFlow的核心功能,轻松实现智能推理任务。 ## 一、环境准备:快速搭建开发环境 ### 1.1 安装AgentFlow 首先,克隆AgentFlow项目仓库到本地: ```bash git clone https://gitcode.com/g

gitblog_00046的博客 720

AgentFlow核心功能详解:从依赖图到远程执行的完整指南

AgentFlow是一款功能强大的多智能体编排工具,能够帮助开发者以图形化方式编排数千个智能体和工具,实现复杂任务的自动化执行。无论是构建并行工作流、处理迭代循环,还是在SSH/EC2/ECS等远程环境中执行任务,AgentFlow都能提供简单而高效的解决方案。 ## 核心功能概览 🚀 AgentFlow的核心价值在于其强大的**智能体编排能力**和**灵活的执行模式**。通过将Codex、

gitblog_00708的博客 314

如何使用AgentFlow实现并行任务分发?3种fanout模式全解析

AgentFlow是一款强大的任务编排工具,能够以图形化方式编程管理数千个智能体和工具,轻松实现高效的并行任务分发。本文将详细介绍如何利用AgentFlow的fanout功能实现并行任务处理,帮助新手用户快速掌握这一核心技能。 ## 什么是AgentFlow的fanout模式? 在AgentFlow中,fanout是实现并行任务分发的核心机制,它允许将一个任务分解为多个子任务并同时执行。这种模

gitblog_01155的博客 533

ax:Agentic编排运行时在Kubernetes上的落地实践与核心机制

Agentic编排运行时是支撑多智能体协同的关键技术,其核心在于将智能体的动态执行语义映射到Kubernetes等分布式底座上。传统工作流引擎因静态DAG、状态语义不匹配和资源模型限制,难以满足智能体运行时的动态拓扑与上下文管理需求。通过声明式API与控制器循环,编排层与运行时层解耦,实现跨集群的智能体调度与生命周期管理。该技术广泛应用于AI Agent平台、多集群推理与工具调用场景,为agentic cloud提供坚实底座。本文围绕ax的设计思路、资源模型、执行链路及常见问题排查展开工程实践总结。

weixin_29248611的博客 254

斯坦福最新研究:AGENTFLOW系统让大模型推理效率提升70%+!

斯坦福大学等机构联合提出的AGENTFLOW系统通过流程化建模和动态控制机制,解决了大模型在复杂推理任务中的规划不足与工具使用低效问题。其创新的Flow-GRPO优化算法有效解决了长序列决策中的信用分配难题,实验显示在10项推理任务上性能提升显著,最高达68.8%。该系统在3B和7B模型上均表现出优异扩展性,为未来低成本、高效能的大模型推理提供了新思路。

m0_65555479的博客 753

AgentFlow API

Agentflow流程系統的API

Jason.H的个人空间 355

Pencil 批量导出实用指南:3步一次生成多种格式

Pencil Project 是一款免费开源的图表绘制与 GUI 原型设计工具,它的批量导出功能让你一次勾选多页、输出 PNG、SVG、PDF 等格式,帮设计师和产品同学省下逐页导出、反复切换格式的功夫 🚀 ## 适用场景 这几个场景最耗时,批量导出能帮你压缩到几分钟: - 交付评审前,要给测试发 PNG、给开发发 SVG、给产品发 PDF,一轮导出同时满足三方 - 原型有 20 页,逐页

gitblog_00155的博客 958

BPM企业应用之Agentflow解决方案简介

<br />在制造业诸多e化系统之中,企业流程管理BPM的热门指标堪称不低。Agentflow企业流程管理平台可算目前国内BPM市场的翘楚,Agentflow不仅有助促成作业流程标准化和自动化,而且可以一并优化流程,促进协同作业综合效果,隐刺纵观多类应用环境,均不难见Agentflow穿梭其中的身影。<br />许多企业在部署BPM之前,或许已有诸如企业资源规划(ERP)、客户关系管理(CRM)、供应链管理(SCM)、产品生命周期管理(PLM)、先进规划与排成(APS)等多种电子化系统,Agentflow则

ppbxe的专栏 1472

agentflow 沙盒服务器

提供智能化的工具,而非被动的数据管道工具层面传统方案沙盒方案(需要模型)doc:read返回文档原文VLM 根据 goal 提取相关信息(含图片理解)web:visit返回完整网页 HTMLLLM 根据 goal 总结关键内容减轻 Agent 负担:Agent 收到的是高质量、相关性强的信息提高效率:避免 Agent 处理大量无关内容支持多模态:VLM 可以理解文档中的图片、表格上下文优化:只返回必要信息,节省 token所以沙盒不仅仅是"环境",更是一个智能中间层。

dingxingdi的博客 628
上一篇: ireport 学习笔记
下一篇: Agentflow 学习笔记
daillo
博客等级 码龄18年 42粉丝 34原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值