硬核教程:釋放Dify硬實(shí)力,搭建Manus級(jí)別應(yīng)用

0 評(píng)論 962 瀏覽 0 收藏 13 分鐘

Dify 實(shí)際上已經(jīng)具備與 Manus 相同的能力,只是被沙盒環(huán)境的權(quán)限管理鎖死了。

這篇文章,教你解鎖 Dify 沙盒環(huán)境的各種限制。

一旦解鎖,你可以使用 Dify 做這些事:

1. 正常安裝任意第三方 Python 庫,不再報(bào)錯(cuò)operation not permitted

2. 擴(kuò)展:使用代碼節(jié)點(diǎn),完成 Python 能做的任意工作

3. 正常處理本地文件,不再報(bào)錯(cuò)No such file or directory

4. 擴(kuò)展:像 Manus 一樣創(chuàng)建一個(gè)ToDo.md來維護(hù)更新任務(wù)

5. 擴(kuò)展:配合 Python,可以生成任意文件,包括但不限于 Excel、Word、PPT 等

條件:需要私有部署的 Dify,官方云端版本不行。

原理簡(jiǎn)述

Dify 配有一個(gè)沙盒環(huán)境,本質(zhì)上跟 Manus 之類 Agent 操作的那個(gè)“電腦”是一個(gè)東西。

1. 那個(gè)“電腦”關(guān)聯(lián)你電腦的某個(gè)文件夾,可以存儲(chǔ)工作流應(yīng)用產(chǎn)生的文檔

2. 預(yù)裝了 Python 和 nodejs 環(huán)境,理論上能實(shí)現(xiàn)任意你想要的“電腦”操作

這個(gè)沙盒環(huán)境在 Dify 的入口是代碼執(zhí)行器工具和代碼節(jié)點(diǎn)。

你在代碼節(jié)點(diǎn)寫的 Python 或 JavaScript 代碼,運(yùn)行時(shí)相當(dāng)于在這個(gè)臺(tái)電腦的終端里使用python3 daima.py指令。

理論上,你可以像上面截圖一樣,通過這個(gè) Python 腳本,讀取那個(gè)“電腦”文件夾里的文件、編輯內(nèi)容或者生成一個(gè)新文件。

但是 Dify 的原生配置考慮到安全性,鎖死了這個(gè)沙盒環(huán)境的大部分權(quán)限。

所以常規(guī)版本,我們使用沙盒環(huán)境里的 Python 只能完成成一些變量轉(zhuǎn)換、http 請(qǐng)求之類的幾乎不需要任何系統(tǒng)權(quán)限的“低級(jí)”功能。

這很不好玩。

接下來,我們把這些權(quán)限都放開,徹底解鎖 Dify 的創(chuàng)造力!

解鎖限制

首先是權(quán)限問題,這個(gè)問題有兩個(gè)解法:

1. 按需解鎖,但是需要頻繁折騰;

2. 一次性解鎖,別玩風(fēng)險(xiǎn)操作就好了。

官方其實(shí)是給了放行權(quán)限入口的,在dify/docker/volumes/sandbox/conf/config.yaml這個(gè)文件中,通過allowed_syscalls列表來擴(kuò)展。

一共包含 500 個(gè)權(quán)限分類,對(duì)應(yīng)編號(hào) 0-499,部分編號(hào)對(duì)應(yīng)的權(quán)限如下:

# 基礎(chǔ)文件操作

-0 # read – 從文件描述符讀取數(shù)據(jù)

-1 # write – 向文件描述符寫入數(shù)據(jù)

-2 # open – 打開文件

……

# 系統(tǒng)操作

-13 # rt_sigaction – 檢查或修改信號(hào)處理

-14 # rt_sigprocmask – 檢查或修改阻塞信號(hào)

-15 # rt_sigreturn – 從信號(hào)處理程序返回

……

# 內(nèi)存保護(hù)

-331 # pkey_free – 釋放內(nèi)存保護(hù)鍵

-332 # statx – 擴(kuò)展的文件狀態(tài)

你可以根據(jù)官方 FAQ 的介紹,根據(jù)自己的需求改寫官方提供的那個(gè)text.py腳本,里面包含你想要執(zhí)行的代碼,然后運(yùn)行官方提供的main.go代碼,程序會(huì)輸出你缺失哪些權(quán)限,對(duì)應(yīng)編號(hào)是什么。

這個(gè)顯然有點(diǎn)麻煩。

我是用的方式是“一把梭哈”:把所有權(quán)限都放行。

也就是,我把config.yaml配置文件中allowed_syscalls的值里,把0-499全寫上了。

在確保只有自己用、不會(huì)有啥危險(xiǎn)操作的情況下,問題好像也不大?

Tip

以數(shù)組的形式寫,并且注意配置文件的格式,冒號(hào)和數(shù)組之間留一個(gè)空格

到這里,你可以在dify/docker/volumes/sandbox/dependencies/python-requirements.txt填寫任意你需要的第三方庫,重啟 sandbox 就可以正常運(yùn)行了。

但是還不能正常讀取和生成文件。

因?yàn)橛袃蓚€(gè)問題:

1. 沙盒環(huán)境里 Python 運(yùn)行生成的文件,需要跟你電腦的文件進(jìn)行映射,否則你看不見它們;

2. 在工作流上傳文件,進(jìn)入到沙盒環(huán)境后,文件會(huì)被重命名,這個(gè)命名方式使用了一種不可逆的加密算法。

先解決第一個(gè)問題。

沙盒環(huán)境運(yùn)行代碼后生成的文件會(huì)被存在/var/sandbox/sandbox-python/tmp文件中,這個(gè)文件與我們的電腦文件沒有進(jìn)行映射,所以我們看不見他。

修改dify/docker/docker-compose.yaml大概 739 行處的 sandbox 配置信息就好了。

加這么一行:- ./volumes/app/storage/upload_files:/var/sandbox/sandbox-python/tmp/upload_files

修改后大概這樣:

然后解決第二個(gè)問題:怎么找到剛上傳的文件。

因?yàn)?Dify 用的那個(gè)文件命名算法是不可逆且隨機(jī)的,所以完全沒辦法根據(jù)你原來的文件名推斷出它上傳進(jìn)工作流以后對(duì)應(yīng)誰。

大家可以測(cè)試一下,在本地部署的工作流中上傳一個(gè)文件后,在你dify/docker/volumes/app/storage/upload_files/6**隨機(jī)數(shù)命名的文件夾下面會(huì)多出一個(gè)隨機(jī)字符串命名的文件。

有一位博主(找不到原始出處了)分享了一個(gè)使用文件大小+時(shí)間,在沙盒中查找匹配的方式,迂回解決了這個(gè)問題。

下面是代碼:

import os

import time

from datetime import datetime, timedelta

def main(filesize):

# 存儲(chǔ)符合條件的文件

matched_files = []

# 獲取當(dāng)前時(shí)間

current_time = time.time()

# 檢查 upload_files 文件夾

upload_dir = ‘/tmp/upload_files’

# 遞歸遍歷文件夾中的所有文件

for root, dirs, files in os.walk(upload_dir):

for filename in files: # 只處理文件,忽略文件夾

file_path = os.path.join(root, filename)

# 獲取文件狀態(tài)信息

file_stat = os.stat(file_path)

# 獲取文件修改時(shí)間

file_mtime = file_stat.st_mtime

# 計(jì)算文件時(shí)間差(分鐘)

time_diff = (current_time – file_mtime) / 60

# 檢查文件大小和修改時(shí)間是否符合條件

if file_stat.st_size == filesize:

matched_files.append((file_path, file_mtime))

if matched_files:

# 按修改時(shí)間排序,取最新的文件

newest_file = max(matched_files, key=lambda x: x[1])

return {“file_path”:str(newest_file[0])}

else:

return {“file_path”:upload_dir}

把它們放在代碼節(jié)點(diǎn)中,其中輸入變量名為filesize,對(duì)應(yīng)開始節(jié)點(diǎn)中的文件-大??;輸出變量為file_path,字符串類型。

然后連到后面其他會(huì)用到文件處理的節(jié)點(diǎn),直接用 Python 或者 JavaScript 處理就好了。

至此,所有 Dify-sandbox 被鎖死的權(quán)限就全解開了。

玩法示例

我之前使用 Dify 的 Agent 策略,給大模型配了一個(gè)代碼解釋器和圖表 MCP,讓它幫我做了一個(gè)非常詳實(shí)的數(shù)據(jù)分析報(bào)告。

這里讓 Agent 分析表格,就必須在 Python 里調(diào)用上傳的 Excel 文件以及使用 Pandas 庫,不解鎖的話是沒法玩的。

我在 AI 學(xué)習(xí)行動(dòng)圈知識(shí)星球里發(fā)過不少 Dify 的工作流 DSL 和玩法。掃碼加入星球搜索Dify就能找到。

AI學(xué)習(xí)行動(dòng)圈

這是一個(gè)我和人人都是產(chǎn)品經(jīng)理社區(qū)共同運(yùn)營了超過 500 天的 AI 交流圈子。

我的各種 AI 研究心得、發(fā)現(xiàn)的好應(yīng)用、開發(fā)的小項(xiàng)目都會(huì)在里面分享,目前圈子有核心三個(gè)交流學(xué)習(xí)平臺(tái)。

7 個(gè)微信群,早報(bào)和日常交流

微信群里每天一早有 AI 早報(bào),上下午還有“讀報(bào)時(shí)間”,以及我每天不定期刷屏級(jí)的各種 AI 工具體驗(yàn)、提示詞編排思考、行業(yè)新聞解讀同步。

以及,你可以在群里討論任何與 AI 相關(guān)的工具、應(yīng)用問題,幾乎都能找到答案。

騰訊文檔-圈友空間

用來沉淀體系化、深度的 AI 文章和超長(zhǎng)的工程化提示詞,不定期更新。

當(dāng)前包括:Claude code、Cursor、Manus等頂級(jí)產(chǎn)品的系統(tǒng)提示詞和工具列表,各種深度的 Agent 白皮書和實(shí)踐指南

知識(shí)星球-每日?qǐng)?bào)告、工具和實(shí)戰(zhàn)經(jīng)驗(yàn)分享

我在星球里主要維護(hù)「實(shí)戰(zhàn)分享」「工具箱」和「情報(bào)局」三個(gè)標(biāo)簽

實(shí)戰(zhàn)分享是可以在日常工作和生活中直接應(yīng)用的提示詞和效率工具。上面截圖里的 Step-Back 提示詞就非常好用,堪比 o4。在公眾號(hào)、直播中演示的所有 AI 實(shí)戰(zhàn)應(yīng)用的提示詞也都在這個(gè)標(biāo)簽下。

AI 工具和鮮知道就是好用的、熱門的 AI 工具、資訊分享,我把那些太技術(shù)、太浮夸的都篩選了,放進(jìn)這個(gè)標(biāo)簽的都是可以直接用來的好玩兒!

星球還有一個(gè)“專欄”體系,目前的定位跟標(biāo)簽差不多。

本文的項(xiàng)目源代碼已經(jīng)發(fā)布在星球,掃碼加入搜索提示詞增強(qiáng)系統(tǒng)即可。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒評(píng)論,等你發(fā)揮!