From 281aec23e379c733a737b5cfd5107460de4d0361 Mon Sep 17 00:00:00 2001 From: zhaoying Date: Mon, 22 Dec 2025 10:46:19 +0800 Subject: [PATCH] feat(web): Add Workflow --- web/package.json | 8 +- web/src/api/application.ts | 17 +- web/src/assets/images/menu/apiKey.png | Bin 0 -> 1315 bytes web/src/assets/images/menu/apiKey_active.png | Bin 0 -> 1301 bytes .../{space_acitve.svg => space_active.svg} | 0 web/src/assets/images/menu/tool.png | Bin 0 -> 1783 bytes web/src/assets/images/menu/tool_active.png | Bin 0 -> 1775 bytes ...emory_acitve.svg => userMemory_active.svg} | 0 .../images/workflow/agent_arbitration.png | Bin 0 -> 835 bytes .../images/workflow/agent_collaboration.png | Bin 0 -> 1171 bytes .../images/workflow/agent_scheduling.png | Bin 0 -> 785 bytes web/src/assets/images/workflow/aggregator.png | Bin 0 -> 668 bytes web/src/assets/images/workflow/answer.png | Bin 0 -> 753 bytes web/src/assets/images/workflow/arrow.png | Bin 0 -> 775 bytes .../assets/images/workflow/classification.png | Bin 0 -> 849 bytes .../assets/images/workflow/code_execution.png | Bin 0 -> 684 bytes web/src/assets/images/workflow/condition.png | Bin 0 -> 343 bytes web/src/assets/images/workflow/empty.png | Bin 0 -> 76462 bytes web/src/assets/images/workflow/end.png | Bin 0 -> 792 bytes .../assets/images/workflow/http_request.png | Bin 0 -> 745 bytes web/src/assets/images/workflow/iteration.png | Bin 0 -> 612 bytes web/src/assets/images/workflow/llm.png | Bin 0 -> 591 bytes web/src/assets/images/workflow/loop.png | Bin 0 -> 815 bytes .../images/workflow/memory_enhancement.png | Bin 0 -> 810 bytes .../images/workflow/model_selection.png | Bin 0 -> 908 bytes .../assets/images/workflow/model_voting.png | Bin 0 -> 769 bytes .../assets/images/workflow/output_audit.png | Bin 0 -> 624 bytes web/src/assets/images/workflow/parallel.png | Bin 0 -> 979 bytes .../images/workflow/parameter_extraction.png | Bin 0 -> 699 bytes .../images/workflow/process_evolution.png | Bin 0 -> 516 bytes web/src/assets/images/workflow/rag.png | Bin 0 -> 741 bytes .../images/workflow/reasoning_control.png | Bin 0 -> 815 bytes .../images/workflow/robot-2-line@2x.png | Bin 0 -> 471 bytes .../images/workflow/self_optimization.png | Bin 0 -> 922 bytes .../images/workflow/self_reflection.png | Bin 0 -> 1562 bytes .../images/workflow/sensitive_detection.png | Bin 0 -> 803 bytes web/src/assets/images/workflow/start.png | Bin 0 -> 567 bytes .../assets/images/workflow/task_planning.png | Bin 0 -> 648 bytes .../images/workflow/template_rendering.png | Bin 0 -> 408 bytes web/src/assets/images/workflow/tools.png | Bin 0 -> 869 bytes web/src/components/Chat/ChatInput.tsx | 10 +- web/src/components/SiderMenu/index.tsx | 12 +- web/src/styles/index.css | 6 + web/src/views/ApplicationConfig/Cluster.tsx | 13 +- .../components/ConfigHeader.tsx | 48 +- web/src/views/ApplicationConfig/index.tsx | 19 +- web/src/views/ApplicationConfig/types.ts | 10 + .../Workflow/components/CanvasToolbar.tsx | 203 +++++ .../views/Workflow/components/Chat/Chat.tsx | 174 ++++ .../components/Chat/VariableConfigModal.tsx | 98 +++ .../views/Workflow/components/NodeLibrary.tsx | 48 ++ .../Workflow/components/Nodes/AddNode.tsx | 19 + .../components/Nodes/ConditionNode.tsx | 155 ++++ .../components/Nodes/GroupStartNode.tsx | 19 + .../components/Nodes/IterationNode.tsx | 98 +++ .../Workflow/components/Nodes/LoopNode.tsx | 98 +++ .../Workflow/components/Nodes/NormalNode.tsx | 31 + .../components/Properties/MessageEditor.tsx | 89 +++ .../Properties/VariableEditModal.tsx | 180 +++++ .../Workflow/components/Properties/index.tsx | 231 ++++++ web/src/views/Workflow/constant.ts | 339 ++++++++ .../views/Workflow/hooks/useWorkflowGraph.ts | 741 ++++++++++++++++++ web/src/views/Workflow/index.tsx | 110 +++ web/src/views/Workflow/types.ts | 95 +++ web/tsconfig.app.json | 3 +- 65 files changed, 2843 insertions(+), 31 deletions(-) create mode 100644 web/src/assets/images/menu/apiKey.png create mode 100644 web/src/assets/images/menu/apiKey_active.png rename web/src/assets/images/menu/{space_acitve.svg => space_active.svg} (100%) create mode 100644 web/src/assets/images/menu/tool.png create mode 100644 web/src/assets/images/menu/tool_active.png rename web/src/assets/images/menu/{userMemory_acitve.svg => userMemory_active.svg} (100%) create mode 100644 web/src/assets/images/workflow/agent_arbitration.png create mode 100644 web/src/assets/images/workflow/agent_collaboration.png create mode 100644 web/src/assets/images/workflow/agent_scheduling.png create mode 100644 web/src/assets/images/workflow/aggregator.png create mode 100644 web/src/assets/images/workflow/answer.png create mode 100644 web/src/assets/images/workflow/arrow.png create mode 100644 web/src/assets/images/workflow/classification.png create mode 100644 web/src/assets/images/workflow/code_execution.png create mode 100644 web/src/assets/images/workflow/condition.png create mode 100644 web/src/assets/images/workflow/empty.png create mode 100644 web/src/assets/images/workflow/end.png create mode 100644 web/src/assets/images/workflow/http_request.png create mode 100644 web/src/assets/images/workflow/iteration.png create mode 100644 web/src/assets/images/workflow/llm.png create mode 100644 web/src/assets/images/workflow/loop.png create mode 100644 web/src/assets/images/workflow/memory_enhancement.png create mode 100644 web/src/assets/images/workflow/model_selection.png create mode 100644 web/src/assets/images/workflow/model_voting.png create mode 100644 web/src/assets/images/workflow/output_audit.png create mode 100644 web/src/assets/images/workflow/parallel.png create mode 100644 web/src/assets/images/workflow/parameter_extraction.png create mode 100644 web/src/assets/images/workflow/process_evolution.png create mode 100644 web/src/assets/images/workflow/rag.png create mode 100644 web/src/assets/images/workflow/reasoning_control.png create mode 100644 web/src/assets/images/workflow/robot-2-line@2x.png create mode 100644 web/src/assets/images/workflow/self_optimization.png create mode 100644 web/src/assets/images/workflow/self_reflection.png create mode 100644 web/src/assets/images/workflow/sensitive_detection.png create mode 100644 web/src/assets/images/workflow/start.png create mode 100644 web/src/assets/images/workflow/task_planning.png create mode 100644 web/src/assets/images/workflow/template_rendering.png create mode 100644 web/src/assets/images/workflow/tools.png create mode 100644 web/src/views/Workflow/components/CanvasToolbar.tsx create mode 100644 web/src/views/Workflow/components/Chat/Chat.tsx create mode 100644 web/src/views/Workflow/components/Chat/VariableConfigModal.tsx create mode 100644 web/src/views/Workflow/components/NodeLibrary.tsx create mode 100644 web/src/views/Workflow/components/Nodes/AddNode.tsx create mode 100644 web/src/views/Workflow/components/Nodes/ConditionNode.tsx create mode 100644 web/src/views/Workflow/components/Nodes/GroupStartNode.tsx create mode 100644 web/src/views/Workflow/components/Nodes/IterationNode.tsx create mode 100644 web/src/views/Workflow/components/Nodes/LoopNode.tsx create mode 100644 web/src/views/Workflow/components/Nodes/NormalNode.tsx create mode 100644 web/src/views/Workflow/components/Properties/MessageEditor.tsx create mode 100644 web/src/views/Workflow/components/Properties/VariableEditModal.tsx create mode 100644 web/src/views/Workflow/components/Properties/index.tsx create mode 100644 web/src/views/Workflow/constant.ts create mode 100644 web/src/views/Workflow/hooks/useWorkflowGraph.ts create mode 100644 web/src/views/Workflow/index.tsx create mode 100644 web/src/views/Workflow/types.ts diff --git a/web/package.json b/web/package.json index d2c254ec..d6642ac8 100644 --- a/web/package.json +++ b/web/package.json @@ -10,10 +10,14 @@ "preview": "vite preview" }, "dependencies": { + "@antv/layout": "^1.2.14-beta.8", + "@antv/x6": "^3.0.1", + "@antv/x6-react-shape": "^3.0.1", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@lexical/react": "^0.39.0", "antd": "^5.27.4", "axios": "^1.12.2", "clsx": "^2.1.1", @@ -23,6 +27,8 @@ "echarts": "^5.6.0", "echarts-for-react": "^3.0.2", "i18next": "^25.6.0", + "js-yaml": "^4.1.1", + "lexical": "^0.39.0", "mermaid": "^11.12.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -31,7 +37,6 @@ "react-markdown": "^10.1.0", "react-router-dom": "^6.22.0", "react-syntax-highlighter": "^16.1.0", - "reactflow": "^11.11.4", "rehype-katex": "^7.0.1", "rehype-raw": "^7.0.0", "remark-breaks": "^4.0.0", @@ -46,6 +51,7 @@ "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.1.14", "@types/crypto-js": "^4.2.2", + "@types/js-yaml": "^4.0.9", "@types/node": "^24.6.0", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", diff --git a/web/src/api/application.ts b/web/src/api/application.ts index 72521d92..69d27d44 100644 --- a/web/src/api/application.ts +++ b/web/src/api/application.ts @@ -1,8 +1,9 @@ import { request } from '@/utils/request' -import type { Application } from '@/views/ApplicationManagement/types' +import type { ApplicationModalData } from '@/views/ApplicationManagement/types' import type { Config } from '@/views/ApplicationConfig/types' import { handleSSE, type SSEMessage } from '@/utils/stream' import type { QueryParams } from '@/views/Conversation/types' +import type { WorkflowConfig } from '@/views/Workflow/types' // 应用列表 export const getApplicationListUrl = '/apps' @@ -13,20 +14,24 @@ export const getApplicationList = (data: Record) => { export const getApplicationConfig = (id: string) => { return request.get(`/apps/${id}/config`) } -// 获取集群应配置 +// 获取集群应用配置 export const getMultiAgentConfig = (id: string) => { return request.get(`/apps/${id}/multi-agent`) } +// 获取 workflow应用配置 +export const getWorkflowConfig = (id: string) => { + return request.get(`/apps/${id}/workflow`) +} // 应用详情 export const getApplication = (id: string) => { return request.get(`/apps/${id}`) } // 更新应用 -export const updateApplication = (id: string, values: Application) => { +export const updateApplication = (id: string, values: ApplicationModalData) => { return request.put(`/apps/${id}`, values) } // 创建应用 -export const addApplication = (values: Application) => { +export const addApplication = (values: ApplicationModalData) => { return request.post('/apps', values) } // 保存Agent配置 @@ -37,6 +42,10 @@ export const saveAgentConfig = (app_id: string, values: Config) => { export const saveMultiAgentConfig = (app_id: string, values: Config) => { return request.put(`/apps/${app_id}/multi-agent`, values) } +// 保存workflow配置 +export const saveWorkflowConfig = (app_id: string, values: WorkflowConfig) => { + return request.put(`/apps/${app_id}/workflow`, values) +} // 模型比对试运行 export const runCompare = (app_id: string, values: Record, onMessage?: (data: SSEMessage[]) => void) => { return handleSSE(`/apps/${app_id}/draft/run/compare`, values, onMessage) diff --git a/web/src/assets/images/menu/apiKey.png b/web/src/assets/images/menu/apiKey.png new file mode 100644 index 0000000000000000000000000000000000000000..53d19428abeb09d284b710c8af9325253ed14c30 GIT binary patch literal 1315 zcmV+;1>E|HP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$@jY&j7R9Fe^S6^sbRTw|tNt$#x zK^+6vp&i1eGEsz~;82|C)0~15+0t5*)Fx?*Z~mQgMxDAMPGQg`l_oJwf+M&wbw%{S zfxd`}3O=Y~4Ag2=V;}Xx&H4WPzCY(X=Y02svH$u*|E2(u zczk_`h2xCLgd|2JS&=tsdS)j3bGQDwN+3F%x{U-&Bgp-DL#|*A@W)6}wp`4fa_Ks< z%O((u#V)ZZGz1_5)3uJL7Wi2qSr+qeF_LLiVHb1(NB=GOtgv{gT0L^EV{|AwCJ-G? z-^2tQGqxMJHEkzyUP?YKh`;exVe&`Q@z79uqX@DQDdoeEZ*+8ZCfQL=GCNb4`qad0 z+LJ&umb#A<+b0>j(E&*~`4D_=e$$3`PGvGpZR|HjB9TD&qDyy4Mx&VCUBK8e@be`q zcA#3!9W(7b2@J$jbpU$to<-n7Q_9@YH>b{+MuV}@TN#PRq-5KaoQQqSB!8t`Jo2%L zizY^|BH2n2<8jPlJ#>Fo3OT2mZKPiUm@H$~;zGDqt66Q>`QO1M&3QIM>Jv4kUOZBX^dOniSKF;sH288-iaX3t2NhUSHYD`6d^|$Ye6v<7)w-szkYvy9cC=-Q2(7UUwHXZ6jl2YaQOx*gOf~^Zu&>*IWE*)5&V+ z-g^1E+3GkFqO(rvg@QFbB<9IJzU6NbYbOEXSi0+8;BGLt+nr zz7GD*%=PzGv|Nvnd!K=L`f)T~)$31N%-UWn6n^od7=!Z`aZ1C2zwdv^vjWNdub)Ceak zmBYW8IFr6$0t%=a(xS!o64BFORdZTEBG1kD_f6{iVf*SOUWQI>IQ7h7CyrMOxf5-+ z^Y5|=Xwy9pjcnyS@H%F9rz88$PD+aHxPXpBrv4}3J}D1{sX39)=YQ9>7aCWbfOdit zg1sSM#o6AXWf<`lWTk+heWg-%&X6xlcAbFosFvjqi^i}?p91?8zJ^bf^EtKY{(riz Zz~B0&oN&^C@jw6o002ovPDHLkV1m}XV_5(I literal 0 HcmV?d00001 diff --git a/web/src/assets/images/menu/apiKey_active.png b/web/src/assets/images/menu/apiKey_active.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8d1cfa7f672ae7f61e1db5160214851b273372 GIT binary patch literal 1301 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 literal 0 HcmV?d00001 diff --git a/web/src/assets/images/menu/tool_active.png b/web/src/assets/images/menu/tool_active.png new file mode 100644 index 0000000000000000000000000000000000000000..252cd702f3b49637dce11e76dc0f4c48f22b84f9 GIT binary patch literal 1775 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$_SxH1eR9Fe^R%>h&RTRE=X8OVe zcefErX}3GG3#dfs?ot{OgbJ;oJVa9xBTvyNL5Y7g1~tZzV2nQmBt}r7XsW0{c^L${ zBnE@ByP{Mc?yH4{lG1Li5~RC3*YD2GY-ie)`oqLO+~m$V_dM=*&bg1dgxqQWa|P&7 zd`0o!%_w<~5Ven};`{OVnTtbhZZoE`$Ge6w+6bE|=%dlkGeWl}qQRZ{{44>uT-7!z z3P)jBqZ`AQ9V3Kpjz>a=AXD>A!euU3O&Jw4&0uHiHVo95|8hJUa_Vvm5zHfi@57jb zcc3?+4wIuN&T^jIH5(U0t1|%W}jL0Hozv z4cmZ-R~Cr0f-&|oWbLSgjHTHn%igM-x6a5O|5C6E(0kO3I1S)a5X2IUIrySjEPPDy z_}8^x?(cUg{+Dz&jSLOo!>p37|;Ppf-ya~Z57=D8;5RoqAI!jZ@JU*tBZA>J7 z>_Xx7AlW+rKQ6m{FCvkxFe!n}3bU^zfYhy`9Z=pxpX>B^?>8B$nEfkl%*ZO2tFG9j z12XgRF^o=eN>z4(Q*f&Rz6;D|ZJ7PIO*}F(wJTS?@5OL87fDQ5Z&Hx~N!*KZ4|)w1 z`u7__;MB~7>^^R*64uWtV}*RfCebU=wT!VWAAslWT9#zLmH@bjGO9(3lC6;4-t``j zUyHc&!Vf)6Q0rmRgAzYXrQcgz9^X7h7+)G*kv$!e@Oe-YkDtCas`!=@c8jrz-=&N! zR~d_Q9gbCqQ==iU;Z0V2EpT3B(tP2t(dEHlFojJxl?e1Wbfso}Rpsbqfj}T_lI2*} z1b;1-r4@n_Y{~|{DGg=b0C;(k;Zj7u5Fsx>Fn7VB1z9a^Yik>DDc-e|(rx-ApU0za z9M3%&W73L>86^b;shLE~l)--%>iRTvB437BG_=;R<1}voW`in^-zPAB84)`sJAmxB z5S4w+gMxE&Eb3lv2AAd9u~bN%z%ev$VqTd|NZ?JLfO-BA1K`G55JdeJ6>%8OjIz%X z5f6^*VCLFwC}mm^=)K783MK421QHU6a3mT%bI$NJ(|;8JcaS~47clV_&6$!<;}Q3& ze+DNpHBD!>w+FA9!SeCLuEu;uZntla%E;TAj*;ECm;fG94cn?J|2QgTPGmFJq~nRC zR)ZTcfMLhbnAD((;++emgBXuOZ;Hn__~1{8g9{RNILeN4{>p98iv&XVD$2A+!QZys zHUNOvGfEF&h7z3MoydGO_*~|dlf31EL;{da!uf8aB>hmfI&3>+MU1Kl!Z-ZthSF%F z!3?FcJgouuqy~=6K8Z)e&%nk4E~SN51U3=!a}s59qS3S6e4f5!*Fn2u9RIOR$7yM_ zmySEz*L(F6*9~oXE5L6!BB(7eF2*15W1L+Jc*Vr2H9vIoi!3#2C0HX=$*U?A8em=6i zh%DPM&b4In>LG`td@KaDIF^mJ(y>4H^>$faSe5`>6RNB6FE|PZzUJGp;hqDZ1NV5Q zR8Un4K;}VkKMfR0(`5lC@t>O3ECJYU ztgH{@XsuK&8ZIY~squYhbs7jbHu z@QZ$m%T0~3jQU!3%rp!`XAL0x4~LFA4FgQ(RGE4bW1c}6kCu8fxM7D)_bU9}!WcoY zT|?iGtU$oB!h(>L;lrtA2^^(mc9_h@>!%*;dBa{>?!|rH1TQBXLjZ5c2X0J=(zeZBkc_lyxK`v`V2bo*e(H@Vg@?_ired2->6zlx4PIA>4_j*-)u zbn20gj$imIXT;`Ge6LeV-p~zs#sxZmon^!aw0EN}uvDPCyE}vEny_Iyq36pJ$0Kr^ zNdH(Dk6-vx_Zg93j+1uV_)~ZsV%aFFO86bol9pIwM|9*L)QA9g4F1as{0;rrPTLtO Ru|xm>002ovPDHLkV1kW}Fe?B6 literal 0 HcmV?d00001 diff --git a/web/src/assets/images/menu/userMemory_acitve.svg b/web/src/assets/images/menu/userMemory_active.svg similarity index 100% rename from web/src/assets/images/menu/userMemory_acitve.svg rename to web/src/assets/images/menu/userMemory_active.svg diff --git a/web/src/assets/images/workflow/agent_arbitration.png b/web/src/assets/images/workflow/agent_arbitration.png new file mode 100644 index 0000000000000000000000000000000000000000..d555e3e22436cdcf949eac757bf1d5ad6c16d623 GIT binary patch literal 835 zcmXYueN55`9L9g>Ds4K~vX?WRroG@xt~=cobDY_rB!vvkTXChED47ON*xEkd=h^4q=POKNZTDX6x0oOZ zZ$>e6()*VC`m%e zE?i)vG#RBS5dDaU=dT?y4SbX23W7V7Khx`9VGp_SnuIl2|-R^qV| zx;uD!4~7=>w8Geq7ai#BM1L0sG#J#vq{pxx|Mz0FA7g_UAHu{i%p<7%wVD2M6&B8GUrvpwW-~wl*;cC}d-oLV0$%LOjD=S;t z)MvGQavX6oJzZD4x#gv|^DGxOD$ni+=cpuZ%P;zV zTlgKH_l?ND+SfN{nUT!5QSFrG(z&37+TF5-fiik+vqVwz-|K2cQD&Z^cS{pD@R5PH zePo_INA6^51<`H}(-~jN z7o~RklPCMB#Jc*Jt0@cf?eY3RcK^Yh{EOqIha4FS+uY0ob$EH~K&I)0>%jzr&Z5b; HrWbw&by?e< literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/agent_collaboration.png b/web/src/assets/images/workflow/agent_collaboration.png new file mode 100644 index 0000000000000000000000000000000000000000..7a92aecf70f1ff416fac80f9338c6a35c5e637c2 GIT binary patch literal 1171 zcmXZae>~K890%}ksPM>I>&KR?d2DUd+Gc1Tttm}TtaG~%kvn&k)a4%8T$F7t5!RT} zDiqbj&~vvs_L+OXS_Ov-5r8$`@d+#uUFtedk11RK5D~3-Y$fOp-msB!~_Ful4|If>_pR~*Pfg}L^ zGUx(qBVB=?0RBR37a~xIAQ5(m5iCYXDMCxZCj2hO+SdDUA82l)UJvaZG~Pke9kkv@JLw_19-;d&x((Ty(hRGa*ehl}TsU*g#-OufSMX}p-m%h#AD&EWM6W=NPlrJ*t=SqPh0Kbk*b zYe(a7^D6ttC#GM=%=lW7jdAet{4QW!O9YEge6sA|TVFEQsBi|^80nI94>z6w>OZ_~9ksFOB- z?^r5p4O`H@o6SmgLB zHcVj|%I;K#Z%hudkoJnA3Z&emc}1FhUb-$n@H1vL_mFgvW0A(lvvR2Wh`U%XR3E3X z_vI`M@ou&)RZ}#J$Y7M!W>b?V4P*jdg%?{)nR4gfU{X1%&EPcUXdVZ^J$so)5c|)xie1r z&JK;Mga++Oy;;;Vt;kS+iN4{lO8F}4JHhNB)Z6}K&ycSUe&(PQd;;qjxN zhVBTwo?F5FQJC0ulK0K+P5Az=xN308}->OszE#arKBx^e75}g!lQ_7M~?MlKUIG`jsp(Hz@ zCOo1iJfbK)qA5V6EJLL)MW!-Fr!q&UGfJp8N~t(YsX0-sKUc3tS+Gc5u}ojHPGPiB zWVKUewpC`fR%f&_P z%ZHcEjGWMtozRn?(UqUkmY~s=q0*P8)Sai*ov78Gs@9>g+NrnQu(;i^x!tn5-m<#h zv%ulG!s5Kc;=RP(bcm)Yh&_ z{{8;{{{R2~d)9K>0000DbW%=J02&-lYi^si+4A%J{c-+H2><{AZ%IT!R5;6xl~-57 zKoCY32&AzfiX9a@C}Quum)Ltj1sj_0|G&FIIV9Ntdml2%oO>pFcCr&f{_sn(qEQ!` zB1?W^#~0FR74(p=;ssP%12s_gf?-;daPYrg9gmr%nm(1*MYYx$q5_22zUU&N?k5rz zLL#zPdOkPi%E(0Fwa5lgoN(q8!u5?tH}MUalg@4u&Wmm1{TN%oj3aFm6PZkcg|>&n z&@RTO%>9U`*s%x3PCKPteUyoGq|vit^F8thhk4w^ttU%#Q5F|*)ydv|gM~WcB?hc8 zhzpz8>LC`;VudDrR>bby950?DUD`vK6){`HGAGXBG3gd*_6zH7vEdBGTf;B_b}^n| z-5bXB4_4j#7+?8-7f*a=V#!o04Ku|!!IBk5Pw_U)i=_|8zQ*_wUi+zlIE|NHDk4VL zdZ>`-Y@sG5YObSDRaCqW7mqA{T!jaK@JJCKQo>_Te2|KdX7OP!^85G&nj(g5|7ZH2 P00000NkvXXu0mjfLMD}m literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/aggregator.png b/web/src/assets/images/workflow/aggregator.png new file mode 100644 index 0000000000000000000000000000000000000000..6253733ac5157045736f45d05bd50812b2dba6af GIT binary patch literal 668 zcmXw$dn^D*0;PSQM< zN49nyr5s%}VyRT}ew{FnWJ=-NwPySMKA-P?|NZvO@nN}<42%s31Okca&R}bN?B8xB zYWUp5JxHS=A5ULbjd9Tm{&wJ=LV#wh5ooiS|6ev4Xp10QgxDjLh6rawF~DOY)&sF; z5a$WL7ZSW7VB;DG8R5u@fjANQ0!We}6{0vDvKuJLKuIRrg+=Y=Z82yUz0Za^HVhEE%m>R+KIHo5stH#_n%+Fw9 z7EAM3{*GTO_`QlhtJqivP*|^*sritU$Yz}*7?WAiyyB;QOF!1u`5RvP1cFvDli}h^ z?W`?mk8gE0WMq+xEtFwWa&}uAHN;u90m@QKg&|!@9#F_q%4-Mj@^aQX=14lP>dna8 zgoB|4osTTsy~J@UcdV@JW%EM7sHn<~q1xN(m%%k1%c7_5OlA;I4~#jQ zRhSnnGkeUn{EznbOZo#l&Tn^Lj64{9yzy`{*Y>j80T=rj|Eu)8+%Uc;%foGOPp7HF zkq8@+PLy?gp*-f2vNe5{w@b;>GwBORI2)(EJ0VqFTRAyw?@bk5kqq||FUTYo4kCe5 zGhdo!W!aUM_BNApqQ*f)S{a|y+ix!68VQ?nfA+;~(F#`PhuowRM7gC*qGjX;rHV%T z)S%#2q^M5{oL)RCsq~CbsunJ)?giNu?JKJvc_!7dlxe#sb(3_(Pi}F#Y2h<1a?S&} zg5Jr~l{bD&^3xO1*vp5?^BhyeGY>hGm7?MH9eF#1KGzlMUQG!ErYnn4M-NW_3q@OD A#sB~S literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/answer.png b/web/src/assets/images/workflow/answer.png new file mode 100644 index 0000000000000000000000000000000000000000..57f9c94de44927ccdf2b4239fb724ca6b403b447 GIT binary patch literal 753 zcmXYuYfKUV6opadG|SeKO=o3kPH8oS?OR_k26MzwWMt#XRm{?_y6N5FBX16t>x9 z%h(ak*|IG-#wX{Y^(E9^#zPV6Z$h39c?J|&Xv{@(0b1^&wHR%s zP?kY;AMMrXs6|&j`V{DILVq(psxYL+@GA_rW26(~-I(aX=U#jnz}I2SjACXCv*XZC zLOX@IY0PP$o5g|_OF!}F7xcfOUxr~BD|)ONU|fO82$Kmg1C5%|Za&`O5}O%HaM{ch zB***vgxKEe63y)IOZvELAJ;bi-ZcPFCbu%}0qVfpe(ZxVFx@=ZM+R2dd4GfNy z{5VcEI4G_pg}u9VvND=xotzlH_Q}}D8wEGKZj|(BiFc}O;z>f}V96$*3*~LsQV(Z7 zUpq_@93=1F7wO}-U)aL!E#)~kSZ8I)Z`%{Uu_9S%y{SYJry&#@PRAg(6bwByN z%5mB5P>QN5fOl0DXZ`D0bi}!NgYOLwm+joaV3AjcW4yqdoxs<4%z5p}sZV(6IJCpY zvG22rt~_$0xkwxuHGi3Ujjz1l@wGtv);M1GBW7vo%WFkc^CrTTkf}uW*o7Qr?m{Ea d#OqsJ`D3f~7YRC!$A2)tk3gd`DfK~I@n4uTrTPE> literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/arrow.png b/web/src/assets/images/workflow/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..67ce7b48efc0c619885e4b72f6fccc694c529013 GIT binary patch literal 775 zcmeAS@N?(olHy`uVBq!ia0vp^8bBPt!3-p00*`-YU|=)~@Ck7RavK^NX3m`1uxeFb z->U9KJEu-v)jxlI-<(x5XKtQ4b?fx$o2Sm(FnRW-Y4f&Bnz?@BjLnl~Y?wG_%e2`W zr_NeGarXMDvo=kcxnatT%~NM?nlfYK#F-m`il@xpIC<8FNi#Q2nYCduP{FK?lV)$4 zJQHXRP=EKog20Za`@J5VJ^ z1gs3q1z7}QOad7TW`NX#ES&;22P_CQ9Ap%b4b}_R2-XFX1u;N2LJ&d$Ohk;s(-|0Q zsU<;v!3<2SY@FOY0zx7Z(z1$5%BosAdIrX(=9V^gj!v%b-hsgpkx?;;NhzsW*|~Wo zwRKG`t?k`?6Q)d`Id}eoh09j0UcYhkmhHRt>^*S!=&>{BuU@-x_ul=7&z`?{_2%un z_a8rf{{8pg*_#_~0i#Ra)5S4FLh|jw)F>uK29^tk0XiFY@7~?Ib$2mi^vvJ!j&{%f zpJRMtJLOOINrlsvvH$`=iwWR&m7*d{EKqb zQU0ZT7o#-f4cs)R8-!^_8}w;hHkhY*wPzL0$u8wTW|zu$OemH67{^m4H*Hn+ z#h<1NwSRPZ*;ME=vuUGSWV@lGW#dK9%Emz7lgATUrkF`QpJFI6dy1%p@f2o>y;ImF zwoaK}Bq2XVP2&0#MG5OEtP-E6#7ZzviI(7 dCjEcKpWC!1v{6m*88B`bJYD@<);T3K0Ra1&eHZ`$ literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/classification.png b/web/src/assets/images/workflow/classification.png new file mode 100644 index 0000000000000000000000000000000000000000..87d34bb85e9f5cafe8516fbb4bb1688693e39f7c GIT binary patch literal 849 zcmV-X1FrmuP)lElPNMcrpz}tK*+h%j zO{Mxup!7|p`bnDVMU&u1m*-5T{7as{d1~|5vU5SgrqAuK!xD z|6H&CU$OsSvHxPS|7NuRX}14wx&MK||AE5)tk(as+5f%Y|HR_|&*%Tp=>Oa9|K{`m z?)Lxg_y70%|M~p?`u+d@{{R2~|8|iC^Z)<=K6Fw}Qvm`30|W#G2MY`h4i69!5)%~` z78e*98y+AaBrYy9Hd0exVQz78cYS@GpQNX^xxByH+uYvr^Yird_5A(2miz?(00E^* zL_t(I%gvP8R>D9GhEsvEV_9SqMcD;G*#%(~Q4tWq1t=(a|Hp9ZvCv{^d+C4C`E%xL zrpfdK0D##u7{iG|>56RWs#HjXjfOo21Tl=k7|gcF4z;pDqk*9)#n_V?QBm!Lr6^D? z)h4QHrzi;~_EdwTtgO_I3JD{_;IHI z%GyK86-qe?C~tW8?Q{7m;UwU;Zf|5E5S>y!TK*X-#mEZ#+n&u`OTB8trT!m)O{Ke* zdhy4t=xa{}F7-A164Lr^Fbzlg2EY+;=X$_%4)!B;ZLS{K2bVjhJ@#U57dScJnbsgZ z^KnkFyW9uyh8ow1AGlq1usS%8|2V&U*yoS^9?oF}i_OV-{eftvSiRncuB*jNG~oAg bPMhT$*k6XwW<`Fa00000NkvXXu0mjfJ}#Yl literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/code_execution.png b/web/src/assets/images/workflow/code_execution.png new file mode 100644 index 0000000000000000000000000000000000000000..7f802b3ce81ab40855851760c14b26128a1fc1ca GIT binary patch literal 684 zcmV;d0#p5oP)Unf3r7dgV^ec+Utwj?2p{+mfr4| z-tL;;?xo`JrsMFah#C$_Q>w`(((A%^ZD8H`Q!Hb=J)&P`1|Vk z{OkGr?D_ol{QdX*{`md=`ThR;{{H;_|NZ{|{{R2~|NnvjMtA@K01b3fPE!CH98PO) zo3`2V^ZfmB{!Ix000CG@L_t(I%Z-(5TY^9kg$G0d@u*Q^cPq2B#O$6$7Yj>`g8Bb{ zrVkbHP^^1C?d5%T8D{1z(YI7hH_FJUZ0MRwX(=TOIkHMh!WB#iWEOt8Vg*7~ia+Nq z;DAbjh)6N9P^LmeB}k}5q*^kdrIH3IX{0BUmgjRyzSm0jbTZ=cAmWU|LA+^DoVT4Q zaGmsRjvIvWnPrOCJ$ADn=CT)$6VPWT3p(uo12X@OHMN!nmjK}WsR~;Rc0UdQd;V7I ze)dG*`YhN24)_Y&!E7TRw8z{BaLao@pT~ACc*7$A%k$S7fDvEkf-l?w(B(@2=qyqHK6{$LqXKldp_#%1%P9|uZsR-<8*a@vI$`AtRc>f zL<*&gVo{mJh1&|ng`2d(NhoXu>E@DdS7`%~wiJ1jlD0j0BbB#id9#;!KE41TjDIwu S4e1U50000S0K%>@dm@%i_9CZGOfG9 zv<^fvuD{BJfyB4nSpDSV*5{wMz4(0P(~tlE{~zhF0-3{G666=mASL6Moi}^i%}<~I z{4M*?YcVsU!z)SE)h3OugLN~O~A$sI#mB?w<_1ZEF1xp?%vL2U{TT)^2II;haUEFhF VU!f<{R(pa%$kWx&Wt~$(6987Akb(dJ literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/empty.png b/web/src/assets/images/workflow/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..58dd77b250258575fb6f28760d93a1e2c28902cf GIT binary patch literal 76462 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

g@=dijaQR0={^Ik7u*?D%F9-dzI`H*9 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 F{s&{Dtl0nn literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/end.png b/web/src/assets/images/workflow/end.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4628c6d4fb30d5bcb47f800ff940b82488d42a GIT binary patch literal 792 zcmX|;eNf8*7{`B=-j>d}TYA0D+mXU?*wuNbX>)5=3rM2cscNsz+ZxZTm78fZhaOoYcRwAJi z!YYWWk*q|D5~($~Rg2pnaQ7qbeZ>8Gq}L;(0goE-ScNP##A;+yG~;;-@>@~RhQc;T z+ad3Oyc1>JDDT1BUR3m=vJcf7G<-qhAXI};52587TEC%f7@ec|tVNd=Jv#L2&^HFn zIKE6^@H>WnU}O@yDU3~F;un7EF*S|f2Ivi#Ho{KX*6bTPSd$5?`iC4 zxuG=bl(a;=T~)d>JXY+}pDKQ6pJvI=h(DS#RJw5q?M8-2+HmG#r98;Nsv};yrFBK4 zh2^>I2%4rgPUjUFzwE(}n_3pH!OUifr}0XkVsq#`r99;!gBN;f%$=dElyp4^3Ya&mR<-)c33it?BnV?a<;|qpO|*eHQ&tiyF)3ij&##d+|Vf@C_IjiC zdZhMzrS^ZP_JFANfvEO@srG`Y_JynWi?8>RwfLL5_?)}=qrmy9#rdws`LD?Nwaogq z%=*01`o7cq!PNW0)%wNP`^nn-%G&$N+xyGg`_bS0+~@u2@c!!X{_FAn?DGEc_5Shp z{`2?#^!NVv`TqF(|NH#^{Qdv^{{Q~||NsC0Rj*Vo0000DbW%=J02&-lYi^si+4A%J z{c-+H2><{An@L1LR5;6}mFZH#FcgK$zNShM7Z$-H;(`Sf0)jwMl*N|w{%>Pia0sM8 zW;{R65Gx0iaGBYCK3v>b4kd63BMBDp3!coIh&dEN!y+eDiJnVP)I8)Wkf(@qE+@q+%-CNm4>mF@q*uq^4cA2|PgMwWNQLg!kALp!<@RBqsM%Vk^oW^ znO|bG3P-qLUIZ0D6KUpI^jBdYS>|b&0yu-pJdf@w>>|%x#Y_%7@c?(We#h0GttmQ& zVZ7qga5cdT^Nz>Il;A1xcr?qZ>3U^pm35}FwXEoR&9cM;Ck?ciPjKp9JU-kUYWycD zw$kho#%`KLVfa0h4W8_^HPZOVUqM{m-T6w^>?E7c%$}tqxO8I_J61L zfT;F?srHSr_m;Q#n7H_xy7;Tb`LN0Qvda3s()z#C`^MP&-RS+^>HXsC{p0KXw1DP42BCLM~k@OhNmgI=~Q$I9uRW>*EJ4~mOWDQ{pds5w}G@t zAf%M6Xu3)N$<#GPCcGroq7AZCiE%B13S_kYxORsM)oI`TJ>fF4@F^Mesf_$PRf>?B zor{G5Etx13C533r@PZIHg@MP`G@@6}(*)9(QwqtnTGUB(Z(efq9sX^Oe@iN#CaLBF z@EO#f+u7(tP|YwfN;!Wk*k`1Zh7Ul9^RYYp$ThnZWDHH<;LM_)2*BPIcHgwzLDZvGrrklejmS&;c+VQ-irAE0000SJ^1WOM0cbLnJr>11>1WOM0cbLnMt>1})JZhY!-f9rID z>ve+bc7yDChwOWZ?0ksqev0jYjO~e(?u?i3kelz8pzxTY@R_6WpsDest@5R=@}{ox zw7c}Ry!5xe^|-(F#LD-`&iBgC_s!Ax*W3Bn-1*tu`rqRFi~&<@*^C=*FTQzuU3c1q#IJ zb?*>4`|GqsJUq^C1RP4l1?4`$;Dk`W%HiB z!kW9d$taA0%MZr|7;~e*4cGjZzGb&LKV1B{x`QFdz)g*-bO1<4ihM{($DVwU%15(& d*vtGregP_?YsHtE6#@VN002ovPDHLkV1j*=H?aT! literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/loop.png b/web/src/assets/images/workflow/loop.png new file mode 100644 index 0000000000000000000000000000000000000000..a4313229c82028f0f3c68f30fc78a98b53a5549d GIT binary patch literal 815 zcmV+~1JL}5P){(TCho9vrb^MPhqoA zVYE?XwNq`nUU0i%bG&7Ay=Hm8YkI$Id%$gh!*qnicZ$b-jmUwG$%2~Cke$$zp3sw^ z(Uzdnm!Z;^q|=(H)t<50sj=Frv)Ze^;J3o!yTs$Z$mPPy=EcnC#?I);(CEw1>CDsW z&eZGB*zD8Y@7mt)+TZZp;PBnz@!#a~;pOw<=JVt0_UY~R>+bjL^ZD}h`t$bs_4oVs z`26?z{Q3I*`uqL+{Qdm>{{8>|{~UUeg8%>k4RlgYQvezqPHS$Pw%PLY{QYtMO$h)1 z0kla(K~y-)jg{A0!ax*+4@HVFSfXGrU`0VhQ4|zZY$*1q2$}bP3@TQctAwN7sbCs zeIgQq0U;58%tVa&B?u#e5>`jEM~{z3v+6V~5oNOcPLl7-$~Yp*xg}bxPES|aN+_o( z%A0e%8v=&zIHx>N#Nk8M0ie#q;eO)G75Op+OxfhsjJKG2VC#(c+uQd%Yw;oFDW33R zEO}0n=gF}Po_LAte3}Fjn+FG*31IS>>mK4Mx7>Sd@l-F4cRwt*Xnl0Ywc-*l|9+86 zE@{Oz9{&}Oxuz9Y_+~eZM%-sJW98b;A^@bFcFxK) zxu+4EOamyh2mnQv0c3cs5p7xk@~i+rg?RuLZH?Gq4nU0s04T5qAjd{e{JppvY?t#j zIy>{DqYJwZYx#1U+1|zNMWN)7?C_foNvGtBf-79 tYFq%um115}#SJ^1WOM0cbLnJr>11>1WOM0cbLnMt>1K85XLjjmcIs(& z>S=iDYkBHxdg^R?>TP@KZhY!-f9rFA>vMtYc7yD9gzR^P?0JUleTwaVitT}o?Szo+ zg^})ulJ1O`?~j@9kDBk0o9~gF@0OwPou~1hr}3bv@}sQsr?2v;u=A_4^Rl}1w7c}U zzxBDm^}50JyTbLn!}h_)_QJ^a#mo1`%lFF9_sh`u(A4D9Kg#%KBrKmI;RYjwK1;L5}3W}&f6cF$GzlKSG!@yYf{<*VfzUZx4W}BYlaxy#@3w|+R5uk+b&GbfN?ubTUu97

9Scju`lW9Wf7z9Xv3whY$xt=rOR3Ee>wsiGe4h zyO{-RIALHBHypf0k%7-hb1;o(2KKSS!4>ow*upLcchO>C0iEr6aJz#71A|rIa27lS zszF{9!7H54f)}_9{!l$)4^`7QfekaLPLHjF)548?4U&eJfwJMr!B>nFE@_1_G&LG8 z;d6*mJgRCVe$oo0xt8zDrW)=a49(zfnKl<~S6}}A{pC6#MB@78{XXxTX;*AcYW613P8wAdH6*c-RmB)Z!sy4xwc+bq1?Exg<@zTG##-Z;SC zK*HZd#Nb85;6}yZNygz($l_AS;#0}vRLSF2$>UtiVMbjfyCZ{*Xo7X>xRbPhuQ0h+3Szo?3&Nyn&0lA;qRp4 z@TJw~rsMFZ$KG=EV`1|Vk{OtMs?fLxf`uy#@{`~&`{r>;{{{Q~}|NsC02jmbE0000DbW%=J02&-lYi^si z+4A%J{c-+H2><{A(n&-?R5;6xmFZWKK^%pLMHbfm&Hq8}NJG=CNG9kSZwTa}_yHP){i6 zx#w!adQ#z<|NB+pq_D>rV_ZR1RnTRO@yUUF#<)XHz>wQ`tzIOVPA4N)*K7P%YYJe> z>iSK<;xwEvGsAI%#SR$Dz4aZy{5%}=S#HymjP2`i3UCVR?IlZ(!RYK27h{bHc;7g7 z!PRWEJQ&+0pK6nor%q~1<=Ksu1((_Hk?ujMXP@P=V1^D!iY9MwlTk_PAX661(j;jx zO+HV0P*M}w%HWF}JMs7qxvnbUFq?H!-6q3Tz!4TDX_1jC;JbV9?bG0^pInYNH;-R( z__6{RTZ6CP;SU@g!C(0H1=eCVFvZOs9Dj`T?!jK~v(LZb?uL{NJmbS8zoL@r2L|dT zJwIXc6K6K?kfjZ>L&ZZ4W!YHbhYd^sz;<_G?A|WSi3jlE;l5d2=^xFITWFP97jk4q z`&U+97awkE6k6u4IiH?B=X$Qi5(R6xI=29}I&I;y#Z~c%iMZ@>bzA_BE5&(9Ij%kD iMe4kootM3n@8cgbZJ>j%l69v50000Xw$4(zVTclb6MMTS{+AA+_K7`o*2+KF{}gp6{RE=Q^La!@_)-IYAH>Tn@{Z znyaRJ?o3L{mvaIMV#aFzZULJ*d0F5-1EssO;6sr;4ezi1+y6WK9Pp*sD}}EVe!1{3 zL_i@97C}^m!!iUH<47?=OL43eVRD>RK&(KN0?{vVt`Zlk5Lb*`qia5Gc8&Q|MOsnkan5q38$*B1;$&ClPTEv<>kcQ;Aq zF=`m(EdFCX%_HvETtk^K^s3lV;=GM~6~r;p6jwyK%r#k|lFJu1u~JMo&sd-EcC*=4 zVU-gzEXoVCX|%7&B4sflvse2H4_bvA_u(}_1L;$k>1iJrfh h>a7oS@t&FigPqgPlmkyo@=5AF1eeWY6>L9r=?_9ezkdJ# literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/output_audit.png b/web/src/assets/images/workflow/output_audit.png new file mode 100644 index 0000000000000000000000000000000000000000..50128f82466a4829112c75d87763cf7ff6d65ba6 GIT binary patch literal 624 zcmV-$0+0QPP)h!+q^uX)%$?o>d@AuR3_|)?F)$;h(^7z>E`P}sR-u3$5_4?rT`r-Ea==l5W`TX(w z{qy_%^!)wy{Qmg;{`vj>{r>;||NmG^Qu6=+01b3fPE!CH98PO)o3`2V^ZfmB{!Ix0 z00AgTL_t(I%iYyUQ^G(L1mKs2>`$VCii&_>TyPY35y2&HX!`&E9S;hzG|M~Nx2gFm zm#OX$eML8I$Kzk|9NX0CXEe*_ocNZOI>Y6HxW>#?0xnEY`TkysV-5@=BF*K}xEc{z zEQm#<`x5BuWU?qG**Q1M7YXpZJv-Xu7ly5N zyR|5QmjH0JPzqNO4+f7|D}|dlWj;Z(0EV^Nk_7hN09@D0;Y~6e#@H=~53kI9^#2FE z`%vl(`wfhhy2ZvG&Xsz<&wxh&Fx{$-0AL(8rvPxA0jr%T>a8=^yHV6#VQ%!Is8da$ zC+m!tR$-Evv5(i*}50000< KMNUMnLSTYnVNvh^ literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/parallel.png b/web/src/assets/images/workflow/parallel.png new file mode 100644 index 0000000000000000000000000000000000000000..e77d79d8ada21fbdc3740a5211d89c6ad4ac3318 GIT binary patch literal 979 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 XP$ZWM3f5-E00000NkvXXu0mjfwN8R6 literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/reasoning_control.png b/web/src/assets/images/workflow/reasoning_control.png new file mode 100644 index 0000000000000000000000000000000000000000..649e165cdd3922ef767c43d708b7090bc7e59115 GIT binary patch literal 815 zcmV+~1JL}5P)KUIG`jsp(Hz@ zCOo1iKBFo>qbowCE<>d+L!~fBr!+~ZHcF^BPpdsttwL9?Mq#s1Vzg3Yv{PobR%o|a zX}4NxxLR$wUU0f$bG&48yk&L0XLh}4dcSOYz-@iOZ+^jWf5LKr!gGPcbcV%xh{k-1 z$9;^*fQ`t3jmd(J$%B!~g_X^Una+-!(2=0gmY~v?q|=(D)SIT%ou}2EtJkBf*QBo4 zrLWnhvf8S%+N-qNthU^*x!tn7-?hHrx4+@I!s5Ha;=IP>z{ljl$>qbz<;2bB$Ia)+ z(CEw5>(JWm*4ysa;PBny@!sR|;pOw<=kw&~^ycgJ=L_wDic@ACQa_WSkt z{P+3%`ThR<{r>&_|Nj5~|DuuHOaK4?4RlgYQvezqPHS$Pw%PLY{QYtMO$h)10fb3J zK~y-)jg?nd0x=MU2UuWP7)9*Zuy<@&K|!%1EOx<$9Z|gh|Ir7Uv`y~QoXMA*WRkfd zD#)zZRgG(;sdmLo|7Ef{xrv-MQ-!lQ*gy_TiL<)cP%dk6Jpsq;vJerO94wT>L_{{0 zkd4UflmVS)QtGqGkL!qk&|Q^N$X*Wu0FX-`27Dc*oSoE0;8ZA?0RZIV#hgl7BaoT7 zdvr5)UkI65qtfW{Ln1io{Rh^BRK2nHi}2il2waZdW(&9gWM=N4-9CQ-c=cqw#Skoo zDd2IfRRrof54{2y5rI7`sbAo2$72Y3X7q31>vY0xxX0mxPvGZjvD5g}V^09?w)$99 zo?QTY%(^ZD+t;6gX_hH?n}5HTftR!G*?yUV0|2r&(IpW$Fdx2rufFysSIErloeU-( zj?17{9=(fgjCR$`sn}4t72 zFPMRePf%1^MovXdT}#i_$-^@!G%O-1D?6v9wWDj^(&cOR?LTn((&d|vpS*he{m(z` zEeqU$T913WIEGl9zIypOUz39f%LUfVOCq8nAytB!pa0jVA9T^vwR^Q^!b#hk8+ISK z@jrED>MI=!#^;e6nASupFdTZ~Q{%$^<$3XnGFFc+*}2lZRhc|YdK^z()r&f~83n(U zoMcwIlx!hl(P6L3vBXe;_26!XDDEBGighnE$Zc5NlHTL5Rn4?yeet%25~dwHI(s_J zcL+DE{ImH})_>VgF_O1iCq2JE@38rS_T#12&kw36a8J4J=at|*-R9btZLc3cXg0b& fcg7+8zuDyskCcsnDCy+@y~N<@>gTe~DWM4fx|k9w literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/self_optimization.png b/web/src/assets/images/workflow/self_optimization.png new file mode 100644 index 0000000000000000000000000000000000000000..08ed85980d2ac2d043be376d27f007b0ecbed0fd GIT binary patch literal 922 zcmV;L17-Y)P)SJ^1WOM0cbLnJr>11>1WOM0cbLnMt>1K85XLjjmcIs$% z>S=fCYIy2vdFpF=>TG)IZF}l&eCls~>v4bUbb;%1g6npJ?01Chd4}wMi|v1l?SYN$ zf{yKkknM$$?uL@?h?MS%mhOv|?~Ir4k(}?6o$!;L@ROeKl%DXGpzxNV@R*|TnWOQV zr16}l@tvpfo~QAisPUhu@t~>kp{nwutn#F-@};iwrmym+ukxp`^Qp1(sHO#F{Oaud>+SsP z?)>iX{qOPp@$&ui^!@Yo{q*(y_4fYv_x||!{`mR+`T73(`u_U+{`>p>`~3d>{r~>{ z|NsC0cc`|&0000DbW%=J02&-lYi^si+4A%J{c-+H2><{A$Vo&&R5;6x)oEALKo|w! zw{2+C<)(ljiwJ6g3L>&pR47|SRF<-oRRy&yE(HV>rQAQyhvMm^XG-UON@kvulXKq8 zjYu(mD`ZDdmWUm){G!GejG{uKL0`!Q!nh^jz<*a0!>x(c+&r&}17ZOY5nmWp6ZVNn z5C#c~_@gE;>KChQsX4vzy>Pm>G#K|RTN3iRiDTa6+pxMG5?j5k%aS`UAJn!aX7=(Imb(TDy+|Q7U(`A$xm|25gFkdIQ7E(n z$v1TXkm4v%&wm=|>~Iml*q`l30M%ydzy;jK5ofetyuv0}cbg)EW8n z7nuT(<*Wvt@^SGMULEslzZXE_>atw}GvwF%McUQ~0Ii3d*G;Bj?k^vz1Kr?mqke=r zFWhAkdiaq&Uf5XyzGv?F(;lZfy!(YDUsr(YhkM7(=D4VZ5${m|+zQYxKU^-AbgGBT wGJ}?R0T@?`c}W@9o_Ud)SF?H9oBTem0XEl~ zS!|S57#&+GEiJ9JZmIfUqQNy$L1K6?;7W-QAtqv|5J(_|D!wQPk?4y)5H-XVsfM@^ zW5iBdx=~svEmR5yrJc1i)9GHix6{3y>E}6jW(qBxt&62Mx%>^i_x|Ue?>pza_pe6d zul;%DzOXc1$}L)bPMB72M(;tFX?Ct*R%>EyzC#mo%P=Kkaw-;b&H$i5-N|?Hok3v> z&(N>KB**^%Y+`rt-G0G^rRjHLplc4mdAo}k{4qC|;Ko4S$Ru-aZo=v_+~ac6BZ!a} zT7Vv{)k!R#@p#6i=_Cd{A}#RTg&4mW&)a;BrEtcqBt*5wV(}MFS>(O48u`uIDn$+5 zVr=h|(k6#!?HzL9Qk}eZ#wH1#O?c;ptGRkvd)g|WT&|bgnodcpY?0fssmau>EQnqd zEU+l_)ddzgW@(kS{$Uv%6>;L9o*}2S4-Bj4kQ4uj<`^20yxI;)K5LU0tsB77T%-JG zY?iLU5jAGe>5|J=9lijH@=1>g2Lu<7z7Nb07#p9zR<_F9rPZ?jj8$GNu!1$K>^N_i z?+sVQ($TNL_YOPdPcJ%f^JyeivD?6S7d;xi?PP2;H$e!<11>*b3p zjnapgv3*3;q zFTU(UFy{rwcBGT?*jXo5Yh-(+;g!uD1~3&HU9HXC+YTfwfm#yX1NoLJey;Z z!@4FVkUGbptjezhBfgoWnkkB^&H;Hi%Qz;s1v3FK2?^W*b++^k$;-$&@1hT7>LtIv zOELKkz%KHkLXO`H*4TbBx2SZv8;pK*saCckGEvh3$WSo%2;vtket(8uww$U&4w)2V z>)>UbV5X^eNS5W9ecIAtD4K20#Tu1+D>0TSQ{LJmi2-uhFF;m^<5g{H@%>;S85S~( zJj$x>P!)sWKMNKIMqKh%v2D^d?!l&tVdC`0&Bax2lLv#_vDO<1{le)mND${69a!8Y zTS{!QEY~DQ5Kb;mbw&c<*E%;lWO|~aBhYtWs8JiRK)sJ`)D{@3l)tJ~7^~rrD^9w_ zLIF|z>>H44!G<#=fK*&csa-KhG0<>*8S!zeTTHC4^vXYMZE9nm|J$G<5iuJ8*_Xo- zXd^tOY$~?hP@)n5ZYK^01Vk}4!!KXTHmEAY+$=} zuq4Ycj^WLPmFmdkJv!y0>O2AyKM3Y%?%w*%pVz?jXB;5=Qz&gF9G%F>cNI;Nm~ky! zOaX>6x4K<6p)&9U!+eXu?^b~Q*8z&G(g~7~m$L$p`NKr_hV2+mz{_DFRO}8MMwz2L z7fvj9oVVnJLF`=v3gmOB*|P%Bdw)nqI1O!miZNQt$MCj_)?Nkr1Nqw)bx$0=aC_(S`*6m7J^JfecgrJD{1Uj$v-ON8-aBr=V(puz$2fAH~xTo2tAQw zc@=mt(-6{u)jXB!W*k^p2{v}3%CL$YgxdGwmbVr6jHE)V+>w6m%*U}CAQ*~;j6Rla z4E9~-pf62<051%12wm#&)KCDrFHIp_JEzm90#IE$r*d(hN`D5{RDy$p9?E|_IDpQv zZ--O;^bu+r@Q};CAUO6?=g-HZoB#9MeE5JlFFpa!i;w6x+n*u+16Xb4EH3gG`Tzg` M07*qoM6N<$f?DJHCjbBd literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/sensitive_detection.png b/web/src/assets/images/workflow/sensitive_detection.png new file mode 100644 index 0000000000000000000000000000000000000000..637a4f13b2e9ddcc14ca900410489d0ae5449d2c GIT binary patch literal 803 zcmXw$eK6Aj9L9e|-R6v|Q+H8USN@ zC6t;j*Fv1~(&i;KTdHMhq8Gy|o2Q@a+ygF6=X|H*=q`9TIk83?mOm_5Sn5#fL+ zN5nWImWjhIh;u_ci92{~9QDLeFYx`57=Wa`I1_~AU?hhiJp$>G$cREt9CD8!mxsI) zxSEKfBov)SNeW6*QJRYKY*b#toqXIYM$L89-9TL#>TjZ<9FGKed>fA|(R3H0T0E~s za~)b9pyeStpP`FHgzjdDTOob{NgI0G(bs{2R~YQV+aA0l5ko40tPk>jynln?H~1vQ zry(e0_$l*m{CJB1m&)~NP z+P~20Fh?>6pwq8LM3zfS;Bx#3)76|fUYSrjsn+U_&-qZv_T$+sXMfwS`^A9=TDO>F z`B~i3UuG5HRK;tzGLoMin3oH-ldy?zacE~Ut+l)xC;u{L&n*#H7~6OnB(Muu!+M_W z)Q#pID{QmXo%!pfxpw7ixk`<0CNQ(%CA0jd;XO~`7fYw5)Im}8X2IAZhsfo|EIGa4 zzPV9hrlhTcVlHPDJ7u^~EsTO31%-Z2nUNY_pFbVEEplRd%EfHJR3+di2vm18R;Og8 z6sq^oH%Ve|4dY35Udoz|W3Oo|qiUvVqpgKmZ|#F^=F)y8Rpa~Y=$QJH`MaSN>(V9~ z#a`KK`+FXg%BSW15ys05%T(%d4yE;cj`i-r%8`on0{#8Ll`d877vqxO=t_?^4> zsKfcH#QCkq`L4(Lw#@ps&HByV{L6g9{o?EW=<{AF-b&0R5;7cmD!Sl zFc3upB8!-)xbKQGBQA*R{r^83(6I;sO=_OzJcZ^|NG0hDAy0I}vTIbJW?P0%cr??c zZ*Wa5^C}MgfKz#S)jIu1z4|+!#7oS_oSH+WIO#e~s(_j7i>o5KIx(mc2C)jY_Hx-S z6fI(lrTGoG&BdxsgmY_r17Qe!HH6b7`RBm_*9oPQD-MJFo4mNVW7kUuy&dk0w_A+}xqW8E#nQt^ULe*GO>N<~22JihXG(F=~J(=qU5 zBHQD^o=L@eR8dHfldx^7uBxV;k#wZm7mJp=k2r+kYvsUm?z~@>a zYcA%;c`f!C*Idf&svH2yk)j?_%CV;&r0UVE9`-7~j~|p_W$YvqEI9xG002ovPDHLk FV1ktEADsXI literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/task_planning.png b/web/src/assets/images/workflow/task_planning.png new file mode 100644 index 0000000000000000000000000000000000000000..33f322fd02eb2bd17d3121e00d8f408ca32f0a21 GIT binary patch literal 648 zcmV;30(bq1P)OsD@%r~gf;|4pd>PN@G)sQ*o<|4pd>O{o7(sQ*r=|4ym@P^te@tN&N6 z|5>j8TCV?Hu>Wkg|82PcaJm0+y8m;!|8>0oc)kC8zyE!}|9`;$fx-WS!vBZF|A@u^ zipKwp$N!DT|B=c6n9cv6(Ep;+|D)3XrPKeb*8i{A|FYTtv)cc--T%7X|GVD*z~KMH z;{VF!|IX+C&*%Tp=>OR4|Jm*T+wK3{?*HcV|LOGq?Dqfe_y6<{AMoC0L zR5;6xmFZT4Fc5_Ur7Wd`c5$go73+cvYF(=0QmaL!^ZxH+Xd!UQNi+8kN%+n%lT0p* zEusdSn$H{q2%>kvHG*1%_7Z&f#S4JfdCh%!#FGRusZZVsQq4guWz;l++SYVaNJ4&Hd(`-4;)QgA()wc!X~)cg2} z0~q2xgpaAV+t@Z(TXb=GF>a_g4cjNG{7t3bY7q=0a2d$Y0t0000S0J5K_By5PZEDerl%iKD zC9hJ7UnLj6Ou<0Kjj!vv-*!%U*ERLsnk}E#ZTqr*`CQfejxNJRk9HUw zG>PIn^3~{o!l9k}e{dJ-bH(?FAB{`f_aiWETfy$N1#=}t)@8RIuhd>JoBQs%7Yq*W qTy{$?Y;5Nbsxf(dSnl)h3Z~utq4zA9Th;@;%i!ti=d#Wzp$Pz18N%!U literal 0 HcmV?d00001 diff --git a/web/src/assets/images/workflow/tools.png b/web/src/assets/images/workflow/tools.png new file mode 100644 index 0000000000000000000000000000000000000000..49ff2fa46e92cdbedc1fd586285a87071452140c GIT binary patch literal 869 zcmX|;eNfW{7{`CJYwGSsivvWYsDp%%CJ-lh7q!(Ccj%9IFd8}#(mN}HKng_#RNx|C zIAI;*#Unrjh8s-Wn1U#8YXL?=4soP7KmlnR@;dhIN8R<@=lMR*^ZoPr<^_`hOoju4 zAP6RZ4=^Vpfw7B5C;k&4lyb69LDBXJ%`zUJGAph0>_WvF78iKAN zxE3L`2(3j}9m4AnQIE)aL`m>@1EL!sxDJ67F;X0m;h+q$jX2bV_$C~=fv;{NQGuiu zB)8x@3KddR$ZSW}U1Z zp|l_6_fau`>OWBZ05yZC8$$gMu0MoKi$*Qv!%&PsrNiw}wEczlC+HeO_cN&V_*IYI zar95%_el&+;o&s2GZ>!1$V)t?n8oNUo*FP_z%wJpO_(rY>J_HvF*A>s6bty9ViCqA zn3gcNj91H8SizzhOJ*#uVr3QPRah*rV6DdX#}80nW~PLaVT6MtdGs4`v({)buO?ac zZKPtT;`6xSewx9;sHibd*4a{)wd<3Co7FcI8`;KN8zdv^qrVp(4hvM$b)r$JAuIKGenrj~ z9RI`_=6>ON#08ufaVr`3d2z%h_O#ea=;V9<)|OA6ciBv2+CMUg+Z^xM>GZdiryS{D z?#$k@!|$~6a7p3TO>`EzGh;rY&6)t82_#_n<3& zel)P1&Gt}d4SRhpl7GZ*{&AZ`pow%^lt*mONb^uHrl&?L-F*ptQH8GZ@}shJ=ZM7K e7rh7c3kD~Nvev%sy?!p0B*EWB@)|xBX8i+OHTnzy literal 0 HcmV?d00001 diff --git a/web/src/components/Chat/ChatInput.tsx b/web/src/components/Chat/ChatInput.tsx index 8dd19410..be9fc48d 100644 --- a/web/src/components/Chat/ChatInput.tsx +++ b/web/src/components/Chat/ChatInput.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2025-12-10 16:46:14 * @Last Modified by: ZhaoYing - * @Last Modified time: 2025-12-10 16:49:13 + * @Last Modified time: 2025-12-20 15:38:40 */ import { useEffect } from 'react' import { Flex, Input, Form } from 'antd' @@ -40,7 +40,7 @@ const ChatInput = ({ message, onChange, onSend, loading, children }: ChatInputPr return (

- + {/* 消息输入表单 */}
@@ -66,10 +66,10 @@ const ChatInput = ({ message, onChange, onSend, loading, children }: ChatInputPr {children} {/* 发送按钮 - 根据状态显示不同图标 */} {loading - ? + ? : !values || !values?.message || values?.message?.trim() === '' - ? - : + ? + : } diff --git a/web/src/components/SiderMenu/index.tsx b/web/src/components/SiderMenu/index.tsx index d148a346..91d3d0f1 100644 --- a/web/src/components/SiderMenu/index.tsx +++ b/web/src/components/SiderMenu/index.tsx @@ -21,11 +21,11 @@ import modelActiveIcon from '@/assets/images/menu/model_active.svg'; import memoryIcon from '@/assets/images/menu/memory.svg'; import memoryActiveIcon from '@/assets/images/menu/memory_active.svg'; import spaceIcon from '@/assets/images/menu/space.svg'; -import spaceActiveIcon from '@/assets/images/menu/space_acitve.svg'; +import spaceActiveIcon from '@/assets/images/menu/space_active.svg'; import userIcon from '@/assets/images/menu/user.svg'; import userActiveIcon from '@/assets/images/menu/user_active.svg'; import userMemoryIcon from '@/assets/images/menu/userMemory.svg'; -import userMemoryActiveIcon from '@/assets/images/menu/userMemory_acitve.svg'; +import userMemoryActiveIcon from '@/assets/images/menu/userMemory_active.svg'; import applicationIcon from '@/assets/images/menu/application.svg'; import applicationActiveIcon from '@/assets/images/menu/application_active.svg'; import knowledgeIcon from '@/assets/images/menu/knowledge.svg'; @@ -34,6 +34,10 @@ import memoryConversationIcon from '@/assets/images/menu/memoryConversation.svg' import memoryConversationActiveIcon from '@/assets/images/menu/memoryConversation_active.svg'; import memberIcon from '@/assets/images/menu/member.svg'; import memberActiveIcon from '@/assets/images/menu/member_active.svg'; +import toolIcon from '@/assets/images/menu/tool.png'; +import toolActiveIcon from '@/assets/images/menu/tool_active.png'; +import apiKeyIcon from '@/assets/images/menu/apiKey.png'; +import apiKeyActiveIcon from '@/assets/images/menu/apiKey_active.png'; // 图标路径映射表 const iconPathMap: Record = { @@ -57,6 +61,10 @@ const iconPathMap: Record = { 'memoryConversationActive': memoryConversationActiveIcon, 'member': memberIcon, 'memberActive': memberActiveIcon, + 'tool': toolIcon, + 'toolActive': toolActiveIcon, + 'apiKey': apiKeyIcon, + 'apiKeyActive': apiKeyActiveIcon, }; const { Sider } = Layout; diff --git a/web/src/styles/index.css b/web/src/styles/index.css index eecd99f5..bbbe9cd9 100644 --- a/web/src/styles/index.css +++ b/web/src/styles/index.css @@ -174,4 +174,10 @@ body { } .ant-breadcrumb a:hover { background-color: transparent; +} + +/* X6 节点样式 */ +.x6-node foreignObject > body { + min-height: 100%; + max-height: 100%; } \ No newline at end of file diff --git a/web/src/views/ApplicationConfig/Cluster.tsx b/web/src/views/ApplicationConfig/Cluster.tsx index 7541e938..4330cd60 100644 --- a/web/src/views/ApplicationConfig/Cluster.tsx +++ b/web/src/views/ApplicationConfig/Cluster.tsx @@ -1,4 +1,4 @@ -import { type FC, useEffect, useState, useRef, type Key } from 'react' +import { type FC, useEffect, useState, useRef, forwardRef, useImperativeHandle, type Key } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom'; import Card from './components/Card' @@ -11,17 +11,19 @@ import type { Config, SubAgentModalRef, ChatData, - SubAgentItem + SubAgentItem, + ClusterRef } from './types' import Chat from './components/Chat' import RbCard from '@/components/RbCard/Card' import SubAgentModal from './components/SubAgentModal' import Empty from '@/components/Empty' +import type { Application } from '@/views/ApplicationManagement/types' const tagColors = ['processing', 'warning', 'default'] const MAX_LENGTH = 5; -const Cluster: FC<{application: SubAgentItem}> = ({application}) => { +const Cluster = forwardRef(({application}, ref) => { const { t } = useTranslation() const { message } = App.useApp() const [form] = Form.useForm() @@ -113,6 +115,9 @@ const Cluster: FC<{application: SubAgentItem}> = ({application}) => { form.setFieldsValue({ master_agent_name: option.children }) } } + useImperativeHandle(ref, () => ({ + handleSave + })) return ( @@ -210,6 +215,6 @@ const Cluster: FC<{application: SubAgentItem}> = ({application}) => { /> ) -} +}) export default Cluster \ No newline at end of file diff --git a/web/src/views/ApplicationConfig/components/ConfigHeader.tsx b/web/src/views/ApplicationConfig/components/ConfigHeader.tsx index 34d85aa0..ec899a32 100644 --- a/web/src/views/ApplicationConfig/components/ConfigHeader.tsx +++ b/web/src/views/ApplicationConfig/components/ConfigHeader.tsx @@ -1,6 +1,6 @@ -import { type FC, useRef } from 'react'; +import { type FC, useEffect, useRef } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; -import { Layout, Tabs, Dropdown } from 'antd'; +import { Layout, Tabs, Dropdown, Button } from 'antd'; import type { MenuProps } from 'antd'; import { useTranslation } from 'react-i18next'; import styles from '../index.module.css' @@ -11,7 +11,7 @@ import exportIcon from '@/assets/images/export_hover.svg' import deleteIcon from '@/assets/images/delete_hover.svg' import type { Application, ApplicationModalRef } from '@/views/ApplicationManagement/types'; import ApplicationModal from '@/views/ApplicationManagement/components/ApplicationModal' -import type { CopyModalRef } from '../types' +import type { CopyModalRef, WorkflowRef } from '../types' import { deleteApplication } from '@/api/application' import CopyModal from './CopyModal' @@ -29,8 +29,12 @@ interface ConfigHeaderProps { activeTab: string; handleChangeTab: (key: string) => void; refresh: () => void; + workflowRef: React.RefObject } -const ConfigHeader: FC = ({ application, activeTab, handleChangeTab, refresh }) => { +const ConfigHeader: FC = ({ + application, activeTab, handleChangeTab, refresh, + workflowRef +}) => { const { t } = useTranslation(); const navigate = useNavigate(); const { id } = useParams(); @@ -46,7 +50,7 @@ const ConfigHeader: FC = ({ application, activeTab, handleCha const formatMenuItems = () => { const items = ['edit', 'copy', 'delete'].map(key => ({ key, - icon: , + icon: , label: t(`common.${key}`), })) return { @@ -85,12 +89,23 @@ const ConfigHeader: FC = ({ application, activeTab, handleCha const goToApplication = () => { navigate('/application', { replace: true }) } - + const save = () => { + workflowRef.current?.handleSave() + } + const run = () => { + workflowRef.current?.handleSave(false) + .then(() => { + workflowRef.current?.handleRun() + }) + } + const clear = () => { + workflowRef?.current?.graphRef?.current?.clearCells() + } return ( <> -
-
-
+
+
+
{application?.name[0]}
@@ -101,7 +116,7 @@ const ConfigHeader: FC = ({ application, activeTab, handleCha placement="bottomRight" >
@@ -114,10 +129,19 @@ const ConfigHeader: FC = ({ application, activeTab, handleCha className={styles.tabs} />
-
- + {application?.type === 'workflow' + ?
+ + + + {/* */} + +
+ :
+ {t('application.returnToApplicationList')}
+ }
{ const { id } = useParams(); const agentRef = useRef(null) + const clusterRef = useRef(null) + const workflowRef = useRef(null) const [application, setApplication] = useState(null); const [activeTab, setActiveTab] = useState('arrangement'); @@ -21,6 +24,16 @@ const ApplicationConfig: React.FC = () => { .then(() => { setActiveTab(key) }) + } else if (activeTab === 'arrangement' && application?.type === 'multi_agent' && clusterRef.current) { + clusterRef.current.handleSave(false) + .then(() => { + setActiveTab(key) + }) + } else if (activeTab === 'arrangement' && application?.type === 'workflow' && workflowRef.current) { + workflowRef.current.handleSave(false) + .then(() => { + setActiveTab(key) + }) } else { setActiveTab(key) } @@ -47,9 +60,11 @@ const ApplicationConfig: React.FC = () => { handleChangeTab={handleChangeTab} application={application as Application} refresh={getApplicationInfo} + workflowRef={workflowRef} /> {activeTab === 'arrangement' && application?.type === 'agent' && } - {activeTab === 'arrangement' && application?.type === 'multi_agent' && } + {activeTab === 'arrangement' && application?.type === 'multi_agent' && } + {activeTab === 'arrangement' && application?.type === 'workflow' && } {activeTab === 'api' && } {activeTab === 'release' && } diff --git a/web/src/views/ApplicationConfig/types.ts b/web/src/views/ApplicationConfig/types.ts index c5cda44e..c085328b 100644 --- a/web/src/views/ApplicationConfig/types.ts +++ b/web/src/views/ApplicationConfig/types.ts @@ -1,5 +1,7 @@ import type { KnowledgeBaseListItem } from '@/views/KnowledgeBase/types' import type { ChatItem } from '@/components/Chat/types' +import type { GraphRef } from '@/views/Workflow/types'; +import type { ApiKey } from '@/views/ApiKeyManagement/types' export interface ModelConfig { label?: string; @@ -116,6 +118,14 @@ export interface ApplicationModalData { export interface AgentRef { handleSave: (flag?: boolean) => Promise; } +export interface ClusterRef { + handleSave: (flag?: boolean) => Promise; +} +export interface WorkflowRef { + handleSave: (flag?: boolean) => Promise; + handleRun: () => void; + graphRef: GraphRef +} export interface ApplicationModalRef { handleOpen: (application?: Config) => void; } diff --git a/web/src/views/Workflow/components/CanvasToolbar.tsx b/web/src/views/Workflow/components/CanvasToolbar.tsx new file mode 100644 index 00000000..ac1b1130 --- /dev/null +++ b/web/src/views/Workflow/components/CanvasToolbar.tsx @@ -0,0 +1,203 @@ +import type { FC } from 'react'; +import { Select, Button } from 'antd'; +import { Node } from '@antv/x6'; +import type { GraphRef } from '../types' + +interface CanvasToolbarProps { + miniMapRef: React.RefObject; + graphRef: GraphRef; + isHandMode: boolean; + setIsHandMode: React.Dispatch>; + zoomLevel: number; + canUndo: boolean; + canRedo: boolean; + onUndo: () => void; + onRedo: () => void; +} + +const CanvasToolbar: FC = ({ + miniMapRef, + graphRef, + isHandMode, + setIsHandMode, + zoomLevel, + canUndo, + canRedo, + onUndo, + onRedo, +}) => { + // 整理布局函数 + const handleLayout = () => { + if (!graphRef.current) return; + const nodes = graphRef.current.getNodes(); + const edges = graphRef.current.getEdges(); + + // 如果没有连线,使用垂直布局避免节点重叠 + if (edges.length === 0) { + nodes.forEach((node, index) => { + const nodeData = node.getData(); + const isSpecialNode = nodeData?.isGroup || nodeData?.type === 'condition'; + const nodeHeight = isSpecialNode ? 220 : 50; + const xPosition = 100; + const yPosition = index * (nodeHeight + 100) + 100; + node.setPosition(xPosition, yPosition); + }); + return; + } + + // 简单的树布局算法 + const nodeMap = new Map(); + const children = new Map(); + const roots: string[] = []; + + // 初始化节点映射 + nodes.forEach(node => { + nodeMap.set(node.id, node); + children.set(node.id, []); + }); + + // 构建父子关系 + edges.forEach(edge => { + const sourceId = edge.getSourceCellId(); + const targetId = edge.getTargetCellId(); + if (sourceId && targetId) { + children.get(sourceId)?.push(targetId); + } + }); + + // 找到根节点 + const hasParent = new Set(); + edges.forEach(edge => { + const targetId = edge.getTargetCellId(); + if (targetId) hasParent.add(targetId); + }); + + nodes.forEach(node => { + if (!hasParent.has(node.id)) { + roots.push(node.id); + } + }); + + // 布局参数 + const levelWidths: number[] = []; + const baseNodeSpacing = 120; + let currentY = 100; + + // 计算每层的最大宽度 + const calculateLevelWidths = (nodeId: string, level: number) => { + const node = nodeMap.get(nodeId); + if (!node) return; + + const nodeData = node.getData(); + const isSpecialNode = nodeData?.isGroup || nodeData?.type === 'condition'; + const nodeWidth = isSpecialNode ? 400 : 160; + const gap = isSpecialNode ? 150 : 100; + + levelWidths[level] = Math.max(levelWidths[level] || 0, nodeWidth + gap); + + const childIds = children.get(nodeId) || []; + childIds.forEach((childId: string) => calculateLevelWidths(childId, level + 1)); + }; + + roots.forEach(rootId => calculateLevelWidths(rootId, 0)); + + // 递归布局函数 + const layoutNode = (nodeId: string, level: number, parentY: number): number => { + const node = nodeMap.get(nodeId); + if (!node) return parentY; + + const nodeData = node.getData(); + const isSpecialNode = nodeData?.isGroup || nodeData?.type === 'condition'; + const nodeHeight = isSpecialNode ? 220 : 50; + const verticalGap = isSpecialNode ? 80 : 40; + const spacing = baseNodeSpacing + nodeHeight + verticalGap; + + const xPosition = levelWidths.slice(0, level).reduce((sum, width) => sum + width, 100); + + const childIds = children.get(nodeId) || []; + + if (childIds.length === 0) { + // 叶子节点 + node.setPosition(xPosition, currentY); + currentY += spacing; + return currentY - spacing; + } else { + // 非叶子节点,先布局子节点 + const childPositions: number[] = []; + childIds.forEach((childId: string) => { + const childY = layoutNode(childId, level + 1, currentY); + childPositions.push(childY); + }); + + // 父节点居中,确保有足够间隙 + const minY = Math.min(...childPositions); + const maxY = Math.max(...childPositions); + const centerY = (minY + maxY) / 2; + node.setPosition(xPosition, centerY); + return centerY; + } + }; + + // 布局所有根节点 + roots.forEach(rootId => { + layoutNode(rootId, 0, currentY); + currentY += 300; // 不同树之间的间距 + }); + }; + + return ( + <> + {/* 小地图 */} +
+ {/* 缩放控制按钮 */} +
+ + + + + + +
+ + + + ) +}) + +export default Chat diff --git a/web/src/views/Workflow/components/Chat/VariableConfigModal.tsx b/web/src/views/Workflow/components/Chat/VariableConfigModal.tsx new file mode 100644 index 00000000..22fe8f1b --- /dev/null +++ b/web/src/views/Workflow/components/Chat/VariableConfigModal.tsx @@ -0,0 +1,98 @@ +import { forwardRef, useImperativeHandle, useState } from 'react'; +import { Form, Input, InputNumber, Checkbox } from 'antd'; +import { useTranslation } from 'react-i18next'; + +import type { StartVariableItem, VariableEditModalRef } from '../../types' +import RbModal from '@/components/RbModal' + +interface VariableEditModalProps { + refresh: (values: StartVariableItem[]) => void; + variables: StartVariableItem[] +} + +const VariableConfigModal = forwardRef(({ + refresh, + variables +}, ref) => { + const { t } = useTranslation(); + const [visible, setVisible] = useState(false); + const [form] = Form.useForm<{variables: StartVariableItem[]}>(); + const [loading, setLoading] = useState(false) + + // 封装取消方法,添加关闭弹窗逻辑 + const handleClose = () => { + setVisible(false); + form.resetFields(); + setLoading(false) + }; + + const handleOpen = () => { + + setVisible(true); + }; + // 封装保存方法,添加提交逻辑 + const handleSave = () => { + form.validateFields().then((values) => { + refresh([ + ...(values?.variables ?? []), + ]) + handleClose() + }) + } + + // 暴露给父组件的方法 + useImperativeHandle(ref, () => ({ + handleOpen, + handleClose + })); + + return ( + +
+ + {(fields) => ( + <> + {fields.map(({ name }, index) => { + const field = variables[index] + return ( + + { + field.type === 'string' && + } + { + field.type === 'number' && + } + { + field.type === 'boolean' && {`${field.name}·${field.description}`} + } + + ) + })} + + )} + +
+
+ ); +}); + +export default VariableConfigModal; \ No newline at end of file diff --git a/web/src/views/Workflow/components/NodeLibrary.tsx b/web/src/views/Workflow/components/NodeLibrary.tsx new file mode 100644 index 00000000..20ef8937 --- /dev/null +++ b/web/src/views/Workflow/components/NodeLibrary.tsx @@ -0,0 +1,48 @@ +import { type FC } from 'react'; +import { useTranslation } from 'react-i18next' +import { Card, Space } from 'antd' + +import { nodeLibrary } from '../constant'; + +const NodeLibrary: FC = () => { + const { t } = useTranslation() + + console.log('nodeLibrary', nodeLibrary) + + return ( +
+ + {nodeLibrary.map(category => ( + + + {category.nodes.map((node, nodeIndex) => ( +
{ + e.dataTransfer.setData('application/reactflow', node.type); + e.dataTransfer.setData('application/json', JSON.stringify(node)); + }} + > + + {t(`workflow.${node.type}`)} +
+ ))} +
+
+ ))} +
+
+ ); +}; + +export default NodeLibrary; \ No newline at end of file diff --git a/web/src/views/Workflow/components/Nodes/AddNode.tsx b/web/src/views/Workflow/components/Nodes/AddNode.tsx new file mode 100644 index 00000000..5a84fdfa --- /dev/null +++ b/web/src/views/Workflow/components/Nodes/AddNode.tsx @@ -0,0 +1,19 @@ +import clsx from 'clsx'; +import type { ReactShapeConfig } from '@antv/x6-react-shape'; + +const AddNode: ReactShapeConfig['component'] = ({ node }) => { + const data = node?.getData() || {} + + return ( +
+ + {data.icon} {data.label} + +
+ ); +}; + +export default AddNode; \ No newline at end of file diff --git a/web/src/views/Workflow/components/Nodes/ConditionNode.tsx b/web/src/views/Workflow/components/Nodes/ConditionNode.tsx new file mode 100644 index 00000000..f1a48f91 --- /dev/null +++ b/web/src/views/Workflow/components/Nodes/ConditionNode.tsx @@ -0,0 +1,155 @@ +import React from 'react'; +import clsx from 'clsx'; +import { Button } from 'antd' +import type { ReactShapeConfig } from '@antv/x6-react-shape'; + +const ConditionNode: ReactShapeConfig['component'] = ({ node }) => { + const data = node?.getData() || {}; + + const addPort = (e: React.MouseEvent) => { + if (!node || !node.addPort) return; + e.stopPropagation(); + + const currentPorts = node.getPorts(); + const totalPorts = currentPorts.length; + + // 如果没有端口,添加第一个端口和ELSE端口 + if (totalPorts === 0) { + // 添加第一个ELIF端口 + node.addPort({ + id: 'elif_1', + group: 'right', + attrs: { + text: { + text: 'ELIF 1', + }, + }, + }); + // 添加ELSE端口 + node.addPort({ + id: 'else', + group: 'right', + attrs: { + text: { + text: 'ELSE', + }, + }, + }); + return; + } + + // 如果只有一个端口,确保它是ELSE,然后在之前添加ELIF + if (totalPorts === 1) { + const existingPort = currentPorts[0]; + + // 如果现有端口不是ELSE,先移除它 + if (node.removePort && existingPort.id !== 'else') { + node.removePort(existingPort.id as string); + + // 添加ELIF端口 + node.addPort({ + id: 'elif_1', + group: 'right', + attrs: { + text: { + text: 'ELIF 1', + }, + }, + }); + } + + // 添加或确保存在ELSE端口 + if (existingPort.id !== 'else') { + node.addPort({ + id: 'else', + group: 'right', + attrs: { + text: { + text: 'ELSE', + }, + }, + }); + } + return; + } + + // 获取最后一个端口,确保它是ELSE + let lastPort = currentPorts[totalPorts - 1]; + + // 如果最后一个端口不是ELSE,先移除它 + if (node.removePort && lastPort.id !== 'else') { + node.removePort(lastPort.id as string); + + // 添加ELSE端口作为最后一个 + node.addPort({ + id: 'else', + group: 'right', + attrs: { + text: { + text: 'ELSE', + }, + }, + }); + + // 更新currentPorts和totalPorts + const updatedPorts = node.getPorts(); + const updatedTotal = updatedPorts.length; + lastPort = updatedPorts[updatedTotal - 1]; + } + + // 计算新的ELIF端口数量(最后一个是ELSE,不算在内) + const elifCount = totalPorts - 1; + const newElifCount = elifCount + 1; + + // 如果有removePort方法,先移除最后一个端口(ELSE),添加新的ELIF端口,再添加回ELSE端口 + if (node.removePort) { + // 移除最后一个端口(ELSE) + node.removePort(lastPort.id as string); + + // 添加新的ELIF端口在倒数第二个位置 + node.addPort({ + id: `elif_${newElifCount}`, + group: 'right', + attrs: { + text: { + text: `ELIF ${newElifCount}`, + }, + }, + }); + + // 添加回ELSE端口 + node.addPort({ + id: 'else', + group: 'right', + attrs: { + text: { + text: 'ELSE', + }, + }, + }); + } + }; + + // const removeElif = (e: React.MouseEvent) => { + // e.stopPropagation(); + // }; + + return ( +
+ + + {/* 标题区域 */} +
+
+ 🔀 +
+ 条件分支 +
+
+ ); +}; + +export default ConditionNode; \ No newline at end of file diff --git a/web/src/views/Workflow/components/Nodes/GroupStartNode.tsx b/web/src/views/Workflow/components/Nodes/GroupStartNode.tsx new file mode 100644 index 00000000..cd8a9c50 --- /dev/null +++ b/web/src/views/Workflow/components/Nodes/GroupStartNode.tsx @@ -0,0 +1,19 @@ +import clsx from 'clsx'; +import type { ReactShapeConfig } from '@antv/x6-react-shape'; + +const GroupStartNode: ReactShapeConfig['component'] = ({ node }) => { + const data = node?.getData() || {} + + return ( +
+ + {data.icon} {data.label} + +
+ ); +}; + +export default GroupStartNode; \ No newline at end of file diff --git a/web/src/views/Workflow/components/Nodes/IterationNode.tsx b/web/src/views/Workflow/components/Nodes/IterationNode.tsx new file mode 100644 index 00000000..a6c55138 --- /dev/null +++ b/web/src/views/Workflow/components/Nodes/IterationNode.tsx @@ -0,0 +1,98 @@ +import { useEffect } from 'react'; +import clsx from 'clsx'; +import { Dropdown } from 'antd'; +import { SmallDashOutlined } from '@ant-design/icons'; +import type { ReactShapeConfig } from '@antv/x6-react-shape'; +import { graphNodeLibrary } from '../../constant'; + +interface NodeData { + isSelected?: boolean; + type?: string; + label?: string; + icon?: string; + parentId?: string; + isGroup?: boolean; +} + +const IterationNode: ReactShapeConfig['component'] = ({ node, graph }) => { + const data = node.getData() as NodeData; + + useEffect(() => { + initNodes() + }, []) + + const initNodes = () => { + // 添加默认子节点 + const parentBBox = node.getBBox(); + const centerX = parentBBox.x + 24; // 默认节点宽度的一半 + const centerY = parentBBox.y + 50; // 默认节点高度的一半 + + const childNode1 = graph.addNode({ + ...graphNodeLibrary.groupStart, + x: centerX, + y: centerY, + data: { + type: 'default', + label: '开始', + // icon: '📌', + parentId: node.id, + isDefault: true // 标记为默认节点,不可删除 + }, + }); + const childNode2 = graph.addNode({ + ...graphNodeLibrary.addStart, + x: centerX + 150, + y: centerY, + data: { + type: 'default', + label: '添加节点', + icon: '+', + parentId: node.id, + }, + }); + node.addChild(childNode1) + node.addChild(childNode2) + } + + return ( +
+ {/* 标题区域 */} +
+
+ 🔁 +
+ 迭代 +
+ + + + + {/* 画布内容区域 */} +
+
+ ); +}; + +export default IterationNode; diff --git a/web/src/views/Workflow/components/Nodes/LoopNode.tsx b/web/src/views/Workflow/components/Nodes/LoopNode.tsx new file mode 100644 index 00000000..86e1ee5b --- /dev/null +++ b/web/src/views/Workflow/components/Nodes/LoopNode.tsx @@ -0,0 +1,98 @@ +import { useEffect } from 'react'; +import clsx from 'clsx'; +import { Dropdown } from 'antd'; +import { SmallDashOutlined } from '@ant-design/icons'; +import type { ReactShapeConfig } from '@antv/x6-react-shape'; +import { graphNodeLibrary } from '../../constant'; + +interface NodeData { + isSelected?: boolean; + type?: string; + label?: string; + icon?: string; + parentId?: string; + isGroup?: boolean; +} + +const LoopNode: ReactShapeConfig['component'] = ({ node, graph }) => { + const data = node.getData() as NodeData; + + useEffect(() => { + initNodes() + }, []) + + const initNodes = () => { + // 添加默认子节点 + const parentBBox = node.getBBox(); + const centerX = parentBBox.x + 24; // 默认节点宽度的一半 + const centerY = parentBBox.y + 50; // 默认节点高度的一半 + + const childNode1 = graph.addNode({ + ...graphNodeLibrary.groupStart, + x: centerX, + y: centerY, + data: { + type: 'default', + label: '开始', + // icon: '📌', + parentId: node.id, + isDefault: true // 标记为默认节点,不可删除 + }, + }); + const childNode2 = graph.addNode({ + ...graphNodeLibrary.addStart, + x: centerX + 150, + y: centerY, + data: { + type: 'default', + label: '添加节点', + icon: '+', + parentId: node.id, + }, + }); + node.addChild(childNode1) + node.addChild(childNode2) + } + + return ( +
+ {/* 标题区域 */} +
+
+ ♻️ +
+ 循环 +
+ + + + + {/* 画布内容区域 */} +
+
+ ); +}; + +export default LoopNode; diff --git a/web/src/views/Workflow/components/Nodes/NormalNode.tsx b/web/src/views/Workflow/components/Nodes/NormalNode.tsx new file mode 100644 index 00000000..80eae888 --- /dev/null +++ b/web/src/views/Workflow/components/Nodes/NormalNode.tsx @@ -0,0 +1,31 @@ +import clsx from 'clsx'; +import { useTranslation } from 'react-i18next' +import type { ReactShapeConfig } from '@antv/x6-react-shape'; + +const NormalNode: ReactShapeConfig['component'] = ({ node }) => { + const data = node?.getData() || {} + const { t } = useTranslation() + + return ( +
+
+
+ +
{data.name ?? t(`workflow.${data.type}`)}
+
+ +
{}} + >
+
+ +
{t('workflow.clickToConfigure')}
+
+ ); +}; + +export default NormalNode; \ No newline at end of file diff --git a/web/src/views/Workflow/components/Properties/MessageEditor.tsx b/web/src/views/Workflow/components/Properties/MessageEditor.tsx new file mode 100644 index 00000000..2714e45f --- /dev/null +++ b/web/src/views/Workflow/components/Properties/MessageEditor.tsx @@ -0,0 +1,89 @@ +import { type FC } from 'react'; +import { Input, Form, Space, Button, Row, Col, Select, type FormListOperation } from 'antd'; +import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; + +interface TextareaProps { + parentName?: string; + label?: string; + placeholder?: string; + value?: string; + onChange?: (value?: string) => void; +} +const roleOptions = [ + // { label: 'SYSTEM', value: 'SYSTEM' }, + { label: 'USER', value: 'USER' }, + { label: 'ASSISTANT', value: 'ASSISTANT' }, +] +const MessageEditor: FC = ({ + parentName = 'messages', + placeholder, +}) => { + const form = Form.useFormInstance(); + const values = form.getFieldsValue() + + const handleAdd = (add: FormListOperation['add']) => { + const list = values[parentName]; + const lastRole = list[list.length - 1].role + + add({ + role: lastRole === 'USER' ? 'ASSISTANT' : 'USER', + content: undefined + }) + } + + return ( +
+ + {(fields, { add, remove }) => ( + <> + {fields.map(({ key, name, ...restField }) => { + const currentRole = values[parentName]?.[key].role || 'USER' + + return ( + + + + + {currentRole === 'SYSTEM' + ? + : + ({ + value: key, + label: t(`workflow.config.start.${key}`), + }))} + onChange={handleChangeType} + labelRender={(props) =>
{props.label} {variableType[props.value as keyof typeof variableType]}
} + optionRender={(props) =>
{props.label} {variableType[props.value as keyof typeof variableType]}
} + /> + + {/* 变量名称 */} + + + + + {/* 显示名称 */} + + + + + {/* 最大长度 */} + {['string'].includes(values?.type) && ( + + + + )} + {/* 默认值 */} + {['string', 'number', 'boolean'].includes(values?.type) && ( + + {['string'].includes(values.type) && } + {['number'].includes(values.type) && } + {['boolean'].includes(values.type) && { + updateNodeLabel(e.target.value); + }} + /> +
+ {configs && Object.keys(configs).length > 0 && Object.keys(configs).map((key) => { + const config = configs[key] || {} + + if (selectedNode.data.type === 'start' && key === 'variables' && config.type === 'define') { + return ( +
+
+
+ {t(`workflow.config.${selectedNode.data.type}.${key}`)} +
+ +
+ + + {Array.isArray(config.defaultValue) && config.defaultValue?.map((vo, index) => +
+ {vo.name}·{vo.description} + +
+ {vo.required && {t('workflow.config.start.required')}} + {vo.type} +
+ +
handleEditVariable(index, vo)} + >
+
handleDeleteVariable(index, vo)} + >
+
+
+ )} + + {config.sys?.map((vo, index) => +
+
+ sys.{vo.name} +
+ {vo.type} +
+ )} +
+
+ ) + } + + if (selectedNode.data.type === 'llm' && key === 'messages' && config.type === 'define') { + return ( + + + + ) + } + + if (config.type === 'define') { + return null + } + + return ( + + {config.type === 'input' + ? + : config.type === 'textarea' + ? + : config.type === 'select' + ?