Files
beaver_project/docs/superpowers/examples/agent-team-flow-logic-visualization.html
steven_li 520a21a027 feat(coordinator): 添加团队节点默认最大工具迭代次数配置
添加 DEFAULT_TEAM_NODE_MAX_TOOL_ITERATIONS 配置项以控制团队节点的最大工具迭代次数,
并修改 LocalAgentRunner 中的逻辑来使用此默认值当 envelope 中未指定时。

fix(runtime): 修复团队节点运行成功判断逻辑

更新运行成功判断条件,将 finish_reason 为 "max_tool_iterations_finalized" 的情况
视为运行失败,并添加对原始工具调用输出的检测,避免将其误判为成功完成。

feat(mcp): 添加团队工作流MCP工具类别支持

增加新的本地MCP工具类别 "team_workflow" 及其对应的工具创建功能,
为团队工作流提供本地工具支持。

refactor(engine): 调整AgentLoop最大工具迭代次数设置

将 AgentProfile 中的默认 max_tool_iterations 从 30 增加到 100,
同时移除 TaskExecutionPlanner 构造函数中的重复参数传递。

perf(mcp): 优化MCP连接管理避免重复连接

添加 mcp_connected 标志来跟踪MCP连接状态,确保 connect_all 只执行一次,
提高性能并避免不必要的重复连接。

refactor(skills): 移除技能团队模板相关功能

移除与技能团队模板相关的代码,包括解析、存储和处理逻辑,
简化技能记录结构和加载流程。

feat(process): 增强会话过程投影器功能

添加技能激活快照事件处理,改进团队运行完成消息显示,
并增强技能激活事件的时间戳记录功能。

refactor(tasks): 简化任务尝试编排器团队执行逻辑

移除团队执行相关代码,将所有任务统一按单步执行处理,
简化任务编排器的复杂度并提升执行效率。

fix(evidence): 修复节点证据评估中需求验证逻辑

更新节点证据评估逻辑,跳过自然语言证据需求的确定性验证,
只执行机器可读的需求验证,避免因自然语言需求导致的节点失败。
2026-06-26 16:36:29 +08:00

