Skip to content

Commit 095603c

Browse files
committed
合并subagent与enhanced subagent实现
1 parent ffa3cbc commit 095603c

7 files changed

Lines changed: 335 additions & 247 deletions

File tree

astrbot/core/agent/runners/tool_loop_agent_runner.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,11 +1507,9 @@ def _resolve_dynamic_subagent_tool(self, func_tool_name: str):
15071507
return None
15081508

15091509
try:
1510-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
1510+
from astrbot.core.subagent_manager import SubAgentManager
15111511

1512-
dynamic_handoffs = DynamicSubAgentManager.get_handoff_tools_for_session(
1513-
session_id
1514-
)
1512+
dynamic_handoffs = SubAgentManager.get_handoff_tools_for_session(session_id)
15151513
except Exception:
15161514
return None
15171515

@@ -1530,7 +1528,7 @@ def _maybe_register_dynamic_tool_from_result(self, result_content: str) -> None:
15301528

15311529
new_tool_name = parts[1]
15321530
new_tool_obj_name = parts[2]
1533-
logger.info(f"[EnhancedSubAgent] Tool created: {new_tool_name}")
1531+
logger.info(f"[SubAgent] Tool created: {new_tool_name}")
15341532

15351533
run_context_context = getattr(self.run_context, "context", None)
15361534
event = (
@@ -1541,11 +1539,11 @@ def _maybe_register_dynamic_tool_from_result(self, result_content: str) -> None:
15411539
return
15421540

15431541
try:
1544-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
1542+
from astrbot.core.subagent_manager import SubAgentManager
15451543

1546-
handoffs = DynamicSubAgentManager.get_handoff_tools_for_session(session_id)
1544+
handoffs = SubAgentManager.get_handoff_tools_for_session(session_id)
15471545
except Exception as e:
1548-
logger.warning(f"[EnhancedSubAgent] Failed to load dynamic handoffs: {e}")
1546+
logger.warning(f"[SubAgent] Failed to load dynamic handoffs: {e}")
15491547
return
15501548

15511549
for handoff in handoffs:
@@ -1555,5 +1553,5 @@ def _maybe_register_dynamic_tool_from_result(self, result_content: str) -> None:
15551553
):
15561554
if self.req.func_tool:
15571555
self.req.func_tool.add_tool(handoff)
1558-
logger.info(f"[EnhancedSubAgent] Added {handoff.name} to func_tool set")
1556+
logger.info(f"[SubAgent] Added {handoff.name} to func_tool set")
15591557
break

