From 3cf0880f9896975a9723cb1e91c0e2095ed39da4 Mon Sep 17 00:00:00 2001 From: advent259141 <2968474907@qq.com> Date: Mon, 26 Jan 2026 22:14:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/agent/handoff.py | 4 + astrbot/core/astr_agent_tool_exec.py | 5 +- astrbot/core/subagent_orchestrator.py | 6 ++ astrbot/dashboard/routes/subagent.py | 7 ++ dashboard/src/views/SubAgentPage.vue | 143 +++++++++++++++++++++----- 5 files changed, 137 insertions(+), 28 deletions(-) diff --git a/astrbot/core/agent/handoff.py b/astrbot/core/agent/handoff.py index 511fb5399..0e2d93435 100644 --- a/astrbot/core/agent/handoff.py +++ b/astrbot/core/agent/handoff.py @@ -31,6 +31,10 @@ class HandoffTool(FunctionTool, Generic[TContext]): **kwargs, ) + # Optional provider override for this subagent. When set, the handoff + # execution will use this chat provider id instead of the global/default. + self.provider_id: str | None = None + def default_parameters(self) -> dict: return { "type": "object", diff --git a/astrbot/core/astr_agent_tool_exec.py b/astrbot/core/astr_agent_tool_exec.py index 5d40f48fa..83c3512c2 100644 --- a/astrbot/core/astr_agent_tool_exec.py +++ b/astrbot/core/astr_agent_tool_exec.py @@ -74,7 +74,10 @@ class FunctionToolExecutor(BaseFunctionToolExecutor[AstrAgentContext]): ctx = run_context.context.context event = run_context.context.event umo = event.unified_msg_origin - prov_id = await ctx.get_current_chat_provider_id(umo) + + # Use per-subagent provider override if configured; otherwise fall back + # to the current/default provider resolution. + prov_id = getattr(tool, "provider_id", None) or await ctx.get_current_chat_provider_id(umo) llm_resp = await ctx.tool_loop_agent( event=event, chat_provider_id=prov_id, diff --git a/astrbot/core/subagent_orchestrator.py b/astrbot/core/subagent_orchestrator.py index d565aa7c5..38f384145 100644 --- a/astrbot/core/subagent_orchestrator.py +++ b/astrbot/core/subagent_orchestrator.py @@ -68,6 +68,9 @@ class SubAgentOrchestrator: instructions = str(item.get("system_prompt", "")).strip() public_description = str(item.get("public_description", "")).strip() + provider_id = item.get("provider_id") + if provider_id is not None: + provider_id = str(provider_id).strip() or None tools = item.get("tools", []) if not isinstance(tools, list): tools = [] @@ -82,6 +85,9 @@ class SubAgentOrchestrator: # while the subagent system prompt can be longer/more specific. handoff = HandoffTool(agent=agent, description=public_description or None) + # Optional per-subagent chat provider override. + handoff.provider_id = provider_id + # Mark as dynamic so we can replace/remove later. handoff.handler_module_path = "core.subagent_orchestrator" diff --git a/astrbot/dashboard/routes/subagent.py b/astrbot/dashboard/routes/subagent.py index 24cb2fcef..34b31c9e8 100644 --- a/astrbot/dashboard/routes/subagent.py +++ b/astrbot/dashboard/routes/subagent.py @@ -48,6 +48,13 @@ class SubAgentRoute(Route): data.setdefault("main_enable", False) data.setdefault("main_tools_policy", "handoff_only") data.setdefault("agents", []) + + # Backward/forward compatibility: ensure each agent contains provider_id. + # None means follow global/default provider settings. + if isinstance(data.get("agents"), list): + for a in data["agents"]: + if isinstance(a, dict): + a.setdefault("provider_id", None) return jsonify(Response().ok(data=data).__dict__) except Exception as e: logger.error(traceback.format_exc()) diff --git a/dashboard/src/views/SubAgentPage.vue b/dashboard/src/views/SubAgentPage.vue index 359828c57..632194885 100644 --- a/dashboard/src/views/SubAgentPage.vue +++ b/dashboard/src/views/SubAgentPage.vue @@ -29,18 +29,14 @@