Files
beaver_project/app-instance/backend/docs/architecture/project-comparison.html
steven_li 9d6cde2d23 feat: 将项目从nano重命名为beaver并更新相关配置
- 将所有环境变量前缀从NANO_改为BEAVER_
- 更新README.md文档内容,包括项目介绍、组件说明和快速开始指南
- 修改.gitignore文件,添加auth-portal运行时路径排除规则
- 更新app-instance镜像标签从nano/app-instance改为beaver/app-instance
- 增强技能安全检查器,支持工具前缀白名单功能
- 添加技能草稿重新检查安全性API端点
- 扩展证据选择器,收集工具调用名称用于技能学习
- 改进技能合成器,基于实际调用的工具生成工具提示
- 优化路由超时处理机制,增加重试逻辑
- 更新后端架构文档,添加可视化入口和基础概念说明
- 实现在WebSocket消息中传递工具迭代次数信息
2026-05-20 18:01:06 +08:00

1072 lines
49 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>Agent 项目对比分析</title>
<style>
:root {
color-scheme: light;
--bg: #f7f8fb;
--ink: #172033;
--muted: #5d6b82;
--line: #d7deea;
--panel: #ffffff;
--blue: #2563eb;
--green: #0f8b6f;
--amber: #b7791f;
--rose: #be4266;
--violet: #6953c6;
--cyan: #147d96;
--shadow: 0 14px 36px rgba(23, 32, 51, 0.08);
--radius: 8px;
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--bg);
color: var(--ink);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.45;
}
a { color: var(--blue); text-decoration: none; }
a:hover { text-decoration: underline; }
button { font: inherit; }
.page {
width: min(1540px, 100%);
margin: 0 auto;
padding: 28px 28px 40px;
}
.topbar {
display: flex;
justify-content: space-between;
gap: 20px;
align-items: flex-start;
margin-bottom: 20px;
}
h1 {
margin: 0 0 8px;
font-size: 30px;
line-height: 1.14;
letter-spacing: 0;
}
.subtitle {
margin: 0;
max-width: 900px;
color: var(--muted);
font-size: 15px;
}
.meta {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: flex-end;
color: var(--muted);
font-size: 12px;
}
.pill,
.pill-link {
border: 1px solid var(--line);
background: var(--panel);
border-radius: 999px;
padding: 6px 10px;
white-space: nowrap;
}
.pill-link {
color: var(--ink);
display: inline-flex;
align-items: center;
}
.canvas {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--radius);
box-shadow: var(--shadow);
overflow: hidden;
}
.tabs {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 14px;
border-bottom: 1px solid var(--line);
background: #fbfcff;
}
.tab {
border: 1px solid var(--line);
border-radius: 999px;
background: #fff;
color: var(--ink);
min-height: 34px;
padding: 7px 12px;
cursor: pointer;
}
.tab[aria-selected="true"] {
color: #fff;
border-color: var(--blue);
background: var(--blue);
}
.stage { display: none; padding: 22px; }
.stage.active { display: block; }
.stage-title {
display: flex;
justify-content: space-between;
gap: 16px;
align-items: flex-start;
margin-bottom: 16px;
}
h2 { margin: 0; font-size: 20px; letter-spacing: 0; }
.hint { margin: 4px 0 0; color: var(--muted); font-size: 13px; }
.cards {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 14px;
margin: 14px 0;
}
.card,
.panel,
.demo,
.source-card {
border: 1px solid var(--line);
border-radius: var(--radius);
background: #fff;
padding: 14px;
}
.card {
border-top: 5px solid var(--blue);
min-height: 230px;
}
.card.openharness { border-top-color: var(--green); }
.card.hermes { border-top-color: var(--violet); }
.card.openclaw { border-top-color: var(--cyan); }
.card.beaver { border-top-color: var(--blue); }
.card h3,
.panel h3,
.demo h3,
.source-card h3 {
margin: 0 0 8px;
font-size: 15px;
}
.card p,
.panel p,
.source-card p {
margin: 0;
color: var(--muted);
font-size: 13px;
}
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 12px;
}
.tag {
border: 1px solid #e1e7f2;
border-radius: 999px;
background: #f7f9fc;
color: #39465c;
font-size: 12px;
padding: 4px 8px;
}
.grid-2,
.grid-3,
.grid-4 {
display: grid;
gap: 14px;
margin-top: 14px;
}
.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.table-wrap {
overflow-x: auto;
border: 1px solid var(--line);
border-radius: var(--radius);
background: #fff;
margin: 14px 0;
}
table {
width: 100%;
min-width: 980px;
border-collapse: collapse;
font-size: 13px;
}
th,
td {
vertical-align: top;
text-align: left;
padding: 11px 12px;
border-bottom: 1px solid #e7edf7;
}
th {
position: sticky;
top: 0;
background: #f7f9fc;
color: #374151;
font-weight: 700;
z-index: 1;
}
tr:last-child td { border-bottom: 0; }
.code {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
font-size: 12px;
color: #24324b;
background: #f3f6fb;
border: 1px solid #e5ebf5;
border-radius: 6px;
padding: 2px 5px;
}
.diagram {
border: 1px solid var(--line);
border-radius: var(--radius);
background: #fbfcff;
padding: 14px;
margin: 14px 0;
}
.diagram-title {
margin: 0 0 12px;
font-size: 14px;
color: #374151;
}
.diagram-row {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 10px;
align-items: stretch;
}
.diagram-row.four { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.diagram-row.five { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.diagram-card {
position: relative;
border: 1px solid #dfe6f2;
border-radius: var(--radius);
background: #fff;
padding: 12px;
min-height: 92px;
}
.diagram-card:not(:last-child)::after {
content: "→";
position: absolute;
right: -10px;
top: 50%;
transform: translate(50%, -50%);
width: 22px;
height: 22px;
display: grid;
place-items: center;
border: 1px solid var(--line);
border-radius: 999px;
background: #fff;
color: var(--muted);
font-size: 14px;
z-index: 1;
}
.diagram-card strong {
display: block;
margin-bottom: 5px;
font-size: 13px;
color: var(--ink);
}
.diagram-card span {
display: block;
color: var(--muted);
font-size: 12px;
}
.demo {
margin-top: 16px;
}
.demo p {
margin: 0 0 12px;
color: var(--muted);
font-size: 13px;
}
.demo-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.demo-block { min-width: 0; }
.demo-block h4 {
margin: 0 0 6px;
font-size: 12px;
color: #374151;
}
pre {
margin: 0;
min-height: 150px;
overflow: auto;
border: 1px solid #e5ebf5;
border-radius: 6px;
background: #f7f9fc;
color: #24324b;
padding: 10px;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
font-size: 12px;
line-height: 1.45;
white-space: pre-wrap;
}
ul {
margin: 0;
padding-left: 18px;
color: var(--muted);
font-size: 13px;
}
li + li { margin-top: 6px; }
.callout {
border-left: 5px solid var(--blue);
background: #f7f9fc;
border-radius: var(--radius);
padding: 12px 14px;
color: var(--muted);
font-size: 13px;
margin: 14px 0;
}
.sources {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
margin-top: 14px;
}
.source-card a {
display: block;
font-size: 13px;
margin-top: 6px;
word-break: break-word;
}
@media (max-width: 1180px) {
.cards,
.grid-4,
.diagram-row,
.diagram-row.four,
.diagram-row.five {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.grid-3,
.demo-grid,
.sources {
grid-template-columns: 1fr;
}
}
@media (max-width: 760px) {
.page { padding: 18px; }
.topbar, .stage-title { display: block; }
.meta { justify-content: flex-start; margin-top: 14px; }
.cards,
.grid-2,
.grid-3,
.grid-4,
.diagram-row,
.diagram-row.four,
.diagram-row.five,
.demo-grid,
.sources {
grid-template-columns: 1fr;
}
.diagram-card:not(:last-child)::after {
content: "↓";
right: 50%;
top: auto;
bottom: -10px;
transform: translate(50%, 50%);
}
}
</style>
</head>
<body>
<main class="page">
<header class="topbar">
<div>
<h1>Agent 项目对比分析</h1>
<p class="subtitle">用 OpenHarness、Hermes Agent、OpenClaw 对比 Beaver面向讲解场景覆盖产品定位、架构结构、Skill、Tool、Session、Channel、权限、安全、自学习和 Agent Team。</p>
</div>
<div class="meta">
<span class="pill">Snapshot: 2026-05-20</span>
<span class="pill">来源: GitHub README + repo tree + 本地代码</span>
<a class="pill-link" href="backend-visualization.html">返回 Beaver 架构页</a>
</div>
</header>
<section class="canvas">
<nav class="tabs" aria-label="comparison views">
<button class="tab" type="button" data-view="home" aria-selected="true">首页总览</button>
<button class="tab" type="button" data-view="positioning">产品定位</button>
<button class="tab" type="button" data-view="matrix">功能矩阵</button>
<button class="tab" type="button" data-view="skills">Skill 对比</button>
<button class="tab" type="button" data-view="tools">Tool 对比</button>
<button class="tab" type="button" data-view="sessions">Session 对比</button>
<button class="tab" type="button" data-view="channels">Channel 对比</button>
<button class="tab" type="button" data-view="security">权限对比</button>
<button class="tab" type="button" data-view="teams">Team 对比</button>
<button class="tab" type="button" data-view="conclusion">结论</button>
<button class="tab" type="button" data-view="sources">来源区</button>
</nav>
<section class="stage active" data-stage="home">
<div class="stage-title">
<div>
<h2>首页总览</h2>
<p class="hint">先用四张卡片建立直觉:它们都在做 agent但产品路线和架构重心不同。</p>
</div>
</div>
<div class="diagram">
<h3 class="diagram-title">讲解目标</h3>
<div class="diagram-row five">
<div class="diagram-card"><strong>产品定位</strong><span>谁是目标用户,核心体验是什么</span></div>
<div class="diagram-card"><strong>运行架构</strong><span>入口、服务、agent loop、状态层如何分工</span></div>
<div class="diagram-card"><strong>能力子系统</strong><span>Skill、Tool、Memory、Channel、Permission</span></div>
<div class="diagram-card"><strong>差异优劣</strong><span>哪些成熟,哪些值得借鉴</span></div>
<div class="diagram-card"><strong>Beaver 位置</strong><span>解释你的项目选择的路线</span></div>
</div>
</div>
<div class="cards">
<article class="card openharness">
<h3>HKUDS/OpenHarness</h3>
<p>Agent harness 基础设施 + ohmo personal agent。适合讲“LLM 要变成 agent需要工具、技能、记忆、权限、MCP 和多 agent 外壳”。</p>
<div class="tag-list">
<span class="tag">Python</span><span class="tag">CLI / gateway / harness</span><span class="tag">MIT</span>
<span class="tag">agent loop</span><span class="tag">43+ tools</span><span class="tag">swarm</span>
</div>
</article>
<article class="card hermes">
<h3>NousResearch/hermes-agent</h3>
<p>自学习个人 agent。适合讲“长期助理如何跨会话记忆、从任务中生成技能、用多渠道和 cron 变成常驻助手”。</p>
<div class="tag-list">
<span class="tag">Python</span><span class="tag">CLI / TUI / gateway / cron</span><span class="tag">MIT</span>
<span class="tag">closed learning loop</span><span class="tag">session search</span><span class="tag">subagents</span>
</div>
</article>
<article class="card openclaw">
<h3>openclaw/openclaw</h3>
<p>Local-first 多渠道个人助手。适合讲“产品化 gateway、设备节点、消息渠道、WebChat、Canvas 和安全默认值”。</p>
<div class="tag-list">
<span class="tag">TypeScript</span><span class="tag">gateway / apps / nodes / canvas</span><span class="tag">MIT</span>
<span class="tag">multi-channel</span><span class="tag">local-first</span><span class="tag">sandbox</span>
</div>
</article>
<article class="card beaver">
<h3>Beaver</h3>
<p>单用户实例化 Web agent 工作台。适合讲“Web 管理面 + Task 工作单 + 审核型 Skill Learning + Agent Team”。</p>
<div class="tag-list">
<span class="tag">Python + Next.js</span><span class="tag">Web app + per-user instance</span>
<span class="tag">Task mode</span><span class="tag">Skill Learning</span><span class="tag">AuthZ</span>
</div>
</article>
</div>
<div class="callout">讲解建议不要先陷入代码目录。先让听众理解四条路线OpenHarness 是“基础设施”Hermes 是“自学习长期助理”OpenClaw 是“本地优先多渠道产品”Beaver 是“Web 管理 + 可审核任务工作台”。</div>
</section>
<section class="stage" data-stage="positioning">
<div class="stage-title">
<div>
<h2>产品定位</h2>
<p class="hint">这一页回答:谁会用、从哪里进入、产品强弱在哪里。</p>
</div>
</div>
<div class="grid-3">
<div class="panel">
<h3>适合谁用</h3>
<ul>
<li><strong>OpenHarness</strong>研究者、agent harness builder、CLI agent 集成开发者。</li>
<li><strong>Hermes</strong>:想要长期个人助理、自学习、多渠道自动化的个人或团队。</li>
<li><strong>OpenClaw</strong>:想要本地优先、多设备、多消息渠道个人助手的用户。</li>
<li><strong>Beaver</strong>:想要 Web 化、可部署、可管理、可审核的单用户 agent 工作台。</li>
</ul>
</div>
<div class="panel">
<h3>主体验入口</h3>
<ul>
<li><strong>OpenHarness</strong><span class="code">oh</span> / <span class="code">ohmo</span> CLI + gateway。</li>
<li><strong>Hermes</strong><span class="code">hermes</span> TUI、messaging gateway、cron。</li>
<li><strong>OpenClaw</strong><span class="code">openclaw onboard</span>、gateway、apps/nodes、WebChat、Canvas。</li>
<li><strong>Beaver</strong>auth portal -> per-user app instance -> Web chat/workbench/settings/skills/tasks。</li>
</ul>
</div>
<div class="panel">
<h3>产品优劣</h3>
<ul>
<li><strong>OpenHarness</strong>:概念清晰、基础设施强,但偏工程/框架导向。</li>
<li><strong>Hermes</strong>:自学习叙事最强,但系统面广、结构复杂。</li>
<li><strong>OpenClaw</strong>:产品触点最多,但平台集成复杂、讲架构成本高。</li>
<li><strong>Beaver</strong>Web 管理和 Task 工作流清楚,但多渠道和生态成熟度弱。</li>
</ul>
</div>
</div>
<div class="diagram">
<h3 class="diagram-title">四条路线</h3>
<div class="diagram-row four">
<div class="diagram-card"><strong>OpenHarness</strong><span>先做 agent harness再在其上做 ohmo personal agent</span></div>
<div class="diagram-card"><strong>Hermes</strong><span>先做长期助理体验,再强调自学习闭环</span></div>
<div class="diagram-card"><strong>OpenClaw</strong><span>先做 local-first gateway 和多平台触点</span></div>
<div class="diagram-card"><strong>Beaver</strong><span>先做 Web 管理、Task 工作单和审核型学习</span></div>
</div>
</div>
</section>
<section class="stage" data-stage="matrix">
<div class="stage-title">
<div>
<h2>总功能矩阵</h2>
<p class="hint">横向扫一遍能力覆盖。重点看 Beaver 的强项和短板分别落在哪些行。</p>
</div>
</div>
<div class="table-wrap">
<table>
<thead>
<tr><th>能力</th><th>OpenHarness</th><th>Hermes</th><th>OpenClaw</th><th>Beaver</th></tr>
</thead>
<tbody>
<tr><td>Agent Loop</td><td>harness 核心;强调 streaming tool-call cycle 和并行工具执行。</td><td>conversation loop 是长期助理运行核心。</td><td>agent runtime 嵌入 gateway、apps、nodes 场景。</td><td>有,统一 <span class="code">AgentLoop</span>,主 agent 和 sub-agent 共用。</td></tr>
<tr><td>Task 工作单</td><td>有 tasks 目录和 autopilot/test 迹象,但不是核心产品叙事。</td><td>有 kanban、goals、cron 等任务形态。</td><td>有 session/agent message task 形态,偏产品会话和路由。</td><td>强核心:<span class="code">TaskRecord</span>、validation、feedback、active task。</td></tr>
<tr><td>Skill 系统</td><td>bundled/user skills、frontmatter、plugin ecosystem。</td><td>optional skills、Skills Hub、self-improving skills。</td><td>workspace/bundled/managed skills、ClawHub。</td><td>versioned skill、draft/review/publish/rollback、learning candidate。</td></tr>
<tr><td>Tool 系统</td><td>43+ tools、MCP、parallel tool execution。</td><td>40+ tools、toolsets、terminal backends、RPC。</td><td>first-class tools、browser/canvas/nodes/cron/sessions。</td><td>ToolRegistry、ToolAssembler、ToolExecutor、builtins、MCP wrapper。</td></tr>
<tr><td>Memory</td><td>MEMORY.md、memdir、session memory。</td><td>agent-curated memory、FTS5 session search、user modeling。</td><td>workspace memory/session model。</td><td>curated memory、run memory、skill learning memory。</td></tr>
<tr><td>Channel/Gateway</td><td>ohmo channelsFeishu、Slack、Telegram、Discord 等。</td><td>Telegram、Discord、Slack、WhatsApp、Signal、Email gateway。</td><td>超多渠道和 device nodes。</td><td>当前主要 Web/WebSocket另有 gateway/channels 基础。</td></tr>
<tr><td>Permissions</td><td>permissions checker、sandbox、hooks。</td><td>tool guardrails、approval、terminal backend isolation。</td><td>DM allowlist、sandbox non-main sessions、security defaults。</td><td>authz integration、permission packages 还较空、MCP authz config。</td></tr>
<tr><td>Team/Sub-agent</td><td>swarm、subagent、delegation。</td><td>subagents、parallel workstreams。</td><td>multi-agent routing / isolated agents。</td><td>sequence/parallel/DAG <span class="code">ExecutionGraph</span></td></tr>
<tr><td>自学习</td><td>有 memory/skills但不是最强叙事。</td><td>closed learning loop。</td><td>有 skills registry但自学习不是主线。</td><td>candidate -> draft -> safety/eval -> review -> publish。</td></tr>
<tr><td>Web 管理面</td><td>dashboard/terminal frontend 有,但非主线。</td><td>website/web/TUI/gateway。</td><td>control UI / WebChat / Canvas。</td><td>tasks、skills、MCP、settings、files、logs。</td></tr>
</tbody>
</table>
</div>
</section>
<section class="stage" data-stage="skills">
<div class="stage-title">
<div>
<h2>Skill 装载、选择、版本和学习</h2>
<p class="hint">重点讲 Beaver 的优势:不仅能选 skill还把 skill 当成可审核、可发布、可回滚的资产。</p>
</div>
</div>
<div class="grid-4">
<div class="panel"><h3>OpenHarness</h3><ul><li>目录迹象:<span class="code">src/openharness/skills</span><span class="code">.claude/skills</span><span class="code">.agents/skills</span></li><li>形态bundled skills、agent skills、plugin skills。</li><li>优点:兼容 skill 文件生态,轻量易扩展。</li><li>短板:审核/发布工作流不如 Beaver 明确。</li></ul></div>
<div class="panel"><h3>Hermes</h3><ul><li>目录迹象:<span class="code">skills</span><span class="code">optional-skills</span><span class="code">agent/skill_*</span><span class="code">hermes_cli/skills_*</span></li><li>形态内置技能、可选技能、Skills Hub、迁移 OpenClaw skills。</li><li>优点:技能生态和 self-improving 叙事强。</li><li>短板:入口多,讲清最终选择链路成本高。</li></ul></div>
<div class="panel"><h3>OpenClaw</h3><ul><li>目录迹象:<span class="code">skills</span><span class="code">.agents/skills</span>、docs skills、workspace skills。</li><li>形态bundled/managed/workspace skills配合 ClawHub。</li><li>优点:产品化技能注册和分发强。</li><li>短板:技能系统与 gateway/apps/nodes 强绑定。</li></ul></div>
<div class="panel"><h3>Beaver</h3><ul><li>形态:<span class="code">SkillSpecStore</span><span class="code">SkillsLoader</span>、published versions、drafts、reviews。</li><li>优点:上传/安装 -> 版本 -> draft -> review -> publish/disable/rollback 生命周期清楚。</li><li>短板:外部生态和 marketplace 成熟度不如 OpenClaw/Hermes。</li></ul></div>
</div>
<div class="diagram">
<h3 class="diagram-title">Beaver Skill 装载流程</h3>
<div class="diagram-row">
<div class="diagram-card"><strong>workspace skill store</strong><span>技能文件和版本索引</span></div>
<div class="diagram-card"><strong>SkillsLoader.list</strong><span>读取 published skill</span></div>
<div class="diagram-card"><strong>selection candidates</strong><span>构建候选摘要</span></div>
<div class="diagram-card"><strong>SkillAssembler</strong><span>embedding + LLM 选择</span></div>
<div class="diagram-card"><strong>SkillContext</strong><span>注入本轮上下文</span></div>
<div class="diagram-card"><strong>ActivationReceipt</strong><span>写入激活审计记录</span></div>
</div>
</div>
<div class="table-wrap">
<table>
<thead><tr><th>阶段</th><th>OpenHarness</th><th>Hermes</th><th>OpenClaw</th><th>Beaver</th></tr></thead>
<tbody>
<tr><td>发现 skill</td><td>loader/registry</td><td>skill bundles/config/hub</td><td>workspace/managed registry</td><td><span class="code">SkillsLoader</span></td></tr>
<tr><td>候选召回</td><td>skill registry / prompt matching</td><td>skill preprocessing / commands</td><td>registry/config</td><td>embedding retriever</td></tr>
<tr><td>最终选择</td><td>agent/runtime 决策</td><td>agent skill utilities</td><td>agent/tooling runtime</td><td>LLM shortlist + final select</td></tr>
<tr><td>注入方式</td><td>prompt/context</td><td>prompt/context</td><td>prompt/context</td><td><span class="code">SkillContext</span> + activation messages</td></tr>
<tr><td>审计记录</td><td>有测试/日志迹象</td><td>有 memory/trajectory</td><td>有 runtime/logs</td><td>explicit activation receipt</td></tr>
</tbody>
</table>
</div>
<div class="table-wrap">
<table>
<thead><tr><th>CRUD</th><th>Beaver 讲解重点</th></tr></thead>
<tbody>
<tr><td>Create</td><td>upload、marketplace install、learning candidate synthesize draft</td></tr>
<tr><td>Read</td><td>list/detail/version/file/download</td></tr>
<tr><td>Update</td><td>regenerate draft、submit、approve、reject、publish、disable、rollback</td></tr>
<tr><td>Delete</td><td>delete published skill / draft delete 底层能力</td></tr>
</tbody>
</table>
</div>
<div class="demo">
<h3>DemoSkill 选择</h3>
<p>这个例子适合讲“skill 不是手动塞进去,而是根据任务语义被选择并记录”。</p>
<div class="demo-grid">
<div class="demo-block"><h4>输入</h4><pre>{
"task_description": "解释后端 Task 机制",
"available_skills": [
"backend-explainer",
"code-review",
"filesystem"
]
}</pre></div>
<div class="demo-block"><h4>内部选择</h4><pre>{
"retrieved_candidates": [
"backend-explainer",
"filesystem"
],
"llm_final_select": [
"backend-explainer"
]
}</pre></div>
<div class="demo-block"><h4>预期输出</h4><pre>{
"activated_skills": [
"backend-explainer"
],
"activation_reason": "llm_selected",
"tool_hints": [
"search_files",
"read_file"
]
}</pre></div>
</div>
</div>
</section>
<section class="stage" data-stage="tools">
<div class="stage-title">
<div>
<h2>Tool 装载、选择、执行和 MCP</h2>
<p class="hint">重点讲 Beaver 的 ToolRegistry / ToolAssembler / ToolExecutor 三段式边界。</p>
</div>
</div>
<div class="grid-4">
<div class="panel"><h3>OpenHarness</h3><p>43+ tools覆盖 file、shell、search、web、MCP并强调 parallel tool execution。</p></div>
<div class="panel"><h3>Hermes</h3><p>40+ tools、toolsets、terminal backends、RPC、browser/tools config工具体系覆盖面广。</p></div>
<div class="panel"><h3>OpenClaw</h3><p>first-class tools覆盖 browser、canvas、nodes、cron、sessions 和 channel actions。</p></div>
<div class="panel"><h3>Beaver</h3><p>built-in tools + MCP tools + registry + assembler + executor运行链路边界更容易讲清。</p></div>
</div>
<div class="diagram">
<h3 class="diagram-title">Beaver Tool 装载流程</h3>
<div class="diagram-row">
<div class="diagram-card"><strong>EngineLoader</strong><span>创建工具运行时</span></div>
<div class="diagram-card"><strong>ToolRegistry</strong><span>注册 built-in tools</span></div>
<div class="diagram-card"><strong>MCP Manager</strong><span>连接外部 MCP server</span></div>
<div class="diagram-card"><strong>ToolAssembler</strong><span>always + skill hints + embedding</span></div>
<div class="diagram-card"><strong>Provider Schema</strong><span>导出 function schema</span></div>
<div class="diagram-card"><strong>ToolExecutor</strong><span>执行 tool call 并写回 session</span></div>
</div>
</div>
<div class="table-wrap">
<table>
<thead><tr><th>阶段</th><th>OpenHarness</th><th>Hermes</th><th>OpenClaw</th><th>Beaver</th></tr></thead>
<tbody>
<tr><td>内置注册</td><td>tools package</td><td>tools/toolsets</td><td>packages/extensions/tools</td><td><span class="code">EngineLoader.register_many</span></td></tr>
<tr><td>外部工具</td><td>MCP client</td><td>MCP serve/config</td><td>plugin/extensions/process tooling</td><td>MCP manager</td></tr>
<tr><td>工具选择</td><td>harness runtime</td><td>toolsets + config + guardrails</td><td>gateway/runtime tool exposure</td><td>always tools + skill hints + embedding top-k</td></tr>
<tr><td>执行</td><td>tool call cycle / parallel</td><td>tool executor / terminal backend</td><td>runtime/extensions/actions</td><td><span class="code">ToolExecutor.execute_tool_call</span></td></tr>
<tr><td>审计</td><td>logs/hooks</td><td>trajectory/tool classification</td><td>logs/security tooling</td><td>session tool_result + run memory</td></tr>
</tbody>
</table>
</div>
<div class="callout"><strong>讲解重点:</strong><span class="code">tool_hints</span> 不是直接执行工具。它只告诉工具选择器“这个 skill 常用哪些工具”。最终工具列表仍由 ToolAssembler 汇总 always tools、skill hints 和 embedding top-k。</div>
<div class="demo">
<h3>DemoSkill 中 tool 字段影响工具选择</h3>
<div class="demo-grid">
<div class="demo-block"><h4>Skill frontmatter</h4><pre>---
name: backend-explainer
description: Explain backend architecture from source files
tool_hints:
- search_files
- read_file
- session_search
---
先定位入口,再追踪 service、engine、memory、skills。</pre></div>
<div class="demo-block"><h4>工具选择器输入</h4><pre>{
"task": "解释后端 Task 机制",
"activated_skills": [
"backend-explainer"
],
"always_tools": [
"memory",
"session_search"
]
}</pre></div>
<div class="demo-block"><h4>预期工具选择</h4><pre>{
"always_tools": ["memory", "session_search"],
"from_skill_hints": ["search_files", "read_file"],
"from_embedding": ["list_directory"],
"final_tools": [
"memory",
"session_search",
"search_files",
"read_file",
"list_directory"
]
}</pre></div>
</div>
</div>
</section>
<section class="stage" data-stage="sessions">
<div class="stage-title">
<div>
<h2>Session / Memory 管理</h2>
<p class="hint">对比谁更擅长跨会话、谁更擅长运行证据、谁更擅长多渠道隔离。</p>
</div>
</div>
<div class="grid-4">
<div class="panel"><h3>OpenHarness</h3><ul><li><span class="code">session_storage</span><span class="code">session_backend</span><span class="code">channels/bus</span></li><li>偏 harness + channel runtime支持 ohmo 长会话。</li></ul></div>
<div class="panel"><h3>Hermes</h3><ul><li><span class="code">gateway/session.py</span>、conversation loop、session recap、FTS5 session search。</li><li>强在跨会话检索、recap、conversation continuity。</li></ul></div>
<div class="panel"><h3>OpenClaw</h3><ul><li>session model 是产品核心之一gateway route 到 isolated agents/sessions。</li><li>强在多渠道、多设备下 session 和 peer/account 隔离。</li></ul></div>
<div class="panel"><h3>Beaver</h3><ul><li><span class="code">SessionManager</span> + SQLite/store + Web session API。</li><li>每次 run 记录 system/user/assistant/tool/event payload。</li><li>Task 可通过 session_id 找 active task。</li></ul></div>
</div>
<div class="table-wrap">
<table>
<thead><tr><th>Memory 类型</th><th>OpenHarness</th><th>Hermes</th><th>OpenClaw</th><th>Beaver</th></tr></thead>
<tbody>
<tr><td>用户长期记忆</td><td>MEMORY.md / memdir</td><td>user modeling / curated memory</td><td>workspace memory</td><td>curated memory store</td></tr>
<tr><td>会话历史</td><td>session storage</td><td>conversation/session history</td><td>gateway sessions</td><td>session manager</td></tr>
<tr><td>检索</td><td>memory relevance/search</td><td>FTS5 + summarization</td><td>session/tools docs</td><td>session search tool</td></tr>
<tr><td>run 证据</td><td>harness logs/tests</td><td>trajectories</td><td>logs/sessions</td><td>run memory store</td></tr>
<tr><td>skill 效果</td><td>部分支持</td><td>自学习闭环强</td><td>skill registry usage</td><td>skill effect records</td></tr>
</tbody>
</table>
</div>
<div class="demo">
<h3>DemoBeaver Session + Memory</h3>
<div class="demo-grid">
<div class="demo-block"><h4>输入</h4><pre>{
"session_id": "web-demo-001",
"message": "继续刚才的后端架构讲解"
}</pre></div>
<div class="demo-block"><h4>内部数据</h4><pre>{
"session": {
"id": "web-demo-001",
"source": "web",
"parent_session_id": null
},
"message": {
"role": "user",
"run_id": "run_002",
"context_visible": true
},
"memory_snapshot": {
"captured_for_run": "run_002",
"frozen": true
},
"run_memory": {
"activated_skills": ["backend-explainer"],
"tool_results": ["read_file", "search_files"],
"validation_result": {"accepted": true}
}
}</pre></div>
<div class="demo-block"><h4>预期输出</h4><pre>{
"answer": "继续上次内容...",
"session_updated": true,
"run_record_written": true,
"can_resume_later": true
}</pre></div>
</div>
</div>
</section>
<section class="stage" data-stage="channels">
<div class="stage-title">
<div>
<h2>Channel / Gateway 管理</h2>
<p class="hint">这页讲入口生态。Beaver 目前 Web 强多渠道弱OpenClaw 和 Hermes 是主要参照。</p>
</div>
</div>
<div class="grid-4">
<div class="panel"><h3>OpenHarness</h3><ul><li>ohmo gatewayFeishu、Slack、Telegram、Discord 等。</li><li>目录:<span class="code">src/openharness/channels/impl/*</span></li><li>适合讲 harness + personal agent channel adapters。</li></ul></div>
<div class="panel"><h3>Hermes</h3><ul><li>Telegram、Discord、Slack、WhatsApp、Signal、Email、Home Assistant 等。</li><li>目录:<span class="code">gateway/platforms/*</span></li><li>强在 pairing、delivery、slash access、session context。</li></ul></div>
<div class="panel"><h3>OpenClaw</h3><ul><li>渠道覆盖最广WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、Matrix、Feishu、LINE、WeChat、QQ、WebChat 等。</li><li>强在 local-first gateway、device nodes、apps/canvas。</li><li>安全重点DM allowlist、pairing、non-main sandbox。</li></ul></div>
<div class="panel"><h3>Beaver</h3><ul><li>当前主入口是 Web + WebSocket。</li><li>后端已有 <span class="code">interfaces/gateway</span><span class="code">interfaces/channels</span> 基础。</li><li>集成侧有 Outlook、MCP servers。</li><li>短板:多渠道连接和 channel-specific 安全策略不成熟。</li></ul></div>
</div>
<div class="diagram">
<h3 class="diagram-title">四种 Channel 数据流</h3>
<div class="diagram-row four">
<div class="diagram-card"><strong>OpenHarness</strong><span>Channel Adapter -> Gateway Runtime -> ohmo session -> OpenHarness engine/tools</span></div>
<div class="diagram-card"><strong>Hermes</strong><span>Platform webhook/bot -> gateway session context -> agent loop -> delivery</span></div>
<div class="diagram-card"><strong>OpenClaw</strong><span>External channel -> Gateway -> agent routing -> workspace/session/tools -> channel reply</span></div>
<div class="diagram-card"><strong>Beaver</strong><span>Browser/WebSocket -> FastAPI web app -> AgentService -> AgentLoop -> Web response</span></div>
</div>
</div>
<div class="panel">
<h3>对 Beaver 的建议</h3>
<ul>
<li>优先借鉴 OpenClaw/Hermes 的 channel adapter 独立化。</li>
<li>建立 channel identity / allowlist / pairing 概念,而不是只把消息当普通 Web 请求。</li>
<li>设计 per-channel session mapping明确 channel、account、peer、session、user 的关系。</li>
<li>保留当前 Web 管理面优势,先做少量高价值 channel不直接复制 OpenClaw 的复杂度。</li>
</ul>
</div>
</section>
<section class="stage" data-stage="security">
<div class="stage-title">
<div>
<h2>权限 / 安全 / 沙箱 / AuthZ</h2>
<p class="hint">这页要拆成两层讲:平台部署隔离,以及 agent runtime 的工具权限。</p>
</div>
</div>
<div class="table-wrap">
<table>
<thead><tr><th>维度</th><th>OpenHarness</th><th>Hermes</th><th>OpenClaw</th><th>Beaver</th></tr></thead>
<tbody>
<tr><td>Tool approval</td><td>permissions checker / hooks</td><td>guardrails / approvals</td><td>security defaults / tool exposure</td><td>authz integration + permission package scaffold</td></tr>
<tr><td>Channel trust</td><td>channel impl + security tests</td><td>pairing/slash access/platform rules</td><td>DM allowlist / pairing</td><td>Web auth/session + authz-service</td></tr>
<tr><td>Sandbox</td><td>Docker sandbox</td><td>terminal backend isolation</td><td>non-main sandbox, Docker/SSH/OpenShell</td><td>Docker per-instance isolation at deployment layer</td></tr>
<tr><td>MCP security</td><td>MCP config/client</td><td>MCP config/serve</td><td>plugin/process boundary</td><td>MCP server config + authz config</td></tr>
<tr><td>Audit</td><td>tests/logging/hooks</td><td>trajectories/logs</td><td>logging/security workflows</td><td>session event payload + run memory</td></tr>
</tbody>
</table>
</div>
<div class="grid-2">
<div class="panel">
<h3>Beaver 平台部署层</h3>
<ul>
<li><span class="code">auth-portal</span>:用户入口、登录注册。</li>
<li><span class="code">authz-service</span>:授权服务和后端身份。</li>
<li><span class="code">deploy-control</span>:创建和管理单用户实例。</li>
<li><span class="code">router-proxy</span>:按 Host 转发到实例。</li>
<li>每个用户一个 <span class="code">app-instance</span>Docker 容器隔离 + per-instance workspace。</li>
</ul>
</div>
<div class="panel">
<h3>Beaver Agent Runtime 层</h3>
<ul>
<li><span class="code">permissions</span> package 已有 profiles/guards/policies 结构,但目前偏骨架。</li>
<li>MCP 和 authz 已在 config / integration 中接入。</li>
<li>Skill draft safety checker 可用 allowed tool names/prefixes 控制技能草稿风险。</li>
<li>当前短板是 tool call 前置 permission guard 还不如三方成熟。</li>
</ul>
</div>
</div>
<div class="grid-3">
<div class="panel"><h3>当前优势</h3><ul><li>用户实例边界清楚。</li><li>Web API 和 AuthZ 控制链路清楚。</li><li>skill 发布前有 safety/eval/review。</li></ul></div>
<div class="panel"><h3>当前短板</h3><ul><li>runtime tool permission policy 还不完整。</li><li>channel trust model 还没展开。</li><li>沙箱更多在部署层,不是每次 tool call 的细粒度策略。</li></ul></div>
<div class="panel"><h3>下一步建议</h3><ul><li>给 ToolSpec 增加 risk level / permission scope 展示。</li><li>给 MCP server 增加 trust profile。</li><li>给 channel/session 增加 source trust metadata。</li><li>将 permission guard 接入 tool executor 前置检查。</li></ul></div>
</div>
</section>
<section class="stage" data-stage="teams">
<div class="stage-title">
<div>
<h2>Agent Team / Sub-agent 编排</h2>
<p class="hint">Beaver 的优势是把 team 放进 Task 工作流,并且让主 agent synthesis 最终负责一致性。</p>
</div>
</div>
<div class="grid-4">
<div class="panel"><h3>OpenHarness</h3><p>swarm、subagent spawning、delegation强调 harness 多 agent 能力。</p></div>
<div class="panel"><h3>Hermes</h3><p>isolated subagents、parallel workstreams、scripts via RPC。</p></div>
<div class="panel"><h3>OpenClaw</h3><p>multi-agent routing、isolated agents/workspaces/sessions。</p></div>
<div class="panel"><h3>Beaver</h3><ul><li>任务规划器生成 plan。</li><li><span class="code">ExecutionGraph</span> 支持 sequence / parallel / DAG。</li><li><span class="code">TaskSkillResolver</span> 绑定 published skill 或 ephemeral guidance。</li><li><span class="code">LocalAgentRunner</span> 让 sub-agent 回到统一 AgentLoop。</li><li>主 Agent synthesis 输出最终答案。</li></ul></div>
</div>
<div class="diagram">
<h3 class="diagram-title">Beaver Team 流程</h3>
<div class="diagram-row">
<div class="diagram-card"><strong>Task</strong><span>复杂工作进入任务模式</span></div>
<div class="diagram-card"><strong>Planner</strong><span>决定 single / team</span></div>
<div class="diagram-card"><strong>ExecutionGraph</strong><span>sequence / parallel / DAG</span></div>
<div class="diagram-card"><strong>Skill Binding</strong><span>published skill 或 ephemeral guidance</span></div>
<div class="diagram-card"><strong>LocalAgentRunner</strong><span>节点回到统一 AgentLoop</span></div>
<div class="diagram-card"><strong>Main Synthesis</strong><span>主 agent 综合输出</span></div>
</div>
</div>
<div class="demo">
<h3>DemoAgent Team DAG</h3>
<div class="demo-grid">
<div class="demo-block"><h4>输入</h4><pre>{
"task_id": "task_arch_002",
"mode": "team",
"strategy": "dag"
}</pre></div>
<div class="demo-block"><h4>执行图</h4><pre>{
"nodes": [
{
"node_id": "read",
"task": "阅读三方项目 README",
"depends_on": []
},
{
"node_id": "compare",
"task": "对比 skill/tool/session/channel/permission",
"depends_on": ["read"]
},
{
"node_id": "synthesize",
"task": "生成讲解页结构",
"depends_on": ["compare"]
}
]
}</pre></div>
<div class="demo-block"><h4>预期输出</h4><pre>{
"team_success": true,
"node_results": [
{"node_id": "read", "success": true},
{"node_id": "compare", "success": true},
{"node_id": "synthesize", "success": true}
],
"main_synthesis": "输出一页完整项目对比讲解。"
}</pre></div>
</div>
</div>
</section>
<section class="stage" data-stage="conclusion">
<div class="stage-title">
<div>
<h2>结论Beaver 的位置和下一步</h2>
<p class="hint">这页适合最后收束:不是说谁更好,而是说明每个项目选择了不同路线。</p>
</div>
</div>
<div class="grid-4">
<div class="panel">
<h3>你的强项</h3>
<ul>
<li>Web 管理面清晰。</li>
<li>Task 工作单、validation、feedback 闭环明确。</li>
<li>Skill Learning 生命周期比多数项目更可审核。</li>
<li>Agent Team DAG/parallel/sequence 边界清晰。</li>
<li>单用户实例化部署方便隔离和商业化实例管理。</li>
</ul>
</div>
<div class="panel">
<h3>你的短板</h3>
<ul>
<li>多渠道能力弱于 Hermes/OpenClaw。</li>
<li>channel trust、安全、pairing、allowlist 体系还没展开。</li>
<li>permission guard/tool approval 还没有 OpenHarness/OpenClaw 成熟。</li>
<li>生态规模、skills hub、插件分发弱于三方项目。</li>
<li>桌面/移动/Canvas 类体验缺失。</li>
</ul>
</div>
<div class="panel">
<h3>可借鉴</h3>
<ul>
<li>从 OpenHarness 借鉴 harness 概念表达、hook/permission/tool ecosystem。</li>
<li>从 Hermes 借鉴 self-improving narrative、gateway、cron、session search/user modeling。</li>
<li>从 OpenClaw 借鉴 local-first gateway、多渠道、device nodes、DM security、Canvas/visual workspace。</li>
</ul>
</div>
<div class="panel">
<h3>讲解主线</h3>
<ul>
<li>先讲三方项目都是“让 LLM 变成 agent 的外壳”。</li>
<li>再讲你的项目选择了“Web 管理 + Task 工作流 + 审核型 skill learning”路线。</li>
<li>最后讲未来可吸收 channel、permission、ecosystem 能力。</li>
</ul>
</div>
</div>
</section>
<section class="stage" data-stage="sources">
<div class="stage-title">
<div>
<h2>来源区</h2>
<p class="hint">页面内容是静态快照,不是实时 GitHub 数据。Snapshot: 2026-05-20。</p>
</div>
</div>
<div class="table-wrap">
<table>
<thead><tr><th>项目</th><th>GitHub metadata snapshot</th><th>主要来源</th></tr></thead>
<tbody>
<tr><td>HKUDS/OpenHarness</td><td>Python / MIT / stars 12801 / forks 2115 / updated 2026-05-20T06:22:54Z</td><td><a href="https://github.com/HKUDS/OpenHarness">Repo</a> · <a href="https://raw.githubusercontent.com/HKUDS/OpenHarness/main/README.md">README</a></td></tr>
<tr><td>NousResearch/hermes-agent</td><td>Python / MIT / stars 158414 / forks 25664 / updated 2026-05-20T06:43:46Z</td><td><a href="https://github.com/NousResearch/hermes-agent">Repo</a> · <a href="https://raw.githubusercontent.com/NousResearch/hermes-agent/main/README.md">README</a></td></tr>
<tr><td>openclaw/openclaw</td><td>TypeScript / MIT / stars 373326 / forks 77490 / updated 2026-05-20T06:42:58Z</td><td><a href="https://github.com/openclaw/openclaw">Repo</a> · <a href="https://raw.githubusercontent.com/openclaw/openclaw/main/README.md">README</a></td></tr>
<tr><td>Beaver</td><td>本地项目 / Python + Next.js / 单用户实例化 Web agent 工作台</td><td><a href="backend-visualization.html">Beaver 架构可视化</a> · <a href="backend-overview.md">backend overview</a></td></tr>
</tbody>
</table>
</div>
<div class="sources">
<div class="source-card"><h3>OpenHarness 结构证据</h3><p>仓库树显示 <span class="code">src/openharness/skills</span><span class="code">tools</span><span class="code">memory</span><span class="code">channels</span><span class="code">permissions</span><span class="code">sandbox</span><span class="code">swarm</span><span class="code">ohmo/gateway</span></p><a href="https://github.com/HKUDS/OpenHarness">https://github.com/HKUDS/OpenHarness</a></div>
<div class="source-card"><h3>Hermes 结构证据</h3><p>仓库树显示 <span class="code">agent/skill_*</span><span class="code">tools</span><span class="code">toolsets</span><span class="code">gateway/platforms</span><span class="code">cron</span><span class="code">mcp_serve.py</span><span class="code">optional-skills</span></p><a href="https://github.com/NousResearch/hermes-agent">https://github.com/NousResearch/hermes-agent</a></div>
<div class="source-card"><h3>OpenClaw 结构证据</h3><p>仓库树显示 <span class="code">apps/android</span><span class="code">apps/ios</span><span class="code">apps/macos</span><span class="code">skills</span><span class="code">extensions</span><span class="code">docs</span>、大量 channel/security workflows。</p><a href="https://github.com/openclaw/openclaw">https://github.com/openclaw/openclaw</a></div>
<div class="source-card"><h3>Beaver 结构证据</h3><p>本地代码显示 <span class="code">beaver/engine</span><span class="code">tasks</span><span class="code">skills</span><span class="code">tools</span><span class="code">memory</span><span class="code">interfaces/web</span><span class="code">coordinator</span><span class="code">integrations/authz</span></p><a href="backend-visualization.html">查看本地 Beaver 架构页</a></div>
</div>
</section>
</section>
</main>
<script>
const tabs = Array.from(document.querySelectorAll(".tab"));
const stages = Array.from(document.querySelectorAll(".stage"));
tabs.forEach((tab) => {
tab.addEventListener("click", () => {
const view = tab.dataset.view;
tabs.forEach((item) => item.setAttribute("aria-selected", String(item === tab)));
stages.forEach((stage) => stage.classList.toggle("active", stage.dataset.stage === view));
});
});
</script>
</body>
</html>