SuperAPI AI 工具集

ag2-network-discussion

智能体与模型

查看项目

更新于 10-15 18:00

技能介绍

ag2-network-discussion 是 AG2 Network 的一个适配器(Adapter),用于开启一个名为 discussion 的频道,实现 N 方(2 人及以上)的轮询式(round-robin)多轮对话。参与者按固定顺序依次发言,不断循环,直到你显式关闭它为止。

【用途】 适用于需要固定顺序、多方轮流发言的多轮交流场景,例如:三方 Agent 依次辩论、固定阵容的圆桌讨论或头脑风暴、多位评审轮流对同一份草稿发表意见,以及任何“每轮每个参与者都有一个发言席位”的固定顺序 N 方轮流发言。

文档同时说明了不适用的情况:需要条件式交接(如“若 alice 提到安全,则交给安全专家”)应使用 ag2-network-workflow;每个步骤只执行一次的流水线应使用 ag2-network-workflow 的 TransitionGraph.sequence([...]);两名参与者且无固定顺序应使用 conversation;严格的 1 问 1 答应使用 consulting。

【前置条件】 需先阅读 ag2-network-quickstart,默认你已了解 Hub.open、HubClient.register、频道生命周期以及 Envelope 基础。

【形态与配置】 参与者为 2 人及以上;发言顺序为轮询制(创建者最先,随后按注册顺序);不自动关闭;终止方式为显式 channel.close() 或 TTL。默认视图为 NamedWindowedSummary(recent_n=N*2),其中 N 为参与者数量,使每个 Agent 的投影大致覆盖最近两个完整循环。默认期望值(expectations)为 turn_within(120s, warn) 与 turn_within(600s, hide)。可用旋钮为 {"ordering": ORDERING_ROUND_ROBIN}(目前仅提供这一种 ordering)。

【主要能力与机制】 HubClient.register(...) 默认会附加 NetworkPlugin,带来 peers / channels / tasks / context / delegate 等身份级动词。DiscussionAdapter.tools_for(...) 返回空数组——讨论适配器不提供频道专属工具(没有 say)。参与者仅通过返回一条回复来贡献其发言回合,默认处理器会把该轮的 EV_TEXT(reply.body) 作为该回合的贡献发布。因为不存在 say,也就没有讨论特有的“重复发送”风险。发言权完全由 validate_send 强制执行:任何非 state.expected_next_speaker 的发送都会被以 ProtocolError 拒绝。can_send 探测让每个处理器在非自己回合时跳过 LLM 调用。

状态对象 DiscussionState 包含 participant_order(创建时按 Participant.order 排序固定)、expected_next_speaker 与 turn_count。每次接受一条 EV_TEXT 后,轮询按 (current_index + 1) % len(participant_order) 推进。可通过 hub._adapter_states[channel_id] 读取状态用于检查或测试(下划线表示这是运维 API,不用于生产 Agent 逻辑)。

【使用方式】 文档给出了最小示例:导入 ag2 相关模块(Agent、AnthropicConfig、MemoryKnowledgeStore,以及 ag2.network 中的 EV_CHANNEL_CLOSED、EV_TEXT、ORDERING_ROUND_ROBIN、Hub、HubClient、LocalLink、Passport、Resume)。用 Hub.open(MemoryKnowledgeStore(), ttl_sweep_interval=0) 打开 hub,用 LocalLink 连接,创建三个 HubClient 并分别 register 三个 Agent(示例中 attach_plugin=False 以精简)。由 alice.open(type="discussion", target=[bob.agent_id, carol.agent_id], knobs={"ordering": ORDERING_ROUND_ROBIN}) 打开频道并发送主题。target 列表顺序很重要,它决定创建者之后的轮转顺序(alice → bob → carol → …)。示例通过自定义 wait_for_text_count 等待 6 条 EV_TEXT(即 2 个完整循环)后调用 channel.close(reason="cap_reached"),再关闭各 client 与 hub。字符串形式 type="discussion" 与 ordering="round_robin" 同样可用。

【回合跳过与自定义处理器】 当 alice 发出第一条信封时,hub 把 EV_TEXT 扇出给 bob 和 carol,两个默认处理器并行触发:bob 的处理器调用 can_send 得到“是”,运行 Agent.ask 并发送回复;carol 的调用得到“否”,直接返回而不调用 LLM。若编写自定义处理器,应沿用该模式,并把非文本信封交给 default_handler 以保留 EV_CHANNEL_INVITE 的自动确认。文档给出了 my_handler 的示例代码结构:非 EV_TEXT 交给 default_handler;否则 await hc.can_send(...)(异步,必须 await),非本回合则跳过 LLM 调用。

【HumanClient 参与】 讨论参与者不一定是 Agent。可以注册 HumanClient(hc.register_human(Passport(name="user", kind="human")))并像其他参与者一样加入顺序。它没有自动应答的 notify 处理器,需由应用驱动其回合:用 on_envelope(...) 订阅(或 next_envelope(...) 拉取),收到信封时检查 await hc.can_send(channel_id, user.agent_id),若轮到人类则提示并 await user.send(channel_id, text),否则等待。

【校验规则】 DiscussionAdapter.validate_send 会拒绝:来自非 expected_next_speaker 的 EV_TEXT(抛 ProtocolError);非参与者的发送;发往已关闭频道的发送。协议信封(EV_CHANNEL_、ag2.task.)绕过回合检查,因为它们属于记账而非轮流发言。

【关闭方式】 discussion 从不自动关闭。文档列出四种模式:应用侧上限(调用 channel.close(),由你的编排代码决定)、Agent 侧工具(通过 ChannelInject,由 LLM 决定)、自定义适配器子类(由框架决定,讨论中少见)、以及 TTL / turn_within 期望值(仅作安全网)。reason 会流入 EV_CHANNEL_CLOSED.event_data["reason"]。

【可选 ordering 与迁移】 目前仅发布 ORDERING_ROUND_ROBIN,传入其他 ordering 会在创建时抛错。未来可能加入 dynamic、weighted、priority 等。若现在就需要条件式轮流,应改用 workflow 适配器的 TransitionGraph.round_robin(participants, max_turns=N)。

【默认期望值】 turn_within 120s 触发 warn,记录 AUDIT_KIND_EXPECTATION_VIOLATED,频道保持打开;turn_within 600s 触发 hide,在视图投影中把慢发言者标记为“skip”一个循环,频道仍保持打开。讨论刻意不因期望值而自动关闭——慢发言者不应终止整个讨论组。如需在卡顿时终止,可通过 ag2-network-governance 覆盖期望值改为 auto_close。

【导入速查】 from ag2.network import DISCUSSION_TYPE(= "discussion")、ORDERING_ROUND_ROBIN(= "round_robin")、DiscussionAdapter、DiscussionState、HumanClient。

(具体环境依赖、安装命令、收费与价格、平台支持等信息,资料中暂未提供。)