fix(multi-agent): web模式支持加载预设角色,多智能体面板显示活跃子智能体

This commit is contained in:
JOJO 2026-07-15 02:38:12 +08:00
parent 69e3ef51b6
commit 4f3ba722a1
3 changed files with 35 additions and 5 deletions

View File

@ -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_dirweb模式下 custom_dir 是用户个人目录
# host模式下 custom_dir 就是 runtime_dirweb模式下 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}"}

View File

@ -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,
})

View File

@ -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);