<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Workflow on KnightLiブログ</title>
        <link>https://knightli.com/ja/tags/workflow/</link>
        <description>Recent content in Workflow on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Fri, 10 Jul 2026 06:24:49 +0800</lastBuildDate><atom:link href="https://knightli.com/ja/tags/workflow/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ComfyUI ワークフロー API を Web サイトに組み込む方法：フロントエンド、バックエンド、キュー、結果表示</title>
        <link>https://knightli.com/ja/2026/07/10/comfyui-workflow-api-website-integration/</link>
        <pubDate>Fri, 10 Jul 2026 06:24:49 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/07/10/comfyui-workflow-api-website-integration/</guid>
        <description>&lt;p&gt;ComfyUI ワークフローを Web サイトに組み込む作業は、単に API を 1 回呼ぶだけではありません。実用的な流れには、フォーム、バックエンドのタスク API、パラメータ変換、画像アップロード、キュー、状態ポーリング、結果保存、エラー処理が必要です。&lt;/p&gt;
&lt;p&gt;基本方針は、workflow JSON をバックエンドで管理し、ユーザーには安全なパラメータだけを入力させることです。&lt;/p&gt;
&lt;h2 id=&#34;2-つの-api-層を分ける&#34;&gt;2 つの API 層を分ける
&lt;/h2&gt;&lt;p&gt;通常は次の 2 層です。&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 をそのまま公開インターネットに出すべきではありません。&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;バックエンド-api-設計&#34;&gt;バックエンド API 設計
&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;/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; を返すだけにします。生成完了まで HTTP リクエストを待たせない方が安全です。&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;/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;ユーザーが操作できるのは安全な項目に限定します。&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;uploaded image;&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;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;image-to-image や参照画像では：&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 が読める場所に渡す。&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;方法-1バックエンドでプロキシする&#34;&gt;方法 1：バックエンドでプロキシする
&lt;/h3&gt;&lt;p&gt;小さな内部ツールなら簡単です。バックエンドが ComfyUI から取得し、ブラウザへ返します。&lt;/p&gt;
&lt;h3 id=&#34;方法-2オブジェクトストレージに保存する&#34;&gt;方法 2：オブジェクトストレージに保存する
&lt;/h3&gt;&lt;p&gt;公開サイトでは S3、R2、OSS などへ保存し、DB には 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;concurrency;&lt;/li&gt;
&lt;li&gt;user rate limit;&lt;/li&gt;
&lt;li&gt;retry;&lt;/li&gt;
&lt;li&gt;timeout;&lt;/li&gt;
&lt;li&gt;priority;&lt;/li&gt;
&lt;li&gt;GPU utilization。&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;認証または quota;&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;timeout と cancellation;&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 コスト、データ境界、カスタム workflow を細かく制御できます。&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 template を固定。&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;複数 workflow に広げる。&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;最初はポーリングで十分です。後から進捗表示を改善できます。&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;1-つのサイトで複数-workflow-を扱えますか&#34;&gt;1 つのサイトで複数 workflow を扱えますか？
&lt;/h3&gt;&lt;p&gt;可能です。workflow ID と個別マッピングで管理します。&lt;/p&gt;
&lt;h3 id=&#34;動画-workflow-も同じですか&#34;&gt;動画 workflow も同じですか？
&lt;/h3&gt;&lt;p&gt;構造は似ていますが、動画は timeout、保存容量、キュー、進捗表示がより重要です。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;ComfyUI をサイトに組み込むときは、内部レンダリングエンジンとして扱うのが安全です。バックエンドが workflow、キュー、状態、保存、制限を持ち、フロントエンドは安全な入力と結果表示に集中します。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
