S09 Agent Teams - 代理团队流程图
agent 项目像是一个黑盒,工具调用等都是黑盒。很难100%复测项目,很多都是 ai 来决策,然后执行,不确定性很大,因此也需要很多兜底处理。
"在teammate的独立线程中执行的脚本是通过 _teammate_loop 来执行命令,执行的命令是调用大模型,大模型使用的工具是 teammate_tools的单独的工具,循环50次,先读取当前线程对应的角色对应的 .jsonl 文件,查看消息,如果有消息则添加到当前teamate的message 中,通用当模型返回没有工具调用时,break,进入下一次循环,如果有工具,则调用工具,把工具调用结果放入上下文,模型可能调用bash 工具,来执行命令,读取文件,或者获取文件夹信息等操作,_exec 是模型返回调用什么工具则执行对应的工具ag/s09_agent_teams.py:192 是将调用工具的结果打印到控制台,然后将输出放入上下文中,进入下一次循环。 多agent 的形式,也就是这里多成员的形式,比如两种角色,coder 和tester,coder完成任务可以send_message 给 tester,让他进行代码测试,也可以是tester 将发现的问题,通过 send_message方法把信息传给 coder,然后coder 执行修改,这两者的循环是同时在两个线程中,循环50次,结束后,读取.team/config.json,调整teammeta 的状态为 idle,然后保存配置"
messageBus 是一个简单的基于jsonl 文件的异步通信方案,通过在INBOX_DIR 中定义每个teammate 的信箱实现通信,方法有:send 发送消息,read_inbox 读取信箱,broadcast 广播,一次发送多次消息。其中发送消息,发送给指定teammate,通过只追加写入对方的 .jsonl 文件实现。read_inbox 读取全部消息后 drain 清空消息列表,确保消息不重复处理。 在模型调用时,在提供给 teammate 发送,读取,广播消息的tools。在 teammate 每次执行循环时,首先会读取自己的信箱,把消息添加到自身的message。在teammate 调用工具时,执行对应的消息操作
TeammateManager 是队友管理器,管理持久化队友的整个生命周期,包括配置存储和线程管理,核 心是通过 .team/config.json 持久化 teammate 配置 + 独立线程执行。构造函数是初始化队友管理器,创建队友管理器实例,加载或创建团队配置,包括配置的目录路径、配置文件路径、配置数据、线程字典。方法有 _load_config 加载配置文件,_save_config 保存配置文件,_find_member 查找成员,spawn 创建新线程运行代理循环,_teammate_loop 在独立线程中运行,_exec 执行工具调用(队友线程使用),_teammate_tools 获取队友可用的工具列表,list_all 列出所有队友信息,member_names 获取所有队友名称列表。
TeammateManager 是底层支撑类,lead 通过 spawn_teammate、list_teammates、broadcast 等工具接口间接使用它。TeammateManager 通过文件 read_text()、write_text() 读写配置,通过遍历查询成员。spawn 创建新队员或重新激活已存在的队友,启动独立线程执行代理循环。threading.Thread 创建新线程来执行队友的代理循环,thread.start() 在新线程中独立执行。target=self._teammate_loop 是线程目标函数,在独立线程中执行,处理消息和工具调用。队友有自己专用的系统提示词,处理消息历史、工具,然后进入循环 → 读取消息 → 调用 LLM → 处理返回 → 处理工具调用 → 将工具结果作为用户消息添加到历史。循环结束后,如果状态不是 shutdown,更新队友状态为 idle。在 teammate 中相当于有一个小型的 agent 循环。_exec 执行工具的方法,分发基础工具到对应的执行函数。_teammate_tools 获取队友可用的工具列表,通过返回自定义的工具列表限制 teammate 的能力以区分 lead 和 teammate。list_all 方便 lead 知道所有队友的状态。member_names 方便 lead 获取所有成员的名称。
本文档描述 s09_agent_teams.py 的持久化队友机制和团队通信流程。