添加 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): 修复节点证据评估中需求验证逻辑 更新节点证据评估逻辑,跳过自然语言证据需求的确定性验证, 只执行机器可读的需求验证,避免因自然语言需求导致的节点失败。
1527 lines
71 KiB
HTML
1527 lines
71 KiB
HTML
<!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 的显式 workflow:sequence / 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 worker,role 为空</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">v2;manager 分派 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 或 AgentRearrange,edges/flow 必须表达 collector → analyses → synthesizer。</p></div></div>
|
||
<div class="scenario"><span class="score mid">6</span><div><h3>财务来源→指标→校验→报告</h3><p>MGM/Galaxy。最佳:SequentialWorkflow,agents 顺序生成依赖。</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。最佳:GraphWorkflow,edges 是必填 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>
|