Autogen代理对话自动转发问题:用户确认计划后流转至其他代理
问题拆解
你的代码没达到预期效果,主要是这几个原因:
- 你把转发逻辑注册给了
project_manager,但用户的同意输入是通过user_proxy接收的,应该在user_proxy上处理转发触发逻辑。 - 没做用户同意的判断,直接转发不符合“先评审再转发”的流程。
- 异步函数的调用和返回值不对,
register_reply要求特定的返回格式才能生效。
修正后的完整代码
import autogen # 提前配置好你的LLM参数,示例用gpt-4 llm_config = { "model": "gpt-4", "api_key": "你的API密钥" } # 负责制定计划的agent project_manager = autogen.AssistantAgent( name="project_manager", system_message="你要制定一份详细的模型火箭搭建计划,完成后等待用户的审批。", llm_config=llm_config, ) # 负责针对计划输出段子的示例agent comedian = autogen.AssistantAgent( name="comedian", system_message="你要针对收到的模型火箭计划,讲一个搞笑的段子。", llm_config=llm_config,) # 用户代理,负责接收用户输入 user_proxy = autogen.UserProxyAgent( name="User_proxy", system_message="你是人类管理员,负责评审project_manager的计划。回复'同意'、'approve'、'ok'这类词确认计划,之后计划会自动转发给其他agent。", code_execution_config={"last_n_messages": 2, "work_dir": "groupchat"}, human_input_mode="ALWAYS", ) def forward_plan(recipient, messages, sender, config): # 检查用户最后一条消息是否包含同意关键词 user_msg = messages[-1]["content"].lower() if any(word in user_msg for word in ["同意", "approve", "ok", "yes", "通过"]): # 从对话历史里提取project_manager发的最后一条计划内容 plan = next(msg["content"] for msg in reversed(messages[:-1]) if msg["name"] == "project_manager") # 把计划转发给目标agent user_proxy.send_message( recipient=comedian, message=f"已通过的计划如下:\n{plan}\n请按你的职责回应。", request_reply=True ) # 返回True表示已处理这条消息,不走默认逻辑 return True, None # 未检测到同意指令,交给默认逻辑处理 return False, None # 给user_proxy注册自定义回复逻辑,设为最高优先级 user_proxy.register_reply([autogen.Agent, None], forward_plan, position=0) # 启动对话流程 user_proxy.initiate_chat( project_manager, message="帮我做一份模型火箭的搭建计划", )
关键调整说明
- 换注册对象:把转发逻辑绑到
user_proxy上,因为用户的输入是通过这个agent接收的,能及时捕捉到同意指令。 - 加同意判断:通过关键词识别用户是否真的同意,避免误触发转发。
- 正确发消息:用
send_message方法转发计划,这是AutoGen官方推荐的agent间通信方式,能正常触发后续对话。 - 规范返回值:自定义函数返回
(True/False, 回复内容),返回True就表示我们接管了这条消息的处理,不再走默认流程。
运行流程
- 用户代理发起对话,让project_manager生成模型火箭搭建计划。
- project_manager输出计划后,用户代理等待你输入评审意见。
- 你输入“同意”或类似关键词,触发转发逻辑。
- 计划自动发给目标agent(示例中的comedian),对方按职责生成回复。
内容的提问来源于stack exchange,提问作者ML Ops
相关产品推荐
相关产品推荐

