From 71fc502a928a4b67aae28395a4201c8b314057e4 Mon Sep 17 00:00:00 2001 From: QihuAI Design Date: Sun, 19 Jul 2026 16:55:20 +0800 Subject: [PATCH] =?UTF-8?q?Phase=203.3=20=E5=89=8D=E7=AB=AF:=20=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=20Agent=20=E7=BC=96=E6=8E=92=E5=9B=BE=20JSON=20?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8(=E8=BD=BD=E5=85=A5/=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C/=E4=BF=9D=E5=AD=98/=E6=B8=85=E9=99=A4/=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/index.ts | 4 ++ frontend/src/pages/admin/Agents.tsx | 100 ++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 0d41c26..4118637 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -891,6 +891,10 @@ export const adminAPI = { getAgentToolPolicy: (id: string) => get(`/admin/agents/${id}/tool-policy`), setAgentToolPolicy: (id: string, toolPolicy: any) => put(`/admin/agents/${id}/tool-policy`, { tool_policy: toolPolicy }), + // Phase 3.3: 多 Agent 编排图 (orchestration) + getAgentOrchestration: (id: string) => get(`/admin/agents/${id}/orchestration`), + setAgentOrchestration: (id: string, orchestration: any) => put(`/admin/agents/${id}/orchestration`, { orchestration }), + getAdminAvailableSkills: (params?: any) => { const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : ''; diff --git a/frontend/src/pages/admin/Agents.tsx b/frontend/src/pages/admin/Agents.tsx index cfd6f71..b99d1d0 100644 --- a/frontend/src/pages/admin/Agents.tsx +++ b/frontend/src/pages/admin/Agents.tsx @@ -109,6 +109,9 @@ const Agents: React.FC = () => { const [availableMcps, setAvailableMcps] = useState([]); // Tool policy (sandbox) — null means disabled / no policy const [toolPolicy, setToolPolicy] = useState(null); + // Phase 3.3: orchestration graph editor (JSON text + error) + const [orchestrationText, setOrchestrationText] = useState(''); + const [orchestrationError, setOrchestrationError] = useState(''); // Toast const [toast, setToast] = useState<{ msg: string; type: 'success' | 'error' } | null>(null); @@ -195,6 +198,8 @@ const Agents: React.FC = () => { reasoning_enabled: false, }); setToolPolicy(null); + setOrchestrationText(''); + setOrchestrationError(''); setShowModal(true); }; @@ -203,6 +208,7 @@ const Agents: React.FC = () => { setEditingAgent(agent); await loadAvailable(); await openEditLoadPolicy(agent.id); + await openEditLoadOrchestration(agent.id); const cfg = agent.config || {}; setForm({ @@ -231,6 +237,17 @@ const Agents: React.FC = () => { setToolPolicy(null); } }; + // Phase 3.3: 载入已有编排图 + const openEditLoadOrchestration = async (agentId: string) => { + try { + const oRes = await adminAPI.getAgentOrchestration(agentId) as any; + const og = oRes?.data?.orchestration; + setOrchestrationText(og ? JSON.stringify(og, null, 2) : ''); + setOrchestrationError(''); + } catch { + setOrchestrationText(''); + } + }; const openDetail = async (agent: Agent) => { setDetailAgent(agent); setShowDetail(true); @@ -716,6 +733,89 @@ const Agents: React.FC = () => { )} )} + {editingAgent && ( +
+
+
🕸️ 多 Agent 编排图 (orchestration)
+
+ 用有向图描述多个智能体的协作:节点类型 llm / local / external / reduce,边 from→to 表示数据流。留空表示不启用编排(走原对话逻辑)。 +
+