
一条消息如何精准送达正确的AIClowder AI的A2A投递内核源码级拆解【免费下载链接】clowder-aiBuild AI teams, not just agents. Hard rails, soft power, shared mission.项目地址: https://gitcode.com/gh_mirrors/cl/clowder-aiClowder AI 是一个构建 AI 团队的开源项目多个 AI Agent猫猫共享同一个聊天线程协作干活。当你在群里发一句话它到底会被谁接住、按什么顺序处理、失败后用户看到什么——这套机制就是A2AAgent-to-Agent投递内核。本文从源码级拆解这条消息的完整生命周期帮你快速理解多 Agent 协作中精准投递是如何实现的。先说结论它不是路由流水线而是投递内核很多多 Agent 框架把消息分发理解为路由选一个模型、转发过去完事。Clowder AI 的 A2A 协议回答的是一组更精确的问题一个输入何时只存在于队列中对所有人不可见它何时进入共享时间线所有人可见队首何时必须被调度失败或重启之后用户会看到什么官方架构文档 a2a-protocol.zh-CN.md 把它定义为单条消息的生命周期而不是路由流水线。投递内核只追踪三样东西整个内核构建在三个对象之上其余状态正文暴露、重试、结构化责任都归属于各自的所有者只被引用绝不被复制对象持久化它是什么队列条目 Queue Entry✅有序的待处理输入 可恢复的来源身份 入队时的目标意图。在队列里 正常派发尚未开始聊天历史消息✅已进入聊天面板的消息带固定排序键被投递的消息携带因果性的dispatchRefs活动运行 Active Run❌ 内存内核为某 Agent 准入了某输入的在内存记录以及它唯一的回复气泡关键区分一个公开输入仅存在于队列中时对聊天面板和其他 Agent 完全不可见——直到单个准入步骤将它物化进历史。一条消息的七步旅程来源构造 → 持久化入队 → 严格选取队首 → 准入(唯一切换点) → 同气泡流式输出 → 就地终态 → 释放并继续来源构造消息用户、连接器、系统或 Agent 已决定内容、目的和目标。内核不会重新猜测意图。持久化入队公开输入、Agent 唤醒、私有输入都进入同一个持久化优先级队列然后触发一次排空drain。严格选取队首每线程排空只看比较器算出的那一个队首。目标繁忙就等待绝不扫描更优候选绝不跳队首。准入——唯一的切换点一个事务把条目提升为历史消息、把目标引用翻转为dispatched、为每个目标创建固定的processing回复气泡。只有事务提交后才创建内存活动运行并调用 Agent。同气泡流式输出输出只更新准入创建的那个气泡会话滚转、上下文压缩都停留在 Agent 客户端内部。就地唯一终态completed / failed / canceled 就地终结同一个气泡部分流式输出连同状态页脚被保留绝不替换成通用错误。释放并继续终态提交后释放该活动运行排空再次运行——下一个排队项不会无声干等。源码实现集中在 InvocationQueue.ts谁在等与 InvocationTracker.ts谁在跑这对互补模块中出队处理则由 QueueProcessor.ts 承担。队首怎么选优先级比较器的三层规则队列只有一个配一个稳定的比较器。打开 InvocationQueue.ts 的compareEntries排序规则清晰可读手动置顶行优先——用户拖拽重排的位置position先于一切且按同一用户范围隔离防止跨用户插队urgent先于normal——由PRIORITY_RANK常量表urgent0normal1决定同优先级按入队时间 FIFO。不存在第三种由消息类型或来源派生的隐藏优先级——这是刻意的设计拖拽重排会原子地提交整个可见顺序因此只有显式手动操作才会覆盖默认规则。一个细节值得注意normalizedPriority会把普通 Agent 来源非续写类强制归为normal防止 Agent 之间互相加塞制造优先级风暴。事件驱动的排空为什么消息不会卡住排空是事件驱动的——不是定时器也不是优先级调度器。它只在队首可执行内容真正变化后运行一次入队一次移除或重排一个活动运行完成外部所有者就未准入候选提交了事实启动时发现非空队列再加上一个脏位dirty-bit排空进行途中到达的事件会在排空所有者释放前强制再跑一轮。结果是一个结构性不变量系统不可能稳定停留在队列非空、队首可执行、没有活动运行、且没有排空的状态。任何东西都不会无声堆积——这不是看门狗监控而是结构性保证。回调侧的投递决策则收敛在 MessageDeliveryService.ts已入队的消息必须等messages_delivered事件而入队失败/零目标时 fail-open 到实时广播——宁可重复可见不可静默丢失。回退与交接目标缺失或失败时怎么办回退极其克制仅适用于队首公开消息、且仅当线程完全空闲时。优先级链最近一个已完成回复气泡的成员 → 服务器默认成员 → 可见的投递失败。处于 processing / failed / canceled 状态的气泡成员不作候选。而显式目标绝不回退——一个失败的确切目标只会产生带类型的失败和诊断信息绝不无声改派给他人。A2A 交接则区分了两种交接成员内部续写压缩上下文、会话滚转——对生命周期不可见仍是同一次调用、同一个气泡协议可见的 A2A 交接——携带有效目标的已完成回复创建一个引用同一条回复消息的唤醒不复制成第二条消息下一跳开始。每一跳独立终结只关闭自己的input → target步骤。如果 Agent B 在回答 A 时提及了 D那并不会重新打开 A→B也不让 A 递归等待 D。失败时托管权只返回给来源所有者指名的确切前驱——绝不从消息作者字段推断。用户控制四种显式操作操作效果边界追加 Append输入并入目标现有运行不创建新运行引导 Steer取消目标进行中运行准入全新运行见steerRequestedByCatIds字段取消排队项删除未派发条目不影响任何运行停止 Agent快照并取消确切的活动运行走正常canceled回调关气泡它们是显式操作不是对正常调度的补救手段也绝不暂停或重排队列。线程之间同样隔离每个线程有自己独立的排空和队首线程间共享只有一次显式的交叉张贴cross-post。源码速查想深入看哪里关注点模块路径队列与优先级比较器InvocationQueue.ts出队与自动处理QueueProcessor.ts活跃调用互斥追踪InvocationTracker.ts回调投递决策MessageDeliveryService.ts启动恢复interrupted 合成StartupReconciler.tsA2A 提及路由a2a-mentions.ts协议语义全文a2a-protocol.zh-CN.md总结五条设计规则撑起精准投递整个投递内核建立在五条规则上也是它精准的来源每个事实只有一个所有者——其他人引用不复制、不重新裁定在唯一切换点上改变——顺序与副作用只在单个持久化准入事务提交时改变不从一个事实推断另一个事实——已派发 ≠ 已看到入队目标只是意图派发时重新校验每个运行只有一个终态——已提交的裁决无法撤销或复制同代重放返回已提交结果投影可重建、失败关闭fail-closed——证据缺失时省略动态断言并显示诊断绝不伪造已看到/正在处理/已完成。对新手来说记住一句话就够了Clowder AI 的 A2A 内核用一个队列 唯一准入事务 事件驱动排空把多 Agent 协作中最容易出事故的消息投递变成了一个结构性保证——不靠运气、不靠定时器消息要么精准送达要么可见地失败。【免费下载链接】clowder-aiBuild AI teams, not just agents. Hard rails, soft power, shared mission.项目地址: https://gitcode.com/gh_mirrors/cl/clowder-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考