You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JADE Sniffer Agent无法显示Agent通信消息,但控制台确认通信正常

JADE Sniffer Agent无法显示Agent通信消息,但控制台确认通信正常

我完全理解你遇到的这个困扰——明明Agent之间的对话逻辑完全正常,控制台日志能清晰看到REQUEST、PROPOSE、ACCEPT_PROPOSAL这些消息的收发,DF Service里也能看到Nettoyeur Agent的注册信息,可Sniffer GUI就是毫无动静,重启Sniffer、重新添加Agent也没效果。别担心,咱们一步步排查解决这个问题。

可能的原因及解决步骤

1. 先检查Sniffer的基础配置和过滤规则

这是最容易被忽略的点,很多时候Sniffer没显示消息只是因为过滤规则没设置对:

  • 确认所有通信Agent都已被Sniffer监听:打开Sniffer后,点击顶部菜单栏的 Agent → Add Agents,在弹出的窗口里选中Pollueur、Nettoyeur1、Nettoyeur2、Nettoyeur3所有Agent,确保没有遗漏。
  • 重置Sniffer的过滤规则:点击 Filter → Set Filter,在过滤窗口中:
    • 把Performative选项设为All,不要只勾选特定类型的消息;
    • Sender和Receiver也选择All,排除任何针对特定Agent的过滤;
    • 取消所有其他可能的过滤条件(比如消息内容关键词过滤),然后点击OK保存。
  • 最后点击Sniffer的Clear按钮清空历史,再触发一次Agent通信(比如让Pollueur重新污染一个格子),看看消息是否会显示。

2. 给ACLMessage添加必要的元数据,帮助Sniffer追踪对话

JADE的Sniffer依赖消息的一些元数据来关联和显示对话流,虽然Agent之间通信不需要这些字段,但Sniffer可能会忽略缺少这些信息的消息。修改你的消息发送代码:

在PollueurAgent的pollute()方法中,给REQUEST消息添加元数据:
private void pollute() {
    targetX = random.nextInt(SIZE);
    targetY = random.nextInt(SIZE);
    environment[targetX][targetY] = 'X';
    System.out.println("Pollution à la case (" + targetX + "," + targetY + ")");
    
    ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
    msg.setContent(targetX + "," + targetY);
    // 添加对话ID,让Sniffer能追踪完整对话流
    msg.setConversationId("cleaning-negotiation-" + System.currentTimeMillis());
    // 可选:添加语言和本体标识(Sniffer可能依赖这些字段识别消息)
    msg.setLanguage("English");
    msg.setOntology("CleaningServiceOntology");
    
    msg.addReceiver(new jade.core.AID("Nettoyeur1", jade.core.AID.ISLOCALNAME));
    msg.addReceiver(new jade.core.AID("Nettoyeur2", jade.core.AID.ISLOCALNAME));
    msg.addReceiver(new jade.core.AID("Nettoyeur3", jade.core.AID.ISLOCALNAME));
    send(msg);
    
    displayEnvironment();
}
在NettoyeurAgent的消息回复中,继承对话ID:
case ACLMessage.REQUEST:
    ACLMessage reply = msg.createReply();
    reply.setPerformative(ACLMessage.PROPOSE);
    // 继承原消息的对话ID,确保Sniffer能关联同一场对话的所有消息
    reply.setConversationId(msg.getConversationId());
    reply.setContent(price + "," + arrivalTime);
    send(reply);
    break;

同样,在后续的协商消息(比如Pollueur发送的PROPOSE协商消息、ACCEPT_PROPOSAL消息)中,也记得继承同一个conversationId,这样Sniffer就能把整个协商流程的消息串起来显示。

3. 检查JADE容器的通信上下文一致性

看你的Main类配置,所有Agent都创建在同一个MainContainer里,RMA和Sniffer也运行在这个容器上,理论上不会有上下文问题,但可以再确认:

  • 启动Main类后,RMA窗口里的Agent Management面板,是否能看到所有4个Agent?
  • Sniffer启动时,是否连接到了同一个MainContainer(localhost:1099)?如果Sniffer是手动启动连接到其他地址,就会看不到消息。

4. 尝试更新JADE版本

如果以上步骤都没用,可能是你使用的JADE版本存在Sniffer的已知Bug。可以到JADE的官方渠道下载最新的稳定版,替换项目中的JADE依赖,再重新运行试试。

总结

先从Sniffer的过滤规则和Agent监听设置入手(这是最常见的原因),如果不行再给消息添加对话ID等元数据,基本就能解决Sniffer不显示消息的问题。

备注:内容来源于stack exchange,提问作者Malak Hb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:18:02