diff --git a/core/main_terminal_parts/tools_execution.py b/core/main_terminal_parts/tools_execution.py index 057caed..fe33eaa 100644 --- a/core/main_terminal_parts/tools_execution.py +++ b/core/main_terminal_parts/tools_execution.py @@ -31,6 +31,7 @@ try: WORKSPACE_MEMORY_DIRNAME, WORKSPACE_REVIEW_DIRNAME, ) + from config.paths import WEB_PRESET_ROLES_DIR except ImportError: import sys project_root = Path(__file__).resolve().parents[2] @@ -57,6 +58,7 @@ except ImportError: WORKSPACE_MEMORY_DIRNAME, WORKSPACE_REVIEW_DIRNAME, ) + from config.paths import WEB_PRESET_ROLES_DIR from modules.file_manager import FileManager from modules.search_engine import SearchEngine @@ -1748,9 +1750,9 @@ class MainTerminalToolsExecutionMixin: from modules.multi_agent.prompts import build_multi_agent_sub_agent_prompt _data_dir = str(getattr(self, "data_dir", "")) _custom_dir = infer_custom_roles_dir(_data_dir) - # host模式下 custom_dir 就是 runtime_dir;web模式下 custom_dir 是用户个人目录 + # host模式下 custom_dir 就是 runtime_dir;web模式下 runtime_dir 指向 web 预设目录 _is_web = '/web/users/' in _data_dir - _runtime_dir = None if _is_web else _custom_dir + _runtime_dir = WEB_PRESET_ROLES_DIR if _is_web else _custom_dir role = load_preset_role(role_id, runtime_dir=_runtime_dir, custom_dir=_custom_dir) if not role: result = {"success": False, "error": f"角色不存在: {role_id}"} diff --git a/server/multi_agent.py b/server/multi_agent.py index c81ba84..1697f49 100644 --- a/server/multi_agent.py +++ b/server/multi_agent.py @@ -8,6 +8,7 @@ """ from __future__ import annotations +import json from pathlib import Path from typing import Any, Dict, List @@ -398,11 +399,28 @@ def list_active_sub_agents_api(): if not sub_agent_manager: return jsonify({"success": False, "error": "子智能体管理器未就绪"}), 503 state = sub_agent_manager.get_multi_agent_state(conversation_id) + agents: List[Dict[str, Any]] = [] + if state: + for a in state.list_all(): + d = a.to_dict() + task = sub_agent_manager.tasks.get(a.task_id) + if isinstance(task, dict): + d["last_tool"] = task.get("last_tool") + stats_file = Path(task.get("stats_file", "")) + if stats_file.exists(): + try: + stats = json.loads(stats_file.read_text(encoding="utf-8")) + d["current_context_tokens"] = stats.get("current_context_tokens", 0) + except Exception: + d["current_context_tokens"] = 0 + else: + d["current_context_tokens"] = 0 + agents.append(d) if not state: return jsonify({"success": True, "agents": []}) return jsonify({ "success": True, - "agents": [a.to_dict() for a in state.list_all()], + "agents": agents, }) diff --git a/static/src/stores/subAgent.ts b/static/src/stores/subAgent.ts index 2e1aa62..6ee8e68 100644 --- a/static/src/stores/subAgent.ts +++ b/static/src/stores/subAgent.ts @@ -1,5 +1,6 @@ import { defineStore } from 'pinia'; import { useUiStore } from './ui'; +import { useConversationStore } from './conversation'; interface SubAgent { task_id: string; @@ -49,13 +50,22 @@ export const useSubAgentStore = defineStore('subAgent', { actions: { async fetchSubAgents() { try { - const resp = await fetch('/api/sub_agents'); + const conversationStore = useConversationStore(); + let resp; + if (conversationStore.multiAgentMode && conversationStore.currentConversationId) { + resp = await fetch(`/api/multiagent/active_sub_agents?conversation_id=${encodeURIComponent(conversationStore.currentConversationId)}`); + } else { + resp = await fetch('/api/sub_agents'); + } if (!resp.ok) { throw new Error(await resp.text()); } const data = await resp.json(); if (data.success) { - this.subAgents = Array.isArray(data.data) ? data.data : []; + const agents = conversationStore.multiAgentMode + ? (Array.isArray(data.agents) ? data.agents : []) + : (Array.isArray(data.data) ? data.data : []); + this.subAgents = agents; const activeTaskId = this.activeAgent?.task_id; if (activeTaskId) { const latest = this.subAgents.find((item) => item.task_id === activeTaskId);