Hermes Agent 的 Kanban 多智能体工作流

2026-06-03

别再手动写博客了:4 张卡片搞定素材到发布

凌晨 2 点,4 个 Agent 自动跑完了我一篇博客从素材收集到网站部署的全部流程。没有人工介入,也没有手动触发。

这不是 demo,是我跑了两周的真实流水线。

单 Agent 的天花板

用 Hermes Agent 写东西,最初就是一个人干所有活:选题、搜集素材、写稿、检查、发布。任务一多就暴露问题——上下文窗口塞不下,长文写到一半模型开始车轱辘话,或者干脆超时。

试过 delegate_task,它能在当前 session 里 fork 一个子 Agent 跑任务,跑完再 join 回来。短任务好用,一旦子任务需要几分钟甚至十几分钟,父 Agent 就卡在那等,超时了还得手动重跑。更麻烦的是,子 Agent 的记忆不持久,crash 了就彻底丢了。

我需要的是一套任务队列:把大任务拆成小卡片,每张卡片独立执行、独立留档。Kanban 就是干这个的。

上下文溢出:小黑蹲在太小的纸箱里写字,纸条飘走消失

Kanban 是什么

一句话说完:Hermes Kanban 是一个持久化的任务看板,存在 SQLite 里,让多个命名 Agent 协作完成任务。

delegate_task 的核心区别:

delegate_task Kanban
调用方式 函数调用,fork→join 持久化队列,fire-and-forget
子 Agent 匿名,无记忆 有名 Profile,有持久记忆
失败处理 失败了就失败了 可 block→unblock,可 crash 后 reclaim
人工介入 不支持 随时通过 comment/unblock 介入
审计 压缩后丢失 SQLite 里永久保留

底层是一张 SQLite 表,所有 Hermes profile 共享。每条任务有标题、分配人、状态(triage→todo→ready→running→blocked→done→archived)、依赖关系、评论线程。Dispatcher 长驻循环,自动回收超时任务、提升就绪任务、spawn 对应的 worker。

4 张卡片的博客流水线

我的流水线是 4 个任务串行的 pipeline:

T1: 素材收集    → T2: 撰写文章    → T3: 安全检查    → T4: 发布

4张卡片多米诺:小黑推倒第一张,后面自动接力

每张卡片加载不同的 skill 组合:

  • T1 加载 blog-topic-pickerdbs-content,做选题诊断和素材整理
  • T2 加载 ruite-bloghumanizer-zhdbs-ai-checkian-xiaohei-illustrations,写稿 + AI 痕迹检测 + 配图
  • T3 加载 blog-topic-picker,做敏感信息扫描
  • T4 加载 ruite-blogdbs-xhs-titleguizang-social-card-skill,做标题优化、封面设计、发布

创建方式是写一个 Python 脚本,用 CLI 命令逐个创建卡片并建立依赖链。核心逻辑大概是这样:

import subprocess, json

def kanban_create(title, assignee, body, skills, parent=None, workspace="scratch"):
    cmd = [
        "hermes", "kanban", "create", title,
        "--assignee", assignee,
        "--body", body,
        "--skill", ",".join(skills),
        "--workspace", workspace,
        "--json"
    ]
    if parent:
        cmd += ["--parent", parent]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return json.loads(result.stdout)["task_id"]

# T1: 素材收集
t1 = kanban_create(
    "素材收集与选题诊断",
    assignee="writer-agent",
    body="收集素材,做五维选题诊断",
    skills=["blog-topic-picker", "dbs-content"],
    workspace="dir:~/articles/current"
)

# T2: 撰写(依赖 T1)
t2 = kanban_create(
    "撰写文章并自检",
    assignee="writer-agent",
    body="基于 T1 素材撰写,做 AI 痕迹检测和配图",
    skills=["ruite-blog", "humanizer-zh", "dbs-ai-check", "ian-xiaohei-illustrations"],
    parent=t1,
    workspace="dir:~/articles/current"
)

# T3: 安全检查(依赖 T2)
t3 = kanban_create(
    "安全检查",
    assignee="writer-agent",
    body="扫描敏感信息",
    skills=["blog-topic-picker"],
    parent=t2,
    workspace="dir:~/articles/current"
)

# T4: 发布(依赖 T3)
t4 = kanban_create(
    "标题优化与发布",
    assignee="writer-agent",
    body="优化标题,设计封面,部署网站,推送草稿箱",
    skills=["ruite-blog", "dbs-xhs-title", "guizang-social-card-skill"],
    parent=t3,
    workspace="dir:~/articles/current"
)

T1 完成后 dispatcher 自动把 T2 从 todo 提升到 ready,spawn worker 开始写稿。T2 完成后 T3 接上,以此类推。整个链路跑完,一篇文章就从零到部署好了。

