<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>網站開發 on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/tags/%E7%B6%B2%E7%AB%99%E9%96%8B%E7%99%BC/</link>
        <description>Recent content in 網站開發 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Fri, 10 Jul 2026 06:24:49 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/tags/%E7%B6%B2%E7%AB%99%E9%96%8B%E7%99%BC/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ComfyUI 工作流 API 怎麼接入網站：前端、後端、佇列和結果展示流程</title>
        <link>https://knightli.com/zh-tw/2026/07/10/comfyui-workflow-api-website-integration/</link>
        <pubDate>Fri, 10 Jul 2026 06:24:49 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/07/10/comfyui-workflow-api-website-integration/</guid>
        <description>&lt;p&gt;把 ComfyUI 工作流接進網站，不是前端直接調一個 API 就完事。可用的產品流程需要前端表單、後端任務接口、參數映射、圖片上傳、佇列、狀態輪詢、結果儲存和錯誤處理。&lt;/p&gt;
&lt;p&gt;更穩的做法是：workflow JSON 由後端維護，使用者只填安全參數；後端把參數寫入工作流，提交給 ComfyUI，再把結果保存並返回給前端。&lt;/p&gt;
&lt;h2 id=&#34;先分清兩層-api&#34;&gt;先分清兩層 API
&lt;/h2&gt;&lt;p&gt;通常有兩層：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;網站自己的 API，給瀏覽器調用。&lt;/li&gt;
&lt;li&gt;ComfyUI API，給後端內部調用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不要把 ComfyUI API 直接暴露到公網。它更適合當內部渲染服務，而不是公開 API Gateway。&lt;/p&gt;
&lt;h2 id=&#34;最小網站功能閉環&#34;&gt;最小網站功能閉環
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;使用者填表
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 後端建立任務
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 後端把參數映射到 workflow JSON
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 後端提交給 ComfyUI
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 前端輪詢任務狀態
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 後端取得生成結果
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 前端展示或下載
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這就是第一版最小可用流程。&lt;/p&gt;
&lt;h2 id=&#34;後端接口怎麼設計&#34;&gt;後端接口怎麼設計
&lt;/h2&gt;&lt;p&gt;可以先做三個接口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;POST /api/generate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GET  /api/tasks/{taskId}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GET  /api/tasks/{taskId}/result
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;POST /api/generate&lt;/code&gt; 只負責建立任務並返回 &lt;code&gt;taskId&lt;/code&gt;，不要讓這個請求一直等到圖片生成完成。&lt;/p&gt;
&lt;h2 id=&#34;任務狀態要自己維護&#34;&gt;任務狀態要自己維護
&lt;/h2&gt;&lt;p&gt;建議維護：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;queued
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;running
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;succeeded
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;failed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;expired
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;即使 ComfyUI 有 queue 和 history，產品側仍需要自己的任務狀態，方便前端展示和排查。&lt;/p&gt;
&lt;h2 id=&#34;workflow-json-不要讓使用者直接傳&#34;&gt;workflow JSON 不要讓使用者直接傳
&lt;/h2&gt;&lt;p&gt;workflow JSON 應該是後端配置。使用者只能改安全字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prompt；&lt;/li&gt;
&lt;li&gt;negative prompt；&lt;/li&gt;
&lt;li&gt;style；&lt;/li&gt;
&lt;li&gt;size；&lt;/li&gt;
&lt;li&gt;seed；&lt;/li&gt;
&lt;li&gt;上傳圖片；&lt;/li&gt;
&lt;li&gt;限制範圍內的 strength 或 steps。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;讓使用者上傳任意 workflow JSON，可能暴露模型、節點、路徑或高成本操作。&lt;/p&gt;
&lt;h2 id=&#34;參數映射要單獨維護&#34;&gt;參數映射要單獨維護
&lt;/h2&gt;&lt;p&gt;把表單字段映射到工作流節點：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;form.prompt -&amp;gt; workflow node text
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;form.seed -&amp;gt; sampler seed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;form.width -&amp;gt; latent width
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;form.height -&amp;gt; latent height
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這樣換工作流時，不需要重寫整個前端。&lt;/p&gt;
&lt;h2 id=&#34;圖片上傳怎麼處理&#34;&gt;圖片上傳怎麼處理
&lt;/h2&gt;&lt;p&gt;圖生圖或參考圖流程建議：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先傳到後端。&lt;/li&gt;
&lt;li&gt;驗證格式和大小。&lt;/li&gt;
&lt;li&gt;暫存文件。&lt;/li&gt;
&lt;li&gt;傳給 ComfyUI 或放到 ComfyUI 可讀的位置。&lt;/li&gt;
&lt;li&gt;到期後清理。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不要只相信瀏覽器給的文件名和 MIME type。&lt;/p&gt;
&lt;h2 id=&#34;前端交互怎麼做&#34;&gt;前端交互怎麼做
&lt;/h2&gt;&lt;p&gt;前端應該提供：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表單校驗；&lt;/li&gt;
&lt;li&gt;上傳進度；&lt;/li&gt;
&lt;li&gt;排隊或生成中狀態；&lt;/li&gt;
&lt;li&gt;等待提示；&lt;/li&gt;
&lt;li&gt;結果預覽；&lt;/li&gt;
&lt;li&gt;重試按鈕；&lt;/li&gt;
&lt;li&gt;可理解的錯誤信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不要只放一個無限轉圈。&lt;/p&gt;
&lt;h2 id=&#34;後端提交-comfyui-的偽代碼&#34;&gt;後端提交 ComfyUI 的偽代碼
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;receive request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;validate user input
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;create task record
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;load workflow template
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;patch safe parameters into workflow
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;submit prompt to ComfyUI
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;save prompt_id and task status
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;return taskId
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;後續由 worker 或輪詢任務更新狀態，直到結果生成。&lt;/p&gt;
&lt;h2 id=&#34;結果文件怎麼存&#34;&gt;結果文件怎麼存
&lt;/h2&gt;&lt;h3 id=&#34;方案一直接從後端代理下載&#34;&gt;方案一：直接從後端代理下載
&lt;/h3&gt;&lt;p&gt;內部小工具可以先這樣做。後端從 ComfyUI 取文件，再返回給瀏覽器。&lt;/p&gt;
&lt;h3 id=&#34;方案二上傳到物件儲存&#34;&gt;方案二：上傳到物件儲存
&lt;/h3&gt;&lt;p&gt;公開網站更建議用 S3、R2、OSS 等物件儲存，只在資料庫裡保存 URL 和元資料。&lt;/p&gt;
&lt;h2 id=&#34;為什麼需要佇列&#34;&gt;為什麼需要佇列
&lt;/h2&gt;&lt;p&gt;圖片生成慢，GPU 資源有限。沒有佇列，使用者連點幾次就可能壓垮服務。&lt;/p&gt;
&lt;p&gt;佇列可以控制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;並發；&lt;/li&gt;
&lt;li&gt;使用者限流；&lt;/li&gt;
&lt;li&gt;重試；&lt;/li&gt;
&lt;li&gt;超時；&lt;/li&gt;
&lt;li&gt;優先級；&lt;/li&gt;
&lt;li&gt;GPU 使用率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;錯誤處理要給使用者能懂的信息&#34;&gt;錯誤處理要給使用者能懂的信息
&lt;/h2&gt;&lt;p&gt;把內部錯誤轉成可理解提示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prompt 不合法；&lt;/li&gt;
&lt;li&gt;上傳文件太大；&lt;/li&gt;
&lt;li&gt;生成超時；&lt;/li&gt;
&lt;li&gt;模型暫不可用；&lt;/li&gt;
&lt;li&gt;佇列已滿；&lt;/li&gt;
&lt;li&gt;結果已過期。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳細堆疊留在日誌裡，不要返回給瀏覽器。&lt;/p&gt;
&lt;h2 id=&#34;上線前要加哪些保護&#34;&gt;上線前要加哪些保護
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;登入或配額；&lt;/li&gt;
&lt;li&gt;上傳限制；&lt;/li&gt;
&lt;li&gt;prompt 和內容策略檢查；&lt;/li&gt;
&lt;li&gt;workflow 參數限制；&lt;/li&gt;
&lt;li&gt;佇列並發控制；&lt;/li&gt;
&lt;li&gt;超時和取消；&lt;/li&gt;
&lt;li&gt;結果過期；&lt;/li&gt;
&lt;li&gt;成本監控；&lt;/li&gt;
&lt;li&gt;模型和節點 allowlist；&lt;/li&gt;
&lt;li&gt;內部 API 保護。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;runninghub-和自建-comfyui-怎麼選&#34;&gt;RunningHub 和自建 ComfyUI 怎麼選
&lt;/h2&gt;&lt;p&gt;RunningHub 這類託管平台能減少基礎設施工作，適合快速驗證產品。自建 ComfyUI 則更適合需要控制模型、節點、GPU 成本、資料邊界和自訂工作流的場景。&lt;/p&gt;
&lt;p&gt;快速試產品可用託管；需要深度控制時再自建。&lt;/p&gt;
&lt;h2 id=&#34;一個推薦落地順序&#34;&gt;一個推薦落地順序
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;先在 ComfyUI 手動跑通工作流。&lt;/li&gt;
&lt;li&gt;固定一份 workflow JSON。&lt;/li&gt;
&lt;li&gt;只暴露少量安全參數。&lt;/li&gt;
&lt;li&gt;建立後端任務 API。&lt;/li&gt;
&lt;li&gt;前端加輪詢。&lt;/li&gt;
&lt;li&gt;保存結果。&lt;/li&gt;
&lt;li&gt;加佇列和限制。&lt;/li&gt;
&lt;li&gt;加監控和清理。&lt;/li&gt;
&lt;li&gt;再擴展更多工作流。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;faq&#34;&gt;FAQ
&lt;/h2&gt;&lt;h3 id=&#34;前端可以直接調用-comfyui-api-嗎&#34;&gt;前端可以直接調用 ComfyUI API 嗎？
&lt;/h3&gt;&lt;p&gt;公開網站不建議。應由後端做邊界。&lt;/p&gt;
&lt;h3 id=&#34;網站需要-websocket-嗎&#34;&gt;網站需要 WebSocket 嗎？
&lt;/h3&gt;&lt;p&gt;第一版不一定需要，輪詢就夠。之後可以用 WebSocket 改善進度體驗。&lt;/p&gt;
&lt;h3 id=&#34;workflow-json-可以讓使用者上傳嗎&#34;&gt;workflow JSON 可以讓使用者上傳嗎？
&lt;/h3&gt;&lt;p&gt;通常不建議。後端維護工作流，只暴露安全參數。&lt;/p&gt;
&lt;h3 id=&#34;生成結果應該存在哪裡&#34;&gt;生成結果應該存在哪裡？
&lt;/h3&gt;&lt;p&gt;生產環境通常應放物件儲存，而不是留在 ComfyUI 機器上。&lt;/p&gt;
&lt;h3 id=&#34;一個網站能接多個-comfyui-工作流嗎&#34;&gt;一個網站能接多個 ComfyUI 工作流嗎？
&lt;/h3&gt;&lt;p&gt;可以。用 workflow ID 和獨立參數映射管理。&lt;/p&gt;
&lt;h3 id=&#34;影片工作流和圖片工作流接入一樣嗎&#34;&gt;影片工作流和圖片工作流接入一樣嗎？
&lt;/h3&gt;&lt;p&gt;結構類似，但影片需要更長超時、更大儲存、更嚴格佇列和更清楚的進度提示。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;ComfyUI 接網站的穩定做法，是把它當內部渲染引擎。後端負責 workflow、佇列、任務狀態、結果儲存和安全限制；前端只收集安全輸入並展示進度和結果。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
