智能体间通信
智能体间通信
相关源文件
以下文件为本维基页面的生成提供了上下文:
src/protocol_tests.rssrc/protocol_tests/comm_responses.rssrc/server/client_actions.rssrc/server/client_comm.rssrc/server/client_comm_channels.rssrc/server/client_comm_context.rssrc/server/client_comm_message.rssrc/server/client_lifecycle.rssrc/server/client_session.rssrc/server/client_state.rssrc/server/comm_await.rssrc/server/comm_control.rssrc/server/comm_session.rssrc/server/comm_sync.rssrc/server/debug_swarm_read.rssrc/server/swarm.rssrc/server/swarm_channels.rssrc/server/swarm_mutation_state.rssrc/server/swarm_persistence.rssrc/tool/communicate.rssrc/tool/communicate_tests.rssrc/tool/communicate_tests/assignment.rssrc/tool/communicate_tests/end_to_end.rssrc/tool/communicate_tests/input_format.rssrc/tui/backend.rs
智能体间通信(Comm)为群组(Swarm)内的智能体提供了消息路由、共享状态和同步的层。它负责在不同会话类型(有头会话 vs. 无头会话)之间传递消息,并通过一个键值对黑板系统管理共享上下文的传播。
消息路由与投递
服务器通过 handle_comm_message 路由通信请求,支持三种主要范围:广播、基于频道和直接消息(DM)src/server/client_lifecycle.rs:7-11。
通信范围
| 范围 | 实现方式 | 目标受众 |
|---|---|---|
| 广播 | SwarmEventType::Message | 所有已加入同一 swarm_id 的成员 src/server/client_comm_message.rs:8-12。 |
| 频道 | handle_comm_subscribe_channel | 通过 channel_subscriptions 显式加入指定频道的会话 src/server/client_lifecycle.rs:60-64。 |
| 直接(DM) | target_session 参数 | 单个特定的 session_id src/server/client_comm_message.rs:8-12。 |
唤醒功能与目标状态
当消息发送到目标会话时,系统会评估目标的状态以确定投递机制:
- 空闲目标:如果目标智能体处于活跃状态且其
Mutex<Agent>未被锁定,则通过process_message_streaming_mpsc立即处理消息src/server/client_actions.rs:123-126。 - 忙碌目标:如果智能体当前正在“思考”或“运行”,则消息会作为
SoftInterrupt通过queue_soft_interrupt_for_session排队src/server/client_actions.rs:199-208。这确保了智能体在其下一轮开始时或在工具执行检查点期间收到信息src/server/client_actions.rs:15-15。 - 无头目标:发送给无头智能体(即未附加 TUI 的智能体)的消息,通过与其
SwarmMember条目关联的event_tx频道进行投递src/server/comm_session.rs:173-182。
来源: src/server/client_lifecycle.rs:7-11, src/server/client_actions.rs:123-208, src/server/comm_session.rs:173-182
共享上下文(CommShare 与 CommRead)
群组维护一个共享上下文黑板,允许智能体在整个群组中持久化并检索事实或变量。
handle_comm_share:在shared_context映射中插入或更新一个键值对,该映射以swarm_id为键。它会通过NotificationType::SharedContext自动通知所有其他群组成员该更新src/server/client_comm_context.rs:6-7。handle_comm_read:允许智能体查询黑板中的特定键,或检索其当前群组的所有条目src/server/client_comm_context.rs:6-7。handle_comm_read_context:提供一种方法,供智能体将其本地上下文与全局群组状态同步src/server/client_lifecycle.rs:28-31。
数据流:共享上下文更新
下图展示了一个来自智能体的 CommShare 请求如何传播到黑板和其他智能体。
来源: src/server/client_comm_context.rs:6-7, src/server/client_lifecycle.rs:28-31
文件冲突与触摸追踪
为防止智能体相互覆盖彼此的工作,服务器会追踪群组中所有会话的文件访问情况。
追踪机制
FileAccess:一个包含session_id、PathBuf和访问类型(读/写)的结构体src/server/client_lifecycle.rs:39-41。file_touches:一个全局映射HashMap<PathBuf, Vec<FileAccess>>,记录哪些会话访问过特定文件src/server/client_session.rs:137-137。files_touched_by_session:一个反向查找映射,用于在会话关闭或清除时快速清理追踪记录src/server/client_session.rs:138-138。
冲突通知
当智能体执行一个“触摸”文件的工具操作时,服务器会检查访问历史。如果检测到冲突(例如,另一个智能体正在编辑同一个文件),则会向请求的智能体发送一个 FileConflict 通知,以防止覆盖 src/server/client_lifecycle.rs:39-44。
来源: src/server/client_lifecycle.rs:39-44, src/server/client_session.rs:137-138
系统集成图
此图将通信逻辑流映射到服务器内的特定代码实体和数据结构。
来源: src/server/client_lifecycle.rs:60-64, src/server/client_comm.rs:6-8, src/server/comm_session.rs:24-25, src/server/client_session.rs:135-141
通信中的会话生命周期
当会话被重置或清除时,通信元数据必须同步,以防止出现“幽灵”订阅或过时的上下文。
handle_clear_session:当会话被清除时,它会调用remove_session_file_touches和remove_session_channel_subscriptions来清除追踪状态src/server/client_session.rs:197-203。它还会处理在活跃的swarm_plans中重命名参与者,以确保在会话 ID 更改时的连续性src/server/client_session.rs:8-11。handle_comm_spawn:编排新群组成员的创建。对于有头会话,它使用prepare_visible_spawn_session来启动一个新的终端进程src/server/comm_session.rs:171-182。对于无头会话,它使用create_headless_session创建一个没有附加 TUI 的后台Agentsrc/server/comm_session.rs:6-9。handle_comm_stop:优雅地将一个会话从群组中移除,清理其中断队列和频道订阅src/server/comm_session.rs:10-12。
来源: src/server/client_session.rs:123-203, src/server/comm_session.rs:6-182