一文说明白为什么Dify的MCP策略插件不支持流式返回

说在前面

最近mcp大火,相信很多人已经搭建了自己的mcp服务,然后通过dify或者cherry studio这种工具调用过mcp服务了,不知道大家是否遇到一个问题,通过dify + mcp策略插件接入的方式,回答的内容无法流式输出,也就是需要等到所有结果生成完成后一并返回,这是为什么呢?

定位问题

首先看一下前端代码

这个比较直观,主要关注何种情况下会渲染回答。

# 相对路径web\service\base.ts
... existing code ...
if (bufferObj.status === 400 || !bufferObj.event) {
    onData('', false, {
      conversationId: undefined,
      messageId: '',
      errorMessage: bufferObj?.message,
      errorCode: bufferObj?.code,
    })
    hasError = true
    onCompleted?.(true, bufferObj?.message)
    return
  }
  if (bufferObj.event === 'message' || bufferObj.event === 'agent_message') {
    // can not use format here. Because message is splitted.
    onData(unicodeToChar(bufferObj.answer), isFirstMessage, {
      conversationId: bufferObj.conversation_id,
      taskId: bufferObj.task_id,
      messageId: bufferObj.id,
    })
    isFirstMessage = false
  }
  else if (bufferObj.event === 'agent_thought') {
    onThought?.(bufferObj as ThoughtItem)
  }
  else if (bufferObj.event === 'message_file') {
    onFile?.(bufferObj as VisionFile)
  }
... existing code ...

大概是可以看出来一些端倪,只有当回复消息的eventmessage或者agent_message时,才会赋值answer,进而渲染回答的textarea

然后我们看一下mcp策略的代码,

Github地址在这里

# 相对路径strategies\ReAct.py
... existing code ...
while run_agent_state and iteration_step <= max_iteration_steps:
  # continue to run until there is not any tool call
   run_agent_state = False
   round_started_at = time.perf_counter()
   round_log = self.create_log_message(
       label=f"ROUND {iteration_step}",
       data={},
       metadata={
           LogMetadata.STARTED_AT: round_started_at,
       },
       status=ToolInvokeMessage.LogMessage.LogStatus.START,
   )
   yield round_log
... existing code ...

通过查看策略的实现,发现全程都是通过日志的方式打印,用于跟踪智能体执行的步骤、耗时,详情等信息,并没有返回eventmessage的信息。

最后看一下实际返回

在这里插入图片描述
通过打印调试,证明确实当event:message的消息返回之后,才会渲染回复信息。

说到最后

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值