Dify 項(xiàng)目組件調(diào)用方式和時(shí)機(jī)詳解
基于對(duì) Dify 項(xiàng)目代碼的分析,我將詳細(xì)說明項(xiàng)目中組件的調(diào)用方式和時(shí)機(jī)。
Dify 項(xiàng)目組件調(diào)用方式和時(shí)機(jī)詳解
1. Celery 任務(wù)系統(tǒng)
1.1 Celery 配置和初始化
Dify 使用 Celery 作為異步任務(wù)隊(duì)列系統(tǒng)。Celery 的配置在 [api/extensions/ext_celery.py](file:///Users/chunlin/Desktop/dify_redevelop/dify-1.8.1/api/extensions/ext_celery.py) 中定義:
-
配置項(xiàng):
- 使用 Redis 作為消息代理和結(jié)果后端
- 支持 SSL 連接配置
- 支持 Redis Sentinel 高可用配置
-
定時(shí)任務(wù):
- 文檔清理任務(wù)
- 數(shù)據(jù)集清理任務(wù)
- TiDB 服務(wù)管理任務(wù)
- 消息清理任務(wù)
- 插件升級(jí)檢查任務(wù)
- 工作流日志清理任務(wù)
1.2 Celery 任務(wù)類型和執(zhí)行時(shí)機(jī)
文檔索引任務(wù)
在 [api/tasks/document_indexing_task.py](file:///Users/chunlin/Desktop/dify_redevelop/dify-1.8.1/api/tasks/document_indexing_task.py) 中定義了文檔索引任務(wù):
@shared_task(queue="dataset")
def document_indexing_task(dataset_id: str, document_ids: list):
執(zhí)行時(shí)機(jī):
- 用戶上傳文檔到知識(shí)庫(kù)時(shí)
- 文檔需要重新索引時(shí)
- 系統(tǒng)批量處理文檔時(shí)
主要作用:
- 解析文檔內(nèi)容
- 將文檔內(nèi)容轉(zhuǎn)換為向量表示
- 存儲(chǔ)到向量數(shù)據(jù)庫(kù)中
工作流執(zhí)行任務(wù)
在 [api/tasks/workflow_execution_tasks.py](file:///Users/chunlin/Desktop/dify_redevelop/dify-1.8.1/api/tasks/workflow_execution_tasks.py) 中定義了工作流執(zhí)行任務(wù):
@shared_task(queue="workflow_storage", bind=True, max_retries=3, default_retry_delay=60)
def save_workflow_execution_task(
self,
execution_data: dict,
tenant_id: str,
app_id: str,
triggered_from: str,
creator_user_id: str,
creator_user_role: str,
) -> bool:
執(zhí)行時(shí)機(jī):
- 工作流執(zhí)行完成后需要保存執(zhí)行結(jié)果時(shí)
- 需要異步存儲(chǔ)工作流執(zhí)行數(shù)據(jù)時(shí)
主要作用:
- 將工作流執(zhí)行結(jié)果保存到數(shù)據(jù)庫(kù)
- 提供重試機(jī)制確保數(shù)據(jù)持久化
其他重要任務(wù)
- annotation/ - 注釋相關(guān)任務(wù)
- clean_dataset_task.py - 清理數(shù)據(jù)集任務(wù)
- delete_conversation_task.py - 刪除對(duì)話任務(wù)
- mail_*_task.py - 郵件發(fā)送任務(wù)
- process_tenant_plugin_autoupgrade_check_task.py - 插件自動(dòng)升級(jí)檢查任務(wù)
2. 代碼沙箱系統(tǒng)
2.1 沙箱架構(gòu)和實(shí)現(xiàn)
Dify 使用獨(dú)立的代碼沙箱環(huán)境來安全執(zhí)行用戶編寫的代碼。沙箱通過 HTTP API 與主應(yīng)用通信。
在 [api/core/helper/code_executor/code_executor.py](file:///Users/chunlin/Desktop/dify_redevelop/dify-1.8.1/api/core/helper/code_executor/code_executor.py) 中定義了代碼執(zhí)行器:
class CodeExecutor:
@classmethod
def execute_code(cls, language: CodeLanguage, preload: str, code: str) -> str:
url = code_execution_endpoint_url / "v1" / "sandbox" / "run"
# 發(fā)送代碼到沙箱執(zhí)行
實(shí)現(xiàn)方式:
- 通過 HTTP 請(qǐng)求將代碼發(fā)送到獨(dú)立的沙箱服務(wù)
- 沙箱服務(wù)在隔離環(huán)境中執(zhí)行代碼
- 返回執(zhí)行結(jié)果給主應(yīng)用
2.2 沙箱執(zhí)行時(shí)機(jī)
工具節(jié)點(diǎn)中的代碼執(zhí)行
在 [api/core/tools/builtin_tool/providers/code/tools/simple_code.py](file:///Users/chunlin/Desktop/dify_redevelop/dify-1.8.1/api/core/tools/builtin_tool/providers/code/tools/simple_code.py) 中:
def _invoke(self, user_id: str, tool_parameters: dict[str, Any], ...):
language = tool_parameters.get("language", CodeLanguage.PYTHON3)
code = tool_parameters.get("code", "")
result = CodeExecutor.execute_code(language, "", code)
執(zhí)行時(shí)機(jī):
- 用戶在工作流中使用代碼工具節(jié)點(diǎn)時(shí)
- 需要執(zhí)行 Python 或 JavaScript 代碼時(shí)
工作流中的代碼節(jié)點(diǎn)
在工作流中使用代碼節(jié)點(diǎn)時(shí)會(huì)觸發(fā)沙箱執(zhí)行。
2.3 沙箱安全機(jī)制
- 網(wǎng)絡(luò)隔離:沙箱環(huán)境與主應(yīng)用網(wǎng)絡(luò)隔離
- 資源限制:限制 CPU、內(nèi)存和執(zhí)行時(shí)間
- 文件系統(tǒng)隔離:沙箱環(huán)境無法訪問主應(yīng)用文件系統(tǒng)
- API 密鑰驗(yàn)證:通過 API 密鑰驗(yàn)證請(qǐng)求來源
3. 工具調(diào)用系統(tǒng)
3.1 工具調(diào)用架構(gòu)
Dify 提供了豐富的工具系統(tǒng),包括:
- 內(nèi)置工具(時(shí)間、代碼執(zhí)行等)
- API 工具(通過 OpenAPI/Swagger 定義)
- 工作流工具(將其他工作流作為工具使用)
- MCP 工具(Model Context Protocol 工具)
3.2 工具調(diào)用執(zhí)行流程
在 [api/core/tools/tool_engine.py](file:///Users/chunlin/Desktop/dify_redevelop/dify-1.8.1/api/core/tools/tool_engine.py) 中定義了工具引擎:
class ToolEngine:
@classmethod
def invoke(cls, tool: Tool, tool_parameters: dict[str, Any], ...) -> list[ToolInvokeMessage]:
# 調(diào)用工具的具體實(shí)現(xiàn)
執(zhí)行時(shí)機(jī):
- 在 Agent 模式中,LLM 決定調(diào)用工具時(shí)
- 在工作流中使用工具節(jié)點(diǎn)時(shí)
- 通過 API 調(diào)用工具時(shí)
調(diào)用流程:
- 解析工具參數(shù)
- 驗(yàn)證工具憑證
- 執(zhí)行工具邏輯
- 處理工具響應(yīng)
- 返回結(jié)果給調(diào)用方
3.3 工具類型和使用場(chǎng)景
內(nèi)置工具
- 代碼執(zhí)行工具:執(zhí)行 Python/JavaScript 代碼
- 時(shí)間工具:獲取當(dāng)前時(shí)間
- 搜索工具:執(zhí)行網(wǎng)絡(luò)搜索
API 工具
- 通過 OpenAPI 規(guī)范定義的第三方 API
- 可以連接各種外部服務(wù)
工作流工具
- 將一個(gè)工作流作為工具在另一個(gè)工作流中使用
- 實(shí)現(xiàn)工作流的模塊化和復(fù)用
4. 組件間調(diào)用關(guān)系總結(jié)
5. 性能和安全考慮
5.1 異步處理優(yōu)化
- 使用 Celery 將耗時(shí)操作(如文檔索引、郵件發(fā)送)放到后臺(tái)執(zhí)行
- 避免阻塞用戶請(qǐng)求響應(yīng)
- 提供任務(wù)重試機(jī)制確保可靠性
5.2 代碼執(zhí)行安全
- 通過獨(dú)立沙箱環(huán)境執(zhí)行用戶代碼
- 限制代碼執(zhí)行時(shí)間和資源使用
- 網(wǎng)絡(luò)訪問控制防止惡意請(qǐng)求
5.3 工具調(diào)用安全
- 工具憑證加密存儲(chǔ)
- 工具調(diào)用日志記錄和監(jiān)控
- 工具調(diào)用頻率限制防止濫用
通過以上架構(gòu)設(shè)計(jì),Dify 實(shí)現(xiàn)了高性能、可擴(kuò)展且安全的 AI 應(yīng)用開發(fā)平臺(tái)。

浙公網(wǎng)安備 33010602011771號(hào)