ComfyUI Panorama Stickers
参照画像から360度パノラマ画像を作る FLUX.2 Klein 4B/9B 360 ERP Outpaint LoRA 専用のUIです。
このLoRAの基本アプローチは outpainting です。
パノラマを長方形に展開した画像を ERP(equirectangular panorama)と呼びますが、空のERPに任意の画像を貼り、残りの部分をoutpaintすればパノラマ画像が作れる、という発想ですね。
ただし、長方形に画像を貼っただけではERPとして自然に見えません。
ERPはパノラマを展開したものなので、場所によって歪み方が変わります。また、ERPを見ながら「完成後のパノラマ」を想像してcontrol画像を作るのは、UXとしてイケてません。
このカスタムノードは、
- パノラマの中に入り
- 実際に景色を見ている感覚のまま参照画像を配置し
- その結果をERPとして出力する
という流れで、control画像作りを楽にするためのUIです。
出力ERPをそのまま FLUX.2 Klein に編集してもらうことで、パノラマ画像が完成します。
ノード構成
このカスタムノードは、4つのノードで構成されています。
Panorama Stickers:ERPキャンバスに画像を配置するPanorama Cutout:パノラマ内の任意視点を切り出す(撮影する)Panorama Preview:ノード上でプレビューするPanorama Seam Prep:左右端の継ぎ目を整える
インストール
nomadoor/ComfyUI-Panorama-Stickers
ComfyUI Managerからインストールしてください。
キャンバスの基本操作
レガシー/Node2.0の両方で安定した動作をさせるため、基本的には専用のモーダルUIから操作する設計にしています。
Panorama Previewだけはノード上でもプレビューできますが、操作はモーダルUIを前提にしています。
モーダルUIを開く
Open Stickers Editor(Cutout / Preview も同様)ボタンをクリック
視点移動 / ズーム
- 左ドラッグ / 中ドラッグで視点移動
- マウスホイールでFOV変更(ズームイン・アウト)
右下ボタン
- 視点初期化
- ガイド線表示切替
描画方法切り替え
- 左上トグルで
Panorama/ERP(展開)を切り替え
ドラッグ方向
- Inspector の
UI Setting→Invertedで反転
Panorama Stickers
ERPキャンバスに参照画像を置いていくためのEditorです。
画像の追加
+ Imageボタン、またはドラッグ&ドロップで追加- 追加直後は視点の中心付近に配置されます
画像の移動・拡大・回転
- 画像ドラッグで移動
- 画像を選択するとハンドルが出るため、各ドットを掴んで変形できます
Shiftを押しながら回転で45度ずつ回転します
- Inspectorのスライダーでも調整できます
重なり順 / 複製
- 画像を選択すると、画像下にUIが表示されます
- ボタンで最前面・最背面へ移動できます
- 複製ボタンで同じ画像を追加できます
画像の削除
- 画像下の削除ボタン or
Deleteキー - キャンバス下部の
Clear allボタンからは全削除もできます
Inspectorから画像選択
- Inspectorの
Imageから画像を選ぶと、その画像が中心に来るように視点が移動します
Panorama Cutout
パノラマの中に入り、カメラで撮影するように任意視点を切り出すEditorです。
フレームの追加
- 下部の
+ Add frameで追加します - 右上にプレビューが表示されます
フレームの移動・拡大・回転
- 基本は
Panorama Stickersと同じです - 辺をドラッグすることで、縦横比も変えられます
既定のアスペクト比へ変更
- フレーム選択時のUIから
1:1や3:2などを選べます - 横の
Rotate 90°で縦横を切り替えられます
フレーム位置へ視点移動
- 下部UIの
📷ボタンで、フレーム位置に視点が移動します
Panorama Preview
ノード上でプレビューを見られるノードです。モーダルUIは他と共通ですが、機能を絞っています。
ノード上プレビュー
- 基本的にはモーダルUIと同じようにドラッグ、マウスホイルで操作することができます。
全画面表示
- 右下ボタンで全画面表示にできます
Escで解除します
Panorama Seam Prep
どんなに上手く学習しても、パノラマ画像の左右端(シーム)の完全一致は難しいです。
このノードは、境目が画像の中心になるように画像をずらし、境目をinpaintingで後処理するときに使用します。

