[错误] 在核心执行循环中,message.sender 属性在序列化过程中会默默丢失
作者: QiuYucheng2003创建于 2026年6月14日更新于 2026年6月14日
- 描述 通过对主执行循环的静态代码审查,发现了一处数据序列化缺陷,导致对话历史记录中代理归属信息的永久丢失。 当接收到完成时,代码会动态地将当前代理的名称分配给消息对象: message.sender = active_agent.name 紧随其后,消息被序列化并添加到历史记录中: history.append(json.loads(message.model_dump_json())) 由于 OpenAI 的 ChatCompletionMessage 基于 Pydantic,在调用 model_dump_json() 时,动态分配的属性(如 sender)如果不在基础模板中定义,则会被严格排除。因此,发送者信息被完全删除,导致多代理交互的可追溯性受到破坏。 2. 重现步骤 注意: 此问题通过静态程序分析确定。 1. 追踪核心 while 循环在接收完成时的执行流程。 2. 注意消息.sender 的动态分配。 3. 注意在添加到历史记录之前使用的序列化方法(model_dump_json())。 4. 评估添加到历史记录中的结果字典;发送者键完全缺失。 3. 预期行为 对话历史记录应准确地保留每条消息的发送者字段。这对于保持上下文和确切地知道在多代理切换过程中哪个代理生成了哪条响应至关重要。 4. 实际行为 Pydantic 的序列化机制会默默地删除发送者属性,使历史记录负载中没有任何代理归属信息。 5. 影响 数据丢失/上下文恶化:在多代理场景中,丢失发送者标签使下游流程或用户界面无法可靠地确定在共享历史记录中哪个代理生成了特定消息。 6. 建议的修复 逆转操作顺序:首先将消息序列化为字典,然后在添加到历史记录之前将发送者属性注入到字典中。 # 建议的修复: msg_dict = json.loads(message.model_dump_json()) msg_dict["sender"] = active_agent.name history.append(msg_dict)
内容来源: openai/swarm