diff --git a/javascript/data.js b/javascript/data.js index bd21741..8f5fee1 100644 --- a/javascript/data.js +++ b/javascript/data.js @@ -2,132 +2,195 @@ export const CATEGORY_COMFY_ACADEMY="Comfy Academy" export const CATEGORY_TEMPLATE="Templates" export const categories = [CATEGORY_COMFY_ACADEMY, CATEGORY_TEMPLATE] export const latestVersion = 1; +export const COURSES = [ + { + id: '1', + title: 'Lesson 1: Using ComfyUI, EASY basics - Comfy Academy', + description: 'In this first Part of the Comfy Academy Series I will show you the basics of the ComfyUI interface. What are Nodes? How to find them? What is the ComfyUI Manager? How to Link Models from Automatic 1111 into ComfyUI? How to connect Nodes? How to create Node Groups? and much more.', + video_link: 'https://www.youtube.com/watch?v=LNOlk8oz1nY', + video_embed_link: 'https://www.youtube.com/embed/LNOlk8oz1nY', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT_part_1.jpg', + workflows: [], + duration: '15:13', + timestamps: [ + // { time: 0, title: 'Why ComfyUI?' }, + // { time: 60, title: 'ComfyUI overview' }, + // { time: 90, title: 'ComfyUI Manager Install Instructions' }, + // { time: 150, title: 'How to use ComfyUI Manager' }, + // { time: 275, title: 'Model path setup (recommended if you already use WebUI)' }, + // { time: 350, title: 'ComfyUI nodes' }, + // { time: 420, title: 'KSampler node' }, + // { time: 562, title: 'Reroute node' }, + // { time: 660, title: 'Customize your nodes' }, + // { time: 802, title: 'Group nodes' } + ] + }, + { + id: '2', + title: 'Lesson 2: Cool Text 2 Image Trick in ComfyUI - Comfy Academy', + description: 'In this Part of Comfy Academy we build our very first Workflow with simple Text 2 Image. But then I will also show you some cool tricks that use Laten Image Input and also ControlNet to get stunning Results and Variations with the same Image Composition.', + video_link: 'https://www.youtube.com/watch?v=6kHCE1_LaO0', + video_embed_link: 'https://www.youtube.com/embed/6kHCE1_LaO0', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT_Part_2.jpg', + workflows: [ + 'j9ZrbVS2QKetKdiLVqmw' + ], + duration: '10:43', + timestamps: [ + // { time: 0, title: 'Build from scratch' }, + // { time: 385, title: 'Add more image output' }, + // { time: 475, title: 'Bonus point - Add ControlNet depth map' } + ] + }, + { + id: '3', + title: 'Lesson 3: Latent Upscaling in ComfyUI - Comfy Academy', + description: 'Let\'s explore Latent Upscaling in ComfyUI. It is super easy to do and can greatly improve your image quality. This is also a needed step for many other things like better img2img render, UltimateUpscale or FaceDetailer', + video_link: 'https://www.youtube.com/watch?v=3W-_B_0F7-g', + video_embed_link: 'https://www.youtube.com/embed/3W-_B_0F7-g', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT_Part_3.jpg', + workflows: [ + '8n40kHT7p1krLwCdihdY', + ], + duration: '9:23', + timestamps: [] + }, + { + id: '4', + title: 'Lesson 4: Img2Img Painting in ComfyUI - Comfy Academy', + description: 'Using a very basic painting as a Image Input can be extremely effective to get amazing results. In this Lesson of the Comfy Academy we will look at one of my favorite tricks to get much better AI Images. This gives you control over the color, the composition and the artful expressiveness of your AI Art.', + video_link: 'https://www.youtube.com/watch?v=179OUihyihk', + video_embed_link: 'https://www.youtube.com/embed/179OUihyihk', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT_Part_4.jpg', + workflows: [ + '33ECh584TbdXjPyitkff', + ], + duration: '10:40', + timestamps: [] + }, + { + id: '5', + title: 'Lesson5: Magical Img2Img Render + WD14 in ComfyUI - Comfy Academy', + description: 'I built a magical Img2Img workflow for you. In the first workflow, we explore the benefits of Image-to-Image rendering and how it can help you generate amazing AI images. In the second workflow, I created a magical Image-to-Image workflow for you that uses WD14 to automatically generate the prompt from the image input. This is fantastic!', + video_link: 'https://www.youtube.com/watch?v=xP4KJ4_SxX8', + video_embed_link: 'https://www.youtube.com/embed/xP4KJ4_SxX8', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT_Part_5.jpg', + workflows: [ + 'TfVDgqk4JpLubTKOIoHJ', + ], + duration: '10:09', + timestamps: [] + }, + { + id: '6', + title: 'Lesson 6: Model Switch and Masking in ComfyUI - Comfy Academy', + description: 'Model Switching is one of my favorite tricks with AI. We render an AI image first in one model and then render it again with Image-to-Image in a different model. This allows us to use the colors, composition, and expressiveness of the first model but apply the style of the second model to our image. \n' + + 'Then we also explore Image Masking for inpainting in Comfyui, a hidden gem that is very effective.', + video_link: 'https://www.youtube.com/watch?v=IO4DB2hsUf8', + video_embed_link: 'https://www.youtube.com/embed/IO4DB2hsUf8', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT%206.jpg', + workflows: [ + 'mVvngwUewT8Tfqs727YH', + ], + duration: '8:12', + timestamps: [] + }, + { + id: '7', + title: 'Lesson 7: Live Model Merge in ComfyUI - Comfy Academy', + description: 'Live Model Merge in ComfyUI is highly effective. It allows you to use several Models at the same time and set the Ratio between them for the Model and the Clip. This is done WITHOUT creating a Model Merge File. So you save a lot of harddrive space and can experiment with model merges at any time.', + video_link: 'https://www.youtube.com/watch?v=wcoopBBhUrw', + video_embed_link: 'https://www.youtube.com/embed/wcoopBBhUrw', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT%207.jpg', + workflows: [ + 'shuGYFYatsb2M8nwNi6e', + ], + duration: '7:17', + timestamps: [] + }, + { + id: '8', + title: 'Lesson 8: Loras in ComfyUI - Comfy Academy', + description: 'Let\'s learn how to use Loras in ComfyUi. Loras is a very effective way to create more styles and better images with the models you have. You can use Loras to create various styles, including specific clothing styles, actions, faces, and colors. You can even add more details to the image and get better skin details in your AI image.', + video_link: 'https://www.youtube.com/watch?v=dJx0tuEbxAY', + video_embed_link: 'https://www.youtube.com/embed/dJx0tuEbxAY', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT%208.jpg', + workflows: [ + 'ik3X9D92bcpouZEgScfB', + ], + duration: '11:19', + timestamps: [] + }, + { + id: '9', + title: 'Lesson 9: ControlNet in ComfyUI - ComfyUI Academy', + description: 'ControlNet in ComfyUI is very powerful. In this lesson, you will learn how to use ControlNet. You will learn about different ways to preprocess the images. I will show you how to apply different weights to the ControlNet and apply it only partially to your rendering steps. Create much better AI images with ControlNet in ComfyUI.', + video_link: 'https://www.youtube.com/watch?v=zdiFAgdgtjg', + video_embed_link: 'https://www.youtube.com/embed/zdiFAgdgtjg', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT%209.jpg', + workflows: [ + 'eWSkFEeLjJ33zfCulBQs', + ], + duration: '13:42', + timestamps: [] + }, + { + id: '10', + title: 'Lesson 10: UltimateUpscaler in ComfyUI - Comfy Academy', + description: 'Ultimate Upscaler is the best way to create highly detailed Upscales in ComfyUI. In this video we will explore how to use UltimateUpscaler. Learn about different Upscale Models and their benefits. Create the best Upscales you have ever made with this Tutorial', + video_link: 'https://www.youtube.com/watch?v=gk6MLF09XjY', + video_embed_link: 'https://www.youtube.com/embed/gk6MLF09XjY', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT%2010.jpg', + workflows: [ + 'DPi9F7xpDnDYVGulvKCq', + ], + duration: '11:40', + timestamps: [] + }, + { + id: '11', + title: 'Lesson 11: Facedetailer in ComfyUI - Comfy Academy', + description: 'In this Part of Comfy Academy we check out the FaceDetailer Node. This can be used with any kind of Face in AI image generation. However it is especially effective with small faces in images, as they can often be deformed or lack detail. This can also be used to just export the face mask and use it in other creative ways.', + video_link: 'https://www.youtube.com/watch?v=AnKnBKG2avE', + video_embed_link: 'https://www.youtube.com/embed/AnKnBKG2avE', + thumbnail_url: 'https://cdn.openart.ai/comfyui_academy/YT%2011.jpg', + workflows: [ + 'yX7UGJvOMSYBPUrMzL7r', + ], + duration: '8:25', + timestamps: [] + }, +]; +export const TEMPLATES = [{"id":"lkOtNJ2UexVd6vK0kYhd", + "creator":{"uid":"4pYEgRw3JXVFu5elJKeR","bio":"","username":"openart","name":"OpenArt","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"}, + "updated_at":{"_seconds":1671396844,"_nanoseconds":977000000}, + "stats":{"num_comments":0,"num_shares":0,"rating":5,"num_runs":0,"num_bookmarks":0,"num_reviews":1,"num_likes":11,"num_downloads":1631,"num_views":8075}, + "nodes_index":["Note",".","ComfyUI","CLIPTextEncode","VAEDecode","SaveImage","EmptyLatentImage","KSampler","CheckpointLoaderSimple",","], + "name":"Basic SD1.5 Workflow ", + "description":"
This workflow simply
and generates an image.
Use this workflow only if you are sure the base checkpoint embeds a good quality VAE, otherwise check out another this workflow with VAE - https://openart.ai/workflows/openart/basic-sd15-workflow-with-vae/XlPv7Qz9U3wOIDn5vSxM.
", + "created_at":{"_seconds":1671396844,"_nanoseconds":790000000}, + "categories":[], + "thumbnails":[{"width":960,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_OOJIcZFT_1702943704029_raw.jpg","height":960},{"width":2662,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_T1vSgAYq_1702943704333_raw.jpg","height":1530}], + "nodes_count":{"total":9,"primitive":2,"custom":7}},{"id":"XlPv7Qz9U3wOIDn5vSxM","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1705490941,"_nanoseconds":409000000},"stats":{"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_comments":1,"num_likes":8,"num_downloads":1186,"num_views":4578},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","VAEDecode","SaveImage","EmptyLatentImage","KSampler","CheckpointLoaderSimple","VAELoader",","],"name":"Basic SD1.5 + VAE Workflow","description":"This workflow adds an external VAE on top of the basic text-to-image workflow ( https://openart.ai/workflows/openart/basic-sd15-workflow/lkOtNJ2UexVd6vK0kYhd). The VAE model is responsible of converting the latent image into the pixel space. The process is \"lossy\" and a good VAE model is essential to get good quality images.
This one workflow uses a default good VAE but there are more. Check out the description on Huggingface or CivitAI if the author suggests a specific VAE.
","created_at":{"_seconds":1671397200,"_nanoseconds":737000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_3C6Rr-LO_1702933751971_raw.webp","height":1024},{"width":2620,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_i-o0SHeN_1702933984215_raw.jpg","height":1660}],"nodes_count":{"total":11,"primitive":3,"custom":8}},{"id":"7YARVB8mANBPGbzqpWfV","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671397911,"_nanoseconds":49000000},"stats":{"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_comments":1,"num_likes":12,"num_downloads":1369,"num_views":6916},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","VAEDecode","SaveImage","EmptyLatentImage","VAELoader","KSampler","CheckpointLoaderSimple","LoraLoader",","],"name":"Basic LoRA Workflow","description":"This workflow loads an additional LoRA on top of the base model.
** LORAs can be daisy-chained! You can have as many as you want **
","created_at":{"_seconds":1671397911,"_nanoseconds":900000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_v5L3bGqX_1702941891063_raw.webp","height":1024}],"nodes_count":{"total":10,"primitive":1,"custom":9}},{"id":"qijtHYoTK3jG7grl0Mub","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_1024.jpg","username":"openart"},"updated_at":{"_seconds":1671398400,"_nanoseconds":796000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":2,"num_downloads":665,"num_views":2314},"nodes_index":["Note",".","ComfyUI","VAEDecode","SaveImage","ImageScale","CLIPTextEncode","VAEEncode","RepeatLatentBatch","LoadImage","CheckpointLoaderSimple","KSampler",","],"name":"Basic SD 1.5 Img2img Workflow","description":"This is a basic img2img workflow. You can upload a reference image and a prompt to guide the image generation.
By default, it generates 4 images based on 1 reference image, but you can bypass or remove the Repeat Latent Batch node to generate just 1 image.
","created_at":{"_seconds":1671398400,"_nanoseconds":588000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_RYWWTOHy_1704183475455_raw.jpg","height":1024},{"width":3194,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_c3hZ3YG1_1704183518395_raw.jpg","height":1630}],"nodes_count":{"total":13,"primitive":3,"custom":10}},{"id":"YibsziaM9wW4Oze1iDwP","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671399000,"_nanoseconds":424000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":1,"num_downloads":929,"num_views":3184},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","EmptyLatentImage","CheckpointLoaderSimple","KSampler","VAELoader","VAEDecode","PreviewImage","SaveImage","LatentFromBatch",","],"name":"Batch Generation Workflow","description":"This workflow can batch generate images instead of one at at time, by using the Latent From Batch node. It helps get more results at a time.
You can change the batch index to tweak the number of generations.
","created_at":{"_seconds":1671399000,"_nanoseconds":578000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_qmd3m0_k_1702943062775_raw.jpg","height":1024},{"width":3026,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_70ykMqSb_1702943063753_raw.jpg","height":1652}],"nodes_count":{"total":12,"primitive":1,"custom":11}},{"id":"S6PuWxBpXPB9PxSMhgUb","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_1024.jpg","username":"openart"},"updated_at":{"_seconds":1671399600,"_nanoseconds":439000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_likes":0,"num_bookmarks":0,"num_downloads":546,"num_views":2395},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","VAEDecode","SaveImage","EmptyLatentImage","VAELoader","KSampler","CheckpointLoaderSimple","CLIPSetLastLayer",","],"name":"Clip Skip Workflow","description":"This workflow allows you to skip some of the layers of the CLIP model when generating images. This can be useful for getting more creative results, as the CLIP model can sometimes be too specific in its descriptions.
","created_at":{"_seconds":1671399600,"_nanoseconds":951000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_8v6AdCia_1703246910524_raw.jpg","height":1024},{"width":3402,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_io5Y2QnI_1703246911529_raw.jpg","height":1678}],"nodes_count":{"total":10,"primitive":1,"custom":9}},{"id":"VSXSMBLJzsoy0Jb8qLIV","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671400200,"_nanoseconds":806000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":4,"num_downloads":840,"num_views":2909},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","CheckpointLoaderSimple","EmptyLatentImage","KSampler","VAELoader","VAEDecode","PreviewImage","SaveImage",","],"name":"Basic Second-Pass Workflow","description":"This workflow applies a second pass of KSampler on top of this basic SD 1.5 workflow with an external VAE ( https://openart.ai/workflows/openart/basic-sd15-workflow-with-vae/XlPv7Qz9U3wOIDn5vSxM). Even at the same resolution (ie: without upscaling), the second pass can increase definition and fix small mistakes.
Increasing the DENOISE adds more details but also changes the original reference more (the first pass).
This inpainting workflows allow you to edit a specific part in the image. Right click the image, select the Mask Editor and mask the area that you want to change. The grow mask option is important and needs to be calibrated based on the subject.
In this example we're applying a second pass with low denoise to increase the details and merge everything together.
","created_at":{"_seconds":1671400800,"_nanoseconds":920000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_sDsn1iWt_1703246015468_raw.jpg","height":1024},{"width":3282,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_pNgw9yvC_1703246016572_raw.jpg","height":1736}],"nodes_count":{"total":14,"primitive":4,"custom":10}},{"id":"4UymtsV7TcfpZPHPgIpd","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_1024.jpg","username":"openart"},"updated_at":{"_seconds":1671401400,"_nanoseconds":622000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":3,"num_downloads":569,"num_views":4176},"nodes_index":["Reroute","Note",".","ComfyUI","CLIPTextEncode","VAELoader","KSampler","VAEDecode","ImagePadForOutpaint","CheckpointLoaderSimple","PreviewImage","VAEEncodeForInpaint","EmptyLatentImage",","],"name":"Basic Outpainting Workflow","description":"In this workflow, the first half of the workflow just generates an image that will be outpainted later. You can replace the first with an image import node.
In the second half othe workflow, all you need to do for outpainting is to pad the image with the \"Pad Image for Outpainting\" node in the direction you wish to add. Note that it's still technically an \"inpainting\" process, so you need to use an inpainting checkpoint and the \"VAE Encode (for inpainting)\" node.
","created_at":{"_seconds":1671401400,"_nanoseconds":823000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_2xx-i5SI_1704184168022_raw.jpg","height":1024},{"width":3258,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_xDFw9YQO_1704184171763_raw.jpg","height":1394}],"nodes_count":{"total":19,"primitive":5,"custom":14}},{"id":"aO8mb2DFYJlyr7agH7p9","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_1024.jpg","username":"openart"},"updated_at":{"_seconds":1671402000,"_nanoseconds":214000000},"stats":{"num_shares":0,"rating":5,"num_runs":0,"num_bookmarks":0,"num_reviews":1,"num_comments":1,"num_likes":5,"num_downloads":447,"num_views":1440},"nodes_index":["Reroute","Note",".","ComfyUI","CLIPTextEncode","VAEDecode","EmptyLatentImage","SolidMask","FeatherMask","PreviewImage","KSampler","MaskComposite","MaskToImage","SetLatentNoiseMask","ImagePadForOutpaint","SaveImage","VAELoader","VAEEncodeForInpaint","CheckpointLoaderSimple",","],"name":"Outpainting With Seam Fix","description":"When outpainting it happens to get a noticeable seam line between the two pieces. This workflow applies a low denoise second pass over the outpainted image to fix any glitch.
","created_at":{"_seconds":1671402000,"_nanoseconds":523000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_VraAqcdy_1704185036207_raw.jpg","height":1024},{"width":3316,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_5gWQrT5v_1704185041158_raw.jpg","height":1630}],"nodes_count":{"total":30,"primitive":7,"custom":23}},{"id":"tOYu3yw8kSXxA1gB96Db","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671404400,"_nanoseconds":77000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":4,"num_downloads":559,"num_views":5962},"nodes_index":["Note",".","ComfyUI","EmptyLatentImage","VAEDecode","CLIPTextEncode","KSampler","SaveImage","CheckpointLoaderSimple",","],"name":"Ultra Basic SDXL Workflow (Not Recommended)","description":"This is essentially the same as the basic workflow for SD 1.5 ( https://openart.ai/workflows/openart/basic-sd15-workflow/lkOtNJ2UexVd6vK0kYhd ), but it's not optimized for SDXL. We include it here for the demo purpose.
We highly recommend you to use another basic SDXL workflows - https://openart.ai/workflows/openart/basic-sdxl-workflow/P8VEtDSQGYf4pOugtnvO which includes ClipTextEncodeSDXL for better image quality results.
","created_at":{"_seconds":1671404400,"_nanoseconds":591000000},"categories":[],"thumbnails":[{"width":768,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_4BaFHbOX_1702943833144_raw.jpg","height":768},{"width":2744,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_DJNqO6SF_1702943833773_raw.jpg","height":1606}],"nodes_count":{"total":9,"primitive":2,"custom":7}},{"id":"P8VEtDSQGYf4pOugtnvO","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671405000,"_nanoseconds":612000000},"stats":{"num_comments":0,"num_shares":0,"num_runs":0,"num_bookmarks":0,"num_reviews":1,"rating":5,"num_likes":4,"num_downloads":1699,"num_views":7115},"nodes_index":["Note","PrimitiveNode",".","ComfyUI","CheckpointLoaderSimple","CLIPTextEncodeSDXL","KSampler","EmptyLatentImage","VAEDecode","SaveImage",","],"name":"Basic SDXL Workflow","description":"This basic workflow runs the base SDXL model with some optimization for SDXL. This can be useful for systems with limited resources as the refiner takes another 6GB or ram.
If your model is based on SD 1.5, use this basic workflow instead - https://openart.ai/workflows/openart/basic-sd15-workflow/lkOtNJ2UexVd6vK0kYhd.
This workflow adds a refiner model on topic of the basic SDXL workflow ( https://openart.ai/workflows/openart/basic-sdxl-workflow/P8VEtDSQGYf4pOugtnvO ).
The core of the composition is created by the base SDXL model and the refiner takes care of the minutiae. The refiner helps improve the quality of the generated image.
","created_at":{"_seconds":1671405600,"_nanoseconds":923000000},"categories":["SDXL"],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_zQVjBhMQ_1704182787567_raw.jpg","height":1024},{"width":2662,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_0IHo0xiZ_1704182789124_raw.jpg","height":1402}],"nodes_count":{"total":22,"primitive":10,"custom":12}},{"id":"yrUf3Yj2kqSHVbZsS9vy","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_1024.jpg","username":"openart"},"updated_at":{"_seconds":1671406200,"_nanoseconds":206000000},"stats":{"num_comments":0,"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":9,"num_views":6538,"num_downloads":1574},"nodes_index":["PrimitiveNode","Note",".","ComfyUI","VAEDecode","KSampler","CLIPTextEncodeSDXL","ImageScale","LoadImage","CheckpointLoaderSimple","VAELoader","VAEEncode","SaveImage",","],"name":"Basic SDXL Img2Img Workflow","description":"This is a basic img2img workflow on top of our basic SDXL workflow ( https://openart.ai/workflows/openart/basic-sdxl-workflow/P8VEtDSQGYf4pOugtnvO ). Instead of starting with a random latent image, the workflow will start with a user-uploaded image.
","created_at":{"_seconds":1671406200,"_nanoseconds":253000000},"categories":["SDXL"],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_skZX6-ue_1703244597599_raw.jpg","height":1024},{"width":3228,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_GbcOxaL6_1703244598402_raw.jpg","height":1710}],"nodes_count":{"total":15,"primitive":5,"custom":10}},{"id":"REGMkdFKDcRg4RkpMzvG","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671408000,"_nanoseconds":294000000},"stats":{"num_shares":0,"rating":5,"num_runs":0,"num_bookmarks":0,"num_comments":1,"num_reviews":1,"num_likes":13,"num_downloads":1494,"num_views":14772},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","EmptyLatentImage","KSampler","VAELoader","VAEEncode","VAEDecode","SaveImage","ImageScaleBy","PreviewImage","CheckpointLoaderSimple",","],"name":"Pixel Upscale Workflow","description":"This is the simplest and probably less expensive method to upscale an image on the pixel level. A lanczos algorithm is used in the pixel space to upscale the image and then a second pass applied to it.
It needs a relatively high denoise which means the final image will be a little different from the source.
","created_at":{"_seconds":1671408000,"_nanoseconds":124000000},"categories":[],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_dq9KHLx1_1702944090473_raw.webp","height":1024},{"width":3152,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_E0ZP2RF-_1702944790937_raw.jpg","height":1644}],"nodes_count":{"total":14,"primitive":1,"custom":13}},{"id":"V6horzh1YQN8Pz5rJXzP","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671408600,"_nanoseconds":974000000},"stats":{"num_shares":0,"rating":5,"num_reviews":0,"num_runs":0,"num_bookmarks":0,"num_likes":1,"num_comments":1,"num_downloads":1104,"num_views":5674},"nodes_index":["Note",".","ComfyUI","CLIPTextEncode","EmptyLatentImage","CheckpointLoaderSimple","KSampler","VAEDecode","SaveImage","VAELoader","PreviewImage","ImageUpscaleWithModel","UpscaleModelLoader","ImageScaleBy","VAEEncode",","],"name":"Model-based Pixel Upscale Workflow","description":"This workflows loads an existing upscaling model that takes care of the upscaling phase. It's more effective but more expensive than our basic image upscaling workflow ( https://openart.ai/workflows/openart/basic-image-upscale-workflow/REGMkdFKDcRg4RkpMzvG ).
The second pass is performed to add back some sharpness to the image but can be done at a very low denoise.
The latent can be upscaled directly but the loss in quality is important. That means that the second pass after the upscale has to be done at a very high denoise (0.55+).
This option is offered as it's very inexpensive computationally and it can be useful if you don't need the final image to be 100% of the initial generation.
If the final image can be rather different from the first pass, you should use latent upscale as it's faster and very light computationally.
","created_at":{"_seconds":1671409200,"_nanoseconds":933000000},"categories":["Upscale"],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_yiC2Eo7L_1704182268845_raw.jpg","height":1024},{"width":2958,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_GN_Yjfa5_1704182271315_raw.jpg","height":1608}],"nodes_count":{"total":14,"primitive":2,"custom":12}},{"id":"8H0mGG5dOFQCuslp2qQv","creator":{"uid":"4pYEgRw3JXVFu5elJKeR","name":"OpenArt","bio":"","username":"openart","avatar":"https://cdn.openart.ai/uploads/image_vmS7sTuQ_1703026397814_256.jpg"},"updated_at":{"_seconds":1671415200,"_nanoseconds":788000000},"stats":{"num_shares":0,"num_runs":0,"num_bookmarks":0,"rating":3,"num_reviews":1,"num_comments":1,"num_likes":17,"num_downloads":1864,"num_views":7213},"nodes_index":["Note",".","ComfyUI","EmptyLatentImage","CLIPTextEncode","VAEDecode","VAELoader","SaveImage","LoadImage","KSampler","CLIPVisionLoader","CheckpointLoaderSimple",",","ComfyUI_IPAdapter_plus","IPAdapterApply","IPAdapterModelLoader",","],"name":"Basic IPAdapter","description":"This workflows is a very simple workflow to use IPAdapter IP-Adapter is an effective and lightweight adapter to achieve image prompt capability for stable diffusion models.
The IPAdapter model has to match the CLIP vision encoder and of course the main checkpoint. All SD15 models and all models ending with \"vit-h\" use the SD15 CLIP vision. One of the SDXL models and all models ending with \"vit-g\" use the SDXL CLIP vision.
PLUS models use more tokens and are stronger. LIGHT models have a very light impact. FACE and FULL-FACE are only to describe faces (they are not face swap!)
","created_at":{"_seconds":1671415200,"_nanoseconds":93000000},"categories":["IP-Adapter"],"thumbnails":[{"width":1024,"url":"https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_KdBztP1T_1702945457521_raw.jpg","height":1024}],"nodes_count":{"total":13,"primitive":1,"custom":12}}] export const modules = [ // Comfy Academy - { - title:"ComfyUI Intro", - type:'lesson', - description:` -We show you the ComfyUI interface and talk about different nodes including KSampler (the single most important node to generate a image), Reroute nodes. We even covered slightly more advanced techniques like how to customize a node and how to group a node. - -In the next lesson, we will leverage what we learned in this lesson to build our first workflow together.`, - videoId:`BT2Kpm1cU-w`, + ...COURSES.map(course => ({ + title: course.title, + description: course.description, + type: 'lesson', + videoId:course.video_embed_link.substring(course.video_embed_link.lastIndexOf('?v=')+1), categories:[categories[0]], - initialWorkflow:`{"last_node_id": 9,"last_link_id": 9,"nodes": [{"id": 3,"type": "KSampler","pos": [621,237],"size": {"0": 315,"1": 262},"flags": {},"order": 0,"mode": 0,"inputs": [{"name": "model","type": "MODEL","link": null},{"name": "positive","type": "CONDITIONING","link": null},{"name": "negative","type": "CONDITIONING","link": null},{"name": "latent_image","type": "LATENT","link": null}],"outputs": [{"name": "LATENT","type": "LATENT","links": [],"slot_index": 0}],"properties": {"Node name for S&R": "KSampler"},"widgets_values": [156680208700286,"randomize",20,8,"euler","normal",1]}],"links": [],"groups": [],"config": {},"extra": {},"version": 0.4}` - }, - { - title:"Build Your First Workflow", - type:'lesson', - description:`In this lesson, you will learn how to build your first workflow and see some fun experiments. - -We start with KSampler and build out the first workflow to generate an image based on a text prompt with a given model. - -Then we tweaked our workflow to have 3 output images. - -Finally, we added ControlNet depth map to create images of the same scenery at different time of the day. - `, - videoId:`igOXqGR88KI`, - categories:[categories[0]], - initialWorkflow:`{"last_node_id":31,"last_link_id":36,"nodes":[{"id":28,"type":"VAELoader","pos":[1290,290],"size":{"0":315,"1":58},"flags":{},"order":0,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[33],"shape":3}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":24,"type":"CLIPTextEncode","pos":[860,450],"size":{"0":400,"1":200},"flags":{},"order":3,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":27}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[25],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, digital painting, masterpiece"]},{"id":25,"type":"CLIPTextEncode","pos":[860,710],"size":{"0":400,"1":200},"flags":{},"order":4,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":28}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[26],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["ugly, deformed"]},{"id":22,"type":"KSampler","pos":[1310,480],"size":{"0":315,"1":262},"flags":{},"order":5,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":24,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":25,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":26,"slot_index":2},{"name":"latent_image","type":"LATENT","link":29,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[30],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[1106281217108158,"randomize",25,7,"dpmpp_2m","karras",1]},{"id":26,"type":"EmptyLatentImage","pos":[900,280],"size":{"0":315,"1":106},"flags":{},"order":1,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[29],"shape":3}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,768,1]},{"id":27,"type":"VAEDecode","pos":[1670,380],"size":{"0":210,"1":46},"flags":{},"order":6,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":30},{"name":"vae","type":"VAE","link":33,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[36],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":31,"type":"SaveImage","pos":[1650,560],"size":{"0":333.5714111328125,"1":457.857177734375},"flags":{},"order":7,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":36}],"properties":{},"widgets_values":["ComfyUI"]},{"id":23,"type":"CheckpointLoaderSimple","pos":[500,530],"size":{"0":315,"1":98},"flags":{},"order":2,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[24],"shape":3},{"name":"CLIP","type":"CLIP","links":[27,28],"shape":3,"slot_index":1},{"name":"VAE","type":"VAE","links":[],"shape":3,"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["dreamshaper_8.safetensors"]}],"links":[[24,23,0,22,0,"MODEL"],[25,24,0,22,1,"CONDITIONING"],[26,25,0,22,2,"CONDITIONING"],[27,23,1,24,0,"CLIP"],[28,23,1,25,0,"CLIP"],[29,26,0,22,3,"LATENT"],[30,22,0,27,0,"LATENT"],[33,28,0,27,1,"VAE"],[36,27,0,31,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}`, - keyframesWorkflows: { - 10:`{"last_node_id": 9, "last_link_id": 9, "nodes": [], "links": [], "groups": [], "config": {}, "extra": {}, "version": 0.4 }`, - 390:`{"last_node_id":42,"last_link_id":59,"nodes":[{"id":26,"type":"EmptyLatentImage","pos":[418,183],"size":{"0":315,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[29],"shape":3}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,768,1]},{"id":23,"type":"CheckpointLoaderSimple","pos":[10,441],"size":{"0":315,"1":98},"flags":{},"order":1,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[24,37,45],"shape":3},{"name":"CLIP","type":"CLIP","links":[27,28,41,49],"shape":3,"slot_index":1},{"name":"VAE","type":"VAE","links":[],"shape":3,"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["dreamshaper_8.safetensors"]},{"id":28,"type":"VAELoader","pos":[7,595],"size":{"0":315,"1":58},"flags":{},"order":2,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[33,43,51],"shape":3}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":25,"type":"CLIPTextEncode","pos":[380,489],"size":{"0":400,"1":200},"flags":{},"order":4,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":28}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[26,39,47],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["ugly, deformed"]},{"id":24,"type":"CLIPTextEncode","pos":[860,1050],"size":{"0":400,"1":200},"flags":{},"order":3,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":27}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[25],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, digital painting, masterpiece"]},{"id":31,"type":"SaveImage","pos":[860,140],"size":{"0":333.5714111328125,"1":457.857177734375},"flags":{},"order":11,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":36}],"properties":{},"widgets_values":["ComfyUI"]},{"id":34,"type":"VAEDecode","pos":[1410,960],"size":{"0":210,"1":46},"flags":{},"order":12,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":42},{"name":"vae","type":"VAE","link":43,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[44],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":35,"type":"SaveImage","pos":[1330,140],"size":{"0":333.5714111328125,"1":457.857177734375},"flags":{},"order":14,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":44}],"properties":{},"widgets_values":["ComfyUI"]},{"id":38,"type":"VAEDecode","pos":[1850,960],"size":{"0":210,"1":46},"flags":{},"order":13,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":50},{"name":"vae","type":"VAE","link":51,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[52],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":39,"type":"SaveImage","pos":[1770,140],"size":{"0":333.5714111328125,"1":457.857177734375},"flags":{},"order":15,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":52}],"properties":{},"widgets_values":["ComfyUI"]},{"id":22,"type":"KSampler","pos":[880,650],"size":{"0":315,"1":262},"flags":{},"order":7,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":24,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":25,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":26,"slot_index":2},{"name":"latent_image","type":"LATENT","link":29,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[30,53,54],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[404520270437958,"randomize",20,7,"dpmpp_2m","karras",1]},{"id":36,"type":"KSampler","pos":[1790,650],"size":{"0":315,"1":262},"flags":{},"order":10,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":45,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":46,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":47,"slot_index":2},{"name":"latent_image","type":"LATENT","link":54,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[50],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[820732627807787,"randomize",20,7,"dpmpp_2m","karras",0.75]},{"id":27,"type":"VAEDecode","pos":[940,960],"size":{"0":210,"1":46},"flags":{},"order":8,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":30},{"name":"vae","type":"VAE","link":33,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[36],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":32,"type":"KSampler","pos":[1350,650],"size":{"0":315,"1":262},"flags":{},"order":9,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":37,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":59,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":39,"slot_index":2},{"name":"latent_image","type":"LATENT","link":53,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[42],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[779879935222374,"randomize",20,7,"dpmpp_2m","karras",1]},{"id":33,"type":"CLIPTextEncode","pos":[1330,1050],"size":{"0":400,"1":200},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":41}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[59],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, at night, dark night with stars, digital painting, masterpiece"]},{"id":37,"type":"CLIPTextEncode","pos":[1770,1050],"size":{"0":400,"1":200},"flags":{},"order":6,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":49}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[46],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, at sunset with orange sky, digital painting, masterpiece"]}],"links":[[24,23,0,22,0,"MODEL"],[25,24,0,22,1,"CONDITIONING"],[26,25,0,22,2,"CONDITIONING"],[27,23,1,24,0,"CLIP"],[28,23,1,25,0,"CLIP"],[29,26,0,22,3,"LATENT"],[30,22,0,27,0,"LATENT"],[33,28,0,27,1,"VAE"],[36,27,0,31,0,"IMAGE"],[37,23,0,32,0,"MODEL"],[39,25,0,32,2,"CONDITIONING"],[41,23,1,33,0,"CLIP"],[42,32,0,34,0,"LATENT"],[43,28,0,34,1,"VAE"],[44,34,0,35,0,"IMAGE"],[45,23,0,36,0,"MODEL"],[46,37,0,36,1,"CONDITIONING"],[47,25,0,36,2,"CONDITIONING"],[49,23,1,37,0,"CLIP"],[50,36,0,38,0,"LATENT"],[51,28,0,38,1,"VAE"],[52,38,0,39,0,"IMAGE"],[53,22,0,32,3,"LATENT"],[54,22,0,36,3,"LATENT"],[59,33,0,32,1,"CONDITIONING"]],"groups":[],"config":{},"extra":{},"version":0.4}`, - 475:`{"last_node_id":45,"last_link_id":63,"nodes":[{"id":26,"type":"EmptyLatentImage","pos":[418,183],"size":{"0":315,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[29],"shape":3}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,768,1]},{"id":23,"type":"CheckpointLoaderSimple","pos":[10,441],"size":{"0":315,"1":98},"flags":{},"order":1,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[24,37,45],"shape":3},{"name":"CLIP","type":"CLIP","links":[27,28,41,49],"shape":3,"slot_index":1},{"name":"VAE","type":"VAE","links":[],"shape":3,"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["dreamshaper_8.safetensors"]},{"id":28,"type":"VAELoader","pos":[7,595],"size":{"0":315,"1":58},"flags":{},"order":2,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[33,43,51],"shape":3}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":25,"type":"CLIPTextEncode","pos":[380,489],"size":{"0":400,"1":200},"flags":{},"order":6,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":28}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[26,39,47],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["ugly, deformed"]},{"id":24,"type":"CLIPTextEncode","pos":[860,1050],"size":{"0":400,"1":200},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":27}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[25],"shape":3}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, digital painting, masterpiece"]},{"id":34,"type":"VAEDecode","pos":[1410,960],"size":{"0":210,"1":46},"flags":{},"order":16,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":42},{"name":"vae","type":"VAE","link":43,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[44],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":38,"type":"VAEDecode","pos":[1850,960],"size":{"0":210,"1":46},"flags":{},"order":17,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":50},{"name":"vae","type":"VAE","link":51,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[52],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":32,"type":"KSampler","pos":[1350,650],"size":{"0":315,"1":262},"flags":{},"order":14,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":37,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":58,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":39,"slot_index":2},{"name":"latent_image","type":"LATENT","link":53,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[42],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[364248276467172,"randomize",20,7,"dpmpp_2m","karras",1]},{"id":37,"type":"CLIPTextEncode","pos":[1770,1050],"size":{"0":400,"1":200},"flags":{},"order":8,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":49}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[63],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, at sunset, digital painting, masterpiece"]},{"id":36,"type":"KSampler","pos":[1790,650],"size":{"0":315,"1":262},"flags":{},"order":15,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":45,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":62,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":47,"slot_index":2},{"name":"latent_image","type":"LATENT","link":54,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[50],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[558547470604681,"randomize",20,7,"dpmpp_2m","karras",1]},{"id":43,"type":"ControlNetApply","pos":[1831,1304],"size":{"0":317.4000244140625,"1":98},"flags":{},"order":13,"mode":0,"inputs":[{"name":"conditioning","type":"CONDITIONING","link":63},{"name":"control_net","type":"CONTROL_NET","link":60},{"name":"image","type":"IMAGE","link":61}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[62],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ControlNetApply"},"widgets_values":[0.8300000000000001]},{"id":45,"type":"ControlNetLoader","pos":[1834,1480],"size":{"0":315,"1":58},"flags":{},"order":3,"mode":0,"outputs":[{"name":"CONTROL_NET","type":"CONTROL_NET","links":[60],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ControlNetLoader"},"widgets_values":["control_depth-fp16.safetensors"]},{"id":42,"type":"ControlNetLoader","pos":[1376,1448],"size":{"0":315,"1":58},"flags":{},"order":4,"mode":0,"outputs":[{"name":"CONTROL_NET","type":"CONTROL_NET","links":[56],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ControlNetLoader"},"widgets_values":["control_depth-fp16.safetensors"]},{"id":40,"type":"ControlNetApply","pos":[1376,1305],"size":{"0":317.4000244140625,"1":98},"flags":{},"order":12,"mode":0,"inputs":[{"name":"conditioning","type":"CONDITIONING","link":57},{"name":"control_net","type":"CONTROL_NET","link":56},{"name":"image","type":"IMAGE","link":55}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[58],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ControlNetApply"},"widgets_values":[0.8300000000000001]},{"id":33,"type":"CLIPTextEncode","pos":[1332,1063],"size":{"0":400,"1":200},"flags":{},"order":7,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":41}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[57],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["mountain landscape, dark blue night, clear sky with stars, digital painting, masterpiece"]},{"id":27,"type":"VAEDecode","pos":[944,958],"size":{"0":210,"1":46},"flags":{},"order":10,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":30},{"name":"vae","type":"VAE","link":33,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[36,55,61],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":31,"type":"SaveImage","pos":[909,113],"size":[333.5714111328125,457.857177734375],"flags":{},"order":11,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":36}],"properties":{},"widgets_values":["ComfyUI"]},{"id":35,"type":"SaveImage","pos":[1258,112],"size":{"0":333.5714111328125,"1":457.857177734375},"flags":{},"order":18,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":44}],"properties":{},"widgets_values":["ComfyUI"]},{"id":39,"type":"SaveImage","pos":[1604,118],"size":{"0":333.5714111328125,"1":457.857177734375},"flags":{},"order":19,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":52}],"properties":{},"widgets_values":["ComfyUI"]},{"id":22,"type":"KSampler","pos":[880,650],"size":{"0":315,"1":262},"flags":{},"order":9,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":24,"slot_index":0},{"name":"positive","type":"CONDITIONING","link":25,"slot_index":1},{"name":"negative","type":"CONDITIONING","link":26,"slot_index":2},{"name":"latent_image","type":"LATENT","link":29,"slot_index":3}],"outputs":[{"name":"LATENT","type":"LATENT","links":[30,53,54],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[977581853009345,"randomize",20,7,"dpmpp_2m","karras",1]}],"links":[[24,23,0,22,0,"MODEL"],[25,24,0,22,1,"CONDITIONING"],[26,25,0,22,2,"CONDITIONING"],[27,23,1,24,0,"CLIP"],[28,23,1,25,0,"CLIP"],[29,26,0,22,3,"LATENT"],[30,22,0,27,0,"LATENT"],[33,28,0,27,1,"VAE"],[36,27,0,31,0,"IMAGE"],[37,23,0,32,0,"MODEL"],[39,25,0,32,2,"CONDITIONING"],[41,23,1,33,0,"CLIP"],[42,32,0,34,0,"LATENT"],[43,28,0,34,1,"VAE"],[44,34,0,35,0,"IMAGE"],[45,23,0,36,0,"MODEL"],[47,25,0,36,2,"CONDITIONING"],[49,23,1,37,0,"CLIP"],[50,36,0,38,0,"LATENT"],[51,28,0,38,1,"VAE"],[52,38,0,39,0,"IMAGE"],[53,22,0,32,3,"LATENT"],[54,22,0,36,3,"LATENT"],[55,27,0,40,2,"IMAGE"],[56,42,0,40,1,"CONTROL_NET"],[57,33,0,40,0,"CONDITIONING"],[58,40,0,32,1,"CONDITIONING"],[60,45,0,43,1,"CONTROL_NET"],[61,27,0,43,2,"IMAGE"],[62,43,0,36,1,"CONDITIONING"],[63,37,0,43,0,"CONDITIONING"]],"groups":[],"config":{},"extra":{},"version":0.4}` - } - }, + thumbnail:course.thumbnail_url, + })), // templates - { - title:"Basic SD1.5 Workflow", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_OOJIcZFT_1702943704029_raw.jpg', - description:`This workflow simply - - - loads a model - - allows you to enter positive negative prompt - - allows you to adjust basic configurations like seeds, steps etc - -and generates an image.`, + ...TEMPLATES.map(template => ({ + id: template.id, + title: template.name, + description: template.description, + type: 'template', + thumbnail:template.thumbnails[0].url, categories:[categories[1]], - initialWorkflow:`{"last_node_id":14,"last_link_id":11,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[440,360],"size":{"0":370,"1":160},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":5}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":6,"type":"CLIPTextEncode","pos":[440,140],"size":{"0":370,"1":160},"flags":{},"order":4,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":3}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":8,"type":"VAEDecode","pos":[1240,280],"size":{"0":140,"1":60},"flags":{},"order":7,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":7},{"name":"vae","type":"VAE","link":11}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[9],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":9,"type":"SaveImage","pos":[1430,280],"size":{"0":410,"1":460},"flags":{},"order":8,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":9}],"properties":{},"widgets_values":["Result"]},{"id":5,"type":"EmptyLatentImage","pos":[590,580],"size":{"0":220,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":3,"type":"KSampler","pos":[890,280],"size":{"0":300,"1":262},"flags":{},"order":6,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":1},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[7],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":11,"type":"Note","pos":[20,50],"size":{"0":260,"1":140},"flags":{},"order":1,"mode":0,"properties":{"text":""},"widgets_values":["Basic 1.x/2.x workflow\\n======================\\n\\nUse this workflow only if you are sure the base checkpoint embeds a good quality VAE, otherwise check the \\"ext_vae\\" workflow."],"color":"#432","bgcolor":"#653"},{"id":12,"type":"Note","pos":[900,-20],"size":{"0":270,"1":250},"flags":{},"order":2,"mode":0,"properties":{"text":""},"widgets_values":["KSampler\\n========\\n\\nDPMPP_2M / KARRAS is generally a good overall performer and a safe bet but experiment with others!\\n\\nLess \\"predictable\\" samplers are those ending with _SDE and _ANCESTRAL.\\n\\nIf results are underwhelming increase the number of steps (+5 at a time).\\n\\nIf the image looks over-saturated lower the CFG value."],"color":"#432","bgcolor":"#653"},{"id":4,"type":"CheckpointLoaderSimple","pos":[30,280],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":3,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[1],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[3,5],"slot_index":1},{"name":"VAE","type":"VAE","links":[11],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["dreamshaper_8.safetensors"]}],"links":[[1,4,0,3,0,"MODEL"],[2,5,0,3,3,"LATENT"],[3,4,1,6,0,"CLIP"],[4,6,0,3,1,"CONDITIONING"],[5,4,1,7,0,"CLIP"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[9,8,0,9,0,"IMAGE"],[11,4,2,8,1,"VAE"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic SD1.5 + VAE Workflow", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_3C6Rr-LO_1702933751971_raw.webp', - description:`This workflow adds an external VAE on top of the basic text-to-image workflow. The VAE model is responsible of converting the latent image into the pixel space. The process is "lossy" and a good VAE model is essential to get good quality images.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":16,"last_link_id":12,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[440,360],"size":{"0":370,"1":160},"flags":{},"order":7,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":5}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":6,"type":"CLIPTextEncode","pos":[440,140],"size":{"0":370,"1":160},"flags":{},"order":6,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":3}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":8,"type":"VAEDecode","pos":[1240,280],"size":{"0":140,"1":60},"flags":{},"order":9,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":7},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[9],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":9,"type":"SaveImage","pos":[1430,280],"size":{"0":410,"1":460},"flags":{},"order":10,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":9}],"properties":{},"widgets_values":["Result"]},{"id":4,"type":"CheckpointLoaderSimple","pos":[30,280],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":0,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[1],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[3,5],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]},{"id":5,"type":"EmptyLatentImage","pos":[590,580],"size":{"0":220,"1":106},"flags":{},"order":1,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":3,"type":"KSampler","pos":[890,280],"size":{"0":300,"1":262},"flags":{},"order":8,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":1},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[7],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":12,"type":"Note","pos":[900,-20],"size":{"0":270,"1":250},"flags":{},"order":2,"mode":0,"properties":{"text":""},"widgets_values":["KSampler\\n========\\n\\nDPMPP_2M / KARRAS is generally a good overall performer and a safe bet but experiment with others!\\n\\nLess \\"predictable\\" samplers are those ending with _SDE and _ANCESTRAL.\\n\\nIf results are underwhelming increase the number of steps (+5 at a time).\\n\\nIf the image looks over-saturated lower the CFG value."],"color":"#432","bgcolor":"#653"},{"id":15,"type":"VAELoader","pos":[870,600],"size":{"0":315,"1":58},"flags":{},"order":3,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":11,"type":"Note","pos":[20,50],"size":[260,170],"flags":{},"order":4,"mode":0,"properties":{"text":""},"widgets_values":["Basic 1.x/2.x workflow + EXT VAE\\n================================\\n\\nSame as the base workflow with added external VAE. The VAE model is responsible of converting the latent image into the pixel space. The process is \\"lossy\\" and a good VAE model is essential to get good quality images."],"color":"#432","bgcolor":"#653"},{"id":16,"type":"Note","pos":[920,710],"size":{"0":260,"1":170},"flags":{},"order":5,"mode":0,"properties":{"text":""},"widgets_values":["VAE\\n===\\n\\nThe one above is considered a good VAE but there are more. Check in the Checkpoint description on Huggingface or CivitAI if the author suggests a specific VAE."],"color":"#432","bgcolor":"#653"}],"links":[[1,4,0,3,0,"MODEL"],[2,5,0,3,3,"LATENT"],[3,4,1,6,0,"CLIP"],[4,6,0,3,1,"CONDITIONING"],[5,4,1,7,0,"CLIP"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[9,8,0,9,0,"IMAGE"],[12,15,0,8,1,"VAE"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic Image Upscale Workflow ", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_dq9KHLx1_1702944090473_raw.webp', - description:`This is the simplest and probably less expensive method to upscale an image on the pixel level. A lanczos algorithm is used in the pixel space to upscale the image and then a second pass applied to it. - -It needs a relatively high denoise which means the final image will be a little different from the source.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":23,"last_link_id":24,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[430,290],"size":{"0":370,"1":160},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":5}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6,19],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":5,"type":"EmptyLatentImage","pos":[580,510],"size":{"0":220,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":3,"type":"KSampler","pos":[880,210],"size":{"0":300,"1":262},"flags":{},"order":6,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":1},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[7],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":15,"type":"VAELoader","pos":[860,530],"size":{"0":315,"1":58},"flags":{},"order":1,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12,15,23],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":19,"type":"VAEEncode","pos":[1690,120],"size":[140,46],"flags":{},"order":10,"mode":0,"inputs":[{"name":"pixels","type":"IMAGE","link":14},{"name":"vae","type":"VAE","link":15}],"outputs":[{"name":"LATENT","type":"LATENT","links":[21],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEEncode"}},{"id":22,"type":"KSampler","pos":[1880,60],"size":{"0":300,"1":262},"flags":{},"order":11,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":17},{"name":"positive","type":"CONDITIONING","link":18},{"name":"negative","type":"CONDITIONING","link":19},{"name":"latent_image","type":"LATENT","link":21}],"outputs":[{"name":"LATENT","type":"LATENT","links":[22],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[904,"fixed",25,6.5,"dpmpp_2m","karras",0.48]},{"id":23,"type":"VAEDecode","pos":[2230,60],"size":[140,46],"flags":{},"order":12,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":22},{"name":"vae","type":"VAE","link":23}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[24],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":9,"type":"SaveImage","pos":[2230,160],"size":[698.1452148437502,753.2806640625001],"flags":{},"order":13,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":24}],"properties":{},"widgets_values":["Result"]},{"id":11,"type":"Note","pos":[20,-90],"size":[322.89542543506394,229.8573122953],"flags":{},"order":2,"mode":0,"properties":{"text":""},"widgets_values":["SIMPLE PIXEL SPACE UPSCALER\\n===========================\\n\\nThis is the simplest and probably less expensive method to upscale an image.\\n\\nA lanczos algorithm it's used in the pixel space to upscale the image and then a second pass applied to it.\\n\\nIt needs a relatively high denoise which means the final image will be a little different from the source."],"color":"#432","bgcolor":"#653"},{"id":6,"type":"CLIPTextEncode","pos":[430,70],"size":{"0":370,"1":160},"flags":{},"order":4,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":3}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4,18],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":8,"type":"VAEDecode","pos":[1220,210],"size":[140,46],"flags":{},"order":7,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":7},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[13,16],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":18,"type":"ImageScaleBy","pos":[1440,120],"size":[210,82],"flags":{},"order":8,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":13}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[14],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ImageScaleBy"},"widgets_values":["lanczos",2]},{"id":20,"type":"PreviewImage","pos":[1440,260],"size":[303.4552148437501,317.88066406250005],"flags":{},"order":9,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":16}],"properties":{"Node name for S&R":"PreviewImage"}},{"id":4,"type":"CheckpointLoaderSimple","pos":[20,190],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":3,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[1,17],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[3,5],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]}],"links":[[1,4,0,3,0,"MODEL"],[2,5,0,3,3,"LATENT"],[3,4,1,6,0,"CLIP"],[4,6,0,3,1,"CONDITIONING"],[5,4,1,7,0,"CLIP"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[12,15,0,8,1,"VAE"],[13,8,0,18,0,"IMAGE"],[14,18,0,19,0,"IMAGE"],[15,15,0,19,1,"VAE"],[16,8,0,20,0,"IMAGE"],[17,4,0,22,0,"MODEL"],[18,6,0,22,1,"CONDITIONING"],[19,7,0,22,2,"CONDITIONING"],[21,19,0,22,3,"LATENT"],[22,22,0,23,0,"LATENT"],[23,15,0,23,1,"VAE"],[24,23,0,9,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}/dreamshaper_8.safetensors"]},{"id":5,"type":"IPAdapterApply","pos":[651,-57],"size":{"0":210,"1":258},"flags":{},"order":9,"mode":0,"inputs":[{"name":"ipadapter","type":"IPADAPTER","link":1},{"name":"clip_vision","type":"CLIP_VISION","link":2},{"name":"image","type":"IMAGE","link":3},{"name":"model","type":"MODEL","link":4},{"name":"attn_mask","type":"MASK","link":null}],"outputs":[{"name":"MODEL","type":"MODEL","links":[7],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"IPAdapterApply"},"widgets_values":[0.85,0,"original",0,1,false]},{"id":3,"type":"IPAdapterModelLoader","pos":[290,60],"size":{"0":300,"1":60},"flags":{},"order":5,"mode":0,"outputs":[{"name":"IPADAPTER","type":"IPADAPTER","links":[1],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"IPAdapterModelLoader"},"widgets_values":["ip-adapter_sd15.safetensors"]},{"id":13,"type":"Note","pos":[131,-270],"size":[456.8177419906998,273.55983091565],"flags":{},"order":6,"mode":0,"properties":{"text":""},"widgets_values":["BASIC IPADAPTER\\n===============\\n\\nBe careful when selecting the models!\\n\\nThe IPAdapter model has to match the CLIP vision encoder and of course the main checkpoint.\\n\\nAll SD15 models and all models ending with \\"vit-h\\" use the SD15 CLIP vision.\\n\\nOne of the SDXL models and all models ending with \\"vit-g\\" use the SDXL CLIP vision.\\n\\nPLUS models use more tokens and are stronger. LIGHT models have a very light impact. FACE and FULL-FACE are only to describe faces (they are not face swap!)"],"color":"#432","bgcolor":"#653"}],"links":[[1,3,0,5,0,"IPADAPTER"],[2,4,0,5,1,"CLIP_VISION"],[3,6,0,5,2,"IMAGE"],[4,1,0,5,3,"MODEL"],[5,1,1,7,0,"CLIP"],[6,1,1,8,0,"CLIP"],[7,5,0,9,0,"MODEL"],[8,7,0,9,1,"CONDITIONING"],[9,8,0,9,2,"CONDITIONING"],[10,10,0,9,3,"LATENT"],[11,9,0,11,0,"LATENT"],[12,2,0,11,1,"VAE"],[13,11,0,12,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Model-based Image Upscale Workflow ", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_bDYqWOlI_1702944965033_raw.jpg', - description:`This workflow loads an existing upscaling model that takes care of the upscaling phase. It's more effective but more expensive than our basic image upscaling workflow. - -The second pass is performed to add back some sharpness to the image but can be done at a very low denoise.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":32,"last_link_id":38,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[430,290],"size":{"0":370,"1":160},"flags":{},"order":6,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":5}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6,19],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":5,"type":"EmptyLatentImage","pos":[580,510],"size":{"0":220,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":6,"type":"CLIPTextEncode","pos":[430,70],"size":{"0":370,"1":160},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":3}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4,18],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":4,"type":"CheckpointLoaderSimple","pos":[20,190],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":1,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[1,17],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[3,5],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]},{"id":3,"type":"KSampler","pos":[880,210],"size":{"0":300,"1":262},"flags":{},"order":7,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":1},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[7],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":23,"type":"VAEDecode","pos":[2300,160],"size":[140,46],"flags":{},"order":14,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":22},{"name":"vae","type":"VAE","link":23}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[24],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":9,"type":"SaveImage","pos":[2300,270],"size":[698.1452148437502,753.2806640625001],"flags":{},"order":15,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":24}],"properties":{},"widgets_values":["Result"]},{"id":8,"type":"VAEDecode","pos":[1220,210],"size":[140,46],"flags":{},"order":8,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":7},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[16,36],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":15,"type":"VAELoader","pos":[860,530],"size":{"0":315,"1":58},"flags":{},"order":2,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12,23,37],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":20,"type":"PreviewImage","pos":[1228,310],"size":[303.4552148437501,317.88066406250005],"flags":{},"order":9,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":16}],"properties":{"Node name for S&R":"PreviewImage"}},{"id":28,"type":"ImageUpscaleWithModel","pos":[1407,119],"size":[230,50],"flags":{},"order":10,"mode":0,"inputs":[{"name":"upscale_model","type":"UPSCALE_MODEL","link":30},{"name":"image","type":"IMAGE","link":36,"slot_index":1}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[33],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ImageUpscaleWithModel"}},{"id":27,"type":"UpscaleModelLoader","pos":[1137,49],"size":{"0":230,"1":60},"flags":{},"order":3,"mode":0,"outputs":[{"name":"UPSCALE_MODEL","type":"UPSCALE_MODEL","links":[30],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"UpscaleModelLoader"},"widgets_values":["4x_foolhardy_Remacri.pth"]},{"id":30,"type":"ImageScaleBy","pos":[1676,101],"size":{"0":210,"1":80},"flags":{},"order":11,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":33}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[32],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"ImageScaleBy"},"widgets_values":["nearest-exact",0.5]},{"id":29,"type":"VAEEncode","pos":[1740,233],"size":{"0":140,"1":50},"flags":{},"order":12,"mode":0,"inputs":[{"name":"pixels","type":"IMAGE","link":32},{"name":"vae","type":"VAE","link":37}],"outputs":[{"name":"LATENT","type":"LATENT","links":[38],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEEncode"}},{"id":22,"type":"KSampler","pos":[1950,170],"size":{"0":300,"1":262},"flags":{},"order":13,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":17},{"name":"positive","type":"CONDITIONING","link":18},{"name":"negative","type":"CONDITIONING","link":19},{"name":"latent_image","type":"LATENT","link":38}],"outputs":[{"name":"LATENT","type":"LATENT","links":[22],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[905,"fixed",25,6.5,"dpmpp_2m","karras",0.35000000000000003]},{"id":11,"type":"Note","pos":[25,-35],"size":[317.3923561789769,179.25183105468716],"flags":{},"order":4,"mode":0,"properties":{"text":""},"widgets_values":["PIXEL SPACE UPSCALER WITH MODEL\\n===============================\\n\\nOne of the most effective way to upscale is with a model that takes care of the upscaling phase.\\n\\nThe second pass is performed to add back some sharpness to the image but can be done at a very low denoise."],"color":"#432","bgcolor":"#653"}],"links":[[1,4,0,3,0,"MODEL"],[2,5,0,3,3,"LATENT"],[3,4,1,6,0,"CLIP"],[4,6,0,3,1,"CONDITIONING"],[5,4,1,7,0,"CLIP"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[12,15,0,8,1,"VAE"],[16,8,0,20,0,"IMAGE"],[17,4,0,22,0,"MODEL"],[18,6,0,22,1,"CONDITIONING"],[19,7,0,22,2,"CONDITIONING"],[22,22,0,23,0,"LATENT"],[23,15,0,23,1,"VAE"],[24,23,0,9,0,"IMAGE"],[30,27,0,28,0,"UPSCALE_MODEL"],[32,30,0,29,0,"IMAGE"],[33,28,0,30,0,"IMAGE"],[36,8,0,28,1,"IMAGE"],[37,15,0,29,1,"VAE"],[38,29,0,22,3,"LATENT"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic SDXL + Refiner Workflow ", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_a-dC4aL0_1702943892767_raw.webp', - description:`This workflow adds a refiner model on topic of the basic SDXL workflow. - -The core of the composition is created by the base SDXL model and the refiner takes care of the minutiae. The refiner helps improve the quality of the generated image.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":46,"last_link_id":76,"nodes":[{"id":4,"type":"CheckpointLoaderSimple","pos":[30,50],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":0,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[53],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[49,50],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sdxl/sd_xl_base_1.0_0.9vae.safetensors"]},{"id":5,"type":"EmptyLatentImage","pos":[860,440],"size":{"0":220,"1":106},"flags":{},"order":1,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[54],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[1024,1024,1]},{"id":35,"type":"Note","pos":[464,-235],"size":[330.7162916580676,95.14419681769738],"flags":{},"order":2,"mode":0,"properties":{"text":""},"widgets_values":["Note that we send the same prompt to both TEXT_G and TEXT_L, you can experiment with different prompts but using the same seems to lead to more predictable results."],"color":"#432","bgcolor":"#653"},{"id":30,"type":"CLIPTextEncodeSDXL","pos":[860,-120],"size":{"0":220,"1":220},"flags":{},"order":14,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":49},{"name":"text_g","type":"STRING","link":45,"widget":{"name":"text_g"},"slot_index":1},{"name":"text_l","type":"STRING","link":46,"widget":{"name":"text_l"}}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[56],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncodeSDXL"},"widgets_values":[4096,4096,0,0,4096,4096,"a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k","a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"]},{"id":33,"type":"CLIPTextEncodeSDXL","pos":[860,160],"size":{"0":220,"1":220},"flags":{},"order":15,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":50},{"name":"text_g","type":"STRING","link":47,"widget":{"name":"text_g"},"slot_index":1},{"name":"text_l","type":"STRING","link":48,"widget":{"name":"text_l"}}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[55],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncodeSDXL"},"widgets_values":[4096,4096,0,0,4096,4096,"blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch","blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch"]},{"id":31,"type":"PrimitiveNode","pos":[460,-90],"size":[338.2407698942967,179.5812845208606],"flags":{},"order":3,"mode":0,"outputs":[{"name":"STRING","type":"STRING","links":[45,46,65],"widget":{"name":"text_g"},"slot_index":0}],"title":"positive","properties":{"Run widget replace on values":false},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":32,"type":"PrimitiveNode","pos":[460,180],"size":{"0":338.24078369140625,"1":179.58128356933594},"flags":{},"order":4,"mode":0,"outputs":[{"name":"STRING","type":"STRING","links":[47,48,66],"widget":{"name":"text_g"},"slot_index":0}],"title":"negative","properties":{"Run widget replace on values":false},"widgets_values":["blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":8,"type":"VAEDecode","pos":[2350,20],"size":{"0":140,"1":60},"flags":{},"order":20,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":69},{"name":"vae","type":"VAE","link":58}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[41],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":28,"type":"SaveImage","pos":[2560,20],"size":[688.1291672363286,728.7603461914064],"flags":{},"order":21,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":41}],"properties":{},"widgets_values":["ComfyUI"]},{"id":43,"type":"PrimitiveNode","pos":[867,596],"size":{"0":210,"1":82},"flags":{},"order":5,"mode":0,"outputs":[{"name":"INT","type":"INT","links":[73,74],"widget":{"name":"steps"},"slot_index":0}],"title":"total steps","properties":{"Run widget replace on values":false},"widgets_values":[30,"fixed"],"color":"#2a363b","bgcolor":"#3f5159"},{"id":37,"type":"VAELoader","pos":[1950,260],"size":{"0":315,"1":58},"flags":{},"order":6,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[58],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["sdxl_vae.safetensors"]},{"id":42,"type":"PrimitiveNode","pos":[868,730],"size":{"0":210,"1":82},"flags":{},"order":7,"mode":0,"outputs":[{"name":"INT","type":"INT","links":[75,76],"widget":{"name":"end_at_step"},"slot_index":0}],"title":"steps spent on base","properties":{"Run widget replace on values":false},"widgets_values":[25,"fixed"],"color":"#2a363b","bgcolor":"#3f5159"},{"id":40,"type":"CLIPTextEncodeSDXLRefiner","pos":[1652,-163],"size":[225.5510620117184,126],"flags":{},"order":16,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":63},{"name":"text","type":"STRING","link":65,"widget":{"name":"text"}}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[67],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncodeSDXLRefiner"},"widgets_values":[6,1024,1024,"a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"]},{"id":41,"type":"CLIPTextEncodeSDXLRefiner","pos":[1648,27],"size":[229.35106201171834,126],"flags":{},"order":17,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":64},{"name":"text","type":"STRING","link":66,"widget":{"name":"text"}}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[68],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncodeSDXLRefiner"},"widgets_values":[3,1024,1024,"blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch"]},{"id":39,"type":"CheckpointLoaderSimple","pos":[1239,-166],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":8,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[62],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[63,64],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sdxl/sd_xl_refiner_1.0.safetensors"]},{"id":36,"type":"KSamplerAdvanced","pos":[1204,32],"size":[315,334],"flags":{},"order":18,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":53},{"name":"positive","type":"CONDITIONING","link":56},{"name":"negative","type":"CONDITIONING","link":55},{"name":"latent_image","type":"LATENT","link":54},{"name":"steps","type":"INT","link":73,"widget":{"name":"steps"},"slot_index":5},{"name":"end_at_step","type":"INT","link":75,"widget":{"name":"end_at_step"}}],"outputs":[{"name":"LATENT","type":"LATENT","links":[59],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSamplerAdvanced"},"widgets_values":["enable",2,"fixed",30,6.5,"dpmpp_2m_sde","exponential",0,25,"enable"]},{"id":45,"type":"Note","pos":[610,442],"size":{"0":210,"1":477.3874816894531},"flags":{},"order":9,"mode":0,"properties":{"text":""},"widgets_values":["SUPPORTED RESOLUTIONS\\n=====================\\n\\nratio resolution\\n-----------------\\n0.5: 704×1408\\n0.52: 704×1344\\n0.57: 768×1344\\n0.6: 768×1280\\n0.68: 832×1216\\n0.72: 832×1152\\n0.78: 896×1152\\n0.82: 896×1088\\n0.88: 960×1088\\n0.94: 960×1024\\n1.0: 1024×1024\\n1.07: 1024×960\\n1.13: 1088×960\\n1.21: 1088×896\\n1.29: 1152×896\\n1.38: 1152×832\\n1.46: 1216×832\\n1.67: 1280×768\\n1.75: 1344×768\\n1.91: 1344×704\\n2.0: 1408×704\\n2.09: 1472×704\\n2.4: 1536×640\\n2.5: 1600×640\\n2.89: 1664×576\\n3.0: 1728×576"],"color":"#432","bgcolor":"#653"},{"id":11,"type":"Note","pos":[68,-179],"size":[292.628344016358,171.6285590695581],"flags":{},"order":10,"mode":0,"properties":{"text":""},"widgets_values":["BASIC SDXL WORKFLOW BASE+REFINER\\n================================\\n\\nThis workflow showcases the suggested way of using SDXL with BASE and REFINER models.\\n\\nThe core of the composition is created by the BASE and the REFINER takes care of the minutiae."],"color":"#432","bgcolor":"#653"},{"id":29,"type":"Note","pos":[1113,602],"size":[218.08512297100106,207.59243181905276],"flags":{},"order":11,"mode":0,"properties":{"text":""},"widgets_values":["We are using primitives here to sync the base and the refiner.\\n\\nTOTAL STEPS is the total number of steps, STEPS SPENT ON BASE is the number of steps spent on the BASE model, the remaining will be handled by the REFINER.\\n\\nOf course total steps must be > steps spent on base."],"color":"#432","bgcolor":"#653"},{"id":38,"type":"KSamplerAdvanced","pos":[1950,-140],"size":[315,334],"flags":{},"order":19,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":62},{"name":"positive","type":"CONDITIONING","link":67},{"name":"negative","type":"CONDITIONING","link":68},{"name":"latent_image","type":"LATENT","link":59},{"name":"steps","type":"INT","link":74,"widget":{"name":"steps"}},{"name":"start_at_step","type":"INT","link":76,"widget":{"name":"start_at_step"}}],"outputs":[{"name":"LATENT","type":"LATENT","links":[69],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSamplerAdvanced"},"widgets_values":["disable",503501541605374,"fixed",30,6.5,"dpmpp_2m_sde","karras",25,10000,"disable"]},{"id":46,"type":"Note","pos":[1574,221],"size":[331.40839613549724,180.21395530098778],"flags":{},"order":12,"mode":0,"properties":{"text":""},"widgets_values":["ADVANCED KSAMPLER\\n=================\\n\\nNote that the first ksampler (base) has RETURN_WITH_LEFTOVER_NOISE enabled and the second (refiner) had ADD_NOISE disabled.\\n\\nThe first ksampler stops the generation at 25 steps and it's taken back from the refiner that generates the last 5 steps."],"color":"#432","bgcolor":"#653"},{"id":34,"type":"Note","pos":[870,-300],"size":[210,130],"flags":{},"order":13,"mode":0,"properties":{"text":""},"widgets_values":["WIDTH/HEIGHT and TARGET_WIDTH/HEIGHT are both 4 times the latent size.\\n\\nThis generally grants a higher definition image."],"color":"#432","bgcolor":"#653"}],"links":[[41,8,0,28,0,"IMAGE"],[45,31,0,30,1,"STRING"],[46,31,0,30,2,"STRING"],[47,32,0,33,1,"STRING"],[48,32,0,33,2,"STRING"],[49,4,1,30,0,"CLIP"],[50,4,1,33,0,"CLIP"],[53,4,0,36,0,"MODEL"],[54,5,0,36,3,"LATENT"],[55,33,0,36,2,"CONDITIONING"],[56,30,0,36,1,"CONDITIONING"],[58,37,0,8,1,"VAE"],[59,36,0,38,3,"LATENT"],[62,39,0,38,0,"MODEL"],[63,39,1,40,0,"CLIP"],[64,39,1,41,0,"CLIP"],[65,31,0,40,1,"STRING"],[66,32,0,41,1,"STRING"],[67,40,0,38,1,"CONDITIONING"],[68,41,0,38,2,"CONDITIONING"],[69,38,0,8,0,"LATENT"],[73,43,0,36,4,"INT"],[74,43,0,38,4,"INT"],[75,42,0,36,5,"INT"],[76,42,0,38,5,"INT"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic SDXL Workflow", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_3jwAAwSV_1702934538301_raw.webp', - description:`This basic workflow runs the base SDXL model with some optimization for SDXL. This can be useful for systems with limited resources as the refiner takes another 6GB or ram.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":35,"last_link_id":52,"nodes":[{"id":4,"type":"CheckpointLoaderSimple","pos":[30,50],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":0,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[20],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[49,50],"slot_index":1},{"name":"VAE","type":"VAE","links":[43],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sdxl/sd_xl_base_1.0_0.9vae.safetensors"]},{"id":33,"type":"CLIPTextEncodeSDXL","pos":[860,160],"size":{"0":220,"1":220},"flags":{},"order":8,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":50},{"name":"text_g","type":"STRING","link":47,"widget":{"name":"text_g"},"slot_index":1},{"name":"text_l","type":"STRING","link":48,"widget":{"name":"text_l"}}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[51],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncodeSDXL"},"widgets_values":[4096,4096,0,0,4096,4096,"blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch","blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch"]},{"id":30,"type":"CLIPTextEncodeSDXL","pos":[860,-120],"size":{"0":220,"1":220},"flags":{},"order":9,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":49},{"name":"text_g","type":"STRING","link":45,"widget":{"name":"text_g"},"slot_index":1},{"name":"text_l","type":"STRING","link":46,"widget":{"name":"text_l"}}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[52],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncodeSDXL"},"widgets_values":[4096,4096,0,0,4096,4096,"a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k","a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"]},{"id":3,"type":"KSampler","pos":[1190,30],"size":{"0":300,"1":262},"flags":{},"order":10,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":20},{"name":"positive","type":"CONDITIONING","link":52},{"name":"negative","type":"CONDITIONING","link":51},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[42],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[2,"fixed",25,6.5,"dpmpp_2m_sde","exponential",1]},{"id":5,"type":"EmptyLatentImage","pos":[860,440],"size":{"0":220,"1":106},"flags":{},"order":1,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[1024,1024,1]},{"id":11,"type":"Note","pos":[80,-200],"size":[282.48542674442217,197.05842985845334],"flags":{},"order":2,"mode":0,"properties":{"text":""},"widgets_values":["BASIC SDXL WORKFLOW WITH BASE MODEL ONLY\\n========================================\\n\\nThis basic workflow only uses the BASE SDXL model. This can be useful for systems with limited resources as the REFINER takes another 6GB or ram.\\n\\nIf you use the embedded VAE be sure to download the \\"0.9vae\\" version because the 1.0 vae is considered defective."],"color":"#432","bgcolor":"#653"},{"id":29,"type":"Note","pos":[620,440],"size":[210,477.3874840224082],"flags":{},"order":3,"mode":0,"properties":{"text":""},"widgets_values":["SUPPORTED RESOLUTIONS\\n=====================\\n\\nratio resolution\\n-----------------\\n0.5: 704×1408\\n0.52: 704×1344\\n0.57: 768×1344\\n0.6: 768×1280\\n0.68: 832×1216\\n0.72: 832×1152\\n0.78: 896×1152\\n0.82: 896×1088\\n0.88: 960×1088\\n0.94: 960×1024\\n1.0: 1024×1024\\n1.07: 1024×960\\n1.13: 1088×960\\n1.21: 1088×896\\n1.29: 1152×896\\n1.38: 1152×832\\n1.46: 1216×832\\n1.67: 1280×768\\n1.75: 1344×768\\n1.91: 1344×704\\n2.0: 1408×704\\n2.09: 1472×704\\n2.4: 1536×640\\n2.5: 1600×640\\n2.89: 1664×576\\n3.0: 1728×576"],"color":"#432","bgcolor":"#653"},{"id":8,"type":"VAEDecode","pos":[1540,40],"size":{"0":140,"1":60},"flags":{},"order":11,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":42},{"name":"vae","type":"VAE","link":43}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[41],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":28,"type":"SaveImage","pos":[1730,50],"size":[688.1291672363286,728.7603461914064],"flags":{},"order":12,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":41}],"properties":{},"widgets_values":["ComfyUI"]},{"id":32,"type":"PrimitiveNode","pos":[460,180],"size":{"0":338.24078369140625,"1":179.58128356933594},"flags":{},"order":4,"mode":0,"outputs":[{"name":"STRING","type":"STRING","links":[47,48],"widget":{"name":"text_g"},"slot_index":0}],"title":"negative","properties":{"Run widget replace on values":false},"widgets_values":["blurry, animation, 3d render, illustration, toy, puppet, claymation, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":34,"type":"Note","pos":[870,-300],"size":[210,130],"flags":{},"order":5,"mode":0,"properties":{"text":""},"widgets_values":["WIDTH/HEIGHT and TARGET_WIDTH/HEIGHT are both 4 times the latent size.\\n\\nThis generally grants a higher definition image."],"color":"#432","bgcolor":"#653"},{"id":31,"type":"PrimitiveNode","pos":[460,-90],"size":[338.2407698942967,179.5812845208606],"flags":{},"order":6,"mode":0,"outputs":[{"name":"STRING","type":"STRING","links":[45,46],"widget":{"name":"text_g"},"slot_index":0}],"title":"positive","properties":{"Run widget replace on values":false},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":35,"type":"Note","pos":[464,-235],"size":[330.7162916580676,95.14419681769738],"flags":{},"order":7,"mode":0,"properties":{"text":""},"widgets_values":["Note that we send the same prompt to both TEXT_G and TEXT_L, you can experiment with different prompts but using the same seems to lead to more predictable results."],"color":"#432","bgcolor":"#653"}],"links":[[2,5,0,3,3,"LATENT"],[20,4,0,3,0,"MODEL"],[41,8,0,28,0,"IMAGE"],[42,3,0,8,0,"LATENT"],[43,4,2,8,1,"VAE"],[45,31,0,30,1,"STRING"],[46,31,0,30,2,"STRING"],[47,32,0,33,1,"STRING"],[48,32,0,33,2,"STRING"],[49,4,1,30,0,"CLIP"],[50,4,1,33,0,"CLIP"],[51,33,0,3,2,"CONDITIONING"],[52,30,0,3,1,"CONDITIONING"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic Second-Pass Workflow", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_jRx2H_U5_1702943992821_raw.jpg', - description:`This workflow applies a second pass of KSampler on top of this basic SD 1.5 workflow with an external VAE . Even at the same resolution (ie: without upscaling), the second pass can increase definition and fix small mistakes.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":28,"last_link_id":41,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[450,270],"size":{"0":370,"1":160},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":24}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6,34],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":4,"type":"CheckpointLoaderSimple","pos":[30,150],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":0,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[20,32],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[23,24],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]},{"id":5,"type":"EmptyLatentImage","pos":[600,490],"size":{"0":220,"1":106},"flags":{},"order":1,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":3,"type":"KSampler","pos":[900,190],"size":{"0":300,"1":262},"flags":{},"order":6,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":20},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[36,38],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":15,"type":"VAELoader","pos":[880,510],"size":{"0":315,"1":58},"flags":{},"order":2,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12,39],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":26,"type":"VAEDecode","pos":[1312,532],"size":{"0":140,"1":60},"flags":{},"order":8,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":38},{"name":"vae","type":"VAE","link":39}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[40],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":8,"type":"VAEDecode","pos":[1650,200],"size":{"0":140,"1":60},"flags":{},"order":9,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":37},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[41],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":27,"type":"PreviewImage","pos":[1515,525],"size":[588.3998002929688,602.6846180419923],"flags":{},"order":10,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":40}],"properties":{"Node name for S&R":"PreviewImage"}},{"id":28,"type":"SaveImage","pos":[2134,512],"size":[567.277800292969,611.7056180419925],"flags":{},"order":11,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":41}],"properties":{},"widgets_values":["ComfyUI"]},{"id":25,"type":"KSampler","pos":[1270,130],"size":{"0":300,"1":262},"flags":{},"order":7,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":32},{"name":"positive","type":"CONDITIONING","link":33},{"name":"negative","type":"CONDITIONING","link":34},{"name":"latent_image","type":"LATENT","link":36}],"outputs":[{"name":"LATENT","type":"LATENT","links":[37],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[1001,"fixed",20,6,"dpmpp_2m","karras",0.45]},{"id":6,"type":"CLIPTextEncode","pos":[450,50],"size":{"0":370,"1":160},"flags":{},"order":4,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":23}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4,33],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic raccoon wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":11,"type":"Note","pos":[1276,-105],"size":[290.6730059814454,181.583876953125],"flags":{},"order":3,"mode":0,"properties":{"text":""},"widgets_values":["SIMPLE SECOND PASS\\n==================\\n\\nApplying a second pass even at the same resolution (ie: without upscaling) can increase definition and fix small mistakes.\\n\\nIncreasing the DENOISE adds more details but also changes the original reference more (the first pass)."],"color":"#432","bgcolor":"#653"}],"links":[[2,5,0,3,3,"LATENT"],[4,6,0,3,1,"CONDITIONING"],[6,7,0,3,2,"CONDITIONING"],[12,15,0,8,1,"VAE"],[20,4,0,3,0,"MODEL"],[23,4,1,6,0,"CLIP"],[24,4,1,7,0,"CLIP"],[32,4,0,25,0,"MODEL"],[33,6,0,25,1,"CONDITIONING"],[34,7,0,25,2,"CONDITIONING"],[36,3,0,25,3,"LATENT"],[37,25,0,8,0,"LATENT"],[38,3,0,26,0,"LATENT"],[39,15,0,26,1,"VAE"],[40,26,0,27,0,"IMAGE"],[41,8,0,28,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Batch Generation Workflow", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_qmd3m0_k_1702943062775_raw.jpg', - description:`This workflow can batch generate images instead of one at at time, by using the Latent From Batch node. It helps get more results at a time.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":24,"last_link_id":30,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[450,270],"size":{"0":370,"1":160},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":24}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":5,"type":"EmptyLatentImage","pos":[600,490],"size":{"0":220,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,4]},{"id":4,"type":"CheckpointLoaderSimple","pos":[30,150],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":1,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[20],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[23,24],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]},{"id":3,"type":"KSampler","pos":[900,190],"size":{"0":300,"1":262},"flags":{},"order":6,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":20},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[7,25],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":15,"type":"VAELoader","pos":[880,510],"size":{"0":315,"1":58},"flags":{},"order":2,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12,27],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":8,"type":"VAEDecode","pos":[1250,190],"size":{"0":140,"1":60},"flags":{},"order":7,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":7},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[29],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":20,"type":"VAEDecode","pos":[1580,750],"size":{"0":140,"1":60},"flags":{},"order":10,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":26},{"name":"vae","type":"VAE","link":27}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[30],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":22,"type":"PreviewImage","pos":[1450,200],"size":[436.18048242187524,454.7486420898439],"flags":{},"order":9,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":29}],"properties":{"Node name for S&R":"PreviewImage"}},{"id":23,"type":"SaveImage","pos":[1770,750],"size":[427.6204824218753,479.064642089844],"flags":{},"order":11,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":30}],"properties":{},"widgets_values":["ComfyUI"]},{"id":6,"type":"CLIPTextEncode","pos":[450,50],"size":{"0":370,"1":160},"flags":{},"order":4,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":23}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":19,"type":"LatentFromBatch","pos":[1310,750],"size":[210,82],"flags":{},"order":8,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":25}],"outputs":[{"name":"LATENT","type":"LATENT","links":[26],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"LatentFromBatch"},"widgets_values":[3,1]},{"id":11,"type":"Note","pos":[610,650],"size":[220,230],"flags":{},"order":3,"mode":0,"properties":{"text":""},"widgets_values":["LATENT BATCH\\n============\\n\\nIncrease the batch size to get more result.\\n\\nYou can extract one (or more) of the results with the \\"Latent From Batch\\" node."],"color":"#432","bgcolor":"#653"}],"links":[[2,5,0,3,3,"LATENT"],[4,6,0,3,1,"CONDITIONING"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[12,15,0,8,1,"VAE"],[20,4,0,3,0,"MODEL"],[23,4,1,6,0,"CLIP"],[24,4,1,7,0,"CLIP"],[25,3,0,19,0,"LATENT"],[26,19,0,20,0,"LATENT"],[27,15,0,20,1,"VAE"],[29,8,0,22,0,"IMAGE"],[30,20,0,23,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic LoRA Workflow", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/webp_v5L3bGqX_1702941891063_raw.webp', - description:`This workflow loads an additional LoRA on top of the base model.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":17,"last_link_id":17,"nodes":[{"id":7,"type":"CLIPTextEncode","pos":[820,400],"size":{"0":370,"1":160},"flags":{},"order":6,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":16}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[6],"slot_index":0}],"title":"CLIP Text Encode (Negative)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, illustration, toy, clay, low quality, flag, nasa, mission patch"],"color":"#322","bgcolor":"#533"},{"id":6,"type":"CLIPTextEncode","pos":[820,180],"size":{"0":370,"1":160},"flags":{},"order":5,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":15}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[4],"slot_index":0}],"title":"CLIP Text Encode (Positive)","properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["a photo of an anthropomorphic fox wearing a spacesuit inside a sci-fi spaceship\\n\\ncinematic, dramatic lighting, high resolution, detailed, 4k"],"color":"#232","bgcolor":"#353"},{"id":8,"type":"VAEDecode","pos":[1620,320],"size":{"0":140,"1":60},"flags":{},"order":8,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":7},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[9],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":9,"type":"SaveImage","pos":[1810,320],"size":{"0":410,"1":460},"flags":{},"order":9,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":9}],"properties":{},"widgets_values":["Result"]},{"id":5,"type":"EmptyLatentImage","pos":[970,620],"size":{"0":220,"1":106},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":15,"type":"VAELoader","pos":[1250,640],"size":{"0":315,"1":58},"flags":{},"order":1,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":3,"type":"KSampler","pos":[1270,320],"size":{"0":300,"1":262},"flags":{},"order":7,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":17},{"name":"positive","type":"CONDITIONING","link":4},{"name":"negative","type":"CONDITIONING","link":6},{"name":"latent_image","type":"LATENT","link":2}],"outputs":[{"name":"LATENT","type":"LATENT","links":[7],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[8,"fixed",25,6.5,"dpmpp_2m","karras",1]},{"id":4,"type":"CheckpointLoaderSimple","pos":[20,280],"size":{"0":328.5366516113281,"1":98},"flags":{},"order":2,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[13],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[14],"slot_index":1},{"name":"VAE","type":"VAE","links":[],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]},{"id":17,"type":"LoraLoader","pos":[420,280],"size":{"0":315,"1":126},"flags":{},"order":4,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":13},{"name":"clip","type":"CLIP","link":14}],"outputs":[{"name":"MODEL","type":"MODEL","links":[17],"shape":3,"slot_index":0},{"name":"CLIP","type":"CLIP","links":[15,16],"shape":3,"slot_index":1}],"properties":{"Node name for S&R":"LoraLoader"},"widgets_values":["more_details.safetensors",1,1]},{"id":11,"type":"Note","pos":[420,-10],"size":[260,230],"flags":{},"order":3,"mode":0,"properties":{"text":""},"widgets_values":["LORA\\n====\\n\\nSTRENGTH_MODEL and STRENGTH_CLIP are supposed to have the same value, but you can play with the values to get different results.\\n\\nThe CLIP is responsible of translating the prompts. The MODEL is the actual trained data.\\n\\n** LORAs can be daisy-chained! You can have as many as you want **"],"color":"#432","bgcolor":"#653"}],"links":[[2,5,0,3,3,"LATENT"],[4,6,0,3,1,"CONDITIONING"],[6,7,0,3,2,"CONDITIONING"],[7,3,0,8,0,"LATENT"],[9,8,0,9,0,"IMAGE"],[12,15,0,8,1,"VAE"],[13,4,0,17,0,"MODEL"],[14,4,1,17,1,"CLIP"],[15,17,1,6,0,"CLIP"],[16,17,1,7,0,"CLIP"],[17,17,0,3,0,"MODEL"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, - { - title:"Basic IPAdapter", - type:'template', - thumbnail:'https://cdn.openart.ai/workflow_thumbnails/4pYEgRw3JXVFu5elJKeR/image_KdBztP1T_1702945457521_512.webp', - description:`This workflows is a very simple workflow to use IPAdapter IP-Adapter is an effective and lightweight adapter to achieve image prompt capability for stable diffusion models.`, - categories:[categories[1]], - initialWorkflow:`{"last_node_id":14,"last_link_id":13,"nodes":[{"id":10,"type":"EmptyLatentImage","pos":[650,590],"size":{"0":210,"1":110},"flags":{},"order":0,"mode":0,"outputs":[{"name":"LATENT","type":"LATENT","links":[10],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"EmptyLatentImage"},"widgets_values":[512,512,1]},{"id":8,"type":"CLIPTextEncode","pos":[650,420],"size":{"0":210,"1":120},"flags":{},"order":8,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":6}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[9],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["blurry, horror"],"color":"#322","bgcolor":"#533"},{"id":7,"type":"CLIPTextEncode","pos":[650,250],"size":{"0":210,"1":120},"flags":{},"order":7,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":5}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[8],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["beautiful renaissance girl, detailed"],"color":"#232","bgcolor":"#353"},{"id":11,"type":"VAEDecode","pos":[1300,170],"size":{"0":140,"1":50},"flags":{},"order":11,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":11},{"name":"vae","type":"VAE","link":12}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[13],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":2,"type":"VAELoader","pos":[940,480],"size":{"0":300,"1":60},"flags":{},"order":1,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[12],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["vae-ft-mse-840000-ema-pruned.safetensors"]},{"id":12,"type":"SaveImage","pos":[1300,270],"size":{"0":400,"1":450},"flags":{},"order":12,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":13}],"properties":{},"widgets_values":["IPAdapter"]},{"id":6,"type":"LoadImage","pos":[40,60],"size":{"0":220,"1":320},"flags":{},"order":2,"mode":0,"outputs":[{"name":"IMAGE","type":"IMAGE","links":[3],"shape":3,"slot_index":0},{"name":"MASK","type":"MASK","links":null,"shape":3}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["venere.jpg","image"]},{"id":9,"type":"KSampler","pos":[930,170],"size":{"0":315,"1":262},"flags":{},"order":10,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":7},{"name":"positive","type":"CONDITIONING","link":8},{"name":"negative","type":"CONDITIONING","link":9},{"name":"latent_image","type":"LATENT","link":10}],"outputs":[{"name":"LATENT","type":"LATENT","links":[11],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[0,"fixed",25,6,"ddim","ddim_uniform",1]},{"id":4,"type":"CLIPVisionLoader","pos":[290,170],"size":{"0":300,"1":60},"flags":{},"order":3,"mode":0,"outputs":[{"name":"CLIP_VISION","type":"CLIP_VISION","links":[2],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"CLIPVisionLoader"},"widgets_values":["IPAdapter_image_encoder_sd15.safetensors"]},{"id":1,"type":"CheckpointLoaderSimple","pos":[290,280],"size":{"0":300,"1":100},"flags":{},"order":4,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[4],"shape":3,"slot_index":0},{"name":"CLIP","type":"CLIP","links":[5,6],"shape":3,"slot_index":1},{"name":"VAE","type":"VAE","links":null,"shape":3}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["sd15/dreamshaper_8.safetensors"]},{"id":5,"type":"IPAdapterApply","pos":[651,-57],"size":{"0":210,"1":258},"flags":{},"order":9,"mode":0,"inputs":[{"name":"ipadapter","type":"IPADAPTER","link":1},{"name":"clip_vision","type":"CLIP_VISION","link":2},{"name":"image","type":"IMAGE","link":3},{"name":"model","type":"MODEL","link":4},{"name":"attn_mask","type":"MASK","link":null}],"outputs":[{"name":"MODEL","type":"MODEL","links":[7],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"IPAdapterApply"},"widgets_values":[0.85,0,"original",0,1,false]},{"id":3,"type":"IPAdapterModelLoader","pos":[290,60],"size":{"0":300,"1":60},"flags":{},"order":5,"mode":0,"outputs":[{"name":"IPADAPTER","type":"IPADAPTER","links":[1],"shape":3,"slot_index":0}],"properties":{"Node name for S&R":"IPAdapterModelLoader"},"widgets_values":["ip-adapter_sd15.safetensors"]},{"id":13,"type":"Note","pos":[131,-270],"size":[456.8177419906998,273.55983091565],"flags":{},"order":6,"mode":0,"properties":{"text":""},"widgets_values":["BASIC IPADAPTER\\n===============\\n\\nBe careful when selecting the models!\\n\\nThe IPAdapter model has to match the CLIP vision encoder and of course the main checkpoint.\\n\\nAll SD15 models and all models ending with \\"vit-h\\" use the SD15 CLIP vision.\\n\\nOne of the SDXL models and all models ending with \\"vit-g\\" use the SDXL CLIP vision.\\n\\nPLUS models use more tokens and are stronger. LIGHT models have a very light impact. FACE and FULL-FACE are only to describe faces (they are not face swap!)"],"color":"#432","bgcolor":"#653"}],"links":[[1,3,0,5,0,"IPADAPTER"],[2,4,0,5,1,"CLIP_VISION"],[3,6,0,5,2,"IMAGE"],[4,1,0,5,3,"MODEL"],[5,1,1,7,0,"CLIP"],[6,1,1,8,0,"CLIP"],[7,5,0,9,0,"MODEL"],[8,7,0,9,1,"CONDITIONING"],[9,8,0,9,2,"CONDITIONING"],[10,10,0,9,3,"LATENT"],[11,9,0,11,0,"LATENT"],[12,2,0,11,1,"VAE"],[13,11,0,12,0,"IMAGE"]],"groups":[],"config":{},"extra":{},"version":0.4}` - }, + })) ] diff --git a/javascript/out.js b/javascript/out.js index 8e8f26d..32b2a06 100644 --- a/javascript/out.js +++ b/javascript/out.js @@ -27473,43 +27473,317 @@ var _t = Object.assign(Ve, { Backdrop: qe, Panel: ze, Overlay: Qe, Title: Ze, Description: b2 }); // src/LearnDialog.jsx - var import_react25 = __toESM(require_react()); + var import_react28 = __toESM(require_react()); // src/logo.png var logo_default = "data:image/png;base64,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"; // src/LearnDialog.jsx var import_react_draggable = __toESM(require_cjs()); + + // node_modules/react-feather/dist/icons/external-link.js + var import_react25 = __toESM(require_react()); + var import_prop_types = __toESM(require_prop_types()); + function _extends() { + _extends = Object.assign || function(target) { + for (var i5 = 1; i5 < arguments.length; i5++) { + var source = arguments[i5]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _objectWithoutProperties(source, excluded) { + if (source == null) + return {}; + var target = _objectWithoutPropertiesLoose(source, excluded); + var key, i5; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i5 = 0; i5 < sourceSymbolKeys.length; i5++) { + key = sourceSymbolKeys[i5]; + if (excluded.indexOf(key) >= 0) + continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) + continue; + target[key] = source[key]; + } + } + return target; + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i5; + for (i5 = 0; i5 < sourceKeys.length; i5++) { + key = sourceKeys[i5]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; + } + var ExternalLink = (0, import_react25.forwardRef)(function(_ref, ref) { + var _ref$color = _ref.color, color = _ref$color === void 0 ? "currentColor" : _ref$color, _ref$size = _ref.size, size = _ref$size === void 0 ? 24 : _ref$size, rest = _objectWithoutProperties(_ref, ["color", "size"]); + return /* @__PURE__ */ import_react25.default.createElement("svg", _extends({ + ref, + xmlns: "http://www.w3.org/2000/svg", + width: size, + height: size, + viewBox: "0 0 24 24", + fill: "none", + stroke: color, + strokeWidth: "2", + strokeLinecap: "round", + strokeLinejoin: "round" + }, rest), /* @__PURE__ */ import_react25.default.createElement("path", { + d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" + }), /* @__PURE__ */ import_react25.default.createElement("polyline", { + points: "15 3 21 3 21 9" + }), /* @__PURE__ */ import_react25.default.createElement("line", { + x1: "10", + y1: "14", + x2: "21", + y2: "3" + })); + }); + ExternalLink.propTypes = { + color: import_prop_types.default.string, + size: import_prop_types.default.oneOfType([import_prop_types.default.string, import_prop_types.default.number]) + }; + ExternalLink.displayName = "ExternalLink"; + var external_link_default = ExternalLink; + + // node_modules/react-feather/dist/icons/loader.js + var import_react26 = __toESM(require_react()); + var import_prop_types2 = __toESM(require_prop_types()); + function _extends2() { + _extends2 = Object.assign || function(target) { + for (var i5 = 1; i5 < arguments.length; i5++) { + var source = arguments[i5]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends2.apply(this, arguments); + } + function _objectWithoutProperties2(source, excluded) { + if (source == null) + return {}; + var target = _objectWithoutPropertiesLoose2(source, excluded); + var key, i5; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i5 = 0; i5 < sourceSymbolKeys.length; i5++) { + key = sourceSymbolKeys[i5]; + if (excluded.indexOf(key) >= 0) + continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) + continue; + target[key] = source[key]; + } + } + return target; + } + function _objectWithoutPropertiesLoose2(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i5; + for (i5 = 0; i5 < sourceKeys.length; i5++) { + key = sourceKeys[i5]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; + } + var Loader = (0, import_react26.forwardRef)(function(_ref, ref) { + var _ref$color = _ref.color, color = _ref$color === void 0 ? "currentColor" : _ref$color, _ref$size = _ref.size, size = _ref$size === void 0 ? 24 : _ref$size, rest = _objectWithoutProperties2(_ref, ["color", "size"]); + return /* @__PURE__ */ import_react26.default.createElement("svg", _extends2({ + ref, + xmlns: "http://www.w3.org/2000/svg", + width: size, + height: size, + viewBox: "0 0 24 24", + fill: "none", + stroke: color, + strokeWidth: "2", + strokeLinecap: "round", + strokeLinejoin: "round" + }, rest), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "12", + y1: "2", + x2: "12", + y2: "6" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "12", + y1: "18", + x2: "12", + y2: "22" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "4.93", + y1: "4.93", + x2: "7.76", + y2: "7.76" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "16.24", + y1: "16.24", + x2: "19.07", + y2: "19.07" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "2", + y1: "12", + x2: "6", + y2: "12" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "18", + y1: "12", + x2: "22", + y2: "12" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "4.93", + y1: "19.07", + x2: "7.76", + y2: "16.24" + }), /* @__PURE__ */ import_react26.default.createElement("line", { + x1: "16.24", + y1: "7.76", + x2: "19.07", + y2: "4.93" + })); + }); + Loader.propTypes = { + color: import_prop_types2.default.string, + size: import_prop_types2.default.oneOfType([import_prop_types2.default.string, import_prop_types2.default.number]) + }; + Loader.displayName = "Loader"; + var loader_default = Loader; + + // node_modules/react-feather/dist/icons/search.js + var import_react27 = __toESM(require_react()); + var import_prop_types3 = __toESM(require_prop_types()); + function _extends3() { + _extends3 = Object.assign || function(target) { + for (var i5 = 1; i5 < arguments.length; i5++) { + var source = arguments[i5]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends3.apply(this, arguments); + } + function _objectWithoutProperties3(source, excluded) { + if (source == null) + return {}; + var target = _objectWithoutPropertiesLoose3(source, excluded); + var key, i5; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i5 = 0; i5 < sourceSymbolKeys.length; i5++) { + key = sourceSymbolKeys[i5]; + if (excluded.indexOf(key) >= 0) + continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) + continue; + target[key] = source[key]; + } + } + return target; + } + function _objectWithoutPropertiesLoose3(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i5; + for (i5 = 0; i5 < sourceKeys.length; i5++) { + key = sourceKeys[i5]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; + } + var Search = (0, import_react27.forwardRef)(function(_ref, ref) { + var _ref$color = _ref.color, color = _ref$color === void 0 ? "currentColor" : _ref$color, _ref$size = _ref.size, size = _ref$size === void 0 ? 24 : _ref$size, rest = _objectWithoutProperties3(_ref, ["color", "size"]); + return /* @__PURE__ */ import_react27.default.createElement("svg", _extends3({ + ref, + xmlns: "http://www.w3.org/2000/svg", + width: size, + height: size, + viewBox: "0 0 24 24", + fill: "none", + stroke: color, + strokeWidth: "2", + strokeLinecap: "round", + strokeLinejoin: "round" + }, rest), /* @__PURE__ */ import_react27.default.createElement("circle", { + cx: "11", + cy: "11", + r: "8" + }), /* @__PURE__ */ import_react27.default.createElement("line", { + x1: "21", + y1: "21", + x2: "16.65", + y2: "16.65" + })); + }); + Search.propTypes = { + color: import_prop_types3.default.string, + size: import_prop_types3.default.oneOfType([import_prop_types3.default.string, import_prop_types3.default.number]) + }; + Search.displayName = "Search"; + var search_default = Search; + + // src/LearnDialog.jsx function LearnDialog({ close, startVideo }) { - const [selectedCategory, setSelectedCategory] = (0, import_react25.useState)(window.data.categories[0]); - return /* @__PURE__ */ import_react25.default.createElement(import_react_draggable.default, null, /* @__PURE__ */ import_react25.default.createElement("div", { className: "fixed inset-0 flex w-screen items-center justify-center p-2" }, /* @__PURE__ */ import_react25.default.createElement(_t.Panel, { className: "w-full max-w-4xl rounded-xl bg-comfy-light px-4 relative" }, /* @__PURE__ */ import_react25.default.createElement( + const [selectedCategory, setSelectedCategory] = (0, import_react28.useState)(window.data.categories[0]); + const [loading, setLoading] = (0, import_react28.useState)(false); + return /* @__PURE__ */ import_react28.default.createElement(import_react_draggable.default, null, /* @__PURE__ */ import_react28.default.createElement("div", { className: "fixed inset-0 flex w-screen items-center justify-center p-2" }, /* @__PURE__ */ import_react28.default.createElement(_t.Panel, { className: "w-full max-w-4xl rounded-xl bg-comfy-light px-4 relative" }, /* @__PURE__ */ import_react28.default.createElement( "span", { className: "font-semibold absolute top-0 left-0 m-4 cursor-pointer", onClick: close }, "X" - ), /* @__PURE__ */ import_react25.default.createElement( + ), /* @__PURE__ */ import_react28.default.createElement( "a", { className: "text-lg p-2 rounded no-underline absolute top-0 right-0 m-4 text-white", href: "https://github.com/OpenArt-AI/ComfyUI-Assistant/issues/new" }, "Send Feedback" - ), /* @__PURE__ */ import_react25.default.createElement(_t.Title, { className: "flex flex-row justify-center" }, "Comfy Assistant ", /* @__PURE__ */ import_react25.default.createElement( + ), /* @__PURE__ */ import_react28.default.createElement(_t.Title, { className: "flex flex-row justify-center" }, "Comfy Assistant ", /* @__PURE__ */ import_react28.default.createElement( "span", { className: "px-2 text-xs" }, "by ", - /* @__PURE__ */ import_react25.default.createElement( + /* @__PURE__ */ import_react28.default.createElement( "a", { href: "https://openart.ai" }, - /* @__PURE__ */ import_react25.default.createElement("img", { src: logo_default, className: "w-14 px-1" }) + /* @__PURE__ */ import_react28.default.createElement("img", { src: logo_default, className: "w-14 px-1" }) ) - )), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-row justify-around underline space-x-2 p-2" }, window.data.categories.map((cat) => /* @__PURE__ */ import_react25.default.createElement( + )), loading ? /* @__PURE__ */ import_react28.default.createElement("div", { className: "w-full flex flex-row justify-center" }, /* @__PURE__ */ import_react28.default.createElement(loader_default, { height: 420, width: 420, className: "text-white animate-spin" })) : /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-row justify-around underline space-x-2 p-2" }, window.data.categories.map((cat) => /* @__PURE__ */ import_react28.default.createElement( "a", { key: cat, @@ -27519,7 +27793,7 @@ } }, cat - ))), /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col max-h-96 overflow-y-auto space-y-2 p-2 " }, window.data.modules.filter((module) => module.categories.includes(selectedCategory)).map((module) => /* @__PURE__ */ import_react25.default.createElement( + ))), /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col max-h-96 overflow-y-auto space-y-2 p-2 " }, window.data.modules.filter((module) => module.categories.includes(selectedCategory)).map((module) => /* @__PURE__ */ import_react28.default.createElement( "div", { key: module.title, @@ -27527,6 +27801,25 @@ onClick: (e4) => { if (module.initialWorkflow) { app.loadGraphData(JSON.parse(module.initialWorkflow)); + close(); + } else if (module.type === "template") { + setLoading(true); + fetch( + "https://openart.ai/api/public/workflows/download", + { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + workflow_id: module.id + }) + } + ).then((res) => res.json()).then((res) => { + console.log("res", res); + app.loadGraphData(JSON.parse(res.payload)); + close(); + }); } if (module.type === "lesson") { const keyframesFunctions = {}; @@ -27537,12 +27830,10 @@ } } startVideo({ title: module.title, videoId: module.videoId, keyframesFunctions }); - } else { - close(); } } }, - /* @__PURE__ */ import_react25.default.createElement( + /* @__PURE__ */ import_react28.default.createElement( "img", { width: 96, @@ -27551,17 +27842,23 @@ src: module.thumbnail ? module.thumbnail : `https://img.youtube.com/vi/${module.videoId}/default.jpg` } ), - /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react25.default.createElement("span", { className: "font-semibold text-2xl py-2" }, module.title), /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-sm text-gray-300" }, module.description), /* @__PURE__ */ import_react25.default.createElement("hr", null)) + /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react28.default.createElement("span", { className: "font-semibold text-2xl py-2" }, module.title), /* @__PURE__ */ import_react28.default.createElement( + "div", + { + className: "text-sm text-gray-300", + dangerouslySetInnerHTML: { __html: module.description } + } + ), /* @__PURE__ */ import_react28.default.createElement("hr", null)) ))))))); } var LearnDialog_default = LearnDialog; // src/YoutubePlayer.jsx - var import_react28 = __toESM(require_react()); + var import_react31 = __toESM(require_react()); // node_modules/react-youtube/dist/YouTube.esm.js - var import_prop_types = __toESM(require_prop_types()); - var import_react27 = __toESM(require_react()); + var import_prop_types4 = __toESM(require_prop_types()); + var import_react30 = __toESM(require_react()); var import_fast_deep_equal = __toESM(require_fast_deep_equal()); var import_youtube_player = __toESM(require_dist()); var __defProp2 = Object.defineProperty; @@ -27657,24 +27954,24 @@ } }; var propTypes = { - videoId: import_prop_types.default.string, - id: import_prop_types.default.string, - className: import_prop_types.default.string, - iframeClassName: import_prop_types.default.string, - style: import_prop_types.default.object, - title: import_prop_types.default.string, - loading: import_prop_types.default.oneOf(["lazy", "eager"]), - opts: import_prop_types.default.objectOf(import_prop_types.default.any), - onReady: import_prop_types.default.func, - onError: import_prop_types.default.func, - onPlay: import_prop_types.default.func, - onPause: import_prop_types.default.func, - onEnd: import_prop_types.default.func, - onStateChange: import_prop_types.default.func, - onPlaybackRateChange: import_prop_types.default.func, - onPlaybackQualityChange: import_prop_types.default.func + videoId: import_prop_types4.default.string, + id: import_prop_types4.default.string, + className: import_prop_types4.default.string, + iframeClassName: import_prop_types4.default.string, + style: import_prop_types4.default.object, + title: import_prop_types4.default.string, + loading: import_prop_types4.default.oneOf(["lazy", "eager"]), + opts: import_prop_types4.default.objectOf(import_prop_types4.default.any), + onReady: import_prop_types4.default.func, + onError: import_prop_types4.default.func, + onPlay: import_prop_types4.default.func, + onPause: import_prop_types4.default.func, + onEnd: import_prop_types4.default.func, + onStateChange: import_prop_types4.default.func, + onPlaybackRateChange: import_prop_types4.default.func, + onPlaybackQualityChange: import_prop_types4.default.func }; - var _YouTube = class extends import_react27.default.Component { + var _YouTube = class extends import_react30.default.Component { constructor(props) { super(props); this.destroyPlayerPromise = void 0; @@ -27826,10 +28123,10 @@ this.destroyPlayer(); } render() { - return /* @__PURE__ */ import_react27.default.createElement("div", { + return /* @__PURE__ */ import_react30.default.createElement("div", { className: this.props.className, style: this.props.style - }, /* @__PURE__ */ import_react27.default.createElement("div", { + }, /* @__PURE__ */ import_react30.default.createElement("div", { id: this.props.id, className: this.props.iframeClassName, ref: this.refContainer @@ -27852,14 +28149,14 @@ // src/YoutubePlayer.jsx var import_react_draggable2 = __toESM(require_cjs()); function YoutubePlayer({ videoId, close, video }) { - const playerStateRef = (0, import_react28.useRef)(-1); - const playerRef = (0, import_react28.useRef)(null); - const [isMinified, setIsMinified] = (0, import_react28.useState)(false); + const playerStateRef = (0, import_react31.useRef)(-1); + const playerRef = (0, import_react31.useRef)(null); + const [isMinified, setIsMinified] = (0, import_react31.useState)(false); const onPlayerStateChange = (event) => { playerRef.current = event.target; playerStateRef.current = event.data; }; - (0, import_react28.useEffect)(() => { + (0, import_react31.useEffect)(() => { const lastInterval = setInterval(function() { if (playerStateRef.current === YT.PlayerState.PLAYING) { const currentTime = playerRef.current.getCurrentTime(); @@ -27873,291 +28170,20 @@ clearInterval(lastInterval); }; }, []); - return /* @__PURE__ */ import_react28.default.createElement("div", { className: "fixed inset-0 flex w-screen items-center justify-center p-2" }, /* @__PURE__ */ import_react28.default.createElement(import_react_draggable2.default, null, /* @__PURE__ */ import_react28.default.createElement(_t.Panel, { className: "w-fit max-w-4xl rounded-xl bg-comfy-light relative" }, /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex flex-row items-center font-semibold w-full bg-gray-500 top-0 left-0 h-8 rounded-t-xl" }, /* @__PURE__ */ import_react28.default.createElement("div", null, /* @__PURE__ */ import_react28.default.createElement("span", { className: "cursor-pointer px-2", onClick: close }, "X"), /* @__PURE__ */ import_react28.default.createElement( + return /* @__PURE__ */ import_react31.default.createElement("div", { className: "fixed inset-0 flex w-screen items-center justify-center p-2" }, /* @__PURE__ */ import_react31.default.createElement(import_react_draggable2.default, null, /* @__PURE__ */ import_react31.default.createElement(_t.Panel, { className: "w-fit max-w-4xl rounded-xl bg-comfy-light relative" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex flex-row items-center font-semibold w-full bg-gray-500 top-0 left-0 h-8 rounded-t-xl" }, /* @__PURE__ */ import_react31.default.createElement("div", null, /* @__PURE__ */ import_react31.default.createElement("span", { className: "cursor-pointer px-2", onClick: close }, "X"), /* @__PURE__ */ import_react31.default.createElement( "span", { className: "cursor-pointer px-2", onClick: () => setIsMinified(!isMinified) }, "-" - )), /* @__PURE__ */ import_react28.default.createElement("div", { className: "flex-grow text-center px-4" }, video.title)), /* @__PURE__ */ import_react28.default.createElement("div", { className: isMinified ? "hidden" : "visible" }, /* @__PURE__ */ import_react28.default.createElement(YouTube_default, { videoId, onStateChange: onPlayerStateChange }))))); + )), /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex-grow text-center px-4" }, video.title)), /* @__PURE__ */ import_react31.default.createElement("div", { className: isMinified ? "hidden" : "visible" }, /* @__PURE__ */ import_react31.default.createElement(YouTube_default, { videoId, onStateChange: onPlayerStateChange }))))); } var YoutubePlayer_default = YoutubePlayer; // src/SearchComponent.jsx var import_react35 = __toESM(require_react()); - // node_modules/react-feather/dist/icons/external-link.js - var import_react30 = __toESM(require_react()); - var import_prop_types2 = __toESM(require_prop_types()); - function _extends() { - _extends = Object.assign || function(target) { - for (var i5 = 1; i5 < arguments.length; i5++) { - var source = arguments[i5]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); - } - function _objectWithoutProperties(source, excluded) { - if (source == null) - return {}; - var target = _objectWithoutPropertiesLoose(source, excluded); - var key, i5; - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i5 = 0; i5 < sourceSymbolKeys.length; i5++) { - key = sourceSymbolKeys[i5]; - if (excluded.indexOf(key) >= 0) - continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) - continue; - target[key] = source[key]; - } - } - return target; - } - function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) - return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i5; - for (i5 = 0; i5 < sourceKeys.length; i5++) { - key = sourceKeys[i5]; - if (excluded.indexOf(key) >= 0) - continue; - target[key] = source[key]; - } - return target; - } - var ExternalLink = (0, import_react30.forwardRef)(function(_ref, ref) { - var _ref$color = _ref.color, color = _ref$color === void 0 ? "currentColor" : _ref$color, _ref$size = _ref.size, size = _ref$size === void 0 ? 24 : _ref$size, rest = _objectWithoutProperties(_ref, ["color", "size"]); - return /* @__PURE__ */ import_react30.default.createElement("svg", _extends({ - ref, - xmlns: "http://www.w3.org/2000/svg", - width: size, - height: size, - viewBox: "0 0 24 24", - fill: "none", - stroke: color, - strokeWidth: "2", - strokeLinecap: "round", - strokeLinejoin: "round" - }, rest), /* @__PURE__ */ import_react30.default.createElement("path", { - d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" - }), /* @__PURE__ */ import_react30.default.createElement("polyline", { - points: "15 3 21 3 21 9" - }), /* @__PURE__ */ import_react30.default.createElement("line", { - x1: "10", - y1: "14", - x2: "21", - y2: "3" - })); - }); - ExternalLink.propTypes = { - color: import_prop_types2.default.string, - size: import_prop_types2.default.oneOfType([import_prop_types2.default.string, import_prop_types2.default.number]) - }; - ExternalLink.displayName = "ExternalLink"; - var external_link_default = ExternalLink; - - // node_modules/react-feather/dist/icons/loader.js - var import_react31 = __toESM(require_react()); - var import_prop_types3 = __toESM(require_prop_types()); - function _extends2() { - _extends2 = Object.assign || function(target) { - for (var i5 = 1; i5 < arguments.length; i5++) { - var source = arguments[i5]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends2.apply(this, arguments); - } - function _objectWithoutProperties2(source, excluded) { - if (source == null) - return {}; - var target = _objectWithoutPropertiesLoose2(source, excluded); - var key, i5; - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i5 = 0; i5 < sourceSymbolKeys.length; i5++) { - key = sourceSymbolKeys[i5]; - if (excluded.indexOf(key) >= 0) - continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) - continue; - target[key] = source[key]; - } - } - return target; - } - function _objectWithoutPropertiesLoose2(source, excluded) { - if (source == null) - return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i5; - for (i5 = 0; i5 < sourceKeys.length; i5++) { - key = sourceKeys[i5]; - if (excluded.indexOf(key) >= 0) - continue; - target[key] = source[key]; - } - return target; - } - var Loader = (0, import_react31.forwardRef)(function(_ref, ref) { - var _ref$color = _ref.color, color = _ref$color === void 0 ? "currentColor" : _ref$color, _ref$size = _ref.size, size = _ref$size === void 0 ? 24 : _ref$size, rest = _objectWithoutProperties2(_ref, ["color", "size"]); - return /* @__PURE__ */ import_react31.default.createElement("svg", _extends2({ - ref, - xmlns: "http://www.w3.org/2000/svg", - width: size, - height: size, - viewBox: "0 0 24 24", - fill: "none", - stroke: color, - strokeWidth: "2", - strokeLinecap: "round", - strokeLinejoin: "round" - }, rest), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "12", - y1: "2", - x2: "12", - y2: "6" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "12", - y1: "18", - x2: "12", - y2: "22" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "4.93", - y1: "4.93", - x2: "7.76", - y2: "7.76" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "16.24", - y1: "16.24", - x2: "19.07", - y2: "19.07" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "2", - y1: "12", - x2: "6", - y2: "12" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "18", - y1: "12", - x2: "22", - y2: "12" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "4.93", - y1: "19.07", - x2: "7.76", - y2: "16.24" - }), /* @__PURE__ */ import_react31.default.createElement("line", { - x1: "16.24", - y1: "7.76", - x2: "19.07", - y2: "4.93" - })); - }); - Loader.propTypes = { - color: import_prop_types3.default.string, - size: import_prop_types3.default.oneOfType([import_prop_types3.default.string, import_prop_types3.default.number]) - }; - Loader.displayName = "Loader"; - var loader_default = Loader; - - // node_modules/react-feather/dist/icons/search.js - var import_react32 = __toESM(require_react()); - var import_prop_types4 = __toESM(require_prop_types()); - function _extends3() { - _extends3 = Object.assign || function(target) { - for (var i5 = 1; i5 < arguments.length; i5++) { - var source = arguments[i5]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends3.apply(this, arguments); - } - function _objectWithoutProperties3(source, excluded) { - if (source == null) - return {}; - var target = _objectWithoutPropertiesLoose3(source, excluded); - var key, i5; - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i5 = 0; i5 < sourceSymbolKeys.length; i5++) { - key = sourceSymbolKeys[i5]; - if (excluded.indexOf(key) >= 0) - continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) - continue; - target[key] = source[key]; - } - } - return target; - } - function _objectWithoutPropertiesLoose3(source, excluded) { - if (source == null) - return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i5; - for (i5 = 0; i5 < sourceKeys.length; i5++) { - key = sourceKeys[i5]; - if (excluded.indexOf(key) >= 0) - continue; - target[key] = source[key]; - } - return target; - } - var Search = (0, import_react32.forwardRef)(function(_ref, ref) { - var _ref$color = _ref.color, color = _ref$color === void 0 ? "currentColor" : _ref$color, _ref$size = _ref.size, size = _ref$size === void 0 ? 24 : _ref$size, rest = _objectWithoutProperties3(_ref, ["color", "size"]); - return /* @__PURE__ */ import_react32.default.createElement("svg", _extends3({ - ref, - xmlns: "http://www.w3.org/2000/svg", - width: size, - height: size, - viewBox: "0 0 24 24", - fill: "none", - stroke: color, - strokeWidth: "2", - strokeLinecap: "round", - strokeLinejoin: "round" - }, rest), /* @__PURE__ */ import_react32.default.createElement("circle", { - cx: "11", - cy: "11", - r: "8" - }), /* @__PURE__ */ import_react32.default.createElement("line", { - x1: "21", - y1: "21", - x2: "16.65", - y2: "16.65" - })); - }); - Search.propTypes = { - color: import_prop_types4.default.string, - size: import_prop_types4.default.oneOfType([import_prop_types4.default.string, import_prop_types4.default.number]) - }; - Search.displayName = "Search"; - var search_default = Search; - // src/SearchResultsDialog.jsx var import_react33 = __toESM(require_react()); var import_react_draggable3 = __toESM(require_cjs()); diff --git a/ui/src/LearnDialog.jsx b/ui/src/LearnDialog.jsx index 4b93c70..d213f23 100644 --- a/ui/src/LearnDialog.jsx +++ b/ui/src/LearnDialog.jsx @@ -2,6 +2,7 @@ import React, {useState} from 'react'; import {Dialog} from "@headlessui/react"; import logo from "./logo.png"; import Draggable from "react-draggable"; +import {Loader} from "react-feather"; // moduleItem.querySelector('button').addEventListener('click', () => { // LearnModal.get().close() // if(module.initialWorkflow){ @@ -19,6 +20,7 @@ import Draggable from "react-draggable"; // } function LearnDialog({close, startVideo}) { const [selectedCategory,setSelectedCategory] = useState(window.data.categories[0]) + const [loading,setLoading] = useState(false) return (