Skip to content

Commit 99b5d63

Browse files
committed
dag dashboard
1 parent d64d345 commit 99b5d63

9 files changed

Lines changed: 180 additions & 23 deletions

File tree

astrbot/core/astr_agent_tool_exec.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,7 @@ async def _execute_handoff(
414414
"subagent_system_prompt",
415415
agent_name=agent_name,
416416
prompt_length=len(subagent_system_prompt),
417-
prompt=subagent_system_prompt
418-
if subagent_system_prompt
419-
else None,
417+
prompt=subagent_system_prompt if subagent_system_prompt else None,
420418
)
421419

422420
# 构建子代理的追加内容

astrbot/core/astr_main_agent.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,7 @@ async def _apply_subagent_manager_tools(
10471047
history_enabled = orch_cfg.get("history_enabled", True)
10481048
shared_context_enabled = orch_cfg.get("shared_context_enabled", False)
10491049
SubAgentManager.configure(
1050-
max_subagent_count=dynamic_cfg.get("max_dynamic_subagent_count", 3),
1050+
max_subagent_count=dynamic_cfg.get("max_subagent_count", 3),
10511051
auto_cleanup_per_turn=dynamic_cfg.get("auto_cleanup_per_turn", True),
10521052
shared_context_enabled=shared_context_enabled,
10531053
shared_context_maxlen=orch_cfg.get("shared_context_maxlen", 300),
@@ -1059,6 +1059,7 @@ async def _apply_subagent_manager_tools(
10591059
rule_prompt=dynamic_cfg.get("rule_prompt", ""),
10601060
time_prompt_enabled=orch_cfg.get("time_prompt_enabled", True),
10611061
timezone=cfg.get("timezone", None),
1062+
dag_enabled=orch_cfg.get("dag_enabled", False),
10621063
)
10631064

10641065
# Enable subagent history and shared context if configured

astrbot/core/config/default.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@
205205
"agents": [],
206206
"dynamic_agents": {
207207
"enabled": False,
208-
"max_dynamic_subagent_count": 3,
208+
"max_subagent_count": 5,
209209
"auto_cleanup_per_turn": True,
210210
"rule_prompt": (
211211
"# Behavior Rules\n"
@@ -234,7 +234,7 @@
234234
"shared_context_maxlen": 300,
235235
"subagent_history_maxlen": 300,
236236
"execution_timeout": 1200,
237-
"dag_enabled": True,
237+
"dag_enabled": False,
238238
"dag_max_nodes": 10,
239239
"dag_max_parallel": 5,
240240
"dag_max_inject_length": 4000,

astrbot/core/subagent_manager.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class SubAgentManager:
103103
"astrbot_execute_shell",
104104
"astrbot_execute_python",
105105
}
106+
_dag_enabled: bool = False # 是否启用 DAG 编排
106107
_session_timeout_seconds = (
107108
1800 # 会话存活时间。若有会话的subagent闲置时间超过该值,自动清理
108109
)
@@ -130,14 +131,17 @@ class SubAgentManager:
130131
| Instruction | Input → Process → Output (step-by-step) |
131132
| Tools | **Minimum necessary only** |
132133
133-
### 2. Delegate
134+
### 2. Manual Delegate
134135
- Sequential: `transfer_to_*(...)` — block until return
135136
- Parallel: `transfer_to_*(..., background_task=True)` → `wait_for_subagent(name, timeout=secs)`
136137
137-
### 3. Collect & Cleanup
138+
### 3. Collect
138139
- Merge independent outputs by concatenation
139140
- Resolve conflicts by preferring explicit data over inference
140141
{_SUBAGENT_AUTOCLEAN_PROMPT}"""
142+
_DAG_GUIDE_PROMPT = """## DAG Orchestration
143+
DAG Orchestration automatically delegate subagents. When you have 2+ independent tasks that can run in parallel, or tasks with clear dependencies, prefer to use `orchestrate_tasks` to declare them all at once.
144+
"""
141145

142146
@classmethod
143147
def build_task_router_prompt(cls, session_id: str):
@@ -149,6 +153,9 @@ def build_task_router_prompt(cls, session_id: str):
149153
cls._HEADER_TEMPLATE,
150154
cls._CREATE_GUIDE_PROMPT,
151155
]
156+
if cls._dag_enabled:
157+
parts.append(cls._DAG_GUIDE_PROMPT)
158+
152159
return "\n".join(parts) + "\n"
153160

154161
@classmethod
@@ -166,6 +173,7 @@ def configure(
166173
rule_prompt: str = "",
167174
time_prompt_enabled: bool = True,
168175
timezone: str | None = None,
176+
dag_enabled: bool = False,
169177
**kwargs,
170178
) -> None:
171179
"""Configure SubAgentManager settings"""
@@ -179,6 +187,7 @@ def configure(
179187
cls._rule_prompt = rule_prompt
180188
cls._time_prompt_enabled = time_prompt_enabled
181189
cls._timezone = timezone
190+
cls._dag_enabled = dag_enabled
182191
if tools_inherent is None:
183192
cls._tools_inherent = {
184193
"astrbot_execute_shell",

astrbot/dashboard/routes/subagent.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ async def get_config(self):
4040
"agents": [],
4141
"dynamic_agents": {
4242
"enabled": False,
43-
"max_dynamic_subagent_count": 3,
43+
"max_subagent_count": 3,
4444
"auto_cleanup_per_turn": True,
4545
"tools_blacklist": [],
4646
"tools_inherent": [],
@@ -68,7 +68,7 @@ async def get_config(self):
6868
dyn = data["dynamic_agents"]
6969
if isinstance(dyn, dict):
7070
dyn.setdefault("enabled", False)
71-
dyn.setdefault("max_dynamic_subagent_count", 3)
71+
dyn.setdefault("max_subagent_count", 3)
7272
dyn.setdefault("auto_cleanup_per_turn", True)
7373
dyn.setdefault("tools_blacklist", [])
7474
dyn.setdefault("tools_inherent", [])

dashboard/src/i18n/locales/en-US/features/subagent.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,16 @@
9797
"subtitle": "Add a new subagent to get started",
9898
"action": "Create First Agent"
9999
},
100+
"dag": {
101+
"orchestrationMode": "Orchestration Mode",
102+
"orchestrationModeHint": "Choose the orchestration mode for subagent tasks. \"Default\" lets the LLM delegate tasks one by one manually; \"DAG Orchestration\" uses a directed acyclic graph (DAG) to manage task dependencies and parallel execution.",
103+
"maxNodes": "DAG Max Task Nodes",
104+
"maxNodesHint": "Maximum number of task nodes allowed in a single DAG orchestration",
105+
"maxParallel": "DAG Max Parallel Per Layer",
106+
"maxParallelHint": "Maximum parallel tasks per layer. If the layer has more nodes than the limit, they will be processed in batches",
107+
"maxInjectLength": "DAG Predecessor Result Injection Length",
108+
"maxInjectLengthHint": "Maximum character count when injecting predecessor task results into successor task context. Excess content will be truncated"
109+
},
100110
"enhancedSwitches": {
101111
"enable": "Enable Dynamic Subagents",
102112
"enableHint": "Enable dynamic subagent creation and management. When enabled, the main LLM can dynamically create subagents at runtime using create_subagent tools. Can coexist with static subagent orchestration.",

dashboard/src/i18n/locales/ru-RU/features/subagent.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@
9696
"subtitle": "Добавьте первого под-агента, чтобы начать",
9797
"action": "Создать первого агента"
9898
},
99+
"dag": {
100+
"orchestrationMode": "Режим оркестрации",
101+
"orchestrationModeHint": "Выберите режим оркестрации задач субагентов. «По умолчанию» — LLM делегирует задачи вручную одну за другой; «DAG-оркестрация» — использует направленный ациклический граф (DAG) для управления зависимостями и параллельным выполнением.",
102+
"maxNodes": "DAG: макс. число узлов",
103+
"maxNodesHint": "Максимальное количество узлов задач в одной DAG-оркестрации",
104+
"maxParallel": "DAG: макс. параллельных на слой",
105+
"maxParallelHint": "Максимальное количество параллельных задач на один слой. Если узлов в слое больше лимита, они обрабатываются пакетами",
106+
"maxInjectLength": "DAG: длина вставки результатов предшественников",
107+
"maxInjectLengthHint": "Максимальное количество символов при вставке результатов предшествующих задач в контекст последующей задачи. Избыточное содержимое обрезается"
108+
},
99109
"enhancedSwitches": {
100110
"enable": "Включить динамических субагентов",
101111
"enableHint": "Включить динамическое создание и управление субагентами. При включении основной LLM может динамически создавать субагентов во время выполнения с помощью инструментов create_subagent. Может сосуществовать со статической оркестрацией субагентов.",

dashboard/src/i18n/locales/zh-CN/features/subagent.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,16 @@
9797
"subtitle": "添加一个新的子代理以开始",
9898
"action": "创建第一个 Agent"
9999
},
100+
"dag": {
101+
"orchestrationMode": "编排方式",
102+
"orchestrationModeHint": "选择子代理任务的编排模式。「默认」由LLM手动逐个委派;「DAG 编排」使用有向无环图进行管理。",
103+
"maxNodes": "DAG 最大任务节点数",
104+
"maxNodesHint": "单个 DAG 编排中允许的最大任务节点数量",
105+
"maxParallel": "DAG 单层最大并行数",
106+
"maxParallelHint": "每层节点的最大并行数,若节点数超出并行数,会分批处理",
107+
"maxInjectLength": "DAG 前置结果注入长度",
108+
"maxInjectLengthHint": "将前置任务结果注入到后继任务上下文时的最大字符数,超出部分截断"
109+
},
100110
"enhancedSwitches": {
101111
"enable": "启用动态子代理",
102112
"enableHint": "启用动态子代理创建、管理和回收能力。开启后主Agent可在运行时通过create_subagent等工具动态创建子代理。与静态子代理编排可同时存在",

0 commit comments

Comments
 (0)