1527 lines
71 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Beaver Agent Team Explained</title>
<style>
:root {
--bg: #f6f0e8;
--surface: #fffdf8;
--ink: #201815;
--muted: #6f6258;
--faint: #9b8d80;
--line: #ded1c4;
--black: #211915;
--blue: #235f9d;
--blue-bg: #e8f2fc;
--green: #197343;
--green-bg: #e8f4ec;
--amber: #a76710;
--amber-bg: #fff0cd;
--red: #af332b;
--red-bg: #fbe6e2;
--purple: #62449a;
--purple-bg: #efe8fb;
--shadow: 0 18px 48px rgba(45, 31, 20, .1);
--radius: 24px;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", sans-serif;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
color: var(--ink);
background:
radial-gradient(circle at 0 0, rgba(255, 241, 205, .9), transparent 34%),
radial-gradient(circle at 100% 0, rgba(232, 242, 252, .9), transparent 30%),
var(--bg);
}
main {
width: min(1280px, calc(100vw - 36px));
margin: 28px auto 56px;
}
input[type="radio"] {
position: absolute;
opacity: 0;
pointer-events: none;
}
header {
display: grid;
grid-template-columns: 1fr auto;
gap: 20px;
align-items: end;
margin-bottom: 18px;
}
h1, h2, h3, p { margin: 0; }
h1 {
max-width: 820px;
font-size: clamp(34px, 5.4vw, 68px);
line-height: .95;
letter-spacing: -.06em;
}
.subtitle {
max-width: 850px;
margin-top: 12px;
color: var(--muted);
font-size: 16px;
line-height: 1.55;
}
h2 {
font-size: 24px;
line-height: 1.12;
letter-spacing: -.04em;
}
h3 {
font-size: 16px;
line-height: 1.2;
letter-spacing: -.02em;
}
p, li {
color: var(--muted);
font-size: 14px;
line-height: 1.55;
}
ul {
margin: 10px 0 0;
padding-left: 18px;
}
code, pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
}
code {
padding: 2px 6px;
border-radius: 7px;
background: rgba(32, 24, 21, .08);
color: var(--ink);
font-size: .92em;
}
pre {
margin: 0;
white-space: pre-wrap;
word-break: break-word;
color: #2b211d;
font-size: 12px;
line-height: 1.48;
}
.legend {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 8px;
max-width: 460px;
}
.chip, .badge {
display: inline-flex;
align-items: center;
gap: 7px;
min-height: 32px;
padding: 7px 11px;
border-radius: 999px;
border: 1px solid var(--line);
background: rgba(255, 253, 248, .78);
color: var(--muted);
font-size: 12px;
font-weight: 750;
white-space: nowrap;
}
.dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--black);
flex: none;
}
.dot.blue { background: var(--blue); }
.dot.green { background: var(--green); }
.dot.amber { background: var(--amber); }
.dot.red { background: var(--red); }
.dot.purple { background: var(--purple); }
.badge { border: 0; }
.badge.blue { color: var(--blue); background: var(--blue-bg); }
.badge.green { color: var(--green); background: var(--green-bg); }
.badge.amber { color: var(--amber); background: var(--amber-bg); }
.badge.red { color: var(--red); background: var(--red-bg); }
.badge.purple { color: var(--purple); background: var(--purple-bg); }
.tabs {
position: sticky;
top: 0;
z-index: 10;
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 10px;
padding: 10px;
margin: 16px 0 18px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(255, 253, 248, .86);
backdrop-filter: blur(14px);
box-shadow: 0 10px 28px rgba(45, 31, 20, .08);
}
.tabs label {
min-height: 48px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 14px;
border-radius: 999px;
color: var(--muted);
font-weight: 850;
cursor: pointer;
transition: background .16s ease, color .16s ease, box-shadow .16s ease;
user-select: none;
}
.tabs label:hover { background: rgba(32, 24, 21, .06); }
#page1:checked ~ .tabs label[for="page1"],
#page2:checked ~ .tabs label[for="page2"],
#page3:checked ~ .tabs label[for="page3"],
#page4:checked ~ .tabs label[for="page4"],
#page5:checked ~ .tabs label[for="page5"],
#page6:checked ~ .tabs label[for="page6"],
#page7:checked ~ .tabs label[for="page7"],
#page8:checked ~ .tabs label[for="page8"],
#page9:checked ~ .tabs label[for="page9"],
#page10:checked ~ .tabs label[for="page10"] {
color: #fffaf2;
background: var(--black);
box-shadow: 0 12px 28px rgba(32, 24, 21, .22);
}
.page { display: none; }
#page1:checked ~ .pages #content1,
#page2:checked ~ .pages #content2,
#page3:checked ~ .pages #content3,
#page4:checked ~ .pages #content4,
#page5:checked ~ .pages #content5,
#page6:checked ~ .pages #content6,
#page7:checked ~ .pages #content7,
#page8:checked ~ .pages #content8,
#page9:checked ~ .pages #content9,
#page10:checked ~ .pages #content10 { display: block; }
.grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
}
.card {
border: 1px solid var(--line);
border-radius: var(--radius);
background: rgba(255, 253, 248, .92);
box-shadow: var(--shadow);
padding: 22px;
overflow: hidden;
}
.span-12 { grid-column: span 12; }
.span-8 { grid-column: span 8; }
.span-7 { grid-column: span 7; }
.span-6 { grid-column: span 6; }
.span-5 { grid-column: span 5; }
.span-4 { grid-column: span 4; }
.span-3 { grid-column: span 3; }
.title-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 14px;
}
.row {
display: grid;
gap: 12px;
}
.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.four { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.node, .box {
position: relative;
min-height: 88px;
padding: 15px;
border: 1px solid var(--line);
border-radius: 18px;
background: #fff;
}
.node.blue, .box.blue { background: var(--blue-bg); border-color: #bfd5ec; }
.node.green, .box.green { background: var(--green-bg); border-color: #bbdcc8; }
.node.amber, .box.amber { background: var(--amber-bg); border-color: #e8ce94; }
.node.red, .box.red { background: var(--red-bg); border-color: #e8bdb8; }
.node.purple, .box.purple { background: var(--purple-bg); border-color: #d7c5ed; }
.node.black { background: var(--black); color: white; border-color: var(--black); }
.node.black p, .node.black h3 { color: white; }
.meta {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 10px;
}
.mini {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 4px 7px;
border: 1px solid rgba(32, 24, 21, .12);
border-radius: 999px;
background: rgba(255, 255, 255, .66);
color: var(--muted);
font-size: 11px;
font-weight: 760;
}
.line-flow {
display: flex;
align-items: stretch;
gap: 12px;
overflow-x: auto;
padding: 2px 2px 10px;
}
.line-flow > .node {
min-width: 178px;
flex: 1;
}
.line-flow > .node:not(:last-child)::after {
content: "→";
position: absolute;
top: 50%;
right: -19px;
transform: translateY(-50%);
z-index: 2;
color: var(--faint);
font-size: 24px;
font-weight: 950;
}
.lane {
display: grid;
grid-template-columns: 170px 1fr;
gap: 12px;
align-items: stretch;
margin-bottom: 12px;
}
.lane-title {
display: grid;
align-content: center;
min-height: 70px;
border-radius: 18px;
padding: 14px;
background: var(--black);
color: white;
font-weight: 900;
letter-spacing: -.02em;
}
.lane-body {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
min-height: 70px;
border: 1px solid var(--line);
border-radius: 18px;
background: white;
padding: 12px;
}
.pill {
display: inline-flex;
align-items: center;
min-height: 32px;
padding: 7px 10px;
border: 1px solid var(--line);
border-radius: 999px;
background: #fffaf2;
color: var(--muted);
font-size: 13px;
font-weight: 740;
}
.arrow {
color: var(--faint);
font-weight: 950;
font-size: 18px;
}
.code-card {
border: 1px solid var(--line);
border-radius: 18px;
background: #fffaf2;
overflow: hidden;
}
.code-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 13px;
border-bottom: 1px solid var(--line);
background: rgba(32, 24, 21, .05);
color: var(--muted);
font-size: 12px;
font-weight: 850;
}
.code-card pre { padding: 13px; max-height: 360px; overflow: auto; }
.code-card.small pre { max-height: 260px; }
.compare {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.verdict {
display: grid;
grid-template-columns: 34px 1fr;
gap: 10px;
align-items: start;
padding: 13px;
border: 1px solid var(--line);
border-radius: 16px;
background: white;
}
.mark {
width: 26px;
height: 26px;
display: grid;
place-items: center;
border-radius: 50%;
font-size: 13px;
font-weight: 950;
color: white;
background: var(--black);
}
.mark.ok { background: var(--green); }
.mark.warn { background: var(--amber); }
.mark.bad { background: var(--red); }
.dag {
display: grid;
gap: 12px;
}
.dag-row {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
align-items: stretch;
}
.parallel {
display: grid;
grid-template-columns: 1fr 40px 1.4fr 40px 1fr;
gap: 10px;
align-items: center;
}
.stack {
display: grid;
gap: 10px;
}
.join {
display: grid;
place-items: center;
min-height: 100px;
color: var(--faint);
font-size: 26px;
font-weight: 950;
}
.simple-table {
display: grid;
gap: 8px;
}
.table-row {
display: grid;
grid-template-columns: 1.1fr 1.2fr 1.4fr;
gap: 8px;
align-items: stretch;
}
.cell {
min-height: 56px;
padding: 11px;
border: 1px solid var(--line);
border-radius: 14px;
background: white;
color: var(--muted);
font-size: 13px;
line-height: 1.45;
}
.cell.head {
background: var(--black);
color: white;
font-weight: 900;
}
.note {
margin-top: 12px;
padding: 13px 15px;
border-left: 5px solid var(--black);
border-radius: 16px;
background: white;
}
.note strong {
display: block;
margin-bottom: 4px;
font-size: 15px;
}
.score {
display: grid;
place-items: center;
width: 44px;
height: 44px;
border-radius: 16px;
background: var(--black);
color: white;
font-weight: 950;
font-size: 18px;
}
.score.easy { background: var(--green); }
.score.mid { background: var(--amber); }
.score.hard { background: var(--red); }
.scenario {
display: grid;
grid-template-columns: 52px 1fr;
gap: 12px;
align-items: start;
min-height: 112px;
padding: 14px;
border: 1px solid var(--line);
border-radius: 18px;
background: white;
}
@media (max-width: 980px) {
main { width: min(100% - 24px, 1280px); }
header { grid-template-columns: 1fr; }
.legend { justify-content: flex-start; }
.tabs {
grid-template-columns: 1fr 1fr;
border-radius: 24px;
}
.tabs label { border-radius: 18px; }
.span-8, .span-7, .span-6, .span-5, .span-4, .span-3 { grid-column: span 12; }
.two, .three, .four, .compare, .parallel, .dag-row { grid-template-columns: 1fr; }
.lane { grid-template-columns: 1fr; }
.join { min-height: 28px; transform: rotate(90deg); }
.table-row { grid-template-columns: 1fr; }
.line-flow > .node:not(:last-child)::after { content: ""; display: none; }
}
</style>
</head>
<body>
<main>
<input id="page1" name="page" type="radio" checked />
<input id="page2" name="page" type="radio" />
<input id="page3" name="page" type="radio" />
<input id="page4" name="page" type="radio" />
<input id="page5" name="page" type="radio" />
<input id="page6" name="page" type="radio" />
<input id="page7" name="page" type="radio" />
<input id="page8" name="page" type="radio" />
<input id="page9" name="page" type="radio" />
<input id="page10" name="page" type="radio" />
<header>
<div>
<h1>Agent Team 从输入到结果,到底谁负责什么</h1>
<p class="subtitle">这版按“小白也能看懂”重做:先看成功例子,再看坏例子;每一步都标明输入、负责人、输出。</p>
</div>
<div class="legend">
<span class="chip"><i class="dot blue"></i>输入/选择</span>
<span class="chip"><i class="dot green"></i>正确执行</span>
<span class="chip"><i class="dot amber"></i>校验/降级</span>
<span class="chip"><i class="dot red"></i>错误点</span>
<span class="chip"><i class="dot purple"></i>汇总输出</span>
</div>
</header>
<nav class="tabs" aria-label="sub pages">
<label for="page1">1. 总流程和案例</label>
<label for="page2">2. Team 类型和 Main Agent 输出</label>
<label for="page3">3. Skill Template 怎么装载</label>
<label for="page4">4. 重试和报错怎么理解</label>
<label for="page5">5. Swarms 怎么工作</label>
<label for="page6">6. 我们和 Swarms 差别</label>
<label for="page7">7. 最终架构</label>
<label for="page8">8. 代码落地位置</label>
<label for="page9">9. Workflow 工具调用</label>
<label for="page10">10. 方案和 10 个场景</label>
</nav>
<section class="pages">
<article class="page" id="content1">
<section class="grid">
<div class="card span-12">
<div class="title-row">
<h2>先记住一句话</h2>
<span class="badge blue">责任边界</span>
</div>
<div class="line-flow">
<div class="node blue">
<h3>用户</h3>
<p>只说想要什么。</p>
<div class="meta"><span class="mini">例如:做 MGM/Galaxy 财报对比</span></div>
</div>
<div class="node blue">
<h3>Skill Resolver</h3>
<p>负责选 Skill。</p>
<div class="meta"><span class="mini">选中 mgm-galaxy...</span></div>
</div>
<div class="node green">
<h3>Main Agent</h3>
<p>负责决定是否用 Team并提交 Team 参数。</p>
<div class="meta"><span class="mini">调用 run_agent_team</span></div>
</div>
<div class="node amber">
<h3>TaskExecutionPlanner</h3>
<p>负责把 JSON 变成 ExecutionGraph。</p>
<div class="meta"><span class="mini">校验 / 修复 / fallback</span></div>
</div>
<div class="node green">
<h3>Scheduler</h3>
<p>负责按 DAG 调度子 Agent。</p>
<div class="meta"><span class="mini">谁先跑 / 谁等谁</span></div>
</div>
<div class="node purple">
<h3>Final Synthesis</h3>
<p>负责只总结已经完成的 Team 结果。</p>
<div class="meta"><span class="mini">不能再说“我将启动 Team”</span></div>
</div>
</div>
</div>
<div class="card span-7">
<div class="title-row">
<h2>成功案例MGM/Galaxy</h2>
<span class="badge green">Skill 有模板</span>
</div>
<div class="lane">
<div class="lane-title">读到的 Skill</div>
<div class="lane-body">
<span class="pill">mgm-galaxy-financial-chart-report-safe</span>
<span class="arrow"></span>
<span class="pill">里面有 beaver-team-template</span>
<span class="arrow"></span>
<span class="pill">DAG 已经写好</span>
</div>
</div>
<div class="lane">
<div class="lane-title">Main Agent 应输出</div>
<div class="lane-body">
<span class="pill">第一轮不要先 web_search</span>
<span class="arrow"></span>
<span class="pill">调用 run_agent_team</span>
<span class="arrow"></span>
<span class="pill">传 task-only nodes</span>
</div>
</div>
<div class="lane">
<div class="lane-title">谁加载 DAG</div>
<div class="lane-body">
<span class="pill">Main Agent 不直接加载</span>
<span class="arrow"></span>
<span class="pill">TaskExecutionPlanner 适配</span>
<span class="arrow"></span>
<span class="pill">Scheduler 执行</span>
</div>
</div>
<div class="dag-row" style="margin-top:14px">
<div class="node blue">
<h3>collect_official_sources</h3>
<p>收集官方来源。</p>
<div class="meta"><span class="mini">应绑定搜索 Skill</span><span class="mini">web_search/web_fetch</span></div>
</div>
<div class="node green">
<h3>extract_financial_metrics</h3>
<p>从来源提取指标。</p>
<div class="meta"><span class="mini">depends_on collect</span></div>
</div>
<div class="node amber">
<h3>validate_metrics</h3>
<p>校验周期、币种、单位。</p>
<div class="meta"><span class="mini">no tools</span></div>
</div>
<div class="node purple">
<h3>generate_chart_report</h3>
<p>生成 Markdown 报告。</p>
<div class="meta"><span class="mini">no chart image claim</span></div>
</div>
</div>
<div class="note">
<strong>MGM Skill 自身有没有问题?</strong>
<p>DAG 结构是对的。真正可能有问题的是 <code>use_skill: "web-operation"</code> 如果环境里没有这个 exact Skill会走 fallback。更稳的写法是绑定当前实际存在的搜索 Skill或者只保留 <code>skill_query</code></p>
</div>
</div>
<div class="card span-5">
<div class="title-row">
<h2>坏案例:韩国队任务</h2>
<span class="badge red">Skill 没有 Team 模板</span>
</div>
<div class="lane">
<div class="lane-title">读到的 Skill</div>
<div class="lane-body">
<span class="pill">multi-search-engine</span>
<span class="arrow"></span>
<span class="pill">只是搜索指导</span>
<span class="arrow"></span>
<span class="pill">没有 beaver-team-template</span>
</div>
</div>
<div class="lane">
<div class="lane-title">Planner 产出的坏 DAG</div>
<div class="lane-body">
<span class="pill">strategy=parallel</span>
<span class="arrow"></span>
<span class="pill">collect</span>
<span class="pill">analyze_tactics</span>
<span class="pill">analyze_players</span>
<span class="pill">analyze_media</span>
</div>
</div>
<div class="lane">
<div class="lane-title">实际加载后</div>
<div class="lane-body">
<span class="pill">4 个节点同时 ready</span>
<span class="arrow"></span>
<span class="pill">分析节点没等 collect</span>
<span class="arrow"></span>
<span class="pill">没有上游 evidence</span>
</div>
</div>
<div class="compare">
<div class="box green">
<h3>collect 节点</h3>
<p>有搜索 Skill有工具真的查了。</p>
<div class="meta"><span class="mini">tool_count > 0</span></div>
</div>
<div class="box red">
<h3>analyze 节点</h3>
<p>说“基于搜索结果”,但没有依赖 collect。</p>
<div class="meta"><span class="mini">容易模拟</span><span class="mini">容易空写</span></div>
</div>
</div>
</div>
<div class="card span-12">
<div class="title-row">
<h2>坏 DAG 的真实形状</h2>
<span class="badge red">问题在图,不在总结</span>
</div>
<div class="compare">
<div class="code-card small">
<div class="code-head">Main Agent / Planner 错误输出</div>
<pre>{
"strategy": "parallel",
"nodes": [
{"node_id": "collect", "task": "搜索韩国队表现"},
{"node_id": "analyze_tactics", "task": "基于搜索结果分析战术"},
{"node_id": "analyze_players", "task": "基于搜索结果分析球员"},
{"node_id": "analyze_media", "task": "基于搜索结果分析媒体"}
]
}</pre>
</div>
<div class="code-card small">
<div class="code-head">应该修成这样</div>
<pre>{
"strategy": "dag",
"nodes": [
{"node_id": "collect", "task": "搜索韩国队表现"},
{"node_id": "analyze_tactics", "depends_on": ["collect"]},
{"node_id": "analyze_players", "depends_on": ["collect"]},
{"node_id": "analyze_media", "depends_on": ["collect"]},
{"node_id": "synthesize", "depends_on": [
"analyze_tactics", "analyze_players", "analyze_media"
]}
]
}</pre>
</div>
</div>
</div>
</section>
</article>
<article class="page" id="content2">
<section class="grid">
<div class="card span-12">
<div class="title-row">
<h2>如果 Main Agent 要输出 Team它到底该输出什么</h2>
<span class="badge blue">run_agent_team 参数</span>
</div>
<p>Main Agent 不输出“角色”。它输出 <code>run_agent_team</code> 的 JSON 参数:<code>strategy</code> + <code>nodes</code> + <code>depends_on</code></p>
</div>
<div class="card span-6">
<div class="title-row"><h2>类型 1顺序流水线</h2><span class="badge green">A → B → C</span></div>
<div class="line-flow">
<div class="node blue"><h3>collect</h3><p>先拿资料。</p></div>
<div class="node green"><h3>extract</h3><p>再提取。</p></div>
<div class="node purple"><h3>report</h3><p>最后输出。</p></div>
</div>
<div class="code-card small" style="margin-top:12px">
<div class="code-head">Main Agent 应输出</div>
<pre>{
"strategy": "dag",
"nodes": [
{"node_id": "collect", "task": "收集资料"},
{"node_id": "extract", "task": "提取指标", "depends_on": ["collect"]},
{"node_id": "report", "task": "生成报告", "depends_on": ["extract"]}
]
}</pre>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>类型 2真正并行</h2><span class="badge green">互不依赖</span></div>
<div class="line-flow">
<div class="node blue"><h3>source_a</h3><p>独立来源 A。</p></div>
<div class="node blue"><h3>source_b</h3><p>独立来源 B。</p></div>
<div class="node blue"><h3>source_c</h3><p>独立来源 C。</p></div>
</div>
<div class="code-card small" style="margin-top:12px">
<div class="code-head">Main Agent 应输出</div>
<pre>{
"strategy": "parallel",
"nodes": [
{"node_id": "source_a", "task": "查官方公告"},
{"node_id": "source_b", "task": "查媒体报道"},
{"node_id": "source_c", "task": "查数据网站"}
]
}</pre>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>类型 3先 collect再并行分析</h2><span class="badge amber">最常见</span></div>
<div class="parallel">
<div class="node blue"><h3>collect</h3><p>统一事实池。</p></div>
<div class="join"></div>
<div class="stack">
<div class="node green"><h3>analyze_a</h3><p>角度 A。</p></div>
<div class="node green"><h3>analyze_b</h3><p>角度 B。</p></div>
<div class="node green"><h3>analyze_c</h3><p>角度 C。</p></div>
</div>
<div class="join"></div>
<div class="node purple"><h3>synthesize</h3><p>合并。</p></div>
</div>
<div class="code-card small" style="margin-top:12px">
<div class="code-head">Main Agent 应输出</div>
<pre>{
"strategy": "dag",
"nodes": [
{"node_id": "collect", "task": "收集事实材料"},
{"node_id": "analyze_a", "depends_on": ["collect"]},
{"node_id": "analyze_b", "depends_on": ["collect"]},
{"node_id": "analyze_c", "depends_on": ["collect"]},
{"node_id": "synthesize", "depends_on": ["analyze_a", "analyze_b", "analyze_c"]}
]
}</pre>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>类型 4带校验门的报告</h2><span class="badge amber">finance 常用</span></div>
<div class="line-flow">
<div class="node blue"><h3>collect</h3><p>来源。</p></div>
<div class="node green"><h3>extract</h3><p>指标。</p></div>
<div class="node amber"><h3>validate</h3><p>校验。</p></div>
<div class="node purple"><h3>report</h3><p>报告。</p></div>
</div>
<div class="code-card small" style="margin-top:12px">
<div class="code-head">Main Agent 应输出</div>
<pre>{
"strategy": "dag",
"nodes": [
{"node_id": "collect", "required_evidence": ["tool_result", "url"], "block_downstream_on_partial": true},
{"node_id": "extract", "depends_on": ["collect"], "block_downstream_on_partial": true},
{"node_id": "validate", "depends_on": ["extract"], "requested_tools": []},
{"node_id": "report", "depends_on": ["validate"], "requested_tools": []}
]
}</pre>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>输出规则:不要输出这些</h2><span class="badge red">错误格式</span></div>
<div class="row three">
<div class="verdict"><span class="mark bad">×</span><p>不要输出 <code>agent.role = researcher / writer / reviewer</code></p></div>
<div class="verdict"><span class="mark bad">×</span><p>不要把“基于搜索结果”的节点放到 parallel 里。</p></div>
<div class="verdict"><span class="mark bad">×</span><p>不要让最终节点再调用工具,除非明确需要。</p></div>
</div>
</div>
</section>
</article>
<article class="page" id="content3">
<section class="grid">
<div class="card span-12">
<div class="title-row">
<h2>Skill 里面的 demo 长什么样</h2>
<span class="badge blue">简化版</span>
</div>
<div class="code-card">
<div class="code-head">mgm-galaxy-financial-chart-report-safe.SKILL.md</div>
<pre>---
name: mgm-galaxy-financial-chart-report-safe
tools:
- web_search
- web_fetch
---
```beaver-team-template
{
"strategy": "dag",
"nodes": [
{
"node_id": "collect_official_sources",
"task": "Collect official MGM and Galaxy financial disclosures.",
"use_skill": "web-operation",
"skill_query": "official financial disclosure web research",
"requested_tools": ["web_search", "web_fetch"],
"required_evidence": ["tool_result", "url"],
"block_downstream_on_partial": true
},
{
"node_id": "extract_financial_metrics",
"task": "Extract comparable metrics from collected official sources.",
"depends_on": ["collect_official_sources"],
"requested_tools": ["web_fetch"],
"block_downstream_on_partial": true
},
{
"node_id": "validate_metrics",
"task": "Validate period, currency, unit, and source consistency.",
"depends_on": ["extract_financial_metrics"],
"requested_tools": []
},
{
"node_id": "generate_chart_report",
"task": "Generate Markdown table and chart-ready data.",
"depends_on": ["validate_metrics"],
"requested_tools": []
}
]
}
```</pre>
</div>
</div>
<div class="card span-7">
<div class="title-row"><h2>加载链路:谁把 Skill 变成 DAG</h2><span class="badge green">实际责任人</span></div>
<div class="lane">
<div class="lane-title">1. Skill Catalog</div>
<div class="lane-body">
<span class="pill">读 SKILL.md</span><span class="arrow"></span><span class="pill">解析 beaver-team-template</span><span class="arrow"></span><span class="pill">SkillRecord.team_template</span>
</div>
</div>
<div class="lane">
<div class="lane-title">2. Context Builder</div>
<div class="lane-body">
<span class="pill">SkillRecord</span><span class="arrow"></span><span class="pill">SkillContext.team_template</span><span class="arrow"></span><span class="pill">给 Planner / Main Agent 看</span>
</div>
</div>
<div class="lane">
<div class="lane-title">3. Main Agent</div>
<div class="lane-body">
<span class="pill">看到 primary template</span><span class="arrow"></span><span class="pill">选择 run_agent_team</span><span class="arrow"></span><span class="pill">传 task-only JSON</span>
</div>
</div>
<div class="lane">
<div class="lane-title">4. Planner</div>
<div class="lane-body">
<span class="pill">校验 JSON</span><span class="arrow"></span><span class="pill">构造 ExecutionGraph</span><span class="arrow"></span><span class="pill">每个 node 是 generic worker</span>
</div>
</div>
<div class="lane">
<div class="lane-title">5. Scheduler</div>
<div class="lane-body">
<span class="pill">按 depends_on 找 ready node</span><span class="arrow"></span><span class="pill">创建 DelegationEnvelope</span><span class="arrow"></span><span class="pill">LocalAgentRunner 执行</span>
</div>
</div>
</div>
<div class="card span-5">
<div class="title-row"><h2>每个子 Agent 怎么选 Skill</h2><span class="badge amber">优先级</span></div>
<div class="line-flow" style="display:grid">
<div class="node green">
<h3>第一优先use_skill</h3>
<p>精确绑定。比如 <code>use_skill: "web-operation"</code></p>
</div>
<div class="node amber">
<h3>第二优先skill_query</h3>
<p>exact 找不到,就按 query 动态找。</p>
</div>
<div class="node blue">
<h3>第三优先node task</h3>
<p>query 也不行,就用节点任务文本找。</p>
</div>
<div class="node purple">
<h3>最后兜底ephemeral guidance</h3>
<p>没有合适 Skill也不 hard fail继续跑。</p>
</div>
</div>
<div class="note">
<strong>为什么 MGM 仍可能不稳?</strong>
<p>如果 Steven 里没有 <code>web-operation</code>collect 节点不会 exact bind只能 fallback。DAG 没错,但 Skill 绑定名需要和真实环境对齐。</p>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>复杂 DAG 怎么办:不是只能一条线</h2><span class="badge purple">多阶段 DAG</span></div>
<div class="parallel">
<div class="node blue">
<h3>collect_base</h3>
<p>先拿共同材料。</p>
</div>
<div class="join"></div>
<div class="stack">
<div class="node green"><h3>analyze_market</h3><p>市场角度。</p></div>
<div class="node green"><h3>analyze_finance</h3><p>财务角度。</p></div>
<div class="node green"><h3>analyze_risk</h3><p>风险角度。</p></div>
</div>
<div class="join"></div>
<div class="stack">
<div class="node amber"><h3>merge_findings</h3><p>合并。</p></div>
<div class="node amber"><h3>validate_claims</h3><p>校验。</p></div>
<div class="node purple"><h3>final_report</h3><p>输出。</p></div>
</div>
</div>
<div class="code-card small" style="margin-top:12px">
<div class="code-head">复杂 DAG 的关键不是 strategy 名字,而是 depends_on</div>
<pre>[
{"node_id": "collect_base"},
{"node_id": "analyze_market", "depends_on": ["collect_base"]},
{"node_id": "analyze_finance", "depends_on": ["collect_base"]},
{"node_id": "analyze_risk", "depends_on": ["collect_base"]},
{"node_id": "merge_findings", "depends_on": ["analyze_market", "analyze_finance", "analyze_risk"]},
{"node_id": "validate_claims", "depends_on": ["merge_findings"]},
{"node_id": "final_report", "depends_on": ["validate_claims"]}
]</pre>
</div>
</div>
</section>
</article>
<article class="page" id="content4">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>先别记术语,只看四类错误</h2><span class="badge red">从左到右定位</span></div>
<div class="line-flow">
<div class="node red">
<h3>1. 图错了</h3>
<p>DAG 依赖关系错。</p>
<div class="meta"><span class="mini">韩国队 case</span></div>
</div>
<div class="node amber">
<h3>2. Skill 没绑上</h3>
<p>use_skill 不存在,工具没装出来。</p>
<div class="meta"><span class="mini">web-operation miss</span></div>
</div>
<div class="node amber">
<h3>3. 节点输出不合格</h3>
<p>没证据、raw tool call、模拟搜索。</p>
<div class="meta"><span class="mini">partial / failed</span></div>
</div>
<div class="node red">
<h3>4. 最终总结跑偏</h3>
<p>Team 已完成,但总结又说“我将启动 Team”。</p>
<div class="meta"><span class="mini">fake final</span></div>
</div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>当前已经有的机制</h2><span class="badge green">已有</span></div>
<div class="simple-table">
<div class="table-row">
<div class="cell head">问题</div>
<div class="cell head">系统怎么处理</div>
<div class="cell head">结果</div>
</div>
<div class="table-row">
<div class="cell">Planner JSON 格式错</div>
<div class="cell">repair 一次</div>
<div class="cell">还错就 fallback single</div>
</div>
<div class="table-row">
<div class="cell">use_skill 找不到</div>
<div class="cell">fallback 到 skill_query</div>
<div class="cell">不直接 hard fail</div>
</div>
<div class="table-row">
<div class="cell">工具不在 allowed_tool_names</div>
<div class="cell">AgentLoop 过滤 + ToolExecutor 二次拒绝</div>
<div class="cell">工具不可用</div>
</div>
<div class="table-row">
<div class="cell">required_evidence 缺失</div>
<div class="cell">节点 partial / success=false</div>
<div class="cell">按 block 设置决定是否阻断</div>
</div>
<div class="table-row">
<div class="cell">finalized 还是 raw tool call</div>
<div class="cell">不能标 succeeded</div>
<div class="cell">节点 failed</div>
</div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>还应该补的机制</h2><span class="badge amber">下一步重点</span></div>
<div class="simple-table">
<div class="table-row">
<div class="cell head">问题</div>
<div class="cell head">应该怎么处理</div>
<div class="cell head">为什么</div>
</div>
<div class="table-row">
<div class="cell">“基于搜索结果”的节点没有 depends_on</div>
<div class="cell">Planner repair DAG</div>
<div class="cell">坏图不能执行</div>
</div>
<div class="table-row">
<div class="cell">parallel 用错</div>
<div class="cell">改成 dag / safe sequence</div>
<div class="cell">防止分析节点空跑</div>
</div>
<div class="table-row">
<div class="cell">节点声称搜索但 tool_count=0</div>
<div class="cell">判 partial 或 retry node</div>
<div class="cell">防止“模拟搜索”成功</div>
</div>
<div class="table-row">
<div class="cell">final synthesis 输出“我将启动 Team”</div>
<div class="cell">判失败并重试一次总结</div>
<div class="cell">Team 已经跑完,不能再规划</div>
</div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>一条错误从哪里冒出来,就在哪里处理</h2><span class="badge blue">定位图</span></div>
<div class="lane">
<div class="lane-title">DAG 生成阶段</div>
<div class="lane-body">
<span class="pill">字段错</span><span class="arrow"></span><span class="pill">repair</span><span class="arrow"></span><span class="pill">fallback</span>
<span class="pill">依赖错</span><span class="arrow"></span><span class="pill">repair DAG</span><span class="arrow"></span><span class="pill">禁止执行坏图</span>
</div>
</div>
<div class="lane">
<div class="lane-title">节点执行阶段</div>
<div class="lane-body">
<span class="pill">Skill miss</span><span class="arrow"></span><span class="pill">skill_query</span><span class="arrow"></span><span class="pill">ephemeral guidance</span>
<span class="pill">工具 denied</span><span class="arrow"></span><span class="pill">node failed</span>
</div>
</div>
<div class="lane">
<div class="lane-title">证据判断阶段</div>
<div class="lane-body">
<span class="pill">required_evidence 满足</span><span class="arrow"></span><span class="pill">succeeded</span>
<span class="pill">缺证据</span><span class="arrow"></span><span class="pill">partial</span>
<span class="pill">block=true</span><span class="arrow"></span><span class="pill">阻断下游</span>
</div>
</div>
<div class="lane">
<div class="lane-title">最终输出阶段</div>
<div class="lane-body">
<span class="pill">required 节点全成功</span><span class="arrow"></span><span class="pill">complete</span>
<span class="pill">required 节点有 partial/failed</span><span class="arrow"></span><span class="pill">incomplete</span>
<span class="pill">输出又开始规划</span><span class="arrow"></span><span class="pill">应该重试总结</span>
</div>
</div>
</div>
</section>
</article>
<article class="page" id="content5">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>Swarms 是怎么工作的</h2><span class="badge blue">先选工作流,再跑 Agent</span></div>
<div class="line-flow">
<div class="node blue"><h3>1. 先定义 Agent</h3><p>每个 Agent 有名字、系统提示词、工具、模型。</p><div class="meta"><span class="mini">Agent = worker</span></div></div>
<div class="node green"><h3>2. 再选择 Workflow</h3><p>顺序、并行、图、群聊、层级等。</p><div class="meta"><span class="mini">workflow first</span></div></div>
<div class="node amber"><h3>3. 明确连接关系</h3><p>谁先跑、谁依赖谁、谁把结果给谁。</p><div class="meta"><span class="mini">edges / flow</span></div></div>
<div class="node purple"><h3>4. Runtime 执行</h3><p>按 workflow 调度,不靠模型临场猜顺序。</p><div class="meta"><span class="mini">orchestration</span></div></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>Swarms 常见多步形态</h2><span class="badge green">workflow shapes</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">类型</div><div class="cell head">关系</div><div class="cell head">适合</div></div>
<div class="table-row"><div class="cell">SequentialWorkflow</div><div class="cell">A → B → C</div><div class="cell">一步接一步的流水线</div></div>
<div class="table-row"><div class="cell">ConcurrentWorkflow</div><div class="cell">A ∥ B ∥ C</div><div class="cell">互不依赖的并行任务</div></div>
<div class="table-row"><div class="cell">AgentRearrange</div><div class="cell">agent1 → agent2 → agent3</div><div class="cell">用字符串表达 agent 流向</div></div>
<div class="table-row"><div class="cell">GraphWorkflow</div><div class="cell">节点 + 边</div><div class="cell">复杂 DAG拓扑调度</div></div>
<div class="table-row"><div class="cell">Mixture / Group / Hierarchical</div><div class="cell">多个 Agent 协作或分层</div><div class="cell">讨论、投票、管理者分派</div></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>多步怎么表达</h2><span class="badge amber">不是一句 prompt</span></div>
<div class="parallel">
<div class="node blue"><h3>Agent A</h3><p>收集事实。</p></div>
<div class="join"></div>
<div class="stack">
<div class="node green"><h3>Agent B</h3><p>分析视角 1。</p></div>
<div class="node green"><h3>Agent C</h3><p>分析视角 2。</p></div>
<div class="node green"><h3>Agent D</h3><p>分析视角 3。</p></div>
</div>
<div class="join"></div>
<div class="node purple"><h3>Agent E</h3><p>合并总结。</p></div>
</div>
<div class="note"><strong>关键点</strong><p>Swarms 的强项不是“提示词更神”,而是把多 Agent 的关系做成显式 workflow。模型负责单步任务框架负责调度关系。</p></div>
</div>
<div class="card span-12">
<div class="title-row"><h2>Swarms 思路对 Beaver 的启发</h2><span class="badge purple">拿 workflow不拿固定角色</span></div>
<div class="row four">
<div class="verdict"><span class="mark ok"></span><p>保留 Beaver 的 generic worker不必变成 researcher/writer/reviewer。</p></div>
<div class="verdict"><span class="mark ok"></span><p>学习 Swarms 的显式 workflowsequence / parallel / graph / hierarchy。</p></div>
<div class="verdict"><span class="mark warn">!</span><p>不要让 LLM 自由猜 DAG让它选择 workflow shape 或填槽。</p></div>
<div class="verdict"><span class="mark ok"></span><p>Runtime 根据结构执行LLM 只负责节点内完成任务。</p></div>
</div>
</div>
</section>
</article>
<article class="page" id="content6">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>我们和 Swarms 的差别</h2><span class="badge amber">现在的问题在这里</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">维度</div><div class="cell head">Swarms</div><div class="cell head">Beaver 当前</div></div>
<div class="table-row"><div class="cell">工作流来源</div><div class="cell">开发者显式选择 workflow</div><div class="cell">Planner / Main Agent 临场生成 JSON</div></div>
<div class="table-row"><div class="cell">Agent 定义</div><div class="cell">通常是具名 Agent + 角色/工具</div><div class="cell">generic workerrole 为空</div></div>
<div class="table-row"><div class="cell">依赖关系</div><div class="cell">flow / edge 是一等公民</div><div class="cell"><code>depends_on</code> 只是字段,提示不够强</div></div>
<div class="table-row"><div class="cell">复杂多步</div><div class="cell">GraphWorkflow / AgentRearrange</div><div class="cell">让 LLM 自己写 DAG容易写错</div></div>
<div class="table-row"><div class="cell">Skill</div><div class="cell">不是核心概念</div><div class="cell">Skill 是 Beaver 的优势:可提供模板、工具、约束</div></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>Beaver 做对的地方</h2><span class="badge green">保留</span></div>
<div class="line-flow" style="display:grid">
<div class="node green"><h3>Skill-first</h3><p>用户不用懂 Agent 架构Skill 可以携带业务模板。</p></div>
<div class="node green"><h3>Generic worker</h3><p>不把产品锁死在固定 researcher/writer 角色。</p></div>
<div class="node green"><h3>工具安全上限</h3><p><code>allowed_tool_names</code> 可以限制节点越权。</p></div>
<div class="node green"><h3>Evidence gate</h3><p>节点是否完成可以和证据绑定。</p></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>Beaver 当前缺的地方</h2><span class="badge red">要补</span></div>
<div class="line-flow" style="display:grid">
<div class="node red"><h3>Workflow shape 不明确</h3><p>没有先选 sequence / collect-then-parallel / graph。</p></div>
<div class="node red"><h3>depends_on 语义没教</h3><p>prompt 只列字段,没有规则。</p></div>
<div class="node red"><h3>坏 DAG 没被拦</h3><p>parallel 用错也会执行。</p></div>
<div class="node red"><h3>final synthesis 不够硬</h3><p>Team 已跑完还可能输出“我要启动 Team”。</p></div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>正确定位</h2><span class="badge blue">Beaver ≠ 复制 Swarms</span></div>
<div class="lane">
<div class="lane-title">不要变成</div>
<div class="lane-body"><span class="pill">固定角色 Agent 库</span><span class="arrow">+</span><span class="pill">用户手写 workflow</span><span class="arrow">+</span><span class="pill">没有 Skill 语义</span></div>
</div>
<div class="lane">
<div class="lane-title">应该变成</div>
<div class="lane-body"><span class="pill">Skill Template</span><span class="arrow">+</span><span class="pill">Generic Worker</span><span class="arrow">+</span><span class="pill">显式 Workflow Shape</span><span class="arrow">+</span><span class="pill">Runtime 校验 DAG</span></div>
</div>
</div>
</section>
</article>
<article class="page" id="content7">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>我们现在明确要做什么</h2><span class="badge green">本地 MCP Workflow 工具</span></div>
<div class="line-flow">
<div class="node blue"><h3>1. Main Agent</h3><p>不再手写复杂 DAG。它只选择一个 workflow 工具。</p><div class="meta"><span class="mini">Sequential / Concurrent / Graph...</span></div></div>
<div class="node green"><h3>2. 本地 MCP Server</h3><p>永远本地加载,专门暴露 Team Workflow tools。</p><div class="meta"><span class="mini">local_team_workflow_mcp</span></div></div>
<div class="node amber"><h3>3. Workflow Tool</h3><p>每个 workflow 单独一个 Python 实现文件。</p><div class="meta"><span class="mini">sequential.py / graph.py...</span></div></div>
<div class="node purple"><h3>4. Beaver Runtime</h3><p>工具内部生成现有 ExecutionGraph再交给 Scheduler 跑。</p><div class="meta"><span class="mini">不新增 Team runtime</span></div></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>最终调用模型</h2><span class="badge blue">workflow = tool</span></div>
<div class="lane">
<div class="lane-title">Agent 看到</div>
<div class="lane-body"><span class="pill">SequentialWorkflow</span><span class="pill">ConcurrentWorkflow</span><span class="pill">GraphWorkflow</span><span class="pill">MixtureOfAgents</span></div>
</div>
<div class="lane">
<div class="lane-title">Agent 填写</div>
<div class="lane-body"><span class="pill">task</span><span class="arrow">+</span><span class="pill">agents[]</span><span class="arrow">+</span><span class="pill">每个 agent 的 instruction / skill_query</span></div>
</div>
<div class="lane">
<div class="lane-title">工具负责</div>
<div class="lane-body"><span class="pill">生成 depends_on</span><span class="arrow"></span><span class="pill">校验结构</span><span class="arrow"></span><span class="pill">启动 Team</span></div>
</div>
<div class="note"><strong>关键变化</strong><p>不是一个 <code>run_swarm_workflow(architecture=...)</code> 大工具;而是每种 architecture 自己就是一个工具。这样工具 schema 更短LLM 更容易选对。</p></div>
</div>
<div class="card span-6">
<div class="title-row"><h2>建议工具清单</h2><span class="badge blue">MCP tools</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">工具</div><div class="cell head">Agent 必填什么</div><div class="cell head">系统怎么连</div></div>
<div class="table-row"><div class="cell">SequentialWorkflow</div><div class="cell">agents[]</div><div class="cell">按顺序 A → B → C</div></div>
<div class="table-row"><div class="cell">ConcurrentWorkflow</div><div class="cell">agents[]</div><div class="cell">全部并行,无依赖</div></div>
<div class="table-row"><div class="cell">MixtureOfAgents</div><div class="cell">agents[], aggregator</div><div class="cell">并行专家 → 聚合者</div></div>
<div class="table-row"><div class="cell">AgentRearrange</div><div class="cell">agents[], flow</div><div class="cell">解析 flow 字符串</div></div>
<div class="table-row"><div class="cell">GraphWorkflow</div><div class="cell">agents[], edges[], output_agent</div><div class="cell">严格按 edges 执行</div></div>
<div class="table-row"><div class="cell">GroupChat</div><div class="cell">agents[], rounds</div><div class="cell">多轮讨论后汇总</div></div>
<div class="table-row"><div class="cell">HierarchicalSwarm</div><div class="cell">manager, agents[]</div><div class="cell">manager 分派和汇总</div></div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>完整运行链路</h2><span class="badge purple">保持 Beaver 现有 runtime</span></div>
<div class="lane">
<div class="lane-title">工具加载</div>
<div class="lane-body"><span class="pill">config loader</span><span class="arrow"></span><span class="pill">local_team_workflow_mcp</span><span class="arrow"></span><span class="pill">MCPToolWrapper</span><span class="arrow"></span><span class="pill">AgentLoop tools</span></div>
</div>
<div class="lane">
<div class="lane-title">用户任务</div>
<div class="lane-body"><span class="pill">Main Agent</span><span class="arrow"></span><span class="pill">选择 Workflow tool</span><span class="arrow"></span><span class="pill">填写 agents</span><span class="arrow"></span><span class="pill">tool 生成 ExecutionGraph</span></div>
</div>
<div class="lane">
<div class="lane-title">执行</div>
<div class="lane-body"><span class="pill">TeamService</span><span class="arrow"></span><span class="pill">Scheduler</span><span class="arrow"></span><span class="pill">LocalAgentRunner</span><span class="arrow"></span><span class="pill">Evidence / synthesis</span></div>
</div>
</div>
</section>
</article>
<article class="page" id="content8">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>代码放哪里、改哪些文件</h2><span class="badge blue">implementation map</span></div>
<div class="line-flow">
<div class="node blue"><h3>配置层</h3><p>把 workflow MCP 加入永远加载的本地 MCP 列表。</p><div class="meta"><span class="mini">foundation/config/loader.py</span></div></div>
<div class="node green"><h3>MCP 层</h3><p>tools_server 增加 team_workflow category。</p><div class="meta"><span class="mini">interfaces/mcp/tools_server.py</span></div></div>
<div class="node amber"><h3>Workflow 层</h3><p>每个 workflow 一个 Python 文件。</p><div class="meta"><span class="mini">beaver/team_workflows/*.py</span></div></div>
<div class="node purple"><h3>Runtime 层</h3><p>复用 ExecutionGraph / Scheduler / LocalAgentRunner。</p><div class="meta"><span class="mini">不新增 runtime</span></div></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>新增目录</h2><span class="badge green">workflow implementations</span></div>
<div class="code-card small">
<div class="code-head">new package</div>
<pre>app-instance/backend/beaver/team_workflows/
__init__.py
base.py
mcp_tools.py
sequential.py
concurrent.py
mixture_of_agents.py
agent_rearrange.py
graph.py
group_chat.py
hierarchical.py</pre>
</div>
<div class="note"><strong>设计原则</strong><p><code>base.py</code> 放公共 WorkerSpec、schema 解析、ExecutionNode 构造、图校验;每个 workflow 文件只实现自己的连线规则。</p></div>
</div>
<div class="card span-6">
<div class="title-row"><h2>修改现有文件</h2><span class="badge amber">integration points</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">文件</div><div class="cell head">改动</div></div>
<div class="table-row"><div class="cell">foundation/config/loader.py</div><div class="cell">新增 <code>local_team_workflow_mcp</code>,永远本地加载</div></div>
<div class="table-row"><div class="cell">interfaces/mcp/tools_server.py</div><div class="cell">新增 <code>team_workflow</code> category返回 workflow tools</div></div>
<div class="table-row"><div class="cell">tools/mcp/wrapper.py</div><div class="cell">原则上不改;继续包装 MCP tools</div></div>
<div class="table-row"><div class="cell">tools/builtins/agent_team.py</div><div class="cell">原则上不改workflow tool 复用同一 TeamService 路径</div></div>
<div class="table-row"><div class="cell">coordinator/*</div><div class="cell">原则上不改;继续执行 ExecutionGraph</div></div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>每个 workflow 文件怎么做</h2><span class="badge purple">file responsibilities</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">文件</div><div class="cell head">职责</div><div class="cell head">连线规则</div></div>
<div class="table-row"><div class="cell">sequential.py</div><div class="cell">SequentialWorkflow</div><div class="cell">agents[i] 依赖 agents[i-1]</div></div>
<div class="table-row"><div class="cell">concurrent.py</div><div class="cell">ConcurrentWorkflow</div><div class="cell">所有 agents 无依赖并行</div></div>
<div class="table-row"><div class="cell">mixture_of_agents.py</div><div class="cell">MixtureOfAgents</div><div class="cell">所有专家 → aggregator</div></div>
<div class="table-row"><div class="cell">agent_rearrange.py</div><div class="cell">AgentRearrange</div><div class="cell">解析 <code>flow</code>,再生成边</div></div>
<div class="table-row"><div class="cell">graph.py</div><div class="cell">GraphWorkflow</div><div class="cell"><code>edges[]</code> 必填,严格校验无环和引用</div></div>
<div class="table-row"><div class="cell">group_chat.py</div><div class="cell">GroupChat</div><div class="cell">v1 可先不做,或 rounds → 顺序轮次</div></div>
<div class="table-row"><div class="cell">hierarchical.py</div><div class="cell">HierarchicalSwarm</div><div class="cell">v2manager 分派 workers 后汇总</div></div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>本地 MCP Server 包装方式</h2><span class="badge green">always loaded</span></div>
<div class="code-card">
<div class="code-head">loading path</div>
<pre>foundation/config/loader.py
→ LOCAL_MCP_CATEGORIES["local_team_workflow_mcp"] = {"category": "team_workflow", ...}
→ python -m beaver.interfaces.mcp.tools_server --category team_workflow
→ tools_server._category_tools("team_workflow")
→ beaver.team_workflows.mcp_tools.create_team_workflow_tools()
→ MCPToolWrapper exposes tools to AgentLoop</pre>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>边界范围</h2><span class="badge red">明确不做什么</span></div>
<div class="row two">
<div class="verdict"><span class="mark ok"></span><p>做:本地 MCP workflow tools、每个 workflow 单独 py、args → ExecutionGraph、复用 TeamService/Scheduler。</p></div>
<div class="verdict"><span class="mark bad">×</span><p>不做:新 Team runtime、固定角色 Agent registry、nested Team、前端改造、chart renderer、高风险审批 UI。</p></div>
</div>
<div class="note"><strong>Planner 的位置</strong><p>Planner 可以继续作为兼容路径存在,但不再是 Agent Team 成败的核心入口。主路径是 Main Agent 在 AgentLoop 中调用具体 workflow MCP tool。</p></div>
</div>
</section>
</article>
<article class="page" id="content9">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>最终定稿:每个 Team Workflow 本身就是一个工具</h2><span class="badge green">workflow = tool</span></div>
<div class="line-flow">
<div class="node blue"><h3>Main Agent</h3><p>只负责选哪个 workflow 工具。</p><div class="meta"><span class="mini">SequentialWorkflow / GraphWorkflow...</span></div></div>
<div class="node green"><h3>填 agents</h3><p>args 主要是 agents / instruction / skill_query。</p><div class="meta"><span class="mini">不是手写自由 DAG</span></div></div>
<div class="node amber"><h3>Workflow 工具</h3><p>根据自己的规则生成 ExecutionGraph。</p><div class="meta"><span class="mini">内部生成 depends_on</span></div></div>
<div class="node purple"><h3>Scheduler</h3><p>执行 Graph收集 evidence最终总结。</p><div class="meta"><span class="mini">runtime owns orchestration</span></div></div>
</div>
</div>
<div class="card span-6">
<div class="title-row"><h2>SequentialWorkflow 工具</h2><span class="badge blue">agents 顺序就是执行顺序</span></div>
<div class="code-card small">
<div class="code-head">tool call</div>
<pre>{
"tool": "SequentialWorkflow",
"arguments": {
"task": "比较 MGM China 和 Galaxy Entertainment输出中文财务报告",
"agents": [
{"name": "source_collector", "instruction": "收集官方财务披露来源"},
{"name": "metric_extractor", "instruction": "提取收入、EBITDA、净利润等指标"},
{"name": "validator", "instruction": "校验来源、周期、币种、单位"},
{"name": "reporter", "instruction": "生成 Markdown 报告和 chart-ready data"}
]
}
}</pre>
</div>
<div class="note"><strong>工具内部生成</strong><p><code>source_collector → metric_extractor → validator → reporter</code>。Main Agent 不需要写 <code>depends_on</code></p></div>
</div>
<div class="card span-6">
<div class="title-row"><h2>ConcurrentWorkflow 工具</h2><span class="badge green">agents 全部并行</span></div>
<div class="code-card small">
<div class="code-head">tool call</div>
<pre>{
"tool": "ConcurrentWorkflow",
"arguments": {
"task": "从多个独立来源调研同一主题",
"agents": [
{"name": "official_sources", "instruction": "查官方来源"},
{"name": "media_sources", "instruction": "查媒体报道"},
{"name": "data_sources", "instruction": "查数据网站"}
]
}
}</pre>
</div>
<div class="note"><strong>工具内部生成</strong><p>所有 agents 无依赖并行执行。只有真正互不依赖的任务才用它。</p></div>
</div>
<div class="card span-12">
<div class="title-row"><h2>GraphWorkflow高级工具edges 是必填 args</h2><span class="badge red">explicit graph</span></div>
<div class="code-card">
<div class="code-head">GraphWorkflow tool call</div>
<pre>{
"tool": "GraphWorkflow",
"arguments": {
"task": "分析今天早上韩国队在世界杯上的表现,输出中文结构化报告",
"agents": [
{"name": "collector", "instruction": "收集比赛事实、比分、关键事件和可靠来源", "skill_query": "multi search sports news"},
{"name": "tactics", "instruction": "基于 collector 的结果分析战术表现"},
{"name": "players", "instruction": "基于 collector 的结果分析球员表现"},
{"name": "media", "instruction": "基于 collector 的结果分析媒体舆论"},
{"name": "synthesizer", "instruction": "合并所有分析,输出最终中文报告"}
],
"edges": [
["collector", "tactics"],
["collector", "players"],
["collector", "media"],
["tactics", "synthesizer"],
["players", "synthesizer"],
["media", "synthesizer"]
],
"output_agent": "synthesizer"
}
}</pre>
</div>
<div class="note"><strong>精确定义</strong><p>GraphWorkflow 不是让 Agent 写自然语言 flow也不是自由 DAG 文本。它是工具,<code>edges</code> 是 args schema 的必填字段runtime 必须校验无环、节点存在、output_agent 可达。</p></div>
</div>
<div class="card span-12">
<div class="title-row"><h2>每种 workflow 工具暴露什么 args</h2><span class="badge amber">schema contract</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">工具</div><div class="cell head">必填 args</div><div class="cell head">工具内部怎么连</div></div>
<div class="table-row"><div class="cell">SequentialWorkflow</div><div class="cell">task, agents[]</div><div class="cell">按 agents 顺序生成链式依赖</div></div>
<div class="table-row"><div class="cell">ConcurrentWorkflow</div><div class="cell">task, agents[]</div><div class="cell">全部并行,无依赖</div></div>
<div class="table-row"><div class="cell">MixtureOfAgents</div><div class="cell">task, agents[], aggregator</div><div class="cell">非 aggregator 并行 → aggregator</div></div>
<div class="table-row"><div class="cell">AgentRearrange</div><div class="cell">task, agents[], flow</div><div class="cell">flow 是结构参数,按工具规则解析</div></div>
<div class="table-row"><div class="cell">GraphWorkflow</div><div class="cell">task, agents[], edges[], output_agent</div><div class="cell">edges 必填runtime 严格校验</div></div>
<div class="table-row"><div class="cell">GroupChat</div><div class="cell">task, agents[], moderator/rounds</div><div class="cell">轮流发言moderator/last agent 汇总</div></div>
<div class="table-row"><div class="cell">HierarchicalSwarm</div><div class="cell">task, manager, agents[]</div><div class="cell">manager 分派workers 执行manager 汇总</div></div>
</div>
</div>
</section>
</article>
<article class="page" id="content10">
<section class="grid">
<div class="card span-12">
<div class="title-row"><h2>几种方案对比</h2><span class="badge blue">LLM 难度越低越稳</span></div>
<div class="simple-table">
<div class="table-row"><div class="cell head">方案</div><div class="cell head">LLM 要做什么</div><div class="cell head">综合判断</div></div>
<div class="table-row"><div class="cell">A. 自由输出 DAG JSON</div><div class="cell">自己判断类型、节点、依赖、工具、证据</div><div class="cell">最灵活,最容易错</div></div>
<div class="table-row"><div class="cell">B. 一个 run_swarm_workflow + architecture 参数</div><div class="cell">选 architecture + 填 agents/flow/edges</div><div class="cell">比自由 DAG 好,但工具语义不够清晰</div></div>
<div class="table-row"><div class="cell">C. Skill Template 严格驱动</div><div class="cell">只适配已有模板</div><div class="cell">业务场景最稳</div></div>
<div class="table-row"><div class="cell">D. 每个 workflow 是一个工具</div><div class="cell">选工具 + 填 agents/instructions</div><div class="cell">推荐主线;最接近 swarms architecture</div></div>
<div class="table-row"><div class="cell">E. GraphWorkflow 工具</div><div class="cell">填 agents + 必填 edges + output_agent</div><div class="cell">高级路径;显式但受 schema 约束</div></div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>10 个从简单到复杂的场景</h2><span class="badge purple">1 最简单10 最难</span></div>
<div class="row two">
<div class="scenario"><span class="score easy">1</span><div><h3>单问答</h3><p>例如“解释一下 EBITDA”。不需要 Team。最佳single_agent。</p></div></div>
<div class="scenario"><span class="score easy">2</span><div><h3>单工具查询</h3><p>例如“查今天珠海天气”。最佳single_agent + tool。</p></div></div>
<div class="scenario"><span class="score easy">3</span><div><h3>单来源总结</h3><p>给一个 URL让它总结。最佳single_agent。</p></div></div>
<div class="scenario"><span class="score easy">4</span><div><h3>多来源独立搜索</h3><p>多个来源互不依赖。最佳ConcurrentWorkflow。</p></div></div>
<div class="scenario"><span class="score mid">5</span><div><h3>先收集再多角度分析</h3><p>韩国队这类。最佳GraphWorkflow 或 AgentRearrangeedges/flow 必须表达 collector → analyses → synthesizer。</p></div></div>
<div class="scenario"><span class="score mid">6</span><div><h3>财务来源→指标→校验→报告</h3><p>MGM/Galaxy。最佳SequentialWorkflowagents 顺序生成依赖。</p></div></div>
<div class="scenario"><span class="score mid">7</span><div><h3>多轮修订任务</h3><p>用户验收失败后重跑部分节点。需要 run version + evidence reuse。</p></div></div>
<div class="scenario"><span class="score hard">8</span><div><h3>复杂 DAG并行后合并再并行</h3><p>需要显式 dependency。最佳GraphWorkflowedges 是必填 args。</p></div></div>
<div class="scenario"><span class="score hard">9</span><div><h3>需要判断证据是否充分</h3><p>需要 LLM judge / evidence contract。不能只看 finish_reason。</p></div></div>
<div class="scenario"><span class="score hard">10</span><div><h3>动态协作 / 运行中新增节点</h3><p>接近 Swarms 高级编排。需要独立设计,不应 v1 直接做。</p></div></div>
</div>
</div>
<div class="card span-12">
<div class="title-row"><h2>推荐落地路线</h2><span class="badge green">优先级</span></div>
<div class="line-flow">
<div class="node green"><h3>第一步</h3><p>把 Swarms architecture 做成工具。</p></div>
<div class="node green"><h3>第二步</h3><p>Main Agent 选择具体 workflow 工具。</p></div>
<div class="node amber"><h3>第三步</h3><p>args 主体改成 agents/instructions。</p></div>
<div class="node amber"><h3>第四步</h3><p>GraphWorkflow 暴露必填 edges/output_agent。</p></div>
<div class="node purple"><h3>第五步</h3><p>workflow 工具内部生成 ExecutionGraph。</p></div>
</div>
</div>
</section>
</article>
</section>
</main>
</body>
</html>