
Infinite loop in the quick start sample when registering additional agent
快速结论:在 AutoGen 0.4.2 版本中,向快速启动示例添加第二个 Modifier 代理时,由于所有代理订阅了同一个默认 topic,会导致消息级联触发形成无限循环。优先排查是否为多个代理共享同一个 topic 导致的消息互相触发。
问题场景
用户在运行 AutoGen Core 快速启动示例(Quick Start Sample)时,在已有 Modifier 和 Checker 代理的基础上注册了第二个 Modifier 代理(命名为 “modifier2″),运行时程序进入无限循环。
报错原文
程序没有报错终止,而是持续运行,进入无限循环。
原因分析
此问题源于简单示例中所有代理均订阅同一个默认 topic(DefaultTopicId)。当第一个 Modifier 发布消息后,第二个 Modifier 也会收到该消息,并发布新消息,而新消息又会触发第一个 Modifier 再次发布消息,形成级联消息链(cascading message chain),导致无限循环。
环境排查
- AutoGen 版本:0.4.2
- 操作系统:WSL(Linux)
- Python 版本:未明确指定
- 依赖包:autogen-core(版本需与 0.4.2 对应)
解决步骤
- 方案一(推荐):在 Modifier 代理的 handler 中添加终止条件(run_until)。修改 Modifier 类的 __init__ 方法,接受一个 run_until 参数(Callable[[int], bool]),在 handle_message 方法中检查消息内容是否满足终止条件。当满足条件时不发布新消息,停止循环。
- 在注册 Modifier 时传递 run_until lambda,例如:
lambda: Modifier(modify_val=lambda x: x - 1, run_until=lambda x: x <= 1)。 - 同理,为 Checker 代理添加 run_until 条件。
- 方案二(隔离方案):为每个 Modifier 使用独立的 topic。不再使用 @default_subscription 装饰器,而是为每个 Modifier 分配不同的 topic_type,并手动注册 TypeSubscription。
- 在 Modifier 类的 publish_message 中指定自己的 topic type,而非默认 DefaultTopicId()。
- 在 main 函数中注册 Checker 订阅所有 modifier topic,或通过 AgentId 直接发送消息。
验证方法
运行修改后的代码,观察控制台输出是否在预期次数后停止(例如显示 “reached the end, stopping”),且无无限循环现象。对于方案二,验证每个 Modifier 的消息是否仅在其自己的 topic 内传递,互不干扰。



