dify二次开发

1,658 阅读3分钟

之前自己没有二次开发的经验,这次先调研了一下,写了一篇调研的文档

二开流程

整体流程

拉取代码,一定要拉取稳定版,不能直接拉取github仓库代码。官方的main分支是不断有新代码增加进来的,所以二次开发要切换分支到一个稳定的分支上面去,找稳定的tag标签的


修改 源码 之后怎么拉取新的官方修改?

第一种git方案:

拉取稳定版之后推送到自己仓库的远程,在新的分支dev上面进行开发

然后后面有新的稳定版之后,拉取到自己的main分支,然后自己提交的时候提交到main分支,有冲突合并修改

第二种git方案:

  1. 基于 git rebase 进行改造,这样可以方便区分原有项目的代码与新增的二次开发的代码,持续的冲突处理会更方便一些,要不然持续的 merge 冲突很快就让代码无法区分;
  2. 定期同步和小步迭代,这样每次冲突更少,避免冲突过多无法处理的问题;
  3. 代码风格与原有项目保持一致,要不然修改后的自动格式化会导致所有文件都被修改了,后续冲突就无法处理了;

本地源码启动

稳定版本下载压缩包,解压后使用编辑器打开,然后尝试使用本地源码启动,而不是用docker

需要启动的部分:

  • 后端api启动
  • 前端web启动
  • PostgreSQL 和 Redis 服务启动

中间服务官网建议使用docker启动:

cd docker
cp middleware.env.example middleware.env
docker compose -f docker-compose.middleware.yaml up -d

后端启动:

docs.dify.ai/zh-hans/get…

基本参考官网(一定记得把本地的相关服务关闭),env:

DB_HOST=0.0.0.0

前端启动,直接参考官网:

pnpm run dev

架构分析

dify架构

最重要的功能就是创建应用这里,先分析四种类型:

  • 聊天助手:就是简单的定义变量,然后内置提示词使用,这个是可以聊天的
  • 文本生成助手:合并聊天助手一样,不过这个是一次性的
  • Agent:聊天助手的升级版,可以使用工具
  • 工作流:也就是以工作流编排的方式来使用

几大功能点:

  • 创建应用这里,新建聊天助手后会跳转到应用编排这里,具体的代码是怎么协作的,包括模块的选择,运行和发布等
  • 进阶:使用工作流创建应用的整体代码协作是什么样的

分析

ChatAppGenerator类是核心的类,是一个聊天应用生成器,继承自消息基础生成器,用来获取用户输入和系统设置,通过创建任务实体,并异步交给线程执行,根据流式或者阻塞式来返回对应的结果

工作流这里是基于React Flow来实现的节点式的交互图,通过事件系统来实时响应和状态同步:

// 场景1: 用户拖动节点

onNodeDrag -> handleNodeDrag -> 更新位置 -> 同步状态 -> 记录历史

// 场景2: 用户连接两个节点

onConnect -> handleNodeConnect -> 创建边 -> 更新状态 -> 同步 -> 记录历史

// 场景3: 运行 工作流

startWorkflow ->

-> workflow_started事件 -> 初始化运行状态

-> node_started事件 -> 更新节点状态 -> 更新UI

-> node_finished事件 -> 更新完成状态 -> 处理下一个节点

用户点击进入工作流设置页后先进行Workflow 组件的加载

这个组件本质上是一个可视化的工作流编辑器

工作流执行的时候会发送到沙盒环境中执行,为了系统安全

Dify的沙盒机制:

Dify的沙盒源码:github.com/langgenius/…

参考资料: