
当单一 Agent 在面对复杂业务场景(如供应链异常处理、跨系统运维自愈)时,常常陷入“思维瓶颈”——上下文碎片化、工具冲突、决策延迟。Hermes 作为新一代事件驱动型 AI Agent 框架,借鉴分布式消息中间件与 Actor 模型的思想,将“规划-执行-反思”拆解为可独立伸缩的微服务单元,并引入“总线式协作”机制。本文从源码级实现出发,剖析其核心通信协议、动态工作流编排、以及生产级容错策略,并提供一套基于 Docker Swarm 的高可用部署方案。
Hermes 并非 LangChain 的简单替代,而是对多 Agent 协作模式的底层重构。其核心抽象是 Agent Actor——每个 Agent 拥有独立的消息队列(Mailbox)、状态存储(State Store)和工具集(Toolbox),通过事件总线(Event Bus)进行异步通信。
OrderCreated、AnomalyDetected),并根据本地状态机触发动作,无需中央协调者。这种去中心化拓扑天然适合分布式部署。组件 | 职责 | 技术实现 |
|---|---|---|
Event Gateway | 事件路由、持久化、重放 | 基于 Apache Pulsar(或 Kafka)的 Topic 分区 |
Agent Runtime | 运行 Agent 逻辑,维护状态机 | Python 3.11 + 自定义 Actor 框架(基于 asyncio) |
Tool Registry | 工具注册与发现,支持版本管理 | etcd + gRPC 服务发现 |
Memory Mesh | 共享记忆层,支持跨 Agent 知识查询 | Milvus + 向量索引,支持相似度检索 |
Observer | 监控所有 Agent 心跳与吞吐量 | Prometheus + 自定义指标 |
Hermes 中 Agent 之间的通信不采用同步 HTTP 调用,而是通过领域事件(Domain Event) 解耦。一个完整的业务流程由多个事件串联成有向无环图(DAG)。
使用 Avro 定义事件格式,确保跨语言兼容(如 Java 编写的工具服务也可消费):
{
"type": "record",
"name": "InventoryChecked",
"fields": [
{"name": "orderId", "type": "string"},
{"name": "sku", "type": "string"},
{"name": "available", "type": "boolean"},
{"name": "timestamp", "type": "long"}
]
}transitions 库)每个 Agent 维护一个有限状态机,事件触发状态转移并执行动作:
from transitions import Machine
class OrderFulfillmentAgent:
states = ['idle', 'checking_inventory', 'allocating', 'shipping', 'completed', 'failed']
def __init__(self):
self.machine = Machine(model=self, states=OrderFulfillmentAgent.states, initial='idle')
self.machine.add_transition('inventory_checked', 'checking_inventory', 'allocating', after='allocate_stock')
self.machine.add_transition('allocation_success', 'allocating', 'shipping', after='create_shipment')
# 失败回退
self.machine.add_transition('allocation_failed', 'allocating', 'failed', after='publish_failure_event')event_id 和 source_version,Agent 使用 Redis 记录已处理 ID(TTL 设置为 7 天),重复事件直接忽略。Hermes 的工具不直接绑定在 Agent 代码中,而是通过Sidecar 模式部署为独立进程,通过 gRPC 暴露接口。
在 tool_registry 中注册工具时需声明:
read-only, network)示例工具服务(使用 FastAPI + gRPC 双协议):
class FileReaderTool:
async def read_file(self, path: str, max_lines: int = 100) -> str:
# 严格路径校验,防止目录遍历
safe_path = os.path.join(BASE_WORKSPACE, os.path.basename(path))
async with aiofiles.open(safe_path, 'r') as f:
return '\n'.join([line async for line in f][:max_lines])Agent 调用工具时,设置 deadline(gRPC 的 timeout)并携带 retry 策略(指数退避)。若工具连续失败 3 次,熔断器打开,Agent 直接返回错误事件,避免长时间阻塞。
不同于 K8s 的复杂配置,Hermes 推荐使用轻量级 Docker Swarm 满足大部分企业内网需求,强调快速故障转移。
stack.yml 节选)version: '3.8'
services:
event-gateway:
image: apachepulsar/pulsar:3.2.0
command: bin/pulsar standalone
networks:
- hermes-net
agent-runtime:
image: hermes/agent:latest
deploy:
replicas: 3
placement:
constraints: [node.labels.role == worker]
update_config:
parallelism: 1
delay: 10s
environment:
- PULSAR_SERVICE_URL=pulsar://event-gateway:6650
- AGENT_TYPE=order_fulfillment
volumes:
- ./configs/agent_${AGENT_TYPE}.yaml:/app/config.yaml
depends_on:
- event-gateway
- tool-sidecar
tool-sidecar:
image: hermes/toolbox:latest
deploy:
replicas: 2 # 工具无状态,可水平扩展
environment:
- TOOL_REGISTRY_ENDPOINT=http://etcd:2379
etcd:
image: quay.io/coreos/etcd:v3.5.9
command: etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://etcd:2379
networks:
- hermes-net
milvus:
image: milvusdb/milvus:2.3.3
# ... 向量存储配置AGENT_TYPE 的 Agent Runtime 可部署在不同的 Swarm 节点,通过环境变量隔离。orderId 哈希进行分区,确保同一订单的事件顺序处理。每条日志附带 trace_id、agent_id、event_sequence,便于聚合分析:
{
"timestamp": "2026-08-02T10:23:45.123Z",
"trace_id": "a1b2c3",
"agent": "inventory_checker_7",
"event": "InventoryChecked",
"decision": "allocate",
"latency_ms": 320,
"tool_calls": [{"tool": "db_query", "duration": 280}]
}使用 OpenTelemetry 为每个事件处理链创建 Span,并记录 Agent 的“思考”摘要(压缩后的文本)。通过 Jaeger 可直观看到:
groups:
- name: agent_health
rules:
- alert: AgentStuck
expr: rate(agent_state_transition_total{state="checking_inventory"}[5m]) < 0.1
annotations:
summary: "Agent {{ $labels.agent_id }} 可能卡在检查库存状态"单节点 Pulsar 约支持 10 万 msg/s(持久化开启),瓶颈通常在 Agent Runtime 的处理速度。
每个 Agent Actor 占用约 50MB 内存(含状态缓存),建议每 vCPU 承载 10~15 个并发 Actor。若需要处理突发流量,可启用 自动伸缩(基于 Swarm 的 docker service scale 结合 Prometheus 自定义指标)。
当某个 Agent 崩溃重启后,从 Pulsar 的特定位置(如上次确认的 messageId 之后)重新消费事件,实现 状态重建。注意必须保证业务操作的幂等性(如 allocate_stock 需检查是否已分配)。
对于跨 Agent 的长事务(如“订单-支付-库存”),Hermes 提供 Saga 编排器(以 Event 驱动的状态机),通过补偿事件(如 InventoryRollback)回滚已执行的操作。
监控系统发出 ServiceDown 事件,Hermes 集群按以下流程自动处理:
kubectl get pods 和 curl health,发布 DiagnosisResult。ActionPlan。kubectl rollout restart),发布 ActionExecuted。整个过程事件驱动,每个 Agent 可独立演进和测试。
Hermes 框架的核心价值在于将 Agent 从“单体决策体”进化为“协作微服务”,解决了传统框架在规模、解耦、容错上的根本局限。其生产级特性包括:
未来规划:
架构师应思考的三个命题:
1. 当事件风暴规模超过 50 种类型时,如何治理 Schema 版本兼容?(答:使用带版本号的 Topic 和兼容性检查工具) 2. 如何平衡 Agent 自主性与企业合规约束?(答:通过“策略引擎”动态注入权限规则) 3. 事件溯源日志膨胀后,如何高效归档与压缩?(答:基于时间窗口的冷热分层存储)
Hermes 不是魔法,而是一套严密的工程化框架。如果你正面临多 Agent 协作的混乱,不妨从一个小型域事件开始试点,逐步将混沌化为有序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。