快速结论:在 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 内传递,互不干扰。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


