通過將PAI-EAS部署的萬相(ComfyUI)服務作為工具整合到Dify,可以將複雜的創作流程自動化。本文將介紹服務的部署與整合,實現從文本到多媒體內容的端到端產生。
方案概述
本方案的核心是利用Dify作為應用編排器,調用部署在PAI-EAS上的ComfyUI推理服務。ComfyUI的推理任務是非同步執行的,因此整個調用鏈路如下:
提交任務:Dify向EAS服務發送一個POST請求,請求體中包含ComfyUI工作流程的JSON描述。EAS接收任務後,會立即返回一個唯一的
prompt_id。輪詢狀態:Dify使用上一步擷取的
prompt_id,通過GET請求迴圈查詢(輪詢)任務的執行狀態。EAS會返回任務是否完成、成功或失敗等資訊。擷取結果:判斷任務成功執行後,再次發起GET請求獲得最終結果,其中包含了組建檔案在OSS上的檔案名稱。Dify將檔案名稱與OSS訪問地址拼接,最終向使用者展示完整的圖片或視頻連結。
完整工作流程樣本如下:

步驟一:(可選)部署Dify
若已有Dify環境,可跳過本節。本文以計算巢部署Dify社區單機版為例。
進入計算巢Dify社區版服務詳情頁,單擊開始部署。
根據需求選擇配置。對於基礎示範,可選擇單機版模板,執行個體類型選擇
ecs.u1-c1m2.xlarge,並設定執行個體密碼,選擇一個可用性區域。單擊下一步:確認訂單,在跳轉頁面單擊立即建立。
服務部署完成後,單擊詳情,在概覽頁簽的立即使用地區,找到dify訪問連結。註冊帳號後登入就能建立dify應用。

步驟二:部署萬相ComfyUI
進入ModelGallery,在搜尋方塊中輸入萬相2.1-文生視頻-1.3B,單擊卡片進入模型詳情頁。
單擊右上方部署,在配置頁面進行以下設定,其餘保持預設。
部署方式:選擇。
服務配置:在JSON編輯器中,配置
storage.oss.path參數,將其值修改為實際的OSS路徑(例如:oss://examplebucket/wan)。此路徑將作為ComfyUI的工作目錄用於存放產生的內容。關於OSS操作,請參見OSS控制台快速入門。
單擊部署。等待約3分鐘,當服務狀態變為運行中,表示部署成功。
在服務詳情頁單擊查看調用資訊。擷取EAS服務的公網調用地址和Token,用於在Dify中調用服務。

步驟三:建立Dify應用
在Dify匯入樣本DSL檔案wan-comfyui-dify.yml,本文以此說明調用ComfyUI的關鍵節點設定。

1. 設定環境變數
OSS_URL:組建檔案的訪問路徑。本文ComfyUI工作目錄為
oss://examplebucket/wan,因此設為https://examplebucket.oss-cn-hangzhou.aliyuncs.com/wan/output。其中oss-cn-hangzhou.aliyuncs.com為OSS杭州的外網Endpoint,其他地區請參見地區和Endpoint。EAS_Token:步驟二中擷取的服務Token。
EAS_URL:步驟二中擷取的服務公網調用地址。

2. 開始節點設定輸入變數
將正反向提示詞等動態參數設為變數,供每次調用時輸入。

3. 配置POST請求(擷取Prompt ID)
3.1 佈建要求地址
在EAS_URL後追加/prompt構成POST請求地址。

3.2 構造並發起POST請求
配置URL、HEADERS與BODY。其中BODY為匯出的ComfyUI工作流程JSON(建立及匯出參見通過WebUI使用),並將需要動態修改的參數(如提示詞、種子數等)替換為Dify中的變數。

3.3 擷取Prompt ID
從返回結果中提取prompt_id,用於後續輪詢結果。
def main(arg: str) -> dict:
data = json.loads(arg)
return {"result": data["prompt_id"]}
4. 配置輪詢邏輯(擷取推理結果)
使用prompt_id迴圈發起GET請求,檢查任務狀態。
4.1 佈建要求地址
在EAS_URL後追加history/<prompt_id>構成GET請求地址。其中<prompt_id>為上一步的結果。

4.2 根據prompt_id發起GET請求

4.3 延時等待
在每次輪詢之間插入一個代碼節點,執行time.sleep(12)等操作,以避免過於頻繁的請求。
import time
def main()-> dict:
time.sleep(12)
return {
"result": ""
}
4.4 判斷執行結束
返回結果中有prompt_id表示推理已完成。

5. 拼接檔案地址並展示結果
任務完成後,從最終的輪詢結果中提取檔案名稱,並與環境變數中的OSS_URL拼接,形成可公開訪問的檔案連結,並在Dify的“結束”節點中展示。
5.1 擷取推理結果
該節點配置與4.2的節點配置相同。

5.2 提取檔案名稱
import json
def main(input_str: str) -> dict:
data = json.loads(input_str)
images = []
image_names = []
first_key = next(iter(data))
status = data[first_key]["status"]
if status["completed"] and status["status_str"] == "success":
images = data[first_key]["outputs"]["28"]["images"]
for img in images:
image_names.append(img["filename"])
# 將列錶轉換為字串
image_names_str = ",".join(image_names)
return {
"result": image_names_str,
}
5.3 拼接檔案訪問地址
將檔案名稱拼接至OSS_URL,形成可訪問的公網連結,並在Dify應用結果中展示。
需確保OSS bucket已設定為公用讀取許可權,詳情見Bucket ACL。


步驟四:測試應用
在Dify單擊右上方預覽,輸入正反向提示詞,對話方塊中輸入1(工作流程未使用該欄位,可隨意輸入),發送之後,等待視頻產生。

生產應用建議
安全性:在生產環境中,將OSS Bucket設定為公用讀取存在資料安全風險。建議限制只允許特定IP或VPC訪問,詳情見Bucket Policy。
穩定性與成本:合理設定輪詢的等待時間。過短的間隔會增加API調用次數和伺服器負載,可能產生不必要的費用;過長的間隔則會增加使用者的等待時間。建議根據您任務的平均耗時進行調整。
常見問題
為什麼無法訪問產生的圖片或視頻連結?
請檢查以下幾點:
OSS Bucket是否已設定為公用讀取許可權。
在Dify中配置的OSS_URL環境變數是否正確,特別是OSS訪問網域名稱是否與Bucket所在地區匹配。
工作流程一直卡在輪詢步驟怎麼辦?
這通常意味著EAS服務端的任務未能成功完成。請登入PAI控制台,查看對應EAS服務的即時日誌,排查是否有執行階段錯誤。