前置学习(配合食用,效果更佳噢~)

使用pycharm社区版调试DIFY后端python代码_python接入dify-CSDN博客

python的生成器详解:https://www.cnblogs.com/klb561/p/18199415

Dify的工作流调用大量使用了生成器语法,因此需要提前了解Python的生成器。

在方法体使用了yield关键字返回当前迭代数据的函数,可以返回生成器对象,用于给函数外部for循环迭代获取每次的返回。

在http为"text/event-stream"协议时,python就是通过生成器的语法,逐步的将流式数据推送到前端浏览器进行接收。

调试链路

第一步:定义一个Dify的工作流

第二步:输入一段话,获得请求接口run

curl 'http://192.168.21.47/console/api/installed-apps/27d7b3b2-726b-407b-9b0e-0135e6898e90/workflows/run' \
  -H 'Accept: */*' \
  -H 'Accept-Language: zh-CN,zh;q=0.9' \
  -H 'Origin: http://192.168.21.47' \
  -H 'Proxy-Connection: keep-alive' \
  -H 'Referer: http://192.168.21.47/explore/installed/27d7b3b2-726b-407b-9b0e-0135e6898e90' \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
  -H 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNjI3NjY4NTItYTNmZS00MzFmLTg2YTMtYzE4YTc5NjhlNWYzIiwiZXhwIjoxNzQwMDE4Mjg1LCJpc3MiOiJTRUxGX0hPU1RFRCIsInN1YiI6IkNvbnNvbGUgQVBJIFBhc3Nwb3J0In0.ElgScGHPNPOZvqb78B4bbALrV8osTwVeJK9xFDYmbXo' \
  -H 'content-type: application/json' \
  --data-raw '{"inputs":{"query":"我想和你聊一下大数据这个话题,但是不需要给我思考里面的内容,你就说50字左右的结果给我就行"},"response_mode":"streaming"}' \
  --insecure

第三步:根据接口获得Python入口

通过URL请求,获得Flask的路由,定义

下面这里定义了一个post请求

因为我们要了解的是工作流怎么调用到插件的过程,所以根据上面的入口,继续探查时,我们会进入到这个else if的判断逻辑,需要继续进入到WorkflowAppGenerator里面的逻辑

继续下探,源码实际上是启动了一个异步线程,去执行self._generate_worker方法,这里需要注意的是定义了

WorkflowAppQueueManager,是一个队列管理,workflowAppQueueManager负责将消息publish到内部的Queue,也负责将Queue里面的消息取出。

所以WorkflowAppQueueManager对象分别传入了worker_thread和_handle_response两个部分,这两个分别往下探会看到里面的实现逻辑实际是会调用WorkflowAppQueueManager的publish和listen

第四步:工作流核心处理逻辑

graph_engine.py的while true循环是核心的逻辑

循环跳出是遍历到节点类型为END的,就跳出循环

循环的核心逻辑实际上就是遍历工作流的边和节点,获取到新的节点后,实例化节点,执行节点的内部run函数

节点所有的实现类定义在这个py文件,基本上每个实现都是集成BaseNode类,BaseNode类有个抽象方法是run,用于子类继承

第五步:内部工具核心加载过程

从上面的实例化映射中,我们可以知道ToolNode就是内置工具的节点处理类,其中ToolNode的核心是ToolManager

总结

通过链路跟踪,节点的核心逻辑包括以下两部分:

  • 解析节点的配置信息,其中包括prompt的内容以及对应的参数
  • 收集上一个节点产生的内容,以上下文的方式中传入到当前节点,并作用于当前节点的参数配置

作者:道一云低代码

作者想说:喜欢本文请点点关注~

更多资料分享

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