Refactor the code to make it comply with PEP-8 standards:Convert all class definitions to CamelCase style.

(issue 37)
This commit is contained in:
Liu Zhicong
2023-08-23 11:19:16 -07:00
parent 23963adc6e
commit 5454009e7b
21 changed files with 601 additions and 603 deletions
+46 -46
View File
@@ -1,74 +1,74 @@
<mxfile host="Electron" modified="2023-08-20T20:43:16.356Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.8 Chrome/114.0.5735.289 Electron/25.5.0 Safari/537.36" etag="kwtbDIrkPfCysRMj32zz" version="21.6.8" type="device"> <mxfile host="65bd71144e">
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1"> <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
<mxGraphModel dx="914" dy="806" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <mxGraphModel dx="711" dy="944" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root> <root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-0"/>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0"/>
<mxCell id="ia-fclrWNqMUroYMcw65-37" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-37" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="340" y="345" width="290" height="105" as="geometry" /> <mxGeometry x="340" y="345" width="290" height="105" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-36" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-36" value="" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="90" y="345" width="250" height="105" as="geometry" /> <mxGeometry x="90" y="345" width="250" height="105" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-1" value="local compute &lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-1" value="local compute &lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="90" y="380" width="120" height="50" as="geometry" /> <mxGeometry x="90" y="380" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ia-fclrWNqMUroYMcw65-2" target="ia-fclrWNqMUroYMcw65-28"> <mxCell id="ia-fclrWNqMUroYMcw65-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ia-fclrWNqMUroYMcw65-2" target="ia-fclrWNqMUroYMcw65-28" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-2" value="my device&lt;br&gt;&amp;nbsp;compute &lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-2" value="my device&lt;br&gt;&amp;nbsp;compute &lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="210" y="380" width="120" height="50" as="geometry" /> <mxGeometry x="210" y="380" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-3" value="service compute&lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-3" value="service compute&lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="370" y="380" width="120" height="50" as="geometry" /> <mxGeometry x="370" y="380" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-4" value="untruest compute&lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#fa6800;fontColor=#000000;strokeColor=#C73500;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-4" value="untruest compute&lt;br&gt;node" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#fa6800;fontColor=#000000;strokeColor=#C73500;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="490" y="380" width="130" height="50" as="geometry" /> <mxGeometry x="490" y="380" width="130" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-18" value="TaskParams:json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-18" value="TaskParams:json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="50" width="120" height="40" as="geometry" /> <mxGeometry x="280" y="50" width="120" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-19" value="padding input:buffers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-19" value="padding input:buffers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="130" width="120" height="70" as="geometry" /> <mxGeometry x="280" y="130" width="120" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-22" value="Refer:Name Data" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;fontColor=#ffffff;strokeColor=#3700CC;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-22" value="Refer:Name Data" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;fontColor=#ffffff;strokeColor=#3700CC;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="90" width="120" height="40" as="geometry" /> <mxGeometry x="280" y="90" width="120" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-23" value="aios_kernel&lt;br&gt;(scheduler)" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-23" value="aios_kernel&lt;br&gt;(scheduler)" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="250" width="120" height="50" as="geometry" /> <mxGeometry x="280" y="250" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-24" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ia-fclrWNqMUroYMcw65-19" target="ia-fclrWNqMUroYMcw65-23"> <mxCell id="ia-fclrWNqMUroYMcw65-24" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ia-fclrWNqMUroYMcw65-19" target="ia-fclrWNqMUroYMcw65-23" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="430" y="240" as="sourcePoint" /> <mxPoint x="430" y="240" as="sourcePoint"/>
<mxPoint x="480" y="190" as="targetPoint" /> <mxPoint x="480" y="190" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ia-fclrWNqMUroYMcw65-23" target="ia-fclrWNqMUroYMcw65-2"> <mxCell id="ia-fclrWNqMUroYMcw65-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="ia-fclrWNqMUroYMcw65-23" target="ia-fclrWNqMUroYMcw65-2" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="350" as="sourcePoint" /> <mxPoint x="420" y="350" as="sourcePoint"/>
<mxPoint x="470" y="300" as="targetPoint" /> <mxPoint x="470" y="300" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-26" value="Owne Nodes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-26" value="Owne Nodes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="90" y="345" width="100" height="30" as="geometry" /> <mxGeometry x="90" y="345" width="100" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-27" value="Rental Nodes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-27" value="Rental Nodes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="505" y="345" width="100" height="30" as="geometry" /> <mxGeometry x="505" y="345" width="100" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-28" value="ResultParams:json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-28" value="ResultParams:json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="516" width="120" height="40" as="geometry" /> <mxGeometry x="280" y="516" width="120" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-29" value="padding result:buffers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-29" value="padding result:buffers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="596" width="120" height="70" as="geometry" /> <mxGeometry x="280" y="596" width="120" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-30" value="Refer:Name Data" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;fontColor=#ffffff;strokeColor=#3700CC;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-30" value="Refer:Name Data" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;fontColor=#ffffff;strokeColor=#3700CC;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="280" y="556" width="120" height="40" as="geometry" /> <mxGeometry x="280" y="556" width="120" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-34" value="有一些任务是可以分割的,这个既可以上层处理分割、合并。也可以由aios_kernel处理" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-34" value="&lt;br&gt;&lt;span style=&quot;color: rgb(209, 213, 219); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px;&quot;&gt;Some tasks can be divided, and this can be handled either at the higher layer for splitting and merging, or by the aios_kernel.&lt;/span&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;labelBackgroundColor=default;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="450" y="80" width="170" height="70" as="geometry" /> <mxGeometry x="450" y="80" width="170" height="150" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ia-fclrWNqMUroYMcw65-35" value="调度器的核心是结合已知compute_node的状态,与Refer数据的距离,计算的成本,运行的速度等多种要素,选择一个compute_node完成计算任务。也可包含一定的迭代重试逻辑" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ia-fclrWNqMUroYMcw65-35" value="&lt;span style=&quot;color: rgb(209, 213, 219); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px;&quot;&gt;The core of the scheduler is to select a compute_node to complete the computing task based on a variety of factors, such as the known status of the compute_node, the distance to the Refer data, the cost of computation, and the speed of operation. It can also include some iterative retry logic.&lt;/span&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;labelBackgroundColor=default;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="450" y="240" width="170" height="70" as="geometry" /> <mxGeometry x="450" y="470" width="200" height="250" as="geometry"/>
</mxCell> </mxCell>
</root> </root>
</mxGraphModel> </mxGraphModel>
+216 -216
View File
@@ -1,365 +1,365 @@
<mxfile host="Electron" modified="2023-08-21T08:17:59.615Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.8 Chrome/114.0.5735.289 Electron/25.5.0 Safari/537.36" etag="B6guG2NTWSku4GvC0ygf" version="21.6.8" type="device" pages="3"> <mxfile host="65bd71144e" pages="3">
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1"> <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
<mxGraphModel dx="981" dy="563" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <mxGraphModel dx="951" dy="944" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root> <root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-0"/>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0"/>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-3" value="(chat) message" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxCell id="WIyWlLk6GJQsqaUBKTNV-3" value="(chat) message" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="159" y="330" width="90" height="40" as="geometry" /> <mxGeometry x="159" y="330" width="90" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-0" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-3" target="RbYReh6FQah4Kl5oFyjJ-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-0" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-3" target="RbYReh6FQah4Kl5oFyjJ-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="279" y="390" as="sourcePoint" /> <mxPoint x="279" y="390" as="sourcePoint"/>
<mxPoint x="309" y="350" as="targetPoint" /> <mxPoint x="309" y="350" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-8" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-1" target="RbYReh6FQah4Kl5oFyjJ-2"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-8" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-1" target="RbYReh6FQah4Kl5oFyjJ-2" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-14" value="message" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-1" target="RbYReh6FQah4Kl5oFyjJ-13"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-14" value="message" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-1" target="RbYReh6FQah4Kl5oFyjJ-13" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-1" value="Workflow" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-1" value="Workflow" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6d8764;fontColor=#ffffff;strokeColor=#3A5431;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="304" y="320" width="120" height="60" as="geometry" /> <mxGeometry x="304" y="320" width="120" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-2" value="Functions" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-2" value="Functions" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="514" y="320" width="130" height="60" as="geometry" /> <mxGeometry x="514" y="320" width="130" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-6" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-3" target="RbYReh6FQah4Kl5oFyjJ-4"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-6" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-3" target="RbYReh6FQah4Kl5oFyjJ-4" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-3" value="(phicyal / virtual)&lt;br&gt;environment" style="shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-3" value="(phicyal / virtual)&lt;br&gt;environment" style="shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="304" y="120" width="120" height="80" as="geometry" /> <mxGeometry x="304" y="120" width="120" height="80" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-7" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-4" target="RbYReh6FQah4Kl5oFyjJ-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-7" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-4" target="RbYReh6FQah4Kl5oFyjJ-1" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-4" value="(event) message" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-4" value="(event) message" style="rounded=1;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="304" y="240" width="120" height="40" as="geometry" /> <mxGeometry x="304" y="240" width="120" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=120;entryDy=50;entryPerimeter=0;dashed=1;dashPattern=8 8;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-2" target="RbYReh6FQah4Kl5oFyjJ-3"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=120;entryDy=50;entryPerimeter=0;dashed=1;dashPattern=8 8;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-2" target="RbYReh6FQah4Kl5oFyjJ-3" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="564" y="290" as="sourcePoint" /> <mxPoint x="564" y="290" as="sourcePoint"/>
<mxPoint x="614" y="240" as="targetPoint" /> <mxPoint x="614" y="240" as="targetPoint"/>
<Array as="points"> <Array as="points">
<mxPoint x="579" y="170" /> <mxPoint x="579" y="170"/>
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-2" target="RbYReh6FQah4Kl5oFyjJ-11"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-2" target="RbYReh6FQah4Kl5oFyjJ-11" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="684" y="320" as="sourcePoint" /> <mxPoint x="684" y="320" as="sourcePoint"/>
<mxPoint x="714" y="350" as="targetPoint" /> <mxPoint x="714" y="350" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-11" value="Exist Service" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-11" value="Exist Service" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="689" y="300" width="130" height="90" as="geometry" /> <mxGeometry x="689" y="300" width="130" height="90" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-13" value="sub / other workflow" style="whiteSpace=wrap;html=1;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-13" value="sub / other workflow" style="whiteSpace=wrap;html=1;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="304" y="480" width="120" height="50" as="geometry" /> <mxGeometry x="304" y="480" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-15" value="response message" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-1" target="RbYReh6FQah4Kl5oFyjJ-17"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-15" value="response message" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-1" target="RbYReh6FQah4Kl5oFyjJ-17" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="129" y="480" as="sourcePoint" /> <mxPoint x="129" y="480" as="sourcePoint"/>
<mxPoint x="99" y="420" as="targetPoint" /> <mxPoint x="99" y="420" as="targetPoint"/>
<Array as="points"> <Array as="points">
<mxPoint x="334" y="420" /> <mxPoint x="334" y="420"/>
<mxPoint x="49" y="420" /> <mxPoint x="49" y="420"/>
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-17" target="WIyWlLk6GJQsqaUBKTNV-3"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-17" target="WIyWlLk6GJQsqaUBKTNV-3" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-17" value="Personal" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-17" value="Personal" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="9" y="310" width="80" height="80" as="geometry" /> <mxGeometry x="9" y="310" width="80" height="80" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-19" value="" style="shape=xor;whiteSpace=wrap;html=1;rotation=-90;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-19" value="" style="shape=xor;whiteSpace=wrap;html=1;rotation=-90;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="309" y="67" width="20" height="20" as="geometry" /> <mxGeometry x="309" y="67" width="20" height="20" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-21" value="" style="shape=xor;whiteSpace=wrap;html=1;rotation=-90;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-21" value="" style="shape=xor;whiteSpace=wrap;html=1;rotation=-90;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="347" y="67" width="20" height="20" as="geometry" /> <mxGeometry x="347" y="67" width="20" height="20" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-22" value="" style="shape=xor;whiteSpace=wrap;html=1;rotation=-90;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-22" value="" style="shape=xor;whiteSpace=wrap;html=1;rotation=-90;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="386" y="67" width="20" height="20" as="geometry" /> <mxGeometry x="386" y="67" width="20" height="20" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-23" value="IoT Devices" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-23" value="IoT Devices" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="240" y="67" width="60" height="30" as="geometry" /> <mxGeometry x="240" y="67" width="60" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.122;entryY=0.008;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-19" target="RbYReh6FQah4Kl5oFyjJ-3"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.122;entryY=0.008;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-19" target="RbYReh6FQah4Kl5oFyjJ-3" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="240" y="170" as="sourcePoint" /> <mxPoint x="240" y="170" as="sourcePoint"/>
<mxPoint x="290" y="120" as="targetPoint" /> <mxPoint x="290" y="120" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-26" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0;entryDx=50;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-21"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-26" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0;entryDx=50;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-21" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="443" y="120" as="sourcePoint" /> <mxPoint x="443" y="120" as="sourcePoint"/>
<mxPoint x="357" y="120.00000000000011" as="targetPoint" /> <mxPoint x="357" y="120.00000000000011" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RbYReh6FQah4Kl5oFyjJ-27" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.766;entryY=0.02;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-22" target="RbYReh6FQah4Kl5oFyjJ-3"> <mxCell id="RbYReh6FQah4Kl5oFyjJ-27" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.766;entryY=0.02;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="RbYReh6FQah4Kl5oFyjJ-22" target="RbYReh6FQah4Kl5oFyjJ-3" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="430" y="140" as="sourcePoint" /> <mxPoint x="430" y="140" as="sourcePoint"/>
<mxPoint x="480" y="90" as="targetPoint" /> <mxPoint x="480" y="90" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="HvRWRVSjofeyYJQyU3aa-0" value="Sub workflow is not visiable for others&lt;br&gt;&lt;br&gt;Sub worflow can share roles&amp;nbsp;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="HvRWRVSjofeyYJQyU3aa-0" value="Sub workflow is not visiable for others&lt;br&gt;&lt;br&gt;Sub worflow can share roles&amp;nbsp;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="160" y="480" width="140" height="70" as="geometry" /> <mxGeometry x="160" y="480" width="140" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="HvRWRVSjofeyYJQyU3aa-1" value="Chat with AI Agent is like chat with a workflow which have only one agent and no rules" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="HvRWRVSjofeyYJQyU3aa-1" value="Chat with AI Agent is like chat with a workflow which have only one agent and no rules" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="70" y="150" width="150" height="80" as="geometry" /> <mxGeometry x="70" y="150" width="150" height="80" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ed6Jjq-fMpksm2tlv9Oi-0" value="inner&amp;nbsp;&lt;br&gt;environment" style="shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;size=10;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ed6Jjq-fMpksm2tlv9Oi-0" value="inner&amp;nbsp;&lt;br&gt;environment" style="shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;size=10;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="386" y="360" width="84" height="40" as="geometry" /> <mxGeometry x="386" y="360" width="84" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ed6Jjq-fMpksm2tlv9Oi-1" value="Environment could shared with workflows" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ed6Jjq-fMpksm2tlv9Oi-1" value="Environment could shared with workflows" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="440" y="120" width="120" height="30" as="geometry" /> <mxGeometry x="440" y="120" width="120" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="ed6Jjq-fMpksm2tlv9Oi-2" value="Inner environment&amp;nbsp; could be used as Context(FileSystem)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="ed6Jjq-fMpksm2tlv9Oi-2" value="Inner environment&amp;nbsp; could be used as Context(FileSystem)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="413" y="410" width="110" height="30" as="geometry" /> <mxGeometry x="413" y="410" width="110" height="30" as="geometry"/>
</mxCell> </mxCell>
</root> </root>
</mxGraphModel> </mxGraphModel>
</diagram> </diagram>
<diagram id="kWxfmPxtNxOAf0a73TCG" name="Page-2"> <diagram id="kWxfmPxtNxOAf0a73TCG" name="Page-2">
<mxGraphModel dx="1421" dy="816" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="951" dy="944" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0"/>
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0"/>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-1" value="&lt;h1&gt;Workflow rules&lt;/h1&gt;&lt;p&gt;workflow rules(prompt)&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-1" value="&lt;h1&gt;Workflow rules&lt;/h1&gt;&lt;p&gt;workflow rules(prompt)&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
<mxGeometry x="70" y="800" width="190" height="120" as="geometry" /> <mxGeometry x="70" y="800" width="190" height="120" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-2" value="&lt;h1&gt;Workflow roles&lt;/h1&gt;&lt;p&gt;AI Agent groups&lt;/p&gt;&lt;p&gt;Project Manager : Alex&lt;/p&gt;&lt;p&gt;Programer : Bobl&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-2" value="&lt;h1&gt;Workflow roles&lt;/h1&gt;&lt;p&gt;AI Agent groups&lt;/p&gt;&lt;p&gt;Project Manager : Alex&lt;/p&gt;&lt;p&gt;Programer : Bobl&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
<mxGeometry x="320" y="790" width="190" height="120" as="geometry" /> <mxGeometry x="320" y="790" width="190" height="120" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-3" target="VGzDL9xesOOnN_l_G2Ij-4"> <mxCell id="41KxsEdFswCCPQnavNoU-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-3" target="VGzDL9xesOOnN_l_G2Ij-4" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-3" target="VGzDL9xesOOnN_l_G2Ij-7"> <mxCell id="41KxsEdFswCCPQnavNoU-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-3" target="VGzDL9xesOOnN_l_G2Ij-7" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-3" value="Message" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-3" value="Message" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="340" y="170" width="100" height="40" as="geometry" /> <mxGeometry x="340" y="170" width="100" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-4" value="inner filter&amp;nbsp;" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-4" value="inner filter&amp;nbsp;" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" parent="1" vertex="1">
<mxGeometry x="150" y="260" width="120" height="50" as="geometry" /> <mxGeometry x="150" y="260" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-5" value="roleA" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-5" value="roleA" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="80" y="350" width="110" height="60" as="geometry" /> <mxGeometry x="80" y="350" width="110" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-6" target="VGzDL9xesOOnN_l_G2Ij-8"> <mxCell id="41KxsEdFswCCPQnavNoU-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-6" target="VGzDL9xesOOnN_l_G2Ij-8" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-6" value="roleB" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-6" value="roleB" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="240" y="350" width="110" height="60" as="geometry" /> <mxGeometry x="240" y="350" width="110" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-7"> <mxCell id="41KxsEdFswCCPQnavNoU-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-7" edge="1">
<mxGeometry relative="1" as="geometry"> <mxGeometry relative="1" as="geometry">
<mxPoint x="570.0344827586209" y="350" as="targetPoint" /> <mxPoint x="570.0344827586209" y="350" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-7" value="Workflow rules" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-7" value="Workflow rules" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="520" y="260" width="100" height="50" as="geometry" /> <mxGeometry x="520" y="260" width="100" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-8" value="Final Result of Message" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-8" value="Final Result of Message" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="340" y="590" width="100" height="50" as="geometry" /> <mxGeometry x="340" y="590" width="100" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-9" target="VGzDL9xesOOnN_l_G2Ij-8"> <mxCell id="41KxsEdFswCCPQnavNoU-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-9" target="VGzDL9xesOOnN_l_G2Ij-8" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-9" value="Result Merge" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-9" value="Result Merge" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="521" y="530" width="100" height="40" as="geometry" /> <mxGeometry x="521" y="530" width="100" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-10" target="VGzDL9xesOOnN_l_G2Ij-9"> <mxCell id="41KxsEdFswCCPQnavNoU-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-10" target="VGzDL9xesOOnN_l_G2Ij-9" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-10" value="roleC" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-10" value="roleC" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="435" y="350" width="110" height="60" as="geometry" /> <mxGeometry x="435" y="350" width="110" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-11" target="41KxsEdFswCCPQnavNoU-7"> <mxCell id="41KxsEdFswCCPQnavNoU-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-11" target="41KxsEdFswCCPQnavNoU-7" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-11" value="roleD" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-11" value="roleD" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="595" y="350" width="110" height="60" as="geometry" /> <mxGeometry x="595" y="350" width="110" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-12" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-4" target="VGzDL9xesOOnN_l_G2Ij-5"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-12" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-4" target="VGzDL9xesOOnN_l_G2Ij-5" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="160" y="510" as="sourcePoint" /> <mxPoint x="160" y="510" as="sourcePoint"/>
<mxPoint x="210" y="460" as="targetPoint" /> <mxPoint x="210" y="460" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="VGzDL9xesOOnN_l_G2Ij-13" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="VGzDL9xesOOnN_l_G2Ij-4" target="VGzDL9xesOOnN_l_G2Ij-6"> <mxCell id="VGzDL9xesOOnN_l_G2Ij-13" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="VGzDL9xesOOnN_l_G2Ij-4" target="VGzDL9xesOOnN_l_G2Ij-6" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="210" y="510" as="sourcePoint" /> <mxPoint x="210" y="510" as="sourcePoint"/>
<mxPoint x="260" y="460" as="targetPoint" /> <mxPoint x="260" y="460" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-1" value="" style="shape=cross;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="41KxsEdFswCCPQnavNoU-1" value="" style="shape=cross;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="556" y="364" width="30" height="30" as="geometry" /> <mxGeometry x="556" y="364" width="30" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="41KxsEdFswCCPQnavNoU-7" target="VGzDL9xesOOnN_l_G2Ij-9"> <mxCell id="41KxsEdFswCCPQnavNoU-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="41KxsEdFswCCPQnavNoU-7" target="VGzDL9xesOOnN_l_G2Ij-9" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="41KxsEdFswCCPQnavNoU-7" value="call function or&amp;nbsp;&lt;br&gt;send message" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;" vertex="1" parent="1"> <mxCell id="41KxsEdFswCCPQnavNoU-7" value="call function or&amp;nbsp;&lt;br&gt;send message" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;" parent="1" vertex="1">
<mxGeometry x="592.5" y="460" width="115" height="30" as="geometry" /> <mxGeometry x="592.5" y="460" width="115" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="q_eHDVuD3DBh6_VEKgap-2" value="message process by filter,select one role do LLM and get RESULT of input" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxCell id="q_eHDVuD3DBh6_VEKgap-2" value="message process by filter,select one role do LLM and get RESULT of input" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="90" y="190" width="165" height="30" as="geometry" /> <mxGeometry x="90" y="190" width="165" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="q_eHDVuD3DBh6_VEKgap-3" value="message process by rules,select mutil role do LLM and merge RESULT of input" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxCell id="q_eHDVuD3DBh6_VEKgap-3" value="message process by rules,select mutil role do LLM and merge RESULT of input" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="510" y="180" width="165" height="30" as="geometry" /> <mxGeometry x="510" y="180" width="165" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="q_eHDVuD3DBh6_VEKgap-5" value="如果一个工作流有3个role参与,每个人都需要调用函数并分析结果,那么要进行至少6次推理" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxCell id="q_eHDVuD3DBh6_VEKgap-5" value="如果一个工作流有3个role参与,每个人都需要调用函数并分析结果,那么要进行至少6次推理" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="483" y="640" width="174" height="40" as="geometry" /> <mxGeometry x="483" y="640" width="174" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="q_eHDVuD3DBh6_VEKgap-6" value="这里是基于规则的合并,给另一个Role合并是多输入Agent流程" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxCell id="q_eHDVuD3DBh6_VEKgap-6" value="这里是基于规则的合并,给另一个Role合并是多输入Agent流程" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="635" y="570" width="160" height="30" as="geometry" /> <mxGeometry x="635" y="570" width="160" height="30" as="geometry"/>
</mxCell> </mxCell>
</root> </root>
</mxGraphModel> </mxGraphModel>
</diagram> </diagram>
<diagram id="7NYJTgo0U9cdVshLy85U" name="Page-3"> <diagram id="7NYJTgo0U9cdVshLy85U" name="Page-3">
<mxGraphModel dx="1177" dy="676" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <mxGraphModel dx="951" dy="944" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0"/>
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0"/>
<mxCell id="zJVYyOSlNiCVBlA5jEf0-2" value="Agent Sessions&lt;br&gt;Data" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" vertex="1" parent="1"> <mxCell id="zJVYyOSlNiCVBlA5jEf0-2" value="Agent Sessions&lt;br&gt;Data" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" parent="1" vertex="1">
<mxGeometry x="110" y="533" width="80" height="70" as="geometry" /> <mxGeometry x="110" y="533" width="80" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-2" value="Small LLM, Train With Personal Data" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-2" value="Small LLM, Train With Personal Data" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" parent="1" vertex="1">
<mxGeometry x="270" y="258" width="140" height="50" as="geometry" /> <mxGeometry x="270" y="258" width="140" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="awKuOLItvF_EOGf5wS2x-4" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="awKuOLItvF_EOGf5wS2x-4" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="20" y="78" width="160" height="360" as="geometry" /> <mxGeometry x="20" y="78" width="160" height="360" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-13" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="8StUH8aFnwlRlHm0zShF-1" target="SPnvrlBiOLhgEaWxmdK3-4"> <mxCell id="S5MjekdSblNa5itYb4Ee-13" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="8StUH8aFnwlRlHm0zShF-1" target="SPnvrlBiOLhgEaWxmdK3-4" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-1" value="LLM&lt;br&gt;(Common Sence)" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-1" value="LLM&lt;br&gt;(Common Sence)" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" parent="1" vertex="1">
<mxGeometry x="250" y="218" width="140" height="50" as="geometry" /> <mxGeometry x="250" y="218" width="140" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-3" value="ControlNet&lt;br&gt;base on Agent Memory" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-3" value="ControlNet&lt;br&gt;base on Agent Memory" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" parent="1" vertex="1">
<mxGeometry x="250" y="108" width="140" height="50" as="geometry" /> <mxGeometry x="250" y="108" width="140" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-4" value="Agent人格助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-4" value="Agent人格助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" parent="1" vertex="1">
<mxGeometry x="40" y="108" width="120" height="50" as="geometry" /> <mxGeometry x="40" y="108" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-5" value="Role助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-5" value="Role助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" parent="1" vertex="1">
<mxGeometry x="40" y="168" width="120" height="50" as="geometry" /> <mxGeometry x="40" y="168" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-6" value="Workflow Rules助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-6" value="Workflow Rules助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" parent="1" vertex="1">
<mxGeometry x="40" y="235.5" width="120" height="52.5" as="geometry" /> <mxGeometry x="40" y="235.5" width="120" height="52.5" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="8StUH8aFnwlRlHm0zShF-7" value="访问Knowlege构造助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" vertex="1" parent="1"> <mxCell id="8StUH8aFnwlRlHm0zShF-7" value="访问Knowlege构造助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" parent="1" vertex="1">
<mxGeometry x="40" y="378" width="120" height="50" as="geometry" /> <mxGeometry x="40" y="378" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="Tz-ThZOieDqqDBRXvXnh-1" value="Invoke the function and wait for the necessary response." style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fontSize=11;" vertex="1" parent="1"> <mxCell id="Tz-ThZOieDqqDBRXvXnh-1" value="Invoke the function and wait for the necessary response." style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fontSize=11;" parent="1" vertex="1">
<mxGeometry x="600" y="33" width="110" height="70" as="geometry" /> <mxGeometry x="600" y="33" width="110" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="awKuOLItvF_EOGf5wS2x-2" value="Send Message and wait for the necessary response." style="rounded=1;whiteSpace=wrap;html=1;fontSize=11;glass=0;strokeWidth=1;shadow=0;" vertex="1" parent="1"> <mxCell id="awKuOLItvF_EOGf5wS2x-2" value="Send Message and wait for the necessary response." style="rounded=1;whiteSpace=wrap;html=1;fontSize=11;glass=0;strokeWidth=1;shadow=0;" parent="1" vertex="1">
<mxGeometry x="610" y="153" width="90" height="70" as="geometry" /> <mxGeometry x="610" y="153" width="90" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="awKuOLItvF_EOGf5wS2x-5" value="Input Prompts" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxCell id="awKuOLItvF_EOGf5wS2x-5" value="Input Prompts" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="60" y="78" width="80" height="30" as="geometry" /> <mxGeometry x="60" y="78" width="80" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="awKuOLItvF_EOGf5wS2x-7" value="Responce Prompts" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="awKuOLItvF_EOGf5wS2x-7" value="Responce Prompts" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="740" y="103" width="80" height="40" as="geometry" /> <mxGeometry x="740" y="103" width="80" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="awKuOLItvF_EOGf5wS2x-8" target="awKuOLItvF_EOGf5wS2x-9"> <mxCell id="S5MjekdSblNa5itYb4Ee-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="awKuOLItvF_EOGf5wS2x-8" target="awKuOLItvF_EOGf5wS2x-9" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="awKuOLItvF_EOGf5wS2x-8" value="LLM Competion" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1"> <mxCell id="awKuOLItvF_EOGf5wS2x-8" value="LLM Competion" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" parent="1" vertex="1">
<mxGeometry x="720" y="226.75" width="120" height="40" as="geometry" /> <mxGeometry x="720" y="226.75" width="120" height="40" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-9" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="awKuOLItvF_EOGf5wS2x-9" target="SPnvrlBiOLhgEaWxmdK3-1"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-9" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="awKuOLItvF_EOGf5wS2x-9" target="SPnvrlBiOLhgEaWxmdK3-1" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="awKuOLItvF_EOGf5wS2x-9" value="Final Result&lt;br&gt;Of Message&lt;br&gt;(can be None)" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="awKuOLItvF_EOGf5wS2x-9" value="Final Result&lt;br&gt;Of Message&lt;br&gt;(can be None)" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="450" y="363" width="120" height="80" as="geometry" /> <mxGeometry x="450" y="363" width="120" height="80" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-1" value="Storage Result in agent session and workflow session" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-1" value="Storage Result in agent session and workflow session" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="450" y="483" width="120" height="60" as="geometry" /> <mxGeometry x="450" y="483" width="120" height="60" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-2" value="可用Function助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" vertex="1" parent="1"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-2" value="可用Function助记词" style="shape=document;whiteSpace=wrap;html=1;boundedLbl=1;size=0.25;" parent="1" vertex="1">
<mxGeometry x="40" y="308" width="120" height="50" as="geometry" /> <mxGeometry x="40" y="308" width="120" height="50" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-7" value="Yes" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="SPnvrlBiOLhgEaWxmdK3-4" target="SPnvrlBiOLhgEaWxmdK3-6"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-7" value="Yes" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="SPnvrlBiOLhgEaWxmdK3-4" target="SPnvrlBiOLhgEaWxmdK3-6" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-8" value="No" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="SPnvrlBiOLhgEaWxmdK3-4" target="awKuOLItvF_EOGf5wS2x-9"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-8" value="No" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="SPnvrlBiOLhgEaWxmdK3-4" target="awKuOLItvF_EOGf5wS2x-9" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-4" value="推理结果&lt;br&gt;需要进一步处理?" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-4" value="推理结果&lt;br&gt;需要进一步处理?" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="440" y="203" width="140" height="80" as="geometry" /> <mxGeometry x="440" y="203" width="140" height="80" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="SPnvrlBiOLhgEaWxmdK3-6" value="Call Funstion or send message?" style="rhombus;whiteSpace=wrap;html=1;fontSize=11;" vertex="1" parent="1"> <mxCell id="SPnvrlBiOLhgEaWxmdK3-6" value="Call Funstion or send message?" style="rhombus;whiteSpace=wrap;html=1;fontSize=11;" parent="1" vertex="1">
<mxGeometry x="440" y="78" width="140" height="80" as="geometry" /> <mxGeometry x="440" y="78" width="140" height="80" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-3" value="Call" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="SPnvrlBiOLhgEaWxmdK3-6" target="Tz-ThZOieDqqDBRXvXnh-1"> <mxCell id="S5MjekdSblNa5itYb4Ee-3" value="Call" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="SPnvrlBiOLhgEaWxmdK3-6" target="Tz-ThZOieDqqDBRXvXnh-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="410" y="113" as="sourcePoint" /> <mxPoint x="410" y="113" as="sourcePoint"/>
<mxPoint x="460" y="63" as="targetPoint" /> <mxPoint x="460" y="63" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-4" value="Send" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="SPnvrlBiOLhgEaWxmdK3-6" target="awKuOLItvF_EOGf5wS2x-2"> <mxCell id="S5MjekdSblNa5itYb4Ee-4" value="Send" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="SPnvrlBiOLhgEaWxmdK3-6" target="awKuOLItvF_EOGf5wS2x-2" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="560" y="193" as="sourcePoint" /> <mxPoint x="560" y="193" as="sourcePoint"/>
<mxPoint x="610" y="143" as="targetPoint" /> <mxPoint x="610" y="143" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-5" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="awKuOLItvF_EOGf5wS2x-2" target="awKuOLItvF_EOGf5wS2x-7"> <mxCell id="S5MjekdSblNa5itYb4Ee-5" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="awKuOLItvF_EOGf5wS2x-2" target="awKuOLItvF_EOGf5wS2x-7" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="720" y="213" as="sourcePoint" /> <mxPoint x="720" y="213" as="sourcePoint"/>
<mxPoint x="770" y="163" as="targetPoint" /> <mxPoint x="770" y="163" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-6" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Tz-ThZOieDqqDBRXvXnh-1" target="awKuOLItvF_EOGf5wS2x-7"> <mxCell id="S5MjekdSblNa5itYb4Ee-6" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Tz-ThZOieDqqDBRXvXnh-1" target="awKuOLItvF_EOGf5wS2x-7" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="750" y="93" as="sourcePoint" /> <mxPoint x="750" y="93" as="sourcePoint"/>
<mxPoint x="800" y="43" as="targetPoint" /> <mxPoint x="800" y="43" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-7" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="awKuOLItvF_EOGf5wS2x-7" target="awKuOLItvF_EOGf5wS2x-8"> <mxCell id="S5MjekdSblNa5itYb4Ee-7" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="awKuOLItvF_EOGf5wS2x-7" target="awKuOLItvF_EOGf5wS2x-8" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="750" y="213" as="sourcePoint" /> <mxPoint x="750" y="213" as="sourcePoint"/>
<mxPoint x="800" y="163" as="targetPoint" /> <mxPoint x="800" y="163" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-10" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1"> <mxCell id="S5MjekdSblNa5itYb4Ee-10" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="330" y="218" as="sourcePoint" /> <mxPoint x="330" y="218" as="sourcePoint"/>
<mxPoint x="330" y="158" as="targetPoint" /> <mxPoint x="330" y="158" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-12" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#6d8764;strokeColor=#3A5431;" edge="1" parent="1"> <mxCell id="S5MjekdSblNa5itYb4Ee-12" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#6d8764;strokeColor=#3A5431;" parent="1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="200" y="251.75" as="sourcePoint" /> <mxPoint x="200" y="251.75" as="sourcePoint"/>
<mxPoint x="240" y="252" as="targetPoint" /> <mxPoint x="240" y="252" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-15" value="Real Time Enviroment Knowlege" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" vertex="1" parent="1"> <mxCell id="S5MjekdSblNa5itYb4Ee-15" value="Real Time Enviroment Knowlege" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" parent="1" vertex="1">
<mxGeometry x="10" y="533" width="80" height="70" as="geometry" /> <mxGeometry x="10" y="533" width="80" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="zJVYyOSlNiCVBlA5jEf0-1" value="Workflow Context Data" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" vertex="1" parent="1"> <mxCell id="zJVYyOSlNiCVBlA5jEf0-1" value="Workflow Context Data" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" parent="1" vertex="1">
<mxGeometry x="110" y="473" width="80" height="70" as="geometry" /> <mxGeometry x="110" y="473" width="80" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="S5MjekdSblNa5itYb4Ee-14" value="OOD&#39;s KnowlegeBase" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" vertex="1" parent="1"> <mxCell id="S5MjekdSblNa5itYb4Ee-14" value="OOD's KnowlegeBase" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=11;" parent="1" vertex="1">
<mxGeometry x="10" y="473" width="80" height="70" as="geometry" /> <mxGeometry x="10" y="473" width="80" height="70" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="zJVYyOSlNiCVBlA5jEf0-3" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#647687;strokeColor=#314354;" edge="1" parent="1" target="8StUH8aFnwlRlHm0zShF-7"> <mxCell id="zJVYyOSlNiCVBlA5jEf0-3" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#647687;strokeColor=#314354;" parent="1" target="8StUH8aFnwlRlHm0zShF-7" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="100" y="463" as="sourcePoint" /> <mxPoint x="100" y="463" as="sourcePoint"/>
<mxPoint x="130" y="433" as="targetPoint" /> <mxPoint x="130" y="433" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="iPE2hx-tEKFiySbPAp22-1" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;可用Function受到人格和Workflow的共同影响&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxCell id="iPE2hx-tEKFiySbPAp22-1" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;可用Function受到人格和Workflow的共同影响&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="190" y="318" width="130" height="30" as="geometry" /> <mxGeometry x="190" y="318" width="130" height="30" as="geometry"/>
</mxCell> </mxCell>
<mxCell id="iPE2hx-tEKFiySbPAp22-2" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="SPnvrlBiOLhgEaWxmdK3-2" target="iPE2hx-tEKFiySbPAp22-1"> <mxCell id="iPE2hx-tEKFiySbPAp22-2" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="SPnvrlBiOLhgEaWxmdK3-2" target="iPE2hx-tEKFiySbPAp22-1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="230" y="433" as="sourcePoint" /> <mxPoint x="230" y="433" as="sourcePoint"/>
<mxPoint x="280" y="383" as="targetPoint" /> <mxPoint x="280" y="383" as="targetPoint"/>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
</root> </root>
+7 -7
View File
@@ -1,7 +1,7 @@
from .environment import environment,environment_event from .environment import Environment,EnvironmentEvent
from .agent import agent_msg,ai_agent,ai_agent_templete from .agent import AgentMsg,AIAgent,AIAgentTemplete
from .compute_kernel import compute_kernel,compute_task from .compute_kernel import ComputeKernel,ComputeTask
from .compute_node import compute_node,local_compute_node from .compute_node import ComputeNode,LocalComputeNode
from .open_ai_node import open_ai_compute_node from .open_ai_node import OpenAI_ComputeNode
from .role import ai_role,ai_role_group from .role import AIRole,AIRoleGroup
from .workflow import ai_workflow from .workflow import Workflow
+9 -9
View File
@@ -4,7 +4,7 @@ import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class agent_msg: class AgentMsg:
def __init__(self) -> None: def __init__(self) -> None:
self.sender = None self.sender = None
self.target = None self.target = None
@@ -23,7 +23,7 @@ class agent_msg:
def parser_target(self,target:str) -> None: def parser_target(self,target:str) -> None:
pass pass
class agent_prompt: class AgentPrompt:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
@@ -35,18 +35,18 @@ class agent_prompt:
# chat session store the chat history between owner and agent # chat session store the chat history between owner and agent
# chat session might be large, so can read / write at stream mode. # chat session might be large, so can read / write at stream mode.
class ai_chat_session: class AIChatSession:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
def get_owner_id(self) -> str: def get_owner_id(self) -> str:
pass pass
def append_post(self,msg:agent_msg) -> None: def append_post(self,msg:AgentMsg) -> None:
"""append msg to session, msg is post from session (owner => msg.target)""" """append msg to session, msg is post from session (owner => msg.target)"""
pass pass
def append_recv(self,msg:agent_msg) -> None: def append_recv(self,msg:AgentMsg) -> None:
"""append msg to session, msg is recv from msg'sender (msg.sender => owner)""" """append msg to session, msg is recv from msg'sender (msg.sender => owner)"""
pass pass
@@ -56,11 +56,11 @@ class ai_chat_session:
#TODO : add iterator interface for read chat history #TODO : add iterator interface for read chat history
class ai_agent_templete: class AIAgentTemplete:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
class ai_agent: class AIAgent:
def __init__(self) -> None: def __init__(self) -> None:
self.chat_sessions = None self.chat_sessions = None
self.llm_model_name = None self.llm_model_name = None
@@ -74,10 +74,10 @@ class ai_agent:
def get_template_id(self) -> str: def get_template_id(self) -> str:
return self.template_id return self.template_id
def get_chat_session_for_msg(self,msg:agent_msg) -> ai_chat_session: def get_chat_session_for_msg(self,msg:AgentMsg) -> AIChatSession:
pass pass
def get_chat_session(self,sender:str,session_id:str) -> ai_chat_session: def get_chat_session(self,sender:str,session_id:str) -> AIChatSession:
pass pass
def get_llm_model_name(self) -> str: def get_llm_model_name(self) -> str:
+2 -2
View File
@@ -1,4 +1,4 @@
class ai_function: class AIFunction:
def __init__(self) -> None: def __init__(self) -> None:
self.intro : str = None self.intro : str = None
@@ -21,7 +21,7 @@ class ai_function:
pass pass
# call chain is a combination of ai_function,group of ai_function. # call chain is a combination of ai_function,group of ai_function.
class call_chain: class CallChain:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
+3 -3
View File
@@ -1,14 +1,14 @@
# aiso shell like bash of linux # aiso shell like bash of linux
from .workflow import ai_workflow from .workflow import Workflow
class aios_shell: class AIOS_Shell:
def __init__(self,username:str) -> None: def __init__(self,username:str) -> None:
pass pass
async def send_msg(self,msg:str,target_workflow:str) -> str: async def send_msg(self,msg:str,target_workflow:str) -> str:
pass pass
async def install_workflow(self,workflow_id:ai_workflow) -> None: async def install_workflow(self,workflow_id:Workflow) -> None:
pass pass
+12 -12
View File
@@ -3,25 +3,25 @@ from typing import Optional
import logging import logging
import asyncio import asyncio
from .agent import agent_prompt from .agent import AgentPrompt
from .compute_node import compute_node from .compute_node import ComputeNode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# How to dispatch different computing tasks (some tasks may contain a large amount of state for correct execution) # How to dispatch different computing tasks (some tasks may contain a large amount of state for correct execution)
# to suitable computing nodes, achieving a balance of speed, cost, and power consumption, # to suitable computing nodes, achieving a balance of speed, cost, and power consumption,
# is the CORE GOAL of the entire computing task schedule system (aios_kernel). # is the CORE GOAL of the entire computing task schedule system (aios_kernel).
class compute_task(ABC): class ComputeTask(ABC):
@abstractmethod @abstractmethod
def display(self) -> str: def display(self) -> str:
pass pass
class compute_kernel: class ComputeKernel:
_instance = None _instance = None
def __new__(cls): def __new__(cls):
if cls._instance is None: if cls._instance is None:
cls._instance = super(compute_kernel, cls).__new__(cls) cls._instance = super(ComputeKernel, cls).__new__(cls)
return cls._instance return cls._instance
def __init__(self) -> None: def __init__(self) -> None:
@@ -29,7 +29,7 @@ class compute_kernel:
self.is_start = False self.is_start = False
pass pass
def run(self,task:compute_task) -> None: def run(self,task:ComputeTask) -> None:
# check there is compute node can support this task # check there is compute node can support this task
if self.is_task_support(task) is False: if self.is_task_support(task) is False:
logger.error(f"task {task.display()} is not support by any compute node") logger.error(f"task {task.display()} is not support by any compute node")
@@ -47,31 +47,31 @@ class compute_kernel:
async def _run_task_loop(): async def _run_task_loop():
while True: while True:
task = self.task_queue.pop(0) task = self.task_queue.pop(0)
c_node:compute_node= await self._schedule(task) c_node:ComputeNode= await self._schedule(task)
c_node.push_task(task) c_node.push_task(task)
asyncio.create_task(_run_task_loop()) asyncio.create_task(_run_task_loop())
async def _schedule(self,task) -> compute_node: async def _schedule(self,task) -> ComputeNode:
pass pass
def add_compute_node(self,node:compute_node): def add_compute_node(self,node:ComputeNode):
pass pass
def disable_compute_node(self,): def disable_compute_node(self,):
pass pass
def is_task_support(self,task:compute_task) -> bool: def is_task_support(self,task:ComputeTask) -> bool:
pass pass
# friendly interface for use: # friendly interface for use:
def llm_completion(self,prompt:agent_prompt,mode_name:Optional[str] = None,max_token:int = 0) -> compute_task: def llm_completion(self,prompt:AgentPrompt,mode_name:Optional[str] = None,max_token:int = 0) -> ComputeTask:
# craete a llm_work_task ,push on queue's end # craete a llm_work_task ,push on queue's end
# then task_schedule would run this task.(might schedule some work_task to another host) # then task_schedule would run this task.(might schedule some work_task to another host)
pass pass
async def do_llm_completion(self,prompt:agent_prompt,mode_name:Optional[str] = None,max_token:int = 0) -> str: async def do_llm_completion(self,prompt:AgentPrompt,mode_name:Optional[str] = None,max_token:int = 0) -> str:
pass pass
+4 -4
View File
@@ -1,9 +1,9 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from .compute_kernel import compute_task from .compute_kernel import ComputeTask
class compute_node(ABC): class ComputeNode(ABC):
@abstractmethod @abstractmethod
async def push_task(self,task:compute_task,proiority:int = 0): async def push_task(self,task:ComputeTask,proiority:int = 0):
pass pass
async def remove_task(self,task_id:str): async def remove_task(self,task_id:str):
@@ -38,7 +38,7 @@ class compute_node(ABC):
class local_compute_node(compute_node): class LocalComputeNode(ComputeNode):
def display(self) -> str: def display(self) -> str:
return super().display() return super().display()
+3 -3
View File
@@ -4,14 +4,14 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from typing import Callable from typing import Callable
from .agent import agent_msg from .agent import AgentMsg
class environment_event(ABC): class EnvironmentEvent(ABC):
@abstractmethod @abstractmethod
def display(self) -> str: def display(self) -> str:
pass pass
class environment: class Environment:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
+2 -2
View File
@@ -1,6 +1,6 @@
from .compute_node import compute_node from .compute_node import ComputeNode
class open_ai_compute_node(compute_node): class OpenAI_ComputeNode(ComputeNode):
def display(self) -> str: def display(self) -> str:
return super().display() return super().display()
+4 -4
View File
@@ -1,10 +1,10 @@
from .agent import ai_agent from .agent import AIAgent
class ai_role: class AIRole:
def __init__(self) -> None: def __init__(self) -> None:
self.agent_instance_id : str = None self.agent_instance_id : str = None
self.role_name : str = None self.role_name : str = None
self.agent : ai_agent = None self.agent : AIAgent = None
self.introduce : str = None self.introduce : str = None
def load_from_config(self,config:dict) -> bool: def load_from_config(self,config:dict) -> bool:
@@ -16,7 +16,7 @@ class ai_role:
def get_name(self) -> str: def get_name(self) -> str:
return self.role_name return self.role_name
class ai_role_group: class AIRoleGroup:
def __init__(self) -> None: def __init__(self) -> None:
self.roles : dict[str,str]= None self.roles : dict[str,str]= None
pass pass
+43 -43
View File
@@ -3,26 +3,26 @@ import logging
import asyncio import asyncio
from typing import Optional,Tuple from typing import Optional,Tuple
from .environment import environment,environment_event from .environment import Environment,EnvironmentEvent
from .agent import agent_prompt,agent_msg,ai_chat_session from .agent import AgentPrompt,AgentMsg,AIChatSession
from .role import ai_role from .role import AIRole
from .ai_function import call_chain from .ai_function import CallChain
from .compute_kernel import compute_kernel from .compute_kernel import ComputeKernel
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class ai_message_filter: class MessageFilter:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
def select(self,msg:agent_msg) -> ai_role: def select(self,msg:AgentMsg) -> AIRole:
pass pass
class ai_workflow: class Workflow:
def __init__(self) -> None: def __init__(self) -> None:
self.rule_prompt : agent_prompt = None self.rule_prompt : AgentPrompt = None
self.workflow_config = None self.workflow_config = None
self.role_group = None self.role_group = None
self.input_filter : ai_message_filter= None self.input_filter : MessageFilter= None
self.msg_queue = [] self.msg_queue = []
self.connected_environment = {} self.connected_environment = {}
@@ -33,70 +33,70 @@ class ai_workflow:
# When processing one message, it can process another message at the same time. # When processing one message, it can process another message at the same time.
# chatsession is synchronous, it has to wait for the previous message to finish processing before it can process the next message. # chatsession is synchronous, it has to wait for the previous message to finish processing before it can process the next message.
# Therefore, post a message needs to specify the session_id explicitly, if not specified it will be automatically created by workflow. # Therefore, post a message needs to specify the session_id explicitly, if not specified it will be automatically created by workflow.
def post_msg(self,msg:agent_msg) -> None: def post_msg(self,msg:AgentMsg) -> None:
self.msg_queue.append(msg) self.msg_queue.append(msg)
return return
async def send_msg(self,msg:agent_msg) -> str: async def send_msg(self,msg:AgentMsg) -> str:
pass pass
async def run(self): async def run(self):
# TODO add tracking design of msg processing # TODO add tracking design of msg processing
while True: while True:
the_msg = await self._pop_msg() the_msg = await self._pop_msg()
chatsession:ai_chat_session = self._get_chat_session_for_msg(the_msg) chatsession:AIChatSession = self._get_chat_session_for_msg(the_msg)
if chatsession is None: if chatsession is None:
logger.error(f"get_chat_session_for_msg return None for :{the_msg}") logger.error(f"get_chat_session_for_msg return None for :{the_msg}")
continue continue
chatsession.append_recv(the_msg) chatsession.append_recv(the_msg)
async def _process_msg(msg:agent_msg,the_role) -> None: async def _process_msg(msg:AgentMsg,the_role) -> None:
# prompt generat progress is most important part of workflow(app) develope # prompt generat progress is most important part of workflow(app) develope
prompt = agent_prompt() prompt = AgentPrompt()
prompt.append(the_role.get_prompt()) prompt.append(the_role.get_prompt())
prompt.append(self.get_workflow_rule_prompt()) prompt.append(self.get_workflow_rule_prompt())
prompt.append(self._get_function_prompt(the_role.get_name())) prompt.append(self._get_function_prompt(the_role.get_name()))
prompt.append(self._get_knowlege_prompt(the_role.get_name())) prompt.append(self._get_knowlege_prompt(the_role.get_name()))
prompt.append(await self._get_prompt_from_session(chatsession,the_role.get_name())) # chat context prompt.append(await self._get_prompt_from_session(chatsession,the_role.get_name())) # chat context
result = await compute_kernel().do_llm_completion(prompt,the_role.agent.get_llm_model_name(),the_role.agent.get_max_token_size()) result = await ComputeKernel().do_llm_completion(prompt,the_role.agent.get_llm_model_name(),the_role.agent.get_max_token_size())
final_result = result final_result = result
result_type : str = self._get_llm_result_type(result) result_type : str = self._get_llm_result_type(result)
is_ignore = False is_ignore = False
match result_type: match result_type:
case "function": case "function":
callchain:call_chain = self._parse_function_call_chain(result) callchain:CallChain = self._parse_function_call_chain(result)
resp = await callchain.exec() resp = await callchain.exec()
if callchain.have_result(): if callchain.have_result():
# generator proc resp prompt with WAITING state # generator proc resp prompt with WAITING state
proc_resp_prompt:agent_prompt = self._get_resp_prompt(resp,msg,the_role,prompt,chatsession) proc_resp_prompt:AgentPrompt = self._get_resp_prompt(resp,msg,the_role,prompt,chatsession)
final_result = await compute_kernel().do_llm_completion(proc_resp_prompt,the_role.agent.get_llm_model_name(),the_role.agent.get_max_token_size()) final_result = await ComputeKernel().do_llm_completion(proc_resp_prompt,the_role.agent.get_llm_model_name(),the_role.agent.get_max_token_size())
return final_result return final_result
case "send_message": case "send_message":
# send message to other / sub workflow # send message to other / sub workflow
next_msg:agent_msg = self._parse_to_msg(result) next_msg:AgentMsg = self._parse_to_msg(result)
if next_msg is not None: if next_msg is not None:
# TODO: Next Target can be another role in workflow # TODO: Next Target can be another role in workflow
next_workflow:ai_workflow = self.get_workflow(next_msg.get_target()) next_workflow:Workflow = self.get_workflow(next_msg.get_target())
inner_chat_session = the_role.agent.get_chat_session(next_msg.get_target(),next_msg.get_session_id()) inner_chat_session = the_role.agent.get_chat_session(next_msg.get_target(),next_msg.get_session_id())
inner_chat_session.append_post(next_msg) inner_chat_session.append_post(next_msg)
resp = await next_workflow.send_msg(next_msg) resp = await next_workflow.send_msg(next_msg)
inner_chat_session.append_recv(resp) inner_chat_session.append_recv(resp)
# generator proc resp prompt with WAITING state # generator proc resp prompt with WAITING state
proc_resp_prompt:agent_prompt = self._get_resp_prompt(resp,msg,the_role,prompt,chatsession) proc_resp_prompt:AgentPrompt = self._get_resp_prompt(resp,msg,the_role,prompt,chatsession)
final_result = await compute_kernel().do_llm_completion(proc_resp_prompt,the_role.agent.get_llm_model_name(),the_role.agent.get_max_token_size()) final_result = await ComputeKernel().do_llm_completion(proc_resp_prompt,the_role.agent.get_llm_model_name(),the_role.agent.get_max_token_size())
return final_result return final_result
case "post_message": case "post_message":
# post message to other / sub workflow # post message to other / sub workflow
next_msg:agent_msg = self._parse_to_msg(result) next_msg:AgentMsg = self._parse_to_msg(result)
if next_msg is not None: if next_msg is not None:
next_workflow:ai_workflow = self.get_workflow(next_msg.get_target()) next_workflow:Workflow = self.get_workflow(next_msg.get_target())
inner_chat_session = the_role.agent.get_chat_session(next_msg.get_target(),next_msg.get_session_id()) inner_chat_session = the_role.agent.get_chat_session(next_msg.get_target(),next_msg.get_session_id())
inner_chat_session.append_post(next_msg) inner_chat_session.append_post(next_msg)
next_workflow.post_msg(next_msg) next_workflow.post_msg(next_msg)
@@ -113,7 +113,7 @@ class ai_workflow:
return result return result
async def _workflow_process_msg(msg:agent_msg) -> None: async def _workflow_process_msg(msg:AgentMsg) -> None:
final_result = None final_result = None
if self.input_filter is not None: if self.input_filter is not None:
select_role = self.input_filter.select(msg) select_role = self.input_filter.select(msg)
@@ -134,7 +134,7 @@ class ai_workflow:
# merge result from all roles # merge result from all roles
# TODO: one input msg can have multiple result msg, at this while ,we only support one result msg # TODO: one input msg can have multiple result msg, at this while ,we only support one result msg
final_result:agent_msg = self._merge_msg_result(results) final_result:AgentMsg = self._merge_msg_result(results)
if chatsession is not None: if chatsession is not None:
chatsession.append_post(final_result) chatsession.append_post(final_result)
@@ -144,59 +144,59 @@ class ai_workflow:
asyncio.create_task(_workflow_process_msg(the_msg)) asyncio.create_task(_workflow_process_msg(the_msg))
async def _pop_msg(self) -> agent_msg: async def _pop_msg(self) -> AgentMsg:
pass pass
def _get_chat_session_for_msg(self,msg:agent_msg) -> ai_chat_session: def _get_chat_session_for_msg(self,msg:AgentMsg) -> AIChatSession:
pass pass
async def _get_prompt_from_session(self,chatsession:ai_chat_session,role_name:str) -> agent_prompt: async def _get_prompt_from_session(self,chatsession:AIChatSession,role_name:str) -> AgentPrompt:
pass pass
def _get_msg_queue(self,session_id:str): def _get_msg_queue(self,session_id:str):
pass pass
def _merge_msg_result(self,results:dict) -> agent_msg: def _merge_msg_result(self,results:dict) -> AgentMsg:
pass pass
def _get_function_prompt(self,role_name:str) -> agent_prompt: def _get_function_prompt(self,role_name:str) -> AgentPrompt:
pass pass
def _get_knowlege_prompt(self,role_name:str) -> agent_prompt: def _get_knowlege_prompt(self,role_name:str) -> AgentPrompt:
pass pass
def _get_resp_prompt(self,resp:str,msg:agent_msg,role:ai_role,prompt:agent_prompt,chatsession:ai_chat_session) -> agent_prompt: def _get_resp_prompt(self,resp:str,msg:AgentMsg,role:AIRole,prompt:AgentPrompt,chatsession:AIChatSession) -> AgentPrompt:
pass pass
def get_workflow_rule_prompt(self) -> agent_prompt: def get_workflow_rule_prompt(self) -> AgentPrompt:
return self.rule_prompt return self.rule_prompt
def _get_llm_result_type(self,llm_resp_str:str) -> str: def _get_llm_result_type(self,llm_resp_str:str) -> str:
pass pass
def _parse_function_call_chain(self,llm_resp_str) -> call_chain: def _parse_function_call_chain(self,llm_resp_str) -> CallChain:
pass pass
def _parse_to_msg(self,llm_resp_str) -> agent_msg: def _parse_to_msg(self,llm_resp_str) -> AgentMsg:
pass pass
def get_workflow(self,workflow_name:str) -> ai_workflow: def get_workflow(self,workflow_name:str) -> Workflow:
"""get workflow from known workflow list or sub workflow list""" """get workflow from known workflow list or sub workflow list"""
pass pass
def _env_event_to_msg(self,env_event:environment_event) -> agent_msg: def _env_event_to_msg(self,env_event:EnvironmentEvent) -> AgentMsg:
pass pass
def get_inner_environment(self,env_id:str) -> environment: def get_inner_environment(self,env_id:str) -> Environment:
pass pass
def connect_to_environment(self,env:environment) -> None: def connect_to_environment(self,env:Environment) -> None:
the_env = self.connected_environment.get(env.get_id()) the_env = self.connected_environment.get(env.get_id())
if the_env is None: if the_env is None:
self.connected_environment[env.get_id()] = env self.connected_environment[env.get_id()] = env
def _env_msg_handler(env_event:environment_event) -> None: def _env_msg_handler(env_event:EnvironmentEvent) -> None:
the_msg:agent_msg= self._env_event_to_msg(env_event) the_msg:AgentMsg= self._env_event_to_msg(env_event)
self.post_msg(the_msg) self.post_msg(the_msg)
# register all event handler # register all event handler
+1 -1
View File
@@ -1,3 +1,3 @@
from .agent_manager import agent_manager,agent_manager_client from .agent_manager import AgentManager,AgentManagerClient
from .agent import ai_agent from .agent import ai_agent
from .templete import ai_agent_templete from .templete import ai_agent_templete
+13 -18
View File
@@ -2,14 +2,13 @@
import logging import logging
import toml import toml
from .agent import ai_agent from aios_kernel import AIAgent,AIAgentTemplete
from .templete import ai_agent_templete from package_manager import PackageEnv,PackageEnvManager,PackageMediaInfo,PackageInstallTask
from package_manager import pkg_env,pkg_env_mgr,pkg_media_info,media_reader,pkg_install_task
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class agent_manager: class AgentManager:
_instance = None _instance = None
def __init__(self) -> None: def __init__(self) -> None:
@@ -18,18 +17,18 @@ class agent_manager:
def __new__(cls): def __new__(cls):
if cls._instance is None: if cls._instance is None:
cls._instance = super(agent_manager, cls).__new__(cls) cls._instance = super(AgentManager, cls).__new__(cls)
return cls._instance return cls._instance
def initial(self,root_dir:str) -> None: def initial(self,root_dir:str) -> None:
self.agent_templete_env : pkg_env = pkg_env_mgr().get_env(f"{root_dir}templetes/agent_templetes.cfg") self.agent_templete_env : PackageEnv = PackageEnvManager().get_env(f"{root_dir}templetes/agent_templetes.cfg")
self.agent_env : pkg_env = pkg_env_mgr().get_env(f"{root_dir}agents/agents.cfg") self.agent_env : PackageEnv = PackageEnvManager().get_env(f"{root_dir}agents/agents.cfg")
if self.agent_templete_env is None: if self.agent_templete_env is None:
raise Exception("agent_manager initial failed") raise Exception("agent_manager initial failed")
def get(self,agent_id:str) -> ai_agent: def get(self,agent_id:str) -> AIAgent:
the_agent = self.loaded_agent_instance.get(agent_id) the_agent = self.loaded_agent_instance.get(agent_id)
if the_agent: if the_agent:
return the_agent return the_agent
@@ -39,7 +38,7 @@ class agent_manager:
if agent_media_info is None: if agent_media_info is None:
return None return None
the_agent = self._load_agent_from_media(agent_media_info) the_agent : AIAgent = self._load_agent_from_media(agent_media_info)
if the_agent is None: if the_agent is None:
logger.warn(f"load agent {agent_id} from media failed!") logger.warn(f"load agent {agent_id} from media failed!")
@@ -49,29 +48,25 @@ class agent_manager:
def remove(self,agent_id:str)->int: def remove(self,agent_id:str)->int:
pass pass
def get_templete(self,templete_id) -> ai_agent_templete: def get_templete(self,templete_id) -> AIAgentTemplete:
template_media_info = self.agent_templete_env.get(templete_id) template_media_info = self.agent_templete_env.get(templete_id)
if template_media_info is None: if template_media_info is None:
return None return None
return self._load_templete_from_media(template_media_info) return self._load_templete_from_media(template_media_info)
def install(self,templete_id) -> pkg_install_task: def install(self,templete_id) -> PackageInstallTask:
installer = self.agent_templete_env.get_installer() installer = self.agent_templete_env.get_installer()
return installer.install(templete_id) return installer.install(templete_id)
def uninstall(self,templete_id) -> int: def uninstall(self,templete_id) -> int:
pass pass
def _load_templete_from_media(self,templete_media:pkg_media_info) -> ai_agent_templete: def _load_templete_from_media(self,templete_media:PackageMediaInfo) -> AIAgentTemplete:
pass pass
def _load_agent_from_media(self,agent_media:pkg_media_info) -> ai_agent: def _load_agent_from_media(self,agent_media:PackageMediaInfo) -> AIAgent:
pass pass
def create(self,template,agent_name,agent_last_name,agent_introduce) -> ai_agent: def create(self,template,agent_name,agent_last_name,agent_introduce) -> AIAgent:
pass pass
class agent_manager_client:
def __init__(self) -> None:
pass
+2 -1
View File
@@ -1 +1,2 @@
from .cid import content_id from .cid import ContentId
from .ndn_client import NDN_Client
+2 -1
View File
@@ -1,8 +1,9 @@
class content_id: class ContentId:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
@staticmethod
def create_from_str(cid_str:str): def create_from_str(cid_str:str):
pass pass
+4 -4
View File
@@ -1,13 +1,13 @@
from .cid import content_id from .cid import ContentId
class ndn_get_task: class NDN_GetTask:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
class ndn_client: class NDN_Client:
def __init__(self): def __init__(self):
pass pass
def get_file(cid:content_id,target_path:str,urls:{}=None,options:{}=None): def get_file(self,cid:ContentId,target_path:str,urls:{}=None,options:{}=None):
pass pass
+3 -3
View File
@@ -1,3 +1,3 @@
from .env import pkg_env_mgr,pkg_env from .env import PackageEnvManager,PackageEnv
from .pkg import pkg_info,pkg_media_info from .pkg import PackageInfo,PackageMediaInfo
from .installer import pkg_install_task from .installer import PackageInstallTask
+22 -22
View File
@@ -2,16 +2,16 @@
import logging import logging
import toml import toml
from .pkg import pkg_info,pkg_media_info from .pkg import PackageInfo,PackageMediaInfo
from .installer import pkg_installer from .installer import PackageInstaller
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class pkg_env_mgr: class PackageEnvManager:
_instance = None _instance = None
def __new__(cls): def __new__(cls):
if cls._instance is None: if cls._instance is None:
cls._instance = super(pkg_env_mgr, cls).__new__(cls) cls._instance = super(PackageEnvManager, cls).__new__(cls)
return cls._instance return cls._instance
def __init__(self) -> None: def __init__(self) -> None:
@@ -19,46 +19,46 @@ class pkg_env_mgr:
pass pass
def get_env(self,cfg_path:str) -> pkg_env: def get_env(self,cfg_path:str) -> PackageEnv:
if cfg_path in self._pkg_envs: if cfg_path in self._pkg_envs:
return self._pkg_envs[cfg_path] return self._pkg_envs[cfg_path]
else: else:
pkg_env = pkg_env(cfg_path) pkg_env = PackageEnv(cfg_path)
self._pkg_envs[cfg_path] = pkg_env self._pkg_envs[cfg_path] = pkg_env
return pkg_env return pkg_env
def get_user_env(self) -> pkg_env: def get_user_env(self) -> PackageEnv:
pass pass
def get_system_env(self) -> pkg_env: def get_system_env(self) -> PackageEnv:
pass pass
class pkg_env: class PackageEnv:
def __init__(self,cfg_path:str) -> None: def __init__(self,cfg_path:str) -> None:
self.pkg_dir : str = "" self.pkg_dir : str = ""
self.pkg_obj_dir : str = "" self.pkg_obj_dir : str = ""
self.is_strict : bool = True self.is_strict : bool = True
self.parent_envs : list[pkg_env] = None self.parent_envs : list[PackageEnv] = None
self.index_dbs = None self.index_dbs = None
self.cfg_path = cfg_path self.cfg_path = cfg_path
self._load_pkg_cfg(cfg_path) self._load_pkg_cfg(cfg_path)
pass pass
def load(self,pkg_name:str,search_parent=True) -> pkg_media_info: def load(self,pkg_name:str,search_parent=True) -> PackageMediaInfo:
pkg_path = None pkg_path = None
pkg_id,verion_str,cid = pkg_info.parse_pkg_name(pkg_name) pkg_id,verion_str,cid = PackageInfo.parse_pkg_name(pkg_name)
if cid is None: if cid is None:
if verion_str is None: if verion_str is None:
channel = self.get_pkg_channel_from_version(verion_str) channel:str = self.get_pkg_channel_from_version(verion_str)
if channel is None: if channel is None:
pkg_path = f"{self.pkg_dir}{pkg_id}" pkg_path = f"{self.pkg_dir}{pkg_id}"
else: else:
pkg_path = f"{self.pkg_dir}{pkg_id}#{channel}" pkg_path = f"{self.pkg_dir}{pkg_id}#{channel}"
else: else:
channel = self.get_pkg_channel_from_version(verion_str) channel:str = self.get_pkg_channel_from_version(verion_str)
the_version = self.get_exact_version_from_installed(verion_str) the_version:str = self.get_exact_version_from_installed(verion_str)
if the_version is None: if the_version is None:
logger.warn(f"load {pkg_name} failed: no match version from {verion_str}") logger.warn(f"load {pkg_name} failed: no match version from {verion_str}")
return None return None
@@ -69,7 +69,7 @@ class pkg_env:
else: else:
pkg_path = f"{self.pkg_obj_dir}.{pkg_id}/{cid}" pkg_path = f"{self.pkg_obj_dir}.{pkg_id}/{cid}"
media_info = self.try_load_pkg_media_info(pkg_id,pkg_path) media_info:PackageMediaInfo = self.try_load_pkg_media_info(pkg_path)
if media_info is None: if media_info is None:
if search_parent: if search_parent:
for parent_env in self.parent_envs: for parent_env in self.parent_envs:
@@ -86,28 +86,28 @@ class pkg_env:
def get_pkg_channel_from_version(self,pkg_version:str) -> str: def get_pkg_channel_from_version(self,pkg_version:str) -> str:
pass pass
def get_pkg_media_info(self,pkg_name:str)->pkg_media_info: def get_pkg_media_info(self,pkg_name:str)->PackageMediaInfo:
pass pass
def try_load_pkg_media_info(self,pkg_full_path:str) -> pkg_media_info: def try_load_pkg_media_info(self,pkg_full_path:str) -> PackageMediaInfo:
pass pass
def get_installed_pkg_info(self,pkg_name:str) -> pkg_info: def get_installed_pkg_info(self,pkg_name:str) -> PackageInfo:
pass pass
def lookup(self,pkg_id:str,version_str:str) -> pkg_info: def lookup(self,pkg_id:str,version_str:str) -> PackageInfo:
# to make sure pkg.cid is correct, we MUST verfiy eveything here # to make sure pkg.cid is correct, we MUST verfiy eveything here
pass pass
def get_installer(self) -> pkg_installer: def get_installer(self) -> PackageInstaller:
pass pass
@classmethod @classmethod
def is_valied_media(pkg_full_path:str) -> bool: def is_valied_media(pkg_full_path:str) -> bool:
pass pass
def do_pkg_media_trans(self,pkg_info:pkg_info,source_path:str,target_path:str) -> bool: def do_pkg_media_trans(self,pkg_info:PackageInfo,source_path:str,target_path:str) -> bool:
pass pass
def _load_pkg_cfg(self,cfg_path:str): def _load_pkg_cfg(self,cfg_path:str):
+16 -17
View File
@@ -5,10 +5,9 @@ import aiohttp
import aiofiles import aiofiles
import os import os
from ndn_client import content_id,ndn_client from ndn_client import ContentId,NDN_Client
from .pkg import pkg_info,pkg_media_info from .pkg import PackageInfo,PackageMediaInfo
from .env import pkg_env from .env import PackageEnv
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -19,8 +18,8 @@ INSTALL_TASK_STATE_DOWNLOADING = 3
INSTALL_TASK_STATE_INSTALLING = 4 INSTALL_TASK_STATE_INSTALLING = 4
INSTALL_TAKS_STATE_ERROR = 5 INSTALL_TAKS_STATE_ERROR = 5
class pkg_install_task: class PackageInstallTask:
def __init__(self,owner:pkg_env) -> None: def __init__(self,owner:PackageEnv) -> None:
self.owner = owner self.owner = owner
self.state = INSTALL_TASK_STATE_CHECK_DEPENDENCY self.state = INSTALL_TASK_STATE_CHECK_DEPENDENCY
@@ -29,20 +28,20 @@ class pkg_install_task:
self.dependency_tasks = None self.dependency_tasks = None
self.error_str = None self.error_str = None
class pkg_installer: class PackageInstaller:
def __init__(self,owner_env:pkg_env) -> None: def __init__(self,owner_env:PackageEnv) -> None:
self.all_tasks = {} self.all_tasks = {}
self.owner_env = owner_env self.owner_env = owner_env
def install(self,pkg_name:str, def install(self,pkg_name:str,
install_from_dependency = False, can_upgrade = True,skip_depends = False,options = None)->Tuple[pkg_install_task,str]: install_from_dependency = False, can_upgrade = True,skip_depends = False,options = None)->Tuple[PackageInstallTask,str]:
the_pkg_info : pkg_info = None the_pkg_info : PackageInfo = None
is_upgrade : bool = False is_upgrade : bool = False
need_backup : bool = False need_backup : bool = False
pkg_id,version_str,cid = pkg_info.parse_pkg_name(pkg_name) pkg_id,version_str,cid = PackageInfo.parse_pkg_name(pkg_name)
media_info : pkg_media_info = self.owner_env.get_media_info(pkg_name) # must use index-db? media_info : PackageMediaInfo = self.owner_env.get_media_info(pkg_name) # must use index-db?
if media_info is not None: if media_info is not None:
if cid is not None: if cid is not None:
if can_upgrade: if can_upgrade:
@@ -74,7 +73,7 @@ class pkg_installer:
return result_task,"already installing" return result_task,"already installing"
logger.info(f"start download&install {pkg_name},install_from_dependency={install_from_dependency},upgrade={is_upgrade},backup={need_backup},target_pkg_info={the_pkg_info}") logger.info(f"start download&install {pkg_name},install_from_dependency={install_from_dependency},upgrade={is_upgrade},backup={need_backup},target_pkg_info={the_pkg_info}")
result_task = pkg_install_task() result_task = PackageInstallTask(self.owner_env)
self.all_tasks[the_pkg_info.cid] = result_task self.all_tasks[the_pkg_info.cid] = result_task
async def download_and_install_pkg()->int: async def download_and_install_pkg()->int:
# check dependency # check dependency
@@ -104,7 +103,7 @@ class pkg_installer:
urls = self.owner_env.get_pkg_urls(the_pkg_info) urls = self.owner_env.get_pkg_urls(the_pkg_info)
#download #download
client = ndn_client() # set watch client = NDN_Client() # set watch
download_result = await client.get_file(the_pkg_info.cid,urls,target_full_path,options) download_result = await client.get_file(the_pkg_info.cid,urls,target_full_path,options)
if download_result !=0: if download_result !=0:
result_task.state = INSTALL_TAKS_STATE_ERROR result_task.state = INSTALL_TAKS_STATE_ERROR
@@ -140,16 +139,16 @@ class pkg_installer:
def uninstall(self): def uninstall(self):
pass pass
def get_dependency_tasks(self,pkg:pkg_info,dependency_tasks): def get_dependency_tasks(self,pkg:PackageInfo,dependency_tasks):
pass pass
async def check_dependency(self,pkg:pkg_info,task_list:{}) -> bool: async def check_dependency(self,pkg:PackageInfo,task_list:{}) -> bool:
for depend_pkg_name in pkg.depends: for depend_pkg_name in pkg.depends:
depend_task = task_list.get(depend_pkg_name) depend_task = task_list.get(depend_pkg_name)
if depend_task is not None: if depend_task is not None:
logger.debug(f"{pkg.name}'s depend pkg {depend_pkg_name} already in task list") logger.debug(f"{pkg.name}'s depend pkg {depend_pkg_name} already in task list")
continue continue
depend_task = pkg_install_task() depend_task = PackageInstallTask(self.owner_env)
task_list[depend_pkg_name] = depend_task task_list[depend_pkg_name] = depend_task
depend_pkg_info = self.owner_env.lookup(depend_pkg_name) depend_pkg_info = self.owner_env.lookup(depend_pkg_name)
+4 -2
View File
@@ -1,5 +1,7 @@
from typing import Tuple
class pkg_info:
class PackageInfo:
def __init__(self) -> None: def __init__(self) -> None:
self.name = "" self.name = ""
self.cid = None self.cid = None
@@ -20,7 +22,7 @@ class pkg_info:
def cid(self) -> str: def cid(self) -> str:
return self.cid return self.cid
class pkg_media_info: class PackageMediaInfo:
def __init__(self) -> None: def __init__(self) -> None:
pass pass