astrbot/core/astr_agent_tool_exec.py

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -276,17 +276,17 @@ def _build_handoff_toolset(
276276

277277
# Always add send_shared_context tool for shared context feature
278278
try:
279-
from astrbot.core.dynamic_subagent_manager import (
279+
from astrbot.core.subagent_manager import (
280280
SEND_SHARED_CONTEXT_TOOL,
281-
DynamicSubAgentManager,
281+
SubAgentManager,
282282
)
283283

284284
session_id = event.unified_msg_origin
285-
session = DynamicSubAgentManager.get_session(session_id)
285+
session = SubAgentManager.get_session(session_id)
286286
if session and session.shared_context_enabled:
287287
toolset.add_tool(SEND_SHARED_CONTEXT_TOOL)
288288
except Exception as e:
289-
logger.debug(f"[EnhancedSubAgent] Failed to add shared context tool: {e}")
289+
logger.debug(f"[SubAgent] Failed to add shared context tool: {e}")
290290

291291
return None if toolset.empty() else toolset
292292

@@ -395,7 +395,7 @@ async def _run_subagent():
395395
# 若超时,保存已产生的部分历史
396396
cls._save_subagent_history(agent_name, runner_messages, umo)
397397
error_msg = f"SubAgent '{agent_name}' execution timeout after {execution_timeout:.1f} seconds."
398-
logger.warning(f"[SubAgentTimeout] {error_msg}")
398+
logger.warning(f"[SubAgent:Timeout] {error_msg}")
399399

400400
cls._handle_subagent_timeout(umo=umo, agent_name=agent_name)
401401

@@ -408,9 +408,8 @@ async def _run_subagent():
408408
else:
409409
# 不设置超时
410410
llm_resp = await _run_subagent()
411-
412411
# 保存历史上下文
413-
cls._save_subagent_history(agent_name, runner_messages, umo)
412+
cls._save_subagent_history(umo, runner_messages, agent_name)
414413

415414
yield mcp.types.CallToolResult(
416415
content=[mcp.types.TextContent(type="text", text=llm_resp.completion_text)]
@@ -431,15 +430,15 @@ async def _execute_handoff_background(
431430
user of the result – the same pattern used by
432431
``_execute_background`` for regular background tasks.
433432
434-
当启用增强SubAgent时,会在 DynamicSubAgentManager 中创建 pending 任务,
433+
当启用增强SubAgent时,会在 SubAgentManager 中创建 pending 任务,
435434
并返回 task_id 给主 Agent,以便后续通过 wait_for_subagent 获取结果。
436435
"""
437436
event = run_context.context.event
438437
umo = event.unified_msg_origin
439438
agent_name = getattr(tool.agent, "name", None)
440439

441440
# check if enhanced subagent
442-
subagent_task_id = cls._register_enhanced_subagent_task(umo, agent_name)
441+
subagent_task_id = cls._register_subagent_task(umo, agent_name)
443442

444443
original_task_id = uuid.uuid4().hex
445444

@@ -475,7 +474,7 @@ async def _do_handoff_background(
475474
**tool_args,
476475
) -> None:
477476
"""Run the subagent handoff.
478-
当增强版 SubAgent 启用时,结果存储到 DynamicSubAgentManager,主 Agent 可通过 wait_for_subagent 获取。
477+
当增强版 SubAgent 启用时,结果存储到 SubAgentManager,主 Agent 可通过 wait_for_subagent 获取。
479478
否则使用原有的 _wake_main_agent_for_background_result 流程。
480479
"""
481480

@@ -517,7 +516,7 @@ async def _run():
517516
except asyncio.TimeoutError:
518517
error_text = f"Execution timeout after {execution_timeout:.1f} seconds."
519518
result_text = f"error: Background SubAgent '{agent_name}' {error_text}"
520-
logger.warning(f"[EnhancedSubAgent:BackgroundTask] {error_text}")
519+
logger.warning(f"[SubAgent:BackgroundTask] {error_text}")
521520

522521
except Exception as e:
523522
error_text = str(e)
@@ -527,9 +526,9 @@ async def _run():
527526

528527
execution_time = time.time() - start_time
529528
# Check if it's enhanced subagent
530-
is_enhanced = cls._is_enhanced_subagent(umo, agent_name)
531-
if is_enhanced:
532-
await cls._handle_enhanced_subagent_background_result(
529+
is_managed = cls._is_managed_subagent(umo, agent_name)
530+
if is_managed:
531+
await cls._handle_subagent_background_result(
533532
umo=umo,
534533
agent_name=agent_name,
535534
task_id=tool_args.get("subagent_task_id"),
@@ -806,15 +805,13 @@ async def _execute_mcp(
806805
def _load_subagent_history(
807806
umo: str, tool: HandoffTool
808807
) -> tuple[list[Message], str]:
809-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
808+
from astrbot.core.subagent_manager import SubAgentManager
810809

811810
agent_name = getattr(tool.agent, "name", None)
812811
subagent_history = []
813812
if agent_name:
814813
try:
815-
stored_history = DynamicSubAgentManager.get_subagent_history(
816-
umo, agent_name
817-
)
814+
stored_history = SubAgentManager.get_subagent_history(umo, agent_name)
818815
if stored_history:
819816
# 将历史消息转换为 Message 对象
820817
for hist_msg in stored_history:
@@ -848,16 +845,14 @@ def _build_subagent_system_prompt(
848845
f"# Role\nYour name is {agent_name}(used for tool calling)\n{base}\n"
849846
)
850847
if agent_name:
851-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
848+
from astrbot.core.subagent_manager import SubAgentManager
852849

853850
runtime = prov_settings.get("computer_use_runtime", "local")
854-
static_subagent_prompt = (
855-
DynamicSubAgentManager.build_static_subagent_prompts(umo, agent_name)
851+
static_subagent_prompt = SubAgentManager.build_static_subagent_prompts(
852+
umo, agent_name
856853
)
857-
dynamic_subagent_prompt = (
858-
DynamicSubAgentManager.build_dynamic_subagent_prompts(
859-
umo, agent_name, runtime
860-
)
854+
dynamic_subagent_prompt = SubAgentManager.build_dynamic_subagent_prompts(
855+
umo, agent_name, runtime
861856
)
862857
subagent_system_prompt += static_subagent_prompt
863858
subagent_system_prompt += dynamic_subagent_prompt
@@ -868,47 +863,43 @@ def _save_subagent_history(
868863
umo: str, runner_messages: list[Message], agent_name: str
869864
) -> None:
870865
if agent_name and runner_messages:
871-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
866+
from astrbot.core.subagent_manager import SubAgentManager
872867

873-
DynamicSubAgentManager.update_subagent_history(
874-
umo, agent_name, runner_messages
875-
)
868+
SubAgentManager.update_subagent_history(umo, agent_name, runner_messages)
876869
else:
877870
return
878871

879872
@staticmethod
880-
def _register_enhanced_subagent_task(
881-
umo: str, agent_name: str | None
882-
) -> str | None:
873+
def _register_subagent_task(umo: str, agent_name: str | None) -> str | None:
883874
if not agent_name:
884875
return None
885876
try:
886-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
877+
from astrbot.core.subagent_manager import SubAgentManager
887878

888-
session = DynamicSubAgentManager.get_session(umo)
879+
session = SubAgentManager.get_session(umo)
889880
if session and (agent_name in session.subagents):
890-
subagent_task_id = DynamicSubAgentManager.create_pending_subagent_task(
881+
subagent_task_id = SubAgentManager.create_pending_subagent_task(
891882
session_id=umo, agent_name=agent_name
892883
)
893884

894885
if subagent_task_id.startswith("__PENDING_TASK_CREATE_FAILED__"):
895886
logger.info(
896-
f"[EnhancedSubAgent:BackgroundTask] Failed to created background task {subagent_task_id} for {agent_name}"
887+
f"[SubAgent:BackgroundTask] Failed to created background task {subagent_task_id} for {agent_name}"
897888
)
898889
else:
899-
DynamicSubAgentManager.set_subagent_status(
890+
SubAgentManager.set_subagent_status(
900891
session_id=umo,
901892
agent_name=agent_name,
902893
status="RUNNING",
903894
)
904895

905896
logger.info(
906-
f"[EnhancedSubAgent:BackgroundTask] Created background task {subagent_task_id} for {agent_name}"
897+
f"[SubAgent:BackgroundTask] Created background task {subagent_task_id} for {agent_name}"
907898
)
908899
return subagent_task_id
909900
except Exception as e:
910901
logger.info(
911-
f"[EnhancedSubAgent:BackgroundTask] Failed to created background task for {agent_name}: {e}"
902+
f"[SubAgent:BackgroundTask] Failed to created background task for {agent_name}: {e}"
912903
)
913904
return None
914905

@@ -942,9 +933,9 @@ def _build_background_submission_message(
942933
@staticmethod
943934
def _get_subagent_execution_timeout() -> float:
944935
try:
945-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
936+
from astrbot.core.subagent_manager import SubAgentManager
946937

947-
return DynamicSubAgentManager.get_execution_timeout()
938+
return SubAgentManager.get_execution_timeout()
948939
except Exception:
949940
return -1
950941

@@ -953,27 +944,27 @@ def _handle_subagent_timeout(
953944
umo: str,
954945
agent_name: str,
955946
) -> None:
956-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
947+
from astrbot.core.subagent_manager import SubAgentManager
957948

958-
DynamicSubAgentManager.set_subagent_status(
949+
SubAgentManager.set_subagent_status(
959950
session_id=umo,
960951
agent_name=agent_name,
961952
status="FAILED",
962953
)
963954

964955
@staticmethod
965-
def _is_enhanced_subagent(umo: str, agent_name: str | None) -> bool:
966-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
956+
def _is_managed_subagent(umo: str, agent_name: str | None) -> bool:
957+
from astrbot.core.subagent_manager import SubAgentManager
967958

968959
if not agent_name:
969960
return False
970-
session = DynamicSubAgentManager.get_session(umo)
961+
session = SubAgentManager.get_session(umo)
971962
if session and agent_name in session.subagents:
972963
return True
973964
return False
974965

975966
@classmethod
976-
async def _handle_enhanced_subagent_background_result(
967+
async def _handle_subagent_background_result(
977968
cls,
978969
*,
979970
umo: str,
@@ -986,15 +977,15 @@ async def _handle_enhanced_subagent_background_result(
986977
tool: HandoffTool,
987978
tool_args: dict,
988979
) -> None:
989-
from astrbot.core.dynamic_subagent_manager import DynamicSubAgentManager
980+
from astrbot.core.subagent_manager import SubAgentManager
990981

991982
success = error_text is None
992983
status = "COMPLETED" if success else "FAILED"
993-
DynamicSubAgentManager.set_subagent_status(
984+
SubAgentManager.set_subagent_status(
994985
session_id=umo, agent_name=agent_name, status=status
995986
)
996987

997-
DynamicSubAgentManager.store_subagent_result(
988+
SubAgentManager.store_subagent_result(
998989
session_id=umo,
999990
agent_name=agent_name,
1000991
success=success,

0 commit comments

Comments
 (0)