seam_width_px: マスクの幅を指定しますseam_center_offset_px: 境界を中心からずらしますmask_blur_px: マスクの両端をぼかします- inpaintingした結果を元の画像に合成するときに使用します
workflow
実際にLoRAを使って、参照画像からERPパノラマを作ってみます。
既知の問題ですが、DistilledモデルではLoRAがほとんど効きません。対策を探していますが、現状は base model 前提で使ってください。
モデルのダウンロード
-
diffusion_models
-
loras
-
text_encoders
-
vae
📂ComfyUI/
└── 📂models/
├── 📂diffusion_models/
│ ├── flux-2-klein-base-9b-fp8.safetensors
│ └── flux-2-klein-base-4b.safetensors
├── 📂loras/
│ ├── flux-2-klein-9B-360-erp-outpaint-lora_V1.safetensors
│ └── flux-2-klein-4B-360-erp-outpaint-lora_V1.safetensors
├── 📂text_encoders/
│ ├── qwen_3_8b.safetensors
│ └── qwen_3_4b.safetensors
└── 📂vae/
└── flux2-vae.safetensors
flux-2-klein-9B-360-erp-outpaint

{
"id": "e47d064a-cb92-4da7-b92b-be9f1ddd26f5",
"revision": 0,
"last_node_id": 70,
"last_link_id": 104,
"nodes": [
{
"id": 33,
"type": "CLIPTextEncode",
"pos": [
558.700000000001,
387.24938745307793
],
"size": [
425.2650317382812,
122.99611236572264
],
"flags": {
"collapsed": false
},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 64
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
83
]
}
],
"title": "CLIP Text Encode (Negative Prompt)",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, worst quality, blurry, ugly"
]
},
{
"id": 44,
"type": "CLIPLoader",
"pos": [
224.49879211425775,
292.66704483032197
],
"size": [
283.80000000000007,
106
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CLIP",
"type": "CLIP",
"links": [
63,
64
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.73",
"Node name for S&R": "CLIPLoader"
},
"widgets_values": [
"qwen_3_8b.safetensors",
"flux2",
"default"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 52,
"type": "VAEEncode",
"pos": [
821.9650317382822,
579.5488468801722
],
"size": [
162,
46
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "pixels",
"type": "IMAGE",
"link": 101
},
{
"name": "vae",
"type": "VAE",
"link": 76
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
74,
75,
84
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "VAEEncode"
},
"widgets_values": []
},
{
"id": 55,
"type": "ReferenceLatent",
"pos": [
1021.2781285510225,
387.24938745307793
],
"size": [
204.134765625,
46
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 83
},
{
"name": "latent",
"shape": 7,
"type": "LATENT",
"link": 84
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
85
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "ReferenceLatent"
},
"widgets_values": []
},
{
"id": 49,
"type": "ReferenceLatent",
"pos": [
1021.2781285510225,
160.40068341159756
],
"size": [
204.134765625,
46
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 70
},
{
"name": "latent",
"shape": 7,
"type": "LATENT",
"link": 75
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
71
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "ReferenceLatent"
},
"widgets_values": []
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
558.700000000001,
160.40068341159756
],
"size": [
425.2650317382812,
167.9430462646484
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 63
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
70
]
}
],
"title": "CLIP Text Encode (Positive Prompt)",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"Fill the green spaces according to the image. Outpaint as a seamless 360 equirectangular panorama (2:1). Keep the horizon level. Match left and right edges."
]
},
{
"id": 60,
"type": "PreviewImage",
"pos": [
819.4015950387359,
703.4925478431284
],
"size": [
343.0331978664948,
258
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 102
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.15.0",
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 48,
"type": "UNETLoader",
"pos": [
613.1701020904532,
-10.55701287776062
],
"size": [
308.1592787377913,
82
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
93
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "UNETLoader"
},
"widgets_values": [
"Flux.2\\flux-2-klein-base-9b-fp8.safetensors",
"default"
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 63,
"type": "LoraLoaderModelOnly",
"pos": [
954.6523968493398,
-10.55701287776062
],
"size": [
270,
82
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 93
}
],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
94
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.15.0",
"Node name for S&R": "LoraLoaderModelOnly"
},
"widgets_values": [
"Flux.2\\flux-2-klein-9B-360-erp-outpaint-lora_V1.safetensors",
0.9
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 66,
"type": "SaveImage",
"pos": [
2216.819528606419,
534.0964764114023
],
"size": [
311.495836060305,
282
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 104
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.15.0"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 8,
"type": "VAEDecode",
"pos": [
1615.039087801503,
160.40068341159756
],
"size": [
161.111083984375,
46
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 52
},
{
"name": "vae",
"type": "VAE",
"link": 62
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
87,
103
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 31,
"type": "KSampler",
"pos": [
1262.7259909887628,
160.40068341159756
],
"size": [
315,
262
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 94
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 71
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 85
},
{
"name": "latent_image",
"type": "LATENT",
"link": 74
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
52
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "KSampler"
},
"widgets_values": [
12345,
"fixed",
20,
5,
"euler",
"simple",
1
]
},
{
"id": 58,
"type": "PanoramaPreview",
"pos": [
1817.711607004872,
160.40068341159756
],
"size": [
370.848642607702,
310.2519666875871
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"name": "erp_image",
"type": "IMAGE",
"link": 87
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [],
"properties": {
"cnr_id": "panorama-stickers",
"ver": "d8b0f77f4d741089c553cac9938e16d5fe996920",
"Node name for S&R": "PanoramaPreview",
"aux_id": "nomadoor/ComfyUI-Panorama-Stickers"
},
"widgets_values": [
"360",
24
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 67,
"type": "MarkdownNote",
"pos": [
106.60533206157714,
-49.35469969856914
],
"size": [
401.6934600526807,
256.2520882868414
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"## models\n- [flux-2-klein-base-9b-fp8.safetensors](https://huggingface.co/black-forest-labs/FLUX.2-klein-base-9b-fp8/blob/main/flux-2-klein-base-9b-fp8.safetensors)\n- [flux-2-klein-9B-360-erp-outpaint-lora_V1.safetensors](https://huggingface.co/nomadoor/flux-2-klein-9B-360-erp-outpaint-lora/blob/main/flux-2-klein-9B-360-erp-outpaint-lora_V1.safetensors)\n- [qwen_3_8b.safetensors](https://huggingface.co/Comfy-Org/vae-text-encorder-for-flux-klein-9b/blob/main/split_files/text_encoders/qwen_3_8b.safetensors)\n- [flux2-vae.safetensors](https://huggingface.co/Comfy-Org/vae-text-encorder-for-flux-klein-9b/blob/main/split_files/vae/flux2-vae.safetensors)\n\n```\n📂ComfyUI/\n└── 📂models/\n ├── 📂diffusion_models/\n │ └── flux-2-klein-base-9b-fp8.safetensors\n ├── 📂loras/\n │ └── flux-2-klein-9B-360-erp-outpaint-lora_V1.safetensors\n ├── 📂text_encoders/\n │ └── qwen_3_8b.safetensors\n └── 📂vae/\n └── flux2-vae.safetensors\n```"
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 69,
"type": "PanoramaStickers",
"pos": [
520.1049057264069,
579.5488468801722
],
"size": [
270,
214
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "bg_erp",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "sticker_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "sticker_state",
"shape": 7,
"type": "STRING",
"link": null
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [
{
"name": "cond_erp",
"type": "IMAGE",
"links": [
101,
102
]
},
{
"name": "mask",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "panorama-stickers",
"ver": "2663addf35cedcca1539d5f65190146d4d6637cb",
"Node name for S&R": "PanoramaStickers"
},
"widgets_values": [
"2048",
"360",
"#00ff00",
"",
24
]
},
{
"id": 43,
"type": "VAELoader",
"pos": [
518.6444005254552,
848.5321218958388
],
"size": [
269.8313103058076,
58
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
62,
76
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"flux2-vae.safetensors"
],
"color": "#322",
"bgcolor": "#533"
},
{
"id": 70,
"type": "PanoramaCutout",
"pos": [
1817.711607004872,
534.0964764114023
],
"size": [
373.8481566087248,
279.55033874172886
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"name": "erp_image",
"type": "IMAGE",
"link": 103
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [
{
"name": "rect_image",
"type": "IMAGE",
"links": [
104
]
},
{
"name": "sticker_state",
"type": "STRING",
"links": null
},
{
"name": "mask",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "panorama-stickers",
"ver": "2663addf35cedcca1539d5f65190146d4d6637cb",
"Node name for S&R": "PanoramaCutout"
},
"widgets_values": [
"360",
"",
1,
24,
null,
""
],
"color": "#232",
"bgcolor": "#353"
}
],
"links": [
[
52,
31,
0,
8,
0,
"LATENT"
],
[
62,
43,
0,
8,
1,
"VAE"
],
[
63,
44,
0,
6,
0,
"CLIP"
],
[
64,
44,
0,
33,
0,
"CLIP"
],
[
70,
6,
0,
49,
0,
"CONDITIONING"
],
[
71,
49,
0,
31,
1,
"CONDITIONING"
],
[
74,
52,
0,
31,
3,
"LATENT"
],
[
75,
52,
0,
49,
1,
"LATENT"
],
[
76,
43,
0,
52,
1,
"VAE"
],
[
83,
33,
0,
55,
0,
"CONDITIONING"
],
[
84,
52,
0,
55,
1,
"LATENT"
],
[
85,
55,
0,
31,
2,
"CONDITIONING"
],
[
87,
8,
0,
58,
0,
"IMAGE"
],
[
93,
48,
0,
63,
0,
"MODEL"
],
[
94,
63,
0,
31,
0,
"MODEL"
],
[
101,
69,
0,
52,
0,
"IMAGE"
],
[
102,
69,
0,
60,
0,
"IMAGE"
],
[
103,
8,
0,
70,
0,
"IMAGE"
],
[
104,
70,
0,
66,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.9223142094796932,
"offset": [
-143.96265105341408,
261.27396796238196
]
},
"frontendVersion": "1.44.6",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
Panorama Stickersで参照画像を配置してERPを作ります- プロンプトは「トリガーワード + α」でOKです
Fill the green spaces according to the image. Outpaint as a seamless 360 equirectangular panorama (2:1). Keep the horizon level. Match left and right edges.
生成されるのはERP(2:1)画像です。そのままだと見づらいので、
Panorama PreviewやPanorama Cutoutで確認・撮影してください。
flux-2-klein-4B-360-erp-outpaint

{
"id": "e47d064a-cb92-4da7-b92b-be9f1ddd26f5",
"revision": 0,
"last_node_id": 71,
"last_link_id": 105,
"nodes": [
{
"id": 33,
"type": "CLIPTextEncode",
"pos": [
558.700000000001,
387.24938745307793
],
"size": [
425.2650317382812,
122.99611236572264
],
"flags": {
"collapsed": false
},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 64
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
83
]
}
],
"title": "CLIP Text Encode (Negative Prompt)",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, worst quality, blurry, ugly"
]
},
{
"id": 52,
"type": "VAEEncode",
"pos": [
821.9650317382822,
579.5488468801722
],
"size": [
162,
46
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "pixels",
"type": "IMAGE",
"link": 102
},
{
"name": "vae",
"type": "VAE",
"link": 76
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
74,
75,
84
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "VAEEncode"
},
"widgets_values": []
},
{
"id": 55,
"type": "ReferenceLatent",
"pos": [
1021.2781285510225,
387.24938745307793
],
"size": [
204.134765625,
46
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 83
},
{
"name": "latent",
"shape": 7,
"type": "LATENT",
"link": 84
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
85
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "ReferenceLatent"
},
"widgets_values": []
},
{
"id": 49,
"type": "ReferenceLatent",
"pos": [
1021.2781285510225,
160.40068341159756
],
"size": [
204.134765625,
46
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 70
},
{
"name": "latent",
"shape": 7,
"type": "LATENT",
"link": 75
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
71
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "ReferenceLatent"
},
"widgets_values": []
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
558.700000000001,
160.40068341159756
],
"size": [
425.2650317382812,
167.9430462646484
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 63
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
70
]
}
],
"title": "CLIP Text Encode (Positive Prompt)",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"Fill the green spaces according to the image. Outpaint as a seamless 360 equirectangular panorama (2:1). Keep the horizon level. Match left and right edges."
]
},
{
"id": 60,
"type": "PreviewImage",
"pos": [
819.4015950387359,
703.4925478431284
],
"size": [
343.0331978664948,
258
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 103
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.15.0",
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 66,
"type": "SaveImage",
"pos": [
2216.819528606419,
534.0964764114023
],
"size": [
311.495836060305,
282
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 105
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.15.0"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 31,
"type": "KSampler",
"pos": [
1262.7259909887628,
160.40068341159756
],
"size": [
315,
262
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 94
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 71
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 85
},
{
"name": "latent_image",
"type": "LATENT",
"link": 74
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
52
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "KSampler"
},
"widgets_values": [
12345,
"fixed",
20,
5,
"euler",
"simple",
1
]
},
{
"id": 63,
"type": "LoraLoaderModelOnly",
"pos": [
955.4128941760225,
-10.55701287776062
],
"size": [
270,
82
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 93
}
],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
94
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.15.0",
"Node name for S&R": "LoraLoaderModelOnly"
},
"widgets_values": [
"Flux.2\\flux-2-klein-4B-360-erp-outpaint-lora_V1.safetensors",
0.9
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 48,
"type": "UNETLoader",
"pos": [
613.1701020904532,
-10.55701287776062
],
"size": [
308.1592787377913,
82
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
93
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.9.2",
"Node name for S&R": "UNETLoader"
},
"widgets_values": [
"Flux.2\\flux-2-klein-base-4b.safetensors",
"default"
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 44,
"type": "CLIPLoader",
"pos": [
224.49879211425775,
292.66704483032197
],
"size": [
283.80000000000007,
106
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CLIP",
"type": "CLIP",
"links": [
63,
64
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.73",
"Node name for S&R": "CLIPLoader"
},
"widgets_values": [
"qwen_3_4b.safetensors",
"flux2",
"default"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 8,
"type": "VAEDecode",
"pos": [
1615.039087801503,
160.40068341159756
],
"size": [
161.111083984375,
46
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 52
},
{
"name": "vae",
"type": "VAE",
"link": 62
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
87,
104
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 58,
"type": "PanoramaPreview",
"pos": [
1817.711607004872,
160.40068341159756
],
"size": [
370.848642607702,
310.2519666875871
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"name": "erp_image",
"type": "IMAGE",
"link": 87
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [],
"properties": {
"cnr_id": "panorama-stickers",
"ver": "d8b0f77f4d741089c553cac9938e16d5fe996920",
"Node name for S&R": "PanoramaPreview",
"aux_id": "nomadoor/ComfyUI-Panorama-Stickers"
},
"widgets_values": [
"360",
24
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 67,
"type": "MarkdownNote",
"pos": [
107.72655108783698,
-56.078341741413944
],
"size": [
400.57224102642084,
254.00230600489186
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"## models\n- [flux-2-klein-base-4b.safetensors](https://huggingface.co/Comfy-Org/vae-text-encorder-for-flux-klein-4b/blob/main/split_files/diffusion_models/flux-2-klein-base-4b.safetensors)\n- [flux-2-klein-4B-360-erp-outpaint-lora_V1.safetensors](https://huggingface.co/nomadoor/flux-2-klein-4B-360-erp-outpaint-lora/blob/main/flux-2-klein-4B-360-erp-outpaint-lora_V1.safetensors)\n- [qwen_3_4b.safetensors](https://huggingface.co/Comfy-Org/vae-text-encorder-for-flux-klein-4b/blob/main/split_files/text_encoders/qwen_3_4b.safetensors)\n- [flux2-vae.safetensors](https://huggingface.co/Comfy-Org/vae-text-encorder-for-flux-klein-9b/blob/main/split_files/vae/flux2-vae.safetensors)\n\n```\n📂ComfyUI/\n└── 📂models/\n ├── 📂diffusion_models/\n │ └── flux-2-klein-base-4b.safetensors\n ├── 📂loras/\n │ └── flux-2-klein-4B-360-erp-outpaint-lora_V1.safetensors\n ├── 📂text_encoders/\n │ └── qwen_3_4b.safetensors\n └── 📂vae/\n └── flux2-vae.safetensors\n```"
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 43,
"type": "VAELoader",
"pos": [
526.7903750011757,
850.1613167909834
],
"size": [
269.8313103058076,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
62,
76
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.39",
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"flux2-vae.safetensors"
],
"color": "#322",
"bgcolor": "#533"
},
{
"id": 70,
"type": "PanoramaStickers",
"pos": [
520.1049057264069,
579.5488468801722
],
"size": [
270,
214
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "bg_erp",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "sticker_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "sticker_state",
"shape": 7,
"type": "STRING",
"link": null
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [
{
"name": "cond_erp",
"type": "IMAGE",
"links": [
102,
103
]
},
{
"name": "mask",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "panorama-stickers",
"ver": "2663addf35cedcca1539d5f65190146d4d6637cb",
"Node name for S&R": "PanoramaStickers"
},
"widgets_values": [
"2048",
"360",
"#00ff00",
"{\"version\":1,\"projection_model\":\"pinhole_rectilinear\",\"alpha_mode\":\"straight\",\"coverage\":360,\"bg_color\":\"#00ff00\",\"output_preset\":2048,\"assets\":{},\"stickers\":[],\"shots\":[],\"painting\":{\"version\":1,\"groups\":[],\"paint\":{\"strokes\":[]},\"mask\":{\"strokes\":[]},\"raster_objects\":[]},\"painting_layer\":null,\"ui_settings\":{\"invert_view_x\":false,\"invert_view_y\":false,\"preview_quality\":\"balanced\"},\"active\":{\"selected_sticker_id\":null,\"selected_shot_id\":null}}",
24
]
},
{
"id": 71,
"type": "PanoramaCutout",
"pos": [
1817.711607004872,
534.0964764114023
],
"size": [
375.4773515038687,
278.7357412941567
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"name": "erp_image",
"type": "IMAGE",
"link": 104
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
}
],
"outputs": [
{
"name": "rect_image",
"type": "IMAGE",
"links": [
105
]
},
{
"name": "sticker_state",
"type": "STRING",
"links": null
},
{
"name": "mask",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "panorama-stickers",
"ver": "2663addf35cedcca1539d5f65190146d4d6637cb",
"Node name for S&R": "PanoramaCutout"
},
"widgets_values": [
"360",
"{\"version\":1,\"projection_model\":\"pinhole_rectilinear\",\"alpha_mode\":\"straight\",\"coverage\":360,\"bg_color\":\"#00ff00\",\"output_preset\":2048,\"assets\":{},\"stickers\":[],\"shots\":[],\"painting\":{\"version\":1,\"groups\":[],\"paint\":{\"strokes\":[]},\"mask\":{\"strokes\":[]},\"raster_objects\":[]},\"painting_layer\":null,\"ui_settings\":{\"invert_view_x\":false,\"invert_view_y\":false,\"preview_quality\":\"balanced\"},\"active\":{\"selected_sticker_id\":null,\"selected_shot_id\":null}}",
1,
24,
null,
""
],
"color": "#232",
"bgcolor": "#353"
}
],
"links": [
[
52,
31,
0,
8,
0,
"LATENT"
],
[
62,
43,
0,
8,
1,
"VAE"
],
[
63,
44,
0,
6,
0,
"CLIP"
],
[
64,
44,
0,
33,
0,
"CLIP"
],
[
70,
6,
0,
49,
0,
"CONDITIONING"
],
[
71,
49,
0,
31,
1,
"CONDITIONING"
],
[
74,
52,
0,
31,
3,
"LATENT"
],
[
75,
52,
0,
49,
1,
"LATENT"
],
[
76,
43,
0,
52,
1,
"VAE"
],
[
83,
33,
0,
55,
0,
"CONDITIONING"
],
[
84,
52,
0,
55,
1,
"LATENT"
],
[
85,
55,
0,
31,
2,
"CONDITIONING"
],
[
87,
8,
0,
58,
0,
"IMAGE"
],
[
93,
48,
0,
63,
0,
"MODEL"
],
[
94,
63,
0,
31,
0,
"MODEL"
],
[
102,
70,
0,
52,
0,
"IMAGE"
],
[
103,
70,
0,
60,
0,
"IMAGE"
],
[
104,
8,
0,
71,
0,
"IMAGE"
],
[
105,
71,
0,
66,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1.2276002128174721,
"offset": [
-1140.2451613823378,
-120.32741424587256
]
},
"frontendVersion": "1.44.6",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}