workspace 参数决定 worker 能访问的目录。scratch 是临时目录,用完删;dir: 是共享持久目录,适合多张卡片需要读写同一份文件的场景。我这里用 dir:~/articles/current,因为 T2 需要读 T1 收集的素材,T4 需要读 T2 写好的文章。

不只是串行流水线

4 张卡片串行是最简单的模式。Kanban 支持更灵活的编排:

Fan-out + Fan-in(并行研究再综合):

T1: 研究成本 (agent-A)  ──┐
                           ├── T3: 综合建议 (agent-B)
T2: 研究性能 (agent-A)  ──┘

T1 和 T2 同时跑,两者都完成后 T3 自动启动。设置方式就是把 T3 的 parents 设成 [T1, T2]

Human-in-the-loop(人工审查卡点):

T1: 实现功能 (engineer) → T2: 代码审查 (reviewer)

reviewer 发现需要人工判断时,调用 kanban_block(reason="需要确认 API 设计") 阻塞。人在 CLI 或 Dashboard 上看完后执行 hermes kanban unblock <task_id>,worker 继续执行。

Goal Mode(目标驱动的长任务):

kanban_create(
    title="翻译整个文档站为法语",
    body="验收标准:每页翻译完成,无英文残留,链接完整",
    assignee="translator-agent",
    goal_mode=True,
    goal_max_turns=15
)

worker 在目标循环里反复执行,每轮由 judge 评估是否达标,没达标且还有预算就继续,预算耗尽就 block 等人看。

踩坑记录

跑了两周,踩过几个比较有代表性的坑:

1. Profile 名写错,卡片永远停在 ready

dispatcher 不会纠正不存在的 assignee 名。卡片创建了,状态永远是 ready,不会有人来领。创建卡片前先跑一遍 hermes profile list 确认目标 profile 存在。

2. 下游 Worker 看不到上游的上下文

这是最容易犯的错误。Kanban worker 是独立 session,T2 的撰写者不知道 T1 收集者具体做了什么、输出了什么。上下文传递靠两样东西:

  • 磁盘文件(主要通道,可靠)
  • 卡片的 body 和 comments(补充,放简要 metadata)

所以 workspace 要用 dir: 共享目录,让前一张卡片把产出写到固定位置。不要假设下一个 worker “看到”了上一个的 kanban_summary。

3. 在 body 里用散文写依赖关系

如果 T2 依赖 T1,必须用 parents=[T1] 建立链接。光在 body 里写”等 T1 完成后再做”没用,dispatcher 不会解析自然语言里的依赖。

4. Worker 不是交互式 session

Worker 无人值守。它不能弹出问题问你。需要人工判断时,worker 应该用 kanban_comment 写清楚情况,然后 kanban_block(reason="...") 阻塞等人介入。

还能更猛

我自己的 4 卡片流水线是比较保守的用法。YouTube 频道 Tonbi’s AI Garage 展示了一个 18 Agent 并行的工作流:scout Agent 搜痛点,orchestrator 评分筛选,3 个 researcher 并行验证,builder 出工具,tester 做测试,最后 Telegram 通知人工审批。一次运行完成 97 个任务,系统自己修好了一个坏掉的交付物。模板开源于 GitHub。

对比来看,Kanban 适合的任务规模可以从 2-3 张卡片的简单流水线,扩展到几十个 Agent 的复杂编排。核心都是同一套:拆任务、建依赖、自动调度、持久记录。

几个实用的 CLI 命令

日常操作用这几个就够了:

# 查看当前看板所有任务
hermes kanban list

# 实时跟踪某个任务的日志
hermes kanban tail <task_id>

# 手动回收卡住的任务
hermes kanban reclaim <task_id>

# 给任务加备注
hermes kanban comment <task_id> "这里需要检查一下"

# 诊断看板状态
hermes kanban diagnostics

也可以不写代码,直接在 CLI 里创建完整流水线:

hermes kanban create "素材收集" --assignee writer --skill blog-topic-picker,dbs-content --json
hermes kanban create "撰写文章" --assignee writer --parent <t1_id> --skill ruite-blog,humanizer-zh --json

如果你的环境支持 Docker Compose,可以把 dispatcher 作为常驻服务编排,避免手动启动。我的环境比较老,用的是单容器 docker run 方式跑 gateway,效果一样,只是管理上不如 compose 优雅。

写在最后

Kanban 不是什么新发明,就是把项目管理里的看板搬到了 AI Agent 协作场景里。但它解决了一个真实问题:当单个 Agent 的上下文和算力不够用时,怎么把任务拆开、分出去、收回来。

我现在写博客的流程已经基本自动化了。人工做的只剩选题决策和最终审稿。如果你也在用 Hermes Agent,建议从最简单的 2 卡片 pipeline 试起:一个收集素材,一个写稿。跑通了再加检查、发布这些环节。

参考链接:
- Hermes Agent 官方文档 - Kanban
- Tonbi 的 18 Agent 工作流(YouTube)
- Tonbi 开源模板(GitHub)