之前自己没有二次开发的经验,这次先调研了一下,写了一篇调研的文档
二开流程
整体流程
拉取代码,一定要拉取稳定版,不能直接拉取github仓库代码。官方的main分支是不断有新代码增加进来的,所以二次开发要切换分支到一个稳定的分支上面去,找稳定的tag标签的
修改 源码 之后怎么拉取新的官方修改?
第一种git方案:
拉取稳定版之后推送到自己仓库的远程,在新的分支dev上面进行开发
然后后面有新的稳定版之后,拉取到自己的main分支,然后自己提交的时候提交到main分支,有冲突合并修改
第二种git方案:
- 基于 git rebase 进行改造,这样可以方便区分原有项目的代码与新增的二次开发的代码,持续的冲突处理会更方便一些,要不然持续的 merge 冲突很快就让代码无法区分;
- 定期同步和小步迭代,这样每次冲突更少,避免冲突过多无法处理的问题;
- 代码风格与原有项目保持一致,要不然修改后的自动格式化会导致所有文件都被修改了,后续冲突就无法处理了;
本地源码启动
从稳定版本下载压缩包,解压后使用编辑器打开,然后尝试使用本地源码启动,而不是用docker
需要启动的部分:
- 后端api启动
- 前端web启动
- PostgreSQL 和 Redis 服务启动
中间服务官网建议使用docker启动:
cd docker
cp middleware.env.example middleware.env
docker compose -f docker-compose.middleware.yaml up -d
后端启动:
基本参考官网(一定记得把本地的相关服务关闭),env:
DB_HOST=0.0.0.0
前端启动,直接参考官网:
pnpm run dev
架构分析
最重要的功能就是创建应用这里,先分析四种类型:
- 聊天助手:就是简单的定义变量,然后内置提示词使用,这个是可以聊天的
- 文本生成助手:合并聊天助手一样,不过这个是一次性的
- 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/…
参考资料: