init: sxbh.ltd 官网初始提交

- nginx 安全加固 (CSP, HSTS, 缓存策略)
- 共享 style.css
- 138个页面全部接入

Co-authored-by: Hermes AI <agent@hermes>
This commit is contained in:
Hermes CI Fix
2026-07-11 17:29:24 +08:00
co-authored by Hermes AI
commit e1a9b25afa
177 changed files with 21447 additions and 0 deletions
+210
View File
@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>博海科技 · AI Agent框架选型评估报告</title>
<style>
:root {
--bg: #0f172a; --card: #1e293b; --border: #334155;
--text: #e2e8f0; --muted: #94a3b8; --accent: #38bdf8;
--green: #22c55e; --yellow: #eab308; --red: #ef4444;
--gold: #f59e0b;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, 'Segoe UI', 'Noto Sans SC', sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; padding: 2rem 1rem; }
.container { max-width: 1000px; margin: 0 auto; }
h1 { font-size: 1.8rem; border-bottom: 2px solid var(--accent); padding-bottom: .5rem; margin-bottom: 1rem; }
h2 { font-size: 1.3rem; color: var(--accent); margin: 2rem 0 .8rem; }
h3 { font-size: 1.1rem; color: var(--gold); margin: 1.5rem 0 .5rem; }
.meta { color: var(--muted); font-size: .85rem; margin-bottom: 2rem; }
p, li { color: var(--text); margin-bottom: .5rem; }
ul, ol { padding-left: 1.5rem; margin: .5rem 0 1rem; }
table { width: 100%; border-collapse: collapse; margin: 1rem 0; font-size: .9rem; }
th, td { border: 1px solid var(--border); padding: .5rem .6rem; text-align: left; }
th { background: var(--card); color: var(--accent); font-weight: 600; white-space: nowrap; }
.score-5 { color: var(--green); font-weight: bold; }
.score-4 { color: #4ade80; }
.score-3 { color: var(--yellow); }
.score-2 { color: #fb923c; }
.score-1 { color: var(--red); }
.rank-card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; margin: .8rem 0; }
.rank-card .title { font-size: 1.1rem; font-weight: 600; margin-bottom: .3rem; }
.rank-card .score { font-size: 2rem; font-weight: 700; }
.rank-card .verdict { margin-top: .3rem; font-size: .9rem; color: var(--muted); }
.recommend { background: linear-gradient(135deg, #1e3a5f, #1e293b); border: 1px solid var(--accent); border-radius: 10px; padding: 1.2rem; margin: 1.5rem 0; }
.recommend h3 { margin-top: 0; color: var(--accent); }
.recommend ul { margin-bottom: 0; }
.badge { display: inline-block; padding: .15rem .5rem; border-radius: 4px; font-size: .75rem; font-weight: 600; }
.badge-green { background: #14532d; color: var(--green); }
.badge-yellow { background: #422006; color: var(--yellow); }
.badge-red { background: #450a0a; color: var(--red); }
.badge-blue { background: #0c4a6e; color: var(--accent); }
.pattern-item { background: var(--card); border-left: 3px solid var(--yellow); padding: .8rem 1rem; margin: .6rem 0; border-radius: 0 6px 6px 0; }
.pattern-item h4 { color: var(--gold); margin-bottom: .3rem; }
.pattern-item p { font-size: .9rem; color: var(--muted); margin-bottom: 0; }
@media (max-width: 700px) { table { font-size: .75rem; } th, td { padding: .3rem .4rem; } }
</style>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="container">
<h1>博海科技 · AI Agent框架选型评估报告</h1>
<div class="meta">
评估日期: 2026-07-10 | 方法论来源: 12维度系统化选型 | 技术栈基线: Hermes Agent 0.18.0 / 13 Profiles / Docker / Prometheus+Grafana+Loki
</div>
<h2>一、评估背景</h2>
<p>博海科技当前运行 <strong>13个AI Agent Profiles</strong>(运维/财务/项目/研学/行政/商务/品宣/营销/客服/员工通道/老板通道等),基于 <strong>Hermes Agent 0.18.0</strong> 框架。随着企业AI Agents市场以49.6% CAGR增长(2033年预计达1829.7亿美元),需评估是否引入或替换框架以支撑下一阶段发展。</p>
<h2>二、评分矩阵</h2>
<table>
<tr>
<th>框架</th><th>部署模式</th><th>语言接口</th><th>多Agent</th><th>工作流</th><th>工具生态</th>
<th>模型支持</th><th>RAG</th><th>记忆状态</th><th>生产运维</th><th>安全权限</th><th>成本</th><th>社区</th>
<th>总分</th>
</tr>
<tr>
<td><strong>LangChain</strong></td>
<td class="score-4">4</td><td class="score-5">5</td><td class="score-2">2</td><td class="score-4">4</td><td class="score-5">5</td>
<td class="score-4">4</td><td class="score-5">5</td><td class="score-3">3</td><td class="score-4">4</td><td class="score-2">2</td>
<td class="score-4">4</td><td class="score-5">5</td><td class="score-5">47</td>
</tr>
<tr>
<td><strong>Dify</strong></td>
<td class="score-5">5</td><td class="score-3">3</td><td class="score-3">3</td><td class="score-5">5</td><td class="score-4">4</td>
<td class="score-4">4</td><td class="score-5">5</td><td class="score-3">3</td><td class="score-3">3</td><td class="score-4">4</td>
<td class="score-4">4</td><td class="score-4">4</td><td class="score-5">47</td>
</tr>
<tr>
<td><strong>LangGraph</strong></td>
<td class="score-4">4</td><td class="score-4">4</td><td class="score-4">4</td><td class="score-5">5</td><td class="score-3">3</td>
<td class="score-4">4</td><td class="score-3">3</td><td class="score-5">5</td><td class="score-4">4</td><td class="score-3">3</td>
<td class="score-3">3</td><td class="score-4">4</td><td class="score-5">46</td>
</tr>
<tr>
<td><strong>CrewAI</strong></td>
<td class="score-4">4</td><td class="score-4">4</td><td class="score-5">5</td><td class="score-3">3</td><td class="score-2">2</td>
<td class="score-4">4</td><td class="score-2">2</td><td class="score-3">3</td><td class="score-2">2</td><td class="score-2">2</td>
<td class="score-5">5</td><td class="score-3">3</td><td class="score-4">39</td>
</tr>
<tr>
<td><strong>AutoGen</strong></td>
<td class="score-3">3</td><td class="score-3">3</td><td class="score-5">5</td><td class="score-3">3</td><td class="score-3">3</td>
<td class="score-3">3</td><td class="score-2">2</td><td class="score-3">3</td><td class="score-2">2</td><td class="score-2">2</td>
<td class="score-4">4</td><td class="score-3">3</td><td class="score-4">36</td>
</tr>
<tr>
<td><strong>Coze(扣子)</strong></td>
<td class="score-1">1</td><td class="score-2">2</td><td class="score-2">2</td><td class="score-4">4</td><td class="score-3">3</td>
<td class="score-3">3</td><td class="score-3">3</td><td class="score-2">2</td><td class="score-2">2</td><td class="score-2">2</td>
<td class="score-3">3</td><td class="score-3">3</td><td class="score-2">30</td>
</tr>
</table>
<h2>三、排名与解读</h2>
<div class="rank-card">
<div class="title">🥇 LangChain — 47/60 <span class="badge badge-blue">生态之王</span></div>
<div class="score score-5">★★★★★</div>
<div class="verdict">优势:工具生态无可匹敌(11.8万Star)、RAG最成熟、LangSmith与我们的Grafana互补。短板:单Agent为主,安全权限需自建。适合作为我们Hermes的外部工具链补充。</div>
</div>
<div class="rank-card">
<div class="title">🥇 Dify — 47/60 <span class="badge badge-green">自托管最优</span></div>
<div class="score score-5">★★★★★</div>
<div class="verdict">优势:Docker一键部署(最友好)、可视化编排降低门槛、内置RAG全流程、中文社区活跃。短板:多Agent协作弱。适合作为企业知识库/RAG场景的独立AI应用平台。</div>
</div>
<div class="rank-card">
<div class="title">🥉 LangGraph — 46/60 <span class="badge badge-yellow">生产级编排</span></div>
<div class="score score-4">★★★★☆</div>
<div class="verdict">优势:图结构编排最精细、状态持久化/checkpoint最完善、Human-in-the-loop原生支持。短板:学习曲线陡、Platform需要付费。最适合我们复杂多步Agent任务的编排增强。</div>
</div>
<div class="rank-card">
<div class="title">4. CrewAI — 39/60</div>
<div class="score score-3">★★★☆☆</div>
<div class="verdict">多Agent角色化协作的理念与我们的Profile模式高度一致,但生产级能力欠缺。如果我们要扩展多Agent协作,可以借鉴其Role/Agent/Task三层抽象模式,而非直接迁移。</div>
</div>
<div class="rank-card">
<div class="title">5. AutoGen — 36/60</div>
<div class="score score-3">★★★☆☆</div>
<div class="verdict">微软背书,多Agent对话式协作有特色,但偏研究风格,运维体系弱,与我们的生产环境要求有差距。</div>
</div>
<div class="rank-card">
<div class="title">6. Coze(扣子) — 30/60</div>
<div class="score score-2">★★☆☆☆</div>
<div class="verdict">云托管封闭平台,无法自托管Docker化,数据在字节服务器。与博海「自托管优先」战略根本冲突,不做考虑。</div>
</div>
<h2>四、核心结论:战略定位</h2>
<div class="recommend">
<h3>🚀 推荐方案:坚守Hermes + LangGraph补充,不迁不换</h3>
<ul>
<li><strong>核心框架不动</strong>Hermes Agent 0.18.0 已深度适配我们的13个Profile架构、系统总线(:8660)、sandbox-runner、approval-gate等基础设施。迁移成本极高,无必要。</li>
<li><strong>引入LangGraph作为编排增强</strong>:针对需要复杂多步状态管理的Agent任务(如长周期运维审计、跨Bot协作流程),引入LangGraph的图编排能力,通过Python SDK解析执行。</li>
<li><strong>Dify作为RAG/KB独立平台</strong>:如果企业知识库/RAG需求增长,Dify Docker Compose一键部署,可以快速搭建独立的AI问答平台,与现有Hermes架构互补。</li>
<li><strong>借鉴CrewAI的角色模式</strong>CrewAI的Role/Agent/Task三层抽象设计理念已体现在我们的Profile+SOUL.md体系,持续优化即可。</li>
</ul>
</div>
<h2>五、本次评估的可落地模式提取</h2>
<p>从六大框架中提取<span class="badge badge-yellow">3个可复用模式</span>,已排好优先级:</p>
<div class="pattern-item">
<h4>🔄 模式ACheckpoint/State持久化(LangGraph ✕ Hermes</h4>
<p>LangGraph的checkpoint机制支持Agent执行到任意节点保存/恢复状态。Hermes目前缺乏任务级状态持久化——长任务中断后从头开始。建议在Hermes中实现任务快照(checkpoint),避免长周期Agent操作因超时或重启丢失进度。<br><span class="badge badge-yellow">优先级:高</span></p>
</div>
<div class="pattern-item">
<h4>🔍 模式B:分布式Tracing/ObservabilityLangSmith ↔ Prometheus</h4>
<p>LangSmith的LangChain调用链追踪能力,结合我们的Grafana/Prometheus/Loki体系,可以构建完整的「Agent调用链」可观测性。每个Profile的每轮Agent执行都打上trace_id,实现全链路追踪。<br><span class="badge badge-yellow">优先级:中</span></p>
</div>
<div class="pattern-item">
<h4>📋 模式C:内置RBAC权限模型(Dify Security → Bot安全治理)</h4>
<p>Dify内置RBAC/API Key管理/审计日志,这对我们多个Profile的权限隔离有借鉴意义。当前我们通过approval-gate + website_blocklist + command_allowlist三层安全,可进一步补充「Profile间操作审计」能力。<br><span class="badge badge-yellow">优先级:低(现有体系够用)</span></p>
</div>
<h2>六、行动建议</h2>
<ul>
<li><strong>✅ 立即做</strong>:将本评估报告归档到 agent-infrastructure-patterns 技能实战记录</li>
<li><strong>🔜 两周内</strong>:评估LangGraph checkpoint模式与Hermes的集成方案(模式A)</li>
<li><strong>📅 按需</strong>:当RAG/知识库需求增长时,启动Dify试点部署(已有17个Docker容器,再加一个无压力)</li>
</ul>
<h2>七、对标总结:Hermes Agent vs 六大框架</h2>
<table>
<tr><th>维度</th><th>Hermes Agent(我们)</th><th>对标框架</th><th>差距/优势</th></tr>
<tr><td>多Agent协作</td><td>✅ 13 Profiles + System-Bus</td><td>CrewAI / AutoGen</td><td><span class="badge badge-green">优势:已落地,比他们更早用于生产</span></td></tr>
<tr><td>自托管/部署</td><td>✅ Docker化,API Server 127.0.0.1</td><td>Dify / LangChain</td><td><span class="badge badge-green">平齐,可深度定制</span></td></tr>
<tr><td>工具/插件生态</td><td>⚠️ 自定义工具为主,无市场</td><td>LangChain (11.8万Star)</td><td><span class="badge badge-yellow">差距:工具丰富度远不如</span></td></tr>
<tr><td>可视化编排</td><td>❌ 纯代码配置</td><td>Dify / Coze</td><td><span class="badge badge-yellow">差距:非技术成员需要学习</span></td></tr>
<tr><td>生产级监控</td><td>✅ Prometheus+Grafana+Loki</td><td>LangSmith</td><td><span class="badge badge-green">优势:通用监控方案更成熟</span></td></tr>
<tr><td>安全治理</td><td>✅ approval-gate+tirith+allowlist</td><td>Dify RBAC</td><td><span class="badge badge-green">优势:纵深防御体系更强</span></td></tr>
<tr><td>RAG/知识管理</td><td>⚠️ Wiki.js + Loki日志检索</td><td>Dify (内置RAG)</td><td><span class="badge badge-yellow">差距:缺乏结构化RAG管道</span></td></tr>
<tr><td>社区/生态</td><td>❌ Hermes社区较小</td><td>LangChain 11.8万Star</td><td><span class="badge badge-yellow">差距:遇到问题靠自己排查</span></td></tr>
</table>
<hr style="border-color: var(--border); margin: 2rem 0;">
<p style="text-align:center; color:var(--muted); font-size:.85rem;">
博海科技 · 运维BOT · 2026-07-10<br>
基于《AI Agent开发框架怎么选?12维度系统化选型方法论》(奇崛数字传媒科技) 定制评估
</p>
</div>
</body>
</html>
+518
View File
@@ -0,0 +1,518 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>博海科技 Bot 行为手册</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
line-height: 1.8;
color: #1a1a2e;
background: #f5f6fa;
padding: 20px;
}
.container {
max-width: 900px;
margin: 0 auto;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 20px rgba(0,0,0,0.08);
padding: 40px 50px;
}
h1 {
font-size: 28px;
color: #1a1a2e;
border-bottom: 3px solid #4361ee;
padding-bottom: 12px;
margin-bottom: 8px;
}
.version {
color: #888;
font-size: 14px;
margin-bottom: 30px;
}
h2 {
font-size: 22px;
color: #4361ee;
margin-top: 40px;
margin-bottom: 15px;
padding-left: 12px;
border-left: 4px solid #4361ee;
}
h3 {
font-size: 18px;
color: #3a0ca3;
margin-top: 25px;
margin-bottom: 10px;
}
p { margin-bottom: 12px; }
ul, ol { margin: 10px 0 10px 25px; }
li { margin-bottom: 6px; }
table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
font-size: 14px;
}
th, td {
border: 1px solid #e0e0e0;
padding: 10px 14px;
text-align: left;
}
th {
background: #4361ee;
color: white;
font-weight: 600;
}
tr:nth-child(even) { background: #f8f9ff; }
code {
background: #f0f0f5;
padding: 2px 8px;
border-radius: 4px;
font-family: "SF Mono", "Fira Code", "Consolas", monospace;
font-size: 13px;
color: #e63946;
}
pre {
background: #1e1e2e;
color: #cdd6f4;
padding: 16px 20px;
border-radius: 8px;
overflow-x: auto;
font-size: 13px;
line-height: 1.6;
margin: 15px 0;
}
pre code {
background: none;
color: inherit;
padding: 0;
font-size: inherit;
}
blockquote {
border-left: 4px solid #e63946;
background: #fff5f5;
padding: 12px 18px;
margin: 15px 0;
border-radius: 0 8px 8px 0;
color: #c62828;
font-weight: 600;
}
hr {
border: none;
border-top: 1px solid #e0e0e0;
margin: 30px 0;
}
.toc {
background: #f8f9ff;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 20px 25px;
margin: 20px 0;
}
.toc h3 { margin-top: 0; border: none; padding: 0; color: #1a1a2e; }
.toc a {
color: #4361ee;
text-decoration: none;
}
.toc a:hover { text-decoration: underline; }
.footer {
text-align: center;
color: #888;
font-size: 13px;
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #e0e0e0;
}
@media (max-width: 640px) {
.container { padding: 20px; }
pre { font-size: 12px; padding: 12px; }
}
</style>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="container">
<h1>博海科技 Bot 行为手册 (Bot Behavior Manual)</h1>
<blockquote>
<p><strong>版本</strong>: v1.0 | <strong>更新</strong>: 2026-07-08
<strong>适用范围</strong>: 全Profile(运维/财务/项目/品宣/研学/行政/商务/其他)
<strong>存放位置</strong>: <code>/root/.hermes/BOT_BEHAVIOR_MANUAL.md</code></p>
</blockquote>
<hr />
<h2>目录</h2>
<ol>
<li><a href="#1-文件写入规范">文件写入规范</a></li>
<li><a href="#2-安全红线">安全红线</a></li>
<li><a href="#3-跨bot协作规则">跨Bot协作规则</a></li>
<li><a href="#4-定时任务管理">定时任务管理</a></li>
<li><a href="#5-通知规范">通知规范</a></li>
<li><a href="#6-运维工具标准">运维工具标准</a></li>
<li><a href="#7-raci权责边界">RACI权责边界</a></li>
<li><a href="#8-附录快速参考卡">附录:快速参考卡</a></li>
</ol>
<hr />
<h2>1. 文件写入规范</h2>
<h3>1.1 生产目录文件写入铁律</h3>
<p><strong>所有写入 <code>/var/www/html/</code> 生产目录的文件,一律使用 base64 方式,不走 <code>write_file</code> 工具。</strong></p>
<p><code>write_file</code> 对相对路径的解析存在不可靠性,可能写入到非预期位置(如 <code>/root/</code> 下)但返回成功状态码。</p>
<p><strong>标准流程:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="c1"># ① base64 编码内容</span>
<span class="nv">base64_content</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span><span class="w"> </span>-n<span class="w"> </span><span class="s2">&quot;文件内容&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>base64<span class="w"> </span>-w<span class="w"> </span><span class="m">0</span><span class="k">)</span>
<span class="c1"># ② 写入绝对路径</span>
<span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;</span><span class="nv">$base64_content</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>base64<span class="w"> </span>-d<span class="w"> </span>&gt;<span class="w"> </span>/var/www/html/products/目标文件.html
<span class="c1"># ③ 验证文件大小</span>
wc<span class="w"> </span>-c<span class="w"> </span>/var/www/html/products/目标文件.html
<span class="c1"># ④ 验证页面可访问</span>
curl<span class="w"> </span>-sL<span class="w"> </span>-o<span class="w"> </span>/dev/null<span class="w"> </span>-w<span class="w"> </span><span class="s2">&quot;%{http_code} %{size_download}&quot;</span><span class="w"> </span>https://sxbh.ltd/products/目标文件.html
</code></pre></div>
<p>如果验证结果与预期不符(文件大小偏小或 HTTP 非 200),立即重新写入。</p>
<hr />
<h2>2. 安全红线</h2>
<h3>2.1 安装安全评估</h3>
<p><strong>安装任何新软件/包之前,必须先做安全评估。</strong></p>
<p>检查维度:
- 来源可信度(官方源 vs 第三方 PPA)
- 权限要求(是否需要 root
- 网络行为(是否会外连)
- 社区评价(GitHub stars、维护状态)</p>
<h3>2.2 高危命令安全熔断</h3>
<p><strong>执行高危命令前先调用 <code>approval-gate</code></strong></p>
<div class="codehilite"><pre><span></span><code><span class="c1"># Step 1: Dry-Run 安全预览</span>
approval-gate<span class="w"> </span>dry-run<span class="w"> </span><span class="s2">&quot;&lt;命令&gt;&quot;</span>
<span class="c1"># → READY / WARNING / BLOCKED</span>
<span class="c1"># Step 2: 高风险命令熔断</span>
approval-gate<span class="w"> </span>check<span class="w"> </span><span class="s2">&quot;&lt;命令&gt;&quot;</span>
<span class="c1"># → LOW/MEDIUM 自动放行</span>
<span class="c1"># → HIGH/CRITICAL 拦截,等人工确认</span>
</code></pre></div>
<hr />
<h2>3. 跨Bot协作规则</h2>
<h3>3.1 多 Agent 协作七大铁律</h3>
<table>
<thead>
<tr>
<th style="text-align: center;">#</th>
<th style="text-align: left;">铁律</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">1</td>
<td style="text-align: left;"><strong>唯一执行人</strong></td>
<td style="text-align: left;">一个任务只由一个 agent 执行,有人认领不得并行</td>
</tr>
<tr>
<td style="text-align: center;">2</td>
<td style="text-align: left;"><strong>先确认再落笔</strong></td>
<td style="text-align: left;">动工前先在群聊确认方案</td>
</tr>
<tr>
<td style="text-align: center;">3</td>
<td style="text-align: left;"><strong>写后必验证</strong></td>
<td style="text-align: left;">改完立即验证语法/功能</td>
</tr>
<tr>
<td style="text-align: center;">4</td>
<td style="text-align: left;"><strong>进度汇总归研学</strong></td>
<td style="text-align: left;">老板问全局进度时等研学汇总</td>
</tr>
<tr>
<td style="text-align: center;">5</td>
<td style="text-align: left;"><strong>文件写前占位</strong></td>
<td style="text-align: left;">先喊 <code>我要改 xxx</code>,改完喊 <code>已释放 xxx</code></td>
</tr>
<tr>
<td style="text-align: center;">6</td>
<td style="text-align: left;"><strong>bus/send 不送达 Bot</strong></td>
<td style="text-align: left;">广播只到用户,不到 Bot 自己</td>
</tr>
<tr>
<td style="text-align: center;">7</td>
<td style="text-align: left;"><strong>定时任务新增前避让</strong></td>
<td style="text-align: left;">见第4节</td>
</tr>
</tbody>
</table>
<h3>3.2 跨Bot调度规范</h3>
<p><strong>发现问题时直接通过 system-bus 调度对方 Bot 修复,不只报告问题。</strong></p>
<div class="codehilite"><pre><span></span><code>curl<span class="w"> </span>-s<span class="w"> </span>-X<span class="w"> </span>POST<span class="w"> </span>http://127.0.0.1:8660/bus/send<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-H<span class="w"> </span><span class="s1">&#39;X-API-Key: system-bus-relay-key-2026&#39;</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-d<span class="w"> </span><span class="s1">&#39;{&quot;touser&quot;:&quot;200653946&quot;,&quot;agentid&quot;:&lt;AGENT_ID&gt;,&quot;msgtype&quot;:&quot;markdown&quot;,&quot;content&quot;:&quot;...&quot;}&#39;</span>
</code></pre></div>
<p><strong>注意</strong><code>bus/send</code> 只发消息给<strong>用户</strong>,不发消息给 <strong>Bot 自己</strong>。要让另一个 Bot 执行任务,需要用对方的 API Server 或直接编辑其文件后重启网关。</p>
<p>各Bot Agent ID</p>
<table>
<thead>
<tr>
<th style="text-align: left;">Bot</th>
<th style="text-align: center;">Agent ID</th>
<th style="text-align: center;">API Server</th>
<th style="text-align: center;">端口</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">财务</td>
<td style="text-align: center;">1000040</td>
<td style="text-align: center;">❌ 关闭</td>
<td style="text-align: center;">8651</td>
</tr>
<tr>
<td style="text-align: left;">项目</td>
<td style="text-align: center;">1000039</td>
<td style="text-align: center;">❌ 关闭</td>
<td style="text-align: center;">8650</td>
</tr>
<tr>
<td style="text-align: left;">品宣</td>
<td style="text-align: center;">1000037</td>
<td style="text-align: center;">❌ 关闭</td>
<td style="text-align: center;">8642</td>
</tr>
<tr>
<td style="text-align: left;">行政</td>
<td style="text-align: center;">1000020</td>
<td style="text-align: center;">❌ 关闭</td>
<td style="text-align: center;">8646</td>
</tr>
<tr>
<td style="text-align: left;">研学</td>
<td style="text-align: center;">1000032</td>
<td style="text-align: center;">❌ 关闭(未认证)</td>
<td style="text-align: center;">8652</td>
</tr>
<tr>
<td style="text-align: left;">商务</td>
<td style="text-align: center;">1000043</td>
<td style="text-align: center;">❌ 关闭</td>
<td style="text-align: center;">8647</td>
</tr>
<tr>
<td style="text-align: left;">运维</td>
<td style="text-align: center;"></td>
<td style="text-align: center;">✅ 开启</td>
<td style="text-align: center;">8649</td>
</tr>
<tr>
<td style="text-align: left;">老板</td>
<td style="text-align: center;">1000041</td>
<td style="text-align: center;">❌ 未配置</td>
<td style="text-align: center;">8648</td>
</tr>
</tbody>
</table>
<h3>3.3 清理前交叉验证</h3>
<p><strong>清理 <code>/root/</code> 下的项目代码前,必须先做部署交叉验证。</strong></p>
<p>三步法:
1. 收集部署链路信息(Docker / Nginx / 进程)
2. 收集 /root 项目信息
3. 交叉对照:有 Nginx 域名 + 进程 cwd 指向 /root → <strong>不可删</strong></p>
<hr />
<h2>4. 定时任务管理</h2>
<h3>4.1 铁律</h3>
<p><strong>所有 Profile 新增定时任务前,必须先跑预检定时任务脚本,避开已有时间段。</strong></p>
<p>无法避开时(如业务必须特定时间),必须通过运维BOT告知管理者(任富海)。</p>
<h3>4.2 预检命令</h3>
<div class="codehilite"><pre><span></span><code>python3<span class="w"> </span>/root/.hermes/profiles/wecom-ops/scripts/check-cron-conflict.py<span class="w"> </span><span class="s2">&quot;分 时&quot;</span><span class="w"> </span><span class="s2">&quot;任务名&quot;</span>
<span class="c1"># 示例</span>
python3<span class="w"> </span>check-cron-conflict.py<span class="w"> </span><span class="s2">&quot;30 14&quot;</span><span class="w"> </span><span class="s2">&quot;数据同步&quot;</span>
<span class="c1"># → ✅ 空闲 或 ⚠️ 列出冲突任务</span>
</code></pre></div>
<h3>4.3 已占用时间段参考表</h3>
<p>完整排布表:<code>/root/.hermes/profiles/wecom-ops/scripts/CRON_SCHEDULE.md</code></p>
<p><strong>禁止扎堆时段</strong>: 08:00~09:30(已排 17 个任务)</p>
<h3>4.4 避让优先级</h3>
<table>
<thead>
<tr>
<th style="text-align: center;">优先级</th>
<th style="text-align: left;">规则</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">🥇</td>
<td style="text-align: left;">选完全空闲的时段</td>
</tr>
<tr>
<td style="text-align: center;">🥈</td>
<td style="text-align: left;">与同Profile任务间隔 ≥ 15分钟</td>
</tr>
<tr>
<td style="text-align: center;">🥉</td>
<td style="text-align: left;">跨Profile任务可适当靠近</td>
</tr>
</tbody>
</table>
<hr />
<h2>5. 通知规范</h2>
<h3>5.1 发消息到公司全员群</h3>
<div class="codehilite"><pre><span></span><code>curl<span class="w"> </span>-s<span class="w"> </span>http://127.0.0.1:8800/send<span class="w"> </span>-d<span class="w"> </span><span class="s1">&#39;msg=消息内容&amp;source=Bot名称&#39;</span>
</code></pre></div>
<h3>5.2 开会角色</h3>
<table>
<thead>
<tr>
<th style="text-align: left;">Bot</th>
<th style="text-align: left;">视角</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>运维</strong></td>
<td style="text-align: left;">技术可行性:服务器撑不撑得住、安全风险、技术资源</td>
</tr>
<tr>
<td style="text-align: left;"><strong>财务</strong></td>
<td style="text-align: left;">财务影响:投入多少、多久回本、现金流压力</td>
</tr>
<tr>
<td style="text-align: left;"><strong>项目</strong></td>
<td style="text-align: left;">项目管理:时间进度、代码质量、CI/CD</td>
</tr>
<tr>
<td style="text-align: left;"><strong>商务</strong></td>
<td style="text-align: left;">商务条款:合同、供应商、商务风险</td>
</tr>
<tr>
<td style="text-align: left;"><strong>品宣</strong></td>
<td style="text-align: left;">内容/设计:品牌形象、用户体验</td>
</tr>
<tr>
<td style="text-align: left;"><strong>行政</strong></td>
<td style="text-align: left;">行政流程:流程合规、资源协调</td>
</tr>
<tr>
<td style="text-align: left;"><strong>研学</strong></td>
<td style="text-align: left;">技术调度:方案评估、跨Profile协调、研究</td>
</tr>
</tbody>
</table>
<hr />
<h2>6. 运维工具标准</h2>
<p>所有 Shell/Python 运维脚本遵循 <strong>四层契约</strong></p>
<div class="codehilite"><pre><span></span><code><span class="c1"># 输入层:命令行参数 / 环境变量 / 配置文件</span>
<span class="c1"># 输出层:stdout 结构化输出</span>
<span class="c1"># 错误层:stderr 退出码 + 错误信息</span>
<span class="c1"># 元数据层:版本号、运行时间、调用方</span>
</code></pre></div>
<p>详见:<code>ops-tool-standard</code> skill</p>
<hr />
<h2>7. RACI 权责边界</h2>
<table>
<thead>
<tr>
<th style="text-align: left;">角色</th>
<th style="text-align: center;">R 执行者</th>
<th style="text-align: center;">A 拍板人</th>
<th style="text-align: center;">C 咨询者</th>
<th style="text-align: center;">I 知会者</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>运维</strong></td>
<td style="text-align: center;">系统监控、安全审计、故障处理</td>
<td style="text-align: center;">系统配置变更、安全策略</td>
<td style="text-align: center;">架构变更方案</td>
<td style="text-align: center;">重大故障通知</td>
</tr>
<tr>
<td style="text-align: left;"><strong>财务</strong></td>
<td style="text-align: center;">成本核算、财务日报、预算监控</td>
<td style="text-align: center;">预算控制</td>
<td style="text-align: center;">采购方案评估</td>
<td style="text-align: center;">预算超支告警</td>
</tr>
<tr>
<td style="text-align: left;"><strong>项目</strong></td>
<td style="text-align: center;">代码编译、CI/CD、版本发布</td>
<td style="text-align: center;">代码合并、发布审批</td>
<td style="text-align: center;">技术选型</td>
<td style="text-align: center;">发布通知</td>
</tr>
<tr>
<td style="text-align: left;"><strong>商务</strong></td>
<td style="text-align: center;">合同流转、供应商对接</td>
<td style="text-align: center;">商务条款审批</td>
<td style="text-align: center;">风险评估</td>
<td style="text-align: center;">合同到期提醒</td>
</tr>
<tr>
<td style="text-align: left;"><strong>品宣</strong></td>
<td style="text-align: center;">内容创作、设计出图</td>
<td style="text-align: center;">内容审核、品牌规范</td>
<td style="text-align: center;">创意方向</td>
<td style="text-align: center;">品牌舆情</td>
</tr>
<tr>
<td style="text-align: left;"><strong>行政</strong></td>
<td style="text-align: center;">流程执行、通知下发</td>
<td style="text-align: center;">行政决策</td>
<td style="text-align: center;">流程优化建议</td>
<td style="text-align: center;">异常上报</td>
</tr>
<tr>
<td style="text-align: left;"><strong>研学</strong></td>
<td style="text-align: center;">技术研究、方案验证</td>
<td style="text-align: center;">技术方案选型</td>
<td style="text-align: center;">行业调研</td>
<td style="text-align: center;">研究发现通报</td>
</tr>
</tbody>
</table>
<p><strong>通用铁律</strong>: 高危操作需 approval-gate 审批。预算审批不跨过任富海。</p>
<hr />
<h2>8. 附录:快速参考卡</h2>
<h3>常用命令速查</h3>
<div class="codehilite"><pre><span></span><code><span class="c1"># 安全熔断</span>
approval-gate<span class="w"> </span>dry-run<span class="w"> </span><span class="s2">&quot;&lt;命令&gt;&quot;</span>
approval-gate<span class="w"> </span>check<span class="w"> </span><span class="s2">&quot;&lt;命令&gt;&quot;</span>
<span class="c1"># cron预检</span>
python3<span class="w"> </span>/root/.hermes/profiles/wecom-ops/scripts/check-cron-conflict.py<span class="w"> </span><span class="s2">&quot;分 时&quot;</span><span class="w"> </span><span class="s2">&quot;任务名&quot;</span>
<span class="c1"># 发全员群</span>
curl<span class="w"> </span>-s<span class="w"> </span>http://127.0.0.1:8800/send<span class="w"> </span>-d<span class="w"> </span><span class="s1">&#39;msg=...&amp;source=Bot名&#39;</span>
<span class="c1"># 跨Bot调度</span>
curl<span class="w"> </span>-s<span class="w"> </span>http://127.0.0.1:8660/bus/send<span class="w"> </span>-H<span class="w"> </span><span class="s1">&#39;X-API-Key: system-bus-relay-key-2026&#39;</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-d<span class="w"> </span><span class="s1">&#39;{&quot;touser&quot;:&quot;200653946&quot;,&quot;agentid&quot;:&lt;ID&gt;,&quot;msgtype&quot;:&quot;markdown&quot;,&quot;content&quot;:&quot;...&quot;}&#39;</span>
<span class="c1"># 文件写入生产目录</span>
<span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;base64内容&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>base64<span class="w"> </span>-d<span class="w"> </span>&gt;<span class="w"> </span>/var/www/html/&lt;路径&gt;
wc<span class="w"> </span>-c<span class="w"> </span>/var/www/html/&lt;路径&gt;
curl<span class="w"> </span>-sL<span class="w"> </span>-o<span class="w"> </span>/dev/null<span class="w"> </span>-w<span class="w"> </span><span class="s2">&quot;%{http_code}&quot;</span><span class="w"> </span>https://sxbh.ltd/&lt;路径&gt;
</code></pre></div>
<h3>Bus Relay Agent ID 速查</h3>
<div class="codehilite"><pre><span></span><code><span class="mf">1000041</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">boss</span><span class="w"> </span><span class="mf">1000040</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">finance</span><span class="w"> </span><span class="mf">1000039</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">project</span>
<span class="mf">1000037</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">creative</span><span class="w"> </span><span class="mf">1000032</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">yanxue</span><span class="w"> </span><span class="mf">1000020</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">admin</span>
<span class="mf">1000043</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">business</span><span class="w"> </span><span class="mf">1000045</span><span class="w"> </span><span class="err"></span><span class="w"> </span><span class="n">employees</span>
</code></pre></div>
<h3>排布表路径</h3>
<div class="codehilite"><pre><span></span><code>/root/.hermes/profiles/wecom-ops/scripts/CRON_SCHEDULE.md
</code></pre></div>
<div class="footer">
博海科技 · Bot 行为手册 v1.0 · 2026-07-08<br>
<a href="https://sxbh.ltd/manuals/bot-behavior.md">Markdown 原文</a>
</div>
</div>
</body>
</html>
+253
View File
@@ -0,0 +1,253 @@
# 博海科技 Bot 行为手册 (Bot Behavior Manual)
> **版本**: v1.0 | **更新**: 2026-07-08
> **适用范围**: 全Profile(运维/财务/项目/品宣/研学/行政/商务/其他)
> **存放位置**: `/root/.hermes/BOT_BEHAVIOR_MANUAL.md`
---
## 目录
1. [文件写入规范](#1-文件写入规范)
2. [安全红线](#2-安全红线)
3. [跨Bot协作规则](#3-跨bot协作规则)
4. [定时任务管理](#4-定时任务管理)
5. [通知规范](#5-通知规范)
6. [运维工具标准](#6-运维工具标准)
7. [RACI权责边界](#7-raci权责边界)
8. [附录:快速参考卡](#8-附录快速参考卡)
---
## 1. 文件写入规范
### 1.1 生产目录文件写入铁律
**所有写入 `/var/www/html/` 生产目录的文件,一律使用 base64 方式,不走 `write_file` 工具。**
`write_file` 对相对路径的解析存在不可靠性,可能写入到非预期位置(如 `/root/` 下)但返回成功状态码。
**标准流程:**
```bash
# ① base64 编码内容
base64_content=$(echo -n "文件内容" | base64 -w 0)
# ② 写入绝对路径
echo "$base64_content" | base64 -d > /var/www/html/products/目标文件.html
# ③ 验证文件大小
wc -c /var/www/html/products/目标文件.html
# ④ 验证页面可访问
curl -sL -o /dev/null -w "%{http_code} %{size_download}" https://sxbh.ltd/products/目标文件.html
```
如果验证结果与预期不符(文件大小偏小或 HTTP 非 200),立即重新写入。
---
## 2. 安全红线
### 2.1 安装安全评估
**安装任何新软件/包之前,必须先做安全评估。**
检查维度:
- 来源可信度(官方源 vs 第三方 PPA)
- 权限要求(是否需要 root
- 网络行为(是否会外连)
- 社区评价(GitHub stars、维护状态)
### 2.2 高危命令安全熔断
**执行高危命令前先调用 `approval-gate`。**
```bash
# Step 1: Dry-Run 安全预览
approval-gate dry-run "<命令>"
# → READY / WARNING / BLOCKED
# Step 2: 高风险命令熔断
approval-gate check "<命令>"
# → LOW/MEDIUM 自动放行
# → HIGH/CRITICAL 拦截,等人工确认
```
---
## 3. 跨Bot协作规则
### 3.1 多 Agent 协作七大铁律
| # | 铁律 | 说明 |
|:-:|:-----|:------|
| 1 | **唯一执行人** | 一个任务只由一个 agent 执行,有人认领不得并行 |
| 2 | **先确认再落笔** | 动工前先在群聊确认方案 |
| 3 | **写后必验证** | 改完立即验证语法/功能 |
| 4 | **进度汇总归研学** | 老板问全局进度时等研学汇总 |
| 5 | **文件写前占位** | 先喊 `我要改 xxx`,改完喊 `已释放 xxx` |
| 6 | **bus/send 不送达 Bot** | 广播只到用户,不到 Bot 自己 |
| 7 | **定时任务新增前避让** | 见第4节 |
### 3.2 跨Bot调度规范
**发现问题时直接通过 system-bus 调度对方 Bot 修复,不只报告问题。**
```bash
curl -s -X POST http://127.0.0.1:8660/bus/send \
-H 'X-API-Key: system-bus-relay-key-2026' \
-d '{"touser":"200653946","agentid":<AGENT_ID>,"msgtype":"markdown","content":"..."}'
```
**注意**`bus/send` 只发消息给**用户**,不发消息给 **Bot 自己**。要让另一个 Bot 执行任务,需要用对方的 API Server 或直接编辑其文件后重启网关。
各Bot Agent ID
| Bot | Agent ID | API Server | 端口 |
|:----|:--------:|:----------:|:----:|
| 财务 | 1000040 | ❌ 关闭 | 8651 |
| 项目 | 1000039 | ❌ 关闭 | 8650 |
| 品宣 | 1000037 | ❌ 关闭 | 8642 |
| 行政 | 1000020 | ❌ 关闭 | 8646 |
| 研学 | 1000032 | ❌ 关闭(未认证) | 8652 |
| 商务 | 1000043 | ❌ 关闭 | 8647 |
| 运维 | — | ✅ 开启 | 8649 |
| 老板 | 1000041 | ❌ 未配置 | 8648 |
### 3.3 清理前交叉验证
**清理 `/root/` 下的项目代码前,必须先做部署交叉验证。**
三步法:
1. 收集部署链路信息(Docker / Nginx / 进程)
2. 收集 /root 项目信息
3. 交叉对照:有 Nginx 域名 + 进程 cwd 指向 /root → **不可删**
---
## 4. 定时任务管理
### 4.1 铁律
**所有 Profile 新增定时任务前,必须先跑预检定时任务脚本,避开已有时间段。**
无法避开时(如业务必须特定时间),必须通过运维BOT告知管理者(任富海)。
### 4.2 预检命令
```bash
python3 /root/.hermes/profiles/wecom-ops/scripts/check-cron-conflict.py "分 时" "任务名"
# 示例
python3 check-cron-conflict.py "30 14" "数据同步"
# → ✅ 空闲 或 ⚠️ 列出冲突任务
```
### 4.3 已占用时间段参考表
完整排布表:`/root/.hermes/profiles/wecom-ops/scripts/CRON_SCHEDULE.md`
**禁止扎堆时段**: 08:00~09:30(已排 17 个任务)
### 4.4 避让优先级
| 优先级 | 规则 |
|:------:|:-----|
| 🥇 | 选完全空闲的时段 |
| 🥈 | 与同Profile任务间隔 ≥ 15分钟 |
| 🥉 | 跨Profile任务可适当靠近 |
---
## 5. 通知规范
### 5.1 发消息到公司全员群
```bash
curl -s http://127.0.0.1:8800/send -d 'msg=消息内容&source=Bot名称'
```
### 5.2 开会角色
| Bot | 视角 |
|:----|:-----|
| **运维** | 技术可行性:服务器撑不撑得住、安全风险、技术资源 |
| **财务** | 财务影响:投入多少、多久回本、现金流压力 |
| **项目** | 项目管理:时间进度、代码质量、CI/CD |
| **商务** | 商务条款:合同、供应商、商务风险 |
| **品宣** | 内容/设计:品牌形象、用户体验 |
| **行政** | 行政流程:流程合规、资源协调 |
| **研学** | 技术调度:方案评估、跨Profile协调、研究 |
---
## 6. 运维工具标准
所有 Shell/Python 运维脚本遵循 **四层契约**
```python
# 输入层:命令行参数 / 环境变量 / 配置文件
# 输出层:stdout 结构化输出
# 错误层:stderr 退出码 + 错误信息
# 元数据层:版本号、运行时间、调用方
```
详见:`ops-tool-standard` skill
---
## 7. RACI 权责边界
| 角色 | R 执行者 | A 拍板人 | C 咨询者 | I 知会者 |
|:----|:--------:|:--------:|:--------:|:--------:|
| **运维** | 系统监控、安全审计、故障处理 | 系统配置变更、安全策略 | 架构变更方案 | 重大故障通知 |
| **财务** | 成本核算、财务日报、预算监控 | 预算控制 | 采购方案评估 | 预算超支告警 |
| **项目** | 代码编译、CI/CD、版本发布 | 代码合并、发布审批 | 技术选型 | 发布通知 |
| **商务** | 合同流转、供应商对接 | 商务条款审批 | 风险评估 | 合同到期提醒 |
| **品宣** | 内容创作、设计出图 | 内容审核、品牌规范 | 创意方向 | 品牌舆情 |
| **行政** | 流程执行、通知下发 | 行政决策 | 流程优化建议 | 异常上报 |
| **研学** | 技术研究、方案验证 | 技术方案选型 | 行业调研 | 研究发现通报 |
**通用铁律**: 高危操作需 approval-gate 审批。预算审批不跨过任富海。
---
## 8. 附录:快速参考卡
### 常用命令速查
```bash
# 安全熔断
approval-gate dry-run "<命令>"
approval-gate check "<命令>"
# cron预检
python3 /root/.hermes/profiles/wecom-ops/scripts/check-cron-conflict.py "分 时" "任务名"
# 发全员群
curl -s http://127.0.0.1:8800/send -d 'msg=...&source=Bot名'
# 跨Bot调度
curl -s http://127.0.0.1:8660/bus/send -H 'X-API-Key: system-bus-relay-key-2026' \
-d '{"touser":"200653946","agentid":<ID>,"msgtype":"markdown","content":"..."}'
# 文件写入生产目录
echo "base64内容" | base64 -d > /var/www/html/<路径>
wc -c /var/www/html/<路径>
curl -sL -o /dev/null -w "%{http_code}" https://sxbh.ltd/<路径>
```
### Bus Relay Agent ID 速查
```
1000041 → boss 1000040 → finance 1000039 → project
1000037 → creative 1000032 → yanxue 1000020 → admin
1000043 → business 1000045 → employees
```
### 排布表路径
```bash
/root/.hermes/profiles/wecom-ops/scripts/CRON_SCHEDULE.md
```
+308
View File
@@ -0,0 +1,308 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模式A可行性研究 · LangGraph Checkpoint ↔ Hermes集成方案</title>
<style>
:root {
--bg: #0f172a; --card: #1e293b; --border: #334155;
--text: #e2e8f0; --muted: #94a3b8; --accent: #38bdf8;
--green: #22c55e; --yellow: #eab308; --red: #ef4444;
--gold: #f59e0b; --purple: #a78bfa;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, 'Segoe UI', 'Noto Sans SC', sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; padding: 2rem 1rem; }
.container { max-width: 960px; margin: 0 auto; }
h1 { font-size: 1.6rem; border-bottom: 2px solid var(--accent); padding-bottom: .5rem; margin-bottom: .5rem; }
.meta { color: var(--muted); font-size: .85rem; margin-bottom: 1.5rem; }
h2 { font-size: 1.2rem; color: var(--accent); margin: 2rem 0 .6rem; }
h3 { font-size: 1.05rem; color: var(--gold); margin: 1.2rem 0 .4rem; }
h4 { color: var(--purple); margin: 1rem 0 .3rem; }
p, li { color: var(--text); margin-bottom: .4rem; }
ul, ol { padding-left: 1.5rem; margin: .4rem 0 .8rem; }
table { width: 100%; border-collapse: collapse; margin: .8rem 0; font-size: .9rem; }
th, td { border: 1px solid var(--border); padding: .5rem .6rem; text-align: left; }
th { background: var(--card); color: var(--accent); font-weight: 600; }
.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; margin: .8rem 0; }
.verdict-box { background: linear-gradient(135deg, #1e3a5f, #1e293b); border: 2px solid var(--accent); border-radius: 10px; padding: 1.2rem; margin: 1.5rem 0; }
.verdict-box h3 { margin-top: 0; color: var(--accent); }
.arch { background: var(--card); border: 1px solid var(--gold); border-radius: 8px; padding: 1rem; margin: .8rem 0; font-family: 'Courier New', monospace; font-size: .85rem; line-height: 1.5; white-space: pre; overflow-x: auto; }
.badge { display: inline-block; padding: .15rem .5rem; border-radius: 4px; font-size: .75rem; font-weight: 600; }
.bg-green { background: #14532d; color: var(--green); }
.bg-yellow { background: #422006; color: var(--yellow); }
.bg-red { background: #450a0a; color: var(--red); }
.bg-blue { background: #0c4a6e; color: var(--accent); }
.bg-purple { background: #3b0764; color: var(--purple); }
.pros { color: var(--green); }
.cons { color: var(--red); }
hr { border: none; border-top: 1px solid var(--border); margin: 1.5rem 0; }
</style>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="container">
<h1>🔬 模式A可行性研究:LangGraph Checkpoint ↔ Hermes集成</h1>
<div class="meta">
研究日期: 2026-07-10 | 技术栈: Hermes Agent 0.18.0 / LangGraph 1.x | 目标: 长周期Agent任务状态持久化
</div>
<h2>一、问题定义</h2>
<p><strong>痛点</strong>Hermes Agent的长周期任务(如跨Bot协作、定时多步骤报告、运维审计链)在执行到中途时,如果遇到超时(max_turns: 90 / gateway_timeout: 1800秒)、进程重启、或节点失败,<span class="bg-red badge">整个任务进度丢失</span>,必须从头重新执行。</p>
<p><strong>目标</strong>:在Hermes Agent的会话执行流程中引入「检查点」机制——每个逻辑步骤完成后保存状态快照,任务中断后可以从最近的检查点继续,而不是从头重来。</p>
<h2>二、技术对标</h2>
<table>
<tr><th width="25%">维度</th><th width="37%">LangGraph</th><th width="38%">Hermes Agent</th></tr>
<tr>
<td><strong>状态粒度</strong></td>
<td>超级步骤(super-step)边界 → 每次图节点执行完后保存checkpoint</td>
<td>整个会话(conversation-level → 每轮消息保存到session JSON,无步骤级</td>
</tr>
<tr>
<td><strong>线程模型</strong></td>
<td><code>thread_id</code> → 每次调用指定thread_idcheckpoint自动关联</td>
<td><code>session_id</code> → 每个会话一个ID,但无恢复执行机制</td>
</tr>
<tr>
<td><strong>存储后端</strong></td>
<td>InMemorySaver / SqliteSaver / PostgresSaver</td>
<td>JSON文件 + SQLite (kanban) + 内存 (memory)</td>
</tr>
<tr>
<td><strong>容错机制</strong></td>
<td>pending writes + checkpoint resume → 节点失败只重跑失败节点</td>
<td>无 → 失败后整个任务重跑</td>
</tr>
<tr>
<td><strong>时间旅行</strong></td>
<td>支持 → 回放到任意checkpoint并fork</td>
<td>不支持 → 只能查看历史消息</td>
</tr>
<tr>
<td><strong>人机协同</strong></td>
<td>原生interrupt机制 → 可在节点间插入人工审批</td>
<td>通过approval-gate实现(审批单个命令,非流程级)</td>
</tr>
<tr>
<td><strong>跨线程记忆</strong></td>
<td>Store → 跨thread_id的持久化key-value</td>
<td>Memory + User Profile → 跨会话持久化</td>
</tr>
</table>
<h2>三、Hermes现有的「准检查点」设施</h2>
<p>研究后发现,Hermes实际上已经有了3个与状态持久化相关的机制,但存在关键缺口:</p>
<h3>① Session JSON 文件</h3>
<p>位置:<code>/root/.hermes/sessions/session_{id}.json</code></p>
<p>保存完整的对话消息(messages)和元数据。但:<span class="bg-red badge">扁平化保存,不区分任务步骤</span>。重启后agent可以读取旧session,但无法知道"已执行到第几步"。</p>
<h3>② Kanban Task 系统</h3>
<p>位置:<code>kanban.db</code><code>tasks</code> 表 + <code>task_runs</code></p>
<p>已有完整的任务生命周期(status/runs/result/idempotency_key)。<span class="bg-green badge">最匹配checkpoint概念</span>的设施,但当前的kanban任务不和Agent执行流程绑定。</p>
<h3>③ Memory 持久化</h3>
<p>通过 <code>memory</code> + <code>user_profile</code> 实现跨会话知识持久化。但:这是知识层,不是执行状态层。</p>
<div class="card">
<h4>🔑 关键发现</h4>
<p><strong>Kanban的task_runs表已经隐含了「检查点」的雏形</strong>。每次task尝试(attempt)都有独立的started_at/completed_at/status/result。如果能做到:</p>
<ul>
<li>在Agent执行的每个「逻辑步骤」结束时,将步骤状态写入kanban的task_runs.result</li>
<li>重启后,Agent读取task_runs.result,判断已完成的步骤和下一个步骤</li>
<li>比引入LangGraph更轻量,100%复用现有基础设施</li>
</ul>
</div>
<h2>四、三种集成方案评估</h2>
<h3>方案AHermes原生Task Checkpoint <span class="bg-green badge">推荐</span></h3>
<div class="card">
<p><strong>思路</strong>:利用Hermes现有的kanban task系统,在每个逻辑步骤结束时写入步骤状态。Agent重启时从kanban读取已完成的步骤。</p>
<p><strong>工作量</strong><span class="bg-yellow badge"></span> — 约1-2天</p>
<p><strong>实现方式</strong></p>
<ol>
<li>在SOUL.md中增加一条铁律:<strong>"对长周期任务,每完成一个逻辑步骤,通过sqlite写入kanban.db的task_runs.result"</strong></li>
<li>开发一个 <code>checkpoint.py</code> 脚本,提供 <code>save_step(task_id, step_name, status)</code><code>get_state(task_id) → last_step</code></li>
<li>在cron任务和多步骤运维流程中集成——启动时检查是否有未完成的任务</li>
</ol>
<p><span class="pros">✅ 零新依赖</span> · <span class="pros">✅ 复用现有kanban体系</span> · <span class="pros">✅ 与任务调度紧密集成</span></p>
<p><span class="cons">⚠️ 仅适用于结构化/可分解的任务</span> · <span class="cons">⚠️ 需要Agent在SOUL中记忆"每步完成时存checkpoint"</span></p>
</div>
<h3>方案BHermes Checkpoint Plugin <span class="bg-blue badge">中长期</span></h3>
<div class="card">
<p><strong>思路</strong>:为Hermes Agent开发一个checkpoint插件,hook到Agent的每个tool_call/tool_result周期,自动保存执行轨迹。从底层实现步骤级快照。</p>
<p><strong>工作量</strong><span class="bg-yellow badge"></span> — 约1-2周</p>
<p><strong>实现方式</strong>:编写Hermes插件(plugins目录下),注册中间件拦截tool_call事件 → 序列化当前上下文到SQLite checkpoint表 → 重启时恢复上下文。</p>
<p><span class="pros">✅ 全自动,Agent无需记住手动存checkpoint</span> · <span class="pros">✅ 粒度精细</span></p>
<p><span class="cons">⚠️ Hermes插件API可能有限制</span> · <span class="cons">⚠️ 上下文中断和重建有歧义性风险</span></p>
</div>
<h3>方案C:引入LangGraph编排层 <span class="bg-red badge">不推荐</span></h3>
<div class="card">
<p><strong>思路</strong>:将Hermes的任务编排层替换为LangGraph RuntimeHermes仅作为前端控制器</p>
<p><strong>工作量</strong><span class="bg-red badge"></span> — 1-2个月</p>
<p><strong>实现方式</strong>:将复杂多步骤任务提取为LangGraph StateGraph → LangGraph管理checkpoint → Hermes通过system-bus调用LangGraph runtime</p>
<p><span class="pros">✅ 得到LangGraph生态的全部能力(checkpoint/time travel/interrupt</span></p>
<p><span class="cons">❌ 引入一个大框架作为编排依赖</span> · <span class="cons">❌ LangGraph面向代码定义图,适合确定性工作流而非Agent自发任务</span> · <span class="cons">❌ 我们绝大多数Agent任务是"对话驱动"而非"图驱动",不匹配LangGraph的核心模型</span> · <span class="cons">❌ 与现有Hermes的13个Profile集成成本极高</span></p>
</div>
<h2>五、推荐方案详述:方案A Hermes原生Task Checkpoint</h2>
<h3>5.1 架构设计</h3>
<div class="arch">┌──────────────────────────────────────────────────┐
│ Agent 执行流程 │
│ │
│ START → Step-1 → [Checkpoint] → Step-2 → [CKPT] │
│ ↓ │
│ kanban.db: task_runs │
│ result = {"completed_steps": [ │
│ {"step": 1, "name": "...", │
│ "output": "...", "ts": "..."} │
│ ]} │
│ │
│ 中断恢复流程: │
│ START → 读取kanban → 发现step=1已完成 │
│ → 跳过step-1 → 从step-2继续 │
└──────────────────────────────────────────────────┘</div>
<h3>5.2 核心组件</h3>
<table>
<tr><th>组件</th><th>位置</th><th>职责</th></tr>
<tr><td><code>checkpoint.sh</code></td><td>scripts/checkpoint.sh</td><td>保存步骤状态<br><code>./checkpoint.sh save task_xxx step_2 "数据清洗完成"</code></td></tr>
<tr><td><code>checkpoint.sh get</code></td><td>同上</td><td>读取任务当前进度<br><code>./checkpoint.sh get task_xxx → step_2/done</code></td></tr>
<tr><td><code>checkpoint.sh list</code></td><td>同上</td><td>列出所有未完成的任务<br><code>./checkpoint.sh list → task_xxx (step_2/5)</code></td></tr>
<tr><td>SOUL.md铁律</td><td>SOUL.md</td><td>引导Agent在每个逻辑步骤后自动调用checkpoint</td></tr>
<tr><td>DailyHealth cron</td><td>cron</td><td>优先恢复未完成的checkpoint任务</td></tr>
</table>
<h3>5.3 脚本接口设计</h3>
<div class="arch"># 保存步骤
checkpoint save &lt;task_id> &lt;step_num> &lt;step_name> [--output "摘要"]
→ 写入 kanban.db → SELECT/UPDATE task_runs.result
# 获取当前状态
checkpoint get &lt;task_id>
→ 返回: {task_id, total_steps, completed: [step1, step2, ...], last_step, last_update}
# 列表所有活跃任务
checkpoint list [--status pending|running|stalled]
→ 返回表格
# 标记完成
checkpoint done &lt;task_id> [--result "成功"]
→ 更新 task.status = completed
# 清理过期
checkpoint prune [--hours 72]
→ 删除N小时前的未完成任务</div>
<h3>5.4 集成工作流示例:SSH健康日报</h3>
<div class="arch">当前流程(无checkpoint):
启动 → step1:磁盘检查 → step2:内存检查 → step3:日志分析 → step4:生成报告
↓ 超时!
重启 → ❌ 全部重来
新流程(有checkpoint):
启动 → 读取checkpoint → 发现step3已完成
→ 跳过step1/2/3 → 从step4继续 → step4:生成报告 → 完成 ✅</div>
<h3>5.5 实施路线图</h3>
<table>
<tr><th>阶段</th><th>内容</th><th>工期</th><th>交付物</th></tr>
<tr>
<td><strong>Phase 1</strong></td>
<td>开发checkpoint.sh脚本(save/get/list/done/prune<br>+ kanban.db集成</td>
<td><span class="bg-yellow badge">1天</span></td>
<td>checkpoint.sh + 测试</td>
</tr>
<tr>
<td><strong>Phase 2</strong></td>
<td>更新SOUL.md + IDENTITY.md,添加checkpoint铁律<br>+ 引导Agent在长任务中自动调用</td>
<td><span class="bg-green badge">0.5天</span></td>
<td>SOUL.md更新</td>
</tr>
<tr>
<td><strong>Phase 3</strong></td>
<td>对接SSH健康日报等现有cron任务<br>+ 验证中断恢复流程</td>
<td><span class="bg-green badge">0.5天</span></td>
<td>集成测试报告</td>
</tr>
<tr>
<td><strong>Phase 4</strong></td>
<td>扩展至跨Profile协作场景<br>ops→finance→ops 链式任务)</td>
<td><span class="bg-yellow badge">1天</span></td>
<td>跨Profile checkpoint规范</td>
</tr>
</table>
<p><strong>总工期:约3天</strong> · 复杂度:低 · 风险:低</p>
<h2>六、风险评估</h2>
<table>
<tr><th>风险</th><th>等级</th><th>缓解措施</th></tr>
<tr>
<td>Agent忘记存checkpoint</td>
<td><span class="bg-yellow badge"></span></td>
<td>SOUL.md铁律 + cron任务启动时默认执行checkpoint检查。Phase2的SOUL更新定义清晰铁律。</td>
</tr>
<tr>
<td>checkpoint步骤粒度不精确</td>
<td><span class="bg-green badge"></span></td>
<td>结构化的cron/脚本任务天然有明确步骤边界。非结构化任务暂不强制checkpoint。</td>
</tr>
<tr>
<td>kanban.db写冲突</td>
<td><span class="bg-green badge"></span></td>
<td>SQLite单写线程 + kanban的claim_lock机制已支持并发。checkpoint通过独立SQLite连接写入。</td>
</tr>
<tr>
<td>checkpoint数据膨胀</td>
<td><span class="bg-green badge"></span></td>
<td>checkpoint prune命令定期清理。每步只保存结构化摘要(非原始消息),空间极小。</td>
</tr>
</table>
<h2>七、结论</h2>
<div class="verdict-box">
<h3>✅ 可行 · 推荐立即执行Phase 1</h3>
<p><strong>方案AHermes原生Task Checkpoint</strong>以最低的成本(3天)和最少的依赖(零新框架),解决了长周期Agent任务中断恢复的核心痛点。核心洞察是:<strong>Hermes的kanban系统已经是「准检查点」设施</strong>,只需要在SOUL层和脚本层做两件事:</p>
<ol>
<li>开发checkpoint.sh脚本,封装kanban读写操作</li>
<li>在SOUL.md中加入"每步完成必存checkpoint"的铁律</li>
</ol>
<p><strong>不推荐方案C(引入LangGraph</strong>LangGraph的checkpoint是为图结构工作流设计的,而我们大多数Agent任务是对话驱动的。引入LangGraph对于我们的场景如同"用航空母舰解决过河问题"——成本高、不匹配、不值得。</p>
<p><strong>方案BHermes Plugin</strong>可以作为中长期选项保留,当Agent任务变得更复杂、步骤粒度更细时再考虑。</p>
</div>
<hr>
<p style="text-align:center; color:var(--muted); font-size:.85rem;">
博海科技 · 运维BOT · 2026-07-10<br>
基于LangGraph 1.x Checkpointer模型 + Hermes Agent 0.18.0 kanban系统对标分析
</p>
</div>
</body>
</html>