Dify 的核心设计哲学是 “前端只负责‘画’,后端只负责‘跑’” :
前端将画布状态序列化为标准 JSON 提交给后端,后端解析 JSON 构建 DAG 并按拓扑序调度执行。这种解耦设计带来巨大灵活性——前端可换任何画布库,后端可用任何语言重写,只要双方遵守同一份 JSON 协议。
用户在画布上拖拽生成的每一个 Workflow,最终都会被序列化为一个 JSON 对象——这就是 Dify 的 DSL。
典型 DSL 结构包含以下核心要素:
{
"graph": {
"nodes": [
{
"id": "llm_1",
"data": {
"title": "LLM 节点",
"type": "llm",
"model": { "provider": "openai", "name": "gpt-4" },
"prompt_template": "总结以下内容:{{#start.output#}}"
},
"position": { "x": 100, "y": 200 }
}
],
"edges": [
{ "source": "start", "target": "llm_1" }
]
}
}id(唯一标识)、data(业务配置,如提示词、模型参数)和 type(节点类型)。position 等前端展示数据,后端解析执行时忽略,但存储时保留以还原画布。变量引用语法
{{#node_id.output#}}是 Dify 工作流中连接节点的核心机制。
当请求到达后端时,原始的 JSON 字符串是一堆“死数据”,无法直接运行。WorkflowParser 承担了“编译器”的角色——将 JSON 解析为可执行的图结构。
执行流程四步走:
1️⃣ DAG 构建与环检测:将 JSON 转为图结构(邻接表),使用 DFS 或 Kahn 算法检测是否存在环,确保是合法 DAG。
2️⃣ 节点实例化(工厂模式):Dify 利用工厂模式根据 DSL 中的 type 字段实例化不同的节点类。所有具体节点(如 LLMNode、CodeNode、KnowledgeRetrievalNode)都继承自 BaseNode,后者定义了所有节点必须遵守的“契约”:
# 基类中的通用执行逻辑(伪代码)
class BaseNode:
def run(self):
self._process_input_variables() # 从变量池读取输入
result = self._run() # 子类实现具体逻辑
self._process_output_variables(result) # 写入变量池
return result3️⃣ 拓扑排序调度:按依赖顺序执行节点。节点之间不直接传递数据对象,而是通过一个共享的变量池(Variable Pool) 进行间接通信。
4️⃣ 事件生成与流式响应:执行过程中生成各类事件(NodeRunStartedEvent、NodeRunStreamChunkEvent、NodeRunSucceededEvent 等),用于状态更新和流程控制。
当预设节点无法满足特定处理需求时,代码节点(Code Node) 允许在工作流中嵌入自定义的 Python 或 JavaScript 脚本,处理复杂的数据转换、计算和逻辑。
代码节点依赖 沙箱服务(Sandbox) 执行,确保安全性。
配置示例:以下是一个从 HTTP 节点返回的 JSON 字符串中提取 data.name 字段的 Python 代码:
def main(http_response: str) -> str:
import json
data = json.loads(http_response)
# 注意:输出变量必须声明为 'result'
return { 'result': data['data']['name'] }关键要点:
代码节点适用于:Arithmetic 运算、JSON 数据转换、文本处理、自定义规则校验等场景。
当代码节点的能力仍不足以应对复杂业务时,可通过开发自定义节点插件(Custom Node Plugin) 将自主实现的逻辑单元嵌入工作流。
开发步骤:
BaseNode,实现 _run 方法NODE_TYPE_CLASSES_MAPPING 字典中,使工作流引擎能够识别Dify 的自定义节点机制支持异步处理能力,适用于大文件解析、外部 API 轮询、模型微调回调等长周期任务。
Dify 工作流可通过 REST API 被外部系统调用:
curl --request POST \
--url https://{api_base_url}/workflows/{workflow_id}/run \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"inputs": { "query": "Summarize this article" },
"response_mode": "blocking",
"user": "user_workflow_123"
}'response_mode 支持 blocking(阻塞等待完整结果)和 streaming(流式返回)两种模式。
官方社区维护了 Python SDK(dify-client-python),提供类型安全的 API 调用接口,覆盖 workflow run、stream、stop 等全部端点:
from dify_client import Client
client = Client(api_key="your-api-key", api_base="https://api.dify.ai/v1")
response = client.workflow_run(
workflow_id="your-workflow-id",
inputs={"query": "Hello, world!"},
response_mode="blocking"
)Dify 工作流的技术架构可概括为 “可视化是入口,执行引擎才是灵魂” 。其核心设计围绕三个层面展开:
未来,随着 Agent 能力增强(如自主规划、多轮反思),工作流引擎将从“线性 DAG”走向“动态状态机”。但核心思想不变——让开发者用最自然的方式编排 AI 能力,让执行引擎在后台高效可靠地运行。掌握这套技术体系,便能在 AI 应用开发的浪潮中游刃有余。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。