Janus 是一个持久化 Agent 任务代理(Broker)。它位于 Agent 之间,以治理、路由和可观测性保障任务的可靠交付。
Janus 分为四层。外部客户端通过协议网关接入;无状态的核心服务负责任务生命周期、治理与后台 Worker;所有持久状态都外部化。每一层都可以独立扩展。
与 Janus 通信的 Agent 与工具
认证 · 防护 · 限流
协议适配与认证
无状态 · 水平扩展
外部化 · 高可用
接入层只做协议适配。核心服务拥有状态机与治理。PostgreSQL 是事实来源;NATS 承载投递与事件;Redis 只保存心跳与速率计数。
接入层只做协议适配和认证 —— 不持有任何业务逻辑。核心服务拥有任务状态机、策略执行、预算核算和审计;它们无状态、可水平扩展。后台 Worker(Outbox 发布器、事件投影、租约扫描、心跳清扫)独立运行,通过数据库租约和幂等键协调,多个副本并行也不会重复投递。
PostgreSQL 是任务状态、事务性 outbox、预算和审计投影的事实来源。NATS JetStream 通过持久化流和按邮箱的消费者承载任务投递与领域事件。Redis 只保存 Agent 心跳和短窗口速率计数 —— 不存任何持久事实。
accepted 与 queued 之间发生崩溃也绝不会丢失任务。工作的基本单位。任务携带一个不透明载荷(信封 envelope),从源 Agent 发往目标消费者。每个任务都有唯一 ID、租户作用域,以及完整的生命周期状态:
pending → claimed → in_progress → completed
→ failed
→ nacked → pending (重试)
→ dlq
一个命名队列,任务在此投递。Agent 从自己拥有的邮箱拉取任务。邮箱是持久的——即使 Agent 崩溃,任务也会保留,直到 Agent 恢复并拉取它们。
关键属性:
Agent 拉取任务时,会获得一个限时租约。租约防止其他 Agent 抢占同一任务。如果 Agent 未确认(ACK)就崩溃:
pending 状态,可被其他 Agent 重新拉取载荷包装器。包含:
type — 消息类型标识payload — 实际数据(结构化 JSON)priority — high / normal / lowcontext_refs — 对共享工件的引用(文件、图片、先前结果)Janus 通过五种目标类型把每个任务路由到正确的 Agent:
mailbox 或 agenttarget_type: capability,Janus 找到声明了该能力的在线 Agenttarget_type: group 投递给某个团队。团队成员关系来自每个 Agent 注册时的 team 字段——Janus 自动把团队解析为其在线成员的活跃邮箱target_type: intent 并附自然语言描述。配置了 LLM(JANUS_LLM_ENABLED)时,Janus 将文本映射到最匹配的能力,经在线 catalog 校验后确定性路由;未配置 LLM 时降级为关键词匹配每一次任务派发都会经过策略与预算检查:
Janus 原生支持多种 Agent 通信协议:
任务被双写至 PostgreSQL(真相源)与 NATS JetStream(快速投递)。如果 Broker 进程中途崩溃:
每个任务、邮箱和工件都限定在租户内。跨租户访问会被自动拒绝。所有审计事件都带有租户 ID 标签。