diff --git a/custom_nodes/Civicomfy/download_history.json b/custom_nodes/Civicomfy/download_history.json index 416b80457765c9afcbaf7e0119819a60498e4967..ed27ab29369ade642b58cc0eaa6590aa9d1c5939 100644 --- a/custom_nodes/Civicomfy/download_history.json +++ b/custom_nodes/Civicomfy/download_history.json @@ -1,115 +1,115 @@ [ { - "url": "https://civitai.com/api/download/models/2577735", - "output_path": "/workspace/runpod-slim/ComfyUI/models/checkpoints/fluxedUpFluxNSFW_71FP16.safetensors", + "url": "https://civitai.com/api/download/models/2164348", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-Double-Blowjob-LOW-v1.safetensors", "num_connections": 1, - "known_size": 23802951552, + "known_size": 613516752, "api_key": "da82e3873725e824182cc021803091eb", - "model_url_or_id": "https://civitai.com/models/847101/fluxed-up-flux-nsfw-checkpoint", + "model_url_or_id": "https://civitai.com/models/1906148?modelVersionId=2164348", "model_version_id": null, "custom_filename": "", "force_redownload": false, - "filename": "fluxedUpFluxNSFW_71FP16.safetensors", - "model_name": "Fluxed Up [Flux NSFW Checkpoint]", - "version_name": "7.1_FP16", - "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d33e41fe-fca3-4f1e-ac5e-d7c2646fbb70/original=true/116759040.jpeg?width=256", - "thumbnail_nsfw_level": 1, - "model_type": "checkpoints", - "file_precision": "fp16", - "file_model_size": "pruned", + "filename": "WAN-2.2-I2V-Double-Blowjob-LOW-v1.safetensors", + "model_name": "WAN 2.2 I2V - POV Double Blowjob", + "version_name": "LOW v1", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e2c1e16b-44d1-4dee-8a58-7e49eff648e4/original=true/97372826.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, "file_format": "SafeTensor", - "civitai_model_id": 847101, - "civitai_version_id": 2577735, - "civitai_file_id": 2465089, + "civitai_model_id": 1906148, + "civitai_version_id": 2164348, + "civitai_file_id": 2057556, "civitai_model_info": { - "id": 847101, - "name": "Fluxed Up [Flux NSFW Checkpoint]", - "description": "
A nude/NSFW capable model that focuses on images with a female primary subject.
It is heavily biased towards nude images.
Sampler is dpmpp_2m (DPM++ 2M) and the scheduler is beta
No VAE or CLIP is baked in. Use separate sources for those.
Each sample/preview image contains the used workflow. Here's a quick article with simpler more beginner-friendly workflow. This is a recommended starting point.
If you had problems with GGUF-versions in Forge, it should now work. Please re-download the model to get an updated version.
Early Access is enabled to support the development of new versions and models.
", + "id": 1906148, + "name": "WAN 2.2 I2V - POV Double Blowjob", + "description": "This model was trained exclusively on POV clips of two women simultaneously licking/kissing the shaft of the penis. It does NOT include any testicle sucking.
This lora works well by itself at strength 1 even without the general NSFW lora. It's better for live-action than anime.
This model was trained exclusively on POV clips of two women simultaneously licking/kissing the shaft of the penis. It does NOT include any testicle sucking.
This lora works well by itself at strength 1 even without the general NSFW lora. It's better for live-action than anime.
Greatly improved NSFW stability. Much less body horror, and generally more acceptable outputs.
Extra credits to Dark_infinity for awesome mentorship and technical findings that helps stabilize Flux for NSFW!
Partially merged:
Colossus Project v10 by Afroman4Space
", - "covered": false, - "stats": { - "downloadCount": 10415, - "thumbsUpCount": 542, - "thumbsDownCount": 3 - }, - "files": [ - { - "id": 1931845, - "sizeKB": 23245070.671875, - "name": "fluxedUpFluxNSFW_51FP16.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-07-21T23:25:13.758Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp16" - }, - "hashes": { - "AutoV1": "BE257D1A", - "AutoV2": "4557581D27", - "SHA256": "4557581D277A230987A11ABFE88E6D5796C4BCA6C05411FB60491F3C33FF3734", - "CRC32": "0288E430", - "BLAKE3": "874BD1F0B0B0D643F515120E356692D6B72BBDC8AFB2B920D6E4F268577B8E5E", - "AutoV3": "BB641892C226" - }, - "downloadUrl": "https://civitai.com/api/download/models/1996104", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1c7d9acd-c736-404e-ad24-1f1941e5c8b7/original=true/87598607.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "U8I4V10000~X00GJ^J-p1j^HW@IV00~qS_i_", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/18a9f3e0-1732-4068-90c5-521259fb77e1/original=true/87598662.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "ULHxg9.9%$.S*0V@9Zt7OtMx8_WC%%bIjEj]", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bd5a0160-1e67-450d-baea-5a9bbbe1d265/original=true/87598663.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UNK0yq%1_N_N^*t7xuoepcR*xZt7?ba}Shxa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/61ca369c-8405-4c6b-9c42-35c93056b7a8/original=true/87598496.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UYIz#aRku5kX*0WBpJW?OZs,niafo~jYjFt6", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2ad66409-6889-412a-a787-f6f423c1c01f/original=true/87598659.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "U6DSOB#R1%%#~B4.b^%201D%VYIU?b?G4oJ.", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/15552bcd-4846-4787-9d08-c60af3736477/original=true/87598658.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UAGQ^J_N={0L0L0ft7IU000eR5^kRitR?H-o", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0066d898-74f6-41cf-905f-325852cf65cc/original=true/87598672.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "U6Hd?IIW00iH000M_3Rj00;K.TO[?^?Hvft7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/508ad811-0a61-4d01-8b79-9a7834836f7a/original=true/87598669.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "U9G[1gIp00.80nx^$c-=uPIAHXgND%Di4nXS", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe272e54-9483-4f22-a7ba-8b96fa3523ff/original=true/87598670.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UOIz-jROyExvys4ox^xtyEMx%1WBxuMxwHS4", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d43b5e5f-946a-44ae-a67e-754113328dcf/original=true/87598665.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UMIECOtS0#%M_N-;%g%M%h-pxuX9ENNH%2xu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0f8e82cc-64bb-4ea4-8394-f811cffb48fc/original=true/87598677.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UAI59z?H0NA92}Sa8xR6xg~E8zM|_14-IAM|", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/54038787-ae76-418c-8337-df2ea51ebf85/original=true/87598667.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U4AwSGpK00J}1r?c~Xtk?vo~?JR$I:jLxv.7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4831d756-4957-4c8d-bd1e-1fdbf7c90986/original=true/87598674.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UGI;q[nh0JnMHq%gY6NG9Z-U-TcFloIU%1IU", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/981a9904-0c73-440e-a256-a1f986a7bf97/original=true/87598666.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "U8CF^s?G5:0L~WIU0fD%02IUxa%1T0Ri^%%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6b08425d-e830-4bdc-80f3-27db34bc915c/original=true/87598661.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UUHxg7_3yE?b~qIUM{ae579FR5Iotms:xakC", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5768e295-1f7e-4179-8040-7f1f7f6e88f9/original=true/87598668.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UBFOP@~BJQWm?an#.7~p^+I:%2xt~B%2%3I;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f3d5aeaa-09a5-47f2-82a4-c4a4d5ab65dd/original=true/87598657.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U9Dcw8_39FD%Gv~WMdD%}U.8VXM{@EkCE#E1", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/edf88134-388e-425d-83bb-03ceb48d4d5a/original=true/87598656.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UIH-4D%g0$EgJ4~W%MXAS6%1%Lxa^*NZWFba", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/09647003-950f-4c0d-85ce-8e0d8d8040e9/original=true/87598671.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UPHLPL_MTEx@xr-o-:?Htm-=xuRj-;xvjINH", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ccea1f2e-de69-426d-a0a2-e091e5784b1b/original=true/87598673.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UBLWbE~p0z~W01ItxvoN00o~?vtlNzIoxZRj", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1996104" - }, - { - "id": 1997816, - "index": 7, - "name": "5.1_FP8", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-07-11T11:39:07.633Z", - "publishedAt": "2025-07-27T11:35:15.609Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 29, - "description": "Greatly improved NSFW stability. Much less body horror, and generally more acceptable outputs.
Extra credits to Dark_infinity for awesome mentorship and technical findings that helps stabilize Flux for NSFW!
Partially merged:
Colossus Project v10 by Afroman4Space
", - "covered": false, - "stats": { - "downloadCount": 7860, - "thumbsUpCount": 162, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1898416, - "sizeKB": 11622602.1796875, - "name": "fluxedUpFluxNSFW_51FP8.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-07-12T11:34:03.138Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "B9185752", - "AutoV2": "7F513229C2", - "SHA256": "7F513229C298EDC97C71B4FF516620F9E5D84605FC8EE965A2968B9A3DF43138", - "CRC32": "92A64EA3", - "BLAKE3": "839E626B498A273D5A36EF1FFE8FE21A5690CE9685DFC4BB87E3D64AE546F062", - "AutoV3": "DEC29A004E4B" - }, - "downloadUrl": "https://civitai.com/api/download/models/1997816", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/feec77a1-bc83-4808-8c67-be946dbd434f/original=true/87797474.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UMIg$H5nk?~p.8WFt8OEEL$hxaxtM{M_RPIp", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/93f28ff1-5c46-45fc-b5ec-f7615a7eb1e6/original=true/87797525.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U8HwiZ%g0f-;0$~CMdNG03%#%2E2^krr9Z,:", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2072f93e-c2df-4fe3-a37d-04bc01eabe5d/original=true/87797540.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UJI4hXoI9]Rj0ebaNGxu02-p~Cs.rWIpD%og", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5bbdc1ce-5aa2-454a-9f30-b60608f34572/original=true/87797535.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U7HL9$5,00?F0c^*%KR%00={_4S$9FIXD*I9", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8854c343-8f6d-4d87-90b5-74ef1c8e9dd5/original=true/87797550.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UFHw=QxZ000e0L%1~VE20Ln*-p%1?aIoaKxu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b210a6c5-87ea-4b15-86cf-d5bd71f0741b/original=true/87797539.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UJKJc2%2-:xG}RD%s.ae~qxuxabHIU-oR*WV", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d96f4b31-1fe2-4240-a3d0-fde37417da27/original=true/87797551.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UAHdmd9Zx]wM2^^,57NHT_?c}@r;kYtl^j$z", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/53974343-97d2-4a65-8b15-26bba8fb628c/original=true/87797548.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UOG[f:00*0I9TeVYXA-:tRtRrrS$tlD*-pog", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6b0c2f49-b74a-4f72-96fa-c215d2c76629/original=true/87797544.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9IqP?}@0103u4?I%3S%00x]%2Ip=yR*?HDi", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/12e1ed49-74e2-4913-b821-bc89d72568dd/original=true/87797549.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UED*nR$y9[s:0hn$xaWB0iI;$*V@};R*kBNH", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe4e4be6-25ab-472e-a911-5090a7527af3/original=true/87797537.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UYI;@qRj9Z%MjDj[x]t6D%n$s9Rj_NWBROW;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1465f41e-1ae8-410b-b8b5-81e05b93e237/original=true/87797536.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U6IN?h%$1j~XT}*0O@-=00_3pJNH4oE8niV=", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/17f896fd-c915-482b-bcff-17274477ccda/original=true/87797542.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UBI;bc%d1QX;00t,0g}=00ADrArp?wrT^+t9", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/76c76757-ed0a-4d36-b1f8-40568c59e13d/original=true/87797543.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U6IN~z_N02?v00-n%zyC00N4Y69aBr02+HMz", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/40a34e3e-4598-4abf-a555-409a5d30ffcb/original=true/87797547.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UADvfyRj00D%00~qt7M{009F_3xuD%%MM{-;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca793f72-1861-4064-84ae-98b480734482/original=true/87797555.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UMI|OJ%LApsE~Uxu-pWXAAxt-Vov?Ht6IooJ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/55398ba0-b393-43bf-aa37-1216cb136550/original=true/87797541.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UDFrV900_4rCEgWV?a4n0fNakCIp?HaeM{oL", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/50a81985-73ab-426d-a43f-5ee730b155e1/original=true/87797546.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UIIg_$-B0y9Zz,WCt6ofPq9a?G%2Q+f+ofxu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/23710570-8aa3-4c50-8b52-489ac56dafa7/original=true/87797545.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UBIW[yD%*I-.Bn={0e-pE09u8_xu9]a0RObb", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0e8377c0-532a-4b31-8b37-5f1713b164e5/original=true/87797552.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UEK0TzMIE3}sJUI9^jwuA]xZ?G4:Or9uIUs,", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1997816" - }, - { - "id": 2278561, - "index": 8, - "name": "V5.1_Q4_K_S_v2", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-10-03T22:58:24.134Z", - "publishedAt": "2025-10-20T00:02:08.091Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 31, - "covered": false, - "stats": { - "downloadCount": 4278, - "thumbsUpCount": 177, - "thumbsDownCount": 2 - }, - "files": [ - { - "id": 2171504, - "sizeKB": 6646473.28125, - "name": "fluxedUpFluxNSFW_v51Q4KSV2.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-10-04T10:22:57.184Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "0CB928F9", - "AutoV2": "72EA0B8BD1", - "SHA256": "72EA0B8BD14E0E3B46F60CAF57EE2CF704FB2F50E08F4DF0F48721FA0AEC0913", - "CRC32": "0BCBA5E1", - "BLAKE3": "2BCFBE6F6E2B9A04585D50B0ADAD6C14AB7304EEFB0CF66DB3B6A6E02FD3CF7C", - "AutoV3": "19F0572A4815" - }, - "downloadUrl": "https://civitai.com/api/download/models/2278561", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b28eb04a-5da9-491f-b0ae-c5f7d81234c6/original=true/104189688.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "U5Bzd|4VLNnM4XNGx[,.00-$8wEz00Q+r;5A", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e7fec8f4-2e2c-406c-8323-ab1dde5f983c/original=true/104189788.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UDGk5sx^0g~B1OS$fhWB0Lwcn$w]t7s:V@Na", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0b9e6c7d-57ae-4866-99bd-27c297a5c51a/original=true/104189813.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UBHdvsjd1c9ZCO0M%fShXy8|#QMx~2RVVs%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/17db1715-34a4-48a2-a63f-bad49cfa08e6/original=true/104189801.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UEJ7Ew~BGGX9009Zt7IUK+I;ozE2I9ROIAen", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5765401a-ea68-4f8b-ba69-075f8718daa5/original=true/104189805.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UAE2@4D%00j]_MRj9FbID*NFRl-q4.V?^+xu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c5b260a4-bae5-4cbb-8bc6-0d9ebe1f0cf2/original=true/104189804.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U5COp}#lPTM|~pNa^*aK1}t6-UWB^j$%EMt6", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad8c4089-881b-4179-8f60-0bd2b3f9a818/original=true/104189831.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UXFFBCNHoft7~UNHt6%1?FWExZxZ^*kCs:bI", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3303be19-cb5d-4b17-9f8c-e2ef6019a779/original=true/104189806.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U4Jjo8ibCR0#2]vf7N0000_2~q01009u9t_M", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7e59c07-76bb-4880-9c50-ddc6ffe57c6d/original=true/104189809.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UCIzVU-=9Z-9CANyIUM{BrRkM|NH-;IA%1tQ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9125a803-2dc2-42cc-9eff-a7964bde3e5d/original=true/104189808.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U8E-~;NH00={D$R*0hNH00xG~At7XTjZjFae", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f95640e4-d44f-4486-8a88-95f646b64d84/original=true/104189802.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "URL|cY-;t-%MuPtR.7WV%#M|ITaf?bV@MwoJ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/48d5ede5-57c5-423a-87be-1742698a3ee0/original=true/104189810.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UC9%#xRE^mV=}tIW=}oOvJNE-CoO.9kE$xxI", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5b9cb37f-b469-403c-b053-6fbddd2aa536/original=true/104189824.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U9H1rVyD.mx]5$?cNYt6X.NJ%NXS000LMdIT", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3316feac-c28f-4b7d-a73a-3ec46989bf39/original=true/104189811.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9D[IQ.75:^O5;I=9vni5;}@-BI=V[EM-Ut7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/59db6c3d-76d3-4e6f-b0b4-5728286dbbd8/original=true/104189800.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9IE9H0Kxu?H0L_456IB01xt4n_3.SIU%39Z", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1c00d90e-c468-45c8-b350-2122b3fefc07/original=true/104189844.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UPHeB+EM_0~U_Ne?%Mxu.AtP%MM}.9ocW@t8", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5be83e40-49a3-4b31-8eb9-7f4e3d448e65/original=true/104189812.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UdIXaAWYpIW=~pM{jFoe?bs:sTjZ-:oeWBaz", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ccdc7682-79a1-40c1-94f0-d345bc27589b/original=true/104189818.jpeg", - "nsfwLevel": 2, - "width": 768, - "height": 1344, - "hash": "ULB:Etvwx]o#OxMvn$ohIDgLRNxaVytRV?M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7efeb0bf-82a9-4cea-a361-381370a01b82/original=true/104189803.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "USJtCwxv~pRl?bMxEMV@%fWBs9M|x]fl$*Rj", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/47cdb885-00f5-405e-9089-d5036b9933c0/original=true/104189815.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UPD,4HoeM_t6~ooLR%R%%hj[M{Rkp0bHMyM|", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/2278561" - }, - { - "id": 2080387, - "index": 9, - "name": "5.1_Q4_K_S_v1", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-08-04T10:43:26.883Z", - "publishedAt": "2025-08-19T22:10:15.602Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 25, - "covered": false, - "stats": { - "downloadCount": 2505, - "thumbsUpCount": 153, - "thumbsDownCount": 2 - }, - "files": [ - { - "id": 1977906, - "sizeKB": 6646473.28125, - "name": "fluxedUpFluxNSFW_51Q4KSV1.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-08-04T21:33:50.309Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp16" - }, - "hashes": { - "AutoV1": "0CB928F9", - "AutoV2": "72EA0B8BD1", - "SHA256": "72EA0B8BD14E0E3B46F60CAF57EE2CF704FB2F50E08F4DF0F48721FA0AEC0913", - "CRC32": "0BCBA5E1", - "BLAKE3": "2BCFBE6F6E2B9A04585D50B0ADAD6C14AB7304EEFB0CF66DB3B6A6E02FD3CF7C", - "AutoV3": "19F0572A4815" - }, - "downloadUrl": "https://civitai.com/api/download/models/2080387", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1c753c78-ab07-4542-bfb4-fb94b6fb037a/original=true/92345785.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UBDlp9D*00x].8RjD%xa0Jof-:jF00xu?^M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/698b8b93-b9d5-42c3-85ff-d98aa6edcaca/original=true/92345786.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UDK0.}V@.9EkE0-pM_?vPXxvI[_3NXS6kDE2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a6537764-bec8-4d9d-a562-1b72952b38b0/original=true/92345807.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U8JGf=XTJ.9v00r;iv$z0qtRNw%L}7IoX8E2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3d48f3a8-075c-4389-9e57-78574dddb654/original=true/92345802.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UHJZ*u0L0K%20f^*M|NH0e-U~CIVIoIp%Lt7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4527124c-49ff-4fcc-85b4-94c2668f87da/original=true/92345792.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U9Iq4G0f00xC0y~A00IpTcNL^jM|00n$%2xE", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2f3e4458-bc7a-4cf7-acc2-cd1e29501220/original=true/92345798.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UBIEeLOu0$-;00?GOYEM0000$ds+_ND%o~%1", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1a3c6ba5-80ae-4e05-ac22-67a21af24c7b/original=true/92345796.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UGMFg-}@tl}@00=_IUxZ5sI;ozxZ={NH-AS4", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a8a0669b-f744-4ad2-b2d5-81a4104df67e/original=true/92345801.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UDIrHUE2LM%g1B%MRPRj^-Nb+uaLxDWAtktR", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f84277c5-27ec-4a48-be4d-73fc46c6f391/original=true/92345800.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9IW$P?G0#={00bb9txaE2tR~UR+Nst7aLxt", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/76703132-de88-4310-9b68-cdd04b9d1945/original=true/92345797.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UBHT%29vFxoz_3$k%1xa0$OYoyI=~WIpRQE1", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/57d50e88-4681-468e-a478-f46a642a1980/original=true/92345795.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9GHVd0200~V0g%1Ip={0L~BxHE2?G9b-oNG", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ef4e5eae-8bc3-4874-98eb-493bd7839f4f/original=true/92345810.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UDFXxIJ-0LnO~W={NGE2JQR*wJI;0fkC-o%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b554880a-ba97-4e46-bc66-e7f7aaf28ac9/original=true/92345812.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UFJG_~xu11RQ1Ho|9ZIUysj?%1jZ={R*$2V@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/48013f27-6d6e-4f94-a956-1526531bbafa/original=true/92345794.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UKHUd|E2Io?G1l%2WBjFyZWC-pIoY7WEWBW;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7439e0d0-bd16-4b21-8260-65cc96222a1c/original=true/92345809.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UJJP-?Dj~B^QX59a-oni9]xa%1M|-pIo%Lxa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dbec4194-8c99-49ff-b713-1f7c38fe4014/original=true/92345805.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UFK9}f00yXw@680KTKD%58IUtl$%~Bi_%MxZ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/56e9a5a6-446f-4b38-9899-4c9761d62a01/original=true/92345820.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UCH-MnyE0#kqC9?I?HJ:17ohNLxb.TI=V[-o", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/48d26a73-ec87-4d25-aa71-0f631b29bb07/original=true/92345799.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UEDlvQkC0L?b00D*NHs8*0-;-oM|00n$%2Io", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/51892c41-c885-4bae-91a5-a924faa2ade4/original=true/92345793.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UrI|{[~WXm%MNGayxaWVIVRjs.oJocj?WVjY", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8362a7d5-9d52-4f48-b4ce-8235c4463ce5/original=true/92345948.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9C5;*5u0:-?E.%NN#o$0K-9RQE2}?IoV[Iq", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/2080387" - }, - { - "id": 1937841, - "index": 10, - "name": "5.0_FP16", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-06-24T10:31:59.957Z", - "publishedAt": "2025-07-09T12:57:13.339Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 29, - "description": "A new and improved version.
Huge thanks to alcaitiff and their Mystic XXX LoRA!
", - "covered": false, - "stats": { - "downloadCount": 1988, - "thumbsUpCount": 209, - "thumbsDownCount": 1 - }, - "files": [ - { - "id": 1835822, - "sizeKB": 23245069.640625, - "name": "fluxedUpFluxNSFW_50FP16.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-06-24T12:23:52.812Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp16" - }, - "hashes": { - "AutoV1": "B52B77FD", - "AutoV2": "953A8158D8", - "SHA256": "953A8158D8B784FA44FA986D23E6D61EEC6D3B3591B55995A6B548924A44F017", - "CRC32": "ECC8BBA2", - "BLAKE3": "15997C4533D895CCCD2D7F117BD1DD8D29CCDF95BFD1D0FBD1F616E272F4D90B", - "AutoV3": "C01357FF9920" - }, - "downloadUrl": "https://civitai.com/api/download/models/1937841", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/24e89da9-0fb0-4810-a85c-81b16870c93b/original=true/84248929.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UFDSBz?GIm~UwHbct7s:r;S3%MoLE2Rjxu%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7c2f8a8c-db04-4fa2-b98f-605980cee628/original=true/84248930.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UdI}hdI9g2kW%eNaR%R*_3s.RPs;?wIT%2%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4447d101-591d-4525-8801-7dbdfb6d8126/original=true/84248961.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UFDSL6VsN_oz.TV@xtt89}ShaebcM|bcM{t7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eefda292-5f7b-4d25-852f-7bcd22e319f2/original=true/84248962.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UZJRK#%MyYMx~qaebIWBJVRiVsofWCWBRjof", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eac0f9d8-223c-43d5-9f20-608e68ccfedd/original=true/84248966.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UbL4pX%M?wx]_NWBWBaxbc%MIUM{M{t8V@ae", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0ffbdb79-6eb8-410e-a1b6-e09b87dcd68a/original=true/84248964.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "U7FOx~0001?c00NK~VD%00_N=yIA?Gofob?v", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4b9952d2-f81e-4875-8581-8f768f986078/original=true/84248967.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UAJjVjE10dxbP.E14:NaF@$f^kaJ%ME1~VRk", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3ed48655-c843-4a19-900a-af21fd0e198e/original=true/84248965.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U6HA-7012[^O0eIT0L%10d_2MdX9I;g4~CjH", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5275014f-96e1-4e0c-9018-8203c6912fa1/original=true/84248971.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UKIE@Qs:yX%g~qoftSWA00bHVsV@-oj[o$oe", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5dd51223-6697-4238-9068-4285a1ed2dec/original=true/84248970.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UCHo5#Ty00~BD4VYE1pIPX-UwuEL?vW=I9S%", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/17fa048e-79c1-430c-adff-7e768b294ce5/original=true/84248968.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UNEoJZIV?v%2~qRj?bt7t-R+yDt6?bM|t8R+", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2b805ae5-d5b2-48f0-8094-6d71119edbcf/original=true/84248960.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UeJHRB%M%hW=?^bbtSkCyDn$xuof?Hadt7xZ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f44429b3-20b7-4d84-9841-84abbd6683df/original=true/84248969.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "U8DI,mNF00tQ1F-pxsX601Io~WM{V?a#o#%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9b6312bb-1801-4a7f-94c1-39c7d01f8b0b/original=true/84248975.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U5D8tUMw00?H=X~C9[D$0#9Z~B^+009^^*M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/55b6c424-f69c-4dd3-bf5d-c3d6bed687da/original=true/84248977.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UGGI7Y?G%$N_~pIoXn^kR5xuM_Io00%L$2aK", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e24e2310-9943-4290-b289-5517f53dfc82/original=true/84248980.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UUFPKo%MI;V@M|WAt7kD.ToJM{ITa$aebFWB", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fca0fe65-576b-4c79-a68f-d78f6f5dfe37/original=true/84248981.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U9INKz}Y5=X900}?=aJ80#57$fxa~BEhSi$$", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fb6447bf-d44e-40a9-b72b-02525d7fe5c9/original=true/84248983.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UEFhSc%j5]%PyB%ESbt300%4xYNH]{R,NGIo", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/77afd873-384c-4fb4-9fe5-2cf5737311b7/original=true/84248976.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UEGkB*%101NGxaR*0LIp00xZ~Bj[={s:-:xa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1944491d-3369-4d27-a2bc-ec00dbf8e8cc/original=true/84248982.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UeJHaV%$S~M|?w%Nt6f8%gxtVrRPxut6RiWV", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1937841" - }, - { - "id": 1938215, - "index": 11, - "name": "5.0_FP8", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-06-24T12:56:27.914Z", - "publishedAt": "2025-07-09T19:14:09.689Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 31, - "description": "A new and improved version.
Huge thanks to alcaitiff and their Mystic XXX LoRA!
", - "covered": false, - "stats": { - "downloadCount": 1772, - "thumbsUpCount": 81, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1836094, - "sizeKB": 11622602.484375, - "name": "fluxedUpFluxNSFW_50FP8.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-06-24T14:04:13.365Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "0047DB36", - "AutoV2": "EA356C607F", - "SHA256": "EA356C607F08F2192CBE5C060F3FBBDBD44EC6D277B6ABAA604A07CB64717A27", - "CRC32": "8F74C7B6", - "BLAKE3": "24A2C25EFE3F2BF5A530F258877182C56457061CDDB08013F699AB668980268C", - "AutoV3": "24AA8130178A" - }, - "downloadUrl": "https://civitai.com/api/download/models/1938215", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f5c8c524-3230-4536-8498-22748d1fd661/original=true/84300771.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UHFhl0ABTa-U#O?dyFskGJV;$%S79WNekXWE", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b2b2b4ff-5856-418f-aa23-6fd82e071de4/original=true/84300781.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UFH-rn?wOt0gFztRtmNL0K-;%M%MX9?HE2.8", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/83421546-cde5-4f54-a3fc-4a23e3ec1750/original=true/84300798.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UdJ86E%2Ioae_NRjWBt7xuM{R*ofM{RPoKxu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/128c96d0-7d8c-428e-ad47-eee3ff615589/original=true/84300795.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UBDlpAX800~WIANGNG-o00sn^+IUIVxakBE2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/01fc8a71-5538-475a-a7ee-1fc3899dd8f5/original=true/84300792.jpeg", - "nsfwLevel": 2, - "width": 768, - "height": 1344, - "hash": "UcJj}EtRFf-Vysbct7IpyDs:r=xt-pt6s8bb", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/702dd589-6cab-4fa0-b2ad-46520ff3cdbb/original=true/84300791.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UBGHxg?I01~VN%$,rwXUD#-q^mXA00xv?ct7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7f43a51a-93b9-45ec-a551-5b070203931b/original=true/84300802.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U7Hd?N}F0000PAj?.RaK00Io_NJ90LpI-:D%", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0198de67-c081-4453-bf43-497451e23a87/original=true/84300799.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UCC$r?pJMf_3_L^*I^%LsSM{t7$*01WA?GIV", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/12c6f288-64ca-4e2b-a3e0-d549241d5b20/original=true/84300788.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1344, - "hash": "UKE2|Nj@IA%M_Nj[D%kC?HayMxj[Rjj[RjWA", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e30926da-2084-4846-93e5-8fede5cd0b13/original=true/84300786.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UIIE000063rt.l0K?bs,KQIUwIt7M{MwxYIo", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e0156e15-5721-4170-bdcf-05f061650fff/original=true/84300793.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UHKv?iyU0o=}0JS~M[nfPE$*^SN20LVxM|M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a76c133b-15b0-4525-bb48-a72fb3d99509/original=true/84300787.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UJH^*Fx]0zkXY5wcIUozE1IoMx$*~U%1%Lxt", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/daabe0ab-d51a-4ab8-bf5e-2683887e438a/original=true/84300782.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UBExki;w1600?w9ZTKIA0MI[%LNF9uxa%1-Q", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/be86b240-d967-449c-9b1c-b2537ddfa9fb/original=true/84300794.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UDDuMrNL0_%21qNG,]kDS$s:sqNb^UoyEIoL", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4c102351-7e05-459f-b57f-d2310bcb08c0/original=true/84300784.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "USHUkIyE*0kXx^M{-;j?x]D%%2RPNIWBxaf+", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ddc40dee-c71d-4840-9133-75307064a7b5/original=true/84300790.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U6JGZp^i?]N_000L9^E100EL01NG#TSL%1IV", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/366faf06-9158-4fa2-88b8-977725551a64/original=true/84300785.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1344, - "hash": "UOIXgR~qOsRPO@t8t7WANGay$%t74nITWBt8", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e5ceccd5-83d8-4098-a2b4-13322c83f947/original=true/84300797.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "ULI4YCb{_3J;_N.8Jn%MFv%1w[%Loxnh%1of", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ec8712fd-2770-4f9f-baf0-cdcfb55970d9/original=true/84300789.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "UCG[NK~WO[~Bpx?a_NNH9^%N?HNG9GIpaJM|", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d4c4298d-0a94-43b5-9eec-7d29bed325db/original=true/84300796.jpeg", - "nsfwLevel": 16, - "width": 768, - "height": 1344, - "hash": "U7JjJA4;.8{wPp-:.88_1P?GS$Md00IAo#-;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1938215" - }, - { - "id": 1823302, - "index": 12, - "name": "4.1", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-05-23T08:09:52.108Z", - "publishedAt": "2025-06-07T09:30:03.233Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 29, - "covered": false, - "stats": { - "downloadCount": 4375, - "thumbsUpCount": 313, - "thumbsDownCount": 1 - }, - "files": [ - { - "id": 1723805, - "sizeKB": 11786347.51367188, - "name": "fluxedUpFluxNSFW_41.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-05-23T08:29:03.352Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "49A9724D", - "AutoV2": "BE19459017", - "SHA256": "BE194590176E9D5237B5096E0BFEE92099B25B07EA78CB867EAA2F39EB9E8EFE", - "CRC32": "710603AB", - "BLAKE3": "D817E03B81B4F63C5BF44BE0BE5D6E9E3D6A3F3B5674C2BAE81CD73EFD4BDFEE", - "AutoV3": "7DC91A2E5FF2" - }, - "downloadUrl": "https://civitai.com/api/download/models/1823302", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c383aa73-c77e-4c5b-839a-0accb8fefcc7/original=true/77985562.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "U5EoY@qZ0000wo-?124:00yF[mTLP;9F^N}q", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e36c6e1d-7b93-4bb6-aa60-9ee8f2add836/original=true/77985641.jpeg", - "nsfwLevel": 16, - "width": 1216, - "height": 832, - "hash": "UCL{k?9b~n-APp9u5RxucE%K=}w]9Z%1-pMy", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/115387d1-5987-4b4b-8a62-f9d2619c95cb/original=true/77985647.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UGL3JvK$1v}E%h%2x^NH9cR6q^I:}0jKxui{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c65619ed-9d82-4360-90ae-36681c8048fe/original=true/77985652.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UBE.b900uPvf?v4Tx]Mw0fD%-pRiRP-;XT%2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/07bb20f1-fb45-4cc2-8e54-6a411d134e0c/original=true/77985664.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UIIy,#XS9[Rj0gM|xZf+0g$$M|bb}@^i%1NH", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/52aa961e-5df8-426c-94ab-67676085cd70/original=true/77985653.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UJG@_Uks0g%M0h%N%gNe0$oh?Hbc~BjcoMxa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1ec2225c-e35c-43bf-a359-17eef92266fa/original=true/77985648.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UBKAB1.811kr00~W~U-;00D$MJM^k;rpRORO", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/30182bc3-7e15-4edf-83d8-af591b54ca3e/original=true/77985657.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "URE_aHT0-UIo~At7t7WBobkWW=ozEkxuj]xZ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe961f01-ac07-41e2-9d3d-cdc5419de6a3/original=true/77985655.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UKGQ@kb$5uxstRRmRQ?IEvfMsQERS6n$R$xu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/26e0eec0-06fc-4a2d-941e-ff7ea6d105ce/original=true/77985645.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UJGIfU??yVD$%{N;%fRjyA%Kx[tRSbkUxZRj", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b66c6c8a-3a6b-4bee-8212-96c503f51f21/original=true/77985649.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UCL:AaI9Atx]C800OZOsGaQ-$hxu?axX~C^*", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/568903fb-b9f3-462c-a136-a93efcbd26bd/original=true/77985656.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UFHxE8i{ui=|ITWF8_%M5=X8%LIo%2tRNGkC", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2e8f8602-ad7b-4492-84ab-dd69ac8ed4a8/original=true/77985659.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UOL{}5$+%g%Mbv8^Mdozo~M_VY-;~qWAo}%L", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bc8281ad-d5cf-42cd-a398-1063ce87b03f/original=true/77985663.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UCEV+:00_3%M_3M{~qIU00~qRjM{4n-;4nxu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/89626142-7c06-45ae-9372-7ff176e81e0d/original=true/77985651.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "ULJaAsu6.m-o?GH?xuV?SiMIV@V@~X%Mx^ni", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/14f879a1-b303-49d5-bfc3-ed3ba6ab3eee/original=true/77985658.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UKCP%^SwE2rt?@t5xaRRKIxF-oNIouV[WXt7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4a0b4c2f-6a02-46a0-ae1e-a53febb2cba8/original=true/77985646.jpeg", - "nsfwLevel": 16, - "width": 1216, - "height": 832, - "hash": "UBKAB6?I4mn3ZLRj0hS64TIU.ANG0W-pRgs*", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/70ea0114-d3f9-4dce-8b21-2d56ba32906c/original=true/77985667.jpeg", - "nsfwLevel": 16, - "width": 1216, - "height": 832, - "hash": "UBI|j=IA0}~CLM0KxZ%20f^j^+IVM_^+I;M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8ca723ed-1ed4-4fe4-a42e-84e87c61df8f/original=true/77985654.jpeg", - "nsfwLevel": 1, - "width": 1216, - "height": 832, - "hash": "UGK12d00lo56Q,~qD%?I0e-=R*EL%gE1%MjF", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1823302" - }, - { - "id": 1823346, - "index": 13, - "name": "4.1-Q8_0-gguf", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-05-23T08:27:11.788Z", - "publishedAt": "2025-06-07T09:30:03.233Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 31, - "covered": false, - "stats": { - "downloadCount": 1320, - "thumbsUpCount": 28, - "thumbsDownCount": 2 - }, - "files": [ - { - "id": 1723855, - "sizeKB": 12418879.15625, - "name": "fluxedUpFluxNSFW_41Q80Gguf.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-05-23T08:49:39.352Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "A2372741", - "AutoV2": "A5F0056980", - "SHA256": "A5F005698004079079B7B8B8B6D92C48976389155CB1445CCDC4AC9A01689BA2", - "CRC32": "F8862643", - "BLAKE3": "C37A5BE5D0A2BBD021E4EC847B743E0C5BAE73CD2B6DD08654826F970D1573D0", - "AutoV3": "D47CF5DE74C2" - }, - "downloadUrl": "https://civitai.com/api/download/models/1823346", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4c02d468-0101-403a-9ac7-460eb252cdcf/original=true/77987550.jpeg", - "nsfwLevel": 2, - "width": 832, - "height": 1216, - "hash": "UCC6S=nh0}ELxrRPO=xYM^R-skx[~V-pD%bb", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/050d3007-abaa-4c89-a576-b7991df9fc6f/original=true/77987521.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UAE_:Q?a00D%_N%NIVIU01x]~BV@-?-;xBIV", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2acc4d65-6152-4587-bb32-e170476e3588/original=true/77987567.jpeg", - "nsfwLevel": 1, - "width": 832, - "height": 1216, - "hash": "U8FXV%_[0ETg1F-3R+o|001.-cNUHrx|}^nB", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2aa3ded6-2670-4fb3-a8b6-5e4a0e4f735f/original=true/77987552.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U7C=ot^-7R-:Ecob9XFo009Gr3IUDhEKxJrd", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/63374cc9-4bb8-418e-94d3-ce23160fc99c/original=true/77987549.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "U3K0KR5Rc[;100005TDi00v~~C-U01EM,:D%", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f62488a8-717d-47cd-a6a5-fdfed88647bd/original=true/77987555.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "U:I#ln_NtSRPV@M{bHofo#ozofazx]t7j[WB", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a979340a-7d67-4caa-8f5e-40a377063e8f/original=true/77987548.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UEIqr;~X00EK0gt6^kSh00IT_4tRIS%3T0$%", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/12d73d1b-948d-45d5-bbf7-0d6049702539/original=true/77987543.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UNF#]xrX9tt7_NV@r=octmM{r=Rj.8IUIoaz", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5b9712e1-9d9b-44a7-95e9-895b9dde74e5/original=true/77987542.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UCHB@~-:4-xZD|xpx]xv~6ob^-xa_3V?00xu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/751740a8-8551-48cb-b70c-48018a3a5295/original=true/77987540.jpeg", - "nsfwLevel": 1, - "width": 832, - "height": 1216, - "hash": "U7C=#v%O0f0e4m-;IU4.G19t?E%1DgIV-o^j", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1229057f-2736-4001-80f7-fe1421e2213b/original=true/77987546.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UJIW$UM_EMR+I:9aI:%1rq?H9a5701~B$iNI", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/891e5e2c-9dc3-430c-9963-3352fa13683b/original=true/77987520.jpeg", - "nsfwLevel": 2, - "width": 832, - "height": 1216, - "hash": "UDINXC~ByWDi00rr%L5q?^IVr=M{#QIU^*={", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b01b3e2f-8a2c-4757-83e2-aab2d02a2e5f/original=true/77987545.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UUHK%:9atQs.~VE2jFbHx[M|RQof={aeNHs.", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0cc335c1-1ee6-4d65-a18f-46d8c5c98910/original=true/77987544.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UID[%x~A9t9]0NIXR-RjE3Io$g-oR%xtxunj", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9bda0938-9c99-4aae-a975-4a3afff91a19/original=true/77987547.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UmJ7gxoLOYkC_NWB-pt7%#jZxuof%gazoMj]", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/037a8318-b319-4f6b-929a-352007d0e964/original=true/77987539.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UAHAIb#R0LRP0MVs={Rj13EfJV5S~V9a-pxZ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/815739d4-066a-4277-9046-7d5cfe46ccef/original=true/77987541.jpeg", - "nsfwLevel": 2, - "width": 832, - "height": 1216, - "hash": "U6CiN{5R02%13FxDNe%103=v~B9u~ARi^0E1", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e1ddff0d-c696-4c48-a6e1-de3ee1b5bd98/original=true/77987557.jpeg", - "nsfwLevel": 2, - "width": 832, - "height": 1216, - "hash": "UAD+3u0M57%2yXM|9u~B0e=_-CJ7NFkCRP9t", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/df51612d-fe17-4db6-84e8-7ff755eea3ad/original=true/77987551.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UaC~JaJ+T1%N?dSgT0x^tmSNkDxutRf5SKs,", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bcb58176-64e5-4fe9-93fc-6f0d12997cbe/original=true/77987568.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UBF58Uxu02nO0yae=_R*0J%M~BWBxcRkENIo", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1823346" - }, - { - "id": 1823398, - "index": 14, - "name": "4.1-Q4_K_S-gguf", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-05-23T08:47:19.326Z", - "publishedAt": "2025-06-07T09:30:03.233Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 29, - "covered": false, - "stats": { - "downloadCount": 1384, - "thumbsUpCount": 36, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1723920, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_41Q4KSGguf.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-05-23T09:17:28.624Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "0835B3EE", - "AutoV2": "DCA5F71659", - "SHA256": "DCA5F71659743D159B89FE61E7FAA268033791ACD299AA9D8CF432BA9995E091", - "CRC32": "BC80F7B2", - "BLAKE3": "6DBFDCEB1D1133BE33D26765F0769907351B66BF606DAB84BD2EF6466F83BC93", - "AutoV3": "2A45FFB8700A" - }, - "downloadUrl": "https://civitai.com/api/download/models/1823398", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5381e1f9-cf3a-4772-9a76-f8e07c36b3f1/original=true/77991403.jpeg", - "nsfwLevel": 1, - "width": 832, - "height": 1216, - "hash": "ULLE4w0055%100nO_NM_58-orqkqWZWWI9NG", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/206bf336-e961-4f42-b11c-47b480bb4d44/original=true/77991514.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UAF5:NEf134Tn2_Nt5kY0eiw$Mo~004Tt8%L", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8e2ea42a-b641-412e-b232-43528c55d7e4/original=true/77991566.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UIINXHRk0gxt9sRkxsR%0fNH~Vs,^OR+xZ%1", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c5fc1cae-32db-4c9b-9667-2180787900c2/original=true/77991588.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UbL:vB%MyDRP_Nxu%gNH9ttRxFjExuogjEWA", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eac2e36a-8e99-45ed-b3a8-674394e3a4f1/original=true/77991580.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UfL|WC?btlxtuP-=xGs:kWxDw^V@v}X9Rjoe", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9f043d01-6f04-4844-955c-e7bcd2aa2fc5/original=true/77991585.jpeg", - "nsfwLevel": 1, - "width": 832, - "height": 1216, - "hash": "U9FOW50$00}S00$Ltnb_.T%Mz.4:teE2V_}[", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/70552673-6d92-46bc-a204-c375c46f33bd/original=true/77991604.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U5Hm.N.TUG?w00Vs9Z^*04Io57AI[mDN#50L", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fab0b16f-ea0d-42c9-8ef5-2e5803ab12b0/original=true/77991595.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UAIgS}%K9?-n.QNas8%10g=^02Ip}l-TIvI?", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/406eecc6-e575-4c62-911f-86b4047647dd/original=true/77991596.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UKFiMbtRP2x]oI%N%NW9~WWYD%o#4:xu$,RP", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/79cdab5e-b73c-46bf-829e-55ff0c0a5d5c/original=true/77991584.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "USHT:I-mozE3~U?Fs-M|~9OEt6M|%MxCtRRk", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/34686266-b230-45d0-890d-ddea92dee2ee/original=true/77991581.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UH9se~r;AZg4CAaw-Bog%OfPNGoLXBofr=jY", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/471ce8d4-eacd-4d6c-ba52-b46b415a1fd3/original=true/77991592.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "USIXmpMyNLW.9_V@$iba-Be.rra|_4RkWYR*", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/892485b0-12dc-4d1a-a879-638a4899f9b8/original=true/77991591.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UTGuUXx]tln%~pkC-;ogpIWBs,Rj4nRioLWC", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/61d8d299-3a4c-4276-b349-6315b5300c5b/original=true/77991579.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "URFr3CD+O@TK~p9Zt7tR?FD$Rjs,K6Myw|s;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/13b09ba0-1d84-4c33-aaa7-f1aba7ae8eaf/original=true/77991583.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UIH-Z0_3X--pg$5mXT%2.S~C-pELcF-p-o-U", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6a9f0370-691a-44bd-a3af-7a73e48be17b/original=true/77991582.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U5C$N4o}D|^kTKog}ooy00ni%PRj4.R%^7M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae3c48d3-0f1c-4cf0-a8d0-b5ba24286b62/original=true/77991589.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "ULHA-NNYL3-6Pqwa%3bXJqR%S$V@s8IpE1Ny", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c4c7cfe4-1ada-4d6f-ae8e-21f0d05be472/original=true/77991590.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UDLpv_R4B-_N_LVX?at601%g?b-nMwkr-B%0", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ef5e9f2a-a2eb-49a1-a0e2-a0f70a394323/original=true/77991587.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UDHU?]00Byrwpir_S0s;_LMxD*k89Zt7^,S1", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a471f54f-78c8-4a1e-a37a-9ad0fc97eb69/original=true/77991586.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UAHK979vClx]0LRi0K%20N={-o}@D%Fz-6OY", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1823398" - }, - { - "id": 1700814, - "index": 15, - "name": "4.0-dev-fp8", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-04-23T22:46:09.774Z", - "publishedAt": "2025-05-08T23:03:03.148Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 25, - "description": "A new and improved version.
Huge thanks to alcaitiff and their Mystic XXX LoRA!
", - "covered": false, - "stats": { - "downloadCount": 3444, - "thumbsUpCount": 178, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1601665, - "sizeKB": 11786359.56835938, - "name": "fluxedUpFluxNSFW_40DevFp8.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-04-23T23:10:34.603Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "8170BD31", - "AutoV2": "76AF76192F", - "SHA256": "76AF76192F80AAC246FE13901285F7BF2A47572858AB09BA38CF98215BC2BF2D", - "CRC32": "4EE291E6", - "BLAKE3": "A03D3B0550DF3DD3E149650D591FE9CC02C19E31A15B0CD4A833C09095D823EB", - "AutoV3": "BE7133AE4A74" - }, - "downloadUrl": "https://civitai.com/api/download/models/1700814", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/06902ebe-637c-42e6-97e7-6e273277f5f7/original=true/71929479.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UfJjoTk6s.t7.7XVRjWAu6ads-s;tmsot7R*", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f49e5416-a5a3-40d2-bb86-89273c77eeab/original=true/71929756.jpeg", - "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UEJsCBOs%3}@02KO0LRk0#r=^jWZ0Kv~^iRi", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/097ae674-1168-4ed2-89df-2db4a051e135/original=true/71929757.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UHIX,Ux^OEoLyZkr%3xaF}R-#jxatmNGNGs.", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ea0a4e09-d71c-4bc6-aa24-0063b413ebc9/original=true/71929758.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U8H^q%~p009Z00IUELNb00M{~AofIoa}V[s8", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ccb5f423-75cf-4e0e-9fdb-87eadceff999/original=true/71929759.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9KTDDsV}[RP00s:v}sk0?V]OVxtmlM|kpR%", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ce721b54-a128-4327-ba6f-7b435d785ffe/original=true/71929760.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UROfx{xv*0r=VrogkXM_NHoLVrR%Vsj[tRV@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eb39d2db-6ec4-44b7-9de8-d779b86fbf1c/original=true/71929761.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U9IX1}_10L~W00Io=_ROEM%L^js:JUxZMyS$", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b6fff977-a5fa-4f74-a59e-7026dd6c994f/original=true/71929765.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UTK^Nj%g%gxG~Vg3tRR-58xa%1M|sRtSkDaK", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/534e3930-2452-4eb1-ac70-2ac2eb1507ba/original=true/71929767.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "ULFqg;=;N3~9R%EMnhW;56S%-nIqRkxCogn$", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2954da61-b438-41ae-a48c-3bfc699f5736/original=true/71929763.jpeg", - "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U8Lo$dkWFx}sUaIoE2,:03aK~B-90iRix[V[", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dacaf556-b39a-430a-a883-300c7efa3225/original=true/71929762.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UAGS7H-{??-39WScNEIV00-swOtTxDakD*i^", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d7b2e3bf-5528-411f-b355-671f9bd2c94d/original=true/71929768.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6EfTiRj?b9F~qof?bRj00ofM{-;00M{9F%L", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5614b9e5-9e5e-4c33-b3e3-a0ecf1c62447/original=true/71929769.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UGI:,[~B0eRlm~EKxdWB0nIq$zozInNaRhxZ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e2139feb-a0c9-4a0f-a9cd-c57f952267ac/original=true/71929770.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U8I;-a~q6-%Mm,E1JCNH9YRj~U?btRR+WWIo", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1dadf83b-0729-4b14-ac16-d8c890fc22c2/original=true/71929771.jpeg", - "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UILMCk^O~B-oxU-pxZs+S%MxRj?G9sV]WVEL", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0d67ea00-1c43-402f-9d1c-88d8d3ee0d60/original=true/71929772.jpeg", - "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U9Km9C~q00D*1ISh0fjXX,sA_3^*0fxa?ER.", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a5cb93c-e077-42e9-ac6b-1bf88d025ccf/original=true/71929766.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UCJi|W~q?HeT0~M|IoSh0gV@xt%L9uIn9vV@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7e737c1a-28aa-4fd2-ab41-7e5b2940b333/original=true/71929764.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFI;O]kiFtxn5QW,9[E19vM{~BxuT0xDNxM{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/80029426-f316-489a-b5b7-53616ab9a95e/original=true/71929773.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UqKn0jX9tRxu.Tt8WCjZ%gadV@Rj-;V@s.of", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b6a2bcd7-f9b2-43a5-a8e7-12d7786e4b9e/original=true/71929485.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UEG*Qk~40fI.0Jx_EjEg5]rp}=xaMwE3%3s,", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1700814" - }, - { - "id": 1731840, - "index": 16, - "name": "4.0-Q8_0-gguf", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-05-01T12:05:28.896Z", - "publishedAt": "2025-05-16T12:22:04.178Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 15, - "covered": false, - "stats": { - "downloadCount": 986, - "thumbsUpCount": 52, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1632472, - "sizeKB": 12418879.15625, - "name": "fluxedUpFluxNSFW_40Q80Gguf.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-05-01T12:28:51.353Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "DA46C701", - "AutoV2": "DAA2FFAAA5", - "SHA256": "DAA2FFAAA54C7C05C4A212112D0B04392AE65ADACAFA90F56AE1369E01BFAF29", - "CRC32": "11E3BAB8", - "BLAKE3": "C99E5F3313360730FAB0BF6B9A7091A045B25F1B5F1AEEDD16FFABE5D1EF117F", - "AutoV3": "8239B5728A7A" - }, - "downloadUrl": "https://civitai.com/api/download/models/1731840", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8d19e755-8c5c-41f5-a6d6-d6a853a6fbc6/original=true/73486467.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UOIOCJ?w.9x]%$DiD%M{TzM|xEs,-?ozaykD", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c6512045-f38b-41ba-85c4-ace0dd0b6c0e/original=true/73486503.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UNJtM4XTXnnQTyxpRPRP*Jofj?bJ%Lt7IpIq", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/351ed82c-0b4c-4cff-b25e-3ee3e7167f15/original=true/73486537.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UFJ6~U+s0*w]5D=rt8WB4o={-UNH~9%3=sNc", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/91303248-fe88-4958-ac1b-9e331bb4af49/original=true/73486549.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UAI:|E_NYRS#00Dhvx4.00%L%h^+#N?Hw^S$", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/37f59fb3-ad39-476e-9958-6f97398a965e/original=true/73486547.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UAJ7RI^+H;xt00xu0*?a00Iox^IU%gs,}?xu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fcd67d4e-0e7e-4ceb-abd1-f825ccc7d4f7/original=true/73486543.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UDG*KF01Nu~At7adkCRj0Lt79bR*%Nn$RjE2", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3acabdd6-a32d-4f25-b067-4c097ce047af/original=true/73486535.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U8G*A_4n00Ki0-IVxV~W?vI.+]%3_MRi4oM{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9a29e1ff-c125-475e-83ab-18a124c39e17/original=true/73486545.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UCD+e_g4I;~COtD%Dhs:01aJivT0^+WAIpI@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d3f89050-8977-421d-b261-deecc69da535/original=true/73486534.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U9JZ[4_N02Zg_4%f^*Dj00I9-;x]4Tmkt7Xn", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6b1fba8c-b4fd-4550-a6ee-7ac25442533a/original=true/73486548.jpeg", - "nsfwLevel": 2, - "width": 832, - "height": 1216, - "hash": "UDIgG$-701Io0LE2W;M|4.RP~A-U9akC^jNb", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9d85a923-128b-4f24-84c6-b91d0ba402b9/original=true/73486546.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UGH-DPt8K6-:.T%1-pS2AcxaoyNI~Bt7jZbc", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4e33811f-0b91-49d3-bfd5-2831c21f75c4/original=true/73486554.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UDGatV~B0L%f01jE-Tni0fEMf+-U^O%1Ej9v", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3d070bc4-04e9-4cb4-bdf1-88a96bd3b094/original=true/73486550.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U5GHYk0057^i00^k=a~VG]9aXSoI|:E,I;OZ", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/930f16fc-cb8a-4995-8c49-cf7d17c7da9f/original=true/73486540.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UPH-3{WE56jX~AM|-pkCxsRjxu%1o}oMRjWB", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e0375a9f-b8ce-4149-97fb-a2807fd83a51/original=true/73486541.jpeg", - "nsfwLevel": 4, - "width": 832, - "height": 1216, - "hash": "UJFFmc?b?^ozH=RP4nay9FIUM{M{kqx]%Lxu", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/84f9fe6e-75ab-4e8f-a611-b8c3ca967ae0/original=true/73486544.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UAI|H}MKIp}=1O-:n%D%2dD%s:M|RjEjf+I;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bd4ac873-c87e-4887-a71f-40d06e7e315b/original=true/73486551.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U4Hn4{0L0}=K00?G}@^k00xaE3OWDiaK560e", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6616a7f6-20ff-43f4-b8e5-a21de04a9e32/original=true/73486539.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "URKJPsI:t6cE?^s:V@-;.SX8sA?H_3xFf6o#", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4e5b9959-5711-47b0-8dea-bb69c7df4896/original=true/73486542.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "USIX26i^WBt8.TadWBbwY6R*j[$*_3NdjZWW", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e1fa3b5d-5abe-4fc1-ba9b-31b60a08f8d7/original=true/73486536.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1344, - "hash": "UADv7s%21%xv~VS$JU%20fDi~BWCIU^+ni56", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1731840" - }, - { - "id": 1731783, - "index": 17, - "name": "4.0-Q4_K_S-gguf", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-05-01T11:43:49.370Z", - "publishedAt": "2025-05-16T12:05:10.281Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 25, - "covered": false, - "stats": { - "downloadCount": 822, - "thumbsUpCount": 34, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1632396, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_40Q4KSGguf.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-05-01T11:57:56.362Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "B79DBD09", - "AutoV2": "1A9B876216", - "SHA256": "1A9B876216A291BC9BD58040C7B9CAEDA4735381388DEA9DAB33CADDAFCE5570", - "CRC32": "EF6DF945", - "BLAKE3": "81C3D20905AD8F88EA00F51C846375C7EAF3D0AD73E478AF7CB454B35A067B4A", - "AutoV3": "87F1F72FCAFC" - }, - "downloadUrl": "https://civitai.com/api/download/models/1731783", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/92de1480-34f8-4f53-a7e0-7755f70dacf3/original=true/73484016.jpeg", - "nsfwLevel": 1, - "width": 832, - "height": 1216, - "hash": "UMI;bVE29r=_0JE3Szogu6rq#jNewrWC%NX9", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/50081408-5831-4bbb-8cac-ea15ef0aa0af/original=true/73484029.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UKID,l%j0oX80gRiNGWX9Ewt}=NFS%EnNIRO", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/47e3f65f-0b2e-4cd5-8287-fd3a80866a00/original=true/73484090.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UDK,Q*TzBC~WyD9^E1r?004TQ-M_VDD%ozxv", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3064f2d6-5036-446b-8041-61b3ce8c2fce/original=true/73484083.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "U5Fz=@}@00-U1IS#9uNH0M%1$%57AD%1RQEM", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ff694c9a-fe9d-480e-a1f4-2019d1370a05/original=true/73484080.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "URJ7XU_Npd-;PB_3%gtR9ZxExZoeD%D%RPM{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ac795b0a-bf83-4442-883c-8890f8994596/original=true/73484091.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UIHn:ByFuP~W?v?b?a%MTI?HI9E1^+W=MwIo", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/715bab01-eac2-40f1-827f-82b12c8357c6/original=true/73484095.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UGF=5X0~9]}@F|NeoejFEk=|-o9Zozt6EMt6", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/42f37794-ef7a-451e-8f30-c503ed10c8d8/original=true/73484084.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UGFYc1sDF.o{~MRlEfbu0eWF$%M_J.V[emog", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/130fc15f-6b7a-4448-9e7f-08ac84d09c92/original=true/73484094.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UBF5Bexc0NI]Oct9bcWC15adoe=_~CNw={-T", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b99bee50-ee9e-414a-8b5d-36333aaf6e5b/original=true/73484099.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UEFF1[~WO@tR?b~qx^Nd9uR*xttRVsE2$*s:", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e59a72f5-bf63-4883-9c02-e1cd2e4ae701/original=true/73484082.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UCHdv;EJ0dt50LW9x?s;C6RPD%xI~Do2$#fS", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6a4958a4-cffc-4c67-a936-366ca0459d0c/original=true/73484092.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UcJ*6fxu?^-pkXRP%2kWE2Rjs:RjS#jts;f6", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/57982549-48e6-401c-9d33-89645abdc49d/original=true/73484097.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UAI4eQ.T1NJQ0*-oOAE1004:#*w]^*.8E2x^", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4fd57393-20e6-4510-9901-04a4036185b8/original=true/73484086.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "U9K0Qh^*?^Nu000KIp4:01-o9a0M?b%1%1sm", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/62188fe2-5fb2-45e3-ba3d-f3867be5ffd1/original=true/73484098.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UCI|j=niI;5802ay%10f00%25QbF~VxZR+-o", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0b14e4ff-368e-4cfc-8c15-697be5453cc6/original=true/73484093.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UKINdR-:9]?HOsbvxuWYI;oztRE2~V%2?G-p", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/188e3a73-a3d2-45b4-ae3f-da9d38a68273/original=true/73484085.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UCJZoE?H9uxu0Lx[yCSh01niE2M{~pE2IAxt", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a2f9d9c5-ebc7-4cf9-ae61-ced1bde4240c/original=true/73484079.jpeg", - "nsfwLevel": 8, - "width": 832, - "height": 1216, - "hash": "UPHn?C-qyCIq_2xbSKWV-;t7ozxu?wtRbJWC", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ade4c4ef-f013-4575-af5f-fe91d60663d6/original=true/73484096.jpeg", - "nsfwLevel": 16, - "width": 832, - "height": 1216, - "hash": "UDH,-d?I0P$,0-WuS*-;9wIqrtIp}?xFxGsW", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e87b7044-26c7-4c6e-83d8-6c0b1b952acd/original=true/73484081.jpeg", - "nsfwLevel": 1, - "width": 832, - "height": 1216, - "hash": "UFJGyWocF{~A00^+ELo}Y5Mx$$9aVXbI={s:", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1731783" + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null }, { - "id": 1605769, - "index": 18, - "name": "3.0", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2025-03-31T21:42:41.384Z", - "publishedAt": "2025-04-15T22:13:08.433Z", - "status": "Published", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5de82f40-698c-4fa6-a3b7-e986fa2b727a/original=true/97372357.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1878933, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, "availability": "Public", - "nsfwLevel": 14, - "description": "v3: Improved bodies. Improved vaginas. Works good with LoRAs. Better steerability and control. Worse nipples, need to fix them up again in a new version.
", - "covered": false, - "stats": { - "downloadCount": 1905, - "thumbsUpCount": 126, - "thumbsDownCount": 1 + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/770a0f66-3ac4-41c3-9501-4ba016bc8428/original=true/97372365.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2248289, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031 }, - "files": [ - { - "id": 1505865, - "sizeKB": 11622603.2109375, - "name": "fluxedUpFluxNSFW_30.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-03-31T22:10:35.204Z", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "9060EB75", - "AutoV2": "48D0FF6BB2", - "SHA256": "48D0FF6BB2049DE8FBD663A2DD48196139A91CC5ED5C6274650D5EAA857AAA4C", - "CRC32": "579C19A5", - "BLAKE3": "297F674FEBEA3ECFDE9095F1B0B46483C016FF9BE18328D6AC05AD9473E65B35", - "AutoV3": "660B4D99DA40" - }, - "downloadUrl": "https://civitai.com/api/download/models/1605769", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d26a7e40-0ce2-40d7-9ccc-9687e374188c/original=true/67126006.jpeg", - "nsfwLevel": 4, - "width": 1072, - "height": 1920, - "hash": "UDIqrs=yUTM{_LD,?Zs=02NMM,V|I1xti*M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2cbed3a5-87e9-45ad-85da-21a6446be7e7/original=true/67126150.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UeK,KDMy-kxt~TM{Naof%Le-aiofS~jEt6of", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d1453cba-5dd6-4f08-ab20-82977f14a532/original=true/67125893.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UXG[1atRcFt7~Voex]oeOsWCxZWBM}flt6kC", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/739e3513-ff5b-46c9-b6e7-b4f72b5541b0/original=true/67126132.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6E1v:~B0y?G=|oz5P0f0NIo$ywI?HE2=XXT", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/00256793-c9fb-441f-9103-5c3629fa57ac/original=true/67126133.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UDJ8O,00?vx]^iDiyD%Ltmg3Djxu_N%Nx]t7", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fad06ab8-6e3b-4a27-88ac-1f92e5182143/original=true/67126134.jpeg", - "nsfwLevel": 2, - "width": 1072, - "height": 1920, - "hash": "UaIz^vNG_2xu~Uj[S3a}xtxtV@Rjt7ofn%V[", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0828fdef-157b-4cbd-90c0-1b4c2c7bf1d4/original=true/67126135.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UbJHgqpyu5bwt.%gkEof%Lrp$~ad-:obW.R*", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8a5f4cc8-9e02-4061-96c8-f4580f0b6410/original=true/67126136.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UjL;KoxY.9s9_No}X8Iox^tRROWBb^M{s:xa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e8c224ce-efb7-446e-b1ea-723cce2c352a/original=true/67126138.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UEExFfad0fn%0yxZI.NG0fM|~B%2Ejazr?X8", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e86e61f7-09df-46c2-89ea-6d652bbb42a0/original=true/97372375.mp4", + "nsfwLevel": 16, + "width": 780, + "height": 780, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3891246, + "audio": false, + "width": 780, + "height": 780, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96a89a0a-bf28-4316-bf37-d9c254890551/original=true/97372367.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2872521, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ee912e96-6686-4f82-8f2d-b8263a2ac79b/original=true/97372370.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2711504, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2fb8c4a8-35de-42c3-837c-a84cc2606778/original=true/97372371.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3288598, + "audio": false, + "width": 1080, + "height": 720, + "duration": 9.031 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "Two sexy women are giving a man a double blowjob. The man is out of frame. The view is POV.\n\nBoth women are licking and sucking the sides the penis. They move their head up and down relative to the camera. They lick the penis with their tongues and kiss the penis with their lips." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2164213" + }, + "civitai_primary_file": { + "id": 2057542, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-Double-Blowjob-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-30T12:06:13.496", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "F77E26B9", + "AutoV2": "F28F656A99", + "SHA256": "F28F656A994BB93366C97018BCB0CF4EF0C5B125AF463666C74C61D755024B4D", + "CRC32": "8A8C4D6F", + "BLAKE3": "350B7AB2ED6A50DD364D544786C2ADAC76DDD92D7EAF37633DB585E497A55DFA", + "AutoV3": "AA53370DC95D" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2164213" + }, + "id": "dl_1772663864300_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:37:44.300220+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:37:44.588191+00:00", + "end_time": "2026-03-04T22:37:53.567272+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2183388", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-FaceDownAssUp-LOW-v1.safetensors", + "num_connections": 1, + "known_size": 613516752, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/1929094?modelVersionId=2183388", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-FaceDownAssUp-LOW-v1.safetensors", + "model_name": "WAN 2.2 I2V - Face Down Ass Up", + "version_name": "LOW v1.0", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9f9bf591-6396-4327-8a96-93e0ff41ffc9/original=true/98439026.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 1929094, + "civitai_version_id": 2183388, + "civitai_file_id": 2076462, + "civitai_model_info": { + "id": 1929094, + "name": "WAN 2.2 I2V - Face Down Ass Up", + "description": "This lora was trained on clips of the face-down ass-up position, mostly shot from the front and sides. It is focused on the woman's face, breast, and hand movements.
There are 2-3 clips of penetration in the dataset so combined with the general NSFW lora it can probably do POV/behind angle, but by itself it's not good at penetration.
", + "allowNoCredit": true, + "allowCommercialUse": "{RentCivit,Rent}", + "allowDerivatives": true, + "allowDifferentLicense": true, + "type": "LORA", + "minor": false, + "sfwOnly": false, + "poi": false, + "nsfw": true, + "nsfwLevel": 60, + "availability": "Public", + "userId": 8910933, + "cosmetic": null, + "supportsGeneration": true, + "stats": { + "downloadCount": 17955, + "thumbsUpCount": 658, + "thumbsDownCount": 1, + "commentCount": 11, + "tippedAmountCount": 4100 + }, + "creator": { + "username": "TwoMoreLurker", + "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg" + }, + "tags": [ + "face down ass up", + "action", + "doggystyle", + "top down bottom up" + ], + "modelVersions": [ + { + "id": 2183383, + "index": 0, + "name": "HIGH v1.0", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-09-05T01:25:30.266Z", + "publishedAt": "2025-09-05T02:17:49.694Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 9767, + "thumbsUpCount": 629, + "thumbsDownCount": 1 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8a663620-dbf6-4617-945d-06f6b277eb3d/original=true/67126161.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UJEo6{yE%N%f~W-;b_xu5S?G%2s:5Ss:-VNb", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "id": 2076459, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-05T01:31:14.030Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "6744A64E", + "AutoV2": "D2997425C4", + "SHA256": "D2997425C4FBA6C3A3AB89E9C558CBC5F46F770E1D91D550BA5D5CDF066A857C", + "CRC32": "50674F64", + "BLAKE3": "A29D25B2C98EF9AEA2B037DB31BEB386C31FC60C705589E21C3B64B4DE229E25", + "AutoV3": "214F2D48CFE3" + }, + "downloadUrl": "https://civitai.com/api/download/models/2183383", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1f09d554-71e0-46d6-812e-15fae205703c/original=true/67126160.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b9145e9f-0ad5-4446-af2f-056b2d2b8bc0/original=true/98438677.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UGGQtR-o%}-U~oR.x]n,NbRksoI;$Kt3r;s.", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f19ebba6-4705-4ffd-8749-ccd3cfd8264c/original=true/67126165.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "U5GQ%%~C000L00r=}[Nb00R.~Bn%^kIo$x=|", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bcdbabdb-9873-4d1e-bfc1-4d044ad981b7/original=true/67126189.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "U8Hn4^-;00Md5jOYo}V@00$*~C-pD%-AI[I:", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6205,12 +1226,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c881ed72-acf6-4bcf-b128-66e39731d832/original=true/67126193.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UKK,{Uxu?^_40LE19Gs:0~i^Mdae%g%2%2tS", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/60479086-d5ff-46e1-b967-50ddc83ab7fe/original=true/98438695.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6219,12 +1240,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/05f1b423-059e-4660-9d29-89921ccbd1b5/original=true/67126195.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca71e691-fbaa-4745-b427-2b48a155e92c/original=true/98438679.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UMED3+to6ms:VXtnIon$Aotn#RjZPEo~$*WB", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6233,12 +1254,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9b3e6f6f-1264-41e3-9b7a-006db5ad53cf/original=true/67126194.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UDJj#Y~C2wOB0JIpV.9a0dJU-=%Lm@9Z=_xb", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3c623b92-ef19-479f-8d01-e1add8918691/original=true/98438683.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6247,12 +1268,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a8cb164f-8d40-44b4-b99d-d991bf3b5c98/original=true/67126201.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "U7EU1l45Y$}w%hSdBM#r00:T8_VZ00+HDhW9", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3a2b8b9d-2b91-45cc-afa1-fbcff28af421/original=true/98438697.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6261,12 +1282,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/14fa17d1-d73f-4863-a67a-236be2c3132e/original=true/67126198.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UDG@[H00K+R4PAMw^+IV00~W9F-p0L_3MxOG", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe08e2b1-1010-4bb3-b7c0-a9aabdced4e8/original=true/98438713.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6275,12 +1296,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/933b4001-50ae-4e9b-b03d-9fac2355b198/original=true/67126203.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "UFEB{fHqGI00~WD%tSIU9Zt8nN-p9Z%MR5-p", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b020d5f0-804d-4192-9874-b0ff6e9c8cda/original=true/98438686.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6289,12 +1310,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f2e4e79f-c1a7-4a29-ab05-861f1bdeba0f/original=true/67126204.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d13a5c0b-5f2c-4c9d-8316-cf6177196f56/original=true/98438696.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UGI4FnK*0Pxu^+o}xvjXTe={~B$*-#=wj:M|", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6303,62 +1324,59 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/1605769" + "downloadUrl": "https://civitai.com/api/download/models/2183383" }, { - "id": 1605866, - "index": 19, - "name": "3.0-Q4-K_S-gguf", - "baseModel": "Flux.1 D", + "id": 2183388, + "index": 1, + "name": "LOW v1.0", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", - "createdAt": "2025-03-31T22:13:46.101Z", - "publishedAt": "2025-04-15T23:22:13.043Z", + "createdAt": "2025-09-05T01:27:33.378Z", + "publishedAt": "2025-09-05T02:18:41.753Z", "status": "Published", "availability": "Public", "nsfwLevel": 60, - "description": "v3: Improved bodies. Improved vaginas. Works good with LoRAs. Better steerability and control. Worse nipples, need to fix them up again in a new version.
", - "covered": false, + "covered": true, "stats": { - "downloadCount": 681, - "thumbsUpCount": 28, + "downloadCount": 8188, + "thumbsUpCount": 196, "thumbsDownCount": 0 }, "files": [ { - "id": 1505922, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_30Q4KSGguf.gguf", + "id": 2076462, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-LOW-v1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2025-03-31T22:28:43.866Z", + "scannedAt": "2025-09-05T01:31:02.232Z", "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "F35F244F", - "AutoV2": "0FDF359830", - "SHA256": "0FDF359830AF3FC2932C9DCE764A0475598872CA941BD5A549BE24324A5DCE5E", - "CRC32": "02BFDF88", - "BLAKE3": "E752BE451460B8B98A7610FE9D9898FF42010E2E85436B2E6D5C91EDCE5F33EA", - "AutoV3": "1D52761D7CA7" + "AutoV1": "949EAD36", + "AutoV2": "40318B54B0", + "SHA256": "40318B54B01A95E8F72F1FDD40BFD506B0E06007A36F961422150CEADF0691D9", + "CRC32": "8ACF920F", + "BLAKE3": "823569332B85C04ADE1AD6A5385F509CEA72840F1F157E8C14CD3805FD3597F9", + "AutoV3": "FCAEFE466AD3" }, - "downloadUrl": "https://civitai.com/api/download/models/1605866", + "downloadUrl": "https://civitai.com/api/download/models/2183388", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/56799b4c-fa9b-420e-8b50-ced59c2ac502/original=true/67140278.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "U5GtmK~W00%ND~-VWFEM000K?GIU0fEj]$s8", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9f9bf591-6396-4327-8a96-93e0ff41ffc9/original=true/98439026.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6367,12 +1385,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e87aac0e-dd1a-47c2-8564-f9b1de652889/original=true/67140112.jpeg", - "nsfwLevel": 8, - "width": 1072, - "height": 1920, - "hash": "U$KwzuIV%Mof_NoeWqofSiofM{azWXWBaeWB", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8b4e1844-3f36-4b7e-b873-053a37348b50/original=true/98439028.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6381,62 +1399,283 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/1605866" + "downloadUrl": "https://civitai.com/api/download/models/2183388" + } + ] + }, + "civitai_version_info": { + "id": 2183388, + "modelId": 1929094, + "name": "LOW v1.0", + "nsfwLevel": 60, + "createdAt": "2025-09-05T01:27:33.378Z", + "updatedAt": "2025-09-05T02:18:41.761Z", + "status": "Published", + "publishedAt": "2025-09-05T02:18:41.753Z", + "trainedWords": [], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1929094@2183388", + "stats": { + "downloadCount": 8188, + "thumbsUpCount": 196 + }, + "model": { + "name": "WAN 2.2 I2V - Face Down Ass Up", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2076462, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-05T01:31:02.232", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "949EAD36", + "AutoV2": "40318B54B0", + "SHA256": "40318B54B01A95E8F72F1FDD40BFD506B0E06007A36F961422150CEADF0691D9", + "CRC32": "8ACF920F", + "BLAKE3": "823569332B85C04ADE1AD6A5385F509CEA72840F1F157E8C14CD3805FD3597F9", + "AutoV3": "FCAEFE466AD3" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2183388" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9f9bf591-6396-4327-8a96-93e0ff41ffc9/original=true/98439026.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2551669, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null }, { - "id": 1466679, - "index": 20, - "name": "2.5", - "baseModel": "Flux.1 D", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8b4e1844-3f36-4b7e-b873-053a37348b50/original=true/98439028.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1373508, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2183388" + }, + "civitai_primary_file": { + "id": 2076462, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-05T01:31:02.232", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "949EAD36", + "AutoV2": "40318B54B0", + "SHA256": "40318B54B01A95E8F72F1FDD40BFD506B0E06007A36F961422150CEADF0691D9", + "CRC32": "8ACF920F", + "BLAKE3": "823569332B85C04ADE1AD6A5385F509CEA72840F1F157E8C14CD3805FD3597F9", + "AutoV3": "FCAEFE466AD3" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2183388" + }, + "id": "dl_1772663847087_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:37:27.087687+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:37:27.548345+00:00", + "end_time": "2026-03-04T22:37:40.152405+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2183383", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-FaceDownAssUp-HIGH-v1.safetensors", + "num_connections": 1, + "known_size": 613516752, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/1929094/wan-22-i2v-face-down-ass-up", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-FaceDownAssUp-HIGH-v1.safetensors", + "model_name": "WAN 2.2 I2V - Face Down Ass Up", + "version_name": "HIGH v1.0", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b9145e9f-0ad5-4446-af2f-056b2d2b8bc0/original=true/98438677.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 1929094, + "civitai_version_id": 2183383, + "civitai_file_id": 2076459, + "civitai_model_info": { + "id": 1929094, + "name": "WAN 2.2 I2V - Face Down Ass Up", + "description": "This lora was trained on clips of the face-down ass-up position, mostly shot from the front and sides. It is focused on the woman's face, breast, and hand movements.
There are 2-3 clips of penetration in the dataset so combined with the general NSFW lora it can probably do POV/behind angle, but by itself it's not good at penetration.
", + "allowNoCredit": true, + "allowCommercialUse": "{RentCivit,Rent}", + "allowDerivatives": true, + "allowDifferentLicense": true, + "type": "LORA", + "minor": false, + "sfwOnly": false, + "poi": false, + "nsfw": true, + "nsfwLevel": 60, + "availability": "Public", + "userId": 8910933, + "cosmetic": null, + "supportsGeneration": true, + "stats": { + "downloadCount": 17955, + "thumbsUpCount": 658, + "thumbsDownCount": 1, + "commentCount": 11, + "tippedAmountCount": 4100 + }, + "creator": { + "username": "TwoMoreLurker", + "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg" + }, + "tags": [ + "face down ass up", + "action", + "doggystyle", + "top down bottom up" + ], + "modelVersions": [ + { + "id": 2183383, + "index": 0, + "name": "HIGH v1.0", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", - "createdAt": "2025-02-26T23:31:27.890Z", - "publishedAt": "2025-03-12T16:55:42.316Z", + "createdAt": "2025-09-05T01:25:30.266Z", + "publishedAt": "2025-09-05T02:17:49.694Z", "status": "Published", "availability": "Public", - "nsfwLevel": 15, - "description": "Improved female nudity and slight improvement to male + female simultaneous characters. But still nowhere near working.
", - "covered": false, + "nsfwLevel": 60, + "covered": true, "stats": { - "downloadCount": 3143, - "thumbsUpCount": 225, + "downloadCount": 9767, + "thumbsUpCount": 629, "thumbsDownCount": 1 }, "files": [ { - "id": 1368090, - "sizeKB": 11622613.65625, - "name": "fluxedUpFluxNSFW_25.safetensors", + "id": 2076459, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-HIGH-v1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2025-02-27T01:17:31.395Z", + "scannedAt": "2025-09-05T01:31:14.030Z", "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "E5CD4F92", - "AutoV2": "6C822BC300", - "SHA256": "6C822BC3003BE33DCA08639A355F2D7C095BCC17D261A6C6D02E2E631D777527", - "CRC32": "F2FA6185", - "BLAKE3": "1DD0E9F1C9439777AF025F0F544C121089501AAD6C9566C4D82B36C648543589", - "AutoV3": "A2446CA08707" + "AutoV1": "6744A64E", + "AutoV2": "D2997425C4", + "SHA256": "D2997425C4FBA6C3A3AB89E9C558CBC5F46F770E1D91D550BA5D5CDF066A857C", + "CRC32": "50674F64", + "BLAKE3": "A29D25B2C98EF9AEA2B037DB31BEB386C31FC60C705589E21C3B64B4DE229E25", + "AutoV3": "214F2D48CFE3" }, - "downloadUrl": "https://civitai.com/api/download/models/1466679", + "downloadUrl": "https://civitai.com/api/download/models/2183383", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/93729bc3-c1ee-40bd-921b-2851f91f910c/original=true/60323625.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b9145e9f-0ad5-4446-af2f-056b2d2b8bc0/original=true/98438677.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/60479086-d5ff-46e1-b967-50ddc83ab7fe/original=true/98438695.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UMKJoV~VEN-p_4-;%2ShAw9]Rj-oxu-VRjNG", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6445,12 +1684,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8bb797cf-e425-4c4a-9856-84a8e0fa06f3/original=true/60323691.jpeg", - "nsfwLevel": 1, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca71e691-fbaa-4745-b427-2b48a155e92c/original=true/98438679.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UDHA^L?GM^R%^*%1nNt5~An~o}%100Iob_W=", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6459,12 +1698,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4169edfe-8a9c-492f-9fd6-ac375f764004/original=true/60323715.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3c623b92-ef19-479f-8d01-e1add8918691/original=true/98438683.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UNJ6yf^j0gI;0LWBIp9uNcRkRk%1~Aofxas.", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6473,12 +1712,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7e04a0cf-1e13-47f3-a14e-ba64b3754a68/original=true/60323723.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3a2b8b9d-2b91-45cc-afa1-fbcff28af421/original=true/98438697.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UPI}x6-=giw]~qbIo~aJIoRijERjT1n$r=X9", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6487,12 +1726,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/76b27c60-f8ed-4052-8c17-f6868276983a/original=true/60323703.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe08e2b1-1010-4bb3-b7c0-a9aabdced4e8/original=true/98438713.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UHB.+G%1EgI@~AjZIpNdoyNGaKt6JAR*slxa", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6501,12 +1740,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ada703e0-f4a4-452f-ab66-ca54a017808b/original=true/60323709.jpeg", - "nsfwLevel": 1, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b020d5f0-804d-4192-9874-b0ff6e9c8cda/original=true/98438686.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "U58|6H$24.OY={V@sAt757n%}@NH9ukWoe$M", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6515,12 +1754,73 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c686cd52-f53e-4496-bc76-eccdbcdcadc2/original=true/60323706.jpeg", - "nsfwLevel": 1, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d13a5c0b-5f2c-4c9d-8316-cf6177196f56/original=true/98438696.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2183383" + }, + { + "id": 2183388, + "index": 1, + "name": "LOW v1.0", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-09-05T01:27:33.378Z", + "publishedAt": "2025-09-05T02:18:41.753Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 8188, + "thumbsUpCount": 196, + "thumbsDownCount": 0 + }, + "files": [ + { + "id": 2076462, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-05T01:31:02.232Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "949EAD36", + "AutoV2": "40318B54B0", + "SHA256": "40318B54B01A95E8F72F1FDD40BFD506B0E06007A36F961422150CEADF0691D9", + "CRC32": "8ACF920F", + "BLAKE3": "823569332B85C04ADE1AD6A5385F509CEA72840F1F157E8C14CD3805FD3597F9", + "AutoV3": "FCAEFE466AD3" + }, + "downloadUrl": "https://civitai.com/api/download/models/2183388", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9f9bf591-6396-4327-8a96-93e0ff41ffc9/original=true/98439026.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "USF;sA-okV%1~AR*SeWCIpIps:WCJRWBxGs:", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6529,26 +1829,450 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c2825e6b-9535-4b74-89d1-52f7e61ceafb/original=true/60323714.jpeg", - "nsfwLevel": 8, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8b4e1844-3f36-4b7e-b873-053a37348b50/original=true/98439028.mp4", + "nsfwLevel": 16, "width": 1080, - "height": 1920, - "hash": "UOHml~Xj0#$y?19tI;s*w$R$xaRj==R%WDs:", - "type": "image", + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2183388" + } + ] + }, + "civitai_version_info": { + "id": 2183383, + "modelId": 1929094, + "name": "HIGH v1.0", + "nsfwLevel": 60, + "createdAt": "2025-09-05T01:25:30.266Z", + "updatedAt": "2025-09-05T02:17:49.042Z", + "status": "Published", + "publishedAt": "2025-09-05T02:17:49.694Z", + "trainedWords": [], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1929094@2183383", + "stats": { + "downloadCount": 9767, + "thumbsUpCount": 629 + }, + "model": { + "name": "WAN 2.2 I2V - Face Down Ass Up", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2076459, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-05T01:31:14.03", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "6744A64E", + "AutoV2": "D2997425C4", + "SHA256": "D2997425C4FBA6C3A3AB89E9C558CBC5F46F770E1D91D550BA5D5CDF066A857C", + "CRC32": "50674F64", + "BLAKE3": "A29D25B2C98EF9AEA2B037DB31BEB386C31FC60C705589E21C3B64B4DE229E25", + "AutoV3": "214F2D48CFE3" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2183383" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b9145e9f-0ad5-4446-af2f-056b2d2b8bc0/original=true/98438677.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1172431, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "thumbnailFrame": 2, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/60479086-d5ff-46e1-b967-50ddc83ab7fe/original=true/98438695.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2556421, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca71e691-fbaa-4745-b427-2b48a155e92c/original=true/98438679.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1437947, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.531, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3c623b92-ef19-479f-8d01-e1add8918691/original=true/98438683.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1326917, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3a2b8b9d-2b91-45cc-afa1-fbcff28af421/original=true/98438697.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2333653, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe08e2b1-1010-4bb3-b7c0-a9aabdced4e8/original=true/98438713.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1402733, + "audio": false, + "width": 1080, + "height": 720, + "duration": 6.531, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b020d5f0-804d-4192-9874-b0ff6e9c8cda/original=true/98438686.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1373508, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d13a5c0b-5f2c-4c9d-8316-cf6177196f56/original=true/98438696.mp4", + "nsfwLevel": 16, + "width": 1080, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2551669, + "audio": false, + "width": 1080, + "height": 720, + "duration": 5.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is having sex with a man in the face-down ass-up position. She is having sex with a man in the top-down bottom-up position. The man is mostly out of frame, with his hands on her hips. They are having rough, intense sex.\n\nThe view is a fixed third-person view. The video focuses on her face. Her body is bouncing back and forth roughly due to the man's thrusts. \nShe moans and screams loudly. Her eyes roll up as she experiences a screaming orgasm." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2183383" + }, + "civitai_primary_file": { + "id": 2076459, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-FaceDownAssUp-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-05T01:31:14.03", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "6744A64E", + "AutoV2": "D2997425C4", + "SHA256": "D2997425C4FBA6C3A3AB89E9C558CBC5F46F770E1D91D550BA5D5CDF066A857C", + "CRC32": "50674F64", + "BLAKE3": "A29D25B2C98EF9AEA2B037DB31BEB386C31FC60C705589E21C3B64B4DE229E25", + "AutoV3": "214F2D48CFE3" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2183383" + }, + "id": "dl_1772663839837_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:37:19.837885+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:37:20.044206+00:00", + "end_time": "2026-03-04T22:37:31.277517+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2511593", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors", + "num_connections": 1, + "known_size": 306807976, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/2231076?modelVersionId=2511593", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors", + "model_name": "WAN 2.2 I2V - Teasing Sensual Blowjob", + "version_name": "LOW v1.0", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9c3c3187-e86e-4a4b-a3d1-4d0a6f27ae57/original=true/114160317.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 2231076, + "civitai_version_id": 2511593, + "civitai_file_id": 2399492, + "civitai_model_info": { + "id": 2231076, + "name": "WAN 2.2 I2V - Teasing Sensual Blowjob", + "description": "This lora is trained on POV clips of women performing gentle teasing acts with their mouths & tongues on their partner's penis. Generally there is lots of glans licking/kissing, some shaft licking, and light sucking on the tip. It adds a lot of eye contact and makes the woman smile a lot.
There is very little actual fellatio in the dataset, so if you want her to actually put it in her mouth you'll want to combo it with another blowjob lora. I've tested it with my Combo Handjob Blowjob lora and it works quite well to have her tease the tip a bit before the actual sucking.
I got very lazy when captioning the dataset so there are not specific keywords for specific acts, you'll have to play around a bit with your prompt. Here are some examples:
sensualBJ. She sucks and kisses the penis.sensualBJ. She licks the tip of the penis before opening her mouth to take the head inside.sensualBJ. She is sliding her mouth down the shaft of the penis with her tongue extended. sensualBJ. She is licking the shaft of the penis with long, deliberate strokes of her tongue.",
+ "allowNoCredit": true,
+ "allowCommercialUse": "{Image,RentCivit,Rent,Sell}",
+ "allowDerivatives": true,
+ "allowDifferentLicense": true,
+ "type": "LORA",
+ "minor": false,
+ "sfwOnly": false,
+ "poi": false,
+ "nsfw": true,
+ "nsfwLevel": 60,
+ "availability": "Public",
+ "userId": 8910933,
+ "cosmetic": null,
+ "supportsGeneration": true,
+ "stats": {
+ "downloadCount": 21046,
+ "thumbsUpCount": 748,
+ "thumbsDownCount": 0,
+ "commentCount": 19,
+ "tippedAmountCount": 1030
+ },
+ "creator": {
+ "username": "TwoMoreLurker",
+ "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg"
+ },
+ "tags": [
+ "action",
+ "fellatio",
+ "blowjob"
+ ],
+ "modelVersions": [
+ {
+ "id": 2511581,
+ "index": 0,
+ "name": "HIGH v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "createdAt": "2025-12-17T10:32:49.116Z",
+ "publishedAt": "2025-12-17T10:38:31.596Z",
+ "status": "Published",
+ "availability": "Public",
+ "nsfwLevel": 60,
+ "trainedWords": [
+ "sensualBJ"
+ ],
+ "covered": true,
+ "stats": {
+ "downloadCount": 11060,
+ "thumbsUpCount": 697,
+ "thumbsDownCount": 0
+ },
+ "files": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/22b9e8bd-a74a-4c19-a123-4e435e62e732/original=true/60323711.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UQL3_hOYJ%oy_NxttRs,IA%2xaI;M|j^-pt8",
- "type": "image",
+ "id": 2399476,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-12-17T10:35:43.491Z",
+ "metadata": {
+ "format": "SafeTensor"
+ },
+ "hashes": {
+ "AutoV1": "17805615",
+ "AutoV2": "04DB455E72",
+ "SHA256": "04DB455E724A8BC5BA26C0D960591A077EB14AE521E93F6087242CEBB72DA226",
+ "CRC32": "839C6449",
+ "BLAKE3": "BA880E84856F23FB3F6C4A9E7ADA2F12D1120B8C57095DC5E6ED3706F72AD4AF",
+ "AutoV3": "0C86EAFCD915"
+ },
+ "downloadUrl": "https://civitai.com/api/download/models/2511581",
+ "primary": true
+ }
+ ],
+ "images": [
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/11554049-e7fb-4298-8f9e-9f377fbb23f9/original=true/114159973.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6557,12 +2281,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2d201c0f-9fff-4969-80db-88ebde9a1480/original=true/60323712.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UYH,@dxt~UjZ-payxtt6S#M|xZoy%Lt6xtj[",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/13439a4c-f960-4c2a-8eb0-37c117fce65c/original=true/114159972.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6571,12 +2295,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b9e07807-b527-4d5a-864a-3488b9858eae/original=true/60323704.jpeg",
- "nsfwLevel": 2,
- "width": 1080,
- "height": 1920,
- "hash": "UnN]@D-p?vR*?wWXxuj[D$V@IAs.%2ozM{Rk",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eb5d2ea3-c2ec-495a-b3f9-2fae4f241ba8/original=true/114159971.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6585,12 +2309,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/221b6e8c-4f36-43c5-a4ec-ed0dcdc1b7ad/original=true/60323718.jpeg",
- "nsfwLevel": 4,
- "width": 1080,
- "height": 1920,
- "hash": "U:K1Bv-;t7Rj~ptSbIaexubIayxZRPWBRkof",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5b594205-8f33-44aa-9f99-e33577b6f526/original=true/114159969.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6599,12 +2323,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d1173629-93a9-4047-a700-b7c33973a10a/original=true/60323705.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UiG95C.8tRof-;oeofj[_Nt7ofj[?boLR*Rj",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3e9bdf53-f9b0-4181-b4f2-d239fe73512c/original=true/114159964.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6613,12 +2337,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2727e375-8415-4ef5-9c62-829e4aac45bb/original=true/60323716.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U8D9O?OH01pw04=^=;VY}}0MD=xV9Z^*?vI@",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e71c7004-3769-4b5f-972d-b01d0ddcc8cd/original=true/114159974.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6627,12 +2351,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c6082fd1-0891-4c74-bb48-564f673b6191/original=true/60323722.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UEG*{d-;80kX4Ts*MHV?1-WX=]oLK8WFjFS%",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/05fd47e0-f96b-4ed3-8d75-7a38a18c6e7a/original=true/114159968.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6641,12 +2365,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1ba935fe-a5c6-4230-9899-936521184c6d/original=true/60323713.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UFHK,|=yuOIB.ler%et9K1IUxZtS%gM{xZWB",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae882d7c-6a91-4d20-9499-a40ff0a586a6/original=true/114159963.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6655,12 +2379,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c9e23f49-4eb0-4445-8ada-af9288afcbec/original=true/60323717.jpeg",
- "nsfwLevel": 4,
- "width": 1080,
- "height": 1920,
- "hash": "UoGbxH%MM{-;~qxuRj%M-;xuRjfk-;xuRjWB",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4347bd1-f723-490f-b5f4-7cbf269d3d43/original=true/114159967.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6669,12 +2393,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/de064660-b9a3-423a-a1c6-8d8082ef4232/original=true/60323707.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UTHKRq~V9^IpNbWCNGIp9aM{xaxtWBs:xZR+",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b1a14627-a5c8-4164-b60e-67e967e62b45/original=true/114159966.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6683,12 +2407,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8b456a94-7ba2-45e3-ae18-f0511513120d/original=true/60323708.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UFK,y.,._N_2P;V?xv%ga#I?01OF^%x]$LD*",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e7e66a78-23c9-4e2d-b1c9-a74492d0ad1a/original=true/114159970.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6697,12 +2421,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a284741c-274a-48fb-9b54-2828fc1eaadb/original=true/60323710.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UBC~A2M|0Jt59DjYKnxaF~jY]zW.5[jF#kWX",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/caf62ea5-ad7d-403c-b6cb-61bcdf82a5c2/original=true/114159965.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6711,132 +2435,62 @@
"remixOfId": null
}
],
- "downloadUrl": "https://civitai.com/api/download/models/1466679"
+ "downloadUrl": "https://civitai.com/api/download/models/2511581"
},
{
- "id": 1537120,
- "index": 21,
- "name": "2.5-Q4_K_S-gguf",
- "baseModel": "Flux.1 D",
+ "id": 2511593,
+ "index": 1,
+ "name": "LOW v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
"baseModelType": "Standard",
- "createdAt": "2025-03-15T19:34:32.279Z",
- "publishedAt": "2025-03-30T19:54:04.161Z",
+ "createdAt": "2025-12-17T10:39:05.907Z",
+ "publishedAt": "2025-12-17T10:40:09.403Z",
"status": "Published",
"availability": "Public",
"nsfwLevel": 60,
- "description": "For use in ComfyUI.
", - "covered": false, + "trainedWords": [ + "sensualBJ" + ], + "covered": true, "stats": { - "downloadCount": 733, - "thumbsUpCount": 120, + "downloadCount": 9985, + "thumbsUpCount": 263, "thumbsDownCount": 0 }, "files": [ { - "id": 1500750, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_25Q4KSGguf.gguf", + "id": 2399492, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2025-03-30T17:29:54.005Z", + "scannedAt": "2025-12-17T10:40:51.058Z", "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "178CC7D5", - "AutoV2": "1DBDD2E04C", - "SHA256": "1DBDD2E04C2CDF4C0C63DA8906663C99C74F0A954630F95AEF2785DD7B0F8762", - "CRC32": "2F9305F9", - "BLAKE3": "26732CC3A65B6DD778E5E716255FCD335F7F9E228594FD79DDE269679B57406D", - "AutoV3": "9364A3B214BD" + "AutoV1": "9189F2C4", + "AutoV2": "38E441B252", + "SHA256": "38E441B252ECFB6F4C800CA685010046617C4B7DBBC601C4887B6628C28D4A55", + "CRC32": "74E0CEAC", + "BLAKE3": "A7C18A26DE60A9BCCB25661E87C06230353252EBBB54C6E67EC9F51C514E30E8", + "AutoV3": "EC1F4D7D5DE7" }, - "downloadUrl": "https://civitai.com/api/download/models/1537120", + "downloadUrl": "https://civitai.com/api/download/models/2511593", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4949aa9e-1a46-4ae3-8ada-0b8044232f75/original=true/63712179.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UCIDj^1HTh^+-aVXRS$,EUxus5ajEl%2kRNG", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/597d7044-6eec-4d11-80ae-ffc218478680/original=true/63712198.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9c3c3187-e86e-4a4b-a3d1-4d0a6f27ae57/original=true/114160317.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UYE2w.t7xbt8?da}V?t7PDWY%2ozE,WFIoWX", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e078712e-ff60-4960-9e05-004cb034c8e8/original=true/63712184.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UOIN%A~ABU9aIt9F9FnhTK${$+xaBWD$t,WB", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/800749b7-18fc-45e9-9e0d-4a8876ff8592/original=true/63712188.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9FDrB=x0#EMOX%10#I:0N9]}rxG]-I;^Pt6", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b3d1d01e-aeb8-4226-8b47-327f883aa553/original=true/63712203.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UeP?2Oxv*0xtxvadi_j[NdaxxDa}%gbHkDjs", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/807e1660-199b-458b-8691-799a418f0d0b/original=true/63712183.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFKmLb^jYk0L?^%M^+e-0%Nd^*n~-oxZWVIo", - "type": "image", + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -6845,40 +2499,287 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/06caf156-7ab6-4523-8031-ab7ebf5a7971/original=true/63712192.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UDJ@LBSg?w-p1PyEtSbw01.9-5x]?FVXD*M_", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5acf0174-ceee-470e-9a74-4727824fc4ca/original=true/114160319.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2511593" + } + ] + }, + "civitai_version_info": { + "id": 2511593, + "modelId": 2231076, + "name": "LOW v1.0", + "nsfwLevel": 60, + "createdAt": "2025-12-17T10:39:05.907Z", + "updatedAt": "2025-12-17T10:40:13.044Z", + "status": "Published", + "publishedAt": "2025-12-17T10:40:09.403Z", + "trainedWords": [ + "sensualBJ" + ], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:2231076@2511593", + "stats": { + "downloadCount": 9985, + "thumbsUpCount": 263 + }, + "model": { + "name": "WAN 2.2 I2V - Teasing Sensual Blowjob", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2399492, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-12-17T10:40:51.058", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "9189F2C4", + "AutoV2": "38E441B252", + "SHA256": "38E441B252ECFB6F4C800CA685010046617C4B7DBBC601C4887B6628C28D4A55", + "CRC32": "74E0CEAC", + "BLAKE3": "A7C18A26DE60A9BCCB25661E87C06230353252EBBB54C6E67EC9F51C514E30E8", + "AutoV3": "EC1F4D7D5DE7" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2511593" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9c3c3187-e86e-4a4b-a3d1-4d0a6f27ae57/original=true/114160317.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2377229, + "audio": false, + "width": 480, + "height": 720, + "duration": 6.063 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "sensualBJ\n\nShe is sliding her mouth down the shaft of the penis with her tongue extended. " + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5acf0174-ceee-470e-9a74-4727824fc4ca/original=true/114160319.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1580149, + "audio": false, + "width": 480, + "height": 720, + "duration": 6.063 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "sensualBJ\n\nShe is sliding her mouth down the shaft of the penis with her tongue extended. " + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2511593" + }, + "civitai_primary_file": { + "id": 2399492, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-12-17T10:40:51.058", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "9189F2C4", + "AutoV2": "38E441B252", + "SHA256": "38E441B252ECFB6F4C800CA685010046617C4B7DBBC601C4887B6628C28D4A55", + "CRC32": "74E0CEAC", + "BLAKE3": "A7C18A26DE60A9BCCB25661E87C06230353252EBBB54C6E67EC9F51C514E30E8", + "AutoV3": "EC1F4D7D5DE7" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2511593" + }, + "id": "dl_1772663830743_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:37:10.743805+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:37:11.024031+00:00", + "end_time": "2026-03-04T22:37:17.846842+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2511581", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors", + "num_connections": 1, + "known_size": 306807976, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/2231076/wan-22-i2v-teasing-sensual-blowjob", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors", + "model_name": "WAN 2.2 I2V - Teasing Sensual Blowjob", + "version_name": "HIGH v1.0", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/11554049-e7fb-4298-8f9e-9f377fbb23f9/original=true/114159973.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 2231076, + "civitai_version_id": 2511581, + "civitai_file_id": 2399476, + "civitai_model_info": { + "id": 2231076, + "name": "WAN 2.2 I2V - Teasing Sensual Blowjob", + "description": "This lora is trained on POV clips of women performing gentle teasing acts with their mouths & tongues on their partner's penis. Generally there is lots of glans licking/kissing, some shaft licking, and light sucking on the tip. It adds a lot of eye contact and makes the woman smile a lot.
There is very little actual fellatio in the dataset, so if you want her to actually put it in her mouth you'll want to combo it with another blowjob lora. I've tested it with my Combo Handjob Blowjob lora and it works quite well to have her tease the tip a bit before the actual sucking.
I got very lazy when captioning the dataset so there are not specific keywords for specific acts, you'll have to play around a bit with your prompt. Here are some examples:
sensualBJ. She sucks and kisses the penis.sensualBJ. She licks the tip of the penis before opening her mouth to take the head inside.sensualBJ. She is sliding her mouth down the shaft of the penis with her tongue extended. sensualBJ. She is licking the shaft of the penis with long, deliberate strokes of her tongue.",
+ "allowNoCredit": true,
+ "allowCommercialUse": "{Image,RentCivit,Rent,Sell}",
+ "allowDerivatives": true,
+ "allowDifferentLicense": true,
+ "type": "LORA",
+ "minor": false,
+ "sfwOnly": false,
+ "poi": false,
+ "nsfw": true,
+ "nsfwLevel": 60,
+ "availability": "Public",
+ "userId": 8910933,
+ "cosmetic": null,
+ "supportsGeneration": true,
+ "stats": {
+ "downloadCount": 21046,
+ "thumbsUpCount": 748,
+ "thumbsDownCount": 0,
+ "commentCount": 19,
+ "tippedAmountCount": 1030
+ },
+ "creator": {
+ "username": "TwoMoreLurker",
+ "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg"
+ },
+ "tags": [
+ "blowjob",
+ "action",
+ "fellatio"
+ ],
+ "modelVersions": [
+ {
+ "id": 2511581,
+ "index": 0,
+ "name": "HIGH v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "createdAt": "2025-12-17T10:32:49.116Z",
+ "publishedAt": "2025-12-17T10:38:31.596Z",
+ "status": "Published",
+ "availability": "Public",
+ "nsfwLevel": 60,
+ "trainedWords": [
+ "sensualBJ"
+ ],
+ "covered": true,
+ "stats": {
+ "downloadCount": 11061,
+ "thumbsUpCount": 697,
+ "thumbsDownCount": 0
+ },
+ "files": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a29f3225-168e-4efb-8610-8a2fb1e9f6e4/original=true/63712189.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UNI=PmtR63xt00tQ9aWB}]a}m+jZ%~tRxZR*",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
+ "id": 2399476,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-12-17T10:35:43.491Z",
+ "metadata": {
+ "format": "SafeTensor"
+ },
+ "hashes": {
+ "AutoV1": "17805615",
+ "AutoV2": "04DB455E72",
+ "SHA256": "04DB455E724A8BC5BA26C0D960591A077EB14AE521E93F6087242CEBB72DA226",
+ "CRC32": "839C6449",
+ "BLAKE3": "BA880E84856F23FB3F6C4A9E7ADA2F12D1120B8C57095DC5E6ED3706F72AD4AF",
+ "AutoV3": "0C86EAFCD915"
+ },
+ "downloadUrl": "https://civitai.com/api/download/models/2511581",
+ "primary": true
+ }
+ ],
+ "images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a68188b6-07b9-4420-8ce2-4a9cc0aaf1fa/original=true/63712196.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UjJt^^M{%hx^~qoJNGkCyDozM{WBx]bbadRj",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/11554049-e7fb-4298-8f9e-9f377fbb23f9/original=true/114159973.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6887,12 +2788,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/55730cc6-ca32-41d4-bae5-aab7ee38934c/original=true/63712194.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UJDb7zt7O?s.~Ubb%2snJ-WBxZWBjFnhR*R*",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/13439a4c-f960-4c2a-8eb0-37c117fce65c/original=true/114159972.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6901,12 +2802,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c2335bc2-9b49-45a2-afe9-2828da8db8ed/original=true/63712187.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UfMt2Cx].8i__NNGt8Rj.8V?IAWBxGIURjtR",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eb5d2ea3-c2ec-495a-b3f9-2fae4f241ba8/original=true/114159971.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6915,12 +2816,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f2507c50-b404-4445-a0f0-0f0dbb3aafda/original=true/63712181.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U9GtZ$9|00~A00$$^jEN0g={?GR+=^9uozs.",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5b594205-8f33-44aa-9f99-e33577b6f526/original=true/114159969.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6929,12 +2830,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ed9ff8f5-b2a0-4be6-a9bb-c98822d87728/original=true/63712186.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UdIW1as9WAxZ}usns.s.JDn$WBR,I]jZNHR,",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3e9bdf53-f9b0-4181-b4f2-d239fe73512c/original=true/114159964.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6943,12 +2844,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/577b73c4-0b88-4266-b0d1-d409ef335cc8/original=true/63712190.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UTHw[axuKkx]_NtQ%2tROYxaxZt7-;NHt6jE",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e71c7004-3769-4b5f-972d-b01d0ddcc8cd/original=true/114159974.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6957,12 +2858,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/394e09c3-3216-4b5c-b731-dc452bf6d9ee/original=true/63712197.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UWJstQ~UXQ%1xq-otPj[IVIVw|RkIVM|E2Rj",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/05fd47e0-f96b-4ed3-8d75-7a38a18c6e7a/original=true/114159968.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6971,12 +2872,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1b6bc510-cbcc-4f15-b6bf-39e4cf920707/original=true/63712195.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UIE-?ioL01t79Zt6~BWB56a}^jjt%LR*M{t6",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae882d7c-6a91-4d20-9499-a40ff0a586a6/original=true/114159963.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6985,12 +2886,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/986beefb-5570-48cc-916d-41e857d16d1e/original=true/63712185.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UHFrVE_4FzTz0=I[o$S%0MIU#Qiv$1xFk7xA",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4347bd1-f723-490f-b5f4-7cbf269d3d43/original=true/114159967.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -6999,12 +2900,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2d50e6ce-a267-44a3-8590-9dc13fccd44d/original=true/63712191.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UYF=t0%2_NtRM{WBIVbI4oV@DiNGbwofogRj",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b1a14627-a5c8-4164-b60e-67e967e62b45/original=true/114159966.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7013,12 +2914,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/819f5dd9-a28f-42b3-8c78-d43f89dbf19b/original=true/63712182.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UGFXF$s:0#oK9uoLX8kC02R*w]R*}?bH-Uaf",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e7e66a78-23c9-4e2d-b1c9-a74492d0ad1a/original=true/114159970.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7027,12 +2928,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/be143e9d-b44d-46bd-a73d-eb208b41ce24/original=true/63712193.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UnI#lis:b^t7~qoLR*kC.8j[aKbH%gofjFoL",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/caf62ea5-ad7d-403c-b6cb-61bcdf82a5c2/original=true/114159965.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7041,313 +2942,62 @@
"remixOfId": null
}
],
- "downloadUrl": "https://civitai.com/api/download/models/1537120"
+ "downloadUrl": "https://civitai.com/api/download/models/2511581"
},
{
- "id": 1305680,
- "index": 22,
- "name": "2.4",
- "baseModel": "Flux.1 D",
+ "id": 2511593,
+ "index": 1,
+ "name": "LOW v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
"baseModelType": "Standard",
- "createdAt": "2025-01-19T23:27:46.634Z",
- "publishedAt": "2025-01-27T14:22:50.246Z",
+ "createdAt": "2025-12-17T10:39:05.907Z",
+ "publishedAt": "2025-12-17T10:40:09.403Z",
"status": "Published",
"availability": "Public",
"nsfwLevel": 60,
- "covered": false,
+ "trainedWords": [
+ "sensualBJ"
+ ],
+ "covered": true,
"stats": {
- "downloadCount": 5541,
- "thumbsUpCount": 301,
- "thumbsDownCount": 1
+ "downloadCount": 9985,
+ "thumbsUpCount": 263,
+ "thumbsDownCount": 0
},
"files": [
{
- "id": 1209899,
- "sizeKB": 11786343.15429688,
- "name": "fluxedUpFluxNSFW_24.safetensors",
+ "id": 2399492,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-SensualTeasingBlowjob-LOW-v1.safetensors",
"type": "Model",
"pickleScanResult": "Success",
"pickleScanMessage": "No Pickle imports",
"virusScanResult": "Success",
"virusScanMessage": null,
- "scannedAt": "2025-01-19T23:53:37.231Z",
+ "scannedAt": "2025-12-17T10:40:51.058Z",
"metadata": {
- "format": "SafeTensor",
- "size": "pruned",
- "fp": "fp8"
+ "format": "SafeTensor"
},
"hashes": {
- "AutoV1": "442AE4F2",
- "AutoV2": "A0D576F296",
- "SHA256": "A0D576F296AACCCDFCC9DC8847D0BD70B6B10425FC7F80D399CFE0BC1EC3BA40",
- "CRC32": "DBFDBDBB",
- "BLAKE3": "EC2F2BA32EB8E65074822B911891945C3200287C650BE886C9D9C9198CCEA966",
- "AutoV3": "A041DA67B425"
+ "AutoV1": "9189F2C4",
+ "AutoV2": "38E441B252",
+ "SHA256": "38E441B252ECFB6F4C800CA685010046617C4B7DBBC601C4887B6628C28D4A55",
+ "CRC32": "74E0CEAC",
+ "BLAKE3": "A7C18A26DE60A9BCCB25661E87C06230353252EBBB54C6E67EC9F51C514E30E8",
+ "AutoV3": "EC1F4D7D5DE7"
},
- "downloadUrl": "https://civitai.com/api/download/models/1305680",
+ "downloadUrl": "https://civitai.com/api/download/models/2511593",
"primary": true
}
],
"images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5639b6f6-a389-4dfb-b948-2809aad5f944/original=true/52690044.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UWFh|*x^0zNH*0x]RiRj?b-oZ~E2?HbbM{s:",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0ec8ad71-924f-4780-9c28-29eb445fea13/original=true/52690040.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UWIXgQ_Nk=-;I;xtWBaeRjt7?bozog%Mo#of",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c9d0aeed-1127-450f-a51a-6965c4c2d162/original=true/52690041.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UaLps;_NWYiw?v%gW=RP%#xubIj[tkR6smt7",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/980e0c7c-0dd0-4f8b-9829-937b6b2da0eb/original=true/52689824.jpeg",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9c3c3187-e86e-4a4b-a3d1-4d0a6f27ae57/original=true/114160317.mp4",
"nsfwLevel": 16,
- "width": 1080,
- "height": 1920,
- "hash": "U8Du6:~B0M0Lx]kWWCIo0ME2^j}@a0Rj%1Sh",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7b928321-016e-4940-bc92-134c06746222/original=true/52689759.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UGFDx{?KKR}vcE$+$la#ATI:,[WA=|NINFsT",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c72ad69f-08b7-4892-806b-bf654119eeb7/original=true/52689905.jpeg",
- "nsfwLevel": 1,
- "width": 1080,
- "height": 1920,
- "hash": "USGt~YIAbtV].lD%NHn+%hE1xHxa-=RjsoW;",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f7674f1e-1d15-479f-a6cb-48ab14637830/original=true/52689906.jpeg",
- "nsfwLevel": 1,
- "width": 1080,
- "height": 1920,
- "hash": "UEHBrR^jysXn00-pE1D$PoIprW?H%exu~qt6",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6779d8cb-8ff6-47ba-9fa1-7f35d76b5745/original=true/52690053.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "URHKa^o}Nd%3~p-:ozW=xu?ax]R+JAtlxu$%",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a6813837-9c64-4778-94e4-3fc27d24496d/original=true/52690037.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U5B{149w9^NK~pxHS$NdX-I:,DWC-9=aS~$$",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f8a35f91-a4f0-46d8-9db1-aa648e87efd7/original=true/52690038.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UkKA~LV@.8%M?^s:%2bbX8tRIURP%Mt7jZWB",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ed1ca7ae-f9d1-42d3-bef5-6b989890a820/original=true/52690039.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UOMZN}?cngM_0LxDx]%g9FM^S%WC~px]n3i^",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6ec7332a-f30b-4234-bf5d-44dca65037bd/original=true/52690042.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UEFE=l,C%3t7~BRjV]x]RixvrXjErBtRspM{",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c03d544e-1dd1-4d49-b0e3-78d78f699b08/original=true/52690043.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UfI5D6%gXTax?^xujtWBS#xaVsM|xYt7RjRj",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/296620a8-d816-41fa-803c-2df0ceb5657c/original=true/52690046.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UIKw9K~qxy5900nfO8Xl4nIWM{D$EoV=$-Nu",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/09ab5ae0-359f-4df8-8761-5dc6bb699fdc/original=true/52690048.jpeg",
- "nsfwLevel": 1,
- "width": 1080,
- "height": 1920,
- "hash": "UIM@l,?b~q.8D%M_%MWB.9?b9Fj]_4IAWrRP",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fa3b4624-8a1a-4a8d-8751-49ba0172122e/original=true/52690050.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UVJQ_^jHt3Ri~Uxax]oK%#soaJV?%gs:MxM{",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fe612bc5-d88f-4c51-91aa-3ffdec7fd4b1/original=true/52690045.jpeg",
- "nsfwLevel": 1,
- "width": 1080,
- "height": 1920,
- "hash": "UHGlFv?vRN%ht.ozM_WY~X-;RkV@$K-;t6i^",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/221afd47-7a59-4147-b74f-52fd07a2ec47/original=true/52690051.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UGHm[e^j0gEg0gozNHE20foL$%%1~BIp-Ut7",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a3be218a-d563-443f-93de-a76e0a6a611d/original=true/52690052.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UKL:WF%MNHxu~VRj-pWBLgt7xDRj-=t7x]xu",
- "type": "image",
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7356,12 +3006,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/19dfdfd7-0836-4bd1-a153-e32d721b7221/original=true/52690057.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UAGGzz?G9^%M$fRjoLXT4n}S=x5RivwI0z56",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5acf0174-ceee-470e-9a74-4727824fc4ca/original=true/114160319.mp4",
+ "nsfwLevel": 16,
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7370,188 +3020,476 @@
"remixOfId": null
}
],
- "downloadUrl": "https://civitai.com/api/download/models/1305680"
+ "downloadUrl": "https://civitai.com/api/download/models/2511593"
+ }
+ ]
+ },
+ "civitai_version_info": {
+ "id": 2511581,
+ "modelId": 2231076,
+ "name": "HIGH v1.0",
+ "nsfwLevel": 60,
+ "createdAt": "2025-12-17T10:32:49.116Z",
+ "updatedAt": "2025-12-17T10:40:13.044Z",
+ "status": "Published",
+ "publishedAt": "2025-12-17T10:38:31.596Z",
+ "trainedWords": [
+ "sensualBJ"
+ ],
+ "trainingStatus": null,
+ "trainingDetails": null,
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "earlyAccessEndsAt": null,
+ "earlyAccessConfig": null,
+ "description": null,
+ "uploadType": "Created",
+ "usageControl": "Download",
+ "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:2231076@2511581",
+ "stats": {
+ "downloadCount": 11061,
+ "thumbsUpCount": 697
+ },
+ "model": {
+ "name": "WAN 2.2 I2V - Teasing Sensual Blowjob",
+ "type": "LORA",
+ "nsfw": true,
+ "poi": false
+ },
+ "files": [
+ {
+ "id": 2399476,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-12-17T10:35:43.491",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "17805615",
+ "AutoV2": "04DB455E72",
+ "SHA256": "04DB455E724A8BC5BA26C0D960591A077EB14AE521E93F6087242CEBB72DA226",
+ "CRC32": "839C6449",
+ "BLAKE3": "BA880E84856F23FB3F6C4A9E7ADA2F12D1120B8C57095DC5E6ED3706F72AD4AF",
+ "AutoV3": "0C86EAFCD915"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2511581"
+ }
+ ],
+ "images": [
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/11554049-e7fb-4298-8f9e-9f377fbb23f9/original=true/114159973.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 3717873,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe licks the tip of the penis before opening her mouth to take the head inside.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/13439a4c-f960-4c2a-8eb0-37c117fce65c/original=true/114159972.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 3020417,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe licks the tip of the penis before opening her mouth to take the head inside."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eb5d2ea3-c2ec-495a-b3f9-2fae4f241ba8/original=true/114159971.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 2658657,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe licks the tip of the penis before opening her mouth to take the head inside.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5b594205-8f33-44aa-9f99-e33577b6f526/original=true/114159969.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 2892030,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe sucks and kisses the penis.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3e9bdf53-f9b0-4181-b4f2-d239fe73512c/original=true/114159964.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 2905020,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe sucks and kisses the penis.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e71c7004-3769-4b5f-972d-b01d0ddcc8cd/original=true/114159974.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 2803376,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe sucks and kisses the penis.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
},
{
- "id": 1343680,
- "index": 23,
- "name": "2.4-Q4_K_S-gguf",
- "baseModel": "Flux.1 D",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/05fd47e0-f96b-4ed3-8d75-7a38a18c6e7a/original=true/114159968.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 3663518,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe is sliding her mouth down the shaft of the penis with her tongue extended. "
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae882d7c-6a91-4d20-9499-a40ff0a586a6/original=true/114159963.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 2548088,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe licks the tip of the penis before opening her mouth to take the head inside.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4347bd1-f723-490f-b5f4-7cbf269d3d43/original=true/114159967.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 3878633,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe licks the tip of the penis before opening her mouth to take the head inside.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b1a14627-a5c8-4164-b60e-67e967e62b45/original=true/114159966.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 3466697,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "sensualBJ\n\nShe sucks and kisses the penis.\n"
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2511581"
+ },
+ "civitai_primary_file": {
+ "id": 2399476,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-SensualTeasingBlowjob-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-12-17T10:35:43.491",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "17805615",
+ "AutoV2": "04DB455E72",
+ "SHA256": "04DB455E724A8BC5BA26C0D960591A077EB14AE521E93F6087242CEBB72DA226",
+ "CRC32": "839C6449",
+ "BLAKE3": "BA880E84856F23FB3F6C4A9E7ADA2F12D1120B8C57095DC5E6ED3706F72AD4AF",
+ "AutoV3": "0C86EAFCD915"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2511581"
+ },
+ "id": "dl_1772663814031_0_WAN-2.2-I2",
+ "status": "completed",
+ "added_time": "2026-03-04T22:36:54.031100+00:00",
+ "progress": 100.0,
+ "speed": 0.0,
+ "error": null,
+ "start_time": "2026-03-04T22:36:54.500945+00:00",
+ "end_time": "2026-03-04T22:36:59.574076+00:00",
+ "connection_type": "Single"
+ },
+ {
+ "url": "https://civitai.com/api/download/models/2613689",
+ "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-Grinding-Cowgirl-LOW-v1.safetensors",
+ "num_connections": 1,
+ "known_size": 306807976,
+ "api_key": "da82e3873725e824182cc021803091eb",
+ "model_url_or_id": "https://civitai.com/models/2323362?modelVersionId=2613689",
+ "model_version_id": null,
+ "custom_filename": "",
+ "force_redownload": false,
+ "filename": "WAN-2.2-I2V-Grinding-Cowgirl-LOW-v1.safetensors",
+ "model_name": "WAN 2.2 I2V - Grinding Cowgirl",
+ "version_name": "LOW v1.0",
+ "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3f842ef2-4e67-4343-9ebe-fb372d552c7c/original=true/118127828.mp4?width=256",
+ "thumbnail_nsfw_level": 16,
+ "model_type": "loras",
+ "file_precision": null,
+ "file_model_size": null,
+ "file_format": "SafeTensor",
+ "civitai_model_id": 2323362,
+ "civitai_version_id": 2613689,
+ "civitai_file_id": 2501076,
+ "civitai_model_info": {
+ "id": 2323362,
+ "name": "WAN 2.2 I2V - Grinding Cowgirl",
+ "description": "This lora is trained on POV & side view clips of women grinding their hips back and forth while riding in the cowgirl & reverse cowgirl positions, typically with their knees down on the bed/ground. The emphasis is on the back-and-forth hip grinding motion (as opposed to up-and-down bouncing)
The penis is not actually visible in a significant portion of the dataset, since generally women do this once it's fully inserted, which can lead to some weirdness if the penis isn't at least partially visible in the initial frame.
I'm not 100% satisfied with how this one turned out so I might try tweaking the dataset and trying a V2, but please give it a try and let me know your thoughts.
It was captioned with natural language. Here are some sample prompts:
She is riding the man, performing a grinding motion with her hips. She pushes her pelvis forward and pulls back rhythmically against him. She is performing a grinding motion, sliding her pelvis in a back-and-forth horizontal pattern.She is performing a slow, deliberate grinding motion with her hips. She slides her pelvis forward and pulls back in a horizontal rhythm against the man. ",
+ "allowNoCredit": true,
+ "allowCommercialUse": "{Image,RentCivit,Rent,Sell}",
+ "allowDerivatives": true,
+ "allowDifferentLicense": true,
+ "type": "LORA",
+ "minor": false,
+ "sfwOnly": false,
+ "poi": false,
+ "nsfw": true,
+ "nsfwLevel": 60,
+ "availability": "Public",
+ "userId": 8910933,
+ "cosmetic": null,
+ "supportsGeneration": true,
+ "stats": {
+ "downloadCount": 10661,
+ "thumbsUpCount": 368,
+ "thumbsDownCount": 0,
+ "commentCount": 4,
+ "tippedAmountCount": 20
+ },
+ "creator": {
+ "username": "TwoMoreLurker",
+ "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg"
+ },
+ "tags": [
+ "action"
+ ],
+ "modelVersions": [
+ {
+ "id": 2613687,
+ "index": 0,
+ "name": "HIGH v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
"baseModelType": "Standard",
- "createdAt": "2025-01-28T23:10:27.961Z",
- "publishedAt": "2025-02-12T23:30:16.947Z",
+ "createdAt": "2026-01-20T07:49:57.336Z",
+ "publishedAt": "2026-01-20T12:07:18.029Z",
"status": "Published",
"availability": "Public",
"nsfwLevel": 60,
- "description": "Q4KS-Quantized gguf version of the model.
It's a bit less stable, but can still produce some fantastic outputs.
Confirmed to work in ComfyUI.
", - "covered": false, + "covered": true, "stats": { - "downloadCount": 2099, - "thumbsUpCount": 141, - "thumbsDownCount": 1 + "downloadCount": 5639, + "thumbsUpCount": 337, + "thumbsDownCount": 0 }, "files": [ { - "id": 1500295, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_24Q4KSGguf.gguf", + "id": 2501075, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-Grinding-Cowgirl-HIGH-v1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2025-03-30T15:28:11.604Z", + "scannedAt": "2026-01-20T07:55:40.787Z", "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "E1145838", - "AutoV2": "2A57001B37", - "SHA256": "2A57001B37385C6E3FA3CDBB7496E6FD4ACA1921737F65D0591439D4FB98D53B", - "CRC32": "B4121302", - "BLAKE3": "69642CD034035F0C1A5D495885625C4D8C980DE86B6DED819120233D319631D7", - "AutoV3": "FD36447FEEEC" + "format": "SafeTensor" }, - "downloadUrl": "https://civitai.com/api/download/models/1343680", - "primary": true - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/28afbfa1-97e0-4236-8b0c-b2d371995671/original=true/54469612.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UJLDAG$LGG?G_Nrq_3EMKk9vtlNw?aM|WE-:", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4fac76b-145a-4948-bef2-df17a5615924/original=true/54469621.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UFEy6-00$#-;_NDiE1%Mr?%1afNa-pE2Rkxa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/82e771ed-35a0-4fcb-9aa7-152fade39a5e/original=true/54469651.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UdEL~,o#O]kDT#WEg4WCoJV@v|e-XSj[Rij?", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/497dc7ac-0817-451e-a4a3-d9b5d0064932/original=true/54469660.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UBH1Vr,C00EL0#D%?an$00xY~BbI0#K5DijF", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/00610d31-1718-45f9-a018-1f82d9c7e8e2/original=true/54469666.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UHH-rmOY0hv#~XxGI8J8?wNdi{wc%#RjD%V@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6dc4b7ad-340d-479b-8cdb-61b4a0071e16/original=true/54469657.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6Cr};_30LH?5+=}sqE2000K~B^+H?4.EM-;", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/851e2dd0-26bd-4063-ac65-fb8cb4de5a03/original=true/54469655.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UYF6RpQlNGbvJUg4RQaetSNFWCn%~qMwM{bI", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/75a5a338-1f4a-4205-97fd-3323cc931029/original=true/54469647.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "ULF=%3x@.kn$xkocITxu4;RlQ;R+JEV]r{Rj", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "hashes": { + "AutoV1": "3C3F48F1", + "AutoV2": "2FE55CBEDE", + "SHA256": "2FE55CBEDE8B3DD31B5F223E87A1693DBC747572ADA59C24E7986147A4F3857C", + "CRC32": "CF91BE1B", + "BLAKE3": "643B2ACDB6C8D88CC1648F09BA9FB2AADB8A609C18C092A9861B9A246E37B406", + "AutoV3": "24A8BD4C8A52" + }, + "downloadUrl": "https://civitai.com/api/download/models/2613687", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/427399b7-886e-4d44-a261-737a287e57f9/original=true/54469653.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b76c1b80-9b73-4ac6-bcc9-ac8f9ea2d5d6/original=true/118127339.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U8Hm.J0L00S^==-p0N^$00xb~WR%^i0LR.~A", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5f767489-549a-421f-b11c-8b9e9b11b339/original=true/54469667.jpeg", - "nsfwLevel": 4, - "width": 1080, - "height": 1920, - "hash": "UjK].E%fW.xZ~U%fW=WBXmt7n%V[?GNGjEoJ", - "type": "image", + "width": 720, + "height": 1080, + "hash": "UEJHgh~qc@yD?@-:tOSw9ZR+-p-;W-V?IVRj", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7560,12 +3498,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7cfeeaae-5c0d-4397-9e9d-180ad53577b4/original=true/54469648.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UVJ%g;JUAb?b_Nt6%Kx]?vt7xG%f%gxtf+X9", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1e103936-f5b7-4883-a352-86d5c6a0374e/original=true/118127588.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UNJR5I-;*0tR?uf8tQt7obM|s,R*.8M{xuV@", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7574,12 +3512,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ec4e5d96-6abe-4f2b-9db2-f626e7a53bb4/original=true/54469652.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFI4In?w5mD*00MIM{J9lVt-rXR*9FIU?bxt", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/66448e7f-b268-4aa2-af07-81d27ac281b1/original=true/118127416.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UIKn9,t8*0%f%}IUW-t69EMx?G?bozoMM{oz", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7588,12 +3526,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0d0566b6-842c-4abc-a7b2-2f68e9bed969/original=true/54469658.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3a768327-ca6c-40f2-817f-7f6fcf4d76d5/original=true/118127391.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U8HB3p-qNY-,~WjcR$bW0eIoRlRo9YxV$,s=", - "type": "image", + "width": 720, + "height": 1080, + "hash": "UIKKi@Ioysv}ypRi%LM|DO%MrqIpyENGR-Ri", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7602,12 +3540,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a800dc24-d7b1-43ba-ba46-ee320f0dd92d/original=true/54469654.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/14bede96-e19a-4614-85e6-3d31f2282f6c/original=true/118127453.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U$K^jNWCxt%L_NaykCt7.8s:a~Wqx]t7RjRj", - "type": "image", + "width": 720, + "height": 1080, + "hash": "UDJHR0~CO?tQGoOYyE%L9bt5#QIVMIn$nmIV", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7616,12 +3554,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e5f4e446-3eaa-464f-ac83-154c3422f047/original=true/54469656.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UEEy6:00x.DjY8I9xuD%?aIT%hM_xU9a-?M_", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3295a3c1-6a12-4ff9-ba64-23511758fa5d/original=true/118127589.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UHLNPm~T5nI91Fu4Dis:-:D%$jnhyDMd$$o~", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7630,12 +3568,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d38213fe-7f5e-4a89-918a-bbce112b2cc4/original=true/54469664.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UwCZ*OoLkrkD?wbItRkCyEa}t7oLtSazaejs", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/005e98d4-633c-45cc-812d-ac6800c6e57b/original=true/118127587.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "ULKnSVM_.m?vu2IAx[%LMwxvVYRP.8oyRPM|", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7644,12 +3582,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6c50b2b8-9d4a-41d7-acbd-4ab184229375/original=true/54469649.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "ULGJ8K?cuPt7lCoztlt80.IUQ,S5I^t7VskC", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e7a9dbd3-2a02-4194-9a05-41fd027e003e/original=true/118127586.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "ULLNV$AF_NIA?]S$xsjcD*#+%1E1tlV?I;xt", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7658,12 +3596,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a7cc938a-7907-4a3c-8430-de136e87b56f/original=true/54469650.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UCFFNfD%~pjc~UD*tkM|e:NK4:ozt5WBe:xa", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/83c40d16-26d3-4cd2-a7ca-ef98c8a20a30/original=true/118127693.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UaNvfD.8?^.8T0s:jFkWIAM{r?xuIAo}o}sm", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7672,12 +3610,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad2c262c-4b1e-424e-b54f-defb1366ff92/original=true/54469663.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UHFF1@?vpJ~Vi_-o-pNb56MxrWIU9aIVxZ-T", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/effe3f34-e166-44a0-b3a9-ac03aa48e2eb/original=true/118127691.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "USMivV~pggaio]%L%1M{IBM|%2ofnNIUIUo0", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7686,12 +3624,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/be5bfdcb-2d34-463d-b08b-b6ed18b1b454/original=true/54469661.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UGEC?#_NpUDjIaSxD+s:0JDOtQ%zIps:%1WA", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca09bcb4-2d88-4361-81ba-84d3459f2ba2/original=true/118127692.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UNKmtn~WJk-oOm%2ITxuR-j[-pWCE2IUD*IU", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7700,118 +3638,62 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/1343680" + "downloadUrl": "https://civitai.com/api/download/models/2613687" }, { - "id": 1227932, - "index": 24, - "name": "2.3", - "baseModel": "Flux.1 D", + "id": 2613689, + "index": 1, + "name": "LOW v1.0", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", - "createdAt": "2025-01-01T16:28:46.522Z", - "publishedAt": "2025-01-16T16:52:10.994Z", + "createdAt": "2026-01-20T07:52:02.020Z", + "publishedAt": "2026-01-20T12:07:52.684Z", "status": "Published", "availability": "Public", "nsfwLevel": 60, - "description": "Improved general stability and lots of male images trained and merged in.
The positive thing here is how stable it is for both female and males with this version.
", - "covered": false, + "trainedWords": [ + "grindingCowgirl" + ], + "covered": true, "stats": { - "downloadCount": 1699, - "thumbsUpCount": 158, - "thumbsDownCount": 1 + "downloadCount": 5022, + "thumbsUpCount": 149, + "thumbsDownCount": 0 }, "files": [ { - "id": 1133370, - "sizeKB": 11786343.34960938, - "name": "fluxedUpFluxNSFW_23.safetensors", + "id": 2501076, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-Grinding-Cowgirl-LOW-v1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2025-01-02T16:49:48.724Z", + "scannedAt": "2026-01-20T07:55:42.461Z", "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "22D69963", - "AutoV2": "EE23C1686C", - "SHA256": "EE23C1686CB6748CC0883B0CD4B6240F27EB8AEC1AB88820882BFFAB20B45CE8", - "CRC32": "345087D3", - "BLAKE3": "11E4FE6C0CDD25C20C5D6392899A09B8D24446A76B02D89C553E460271CFAE39", - "AutoV3": "14CB4E4D73B9" + "AutoV1": "417660FC", + "AutoV2": "EA4391D849", + "SHA256": "EA4391D849BE947009AFEE52E5799C111174DAC41DA11EC002EA39200106D4B9", + "CRC32": "5999899B", + "BLAKE3": "6397D6A541075F7B781D4C3D691CEAA64C8295D7F50AD8FDBE55D1563FFEA849", + "AutoV3": "BEE349CC4AB5" }, - "downloadUrl": "https://civitai.com/api/download/models/1227932", + "downloadUrl": "https://civitai.com/api/download/models/2613689", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/52729465-e065-4df8-ab90-45a4012f3f99/original=true/48924503.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9F;?KxbTKxI~Cxb%3s;00axr:of0KM{9YWA", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a8a76ab0-f50b-4b33-bdd7-2243b3256d2e/original=true/48924508.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UHD+Sb~V9Z9Z%1%2Ip9a00D%xbozIVM{xZ?G", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bdddd2b6-9d28-45ee-ab99-4d74e718af13/original=true/48924493.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UMGI4N_3_Nxvt6WBWBay4.D%MxM{x]ozoLRj", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5d77de33-a868-4326-b3fe-d83327f41540/original=true/48924510.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "ULJj}B_4%LMx.T?vtlRjH;xv.8t8bFsoxEWB", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/69e4ceca-494a-4c2b-a83d-20dfcc3c67b7/original=true/48924467.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UrJ[I+adOEW=_Nj[V@ay?ct7s:of?HofX9WV", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3f842ef2-4e67-4343-9ebe-fb372d552c7c/original=true/118127828.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UNJR5I-;*0tR?uf8tQt7obM|s,R*.8M{xuV@", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -7820,40 +3702,282 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3871b354-1aa3-4639-9484-ee06b9e604f8/original=true/48924399.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFIDp-~B0gI=0gt7NHE20MofxZ%1~UIo-Vt7", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/82bdb0ce-e8b9-4739-b938-950bb0c397f6/original=true/118127830.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UHMGeo00?]?bF0D*slRQ8wxu.SIUDOxaS5WB", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2613689" + } + ] + }, + "civitai_version_info": { + "id": 2613689, + "modelId": 2323362, + "name": "LOW v1.0", + "nsfwLevel": 60, + "createdAt": "2026-01-20T07:52:02.020Z", + "updatedAt": "2026-01-20T12:08:20.668Z", + "status": "Published", + "publishedAt": "2026-01-20T12:07:52.684Z", + "trainedWords": [ + "grindingCowgirl" + ], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:2323362@2613689", + "stats": { + "downloadCount": 5022, + "thumbsUpCount": 149 + }, + "model": { + "name": "WAN 2.2 I2V - Grinding Cowgirl", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2501076, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-Grinding-Cowgirl-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2026-01-20T07:55:42.461", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "417660FC", + "AutoV2": "EA4391D849", + "SHA256": "EA4391D849BE947009AFEE52E5799C111174DAC41DA11EC002EA39200106D4B9", + "CRC32": "5999899B", + "BLAKE3": "6397D6A541075F7B781D4C3D691CEAA64C8295D7F50AD8FDBE55D1563FFEA849", + "AutoV3": "BEE349CC4AB5" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2613689" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3f842ef2-4e67-4343-9ebe-fb372d552c7c/original=true/118127828.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UNJR5I-;*0tR?uf8tQt7obM|s,R*.8M{xuV@", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1912238, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/82bdb0ce-e8b9-4739-b938-950bb0c397f6/original=true/118127830.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "UHMGeo00?]?bF0D*slRQ8wxu.SIUDOxaS5WB", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2815881, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031 + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2613689" + }, + "civitai_primary_file": { + "id": 2501076, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-Grinding-Cowgirl-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2026-01-20T07:55:42.461", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "417660FC", + "AutoV2": "EA4391D849", + "SHA256": "EA4391D849BE947009AFEE52E5799C111174DAC41DA11EC002EA39200106D4B9", + "CRC32": "5999899B", + "BLAKE3": "6397D6A541075F7B781D4C3D691CEAA64C8295D7F50AD8FDBE55D1563FFEA849", + "AutoV3": "BEE349CC4AB5" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2613689" + }, + "id": "dl_1772663790994_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:36:30.994239+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:36:31.478464+00:00", + "end_time": "2026-03-04T22:36:36.278454+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2613687", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-Grinding-Cowgirl-HIGH-v1.safetensors", + "num_connections": 1, + "known_size": 306807976, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/2323362/wan-22-i2v-grinding-cowgirl", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-Grinding-Cowgirl-HIGH-v1.safetensors", + "model_name": "WAN 2.2 I2V - Grinding Cowgirl", + "version_name": "HIGH v1.0", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b76c1b80-9b73-4ac6-bcc9-ac8f9ea2d5d6/original=true/118127339.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 2323362, + "civitai_version_id": 2613687, + "civitai_file_id": 2501075, + "civitai_model_info": { + "id": 2323362, + "name": "WAN 2.2 I2V - Grinding Cowgirl", + "description": "This lora is trained on POV & side view clips of women grinding their hips back and forth while riding in the cowgirl & reverse cowgirl positions, typically with their knees down on the bed/ground. The emphasis is on the back-and-forth hip grinding motion (as opposed to up-and-down bouncing)
The penis is not actually visible in a significant portion of the dataset, since generally women do this once it's fully inserted, which can lead to some weirdness if the penis isn't at least partially visible in the initial frame.
I'm not 100% satisfied with how this one turned out so I might try tweaking the dataset and trying a V2, but please give it a try and let me know your thoughts.
It was captioned with natural language. Here are some sample prompts:
She is riding the man, performing a grinding motion with her hips. She pushes her pelvis forward and pulls back rhythmically against him. She is performing a grinding motion, sliding her pelvis in a back-and-forth horizontal pattern.She is performing a slow, deliberate grinding motion with her hips. She slides her pelvis forward and pulls back in a horizontal rhythm against the man. ",
+ "allowNoCredit": true,
+ "allowCommercialUse": "{Image,RentCivit,Rent,Sell}",
+ "allowDerivatives": true,
+ "allowDifferentLicense": true,
+ "type": "LORA",
+ "minor": false,
+ "sfwOnly": false,
+ "poi": false,
+ "nsfw": true,
+ "nsfwLevel": 60,
+ "availability": "Public",
+ "userId": 8910933,
+ "cosmetic": null,
+ "supportsGeneration": true,
+ "stats": {
+ "downloadCount": 10661,
+ "thumbsUpCount": 368,
+ "thumbsDownCount": 0,
+ "commentCount": 4,
+ "tippedAmountCount": 20
+ },
+ "creator": {
+ "username": "TwoMoreLurker",
+ "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg"
+ },
+ "tags": [
+ "action"
+ ],
+ "modelVersions": [
+ {
+ "id": 2613687,
+ "index": 0,
+ "name": "HIGH v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "createdAt": "2026-01-20T07:49:57.336Z",
+ "publishedAt": "2026-01-20T12:07:18.029Z",
+ "status": "Published",
+ "availability": "Public",
+ "nsfwLevel": 60,
+ "covered": true,
+ "stats": {
+ "downloadCount": 5639,
+ "thumbsUpCount": 337,
+ "thumbsDownCount": 0
+ },
+ "files": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad6068ff-c8bf-474f-a0ba-d96dfa8cdd4a/original=true/48924512.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UGG*1k$*01E20zt6ELNG0MWB~Bs:={RkjFs:",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
+ "id": 2501075,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-Grinding-Cowgirl-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2026-01-20T07:55:40.787Z",
+ "metadata": {
+ "format": "SafeTensor"
+ },
+ "hashes": {
+ "AutoV1": "3C3F48F1",
+ "AutoV2": "2FE55CBEDE",
+ "SHA256": "2FE55CBEDE8B3DD31B5F223E87A1693DBC747572ADA59C24E7986147A4F3857C",
+ "CRC32": "CF91BE1B",
+ "BLAKE3": "643B2ACDB6C8D88CC1648F09BA9FB2AADB8A609C18C092A9861B9A246E37B406",
+ "AutoV3": "24A8BD4C8A52"
+ },
+ "downloadUrl": "https://civitai.com/api/download/models/2613687",
+ "primary": true
+ }
+ ],
+ "images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b348a7ea-0f5e-473c-aa51-d1c7b9cd31a5/original=true/48924504.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "ULH_V%i_Yk^*%cs:Z~xtO8IVxDNGyDM{bxxt",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b76c1b80-9b73-4ac6-bcc9-ac8f9ea2d5d6/original=true/118127339.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UEJHgh~qc@yD?@-:tOSw9ZR+-p-;W-V?IVRj",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7862,12 +3986,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2fa9d4ee-a374-47d4-9df4-8a1a8818ac05/original=true/48924506.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UEFEDm%10MoL58oL}@of0zxZ^iofEfs.EMR*",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1e103936-f5b7-4883-a352-86d5c6a0374e/original=true/118127588.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UNJR5I-;*0tR?uf8tQt7obM|s,R*.8M{xuV@",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7876,12 +4000,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e6a5fdd6-e84b-4a52-8466-52791927a07d/original=true/48924495.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UEHT{fXT0$~Bui%2-p%3L2?b~VT0?voz-p?G",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/66448e7f-b268-4aa2-af07-81d27ac281b1/original=true/118127416.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UIKn9,t8*0%f%}IUW-t69EMx?G?bozoMM{oz",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7890,12 +4014,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3c88f6bb-9d27-4063-8850-13a66468a596/original=true/48924500.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "ULG7@_~V0#EM4:IURPM{57NI-o-ps:WBs:of",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3a768327-ca6c-40f2-817f-7f6fcf4d76d5/original=true/118127391.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UIKKi@Ioysv}ypRi%LM|DO%MrqIpyENGR-Ri",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7904,12 +4028,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8f615351-442b-4fd2-b97e-d954f8ec42a0/original=true/48924505.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UPJ6yexaJA$%0fR+E2Rj0fWBRjoe~Afj-pxa",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/14bede96-e19a-4614-85e6-3d31f2282f6c/original=true/118127453.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UDJHR0~CO?tQGoOYyE%L9bt5#QIVMIn$nmIV",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7918,12 +4042,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/29bb29cb-a323-4318-8c9a-d31a179c3ed8/original=true/48924507.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UIJtJ1%$Gv_N?vkX-:o#4:R5=wM{D%m+IoM{",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3295a3c1-6a12-4ff9-ba64-23511758fa5d/original=true/118127589.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UHLNPm~T5nI91Fu4Dis:-:D%$jnhyDMd$$o~",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7932,12 +4056,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e2412251-225d-4bdf-bb6d-12f554699c6c/original=true/48924501.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U9EKu:5R02~A57^Pocs:4:W.~A0#$gEMJ9s:",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/005e98d4-633c-45cc-812d-ac6800c6e57b/original=true/118127587.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "ULKnSVM_.m?vu2IAx[%LMwxvVYRP.8oyRPM|",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7946,12 +4070,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c159657e-bb5e-45f1-947b-26c6526f6765/original=true/48924497.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U6FEZIO@00rC=v0$M{9aHqIo~q%g00Vs.8^k",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e7a9dbd3-2a02-4194-9a05-41fd027e003e/original=true/118127586.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "ULLNV$AF_NIA?]S$xsjcD*#+%1E1tlV?I;xt",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7960,12 +4084,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8d6aee7a-a168-41a1-bbd3-7b0901830eb2/original=true/48924499.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UwJtk^t7x]V@?^ozt7Rjx^s:s9R*xvn%WBof",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/83c40d16-26d3-4cd2-a7ca-ef98c8a20a30/original=true/118127693.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UaNvfD.8?^.8T0s:jFkWIAM{r?xuIAo}o}sm",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7974,12 +4098,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6ddddf03-538a-4580-b3cd-b8568dd1564a/original=true/48924502.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UJF;gNaSF5-V%QNNbKoh5R%1w@NLs9j=jrn#",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/effe3f34-e166-44a0-b3a9-ac03aa48e2eb/original=true/118127691.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "USMivV~pggaio]%L%1M{IBM|%2ofnNIUIUo0",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -7988,26 +4112,76 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/aaa83ee4-168f-4d69-8d9e-047c9daad6e1/original=true/48924494.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UEHm[=zm6;I-19Mup19t0#R$R;-M^HET-N?I",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca09bcb4-2d88-4361-81ba-84d3459f2ba2/original=true/118127692.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UNKmtn~WJk-oOm%2ITxuR-j[-pWCE2IUD*IU",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
"hasPositivePrompt": true,
"onSite": false,
"remixOfId": null
- },
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2613687"
+ },
+ {
+ "id": 2613689,
+ "index": 1,
+ "name": "LOW v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "createdAt": "2026-01-20T07:52:02.020Z",
+ "publishedAt": "2026-01-20T12:07:52.684Z",
+ "status": "Published",
+ "availability": "Public",
+ "nsfwLevel": 60,
+ "trainedWords": [
+ "grindingCowgirl"
+ ],
+ "covered": true,
+ "stats": {
+ "downloadCount": 5022,
+ "thumbsUpCount": 149,
+ "thumbsDownCount": 0
+ },
+ "files": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f29567d4-423c-426e-a335-7ac23bdd310a/original=true/48924509.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UCEUrspJ5=-Au4%N-:WBkXxu}@IpS#IpShj?",
- "type": "image",
+ "id": 2501076,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-Grinding-Cowgirl-LOW-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2026-01-20T07:55:42.461Z",
+ "metadata": {
+ "format": "SafeTensor"
+ },
+ "hashes": {
+ "AutoV1": "417660FC",
+ "AutoV2": "EA4391D849",
+ "SHA256": "EA4391D849BE947009AFEE52E5799C111174DAC41DA11EC002EA39200106D4B9",
+ "CRC32": "5999899B",
+ "BLAKE3": "6397D6A541075F7B781D4C3D691CEAA64C8295D7F50AD8FDBE55D1563FFEA849",
+ "AutoV3": "BEE349CC4AB5"
+ },
+ "downloadUrl": "https://civitai.com/api/download/models/2613689",
+ "primary": true
+ }
+ ],
+ "images": [
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3f842ef2-4e67-4343-9ebe-fb372d552c7c/original=true/118127828.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UNJR5I-;*0tR?uf8tQt7obM|s,R*.8M{xuV@",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8016,12 +4190,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/26a3090e-7d21-42b0-b197-cdf21a0aae85/original=true/49000541.jpeg",
- "nsfwLevel": 1,
- "width": 1080,
- "height": 1920,
- "hash": "Ua5imvogTOWCt:baW?jFp1kXadWAXnbbjFjb",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/82bdb0ce-e8b9-4739-b938-950bb0c397f6/original=true/118127830.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UHMGeo00?]?bF0D*slRQ8wxu.SIUDOxaS5WB",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8030,61 +4204,482 @@
"remixOfId": null
}
],
- "downloadUrl": "https://civitai.com/api/download/models/1227932"
+ "downloadUrl": "https://civitai.com/api/download/models/2613689"
+ }
+ ]
+ },
+ "civitai_version_info": {
+ "id": 2613687,
+ "modelId": 2323362,
+ "name": "HIGH v1.0",
+ "nsfwLevel": 60,
+ "createdAt": "2026-01-20T07:49:57.336Z",
+ "updatedAt": "2026-01-20T12:07:18.117Z",
+ "status": "Published",
+ "publishedAt": "2026-01-20T12:07:18.029Z",
+ "trainedWords": [],
+ "trainingStatus": null,
+ "trainingDetails": null,
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "earlyAccessEndsAt": null,
+ "earlyAccessConfig": null,
+ "description": null,
+ "uploadType": "Created",
+ "usageControl": "Download",
+ "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:2323362@2613687",
+ "stats": {
+ "downloadCount": 5639,
+ "thumbsUpCount": 337
+ },
+ "model": {
+ "name": "WAN 2.2 I2V - Grinding Cowgirl",
+ "type": "LORA",
+ "nsfw": true,
+ "poi": false
+ },
+ "files": [
+ {
+ "id": 2501075,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-Grinding-Cowgirl-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2026-01-20T07:55:40.787",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "3C3F48F1",
+ "AutoV2": "2FE55CBEDE",
+ "SHA256": "2FE55CBEDE8B3DD31B5F223E87A1693DBC747572ADA59C24E7986147A4F3857C",
+ "CRC32": "CF91BE1B",
+ "BLAKE3": "643B2ACDB6C8D88CC1648F09BA9FB2AADB8A609C18C092A9861B9A246E37B406",
+ "AutoV3": "24A8BD4C8A52"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2613687"
+ }
+ ],
+ "images": [
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b76c1b80-9b73-4ac6-bcc9-ac8f9ea2d5d6/original=true/118127339.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UEJHgh~qc@yD?@-:tOSw9ZR+-p-;W-V?IVRj",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1979421,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1e103936-f5b7-4883-a352-86d5c6a0374e/original=true/118127588.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UNJR5I-;*0tR?uf8tQt7obM|s,R*.8M{xuV@",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1912238,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/66448e7f-b268-4aa2-af07-81d27ac281b1/original=true/118127416.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UIKn9,t8*0%f%}IUW-t69EMx?G?bozoMM{oz",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1700282,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3a768327-ca6c-40f2-817f-7f6fcf4d76d5/original=true/118127391.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UIKKi@Ioysv}ypRi%LM|DO%MrqIpyENGR-Ri",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1623911,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/14bede96-e19a-4614-85e6-3d31f2282f6c/original=true/118127453.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UDJHR0~CO?tQGoOYyE%L9bt5#QIVMIn$nmIV",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1761975,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3295a3c1-6a12-4ff9-ba64-23511758fa5d/original=true/118127589.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UHLNPm~T5nI91Fu4Dis:-:D%$jnhyDMd$$o~",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1951783,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/005e98d4-633c-45cc-812d-ac6800c6e57b/original=true/118127587.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "ULKnSVM_.m?vu2IAx[%LMwxvVYRP.8oyRPM|",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1719690,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e7a9dbd3-2a02-4194-9a05-41fd027e003e/original=true/118127586.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "ULLNV$AF_NIA?]S$xsjcD*#+%1E1tlV?I;xt",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1391920,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
},
{
- "id": 1182699,
- "index": 25,
- "name": "2.2",
- "baseModel": "Flux.1 D",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/83c40d16-26d3-4cd2-a7ca-ef98c8a20a30/original=true/118127693.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "UaNvfD.8?^.8T0s:jFkWIAM{r?xuIAo}o}sm",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 3318583,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/effe3f34-e166-44a0-b3a9-ac03aa48e2eb/original=true/118127691.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "USMivV~pggaio]%L%1M{IBM|%2ofnNIUIUo0",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 2814891,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "grindingCowgirl\n\nShe is having sex with a man in the cowgirl position. She is riding the man with a steady grinding motion, thrusting her hips forward and back. She pushes her pelvis forward and pulls back rhythmically against him."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2613687"
+ },
+ "civitai_primary_file": {
+ "id": 2501075,
+ "sizeKB": 299617.1640625,
+ "name": "WAN-2.2-I2V-Grinding-Cowgirl-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2026-01-20T07:55:40.787",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "3C3F48F1",
+ "AutoV2": "2FE55CBEDE",
+ "SHA256": "2FE55CBEDE8B3DD31B5F223E87A1693DBC747572ADA59C24E7986147A4F3857C",
+ "CRC32": "CF91BE1B",
+ "BLAKE3": "643B2ACDB6C8D88CC1648F09BA9FB2AADB8A609C18C092A9861B9A246E37B406",
+ "AutoV3": "24A8BD4C8A52"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2613687"
+ },
+ "id": "dl_1772663780573_0_WAN-2.2-I2",
+ "status": "completed",
+ "added_time": "2026-03-04T22:36:20.573519+00:00",
+ "progress": 100.0,
+ "speed": 0.0,
+ "error": null,
+ "start_time": "2026-03-04T22:36:20.946645+00:00",
+ "end_time": "2026-03-04T22:36:27.538964+00:00",
+ "connection_type": "Single"
+ },
+ {
+ "url": "https://civitai.com/api/download/models/2298928",
+ "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-POV-Body-Cumshot-Pullout-LOW-v1.safetensors",
+ "num_connections": 1,
+ "known_size": 613516752,
+ "api_key": "da82e3873725e824182cc021803091eb",
+ "model_url_or_id": "https://civitai.com/models/2031069?modelVersionId=2298928",
+ "model_version_id": null,
+ "custom_filename": "",
+ "force_redownload": false,
+ "filename": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-LOW-v1.safetensors",
+ "model_name": "WAN 2.2 I2V - POV Body Cumshot & Pullout",
+ "version_name": "LOW v1.0",
+ "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4e5e1bf-62c8-4972-b51a-9cf865bc25c8/original=true/105218991.mp4?width=256",
+ "thumbnail_nsfw_level": 16,
+ "model_type": "loras",
+ "file_precision": null,
+ "file_model_size": null,
+ "file_format": "SafeTensor",
+ "civitai_model_id": 2031069,
+ "civitai_version_id": 2298928,
+ "civitai_file_id": 2189887,
+ "civitai_model_info": {
+ "id": 2031069,
+ "name": "WAN 2.2 I2V - POV Body Cumshot & Pullout",
+ "description": "This lora is trained on POV clips of finishing from the missionary position and ejaculating on the woman's body (b0dyshot). About half of the clips feature the man pulling out (pull0ut), for the other half the penis is already visible in the first frame.
It supports 3 finishing types: man jerking himself (s3lf), woman jerking the man (p4rtner), and a hands-free orgasm with no jerking at all (sp0ntaneous).
The woman's head was clipped out of all of the training data so it will not affect faces. You'll have to prompt for her facial expression, otherwise it seems to default to annoyed/uninterested XD
The woman's hands need to be somewhat near the penis in the initial image for her to grab it.
Example prompt:
b0dyshot (pull0ut) (s3lf / p4rtner / sp0ntaneous)\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n(The man pulls out. He pulls his penis out of her vagina)\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\n[The man is stroking his penis]/[The woman is stroking his penis]/[The penis is not being stroked. The penis ejaculates spontaneously, without being touched.]",
+ "allowNoCredit": true,
+ "allowCommercialUse": "{RentCivit,Rent}",
+ "allowDerivatives": true,
+ "allowDifferentLicense": true,
+ "type": "LORA",
+ "minor": false,
+ "sfwOnly": false,
+ "poi": false,
+ "nsfw": true,
+ "nsfwLevel": 60,
+ "availability": "Public",
+ "userId": 8910933,
+ "cosmetic": null,
+ "supportsGeneration": true,
+ "stats": {
+ "downloadCount": 30831,
+ "thumbsUpCount": 1258,
+ "thumbsDownCount": 5,
+ "commentCount": 21,
+ "tippedAmountCount": 1100
+ },
+ "creator": {
+ "username": "TwoMoreLurker",
+ "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg"
+ },
+ "tags": [
+ "action",
+ "cumshot"
+ ],
+ "modelVersions": [
+ {
+ "id": 2298673,
+ "index": 0,
+ "name": "HIGH v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
"baseModelType": "Standard",
- "createdAt": "2024-12-19T23:45:40.016Z",
- "publishedAt": "2024-12-28T05:03:40.871Z",
+ "createdAt": "2025-10-10T02:51:06.241Z",
+ "publishedAt": "2025-10-10T06:01:33.389Z",
"status": "Published",
"availability": "Public",
"nsfwLevel": 60,
- "covered": false,
+ "trainedWords": [
+ "b0dyshot",
+ "pull0ut",
+ "sp0ntaneous",
+ "s3lf",
+ "p4rtner"
+ ],
+ "covered": true,
"stats": {
- "downloadCount": 1784,
- "thumbsUpCount": 103,
- "thumbsDownCount": 0
+ "downloadCount": 16628,
+ "thumbsUpCount": 1180,
+ "thumbsDownCount": 5
},
"files": [
{
- "id": 1087917,
- "sizeKB": 11786355.30273438,
- "name": "fluxedUpFluxNSFW_22.safetensors",
+ "id": 2189884,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-HIGH-v1.safetensors",
"type": "Model",
"pickleScanResult": "Success",
"pickleScanMessage": "No Pickle imports",
"virusScanResult": "Success",
"virusScanMessage": null,
- "scannedAt": "2024-12-20T00:10:06.482Z",
+ "scannedAt": "2025-10-10T05:06:07.844Z",
"metadata": {
- "format": "SafeTensor",
- "size": "pruned",
- "fp": "fp8"
+ "format": "SafeTensor"
},
"hashes": {
- "AutoV1": "B45CE6D1",
- "AutoV2": "2D96E10910",
- "SHA256": "2D96E109102F1725AA275ED3C0BD2A6EFE14109E09D775DCD49778BD0598000D",
- "CRC32": "3FBA829F",
- "BLAKE3": "EBCE8FBFE603DAC21E59BBBBE5EAA5B0E9FBCE61500E43CD32A6BA678411C01D",
- "AutoV3": "A6ADE557DF74"
+ "AutoV1": "17CCE783",
+ "AutoV2": "A2D61C7C95",
+ "SHA256": "A2D61C7C951CFB359028F19E97F698EBE2937E7049B33DBC5BB7B1127BF7F10C",
+ "CRC32": "BD1D691B",
+ "BLAKE3": "BC91C3951EE5C4709ECC4571394B98C0A3065BB99C653E6B4CBBBAF1C25CADE5",
+ "AutoV3": "37EECD013E58"
},
- "downloadUrl": "https://civitai.com/api/download/models/1182699",
+ "downloadUrl": "https://civitai.com/api/download/models/2298673",
"primary": true
}
],
"images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b9ca3d9a-5cc0-4c88-b722-c9ae7b5690df/original=true/46481294.jpeg",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad66313b-f668-4b27-ae6d-464812cb215a/original=true/105218044.mp4",
"nsfwLevel": 16,
- "width": 1080,
- "height": 1920,
- "hash": "U7BCrou5.8bw.S_3.8-;0g%2~B%g=d9a$fNG",
- "type": "image",
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8093,12 +4688,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d589db06-86be-480c-995b-9f2809e716ed/original=true/46481354.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UbD0HD*dPqEhksWZW;bcEQTHV[xBWXn~nikC",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f992c062-8488-489f-af43-8ba1e7af7a86/original=true/105218047.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8107,12 +4702,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bfd70093-9bc0-4431-b795-303f0b884f46/original=true/46481336.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U6EA}?[W00kq?aEME1xu01K4}@Ef4o={?bIB",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a5190e3-6672-45be-b77a-816aff92cfda/original=true/105218050.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8121,12 +4716,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2bc1f0c5-e1ca-4863-a663-eb61f03bd2f8/original=true/46481346.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U9I42}0g00^*0MoeSy$%00?G~U9aV?WCxtf5",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/42aec61e-ffc2-41ba-a6fe-e293b1d1974f/original=true/105218043.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8135,12 +4730,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d3630e2f-e3c5-48bb-b8aa-bf8ad0d57e66/original=true/46481359.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UH8rOq-Hxd%h.AtAm,pKVZO]h{VWpyaOohVq",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6e2f489f-3910-40dc-9a2a-eb181d4442a7/original=true/105218045.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8149,12 +4744,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f8fb6770-611b-45c0-8c3c-0bc431e3c2cb/original=true/46481350.jpeg",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae27a0da-a6ba-48c5-8544-276112c09b86/original=true/105218049.mp4",
"nsfwLevel": 16,
- "width": 1080,
- "height": 1920,
- "hash": "U7G*KFE202EM0M9uOEkD0057}r$z@ra#={%0",
- "type": "image",
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8163,12 +4758,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bf761b38-9512-4ac1-bdd7-686f2a4aa039/original=true/46481356.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U4D*-3#R00M{}m~V5R010U={=E0f0NbE^kwc",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4718c9f1-fecb-48f6-818c-479c3da54f50/original=true/105218046.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8177,40 +4772,80 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/944e3446-697c-4a3d-aad0-614cd4eb6bf3/original=true/46481261.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UDFO15^j0MV@56WA~Vxu5rS4,.$%IAWVIpNb",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/883106e3-f6a9-4957-9fe5-4ea18dedc29a/original=true/105218048.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
"hasPositivePrompt": true,
"onSite": false,
"remixOfId": null
- },
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2298673"
+ },
+ {
+ "id": 2298928,
+ "index": 1,
+ "name": "LOW v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "createdAt": "2025-10-10T05:05:50.244Z",
+ "publishedAt": "2025-10-10T06:03:12.067Z",
+ "status": "Published",
+ "availability": "Public",
+ "nsfwLevel": 60,
+ "trainedWords": [
+ "b0dyshot",
+ "pull0ut",
+ "sp0ntaneous",
+ "s3lf",
+ "p4rtner"
+ ],
+ "covered": true,
+ "stats": {
+ "downloadCount": 14203,
+ "thumbsUpCount": 368,
+ "thumbsDownCount": 2
+ },
+ "files": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fd26f61e-3988-4fc7-99f9-26f635c5ef20/original=true/46481327.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U5Hv|,~A0~WC009u0fNG02=xxWxZ%eWV~B-U",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
+ "id": 2189887,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-LOW-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-10-10T05:11:20.780Z",
+ "metadata": {
+ "format": "SafeTensor"
+ },
+ "hashes": {
+ "AutoV1": "A659D922",
+ "AutoV2": "E1485D2B70",
+ "SHA256": "E1485D2B705F4B6FDD94E36835E68A9B7D86B73C10BA5A8C92E149F5753CA1DB",
+ "CRC32": "4AC87871",
+ "BLAKE3": "171F07AC0416BDFF07BFE7DC4EF650D5E1762B981A1DF0541997BA5CC5D6E1DD",
+ "AutoV3": "AA0B476CD8A1"
+ },
+ "downloadUrl": "https://civitai.com/api/download/models/2298928",
+ "primary": true
+ }
+ ],
+ "images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a2ecdea-5eee-49b0-99cf-c86ac9aa80e5/original=true/46481355.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U8GY+2sAAENb0j-9t4s-P6n*]+s-M$s.}WWW",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4e5e1bf-62c8-4972-b51a-9cf865bc25c8/original=true/105218991.mp4",
+ "nsfwLevel": 16,
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8219,40 +4854,295 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/35d0e2b6-dbf8-4d1d-89cf-3d1ea5754889/original=true/46481338.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U7EUiTT09ss,}koh-6Mx02JU$QIA22-o0#M|",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c62737cd-fb90-4826-b2ef-d09cc730c61d/original=true/105218849.mp4",
+ "nsfwLevel": 16,
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
"hasPositivePrompt": true,
"onSite": false,
"remixOfId": null
- },
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2298928"
+ }
+ ]
+ },
+ "civitai_version_info": {
+ "id": 2298928,
+ "modelId": 2031069,
+ "name": "LOW v1.0",
+ "nsfwLevel": 60,
+ "createdAt": "2025-10-10T05:05:50.244Z",
+ "updatedAt": "2025-10-10T06:03:12.080Z",
+ "status": "Published",
+ "publishedAt": "2025-10-10T06:03:12.067Z",
+ "trainedWords": [
+ "b0dyshot",
+ "pull0ut",
+ "sp0ntaneous",
+ "s3lf",
+ "p4rtner"
+ ],
+ "trainingStatus": null,
+ "trainingDetails": null,
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "earlyAccessEndsAt": null,
+ "earlyAccessConfig": null,
+ "description": null,
+ "uploadType": "Created",
+ "usageControl": "Download",
+ "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:2031069@2298928",
+ "stats": {
+ "downloadCount": 14203,
+ "thumbsUpCount": 368
+ },
+ "model": {
+ "name": "WAN 2.2 I2V - POV Body Cumshot & Pullout",
+ "type": "LORA",
+ "nsfw": true,
+ "poi": false
+ },
+ "files": [
+ {
+ "id": 2189887,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-LOW-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-10-10T05:11:20.78",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "A659D922",
+ "AutoV2": "E1485D2B70",
+ "SHA256": "E1485D2B705F4B6FDD94E36835E68A9B7D86B73C10BA5A8C92E149F5753CA1DB",
+ "CRC32": "4AC87871",
+ "BLAKE3": "171F07AC0416BDFF07BFE7DC4EF650D5E1762B981A1DF0541997BA5CC5D6E1DD",
+ "AutoV3": "AA0B476CD8A1"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2298928"
+ }
+ ],
+ "images": [
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4e5e1bf-62c8-4972-b51a-9cf865bc25c8/original=true/105218991.mp4",
+ "nsfwLevel": 16,
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 516399,
+ "audio": false,
+ "width": 480,
+ "height": 720,
+ "duration": 6.063
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot s3lf pull0ut\n\nThe video shows a man ejaculating on a woman's stomach and chest. The man pulls out. He pulls his penis out of her vagina.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe man is stroking his penis."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c62737cd-fb90-4826-b2ef-d09cc730c61d/original=true/105218849.mp4",
+ "nsfwLevel": 16,
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 585302,
+ "audio": false,
+ "width": 480,
+ "height": 720,
+ "duration": 6.063,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot sp0ntaneous\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe penis is not being stroked. The penis ejaculates spontaneously, without being touched."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2298928"
+ },
+ "civitai_primary_file": {
+ "id": 2189887,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-LOW-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-10-10T05:11:20.78",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "A659D922",
+ "AutoV2": "E1485D2B70",
+ "SHA256": "E1485D2B705F4B6FDD94E36835E68A9B7D86B73C10BA5A8C92E149F5753CA1DB",
+ "CRC32": "4AC87871",
+ "BLAKE3": "171F07AC0416BDFF07BFE7DC4EF650D5E1762B981A1DF0541997BA5CC5D6E1DD",
+ "AutoV3": "AA0B476CD8A1"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2298928"
+ },
+ "id": "dl_1772663769901_0_WAN-2.2-I2",
+ "status": "completed",
+ "added_time": "2026-03-04T22:36:09.901038+00:00",
+ "progress": 100.0,
+ "speed": 0.0,
+ "error": null,
+ "start_time": "2026-03-04T22:36:09.941419+00:00",
+ "end_time": "2026-03-04T22:36:25.261954+00:00",
+ "connection_type": "Single"
+ },
+ {
+ "url": "https://civitai.com/api/download/models/2298673",
+ "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-POV-Body-Cumshot-Pullout-HIGH-v1.safetensors",
+ "num_connections": 1,
+ "known_size": 613516752,
+ "api_key": "da82e3873725e824182cc021803091eb",
+ "model_url_or_id": "https://civitai.com/models/2031069/wan-22-i2v-pov-body-cumshot-and-pullout",
+ "model_version_id": null,
+ "custom_filename": "",
+ "force_redownload": false,
+ "filename": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-HIGH-v1.safetensors",
+ "model_name": "WAN 2.2 I2V - POV Body Cumshot & Pullout",
+ "version_name": "HIGH v1.0",
+ "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad66313b-f668-4b27-ae6d-464812cb215a/original=true/105218044.mp4?width=256",
+ "thumbnail_nsfw_level": 16,
+ "model_type": "loras",
+ "file_precision": null,
+ "file_model_size": null,
+ "file_format": "SafeTensor",
+ "civitai_model_id": 2031069,
+ "civitai_version_id": 2298673,
+ "civitai_file_id": 2189884,
+ "civitai_model_info": {
+ "id": 2031069,
+ "name": "WAN 2.2 I2V - POV Body Cumshot & Pullout",
+ "description": "This lora is trained on POV clips of finishing from the missionary position and ejaculating on the woman's body (b0dyshot). About half of the clips feature the man pulling out (pull0ut), for the other half the penis is already visible in the first frame.
It supports 3 finishing types: man jerking himself (s3lf), woman jerking the man (p4rtner), and a hands-free orgasm with no jerking at all (sp0ntaneous).
The woman's head was clipped out of all of the training data so it will not affect faces. You'll have to prompt for her facial expression, otherwise it seems to default to annoyed/uninterested XD
The woman's hands need to be somewhat near the penis in the initial image for her to grab it.
Example prompt:
b0dyshot (pull0ut) (s3lf / p4rtner / sp0ntaneous)\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n(The man pulls out. He pulls his penis out of her vagina)\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\n[The man is stroking his penis]/[The woman is stroking his penis]/[The penis is not being stroked. The penis ejaculates spontaneously, without being touched.]",
+ "allowNoCredit": true,
+ "allowCommercialUse": "{RentCivit,Rent}",
+ "allowDerivatives": true,
+ "allowDifferentLicense": true,
+ "type": "LORA",
+ "minor": false,
+ "sfwOnly": false,
+ "poi": false,
+ "nsfw": true,
+ "nsfwLevel": 60,
+ "availability": "Public",
+ "userId": 8910933,
+ "cosmetic": null,
+ "supportsGeneration": true,
+ "stats": {
+ "downloadCount": 30831,
+ "thumbsUpCount": 1258,
+ "thumbsDownCount": 5,
+ "commentCount": 21,
+ "tippedAmountCount": 1100
+ },
+ "creator": {
+ "username": "TwoMoreLurker",
+ "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg"
+ },
+ "tags": [
+ "cumshot",
+ "action"
+ ],
+ "modelVersions": [
+ {
+ "id": 2298673,
+ "index": 0,
+ "name": "HIGH v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "createdAt": "2025-10-10T02:51:06.241Z",
+ "publishedAt": "2025-10-10T06:01:33.389Z",
+ "status": "Published",
+ "availability": "Public",
+ "nsfwLevel": 60,
+ "trainedWords": [
+ "b0dyshot",
+ "pull0ut",
+ "sp0ntaneous",
+ "s3lf",
+ "p4rtner"
+ ],
+ "covered": true,
+ "stats": {
+ "downloadCount": 16628,
+ "thumbsUpCount": 1180,
+ "thumbsDownCount": 5
+ },
+ "files": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4536758a-4998-4d05-971a-7cb235c1537c/original=true/46481334.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "URK^{Ks:PAtR00RjIUWB00t7rrV@_Ns:-qt7",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
+ "id": 2189884,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-10-10T05:06:07.844Z",
+ "metadata": {
+ "format": "SafeTensor"
+ },
+ "hashes": {
+ "AutoV1": "17CCE783",
+ "AutoV2": "A2D61C7C95",
+ "SHA256": "A2D61C7C951CFB359028F19E97F698EBE2937E7049B33DBC5BB7B1127BF7F10C",
+ "CRC32": "BD1D691B",
+ "BLAKE3": "BC91C3951EE5C4709ECC4571394B98C0A3065BB99C653E6B4CBBBAF1C25CADE5",
+ "AutoV3": "37EECD013E58"
+ },
+ "downloadUrl": "https://civitai.com/api/download/models/2298673",
+ "primary": true
+ }
+ ],
+ "images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e1c0ac63-65ef-446d-8a2f-4a94a49c4164/original=true/46481332.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U8Ace=~V000Ks:%2%MM|0LIV=w-U009Zxt?H",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad66313b-f668-4b27-ae6d-464812cb215a/original=true/105218044.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8261,12 +5151,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/db85df40-862b-4ec4-9905-36d09739fb8a/original=true/46481347.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UWE30TM{E1jZ_NM{IUof%MM{Mxt7x]RjM{og",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f992c062-8488-489f-af43-8ba1e7af7a86/original=true/105218047.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8275,12 +5165,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8234c606-3c49-46ae-9af6-81f86a27e57f/original=true/46481343.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UtMQLzxux]xa~qt7ayWUkXWCMyj[-;aeWVof",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a5190e3-6672-45be-b77a-816aff92cfda/original=true/105218050.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8289,12 +5179,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7a6548b6-f491-4669-b5be-edc1d34f7978/original=true/46481358.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U48Ca{nKF}wf-aR#XBj^1Dw}]oX9I,bds9sp",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/42aec61e-ffc2-41ba-a6fe-e293b1d1974f/original=true/105218043.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8303,12 +5193,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/129ef262-5218-4271-b2c7-db015078e5c5/original=true/46481348.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UCEKfR$i0OJo9vxZF1E30ho1}r$$}?EN,:%1",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6e2f489f-3910-40dc-9a2a-eb181d4442a7/original=true/105218045.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8317,12 +5207,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f8029bb3-63f4-48d9-ae4c-7223cc316836/original=true/46481344.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U9EK[W-U00J7xZNanj=x02Ip~A%0w_xZ-ot6",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae27a0da-a6ba-48c5-8544-276112c09b86/original=true/105218049.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8331,12 +5221,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0f04eee0-1c8f-4a0b-8e43-e2664a2764c6/original=true/46481353.jpeg",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4718c9f1-fecb-48f6-818c-479c3da54f50/original=true/105218046.mp4",
"nsfwLevel": 16,
- "width": 1080,
- "height": 1920,
- "hash": "UWJtF;_N%hx]_N-;ShofT0WBwIoe%2bbWCt7",
- "type": "image",
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8345,12 +5235,12 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/43dedcd4-933e-41bb-b880-f7861b21ec31/original=true/46481342.jpeg",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/883106e3-f6a9-4957-9fe5-4ea18dedc29a/original=true/105218048.mp4",
"nsfwLevel": 16,
- "width": 1080,
- "height": 1920,
- "hash": "USHUd}Nyt5Ne00NGt6M|*0xtRjxZ9GoIRl$%",
- "type": "image",
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8359,117 +5249,66 @@
"remixOfId": null
}
],
- "downloadUrl": "https://civitai.com/api/download/models/1182699"
+ "downloadUrl": "https://civitai.com/api/download/models/2298673"
},
{
- "id": 1182788,
- "index": 26,
- "name": "2.2-Q4_K_S-gguf",
- "baseModel": "Flux.1 D",
+ "id": 2298928,
+ "index": 1,
+ "name": "LOW v1.0",
+ "baseModel": "Wan Video 2.2 I2V-A14B",
"baseModelType": "Standard",
- "createdAt": "2024-12-20T00:20:03.481Z",
- "publishedAt": "2025-01-04T00:35:10.082Z",
+ "createdAt": "2025-10-10T05:05:50.244Z",
+ "publishedAt": "2025-10-10T06:03:12.067Z",
"status": "Published",
"availability": "Public",
"nsfwLevel": 60,
- "covered": false,
+ "trainedWords": [
+ "b0dyshot",
+ "pull0ut",
+ "sp0ntaneous",
+ "s3lf",
+ "p4rtner"
+ ],
+ "covered": true,
"stats": {
- "downloadCount": 711,
- "thumbsUpCount": 29,
- "thumbsDownCount": 0
+ "downloadCount": 14203,
+ "thumbsUpCount": 368,
+ "thumbsDownCount": 2
},
"files": [
{
- "id": 1500264,
- "sizeKB": 6640447.15625,
- "name": "fluxedUpFluxNSFW_22Q4KSGguf.gguf",
+ "id": 2189887,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-LOW-v1.safetensors",
"type": "Model",
"pickleScanResult": "Success",
"pickleScanMessage": "No Pickle imports",
"virusScanResult": "Success",
"virusScanMessage": null,
- "scannedAt": "2025-03-30T15:24:00.338Z",
+ "scannedAt": "2025-10-10T05:11:20.780Z",
"metadata": {
- "format": "GGUF",
- "size": "pruned",
- "fp": "fp8"
+ "format": "SafeTensor"
},
"hashes": {
- "AutoV1": "C764651A",
- "AutoV2": "5CAD3582AB",
- "SHA256": "5CAD3582ABE45B94318A61ECB23CFFA15AC1F080A5CCFB767A20990315BCECDE",
- "CRC32": "C0ECA469",
- "BLAKE3": "064D65314ECA06494E8A7AD29FDA9DFCBFDB3E63F43F134A27F75D362455F51E",
- "AutoV3": "DB2DFD594363"
+ "AutoV1": "A659D922",
+ "AutoV2": "E1485D2B70",
+ "SHA256": "E1485D2B705F4B6FDD94E36835E68A9B7D86B73C10BA5A8C92E149F5753CA1DB",
+ "CRC32": "4AC87871",
+ "BLAKE3": "171F07AC0416BDFF07BFE7DC4EF650D5E1762B981A1DF0541997BA5CC5D6E1DD",
+ "AutoV3": "AA0B476CD8A1"
},
- "downloadUrl": "https://civitai.com/api/download/models/1182788",
+ "downloadUrl": "https://civitai.com/api/download/models/2298928",
"primary": true
}
],
"images": [
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d52683b0-6cb1-49b7-b5de-0bbfa55bd2f9/original=true/46484458.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UCDuYy~B0L0fI;EMxZ-o0fni-noeI;%1NHE1",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/cc406dc9-74e2-4882-b793-70a6d9f14dba/original=true/46484591.jpeg",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a4e5e1bf-62c8-4972-b51a-9cf865bc25c8/original=true/105218991.mp4",
"nsfwLevel": 16,
- "width": 1080,
- "height": 1920,
- "hash": "UAG7rF}@KPEM00xFIUI:cZEg%2xG;KjZ=xw_",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9b3940cc-cc10-4fe8-babf-ad5aa80fdaf8/original=true/46484630.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UCGtQb0g00~B0haewIxu0#$%=_NIOENaM|Nw",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/28c6fbc9-ee19-4552-98b5-6c50fa706439/original=true/46484624.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UnKKi[nNNFo}?wM{V@ofI]NGnismw^jFR%WX",
- "type": "image",
- "minor": false,
- "poi": false,
- "hasMeta": true,
- "hasPositivePrompt": true,
- "onSite": false,
- "remixOfId": null
- },
- {
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/25e9b8f7-9b5e-43d4-97f9-50b85b316571/original=true/46484636.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "U9E-%E=D1$010M9[={WBQ,%g9F~V=s?H9a58",
- "type": "image",
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
@@ -8478,54 +5317,453 @@
"remixOfId": null
},
{
- "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0e11f74d-1bb1-45af-8447-009447988092/original=true/46484623.jpeg",
- "nsfwLevel": 8,
- "width": 1080,
- "height": 1920,
- "hash": "UAINBW4.02={0NVr%1xF0knh~BNGEM56EMkD",
- "type": "image",
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c62737cd-fb90-4826-b2ef-d09cc730c61d/original=true/105218849.mp4",
+ "nsfwLevel": 16,
+ "width": 480,
+ "height": 720,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
"minor": false,
"poi": false,
"hasMeta": true,
"hasPositivePrompt": true,
"onSite": false,
"remixOfId": null
- },
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2298928"
+ }
+ ]
+ },
+ "civitai_version_info": {
+ "id": 2298673,
+ "modelId": 2031069,
+ "name": "HIGH v1.0",
+ "nsfwLevel": 60,
+ "createdAt": "2025-10-10T02:51:06.241Z",
+ "updatedAt": "2025-10-10T06:01:33.498Z",
+ "status": "Published",
+ "publishedAt": "2025-10-10T06:01:33.389Z",
+ "trainedWords": [
+ "b0dyshot",
+ "pull0ut",
+ "sp0ntaneous",
+ "s3lf",
+ "p4rtner"
+ ],
+ "trainingStatus": null,
+ "trainingDetails": null,
+ "baseModel": "Wan Video 2.2 I2V-A14B",
+ "baseModelType": "Standard",
+ "earlyAccessEndsAt": null,
+ "earlyAccessConfig": null,
+ "description": null,
+ "uploadType": "Created",
+ "usageControl": "Download",
+ "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:2031069@2298673",
+ "stats": {
+ "downloadCount": 16628,
+ "thumbsUpCount": 1180
+ },
+ "model": {
+ "name": "WAN 2.2 I2V - POV Body Cumshot & Pullout",
+ "type": "LORA",
+ "nsfw": true,
+ "poi": false
+ },
+ "files": [
+ {
+ "id": 2189884,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-10-10T05:06:07.844",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "17CCE783",
+ "AutoV2": "A2D61C7C95",
+ "SHA256": "A2D61C7C951CFB359028F19E97F698EBE2937E7049B33DBC5BB7B1127BF7F10C",
+ "CRC32": "BD1D691B",
+ "BLAKE3": "BC91C3951EE5C4709ECC4571394B98C0A3065BB99C653E6B4CBBBAF1C25CADE5",
+ "AutoV3": "37EECD013E58"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2298673"
+ }
+ ],
+ "images": [
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ad66313b-f668-4b27-ae6d-464812cb215a/original=true/105218044.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1214486,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot sp0ntaneous pull0ut\n\nThe video shows a man ejaculating on a woman's stomach and chest. The man pulls out. He pulls his penis out of her vagina.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe penis is not being stroked. The penis ejaculates spontaneously, without being touched."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f992c062-8488-489f-af43-8ba1e7af7a86/original=true/105218047.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1042557,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot s3lf pull0ut\n\nThe video shows a man ejaculating on a woman's stomach and chest. The man pulls out. He pulls his penis out of her vagina.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe man is stroking his penis."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a5190e3-6672-45be-b77a-816aff92cfda/original=true/105218050.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1289010,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot s3lf pull0ut\n\nThe video shows a man ejaculating on a woman's stomach and chest. The man pulls out. He pulls his penis out of her vagina.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe man is stroking his penis."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/42aec61e-ffc2-41ba-a6fe-e293b1d1974f/original=true/105218043.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1188748,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot p4rtner pull0ut\n\nThe video shows a man ejaculating on a woman's stomach and chest. The man pulls out. He pulls his penis out of her vagina.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe woman is stroking his penis."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6e2f489f-3910-40dc-9a2a-eb181d4442a7/original=true/105218045.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1147761,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot sp0ntaneous\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe penis is not being stroked. The penis ejaculates spontaneously, without being touched."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ae27a0da-a6ba-48c5-8544-276112c09b86/original=true/105218049.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1724035,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot p4rtner\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe woman is stroking the penis."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4718c9f1-fecb-48f6-818c-479c3da54f50/original=true/105218046.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1657259,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot sp0ntaneous\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe penis is not being stroked. The penis ejaculates spontaneously, without being touched."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ },
+ {
+ "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/883106e3-f6a9-4957-9fe5-4ea18dedc29a/original=true/105218048.mp4",
+ "nsfwLevel": 16,
+ "width": 720,
+ "height": 1080,
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "type": "video",
+ "metadata": {
+ "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ",
+ "size": 1884569,
+ "audio": false,
+ "width": 720,
+ "height": 1080,
+ "duration": 6.031,
+ "skipScannedAtReassignment": true
+ },
+ "minor": false,
+ "poi": false,
+ "meta": {
+ "prompt": "b0dyshot sp0ntaneous\n\nThe video shows a man ejaculating on a woman's stomach and chest.\n\nHe ejaculates on her stomach and breasts.\nHer body and breasts covered in cum.\nThe cum spreads thickly across her stomach and breasts.\nA huge, thick load of white cum shoots from the penis. the cum lands with a wet splat, spreading thickly across her stomach and breasts.\nThe woman is happy.\n\nThe penis is not being stroked. The penis ejaculates spontaneously, without being touched."
+ },
+ "availability": "Public",
+ "hasMeta": true,
+ "hasPositivePrompt": true,
+ "onSite": false,
+ "remixOfId": null
+ }
+ ],
+ "downloadUrl": "https://civitai.com/api/download/models/2298673"
+ },
+ "civitai_primary_file": {
+ "id": 2189884,
+ "sizeKB": 599137.453125,
+ "name": "WAN-2.2-I2V-POV-Body-Cumshot-Pullout-HIGH-v1.safetensors",
+ "type": "Model",
+ "pickleScanResult": "Success",
+ "pickleScanMessage": "No Pickle imports",
+ "virusScanResult": "Success",
+ "virusScanMessage": null,
+ "scannedAt": "2025-10-10T05:06:07.844",
+ "metadata": {
+ "format": "SafeTensor",
+ "size": null,
+ "fp": null
+ },
+ "hashes": {
+ "AutoV1": "17CCE783",
+ "AutoV2": "A2D61C7C95",
+ "SHA256": "A2D61C7C951CFB359028F19E97F698EBE2937E7049B33DBC5BB7B1127BF7F10C",
+ "CRC32": "BD1D691B",
+ "BLAKE3": "BC91C3951EE5C4709ECC4571394B98C0A3065BB99C653E6B4CBBBAF1C25CADE5",
+ "AutoV3": "37EECD013E58"
+ },
+ "primary": true,
+ "downloadUrl": "https://civitai.com/api/download/models/2298673"
+ },
+ "id": "dl_1772663752030_0_WAN-2.2-I2",
+ "status": "completed",
+ "added_time": "2026-03-04T22:35:52.030470+00:00",
+ "progress": 100.0,
+ "speed": 0.0,
+ "error": null,
+ "start_time": "2026-03-04T22:35:52.422073+00:00",
+ "end_time": "2026-03-04T22:36:00.424950+00:00",
+ "connection_type": "Single"
+ },
+ {
+ "url": "https://civitai.com/api/download/models/2149614",
+ "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors",
+ "num_connections": 1,
+ "known_size": 613516752,
+ "api_key": "da82e3873725e824182cc021803091eb",
+ "model_url_or_id": "https://civitai.com/models/1899045?modelVersionId=2149614",
+ "model_version_id": null,
+ "custom_filename": "",
+ "force_redownload": false,
+ "filename": "WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors",
+ "model_name": "WAN 2.2 I2V - Combo Handjob Blowjob",
+ "version_name": "LOW v1",
+ "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/20e59e97-1f40-44dd-bad2-9e91d2570245/original=true/96534851.mp4?width=256",
+ "thumbnail_nsfw_level": 16,
+ "model_type": "loras",
+ "file_precision": null,
+ "file_model_size": null,
+ "file_format": "SafeTensor",
+ "civitai_model_id": 1899045,
+ "civitai_version_id": 2149614,
+ "civitai_file_id": 2043063,
+ "civitai_model_info": {
+ "id": 1899045,
+ "name": "WAN 2.2 I2V - Combo Handjob Blowjob",
+ "description": "I'm not sure if this particular act has a name, but it's when the lady uses her hand and her mouth simultaneously.
This lora works well by itself at strength 1 even without the general NSFW lora, and it works even if the lady doesn't have her hand on the phallus initially. Both POV and side/third person view are supported.
It's better for live-action than anime since animated fingers tend to get a bit blurry, but upscaling can do a good job at fixing it.
I tried a few different training settings to maybe reduce the filesize, but the 500MB versions were significantly better than the 250MB ones.
", + "allowNoCredit": true, + "allowCommercialUse": "{RentCivit,Rent}", + "allowDerivatives": true, + "allowDifferentLicense": true, + "type": "LORA", + "minor": false, + "sfwOnly": false, + "poi": false, + "nsfw": true, + "nsfwLevel": 60, + "availability": "Public", + "userId": 8910933, + "cosmetic": null, + "supportsGeneration": true, + "stats": { + "downloadCount": 74266, + "thumbsUpCount": 1603, + "thumbsDownCount": 2, + "commentCount": 39, + "tippedAmountCount": 250 + }, + "creator": { + "username": "TwoMoreLurker", + "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg" + }, + "tags": [ + "wan", + "action", + "blowjob", + "handjob" + ], + "modelVersions": [ + { + "id": 2149593, + "index": 0, + "name": "HIGH V1", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-26T02:20:09.949Z", + "publishedAt": "2025-08-26T02:25:35.407Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 39899, + "thumbsUpCount": 1498, + "thumbsDownCount": 2 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/12c383d3-d9cb-40a3-8b9b-873a0f93f172/original=true/46484643.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9G8Gg.O01~UG;%d%1NL0{-n}[E2?AWCxHsC", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "id": 2043052, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:26:08.142Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "68CE8FFD", + "AutoV2": "0794F26AB4", + "SHA256": "0794F26AB43A5BBB479FF21BD6AE1466FF4A3D6A0C21676AB34B832B82B875E0", + "CRC32": "F214FFF8", + "BLAKE3": "639AEADEA97B6AC99FD627B1419F5429C531A36476AA6AA716C655BB4BBC234F", + "AutoV3": "87931635DD90" + }, + "downloadUrl": "https://civitai.com/api/download/models/2149593", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6ab57591-b11f-4ba0-82eb-559b25082290/original=true/46484631.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/693097eb-99b2-4e43-8de0-40cb765a7639/original=true/96533576.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UMJjuMRj*JaLR%?bt+a#KHkBZ$SN00D%U^ae", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b98d39c0-79e7-41a1-9f1f-a3f781d1e828/original=true/46484626.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UnIXv?IoE2%1.TV?s9of.8jFoeNH-;bIWWs:", - "type": "image", + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8534,12 +5772,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/784f3f55-c969-4c7f-886f-5efcea1313e7/original=true/46484627.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/310c6ead-c40d-4ab5-8815-bb4db6fa6b53/original=true/96533577.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U8H1oQ9ZF2.8uPMd0Lxt00kq^kIp00_3$zMd", - "type": "image", + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8548,40 +5786,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6e4af638-bd12-4ee3-a591-cc146c289a0d/original=true/46484639.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d45624a0-2ac1-40d2-a724-37c4b5ca1067/original=true/96533574.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UFHAe6jF0MM|0LbIEMIp0g%1}?t7?G57w^j@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/62ae18e3-044e-4ee7-b682-566f6c22cc76/original=true/46484629.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U48fsW#f1R9}-IW_nit00]A3-MxI5xNC-Uo5", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6623a6d9-c697-4509-8bd1-bc5d4378807b/original=true/46484619.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6C#l0}r0g0#O?%15R9u04JAnOwv}rEM=ZaK", - "type": "image", + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8590,12 +5800,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6c2f4f88-1529-4c7a-9cdb-d0992b88ae13/original=true/46484625.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U7DQ]kNg0JEsO5NE=#ns0Jt0}[amEWX0ImxR", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9554e92d-4337-4fb4-a1b2-85ecf51ae2d6/original=true/96533578.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8604,12 +5814,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0c7680d0-0d5b-4757-9f92-117ba0bf960c/original=true/46484633.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UCE-:W5701~AaIt7%Msm0f^i={ENY6s.Q-tR", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f9675398-661a-4101-8b38-f856496ad431/original=true/96533575.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8618,12 +5828,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/41ea905a-f3d6-474e-9262-dfc957596401/original=true/46484632.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFG*f@~q0$x^56%2?Ft7D%V@={V?m,MyIVsA", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/382a0cb2-b7ac-4e1e-8e16-9b84d1253078/original=true/96533579.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8632,12 +5842,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c05d45fd-4238-4a48-8809-c4052a5cb5cd/original=true/46484618.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U3COO8KP02Ef0N=xsTnO04jY}?I;0gjFR*0~", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b0e96e76-359f-47d5-aaba-4a3032ce62da/original=true/96533580.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8646,40 +5856,73 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/19136335-2192-4f29-8740-916c00689621/original=true/46484621.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6DRWo?F030M0hE2=ds903I;^O~A9u={$$Ej", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/757caa8f-1a4c-42b6-a124-21b74781c058/original=true/96533581.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2149593" + }, + { + "id": 2149614, + "index": 1, + "name": "LOW v1", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-26T02:26:19.898Z", + "publishedAt": "2025-08-26T02:28:49.196Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 34367, + "thumbsUpCount": 440, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/85a0a11a-72d3-43a4-8ae2-287692bdfbb8/original=true/46484637.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6C=uPtl00xu}@T0I:ni00WB?H4n~Wni4T4o", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "id": 2043063, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:31:17.781Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "F4ECD6CD", + "AutoV2": "4371ED72FE", + "SHA256": "4371ED72FE9804257E69B56A37217BDAB641B76A64208B07A75F5D716A25985D", + "CRC32": "CE37F807", + "BLAKE3": "0736928E6D3183933A0DD4EEE9C283EAD29C16DA6C739800A9B09D8F76F988AB", + "AutoV3": "D32B86F25A0B" + }, + "downloadUrl": "https://civitai.com/api/download/models/2149614", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e550e9d9-8e3b-4258-ae74-ced224baca27/original=true/46484635.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UeKd;_F}YkXoR+,-v|%1I;VYs9xuk?NGNHS4", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/20e59e97-1f40-44dd-bad2-9e91d2570245/original=true/96534851.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8688,62 +5931,246 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/1182788" - }, + "downloadUrl": "https://civitai.com/api/download/models/2149614" + } + ] + }, + "civitai_version_info": { + "id": 2149614, + "modelId": 1899045, + "name": "LOW v1", + "nsfwLevel": 60, + "createdAt": "2025-08-26T02:26:19.898Z", + "updatedAt": "2025-08-26T02:28:53.079Z", + "status": "Published", + "publishedAt": "2025-08-26T02:28:49.196Z", + "trainedWords": [], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1899045@2149614", + "stats": { + "downloadCount": 34367, + "thumbsUpCount": 440 + }, + "model": { + "name": "WAN 2.2 I2V - Combo Handjob Blowjob", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2043063, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:31:17.781", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "F4ECD6CD", + "AutoV2": "4371ED72FE", + "SHA256": "4371ED72FE9804257E69B56A37217BDAB641B76A64208B07A75F5D716A25985D", + "CRC32": "CE37F807", + "BLAKE3": "0736928E6D3183933A0DD4EEE9C283EAD29C16DA6C739800A9B09D8F76F988AB", + "AutoV3": "D32B86F25A0B" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2149614" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/20e59e97-1f40-44dd-bad2-9e91d2570245/original=true/96534851.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3485955, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2149614" + }, + "civitai_primary_file": { + "id": 2043063, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:31:17.781", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "F4ECD6CD", + "AutoV2": "4371ED72FE", + "SHA256": "4371ED72FE9804257E69B56A37217BDAB641B76A64208B07A75F5D716A25985D", + "CRC32": "CE37F807", + "BLAKE3": "0736928E6D3183933A0DD4EEE9C283EAD29C16DA6C739800A9B09D8F76F988AB", + "AutoV3": "D32B86F25A0B" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2149614" + }, + "id": "dl_1772663723954_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:35:23.954233+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:35:24.216468+00:00", + "end_time": "2026-03-04T22:35:36.028652+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2149593", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", + "num_connections": 1, + "known_size": 613516752, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/1899045/wan-22-i2v-combo-handjob-blowjob", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", + "model_name": "WAN 2.2 I2V - Combo Handjob Blowjob", + "version_name": "HIGH V1", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/693097eb-99b2-4e43-8de0-40cb765a7639/original=true/96533576.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 1899045, + "civitai_version_id": 2149593, + "civitai_file_id": 2043052, + "civitai_model_info": { + "id": 1899045, + "name": "WAN 2.2 I2V - Combo Handjob Blowjob", + "description": "I'm not sure if this particular act has a name, but it's when the lady uses her hand and her mouth simultaneously.
This lora works well by itself at strength 1 even without the general NSFW lora, and it works even if the lady doesn't have her hand on the phallus initially. Both POV and side/third person view are supported.
It's better for live-action than anime since animated fingers tend to get a bit blurry, but upscaling can do a good job at fixing it.
I tried a few different training settings to maybe reduce the filesize, but the 500MB versions were significantly better than the 250MB ones.
", + "allowNoCredit": true, + "allowCommercialUse": "{RentCivit,Rent}", + "allowDerivatives": true, + "allowDifferentLicense": true, + "type": "LORA", + "minor": false, + "sfwOnly": false, + "poi": false, + "nsfw": true, + "nsfwLevel": 60, + "availability": "Public", + "userId": 8910933, + "cosmetic": null, + "supportsGeneration": true, + "stats": { + "downloadCount": 74266, + "thumbsUpCount": 1603, + "thumbsDownCount": 2, + "commentCount": 39, + "tippedAmountCount": 250 + }, + "creator": { + "username": "TwoMoreLurker", + "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/96af28c3-f5f8-46d8-9558-d60fe324773c/width=96/TwoMoreLurker.jpeg" + }, + "tags": [ + "wan", + "action", + "blowjob", + "handjob" + ], + "modelVersions": [ { - "id": 1126942, - "index": 27, - "name": "2.1", - "baseModel": "Flux.1 D", + "id": 2149593, + "index": 0, + "name": "HIGH V1", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", - "createdAt": "2024-12-04T00:20:58.431Z", - "publishedAt": "2024-12-19T00:55:15.802Z", + "createdAt": "2025-08-26T02:20:09.949Z", + "publishedAt": "2025-08-26T02:25:35.407Z", "status": "Published", "availability": "Public", "nsfwLevel": 60, - "description": "Improved female stability.
Improved multiple people, including male + female. However, no dicks still. There is plenty of training data in here, but the female genitalia knowledge is too high! Still working on it!
", - "covered": false, + "covered": true, "stats": { - "downloadCount": 717, - "thumbsUpCount": 94, - "thumbsDownCount": 1 + "downloadCount": 39899, + "thumbsUpCount": 1498, + "thumbsDownCount": 2 }, "files": [ { - "id": 1031664, - "sizeKB": 11786356.18554688, - "name": "fluxedUpFluxNSFW_21.safetensors", + "id": 2043052, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2024-12-04T00:53:04.265Z", + "scannedAt": "2025-08-26T02:26:08.142Z", "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "E0CCF81B", - "AutoV2": "0F82BEFE6A", - "SHA256": "0F82BEFE6A391C1C0CA8287EC51A268715EC19E49736C6AAD509EAA648E68DD5", - "CRC32": "94537B07", - "BLAKE3": "5B0685144639286B5418F6C5A83B95BF84BE32E4D7569AED6CF99BD800AC155F", - "AutoV3": "CDD04FA85B26" + "AutoV1": "68CE8FFD", + "AutoV2": "0794F26AB4", + "SHA256": "0794F26AB43A5BBB479FF21BD6AE1466FF4A3D6A0C21676AB34B832B82B875E0", + "CRC32": "F214FFF8", + "BLAKE3": "639AEADEA97B6AC99FD627B1419F5429C531A36476AA6AA716C655BB4BBC234F", + "AutoV3": "87931635DD90" }, - "downloadUrl": "https://civitai.com/api/download/models/1126942", + "downloadUrl": "https://civitai.com/api/download/models/2149593", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e475c3a3-1b28-4598-a5df-30cc053ae4c1/original=true/43546162.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UGGkB:}89u-;4nOsoJ-90ME2V@Ipoz%L-pM{", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/693097eb-99b2-4e43-8de0-40cb765a7639/original=true/96533576.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8752,12 +6179,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6e75d240-d915-4346-9ddb-a3cd9ff234e9/original=true/43546189.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFG[D|I80%x]4mNI4.t80Lx^~CwHI:axobt7", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/310c6ead-c40d-4ab5-8815-bb4db6fa6b53/original=true/96533577.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8766,12 +6193,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/29c77a16-373d-447a-b973-47986f274af7/original=true/43546365.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UuJkTCj[%Mxu_4ofR+ofkWj[RPWBaejtWBWB", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d45624a0-2ac1-40d2-a724-37c4b5ca1067/original=true/96533574.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8780,12 +6207,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1f80a954-91ca-4de5-ba72-8b7b7efb38c9/original=true/43546413.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UAC##kEk0M}?OE-Us.9u9uIp$$EMocI:xG%1", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9554e92d-4337-4fb4-a1b2-85ecf51ae2d6/original=true/96533578.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8794,12 +6221,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2c161d19-908b-4d57-80ee-8fd5335ef0bd/original=true/43546312.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UGE_z5-onhrqE0^jMxae4.Z~~W%MrCj[%1-p", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f9675398-661a-4101-8b38-f856496ad431/original=true/96533575.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -8808,68 +6235,549 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/62e63521-7e42-4b4b-8fad-78237e707b7c/original=true/43546419.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9C5SH}@EhI;9tE29[NG0}OE%1%2I?njadaJ", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/382a0cb2-b7ac-4e1e-8e16-9b84d1253078/original=true/96533579.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b0e96e76-359f-47d5-aaba-4a3032ce62da/original=true/96533580.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/757caa8f-1a4c-42b6-a124-21b74781c058/original=true/96533581.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2149593" + }, + { + "id": 2149614, + "index": 1, + "name": "LOW v1", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-26T02:26:19.898Z", + "publishedAt": "2025-08-26T02:28:49.196Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 34367, + "thumbsUpCount": 440, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/cde6ce9a-0927-40f4-aefe-3bf1295043eb/original=true/43546416.jpeg", + "id": 2043063, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-LOW-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:31:17.781Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "F4ECD6CD", + "AutoV2": "4371ED72FE", + "SHA256": "4371ED72FE9804257E69B56A37217BDAB641B76A64208B07A75F5D716A25985D", + "CRC32": "CE37F807", + "BLAKE3": "0736928E6D3183933A0DD4EEE9C283EAD29C16DA6C739800A9B09D8F76F988AB", + "AutoV3": "D32B86F25A0B" + }, + "downloadUrl": "https://civitai.com/api/download/models/2149614", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/20e59e97-1f40-44dd-bad2-9e91d2570245/original=true/96534851.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U8GGzx~Uxs580#RQ5R={0M9H5RWXIBFb=xaf", - "type": "image", + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2149614" + } + ] + }, + "civitai_version_info": { + "id": 2149593, + "modelId": 1899045, + "name": "HIGH V1", + "nsfwLevel": 60, + "createdAt": "2025-08-26T02:20:09.949Z", + "updatedAt": "2025-08-26T02:28:53.079Z", + "status": "Published", + "publishedAt": "2025-08-26T02:25:35.407Z", + "trainedWords": [], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1899045@2149593", + "stats": { + "downloadCount": 39899, + "thumbsUpCount": 1498 + }, + "model": { + "name": "WAN 2.2 I2V - Combo Handjob Blowjob", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2043052, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:26:08.142", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "68CE8FFD", + "AutoV2": "0794F26AB4", + "SHA256": "0794F26AB43A5BBB479FF21BD6AE1466FF4A3D6A0C21676AB34B832B82B875E0", + "CRC32": "F214FFF8", + "BLAKE3": "639AEADEA97B6AC99FD627B1419F5429C531A36476AA6AA716C655BB4BBC234F", + "AutoV3": "87931635DD90" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2149593" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/693097eb-99b2-4e43-8de0-40cb765a7639/original=true/96533576.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3249218, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031 + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/310c6ead-c40d-4ab5-8815-bb4db6fa6b53/original=true/96533577.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3485955, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d45624a0-2ac1-40d2-a724-37c4b5ca1067/original=true/96533574.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1690822, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9554e92d-4337-4fb4-a1b2-85ecf51ae2d6/original=true/96533578.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2754701, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f9675398-661a-4101-8b38-f856496ad431/original=true/96533575.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1689024, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031 + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/382a0cb2-b7ac-4e1e-8e16-9b84d1253078/original=true/96533579.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 5276675, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031 + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b0e96e76-359f-47d5-aaba-4a3032ce62da/original=true/96533580.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 4083522, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/757caa8f-1a4c-42b6-a124-21b74781c058/original=true/96533581.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 4550739, + "audio": false, + "width": 720, + "height": 1080, + "duration": 6.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "steps": 20, + "prompt": "A sexy woman is giving a man a blowjob and a handjob. The man is out of frame.\n\nShe is in front of the man. She is giving him a blowjob, while simultaneously giving a handjob. She is performing fellatio while stroking the shaft of his penis with one hand.", + "sampler": "DPM++ 2M" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2149593" + }, + "civitai_primary_file": { + "id": 2043052, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-HandjobBlowjobCombo-HIGH-v1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-26T02:26:08.142", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "68CE8FFD", + "AutoV2": "0794F26AB4", + "SHA256": "0794F26AB43A5BBB479FF21BD6AE1466FF4A3D6A0C21676AB34B832B82B875E0", + "CRC32": "F214FFF8", + "BLAKE3": "639AEADEA97B6AC99FD627B1419F5429C531A36476AA6AA716C655BB4BBC234F", + "AutoV3": "87931635DD90" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2149593" + }, + "id": "dl_1772663708169_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:35:08.169102+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:35:08.187057+00:00", + "end_time": "2026-03-04T22:35:16.617166+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2169847", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/WAN-2.2-I2V-POV-Cowgirl-LOW-v1.0-fixed.safetensors", + "num_connections": 1, + "known_size": 613516752, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/1874099?modelVersionId=2169847", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "WAN-2.2-I2V-POV-Cowgirl-LOW-v1.0-fixed.safetensors", + "model_name": "WAN 2.2 I2V - POV Cowgirl", + "version_name": "LOW v1.0", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6b574773-e4f5-4356-b7be-ea24f2cad7a4/original=true/97652713.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 1874099, + "civitai_version_id": 2169847, + "civitai_file_id": 2063797, + "civitai_model_info": { + "id": 1874099, + "name": "WAN 2.2 I2V - POV Cowgirl", + "description": "UPDATE 9/1 v1
Updated training settings should give even better movement.
---
UPDATE 8/19 v0.2
I've updated the dataset & training settings so that movement is more preserved. It works much better even without the general NSFW lora, give it a try and let me know how it goes for you.
----
My attempt at POV cowgirl for WAN 2.2. It works pretty well (doubly so if you also use the general NSFW lora), though the girl's hip motion can be less aggressive than I'd like.
This is only my second ever video lora and I'm training locally on a 3090 so it's slow progress. I'm still tweaking the training settings and the training data to hopefully show more hip movement. Give it a try and let me know your thoughts!
gguf version of 2.1
", - "covered": false, + "covered": true, "stats": { - "downloadCount": 199, - "thumbsUpCount": 8, + "downloadCount": 10690, + "thumbsUpCount": 253, "thumbsDownCount": 0 }, "files": [ { - "id": 1499919, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_21Q4KSGguf.gguf", + "id": 2063797, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-POV-Cowgirl-LOW-v1.0-fixed.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2025-03-30T13:43:14.333Z", + "scannedAt": "2025-09-01T06:21:00.556Z", "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "46EF1D54", - "AutoV2": "E5FDC804EB", - "SHA256": "E5FDC804EB1B3A2940F1353E022871EEE9FFACA6C0031EFCC44E2EDA318513A7", - "CRC32": "4182D06E", - "BLAKE3": "51C148FA7E9C912CAF6DB91EB44446894CBF26F1FA973C11F68B93C7416A9FCF", - "AutoV3": "7E4480CC245F" + "AutoV1": "A6E1C887", + "AutoV2": "5F925DD662", + "SHA256": "5F925DD66203C75256BF85C989569C8445C8299066FAEDF1C4CAD5E407FAA044", + "CRC32": "3B0F1086", + "BLAKE3": "F31E50EB51DA012E017291BAF6047FAC2A6F969504D1BD28B45332D52C107273", + "AutoV3": "694CD974B160" }, - "downloadUrl": "https://civitai.com/api/download/models/1155671", + "downloadUrl": "https://civitai.com/api/download/models/2169847", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8299bbd8-c157-482b-8acd-a3553cac96ac/original=true/45086786.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UGF}fzH?0#bw~VD*Vs%1GHIU$i%M%MWARjxa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2078e8e1-fe6c-4148-aaa5-cd9552b49544/original=true/45086825.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UoKwC7$*yEW=?^R+%MbHtmS4t7s.t8ozRjM|", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d9476d24-4f33-4430-b7e8-5e4666997bae/original=true/45086855.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UEEnkl%g~W-p_3tRtlbwEzae$zs9R4M_R5M{", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1a3aaf23-7117-427e-9f79-cabfd2ad090b/original=true/45086846.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9FN*WkD01V@0gs:}=IV0N%1}?Io-pozV[sS", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f91040f0-8c37-48bf-80d5-f1a20f82d3a8/original=true/45086854.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UDEoJTTK0N$y.9t8xaV@Kj-p~Ba}NGt7n#o#", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0e7224c6-9e39-47d0-ab53-0a55e1dab5f2/original=true/45086852.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UBGt{5?Z019[2nNG%KIo01My~B?G8zxHM|Ip", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6b574773-e4f5-4356-b7be-ea24f2cad7a4/original=true/97652713.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9152,40 +6903,74 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f03c044b-347c-4c2a-bf1d-9f59bf5d7575/original=true/45086858.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ec3564d6-5965-4c41-8a45-be1e34bf3aa6/original=true/97652714.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UAF}ciI.00D*0LNGRk^k01xZ~Bt79]-p$$9Z", - "type": "image", + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2169847" + }, + { + "id": 2127901, + "index": 2, + "name": "HIGH v0.2", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-19T03:26:19.924Z", + "publishedAt": "2025-08-19T03:31:18.984Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "description": "Updated dataset, tweaked training parameters for better movement
", + "covered": true, + "stats": { + "downloadCount": 19334, + "thumbsUpCount": 193, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/07e6bd62-8812-487c-97ca-6e1f44090848/original=true/45086845.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UjFWxmWbn.ad-tsXn%WB$-WAwys=tAn,WCs=", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "id": 2021923, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-POV-Cowgirl-HIGH-v0.2.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T03:31:25.965Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "88007B22", + "AutoV2": "F4C4BE2D20", + "SHA256": "F4C4BE2D20604E2F009D9D3A708E50C8CEF74165DF37A3ADB6A20A9371D2671F", + "CRC32": "77A656A5", + "BLAKE3": "53A06C0B1E8E222DA4329028F865F726AE0F38CB15EA45DFE85FA7A9330B10AC", + "AutoV3": "83A307977707" + }, + "downloadUrl": "https://civitai.com/api/download/models/2127901", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f7229a3b-4a87-44f2-80d8-f9aecfef5480/original=true/45086850.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U7Fp{G-Ao_$$0g$*0#EM0NJ7w^NH}?NH}?a}", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3b273d68-2114-4365-9112-776d0564bf14/original=true/95152932.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9194,12 +6979,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eb5d062a-40ec-4296-925a-cd9fdd73441f/original=true/45086849.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U8E_EfFx0~~A56D*0M#,0N?G=_JB0L-U~AIp", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/51d486f8-eb7a-421c-bbbf-922499c4aa1c/original=true/95152987.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9208,12 +6993,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5f103099-3a86-4503-b9d6-6c20a2819335/original=true/45086860.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UBD*FL}q0$NG0$J8xDEN5SNJ=w^5ocxFR-EN", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c96e97eb-f878-4716-80ff-173cab9d9741/original=true/95152936.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9222,12 +7007,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f6f2e64f-2edc-437a-838c-d94b430ff48c/original=true/45086859.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UaG*~K9Fx]xu.T9Zo}tRyDM{$%t7-;RjM{t7", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ac2ab8c3-c768-4172-9003-e48412161c98/original=true/95152944.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9236,12 +7021,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9a2fe783-f837-4c57-9027-ee627ff37dd4/original=true/45086843.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UPIW$N~V0L9a56M|xZR*9aIpxaxaEMs.NGM{", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a326c0bd-7b9f-42dc-a13d-36d84d9162d0/original=true/95152974.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9250,12 +7035,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b3eca289-fb25-401e-979f-c351290ae72b/original=true/45086847.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "ULH_Mg4n55?b~VIpD%o~.9RjRjNH%Nn$D%oz", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d412b2f5-cdf3-4baa-8e8b-c80414408ce6/original=true/95175268.mp4", + "nsfwLevel": 16, + "width": 560, + "height": 560, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9264,12 +7049,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/aa35c44c-89eb-4e50-a0a0-a9b13b4b9cd0/original=true/45086853.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f839662f-f7cd-47e8-9ce5-17d2a15a609b/original=true/95175260.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U2G@Y:?G00?aEg-V000100=_Eg9Z000M%3~C", - "type": "image", + "width": 560, + "height": 560, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9278,54 +7063,74 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca4f5df2-cadc-4df5-a859-3530914b9e4b/original=true/45086848.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9Bym|00OlIZIQWJx]M{NNx^9Xk74.?bD*^-", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b5cbf77e-e240-4baa-8846-ecf813a876ec/original=true/95176801.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2127901" + }, + { + "id": 2127912, + "index": 3, + "name": "LOW v0.2", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-19T03:32:18.825Z", + "publishedAt": "2025-08-19T03:33:46.847Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "description": "Updated dataset, tweaked training parameters
", + "covered": true, + "stats": { + "downloadCount": 18541, + "thumbsUpCount": 76, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5c37480e-c513-4c9e-b2cd-29cbb8b38df6/original=true/45086857.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UlJas6t6o}n%?^bbaeWVx]aes:oL%gWBRjoz", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "id": 2021934, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-POV-Cowgirl-LOW-v0.2.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T03:37:36.491Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "24D9353A", + "AutoV2": "35701366D3", + "SHA256": "35701366D30B42A5063CC112F1DBD9532DF8DABBFF0FD869D660EB0D6868C327", + "CRC32": "487CC222", + "BLAKE3": "F9160D44F2C722ED7EBCACFDE258C6E8DCEC860E06C4A6FB3D2C8E2D361E3225", + "AutoV3": "FCF9C653E4B1" + }, + "downloadUrl": "https://civitai.com/api/download/models/2127912", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a5c961dc-6811-4b4f-b599-bfc2954e25a5/original=true/45086851.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ac28d472-a67d-4b1b-b73d-e43d58d2d0b3/original=true/95153531.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UDHdKe-o5laL00RkIVt6M{V@}@WV^%xa%MNa", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/979728f4-434a-44d4-b29d-120d892d2bf3/original=true/45086844.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U6B2}:oM00WY0Qj[JDS54mbI~DslIlR+}@s:", - "type": "image", + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9334,12 +7139,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/53875533-2f96-4c96-a50a-f314ae763374/original=true/45086856.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UNGt{3s,0f%2xooIIUt69toJwfR+~Vj[M|j]", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/311acd76-11f9-4f8b-987a-6c1cad41e935/original=true/95153530.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9348,61 +7153,60 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/1155671" + "downloadUrl": "https://civitai.com/api/download/models/2127912" }, { - "id": 947686, - "index": 29, - "name": "1.0", - "baseModel": "Flux.1 D", + "id": 2121238, + "index": 4, + "name": "HIGH v0.1", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", - "createdAt": "2024-10-12T10:33:40.582Z", - "publishedAt": "2024-10-27T10:57:13.752Z", + "createdAt": "2025-08-17T04:06:03.646Z", + "publishedAt": "2025-08-17T04:09:55.119Z", "status": "Published", "availability": "Public", "nsfwLevel": 60, - "covered": false, + "description": "", + "covered": true, "stats": { - "downloadCount": 1789, - "thumbsUpCount": 158, - "thumbsDownCount": 1 + "downloadCount": 914, + "thumbsUpCount": 50, + "thumbsDownCount": 0 }, "files": [ { - "id": 854643, - "sizeKB": 11786358.49804688, - "name": "fluxedUpFluxNSFW_10.safetensors", + "id": 2015427, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-POV-Cowgirl-HIGH-v0.1.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2024-10-12T11:05:27.474Z", + "scannedAt": "2025-08-17T04:10:48.194Z", "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp8" + "format": "SafeTensor" }, "hashes": { - "AutoV1": "1E7D9A11", - "AutoV2": "B01E329816", - "SHA256": "B01E32981686AA2E7D03C70627E242CC223249A007CFA79936FF228C56F60C44", - "CRC32": "1200F3DF", - "BLAKE3": "FC5B4AA8F69D6535D1183EC403D62ADBA8874E7A28992D33BEB75FA18485991F", - "AutoV3": "F6DFB00F3905" + "AutoV1": "86DFF782", + "AutoV2": "E0EEB7AFE2", + "SHA256": "E0EEB7AFE2B7909DEEBAFD4A1F27DACEF3C593651AE887EFA868A0A78AE2F6C9", + "CRC32": "41D2B371", + "BLAKE3": "32D0414ECF0620E36CF3A2094B374A9EB1433DAFF873FFEC475407F4AB18AD37", + "AutoV3": "89D697745BB9" }, - "downloadUrl": "https://civitai.com/api/download/models/947686", + "downloadUrl": "https://civitai.com/api/download/models/2121238", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bc0bb3ac-368c-41f7-8951-b5465a5f4fc4/original=true/34172636.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UWKAsO?c.8xu_N%M?b%MxtbbRktRIpt6V?oL", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/234e6dba-8ebb-43ef-87a4-39f94bf7e5fb/original=true/94742618.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9411,12 +7215,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/55bf36db-fd95-4f5d-8b67-87c03b87b04d/original=true/34172612.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UULWR;R*.mi^9ubHbvWq00e.H?R*NaV@o#xu", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c3746505-cf5b-4574-b58c-24e9d0eb8ce1/original=true/94742795.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9425,12 +7229,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5edb56ff-6851-44af-8ae5-1bc98aab0cb8/original=true/34172724.jpeg", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/20c7184e-3c17-4316-8dc2-7897a0656711/original=true/94742617.mp4", "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "UDEe73S59u^j03NGjZs.M_j?~B9u0gs.EMEL", - "type": "image", + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9439,12 +7243,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3b099930-e946-4477-8234-f6b07a6487a6/original=true/34172727.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UPGaa_=}14%2.A-o-VW=X;bv-Us.-?ofoLs.", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e77c97a5-672d-4347-a776-64d60e3e9de4/original=true/94742619.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9453,12 +7257,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/df712f06-206d-4c9e-9618-ebbdd45adc15/original=true/34172725.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFN,9^005=x^0h00a#-:T1sl~A?bXSJB9b%2", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/971cf5d6-0066-49ad-8c3a-79c889591475/original=true/94742622.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9467,40 +7271,368 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4236e667-3074-4000-89f6-6002f8fc313c/original=true/34172726.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U8C=PMF1P:~BE3V@5Sw{0}IU=FIoIq$%^5of", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/149caeb8-02e0-443a-a394-d170beac1984/original=true/94742695.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2121238" + }, + { + "id": 2121251, + "index": 5, + "name": "LOW v0.1", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-17T04:10:13.067Z", + "publishedAt": "2025-08-17T04:10:55.877Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 771, + "thumbsUpCount": 29, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/38d00d52-fd79-4a19-ab60-230de9d62353/original=true/34172723.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UELps?MI1%xZ00R4MwWE3sbY^Pwc]3R:$*I:", - "type": "image", + "id": 2015437, + "sizeKB": 299617.1640625, + "name": "WAN-2.2-I2V-POV-Cowgirl-LOW-v0.1.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-17T04:16:01.649Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "302C3EED", + "AutoV2": "98675990E8", + "SHA256": "98675990E8C21F151D6DE1E7EF24CFA1348872BE48C66EE8DD9F7046C9C792C8", + "CRC32": "F90813A6", + "BLAKE3": "B7DC08E622A9606441A891C7EF6F8155A809FBC333C5ED85CE38C19A3A766F5A", + "AutoV3": "9F65902E108F" + }, + "downloadUrl": "https://civitai.com/api/download/models/2121251", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/cae7244d-08ec-4c6d-81f1-3cb86efced95/original=true/94743149.mp4", + "nsfwLevel": 16, + "width": 480, + "height": 720, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2121251" + } + ] + }, + "civitai_version_info": { + "id": 2169847, + "modelId": 1874099, + "name": "LOW v1.0", + "nsfwLevel": 60, + "createdAt": "2025-09-01T00:44:23.557Z", + "updatedAt": "2025-09-01T00:51:09.546Z", + "status": "Published", + "publishedAt": "2025-09-01T00:51:03.758Z", + "trainedWords": [], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1874099@2169847", + "stats": { + "downloadCount": 10690, + "thumbsUpCount": 253 + }, + "model": { + "name": "WAN 2.2 I2V - POV Cowgirl", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2063797, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-POV-Cowgirl-LOW-v1.0-fixed.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-01T06:21:00.556", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "A6E1C887", + "AutoV2": "5F925DD662", + "SHA256": "5F925DD66203C75256BF85C989569C8445C8299066FAEDF1C4CAD5E407FAA044", + "CRC32": "3B0F1086", + "BLAKE3": "F31E50EB51DA012E017291BAF6047FAC2A6F969504D1BD28B45332D52C107273", + "AutoV3": "694CD974B160" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2169847" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6b574773-e4f5-4356-b7be-ea24f2cad7a4/original=true/97652713.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 1610112, + "audio": false, + "width": 720, + "height": 1080, + "duration": 4.531, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is straddling a man, having sex with him in the cowgirl position. His penis is going in and out of her pussy. They are having fast, rough, intense sex. The penetration is deep. The woman's body is quivering and shuddering with pleasure. The woman is moaning in ecstasy, her body bouncing." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ec3564d6-5965-4c41-8a45-be1e34bf3aa6/original=true/97652714.mp4", + "nsfwLevel": 16, + "width": 720, + "height": 1080, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2085084, + "audio": false, + "width": 720, + "height": 1080, + "duration": 4.531, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "A sexy woman is straddling a man, having sex with him in the cowgirl position. His penis is going in and out of her pussy. They are having fast, rough, intense sex. The penetration is deep. The woman's body is quivering and shuddering with pleasure. The woman is moaning in ecstasy, her body bouncing." + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2169847" + }, + "civitai_primary_file": { + "id": 2063797, + "sizeKB": 599137.453125, + "name": "WAN-2.2-I2V-POV-Cowgirl-LOW-v1.0-fixed.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-09-01T06:21:00.556", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "A6E1C887", + "AutoV2": "5F925DD662", + "SHA256": "5F925DD66203C75256BF85C989569C8445C8299066FAEDF1C4CAD5E407FAA044", + "CRC32": "3B0F1086", + "BLAKE3": "F31E50EB51DA012E017291BAF6047FAC2A6F969504D1BD28B45332D52C107273", + "AutoV3": "694CD974B160" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2169847" + }, + "id": "dl_1772663470709_0_WAN-2.2-I2", + "status": "completed", + "added_time": "2026-03-04T22:31:10.709756+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:31:11.038285+00:00", + "end_time": "2026-03-04T22:31:22.941570+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2129201", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/Wan22-I2V-LOW-Hip_Slammin_Assertive_Cowgirl.safetensors", + "num_connections": 1, + "known_size": 306847752, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/1566648?modelVersionId=2129201", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "Wan22-I2V-LOW-Hip_Slammin_Assertive_Cowgirl.safetensors", + "model_name": "Wan I2V (2.2 & 2.1) - Assertive Cowgirl", + "version_name": "WAN2.2_LOWNOISE", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7396124-7def-4aa5-987c-1f5df85367fb/original=true/95229919.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 1566648, + "civitai_version_id": 2129201, + "civitai_file_id": 2023187, + "civitai_model_info": { + "id": 1566648, + "name": "Wan I2V (2.2 & 2.1) - Assertive Cowgirl", + "description": "Trained on 2.2 I2V A14B model. Massively increased dataset over the 2.1 version. Other camera angles work much better now, but POV was still the focus of the training data.
Weight 0.7~1.0 ... 1.0 is usually fine
Some of the start images can be seen here: https://civitai.com/posts/21124019
Sample workflow in the 'training data' download. https://civitai.com/api/download/training-data/2129122
HIGH model is trained on the actual 'hip slammin' motion.
LOW model is trained only on genital close-ups.
My thinking is that this gives base Wan more freedom to work out her facial expressions in the low noise steps. The low noise lora only helps where it's really needed- the genitals... Whether this assumption is actually accurate 🤷♀️ but training both on the same dataset resulted in noticeably muted facial expressions.
a woman is straddling a man and eagerly having sex with him. she is squatting.(trained-in to the low noise lora)
The man's penis slides in and out of view as it enters her vagina.His penis is penetrating her vagina. you can see his penis sliding in and out of her vagina.she moves quickly.she moves energetically.her hips move quickly down on his penis.she vigorously slams her hips down on the man.she is quickly moving her hips up and down. I also found that increasing the high noise CFG to ~6.0 helps a lot with movement on this lora.
Still not perfect- penis often 'smooths out' losing any texture/veinyness. And sometimes it just totally breaks.
You can run just the HIGH version, but may end up with accordion cocks (penis getting smashed under her hips rather than entering her pussy).
Since the lownoise lora is only helping with genitals, you can probably substitute other NSFW/penetration lownoise loras. No guarantees.
DISCLAIMER: Trained on 14B T2V model. But REALLY meant for I2V. Listed on Civit as I2V.
I made this for personal use and decided to share. I offer no warranty.
Input images including prompts can be seen here. https://civitai.com/posts/16809770
I love the other Wan cowgirl's, but I wanted something a little more aggressive and in-your-face.
So this one is trained on \"squatting, face focus, assertive\" cowgirl, where the woman slams her hips down on the cock while her upper body remains mostly stationary.
weight 1.0 works fine for most I2V. But try range 0.7~1.0
No trained trigger word, but I took some hints from other Wan sex loras for base prompt suggestion:
a woman is straddling a man and having sex with him. she is squatting. you can see his penis sliding in and out of her vagina.Optional 🤠🏇
she slams her hips down aggressively on his penis. Landscape-orientation inputs seem to give the most consistent results.
It does also work with reverse/ass-view cowgirl, but no anus data was trained, so beware...
Training data was mostly SFM clips, plus a couple anime clips, and some MMD clips. But no photorealistic, which is probably why T2V with this lora is so hideous.
Cock'n'pussy close-ups were included to reduce likelihood of cock horror.
If you do T2V, use weight 0.7 but you can still expect some ugly-ass remi-real waifus.
", + "allowNoCredit": true, + "allowCommercialUse": "{Image,RentCivit,Rent}", + "allowDerivatives": true, + "allowDifferentLicense": true, + "type": "LORA", + "minor": false, + "sfwOnly": false, + "poi": false, + "nsfw": true, + "nsfwLevel": 60, + "availability": "Public", + "userId": 3454614, + "cosmetic": null, + "supportsGeneration": true, + "stats": { + "downloadCount": 78196, + "thumbsUpCount": 2451, + "thumbsDownCount": 1, + "commentCount": 38, + "tippedAmountCount": 9750 + }, + "creator": { + "username": "icelouse", + "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f5f6f994-5eae-4ded-bd02-00724c204d8e/width=96/icelouse.jpeg" + }, + "tags": [ + "poses" + ], + "modelVersions": [ + { + "id": 2129122, + "index": 0, + "name": "WAN2.2_HIGHNOISE", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-19T13:50:45.718Z", + "publishedAt": "2025-08-19T14:40:15.426Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "trainedWords": [ + "a woman is straddling a man and eagerly having sex with him. she is squatting." + ], + "covered": true, + "stats": { + "downloadCount": 32920, + "thumbsUpCount": 1313, + "thumbsDownCount": 0 + }, + "files": [ + { + "id": 2023243, + "sizeKB": 4.451171875, + "name": "wan22_i2v_hip_slammin_workflow.zip", + "type": "Training Data", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T14:51:20.379Z", + "metadata": { + "format": "Other" + }, + "hashes": { + "AutoV2": "643A79F9CE", + "SHA256": "643A79F9CE31ABAB783D8BF57746F1B4E704BC60BE2CE26A888ABA42863655E8", + "CRC32": "C580DE0E", + "BLAKE3": "063138836FF946314576B96E4DF79598A261351B17B2747A12A047673762966D", + "AutoV3": "15B106F742B8" + }, + "downloadUrl": "https://civitai.com/api/download/models/2129122?type=Training%20Data" }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b708e91b-f763-4d73-b5e0-d5001335ec5b/original=true/34172728.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UDHdsp~qOst70zx]x]xu0Ln$^kNH=_IUR*ay", - "type": "image", + "id": 2023107, + "sizeKB": 299656.015625, + "name": "Wan22-I2V-HIGH-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T13:55:54.874Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "A363A508", + "AutoV2": "E183D07560", + "SHA256": "E183D0756075CB350FA5874690F6BBEA160ABF632F4F93D290C4EE1CF74D5C91", + "CRC32": "95BD01D9", + "BLAKE3": "C6EDB9F6CCB5BCECDFDA0178551CBC0402A1FD4DE9F7E2A3CF45E21ADFDFD2DA", + "AutoV3": "56EC5F28085A" + }, + "downloadUrl": "https://civitai.com/api/download/models/2129122", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/09096032-7e42-45a6-82c1-ad32bd0f6485/original=true/95225964.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9509,12 +7641,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a53b3ff4-8619-4c24-9298-6c8577d223a8/original=true/34172731.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UCFEs5kZ0,tS0zD%M_M{9wRQ~BRjx^IsxvRk", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a8d5d005-a2be-4ae6-a1c5-4ab33b8c9023/original=true/95226782.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9523,12 +7655,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/379af64d-a15d-4e06-93b6-d30709a2b5c3/original=true/34172730.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UPH-cLTNBpn$K-A0xbM{9$n,%1j]E2wtxXEM", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6da13f90-dfcf-4cbb-9c8e-5cf0d239abf6/original=true/95226941.mp4", + "nsfwLevel": 16, + "width": 1024, + "height": 800, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9537,12 +7669,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8e455c30-0881-46ce-acdb-d2ac3f849869/original=true/34172732.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UhLqF4kWt+%L?dxaXAjZ^-sWxbbbbuWn$$R%", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/397de7bb-c350-4d50-bd7f-88afef5d9148/original=true/95227135.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9551,12 +7683,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/52ece0a8-5b01-4b25-bfe1-f0e0aaeffa2b/original=true/34172739.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "ULC$N9tT0fRiBttT-4RiBsp0,-WA?ckE9bof", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/39197df2-b5e0-4001-9de7-f9d4b0f3fbf8/original=true/95227223.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9565,12 +7697,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6bcb72f6-74cc-4a39-9d2f-eb29d8899d2a/original=true/34172733.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U8A0?^T1H;9G-?%1DhD*BZ%24?R5.TS54oIU", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ffcabf75-cb6a-4aa9-b0b9-93de34daad36/original=true/95227284.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9579,12 +7711,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/005b3224-3cd0-4e8c-b630-4ca7b92604ae/original=true/34172734.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UAH-iSDNuPR4C7tSNeDiBWWWDh%M?H.9RQIU", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca1ab81e-935e-44fd-8d52-a9b62b02a56b/original=true/95227908.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9593,12 +7725,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/61720215-d86d-4306-a64d-29142c64b0c7/original=true/34172738.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UPG[D^00~qv}%gROxuWB9ut7RjR+adxuRit7", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/57df6ae6-8883-4ad5-bd0a-fca1ace6425e/original=true/95227995.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9607,12 +7739,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/498d2929-14e2-4bb1-af81-c652b14ddc0a/original=true/34172740.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UEBpUZE29HDl_JaMD+V[_0M}IVxtx?ofMzWU", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dc12885a-e353-4eaa-8bb7-f1e5337a7f6c/original=true/95228110.mp4", + "nsfwLevel": 16, + "width": 640, + "height": 1280, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9621,12 +7753,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/47861596-f733-4bfa-a18d-32e2cb70a420/original=true/34172742.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UBK,~o?vCm?H00IU0Jt87$M{rWIAD$xD~WRj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4e2961a3-228c-4419-ae73-31b5ecc0ae08/original=true/95228154.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9635,12 +7767,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c9d429a9-e82f-462c-ad39-edc9da0bf3a7/original=true/34172751.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UAI|UK?H2wIp%|NG=dE2KiOA=xRj~of+WCs,", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3989d1d6-b1f1-47a6-9477-7834be5fa129/original=true/95228241.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9649,12 +7781,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4fcba915-4812-4a6e-ad93-030d94281a02/original=true/34172745.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UDKvw1=vVxtmlCjF-C$%H?IAjFa~tQMwspx]", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4279a1b5-e6cc-4d6d-8c16-7ccfebc63fa1/original=true/95228383.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9663,76 +7795,26 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7e9c6d47-cbcc-488f-8839-6e2da5a28d27/original=true/34172748.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UgF=]zyDM_bcT#t9nNt7S+ohobS2ajS5NHs:", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c055d8d8-b116-40c1-8bf5-5c8ac8d94d3c/original=true/95228731.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/947686" - }, - { - "id": 1002861, - "index": 30, - "name": "1.0-Q8_0-gguf", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2024-10-28T11:12:40.417Z", - "publishedAt": "2024-11-12T12:28:05.947Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 60, - "description": "This is just a gguf-quantized version of this model.
There's no new training data in this version.
Early Access is just to support the development of further models.
The non-quantized version is just as capable and can be downloaded without donations.
", - "covered": false, - "stats": { - "downloadCount": 1655, - "thumbsUpCount": 141, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1500157, - "sizeKB": 12418879.15625, - "name": "fluxedUpFluxNSFW_10Q80Gguf.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-03-30T15:00:21.184Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "FD5F32C5", - "AutoV2": "646346F772", - "SHA256": "646346F7721D0F15F584FABC83A8536213E09EF0A6CFC04E8E643732B5B3C010", - "CRC32": "C8D6394F", - "BLAKE3": "ECC5A75EDF4867B19751001ABB284ED13847B58DF0F1B291C34E0B6A9F67C46F", - "AutoV3": "92BAB0289115" - }, - "downloadUrl": "https://civitai.com/api/download/models/1002861", - "primary": true - } - ], - "images": [ + }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7d31732-f9c3-4f5b-8b14-ff09bf48321b/original=true/37022684.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UEHAqgxa01NH0gs:ofxt4;NG~Af*0zs:57E2", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7ca87702-d753-4fde-b262-4d61d29cdec7/original=true/95229027.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9741,12 +7823,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/269f7da8-a31c-4f2e-be60-60d025f0550c/original=true/37022772.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UXC77{R+o#RP?wNGt7Rjx^WBjZWBtms.Rkof", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/91145af2-dad9-4099-ba69-4a7377912cb0/original=true/95229103.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9755,12 +7837,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a0dbfeae-5d35-4cfc-b128-cdfd4f4c0586/original=true/37022784.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UmH_i8s;cEax%hbGR-M{?woz-pe.x]t7ofWA", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/13dd7133-7e40-40b0-8fa0-70bff6328662/original=true/95229187.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9769,12 +7851,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ed834dcd-0308-45f6-b29d-f28e2f394517/original=true/37022798.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UGEL{2-:FqNF_Lt8ELNFtmt8xGIUtlxv%1V?", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/19d8463d-c708-4400-972c-f58bc2867e98/original=true/95229242.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9783,12 +7865,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2e71c8c1-dbe6-4d2d-baeb-450bf3f8f77e/original=true/37022785.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UjKc^K~UR*%2nin~j?ofbcM|V[NHWYt6WCa#", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d3aa3a8c-f4af-4e93-9ea4-f3e739b4317b/original=true/95268325.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9797,40 +7879,137 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4fd871af-72a5-4caa-8754-3c6b43a362da/original=true/37022792.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UgI###xtXAM{.Rxtxuae~os.V[kB%KoJs.of", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4d0d253a-02b7-463a-b13e-ff834327b9f2/original=true/95305289.mp4", + "nsfwLevel": 16, + "width": 992, + "height": 992, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2129122" + }, + { + "id": 2129201, + "index": 1, + "name": "WAN2.2_LOWNOISE", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-19T14:22:45.016Z", + "publishedAt": "2025-08-19T14:40:29.421Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "trainedWords": [ + "a woman is straddling a man and eagerly having sex with him. she is squatting." + ], + "covered": true, + "stats": { + "downloadCount": 29410, + "thumbsUpCount": 379, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6c9fc00b-25a2-482e-b21f-7383a68d37b7/original=true/37022786.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U@J[0IV[kqkC_Nofj[of-;xaaekCozWWjFjZ", - "type": "image", + "id": 2023187, + "sizeKB": 299656.0078125, + "name": "Wan22-I2V-LOW-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T14:25:47.272Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "636E4EFC", + "AutoV2": "377D31BDC2", + "SHA256": "377D31BDC22EB50F7FDF1D4D236AF4CCFE7C17FA14153A6D3D9BFFFB055E13D9", + "CRC32": "DD051C0D", + "BLAKE3": "E7FD35C37A35ADB23E011F8F34563BC2EFC699933687AA7A39BE0C98AB43EDDA", + "AutoV3": "8DE5D8FC4C78" + }, + "downloadUrl": "https://civitai.com/api/download/models/2129201", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7396124-7def-4aa5-987c-1f5df85367fb/original=true/95229919.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2129201" + }, + { + "id": 1772841, + "index": 2, + "name": "WAN_2.1", + "baseModel": "Wan Video 14B i2v 480p", + "baseModelType": "Standard", + "createdAt": "2025-05-10T23:34:16.452Z", + "publishedAt": "2025-05-11T00:04:48.018Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 15866, + "thumbsUpCount": 1309, + "thumbsDownCount": 1 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9af6c50f-2d6d-4e2b-aef5-33c5ef58d01c/original=true/37022791.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9E_?Qx^0z%g0#j_JCkX.QtS~W%M5SNLx^xv", - "type": "image", + "id": 1673571, + "sizeKB": 299617.1640625, + "name": "Wan-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-05-10T23:40:46.403Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "61876B6E", + "AutoV2": "1157E29FB1", + "SHA256": "1157E29FB15FDAEFC1DB16421B72BBBD8B3E9EAA4501D766CA0650BE5320A252", + "CRC32": "37926CD5", + "BLAKE3": "1EAADFB41C7014C2157166BBE80AD9BFBBA82826E6E3DBF7201E80E32057F0FF", + "AutoV3": "EBFC5CF92088" + }, + "downloadUrl": "https://civitai.com/api/download/models/1772841", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3e2a738f-b361-476a-b7f0-9401acd588d0/original=true/75493594.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UPEM5m-;Xm8_?^x]bw9F.8tRVsIAxvjFjERi", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9839,12 +8018,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/76048c60-2798-47d3-9777-9d3baafbc85a/original=true/37022793.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9FNr0Rk0gIV02-n9vW;039u}@xZ={xZIpNG", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/308a3d3b-a3e6-4e4b-bf17-1a393bdd2fe0/original=true/75495572.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "ULI}9aobCA?c76MxA1b_E5jEM{E3$y?arpR.", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9853,12 +8032,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/284a466b-2fdd-405e-9751-ad90e58791ea/original=true/37022795.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U%I;hdxat7s:~Voet7oftRj@WCkBE2WBRjj[", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/617997f2-c6b2-47f4-9528-6fc1db55549b/original=true/75495025.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "U4DI,.%M00IB#1s;^Xxa05jJ.N-:_Nnm0ebY", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9867,12 +8046,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/16f0a2a0-a08f-4c55-8e51-9ebac1f3b5db/original=true/37022799.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UBF$bU4T2zT1A4^dtQNM01pd=@$L?cVrtQNx", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b3252829-badf-4a66-9bfe-3f3b16204bcc/original=true/75495063.mp4", + "nsfwLevel": 16, + "width": 1248, + "height": 1248, + "hash": "UNLz4}i^pbXn~4RkEKS5^hI;TLso$fWBRQfl", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9881,12 +8060,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/745a8c46-9e0e-436c-8c2b-235179e15fdd/original=true/37022801.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UfLWkg-;?^-p_4R+%gxt%gaeozRk%1RiMyM{", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e8e85f5e-9069-4f5b-b4fd-df57c659b9e9/original=true/75495406.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UEG7}VEJ4VE0qyM_}[V@00RkoMt7Bh%3Scxb", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9895,12 +8074,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/db006690-af25-4c42-9ad4-1a8ae4477827/original=true/37022802.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UEG%[IxZ02~A0Ms.^jR*02IpoLNGs.t7I;9u", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ec8dd951-1ff7-48ae-9b06-036c8b5afd45/original=true/75495447.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UEFrbEM{In~p?]IoNa-:k;oL8woIr;tRD%M{", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9909,12 +8088,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/aa5920aa-0162-4c60-8e16-a114b9b214dd/original=true/37022800.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "ULIDgeNd0f-V0fR*Nbae0MoK~AofJos:IVNH", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6a259c7f-f08c-4892-92f3-d16196a1b717/original=true/75495502.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "UMLC|+$MDO$*8wofTeR+qZoKM|ay~VS4AbR*", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9923,12 +8102,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2afb9f52-52a0-4319-a95f-45844760c3c6/original=true/37022803.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UYHVC.og.8xu?wRkx]t7_3kCn$a{E2WCRPWB", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/734bbdc8-0279-408f-88f6-35b0b03cd0d9/original=true/75495639.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "U7E2z*4n00j?NQE0==bI00ozt2Rj~qSKj=M{", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9937,12 +8116,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0cf816e1-13b3-4b5a-bb51-43a912d497c0/original=true/37022804.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UGJ%UeEM6St7*0%2?u%1Fyt7kXxa?Ha}wcE2", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/334b0402-446b-4eec-aac2-c7764f9e1959/original=true/75495830.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UKDl$aIAE1.S.mRPM{yDt,ogIAa{a0tRR5RO", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9951,12 +8130,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c547dade-2db2-4626-91f8-deec06c634a0/original=true/37022809.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UaHUwrM_yE%M_4xZxvo}bvNdt6sln#NHWAV?", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b8b9d7b4-695e-41d9-a510-93ee6d18a8b0/original=true/75495881.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "ULI;hsobCA?c76MxAJb_EOjEIoE3$y?arpR.", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9965,12 +8144,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3e0c971b-aad2-4829-997b-f93708abea8f/original=true/37022805.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U39Ziv%10e%1~ERj01M|OaIp57V[02of^*-V", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/33706068-95ef-4d76-9cdc-6275f8dcfc62/original=true/75495967.mp4", + "nsfwLevel": 16, + "width": 1024, + "height": 1536, + "hash": "ULJj9,a0Q.TK01s:%1e-00t7EjRP.mM|T0%1", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9979,12 +8158,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c0df2861-fbd8-4b63-86d6-c3211abca029/original=true/37022806.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UDC?j100O?WH00?dD$oF0RxG-nNJ?dD$-;xx", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fd29b09e-30d5-4868-8bf2-4bbb26257c3a/original=true/75496016.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UAF}vS~X00R.4p?b~B%M00xHyX-quhM{t+xa", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -9993,76 +8172,26 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3443edc2-2100-4ff6-b15c-d6b80d61c1b9/original=true/37022807.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UJEx;nPCVmKm}bO=$-M}56R~={SvIUv*ngt7", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7ed3f148-cf7f-47ad-b13d-36c20b566aae/original=true/75496123.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "UUJ@OK9uLNsmBqtRTLs,pdIqR:aKM}oz%1s.", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1002861" - }, - { - "id": 1003520, - "index": 31, - "name": "1.0-Q4_K_S-gguf", - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "createdAt": "2024-10-28T15:29:06.206Z", - "publishedAt": "2024-11-12T16:19:10.069Z", - "status": "Published", - "availability": "Public", - "nsfwLevel": 60, - "description": "This is just a gguf-quantized version of this model.
There's no new training data in this version.
Early Access is just to support the development of further models.
The non-quantized version is just as capable and can be downloaded without donations.
", - "covered": false, - "stats": { - "downloadCount": 528, - "thumbsUpCount": 23, - "thumbsDownCount": 0 - }, - "files": [ - { - "id": 1499871, - "sizeKB": 6640447.15625, - "name": "fluxedUpFluxNSFW_10Q4KSGguf.gguf", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2025-03-30T13:27:43.689Z", - "metadata": { - "format": "GGUF", - "size": "pruned", - "fp": "fp8" - }, - "hashes": { - "AutoV1": "73355798", - "AutoV2": "ED5FC3BE3A", - "SHA256": "ED5FC3BE3A6809B07B1F24536B9399CC75A947C5EA96B1D0EC0EE86D331E8E7F", - "CRC32": "09C3F157", - "BLAKE3": "0D7A0FD05DA1B50D59C6267D80D07DDC819BDD30074CC97D02FD88A5AE2EAF54", - "AutoV3": "F7F6E92CE15F" - }, - "downloadUrl": "https://civitai.com/api/download/models/1003520", - "primary": true - } - ], - "images": [ + }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a1d65341-b5d9-4d43-9e49-ca83750a998b/original=true/37049270.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U%K1duoJ%M%M~qRjt7%MtRWBRQkCxutRV@Rj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/32466501-d1be-4a82-b5b2-a69249fc2639/original=true/75496180.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UKDl$aIAE1.S.mRPM{yDpJogIAa{a0tRR5RO", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10071,26 +8200,26 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/47ddabb2-9026-4ba9-ae98-a9447b558c7c/original=true/37049274.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UIB:~l8wp{M{s:WUIVofIpIUxFaeNxog%2WB", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dac7e3c2-ae4b-4792-9fda-726dbd74b530/original=true/75496221.mp4", + "nsfwLevel": 16, + "width": 1248, + "height": 1248, + "hash": "ULL:Dd|rV=Ki-+;1McX-tL?HX8%L?ZI;aJWA", + "type": "video", "minor": false, "poi": false, "hasMeta": true, - "hasPositivePrompt": false, + "hasPositivePrompt": true, "onSite": false, "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6bf521ee-dac0-427b-8b43-9122b0ba6328/original=true/37049306.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UDF;=-M|10~ByDxZN@ENEfE1$2s:0g-6wI9v", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8512b17f-3494-4363-9ed6-5ffea8387536/original=true/75496349.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "U8FYDoxt00=~I1NGsh-r01ozyAM|_Lx[X1M_", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10099,12 +8228,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/400c4760-54ed-419f-b235-6c32810fc92b/original=true/37049308.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UTF5,GRjOYoL_NbHs:oLIoo0aKbID%WCIoof", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a184b44-c58e-4faf-9950-14f4e04fdb2c/original=true/75496381.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "UZHeRj%1KRITL4kDS%RPtTW=Rjo0bdRkxCt7", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10113,12 +8242,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e93ec400-5814-4bc3-9068-7543df02bf22/original=true/37049310.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UdGRr3x[tQ%N~V%gxuoex]xv%2ofx^j^oMxu", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fd9f96a1-52c6-4b8d-86f6-145fb874fba1/original=true/75527898.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UPECg@-;Xm8_?^x]bw9F.8tRVsIAxvjFjERi", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10127,54 +8256,282 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/bdf550ca-b37d-4a73-a909-a5049a13539e/original=true/37049309.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UHGID+^,ysV=JF?cV=j;DPs9I8-U-qIAWoW=", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/18748f85-8a39-4334-a79f-3df9ef1e2b4f/original=true/75496621.mp4", + "nsfwLevel": 16, + "width": 1248, + "height": 1248, + "hash": "UTKdk[X9P2s8Yka{AdkC$_slo}S5?HW;$ynh", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/1772841" + } + ] + }, + "civitai_version_info": { + "id": 2129201, + "modelId": 1566648, + "name": "WAN2.2_LOWNOISE", + "nsfwLevel": 60, + "createdAt": "2025-08-19T14:22:45.016Z", + "updatedAt": "2025-08-19T14:40:29.430Z", + "status": "Published", + "publishedAt": "2025-08-19T14:40:29.421Z", + "trainedWords": [ + "a woman is straddling a man and eagerly having sex with him. she is squatting." + ], + "trainingStatus": null, + "trainingDetails": null, + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "earlyAccessEndsAt": null, + "earlyAccessConfig": null, + "description": null, + "uploadType": "Created", + "usageControl": "Download", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1566648@2129201", + "stats": { + "downloadCount": 29410, + "thumbsUpCount": 379 + }, + "model": { + "name": "Wan I2V (2.2 & 2.1) - Assertive Cowgirl", + "type": "LORA", + "nsfw": true, + "poi": false + }, + "files": [ + { + "id": 2023187, + "sizeKB": 299656.0078125, + "name": "Wan22-I2V-LOW-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T14:25:47.272", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "636E4EFC", + "AutoV2": "377D31BDC2", + "SHA256": "377D31BDC22EB50F7FDF1D4D236AF4CCFE7C17FA14153A6D3D9BFFFB055E13D9", + "CRC32": "DD051C0D", + "BLAKE3": "E7FD35C37A35ADB23E011F8F34563BC2EFC699933687AA7A39BE0C98AB43EDDA", + "AutoV3": "8DE5D8FC4C78" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2129201" + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7396124-7def-4aa5-987c-1f5df85367fb/original=true/95229919.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "metadata": { + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 4061392, + "audio": false, + "width": 1136, + "height": 880, + "duration": 4.031, + "skipScannedAtReassignment": true + }, + "minor": false, + "poi": false, + "meta": { + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has a serious expression. she is looking at the camera. she is angry. she leans in. the image is in sharp focus. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina. it is raining.\n" + }, + "availability": "Public", + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2129201" + }, + "civitai_primary_file": { + "id": 2023187, + "sizeKB": 299656.0078125, + "name": "Wan22-I2V-LOW-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T14:25:47.272", + "metadata": { + "format": "SafeTensor", + "size": null, + "fp": null + }, + "hashes": { + "AutoV1": "636E4EFC", + "AutoV2": "377D31BDC2", + "SHA256": "377D31BDC22EB50F7FDF1D4D236AF4CCFE7C17FA14153A6D3D9BFFFB055E13D9", + "CRC32": "DD051C0D", + "BLAKE3": "E7FD35C37A35ADB23E011F8F34563BC2EFC699933687AA7A39BE0C98AB43EDDA", + "AutoV3": "8DE5D8FC4C78" + }, + "primary": true, + "downloadUrl": "https://civitai.com/api/download/models/2129201" + }, + "id": "dl_1772663449779_0_Wan22-I2V-", + "status": "completed", + "added_time": "2026-03-04T22:30:49.779749+00:00", + "progress": 100.0, + "speed": 0.0, + "error": null, + "start_time": "2026-03-04T22:30:50.028164+00:00", + "end_time": "2026-03-04T22:30:55.310413+00:00", + "connection_type": "Single" + }, + { + "url": "https://civitai.com/api/download/models/2129122", + "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/Wan22-I2V-HIGH-Hip_Slammin_Assertive_Cowgirl.safetensors", + "num_connections": 1, + "known_size": 306847760, + "api_key": "da82e3873725e824182cc021803091eb", + "model_url_or_id": "https://civitai.com/models/1566648/wan-i2v-22-and-21-assertive-cowgirl", + "model_version_id": null, + "custom_filename": "", + "force_redownload": false, + "filename": "Wan22-I2V-HIGH-Hip_Slammin_Assertive_Cowgirl.safetensors", + "model_name": "Wan I2V (2.2 & 2.1) - Assertive Cowgirl", + "version_name": "WAN2.2_HIGHNOISE", + "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/09096032-7e42-45a6-82c1-ad32bd0f6485/original=true/95225964.mp4?width=256", + "thumbnail_nsfw_level": 16, + "model_type": "loras", + "file_precision": null, + "file_model_size": null, + "file_format": "SafeTensor", + "civitai_model_id": 1566648, + "civitai_version_id": 2129122, + "civitai_file_id": 2023107, + "civitai_model_info": { + "id": 1566648, + "name": "Wan I2V (2.2 & 2.1) - Assertive Cowgirl", + "description": "Trained on 2.2 I2V A14B model. Massively increased dataset over the 2.1 version. Other camera angles work much better now, but POV was still the focus of the training data.
Weight 0.7~1.0 ... 1.0 is usually fine
Some of the start images can be seen here: https://civitai.com/posts/21124019
Sample workflow in the 'training data' download. https://civitai.com/api/download/training-data/2129122
HIGH model is trained on the actual 'hip slammin' motion.
LOW model is trained only on genital close-ups.
My thinking is that this gives base Wan more freedom to work out her facial expressions in the low noise steps. The low noise lora only helps where it's really needed- the genitals... Whether this assumption is actually accurate 🤷♀️ but training both on the same dataset resulted in noticeably muted facial expressions.
a woman is straddling a man and eagerly having sex with him. she is squatting.(trained-in to the low noise lora)
The man's penis slides in and out of view as it enters her vagina.His penis is penetrating her vagina. you can see his penis sliding in and out of her vagina.she moves quickly.she moves energetically.her hips move quickly down on his penis.she vigorously slams her hips down on the man.she is quickly moving her hips up and down. I also found that increasing the high noise CFG to ~6.0 helps a lot with movement on this lora.
Still not perfect- penis often 'smooths out' losing any texture/veinyness. And sometimes it just totally breaks.
You can run just the HIGH version, but may end up with accordion cocks (penis getting smashed under her hips rather than entering her pussy).
Since the lownoise lora is only helping with genitals, you can probably substitute other NSFW/penetration lownoise loras. No guarantees.
DISCLAIMER: Trained on 14B T2V model. But REALLY meant for I2V. Listed on Civit as I2V.
I made this for personal use and decided to share. I offer no warranty.
Input images including prompts can be seen here. https://civitai.com/posts/16809770
I love the other Wan cowgirl's, but I wanted something a little more aggressive and in-your-face.
So this one is trained on \"squatting, face focus, assertive\" cowgirl, where the woman slams her hips down on the cock while her upper body remains mostly stationary.
weight 1.0 works fine for most I2V. But try range 0.7~1.0
No trained trigger word, but I took some hints from other Wan sex loras for base prompt suggestion:
a woman is straddling a man and having sex with him. she is squatting. you can see his penis sliding in and out of her vagina.Optional 🤠🏇
she slams her hips down aggressively on his penis. Landscape-orientation inputs seem to give the most consistent results.
It does also work with reverse/ass-view cowgirl, but no anus data was trained, so beware...
Training data was mostly SFM clips, plus a couple anime clips, and some MMD clips. But no photorealistic, which is probably why T2V with this lora is so hideous.
Cock'n'pussy close-ups were included to reduce likelihood of cock horror.
If you do T2V, use weight 0.7 but you can still expect some ugly-ass remi-real waifus.
", + "allowNoCredit": true, + "allowCommercialUse": "{Image,RentCivit,Rent}", + "allowDerivatives": true, + "allowDifferentLicense": true, + "type": "LORA", + "minor": false, + "sfwOnly": false, + "poi": false, + "nsfw": true, + "nsfwLevel": 60, + "availability": "Public", + "userId": 3454614, + "cosmetic": null, + "supportsGeneration": true, + "stats": { + "downloadCount": 78196, + "thumbsUpCount": 2451, + "thumbsDownCount": 1, + "commentCount": 38, + "tippedAmountCount": 9750 + }, + "creator": { + "username": "icelouse", + "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f5f6f994-5eae-4ded-bd02-00724c204d8e/width=96/icelouse.jpeg" + }, + "tags": [ + "poses" + ], + "modelVersions": [ + { + "id": 2129122, + "index": 0, + "name": "WAN2.2_HIGHNOISE", + "baseModel": "Wan Video 2.2 I2V-A14B", + "baseModelType": "Standard", + "createdAt": "2025-08-19T13:50:45.718Z", + "publishedAt": "2025-08-19T14:40:15.426Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "trainedWords": [ + "a woman is straddling a man and eagerly having sex with him. she is squatting." + ], + "covered": true, + "stats": { + "downloadCount": 32920, + "thumbsUpCount": 1313, + "thumbsDownCount": 0 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/898f22ec-399a-4af2-afba-7e32ed1d2c1e/original=true/37049307.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "URAveOxB9}s8%QadJCadAfNGs;axE-WBxYs.", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null + "id": 2023243, + "sizeKB": 4.451171875, + "name": "wan22_i2v_hip_slammin_workflow.zip", + "type": "Training Data", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T14:51:20.379Z", + "metadata": { + "format": "Other" + }, + "hashes": { + "AutoV2": "643A79F9CE", + "SHA256": "643A79F9CE31ABAB783D8BF57746F1B4E704BC60BE2CE26A888ABA42863655E8", + "CRC32": "C580DE0E", + "BLAKE3": "063138836FF946314576B96E4DF79598A261351B17B2747A12A047673762966D", + "AutoV3": "15B106F742B8" + }, + "downloadUrl": "https://civitai.com/api/download/models/2129122?type=Training%20Data" }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca464a92-9cf7-456b-9595-06d8f0200cc9/original=true/37049313.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UHDcHxs,9[Io?^WVsWM{KPWVxGaK?HR*IoV@", - "type": "image", - "minor": false, - "poi": false, - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, + "id": 2023107, + "sizeKB": 299656.015625, + "name": "Wan22-I2V-HIGH-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T13:55:54.874Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "A363A508", + "AutoV2": "E183D07560", + "SHA256": "E183D0756075CB350FA5874690F6BBEA160ABF632F4F93D290C4EE1CF74D5C91", + "CRC32": "95BD01D9", + "BLAKE3": "C6EDB9F6CCB5BCECDFDA0178551CBC0402A1FD4DE9F7E2A3CF45E21ADFDFD2DA", + "AutoV3": "56EC5F28085A" + }, + "downloadUrl": "https://civitai.com/api/download/models/2129122", + "primary": true + } + ], + "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2161df95-9326-4f2b-91cc-471d4a9be741/original=true/37049312.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UKF}s1s:Jnt6~VbH-:X8K5sm={ba-UM|s:xt", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/09096032-7e42-45a6-82c1-ad32bd0f6485/original=true/95225964.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10183,12 +8540,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/955a2f2a-06bf-471f-ae35-b0e665fba448/original=true/37049314.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UKGbem00E2.9?wDiNH-;9Gxu$$%2S#S3%1a#", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a8d5d005-a2be-4ae6-a1c5-4ab33b8c9023/original=true/95226782.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10197,12 +8554,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/282dfe32-c51b-465b-912f-63e4f25dfbcf/original=true/37049315.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFD8?^~VJ6S#WV$*Rjs.9Zso%2R*xZR*%2of", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6da13f90-dfcf-4cbb-9c8e-5cf0d239abf6/original=true/95226941.mp4", + "nsfwLevel": 16, + "width": 1024, + "height": 800, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10211,12 +8568,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1bb9cb71-26d8-4418-af55-35de6f93cb53/original=true/37049326.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFI;FdNa~A~B_LWAEfxu01Io4oa#4pIq4:s:", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/397de7bb-c350-4d50-bd7f-88afef5d9148/original=true/95227135.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10225,12 +8582,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f2ed5dc2-63e1-4c7c-a8f9-dfc622198bbe/original=true/37049321.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U9BMuos:01TK.Txv9ZtRF|Xn^3rq01%h-nMd", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/39197df2-b5e0-4001-9de7-f9d4b0f3fbf8/original=true/95227223.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10239,12 +8596,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6384f2da-a76a-493e-867d-e578fe395966/original=true/37051309.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "U%I=ibfST1of.TRkkXoztkoJwbkCNIa#aKay", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ffcabf75-cb6a-4aa9-b0b9-93de34daad36/original=true/95227284.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10253,12 +8610,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e99dab78-a666-4476-95b9-ac003dba6df9/original=true/37051311.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UuF?9Ho#NHtR_4t8R*t7-;s:e-ofxZofWAoK", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca1ab81e-935e-44fd-8d52-a9b62b02a56b/original=true/95227908.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10267,12 +8624,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/50f92fdd-ed24-46bb-a7e4-c6a3f8e918ac/original=true/37051310.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UWEeGRbbs.Ip}@NHs.Rks.NGo0s:s:ofWXs:", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/57df6ae6-8883-4ad5-bd0a-fca1ace6425e/original=true/95227995.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10281,12 +8638,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/32469cc6-05c4-4d74-ab8d-fd7a8c70cf3d/original=true/37051378.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UABVkZx]5S}@t7ELE2xa57RjxZI:0M=x^PE2", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dc12885a-e353-4eaa-8bb7-f1e5337a7f6c/original=true/95228110.mp4", + "nsfwLevel": 16, + "width": 640, + "height": 1280, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10295,12 +8652,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/88920fba-b115-4047-bd54-65d0fbdc3d76/original=true/37051381.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UC9tDWbY00V[_NWCDiocO@j[rXa{tkj[RPWB", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4e2961a3-228c-4419-ae73-31b5ecc0ae08/original=true/95228154.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10309,12 +8666,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5d8c1d44-ee91-4d9b-a9bd-6b6e34d271d4/original=true/37051379.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UFF$t^tR03o#00WBt7RP_NoftRWBtTayD%kC", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3989d1d6-b1f1-47a6-9477-7834be5fa129/original=true/95228241.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -10323,685 +8680,235 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f5fa65cb-8bdc-42d4-b93a-0d9cba03bef5/original=true/37051380.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UyKT=0IUx]WX?ws+tRoepJxtofay%LkDRjay", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4279a1b5-e6cc-4d6d-8c16-7ccfebc63fa1/original=true/95228383.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/1003520" - } - ] - }, - "civitai_version_info": { - "id": 2577735, - "modelId": 847101, - "name": "7.1_FP16", - "nsfwLevel": 29, - "createdAt": "2026-01-08T12:08:52.533Z", - "updatedAt": "2026-02-05T23:26:58.906Z", - "status": "Published", - "publishedAt": "2026-01-23T15:35:02.905Z", - "trainedWords": [], - "trainingStatus": null, - "trainingDetails": null, - "baseModel": "Flux.1 D", - "baseModelType": "Standard", - "earlyAccessEndsAt": null, - "earlyAccessConfig": { - "timeframe": 0, - "donationGoal": 900000, - "downloadPrice": 7000, - "donationGoalId": 16527, - "generationPrice": 7000, - "chargeForDownload": true, - "originalTimeframe": "15", - "chargeForGeneration": true, - "donationGoalEnabled": true, - "originalPublishedAt": "2026-01-08T15:34:35.377", - "generationTrialLimit": 10 - }, - "description": "", - "uploadType": "Created", - "usageControl": "Download", - "air": "urn:air:flux1:checkpoint:civitai:847101@2577735", - "stats": { - "downloadCount": 7187, - "thumbsUpCount": 275 - }, - "model": { - "name": "Fluxed Up [Flux NSFW Checkpoint]", - "type": "Checkpoint", - "nsfw": false, - "poi": false - }, - "files": [ - { - "id": 2465089, - "sizeKB": 23245069.875, - "name": "fluxedUpFluxNSFW_71FP16.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2026-01-08T13:22:48.524", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp16" - }, - "hashes": { - "AutoV1": "24EAE645", - "AutoV2": "1F124F677C", - "SHA256": "1F124F677C8EC5C45B82B750201EDB16CF197415CF72FA2570C78726B5AB427F", - "CRC32": "46FFA9F8", - "BLAKE3": "9BBE19D37074C1C8A3A2D9059EA679D34E8F9B446AC5DF95CB7808387F792A4E", - "AutoV3": "A2FA1DBAC4DE" - }, - "primary": true, - "downloadUrl": "https://civitai.com/api/download/models/2577735" - } - ], - "images": [ - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d33e41fe-fca3-4f1e-ac5e-d7c2646fbb70/original=true/116759040.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UFJ6$j~V5RS#009aozNGo|M|$*%1o}x[Vtn$", - "type": "image", - "metadata": { - "hash": "UFJ6$j~V5RS#009aozNGo|M|$*%1o}x[Vtn$", - "size": 2430098, - "width": 1080, - "height": 1920, - "nsfwLevelReason": "Knights Vote" - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 833681268245460, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an (Flash photography:0.4) photography of an adult mature 30y-o european woman with copper Sunkissed Balayage Waves hair. She is wearing pencil skirt and blouse. \nposing for the viewer\nThe scene is captured in a in a candlelit bistro corner, cozy and filled with the aroma of freshly baked bread location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Sony a7 IV Mirrorless Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4dc7c49a-4f72-432f-b2aa-0af54aca4f28/original=true/116759056.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UZK,jN~pIojEx^?abvM{MxM{ozozRPMxaKt7", - "type": "image", - "metadata": { - "hash": "UZK,jN~pIojEx^?abvM{MxM{ozozRPMxaKt7", - "size": 2228680, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 682268377224826, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an iphone photography of an adult mature 25y-o asian woman with red Side French Braid hair. She is wearing cake dress and seamless tights. \nA close-up of the woman using a Teal, translucent, and (crystal glass sex toy dildo:1.4), which she is inserting the plastic sex toy dildo into her mouth. The dildo is wet with body liquid and is glistening.\nThe scene is captured in a softly glowing lights above a bathroom sink, with a stack of fluffy towels nearby location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Graflex Century Graphic 2×3 Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/66937229-8d43-4ef8-a15a-a94e9c84b7ae/original=true/116759064.jpeg", - "nsfwLevel": 4, - "width": 1080, - "height": 1920, - "hash": "UFJa7506029]03~S.4t60yIW$$M|teM}a3Sx", - "type": "image", - "metadata": { - "hash": "UFJa7506029]03~S.4t60yIW$$M|teM}a3Sx", - "size": 2676753, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 733305829496570, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an (Flash photography:0.4) photography of an adult mature 45y-o Honduran woman with Ash Brown Undone Hollywood Waves hair. She is wearing skirt and wet shirt. She is wearing glasses. \nShe is wearing a low-cut, Yellow dress with thin straps and a deep V-neckline that accentuates her cleavage. She is wearing a Origami fold skirt skirt . The dress is made of a smooth, flowing fabric that drapes elegantly over her body. One of her breasts is lifted higher, revealing her nipple slightly.\nThe scene is captured in a in outer space with starry voids location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Graflex Century Graphic 2×3 Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/304d50ad-4c27-40be-88f0-b25d99337b9e/original=true/116759072.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UAH1-|5p00^OL3~V^%WB4TM{F}-T009a-;9u", - "type": "image", - "metadata": { - "hash": "UAH1-|5p00^OL3~V^%WB4TM{F}-T009a-;9u", - "size": 3283261, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 577410860833403, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an candid photography of an adult mature 40y-o european woman with Copper fringe hair. She is wearing Lattice skirts and Polo shirt. \nThe scene is captured in a simple metal desk in a dimly lit spaceport office, cluttered with papers location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Canon G III QL17 Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0cbac796-2811-40f0-b877-05b999999459/original=true/116759077.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UXIz*YVYbcV@.TM{ofn$KQJBM{WU%Ls;IUNH", - "type": "image", - "metadata": { - "hash": "UXIz*YVYbcV@.TM{ofn$KQJBM{WU%Ls;IUNH", - "size": 3072854, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 547716343402304, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an DCIM photography of african woman with burgundy Voluminous Curls hair. She is wearing knee socks. \nThe scene is captured in a in a hammock by a calm lake location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Sony a7 IV Mirrorless Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca2c1060-5848-46cb-b1bb-29149d96ef0c/original=true/116759065.jpeg", - "nsfwLevel": 16, - "width": 1080, - "height": 1920, - "hash": "U9I;q*?a0{VF00-o~nNHOr9vjckE00$*=~xa", - "type": "image", - "metadata": { - "hash": "U9I;q*?a0{VF00-o~nNHOr9vjckE00$*=~xa", - "size": 2611779, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 699147520333345, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an iphone photography of an adult mature 40y-o caucasian woman with auburn updo hair. She is wearing Hauberk and no-show panties. \nA medium closeup, dynamic action shot captures a lovely woman in the midst of a sticky situation on a sunny afternoon. Sheâs mid-laugh, eyes squinting slightly as thick streams of slime arc through the air. Her long, damp hair clings to her neck and shoulders. The slime being fired is milky white and cloudy gray in tone, with a thick, jelly-like consistency that glistens under the sun. It coats her entire face, as well as her arms and chest in slick, oily streaks, clinging heavily but sliding slowly as she moves. she has huge and busty breasts. The scene is captured with cinematic flairâgentle highlight roll-off, matte shadow tones that preserve the sticky textures, compressed dynamic range, and a warm nostalgic tone evoking Kodak Portra 400 film.\nThe scene is captured in a wooden bench near a quiet, rippling pond in a secluded garden location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Nikon FE Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/145a6448-eb02-46d6-8124-369172cba699/original=true/116759089.jpeg", - "nsfwLevel": 4, - "width": 1080, - "height": 1920, - "hash": "UrJa+b%Nt7jY_NbbRke.%MWAaeofo#o0oJX8", - "type": "image", - "metadata": { - "hash": "UrJa+b%Nt7jY_NbbRke.%MWAaeofo#o0oJX8", - "size": 2776244, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 942773639692027, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an (Flash photography:0.4) photography of Chadian woman with ash blonde Princess Curls hair. She is wearing dutch traditional dress - a modern interpretation of the classic Volendam costume, showcasing a fitted bodice and a flowing skirt with bold colors, often adorned with lace and frills that playfully reveal the figure. and hobbled and shackled latex stockings. \n(The woman is in the process of lifting her Black High-waisted bikini, revealing her bare breasts with prominent nipples.:0.6). (She is wearing a short Gold skirt that barely covers her buttocks, revealing her bare buttocks and genital area under. She is blushing and mischiveous.:0.4)\nThe scene is captured in a atop a steep cliff with ocean views location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Canon EOS R5 Mirrorless Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/97d5a5de-0836-481f-8cb4-94b4395853fe/original=true/116759069.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UIKdVo_Ntma0_N-;tSIAtl?vj?IUnN%Mfkx]", - "type": "image", - "metadata": { - "hash": "UIKdVo_Ntma0_N-;tSIAtl?vj?IUnN%Mfkx]", - "size": 2612112, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 684742873806453, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an DCIM photography of Beninese woman with red Layered V-Cut hair. She is wearing Paperbag waist shorts and Duster coat. She is wearing glasses. \nA nude woman with blonde hair tied in wavy ponytail sits on a bed in a bright and airy room, wearing a white shirt with a green tie hanging loose around her neck. Her face is tilted slightly upwards as she looks at the camera with a subtle smile. Her eyes are a bright green and her skin is smooth and pale. She has a lean petite build and her nipples are visible through her translucent shirt. Her breasts are small and perky, with pink nipples. Her pubic area is visible, and her vagina is exposed, with a small patch of blonde pubic hair over it. Her slim legs are spread wide, with her knees bent and her feet dangling off the bed. She's holding a smartphone in one hand, taking a selfie with her other hand extended, as if she's about to take a picture. The scene is lit with soft natural light pouring in through a window, and the image is rendered in a realistic and detailed style, with a focus on the woman's anatomy and expression\nThe scene is captured in a on a secluded picnic in a forest clearing location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Polaroid SX-70 Alpha Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - }, - { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f890a081-fa66-4a44-9e22-db14cedc5138/original=true/116759083.jpeg", - "nsfwLevel": 8, - "width": 1080, - "height": 1920, - "hash": "UAFP4]Ip9Y~X9tRjaKWV00s:%2M|My%MIAIU", - "type": "image", - "metadata": { - "hash": "UAFP4]Ip9Y~X9tRjaKWV00s:%2M|My%MIAIU", - "size": 3418477, - "width": 1080, - "height": 1920 - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 115498587289932, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an iphone photography of an adult mature 35y-o asian woman with Black Aphrodite Curls hair. She is wearing gas-mask integrated latex bodystocking. She is wearing glasses. \nThe woman is laying on her back on a Top of a sand pile. Her legs are spread apart with the hands out to the side. Her vaginal slit and vulva are clearly visible in an erotic display.\nThe scene is captured in a along a leaf-strewn path with stones location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Fujifilm X-S10 Mirrorless Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c055d8d8-b116-40c1-8bf5-5c8ac8d94d3c/original=true/95228731.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7ca87702-d753-4fde-b262-4d61d29cdec7/original=true/95229027.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/91145af2-dad9-4099-ba69-4a7377912cb0/original=true/95229103.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/13dd7133-7e40-40b0-8fa0-70bff6328662/original=true/95229187.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/19d8463d-c708-4400-972c-f58bc2867e98/original=true/95229242.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d3aa3a8c-f4af-4e93-9ea4-f3e739b4317b/original=true/95268325.mp4", + "nsfwLevel": 16, + "width": 800, + "height": 1024, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + }, + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4d0d253a-02b7-463a-b13e-ff834327b9f2/original=true/95305289.mp4", + "nsfwLevel": 16, + "width": 992, + "height": 992, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", + "minor": false, + "poi": false, + "hasMeta": true, + "hasPositivePrompt": true, + "onSite": false, + "remixOfId": null + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2129122" }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a62d520b-ff70-4d2e-9a14-5444b5484ad7/original=true/116759063.jpeg", - "nsfwLevel": 1, - "width": 1080, - "height": 1920, - "hash": "UADbyoIV00~CISM_NLae00-p~VEKn*xu?Gog", - "type": "image", - "metadata": { - "hash": "UADbyoIV00~CISM_NLae00-p~VEKn*xu?Gog", - "size": 2734276, - "width": 1080, - "height": 1920, - "nsfwLevelReason": "Knights Vote" - }, - "minor": false, - "poi": false, - "meta": { - "VAE": "flux_vae.safetensors", - "seed": 165999746374645, - "Model": "FluxedUp_V7.1_FP16.safetensors", - "steps": 32, - "hashes": { - "vae": "afc8e28272", - "model": "1f124f677c" - }, - "prompt": "The image is an low quality photography of asian woman with chocolate Halo Braid hair. She is wearing baseball jersey and bulgarian peasant dress - a knee-length dress with puffy sleeves and an embroidered bodice, cinched at the waist, showcasing feminine curves while emphasizing playful and vibrant patterns that celebrate the joy of traditional Bulgarian life.. \n(She is viewed from above at an angle revealing the inside of her clothes her perky nipples and detailed areolas with small bumps, and some freckles on her breast. Detailed skin and goosebumps are clearly visible.:0.6). (Her nipples are prominently visible, with the left nipple erect and the right nipple also erect. Both nipples are a light pink color. There are small, scattered freckles on her skin, adding a natural, youthful touch. :0.4)\nThe scene is captured in a attending a local theater production location with detailed background details in the environment. The award-winning photo is a close-up (film grain:1.2) photo shot with a Pentacon Six TL Camera. The photograph is highly detailed.", - "sampler": "DPM++ 2M SDE", - "resources": [ - { - "hash": "1f124f677c", - "name": "FluxedUp_V7.1_FP16.safetensors", - "type": "model" - } - ], - "Model hash": "1f124f677c", - "Distilled CFG Scale": "4.0" - }, - "availability": "Public", - "hasMeta": true, - "hasPositivePrompt": true, - "onSite": false, - "remixOfId": null - } - ], - "downloadUrl": "https://civitai.com/api/download/models/2577735" - }, - "civitai_primary_file": { - "id": 2465089, - "sizeKB": 23245069.875, - "name": "fluxedUpFluxNSFW_71FP16.safetensors", - "type": "Model", - "pickleScanResult": "Success", - "pickleScanMessage": "No Pickle imports", - "virusScanResult": "Success", - "virusScanMessage": null, - "scannedAt": "2026-01-08T13:22:48.524", - "metadata": { - "format": "SafeTensor", - "size": "pruned", - "fp": "fp16" - }, - "hashes": { - "AutoV1": "24EAE645", - "AutoV2": "1F124F677C", - "SHA256": "1F124F677C8EC5C45B82B750201EDB16CF197415CF72FA2570C78726B5AB427F", - "CRC32": "46FFA9F8", - "BLAKE3": "9BBE19D37074C1C8A3A2D9059EA679D34E8F9B446AC5DF95CB7808387F792A4E", - "AutoV3": "A2FA1DBAC4DE" - }, - "primary": true, - "downloadUrl": "https://civitai.com/api/download/models/2577735" - }, - "id": "dl_1771889223639_0_fluxedUpFl", - "status": "completed", - "added_time": "2026-02-23T23:27:03.639641+00:00", - "progress": 100.0, - "speed": 0.0, - "error": null, - "start_time": "2026-02-23T23:27:04.028247+00:00", - "end_time": "2026-02-23T23:32:52.873017+00:00", - "connection_type": "Single" - }, - { - "url": "https://civitai.com/api/download/models/733658", - "output_path": "/workspace/runpod-slim/ComfyUI/models/loras/nsfw_flux_lora_v1.safetensors", - "num_connections": 1, - "known_size": 687476104, - "api_key": "da82e3873725e824182cc021803091eb", - "model_url_or_id": "https://civitai.com/models/655753/nsfw-flux-lora", - "model_version_id": null, - "custom_filename": "", - "force_redownload": false, - "filename": "nsfw_flux_lora_v1.safetensors", - "model_name": "NSFW FLUX LoRA", - "version_name": "V1", - "thumbnail": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f1c3546c-1851-4307-9a09-3c9620093208/original=true/24764201.jpeg?width=256", - "thumbnail_nsfw_level": 1, - "model_type": "loras", - "file_precision": null, - "file_model_size": null, - "file_format": "SafeTensor", - "civitai_model_id": 655753, - "civitai_version_id": 733658, - "civitai_file_id": 647734, - "civitai_model_info": { - "id": 655753, - "name": "NSFW FLUX LoRA", - "description": "Sponsorship:
For sponsorship, please contact us on Discord. Your support helps us grow and improve future work.
Buy Custom Models:
If you're interested in buying a LoRA model, contact us—we can get it done in a short time.
Training Configuration:
GPU: A6000
Dataset Size: 600 images
Captioning Tool: WD14
Batch Size: 1
Optimizer: AdamW
Learning Rate: 1e-04
Total training steps: 18k
Training Duration: 17h+
Please note that all my FLUX LoRA models are still experimental, so you might encounter some issues. If you do, please let me know in the comments section. Your feedback is valuable for future improvements!
Recommended Parameter :
Trigger Words : AiArtV
LoRA Weight : 0.5➡1
Sampler : euler
Steps : 20
CFG : 1
Join my community, Share your feedback, learn, and have fun with us! 😊
Discord➡️https://discord.gg/QQKd7bu97P
", - "allowNoCredit": true, - "allowCommercialUse": "{RentCivit,Rent,Image}", - "allowDerivatives": false, - "allowDifferentLicense": true, - "type": "LORA", - "minor": false, - "sfwOnly": false, - "poi": false, - "nsfw": true, - "nsfwLevel": 60, - "availability": "Public", - "userId": 2546547, - "cosmetic": null, - "supportsGeneration": true, - "stats": { - "downloadCount": 40397, - "thumbsUpCount": 1765, - "thumbsDownCount": 5, - "commentCount": 33, - "tippedAmountCount": 230 - }, - "creator": { - "username": "Ai_Art_Vision", - "image": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f5f28662-6453-4388-becf-38251e80bc4c/width=96/Ai_Art_Vision.jpeg" - }, - "tags": [ - "photorealistic", - "nude", - "woman", - "realistic", - "nsfw", - "flux1.d", - "character" - ], - "modelVersions": [ - { - "id": 733658, - "index": 0, - "name": "V1", - "baseModel": "Flux.1 D", + "id": 2129201, + "index": 1, + "name": "WAN2.2_LOWNOISE", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", - "createdAt": "2024-08-17T14:19:37.271Z", - "publishedAt": "2024-08-17T14:30:42.310Z", + "createdAt": "2025-08-19T14:22:45.016Z", + "publishedAt": "2025-08-19T14:40:29.421Z", "status": "Published", "availability": "Public", "nsfwLevel": 60, "trainedWords": [ - "AiArtV" + "a woman is straddling a man and eagerly having sex with him. she is squatting." ], "covered": true, "stats": { - "downloadCount": 40397, - "thumbsUpCount": 1765, - "thumbsDownCount": 5 + "downloadCount": 29410, + "thumbsUpCount": 379, + "thumbsDownCount": 0 }, "files": [ { - "id": 647734, - "sizeKB": 671363.3828125, - "name": "nsfw_flux_lora_v1.safetensors", + "id": 2023187, + "sizeKB": 299656.0078125, + "name": "Wan22-I2V-LOW-Hip_Slammin_Assertive_Cowgirl.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2024-08-17T14:25:55.309Z", + "scannedAt": "2025-08-19T14:25:47.272Z", "metadata": { "format": "SafeTensor" }, "hashes": { - "AutoV1": "A873EF50", - "AutoV2": "6C0440EF87", - "SHA256": "6C0440EF87570FE4CD3E429B8C8E3A9EC0C2C7A88E0EBD19192C9835C5328501", - "CRC32": "5E271762", - "BLAKE3": "DEC9145347FC4F2155995319FA5D8F6EAC514DA1A5AA38A6514EF2D7AD0BA464", - "AutoV3": "EDCAFB7198AC" + "AutoV1": "636E4EFC", + "AutoV2": "377D31BDC2", + "SHA256": "377D31BDC22EB50F7FDF1D4D236AF4CCFE7C17FA14153A6D3D9BFFFB055E13D9", + "CRC32": "DD051C0D", + "BLAKE3": "E7FD35C37A35ADB23E011F8F34563BC2EFC699933687AA7A39BE0C98AB43EDDA", + "AutoV3": "8DE5D8FC4C78" }, - "downloadUrl": "https://civitai.com/api/download/models/733658", + "downloadUrl": "https://civitai.com/api/download/models/2129201", "primary": true } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f1c3546c-1851-4307-9a09-3c9620093208/original=true/24764201.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1024, - "hash": "UIKJ_ape2x~Bt-=|ozslO=NI=bM{5Us;t5Rj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7396124-7def-4aa5-987c-1f5df85367fb/original=true/95229919.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "minor": false, "poi": false, "hasMeta": true, "hasPositivePrompt": true, "onSite": false, "remixOfId": null - }, + } + ], + "downloadUrl": "https://civitai.com/api/download/models/2129201" + }, + { + "id": 1772841, + "index": 2, + "name": "WAN_2.1", + "baseModel": "Wan Video 14B i2v 480p", + "baseModelType": "Standard", + "createdAt": "2025-05-10T23:34:16.452Z", + "publishedAt": "2025-05-11T00:04:48.018Z", + "status": "Published", + "availability": "Public", + "nsfwLevel": 60, + "covered": true, + "stats": { + "downloadCount": 15866, + "thumbsUpCount": 1309, + "thumbsDownCount": 1 + }, + "files": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/28db7766-fff0-47d6-8220-056d2c6bba2f/original=true/24764247.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UAK,gIIU14EL0ORP_3?aF2Rj,DWE~VE1-U-o", - "type": "image", + "id": 1673571, + "sizeKB": 299617.1640625, + "name": "Wan-Hip_Slammin_Assertive_Cowgirl.safetensors", + "type": "Model", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-05-10T23:40:46.403Z", + "metadata": { + "format": "SafeTensor" + }, + "hashes": { + "AutoV1": "61876B6E", + "AutoV2": "1157E29FB1", + "SHA256": "1157E29FB15FDAEFC1DB16421B72BBBD8B3E9EAA4501D766CA0650BE5320A252", + "CRC32": "37926CD5", + "BLAKE3": "1EAADFB41C7014C2157166BBE80AD9BFBBA82826E6E3DBF7201E80E32057F0FF", + "AutoV3": "EBFC5CF92088" + }, + "downloadUrl": "https://civitai.com/api/download/models/1772841", + "primary": true + } + ], + "images": [ + { + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3e2a738f-b361-476a-b7f0-9401acd588d0/original=true/75493594.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UPEM5m-;Xm8_?^x]bw9F.8tRVsIAxvjFjERi", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11010,12 +8917,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fa13442d-33a3-4f96-9a90-2d01fa782317/original=true/24764250.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1024, - "hash": "UTQG@3?I}xiw$-NZ%1xaNKaen}bH-Wn$Rja}", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/308a3d3b-a3e6-4e4b-bf17-1a393bdd2fe0/original=true/75495572.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "ULI}9aobCA?c76MxA1b_E5jEM{E3$y?arpR.", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11024,12 +8931,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7be9d28b-85c8-43f2-9337-d1ede8d42e77/original=true/24764269.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UfJRHo^-X-tRx@R*t7k9IoNF%1snWAWAoeRj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/617997f2-c6b2-47f4-9528-6fc1db55549b/original=true/75495025.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "U4DI,.%M00IB#1s;^Xxa05jJ.N-:_Nnm0ebY", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11038,12 +8945,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eaff7da4-fc2f-40fc-8b13-9be22a0dba84/original=true/24764270.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UKN,Paoy?^xF0JRj%2WBu5xvrWV@-pxax]X8", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b3252829-badf-4a66-9bfe-3f3b16204bcc/original=true/75495063.mp4", + "nsfwLevel": 16, + "width": 1248, + "height": 1248, + "hash": "UNLz4}i^pbXn~4RkEKS5^hI;TLso$fWBRQfl", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11052,12 +8959,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d45c14ba-51e5-4ab0-b43b-59efec161e44/original=true/24764212.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UIIEa*%M0Jbt0dR.?ZoyJ4M}xtWq~pr]IAxG", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e8e85f5e-9069-4f5b-b4fd-df57c659b9e9/original=true/75495406.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UEG7}VEJ4VE0qyM_}[V@00RkoMt7Bh%3Scxb", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11066,12 +8973,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/944811fe-a3f7-4da6-96d6-e4f432d06bd7/original=true/24764273.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UFKc;E~B00E100M|JQxuEgIp-U9t~V%1$+%1", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ec8dd951-1ff7-48ae-9b06-036c8b5afd45/original=true/75495447.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UEFrbEM{In~p?]IoNa-:k;oL8woIr;tRD%M{", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11080,12 +8987,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7958997-2bae-4812-bc0c-c4945a775f79/original=true/24764279.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1024, - "hash": "UDKmqd%20$Rj00tR-itRD%nNwbMx~qNHohxb", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6a259c7f-f08c-4892-92f3-d16196a1b717/original=true/75495502.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "UMLC|+$MDO$*8wofTeR+qZoKM|ay~VS4AbR*", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11094,12 +9001,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3d447d37-a7cf-4e96-87b4-accd3fc0e748/original=true/24764296.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UOMZadjX.S%g~pxvxuxu9uRP$%oe-qE1%2s:", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/734bbdc8-0279-408f-88f6-35b0b03cd0d9/original=true/75495639.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "U7E2z*4n00j?NQE0==bI00ozt2Rj~qSKj=M{", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11108,12 +9015,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1cb1eda2-30ee-40b8-9c79-b583971baf18/original=true/24764305.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UPOfMs.SYk-U.9s:t7RjO@s-wbM|-pWXRki_", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/334b0402-446b-4eec-aac2-c7764f9e1959/original=true/75495830.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UKDl$aIAE1.S.mRPM{yDt,ogIAa{a0tRR5RO", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11122,12 +9029,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/61963ee2-205e-46c8-b8cb-694b30106ea1/original=true/24764317.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UlL;XSaiL4wcIHaKeSn*S}adjDW?TJWURjn#", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b8b9d7b4-695e-41d9-a510-93ee6d18a8b0/original=true/75495881.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "ULI;hsobCA?c76MxAJb_EOjEIoE3$y?arpR.", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11136,12 +9043,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9a489e6a-74ab-4b4e-88b7-ccc7a097b1c7/original=true/24764338.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UELN76IoG]Io0h%1=|%2DjNym,tR~WZ~M_t5", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/33706068-95ef-4d76-9cdc-6275f8dcfc62/original=true/75495967.mp4", + "nsfwLevel": 16, + "width": 1024, + "height": 1536, + "hash": "ULJj9,a0Q.TK01s:%1e-00t7EjRP.mM|T0%1", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11150,12 +9057,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/cf1eeabc-8695-4292-a289-041a0f4fffed/original=true/24764345.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1024, - "hash": "URMGku-;Khxv_NR+xvofE1V@spWAxus:RjR%", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fd29b09e-30d5-4868-8bf2-4bbb26257c3a/original=true/75496016.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UAF}vS~X00R.4p?b~B%M00xHyX-quhM{t+xa", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11164,12 +9071,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6bf4498f-5ea0-4d42-bdd4-329c9e85ab30/original=true/24764363.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UBKd6e?a009Y2$SccDtQ4-$_~BjG%cE9-VS2", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7ed3f148-cf7f-47ad-b13d-36c20b566aae/original=true/75496123.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "UUJ@OK9uLNsmBqtRTLs,pdIqR:aKM}oz%1s.", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11178,12 +9085,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/33afea56-1fb0-4afe-a68c-2b8868330fbf/original=true/24764384.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UKIhNcIp%}xu.jS}ofV[9@ni={oL9@W;%2Rj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/32466501-d1be-4a82-b5b2-a69249fc2639/original=true/75496180.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UKDl$aIAE1.S.mRPM{yDpJogIAa{a0tRR5RO", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11192,12 +9099,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b0722f6c-f363-41e7-badb-3b6cc36b5ce9/original=true/24764390.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1024, - "hash": "UAK^4?h}0|X-6wD*yrX,TyNIn2t5}l={?H%M", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dac7e3c2-ae4b-4792-9fda-726dbd74b530/original=true/75496221.mp4", + "nsfwLevel": 16, + "width": 1248, + "height": 1248, + "hash": "ULL:Dd|rV=Ki-+;1McX-tL?HX8%L?ZI;aJWA", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11206,12 +9113,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e21b45dd-106c-4299-83a1-a1812b533f17/original=true/24764443.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UKOVu.-q.T%MhLt7-;bIAHoz%2t7-nWBi{ax", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8512b17f-3494-4363-9ed6-5ffea8387536/original=true/75496349.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "U8FYDoxt00=~I1NGsh-r01ozyAM|_Lx[X1M_", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11220,12 +9127,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/400bc55d-2ffd-4e73-8de4-e8f85d239b82/original=true/24764464.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "ULLz57nhE3t80Ls,$%jb0NNFJ5WE}]bE-:WC", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0a184b44-c58e-4faf-9950-14f4e04fdb2c/original=true/75496381.mp4", + "nsfwLevel": 16, + "width": 1088, + "height": 1408, + "hash": "UZHeRj%1KRITL4kDS%RPtTW=Rjo0bdRkxCt7", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11234,12 +9141,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/84686c0c-02a8-4181-96bf-07e0766feaae/original=true/24764522.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UOMs$Xxuys-;?vIV?Gxu9axuaJWB-:R%RjM|", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fd9f96a1-52c6-4b8d-86f6-145fb874fba1/original=true/75527898.mp4", + "nsfwLevel": 16, + "width": 1408, + "height": 1088, + "hash": "UPECg@-;Xm8_?^x]bw9F.8tRVsIAxvjFjERi", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11248,12 +9155,12 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dff17427-d094-41fd-8b1c-4741962d5beb/original=true/24764539.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1024, - "hash": "UcN]tn?H.Txuo#RjxZt7tmWBaeWB?bkCRkae", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/18748f85-8a39-4334-a79f-3df9ef1e2b4f/original=true/75496621.mp4", + "nsfwLevel": 16, + "width": 1248, + "height": 1248, + "hash": "UTKdk[X9P2s8Yka{AdkC$_slo}S5?HW;$ynh", + "type": "video", "minor": false, "poi": false, "hasMeta": true, @@ -11262,111 +9169,116 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/733658" + "downloadUrl": "https://civitai.com/api/download/models/1772841" } ] }, "civitai_version_info": { - "id": 733658, - "modelId": 655753, - "name": "V1", + "id": 2129122, + "modelId": 1566648, + "name": "WAN2.2_HIGHNOISE", "nsfwLevel": 60, - "createdAt": "2024-08-17T14:19:37.271Z", - "updatedAt": "2024-08-17T14:30:42.311Z", + "createdAt": "2025-08-19T13:50:45.718Z", + "updatedAt": "2025-08-19T14:46:03.187Z", "status": "Published", - "publishedAt": "2024-08-17T14:30:42.310Z", + "publishedAt": "2025-08-19T14:40:15.426Z", "trainedWords": [ - "AiArtV" + "a woman is straddling a man and eagerly having sex with him. she is squatting." ], "trainingStatus": null, "trainingDetails": null, - "baseModel": "Flux.1 D", + "baseModel": "Wan Video 2.2 I2V-A14B", "baseModelType": "Standard", "earlyAccessEndsAt": null, "earlyAccessConfig": null, "description": null, "uploadType": "Created", "usageControl": "Download", - "air": "urn:air:flux1:lora:civitai:655753@733658", + "air": "urn:air:wanvideo-22-i2v-a14b:lora:civitai:1566648@2129122", "stats": { - "downloadCount": 40397, - "thumbsUpCount": 1765 + "downloadCount": 32920, + "thumbsUpCount": 1313 }, "model": { - "name": "NSFW FLUX LoRA", + "name": "Wan I2V (2.2 & 2.1) - Assertive Cowgirl", "type": "LORA", "nsfw": true, "poi": false }, "files": [ { - "id": 647734, - "sizeKB": 671363.3828125, - "name": "nsfw_flux_lora_v1.safetensors", + "id": 2023243, + "sizeKB": 4.451171875, + "name": "wan22_i2v_hip_slammin_workflow.zip", + "type": "Training Data", + "pickleScanResult": "Success", + "pickleScanMessage": "No Pickle imports", + "virusScanResult": "Success", + "virusScanMessage": null, + "scannedAt": "2025-08-19T14:51:20.379", + "metadata": { + "format": "Other", + "size": null, + "fp": null + }, + "hashes": { + "AutoV2": "643A79F9CE", + "SHA256": "643A79F9CE31ABAB783D8BF57746F1B4E704BC60BE2CE26A888ABA42863655E8", + "CRC32": "C580DE0E", + "BLAKE3": "063138836FF946314576B96E4DF79598A261351B17B2747A12A047673762966D", + "AutoV3": "15B106F742B8" + }, + "primary": false, + "downloadUrl": "https://civitai.com/api/download/models/2129122?type=Training%20Data" + }, + { + "id": 2023107, + "sizeKB": 299656.015625, + "name": "Wan22-I2V-HIGH-Hip_Slammin_Assertive_Cowgirl.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2024-08-17T14:25:55.309", + "scannedAt": "2025-08-19T13:55:54.874", "metadata": { "format": "SafeTensor", "size": null, "fp": null }, "hashes": { - "AutoV1": "A873EF50", - "AutoV2": "6C0440EF87", - "SHA256": "6C0440EF87570FE4CD3E429B8C8E3A9EC0C2C7A88E0EBD19192C9835C5328501", - "CRC32": "5E271762", - "BLAKE3": "DEC9145347FC4F2155995319FA5D8F6EAC514DA1A5AA38A6514EF2D7AD0BA464", - "AutoV3": "EDCAFB7198AC" + "AutoV1": "A363A508", + "AutoV2": "E183D07560", + "SHA256": "E183D0756075CB350FA5874690F6BBEA160ABF632F4F93D290C4EE1CF74D5C91", + "CRC32": "95BD01D9", + "BLAKE3": "C6EDB9F6CCB5BCECDFDA0178551CBC0402A1FD4DE9F7E2A3CF45E21ADFDFD2DA", + "AutoV3": "56EC5F28085A" }, "primary": true, - "downloadUrl": "https://civitai.com/api/download/models/733658" + "downloadUrl": "https://civitai.com/api/download/models/2129122" } ], "images": [ { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f1c3546c-1851-4307-9a09-3c9620093208/original=true/24764201.jpeg", - "nsfwLevel": 1, - "width": 768, - "height": 1024, - "hash": "UIKJ_ape2x~Bt-=|ozslO=NI=bM{5Us;t5Rj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/09096032-7e42-45a6-82c1-ad32bd0f6485/original=true/95225964.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UIKJ_ape2x~Bt-=|ozslO=NI=bM{5Us;t5Rj", - "size": 917206, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 4061392, + "audio": false, + "width": 1136, + "height": 880, + "duration": 4.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 1070409488988092, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, open mouth, blue hair, earrings, teeth, choker, tongue, tongue out, mole, black choker, makeup, portrait, realistic, long tongue\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 1070409488988092}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, open mouth, blue hair, earrings, teeth, choker, tongue, tongue out, mole, black choker, makeup, portrait, realistic, long tongue\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [1070409488988092, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, open mouth, blue hair, earrings, teeth, choker, tongue, tongue out, mole, black choker, makeup, portrait, realistic, long tongue", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has a serious expression. she is looking at the camera. she is angry. she leans in. the image is in sharp focus. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina. it is raining.\n\n" }, "availability": "Public", "hasMeta": true, @@ -11375,45 +9287,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/28db7766-fff0-47d6-8220-056d2c6bba2f/original=true/24764247.jpeg", - "nsfwLevel": 8, - "width": 768, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a8d5d005-a2be-4ae6-a1c5-4ab33b8c9023/original=true/95226782.mp4", + "nsfwLevel": 16, + "width": 800, "height": 1024, - "hash": "UAK,gIIU14EL0ORP_3?aF2Rj,DWE~VE1-U-o", - "type": "image", + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UAK,gIIU14EL0ORP_3?aF2Rj,DWE~VE1-U-o", - "size": 896721, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2225960, + "audio": false, + "width": 800, + "height": 1024, + "duration": 4.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 603909462807915, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, long hair, looking at viewer, smile, brown hair, closed mouth, nipples, upper body, braid, nude, indoors, blurry, twin braids, blurry background, freckles, realistic, asian, photorealistic\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 603909462807915}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, long hair, looking at viewer, smile, brown hair, closed mouth, nipples, upper body, braid, nude, indoors, blurry, twin braids, blurry background, freckles, realistic, asian, photorealistic\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [603909462807915, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [80.21404803637118, 172.002803624949]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, long hair, looking at viewer, smile, brown hair, closed mouth, nipples, upper body, braid, nude, indoors, blurry, twin braids, blurry background, freckles, realistic, asian, photorealistic", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she takes off her hat and waves it in the air like a cowboy. she is hollaring. she is the screaming cowboy. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina.\n\n" }, "availability": "Public", "hasMeta": true, @@ -11422,45 +9314,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fa13442d-33a3-4f96-9a90-2d01fa782317/original=true/24764250.jpeg", - "nsfwLevel": 4, - "width": 768, - "height": 1024, - "hash": "UTQG@3?I}xiw$-NZ%1xaNKaen}bH-Wn$Rja}", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/6da13f90-dfcf-4cbb-9c8e-5cf0d239abf6/original=true/95226941.mp4", + "nsfwLevel": 16, + "width": 1024, + "height": 800, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UTQG@3?I}xiw$-NZ%1xaNKaen}bH-Wn$Rja}", - "size": 787015, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 4131919, + "audio": false, + "width": 1024, + "height": 800, + "duration": 6.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 388545784521530, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nA woman is standing in front of a pink wall. She has a gold necklace around her neck. There are earrings hanging from her ears. The woman has dark hair that is pulled back into a bun\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 388545784521530}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nA woman is standing in front of a pink wall. She has a gold necklace around her neck. There are earrings hanging from her ears. The woman has dark hair that is pulled back into a bun\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [388545784521530, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nA woman is standing in front of a pink wall. She has a gold necklace around her neck. There are earrings hanging from her ears. The woman has dark hair that is pulled back into a bun", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "a woman is straddling a man and eagerly having sex with him. she is assertive. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she is a shy nerdy girl. she is nervous. a person walks by in the background. the woman is shocked, she looks back at the person, then back at the camera. she giggles and shushes the camera. she puts her finger to her lips and shushes the viewer. she is nervous. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina.\n" }, "availability": "Public", "hasMeta": true, @@ -11469,45 +9341,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/7be9d28b-85c8-43f2-9337-d1ede8d42e77/original=true/24764269.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UfJRHo^-X-tRx@R*t7k9IoNF%1snWAWAoeRj", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/397de7bb-c350-4d50-bd7f-88afef5d9148/original=true/95227135.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UfJRHo^-X-tRx@R*t7k9IoNF%1snWAWAoeRj", - "size": 1153568, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 6251390, + "audio": false, + "width": 1136, + "height": 880, + "duration": 6.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 1074273575663501, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, long hair, looking at viewer, black hair, thighhighs, jewelry, full body, outdoors, earrings, boots, pussy, black footwear, no panties, thigh boots, hoop earrings\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 1074273575663501}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, long hair, looking at viewer, black hair, thighhighs, jewelry, full body, outdoors, earrings, boots, pussy, black footwear, no panties, thigh boots, hoop earrings\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [1074273575663501, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, long hair, looking at viewer, black hair, thighhighs, jewelry, full body, outdoors, earrings, boots, pussy, black footwear, no panties, thigh boots, hoop earrings", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has a serious expression. she is looking at the camera. she is angry. the image is in sharp focus. she is quickly moving her hips up and down. she has an orgasm, her mouth opens wide and her body shudders as she overflows with pleasure. a lightning bolt crashes in the background right as she orgasms. the man's penis slides in and out of view as it enters her vagina. it is raining.\n" }, "availability": "Public", "hasMeta": true, @@ -11516,45 +9368,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/eaff7da4-fc2f-40fc-8b13-9be22a0dba84/original=true/24764270.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UKN,Paoy?^xF0JRj%2WBu5xvrWV@-pxax]X8", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/39197df2-b5e0-4001-9de7-f9d4b0f3fbf8/original=true/95227223.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UKN,Paoy?^xF0JRj%2WBu5xvrWV@-pxax]X8", - "size": 818743, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 4938561, + "audio": false, + "width": 1136, + "height": 880, + "duration": 6.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 1115791021752410, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, long hair, looking at viewer, black hair, ass, pussy, socks, indoors, looking back, from behind, feet, anus, bed, bottomless, soles, female pubic hair, all fours, striped shirt, realistic, photorealistic\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 1115791021752410}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, long hair, looking at viewer, black hair, ass, pussy, socks, indoors, looking back, from behind, feet, anus, bed, bottomless, soles, female pubic hair, all fours, striped shirt, realistic, photorealistic\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [1115791021752410, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, long hair, looking at viewer, black hair, ass, pussy, socks, indoors, looking back, from behind, feet, anus, bed, bottomless, soles, female pubic hair, all fours, striped shirt, realistic, photorealistic", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "a woman is straddling a man and eagerly having sex with him. neon lights flicker rapidly in the background. the camera is shaky. the image has a horror movie aesthetic. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has a crazy, evil expression. she is a demon. she has demon wings that gently sway. she is looking at the camera. the image is in sharp focus. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina. the room is smoky. her eyes glow. the room lighting flickers. she leans in, baring her vampire fangs to the camera.\n" }, "availability": "Public", "hasMeta": true, @@ -11563,45 +9395,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d45c14ba-51e5-4ab0-b43b-59efec161e44/original=true/24764212.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UIIEa*%M0Jbt0dR.?ZoyJ4M}xtWq~pr]IAxG", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ffcabf75-cb6a-4aa9-b0b9-93de34daad36/original=true/95227284.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UIIEa*%M0Jbt0dR.?ZoyJ4M}xtWq~pr]IAxG", - "size": 1063525, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2950576, + "audio": false, + "width": 1136, + "height": 880, + "duration": 4.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 389671577071767, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, long hair, looking at viewer, brown hair, navel, medium breasts, nipples, nude, pussy, lips, leaf, realistic, photorealistic\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 389671577071767}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, long hair, looking at viewer, brown hair, navel, medium breasts, nipples, nude, pussy, lips, leaf, realistic, photorealistic\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [389671577071767, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, long hair, looking at viewer, brown hair, navel, medium breasts, nipples, nude, pussy, lips, leaf, realistic, photorealistic", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "a woman is straddling a man and eagerly having sex with him. she is assertive. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she is an elegant high class prostitute. she flips her hair and takes a drink of wine. a group of men are watching her have sex. they are smoking cigars. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina.\n\n" }, "availability": "Public", "hasMeta": true, @@ -11610,45 +9422,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/944811fe-a3f7-4da6-96d6-e4f432d06bd7/original=true/24764273.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UFKc;E~B00E100M|JQxuEgIp-U9t~V%1$+%1", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ca1ab81e-935e-44fd-8d52-a9b62b02a56b/original=true/95227908.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UFKc;E~B00E100M|JQxuEgIp-U9t~V%1$+%1", - "size": 793932, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 5326270, + "audio": false, + "width": 1136, + "height": 880, + "duration": 6.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 969899017421918, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, looking at viewer, short hair, brown hair, medium breasts, brown eyes, nipples, armpits, lips, realistic, selfie, photorealistic\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 969899017421918}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, looking at viewer, short hair, brown hair, medium breasts, brown eyes, nipples, armpits, lips, realistic, selfie, photorealistic\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [969899017421918, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, looking at viewer, short hair, brown hair, medium breasts, brown eyes, nipples, armpits, lips, realistic, selfie, photorealistic", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has a serious expression. she is looking at the camera. she is angry. she leans in. the image is in sharp focus. she is quickly moving her hips up and down. she has an orgasm, her mouth opens wide and her body shudders as she overflows with pleasure. a lightning bolt crashes in the background right as she orgasms. the man's penis slides in and out of view as it enters her vagina. it is raining.\n" }, "availability": "Public", "hasMeta": true, @@ -11657,45 +9449,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b7958997-2bae-4812-bc0c-c4945a775f79/original=true/24764279.jpeg", - "nsfwLevel": 4, - "width": 768, + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/57df6ae6-8883-4ad5-bd0a-fca1ace6425e/original=true/95227995.mp4", + "nsfwLevel": 16, + "width": 800, "height": 1024, - "hash": "UDKmqd%20$Rj00tR-itRD%nNwbMx~qNHohxb", - "type": "image", + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UDKmqd%20$Rj00tR-itRD%nNwbMx~qNHohxb", - "size": 902401, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3199065, + "audio": false, + "width": 800, + "height": 1024, + "duration": 5.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 15191449359983, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV,\\nwoman, shirt, large breasts, brown hair, jewelry, necklace, covered nipples, lips, realistic\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 15191449359983}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV,\\nwoman, shirt, large breasts, brown hair, jewelry, necklace, covered nipples, lips, realistic\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [15191449359983, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [152.62704803637118, 149.52980362494895]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV,\nwoman, shirt, large breasts, brown hair, jewelry, necklace, covered nipples, lips, realistic", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertive and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has an evil expression. she is looking at the camera. she is angry. she is holding a whip, slapping it on the man's chest. she is whipping the man. the image is in sharp focus. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina.\n" }, "availability": "Public", "hasMeta": true, @@ -11704,45 +9476,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/3d447d37-a7cf-4e96-87b4-accd3fc0e748/original=true/24764296.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UOMZadjX.S%g~pxvxuxu9uRP$%oe-qE1%2s:", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/dc12885a-e353-4eaa-8bb7-f1e5337a7f6c/original=true/95228110.mp4", + "nsfwLevel": 16, + "width": 640, + "height": 1280, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UOMZadjX.S%g~pxvxuxu9uRP$%oe-qE1%2s:", - "size": 918657, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 2491345, + "audio": false, + "width": 640, + "height": 1280, + "duration": 3.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 942444819800877, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"AiArtV, woman, long hair, looking at viewer, brown hair, navel, standing, nipples, full body, braid, nude, barefoot, indoors, twin braids, completely nude, pubic hair, bed, female pubic hair, breasts apart, realistic, bedroom, unworn clothes, carpet, photorealistic\", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 942444819800877}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"AiArtV, woman, long hair, looking at viewer, brown hair, navel, standing, nipples, full body, braid, nude, barefoot, indoors, twin braids, completely nude, pubic hair, bed, female pubic hair, breasts apart, realistic, bedroom, unworn clothes, carpet, photorealistic\"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [942444819800877, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [80.21404803637118, 172.002803624949]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "AiArtV, woman, long hair, looking at viewer, brown hair, navel, standing, nipples, full body, braid, nude, barefoot, indoors, twin braids, completely nude, pubic hair, bed, female pubic hair, breasts apart, realistic, bedroom, unworn clothes, carpet, photorealistic", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "a woman is straddling a man and eagerly having sex with him. she moves quickly. she moves energetically. she is squatting. she is a cheerleader, she is cheering. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina. \n" }, "availability": "Public", "hasMeta": true, @@ -11751,45 +9503,25 @@ "remixOfId": null }, { - "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/1cb1eda2-30ee-40b8-9c79-b583971baf18/original=true/24764305.jpeg", - "nsfwLevel": 8, - "width": 768, - "height": 1024, - "hash": "UPOfMs.SYk-U.9s:t7RjO@s-wbM|-pWXRki_", - "type": "image", + "url": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4e2961a3-228c-4419-ae73-31b5ecc0ae08/original=true/95228154.mp4", + "nsfwLevel": 16, + "width": 1136, + "height": 880, + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "type": "video", "metadata": { - "hash": "UPOfMs.SYk-U.9s:t7RjO@s-wbM|-pWXRki_", - "size": 837158, - "width": 768, - "height": 1024 + "hash": "U00000fQfQfQfQfQfQfQfQfQfQfQfQfQfQfQ", + "size": 3553052, + "audio": false, + "width": 1136, + "height": 880, + "duration": 4.031, + "skipScannedAtReassignment": true }, "minor": false, "poi": false, "meta": { - "seed": 769626431899412, - "vaes": [ - "vae.safetensors" - ], - "comfy": "{\"prompt\": {\"6\": {\"inputs\": {\"text\": \"A woman is naked. She is wearing a colorful shirt. There are colorful striped socks on her legs. The woman has earrings in her ears. \", \"clip\": [\"39\", 1]}, \"class_type\": \"CLIPTextEncode\"}, \"8\": {\"inputs\": {\"samples\": [\"13\", 0], \"vae\": [\"10\", 0]}, \"class_type\": \"VAEDecode\"}, \"10\": {\"inputs\": {\"vae_name\": \"vae.safetensors\"}, \"class_type\": \"VAELoader\"}, \"11\": {\"inputs\": {\"clip_name1\": \"t5xxl_fp16.safetensors\", \"clip_name2\": \"clip_l.safetensors\", \"type\": \"flux\"}, \"class_type\": \"DualCLIPLoader\"}, \"12\": {\"inputs\": {\"unet_name\": \"flux1-dev.safetensors\", \"weight_dtype\": \"default\"}, \"class_type\": \"UNETLoader\"}, \"13\": {\"inputs\": {\"noise\": [\"25\", 0], \"guider\": [\"22\", 0], \"sampler\": [\"16\", 0], \"sigmas\": [\"17\", 0], \"latent_image\": [\"27\", 0]}, \"class_type\": \"SamplerCustomAdvanced\"}, \"16\": {\"inputs\": {\"sampler_name\": \"euler\"}, \"class_type\": \"KSamplerSelect\"}, \"17\": {\"inputs\": {\"scheduler\": \"simple\", \"steps\": 20, \"denoise\": 1.0, \"model\": [\"30\", 0]}, \"class_type\": \"BasicScheduler\"}, \"22\": {\"inputs\": {\"model\": [\"30\", 0], \"conditioning\": [\"26\", 0]}, \"class_type\": \"BasicGuider\"}, \"25\": {\"inputs\": {\"noise_seed\": 769626431899412}, \"class_type\": \"RandomNoise\"}, \"26\": {\"inputs\": {\"guidance\": 4.0, \"conditioning\": [\"6\", 0]}, \"class_type\": \"FluxGuidance\"}, \"27\": {\"inputs\": {\"width\": 768, \"height\": 1024, \"batch_size\": 1}, \"class_type\": \"EmptySD3LatentImage\"}, \"30\": {\"inputs\": {\"max_shift\": 1.15, \"base_shift\": 0.5, \"width\": 768, \"height\": 1024, \"model\": [\"39\", 0]}, \"class_type\": \"ModelSamplingFlux\"}, \"39\": {\"inputs\": {\"lora_name\": \"nsfw_flux_lora_v1_000018000.safetensors\", \"strength_model\": 0.8, \"strength_clip\": 1.0, \"model\": [\"12\", 0], \"clip\": [\"11\", 0]}, \"class_type\": \"LoraLoader\"}, \"40\": {\"inputs\": {\"filename_prefix\": \"ComfyUI\", \"images\": [\"8\", 0]}, \"class_type\": \"SaveImage\"}}, \"workflow\": {\"last_node_id\": 40, \"last_link_id\": 122, \"nodes\": [{\"id\": 6, \"type\": \"CLIPTextEncode\", \"pos\": [542, 650], \"size\": {\"0\": 422.84503173828125, \"1\": 164.31304931640625}, \"flags\": {}, \"order\": 10, \"mode\": 0, \"inputs\": [{\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 122}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [41], \"slot_index\": 0}], \"title\": \"CLIP Text Encode (Positive Prompt)\", \"properties\": {\"Node name for S&R\": \"CLIPTextEncode\"}, \"widgets_values\": [\"A woman is naked. She is wearing a colorful shirt. There are colorful striped socks on her legs. The woman has earrings in her ears. \"], \"color\": \"#232\", \"bgcolor\": \"#353\"}, {\"id\": 8, \"type\": \"VAEDecode\", \"pos\": [866, 367], \"size\": {\"0\": 210, \"1\": 46}, \"flags\": {}, \"order\": 15, \"mode\": 0, \"inputs\": [{\"name\": \"samples\", \"type\": \"LATENT\", \"link\": 24}, {\"name\": \"vae\", \"type\": \"VAE\", \"link\": 12}], \"outputs\": [{\"name\": \"IMAGE\", \"type\": \"IMAGE\", \"links\": [119], \"slot_index\": 0}], \"properties\": {\"Node name for S&R\": \"VAEDecode\"}}, {\"id\": 10, \"type\": \"VAELoader\", \"pos\": [49, 432], \"size\": {\"0\": 311.81634521484375, \"1\": 60.429901123046875}, \"flags\": {}, \"order\": 4, \"mode\": 0, \"outputs\": [{\"name\": \"VAE\", \"type\": \"VAE\", \"links\": [12], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"VAELoader\"}, \"widgets_values\": [\"vae.safetensors\"]}, {\"id\": 11, \"type\": \"DualCLIPLoader\", \"pos\": [-346, 267], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 0, \"mode\": 0, \"outputs\": [{\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [121], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"DualCLIPLoader\"}, \"widgets_values\": [\"t5xxl_fp16.safetensors\", \"clip_l.safetensors\", \"flux\"]}, {\"id\": 12, \"type\": \"UNETLoader\", \"pos\": [-366, 97], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 6, \"mode\": 0, \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [120], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"UNETLoader\"}, \"widgets_values\": [\"flux1-dev.safetensors\", \"default\"], \"color\": \"#223\", \"bgcolor\": \"#335\"}, {\"id\": 13, \"type\": \"SamplerCustomAdvanced\", \"pos\": [864, 192], \"size\": {\"0\": 272.3617858886719, \"1\": 124.53733825683594}, \"flags\": {}, \"order\": 14, \"mode\": 0, \"inputs\": [{\"name\": \"noise\", \"type\": \"NOISE\", \"link\": 37, \"slot_index\": 0}, {\"name\": \"guider\", \"type\": \"GUIDER\", \"link\": 30, \"slot_index\": 1}, {\"name\": \"sampler\", \"type\": \"SAMPLER\", \"link\": 19, \"slot_index\": 2}, {\"name\": \"sigmas\", \"type\": \"SIGMAS\", \"link\": 20, \"slot_index\": 3}, {\"name\": \"latent_image\", \"type\": \"LATENT\", \"link\": 116, \"slot_index\": 4}], \"outputs\": [{\"name\": \"output\", \"type\": \"LATENT\", \"links\": [24], \"slot_index\": 0, \"shape\": 3}, {\"name\": \"denoised_output\", \"type\": \"LATENT\", \"links\": null, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"SamplerCustomAdvanced\"}}, {\"id\": 16, \"type\": \"KSamplerSelect\", \"pos\": [126, 629], \"size\": {\"0\": 315, \"1\": 58}, \"flags\": {}, \"order\": 1, \"mode\": 0, \"outputs\": [{\"name\": \"SAMPLER\", \"type\": \"SAMPLER\", \"links\": [19], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"KSamplerSelect\"}, \"widgets_values\": [\"euler\"]}, {\"id\": 17, \"type\": \"BasicScheduler\", \"pos\": [-206, 749], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 11, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 55, \"slot_index\": 0}], \"outputs\": [{\"name\": \"SIGMAS\", \"type\": \"SIGMAS\", \"links\": [20], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicScheduler\"}, \"widgets_values\": [\"simple\", 20, 1]}, {\"id\": 22, \"type\": \"BasicGuider\", \"pos\": [576, 48], \"size\": {\"0\": 222.3482666015625, \"1\": 46}, \"flags\": {}, \"order\": 13, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 54, \"slot_index\": 0}, {\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 42, \"slot_index\": 1}], \"outputs\": [{\"name\": \"GUIDER\", \"type\": \"GUIDER\", \"links\": [30], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"BasicGuider\"}}, {\"id\": 25, \"type\": \"RandomNoise\", \"pos\": [139, 781], \"size\": {\"0\": 315, \"1\": 82}, \"flags\": {}, \"order\": 2, \"mode\": 0, \"outputs\": [{\"name\": \"NOISE\", \"type\": \"NOISE\", \"links\": [37], \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"RandomNoise\"}, \"widgets_values\": [769626431899412, \"randomize\"], \"color\": \"#2a363b\", \"bgcolor\": \"#3f5159\"}, {\"id\": 26, \"type\": \"FluxGuidance\", \"pos\": [480, 144], \"size\": {\"0\": 317.4000244140625, \"1\": 58}, \"flags\": {}, \"order\": 12, \"mode\": 0, \"inputs\": [{\"name\": \"conditioning\", \"type\": \"CONDITIONING\", \"link\": 41}], \"outputs\": [{\"name\": \"CONDITIONING\", \"type\": \"CONDITIONING\", \"links\": [42], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"FluxGuidance\"}, \"widgets_values\": [4], \"color\": \"#233\", \"bgcolor\": \"#355\"}, {\"id\": 27, \"type\": \"EmptySD3LatentImage\", \"pos\": [416, 442], \"size\": {\"0\": 315, \"1\": 106}, \"flags\": {}, \"order\": 7, \"mode\": 0, \"inputs\": [{\"name\": \"width\", \"type\": \"INT\", \"link\": 112, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 113, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"LATENT\", \"type\": \"LATENT\", \"links\": [116], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"EmptySD3LatentImage\"}, \"widgets_values\": [768, 1024, 1]}, {\"id\": 30, \"type\": \"ModelSamplingFlux\", \"pos\": [-246, 530], \"size\": {\"0\": 315, \"1\": 130}, \"flags\": {}, \"order\": 9, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 118, \"slot_index\": 0}, {\"name\": \"width\", \"type\": \"INT\", \"link\": 115, \"slot_index\": 1, \"widget\": {\"name\": \"width\"}}, {\"name\": \"height\", \"type\": \"INT\", \"link\": 114, \"slot_index\": 2, \"widget\": {\"name\": \"height\"}}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [54, 55], \"slot_index\": 0, \"shape\": 3}], \"properties\": {\"Node name for S&R\": \"ModelSamplingFlux\"}, \"widgets_values\": [1.15, 0.5, 768, 1024]}, {\"id\": 34, \"type\": \"PrimitiveNode\", \"pos\": [342, 293], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 5, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [112, 115], \"slot_index\": 0, \"widget\": {\"name\": \"width\"}}], \"title\": \"width\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [768, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 35, \"type\": \"PrimitiveNode\", \"pos\": [593, 316], \"size\": {\"0\": 210, \"1\": 82}, \"flags\": {}, \"order\": 3, \"mode\": 0, \"outputs\": [{\"name\": \"INT\", \"type\": \"INT\", \"links\": [113, 114], \"slot_index\": 0, \"widget\": {\"name\": \"height\"}}], \"title\": \"height\", \"properties\": {\"Run widget replace on values\": false}, \"widgets_values\": [1024, \"fixed\"], \"color\": \"#323\", \"bgcolor\": \"#535\"}, {\"id\": 39, \"type\": \"LoraLoader\", \"pos\": [-1, 95], \"size\": {\"0\": 315, \"1\": 126}, \"flags\": {}, \"order\": 8, \"mode\": 0, \"inputs\": [{\"name\": \"model\", \"type\": \"MODEL\", \"link\": 120}, {\"name\": \"clip\", \"type\": \"CLIP\", \"link\": 121}], \"outputs\": [{\"name\": \"MODEL\", \"type\": \"MODEL\", \"links\": [118], \"shape\": 3, \"slot_index\": 0}, {\"name\": \"CLIP\", \"type\": \"CLIP\", \"links\": [122], \"shape\": 3, \"slot_index\": 1}], \"properties\": {\"Node name for S&R\": \"LoraLoader\"}, \"widgets_values\": [\"nsfw_flux_lora_v1_000018000.safetensors\", 0.8, 1]}, {\"id\": 40, \"type\": \"SaveImage\", \"pos\": [1162, -129], \"size\": [819.7495900000001, 1062.9366000000005], \"flags\": {}, \"order\": 16, \"mode\": 0, \"inputs\": [{\"name\": \"images\", \"type\": \"IMAGE\", \"link\": 119}], \"properties\": {}, \"widgets_values\": [\"ComfyUI\"]}], \"links\": [[12, 10, 0, 8, 1, \"VAE\"], [19, 16, 0, 13, 2, \"SAMPLER\"], [20, 17, 0, 13, 3, \"SIGMAS\"], [24, 13, 0, 8, 0, \"LATENT\"], [30, 22, 0, 13, 1, \"GUIDER\"], [37, 25, 0, 13, 0, \"NOISE\"], [41, 6, 0, 26, 0, \"CONDITIONING\"], [42, 26, 0, 22, 1, \"CONDITIONING\"], [54, 30, 0, 22, 0, \"MODEL\"], [55, 30, 0, 17, 0, \"MODEL\"], [112, 34, 0, 27, 0, \"INT\"], [113, 35, 0, 27, 1, \"INT\"], [114, 35, 0, 30, 2, \"INT\"], [115, 34, 0, 30, 1, \"INT\"], [116, 27, 0, 13, 4, \"LATENT\"], [118, 39, 0, 30, 0, \"MODEL\"], [119, 8, 0, 40, 0, \"IMAGE\"], [120, 12, 0, 39, 0, \"MODEL\"], [121, 11, 0, 39, 1, \"CLIP\"], [122, 39, 1, 6, 0, \"CLIP\"]], \"groups\": [], \"config\": {}, \"extra\": {\"ds\": {\"scale\": 0.7513148009015778, \"offset\": [80.21404803637118, 172.002803624949]}, \"groupNodes\": {}}, \"version\": 0.4}}", - "steps": 20, - "models": [], - "prompt": "A woman is naked. She is wearing a colorful shirt. There are colorful striped socks on her legs. The woman has earrings in her ears. ", - "denoise": 1, - "sampler": "Euler", - "cfgScale": 4, - "modelIds": [], - "scheduler": "simple", - "upscalers": [], - "versionIds": [], - "controlNets": [], - "additionalResources": [ - { - "name": "nsfw_flux_lora_v1_000018000.safetensors", - "type": "lora", - "strength": 0.8, - "strengthClip": 1 - } - ] + "prompt": "photorealistic image of a woman straddling a man and eagerly having sex with him. she is assertinve and dominant. she moves quickly. she moves energetically. she is squatting. her hips move quickly down on his penis. she vigorously slams her hips down on the man. she has a serious expression. she is looking at the camera. she is angry. she leans in. the image is in sharp focus. she is quickly moving her hips up and down. the man's penis slides in and out of view as it enters her vagina. it is raining.\n" }, "availability": "Public", "hasMeta": true, @@ -11798,42 +9530,42 @@ "remixOfId": null } ], - "downloadUrl": "https://civitai.com/api/download/models/733658" + "downloadUrl": "https://civitai.com/api/download/models/2129122" }, "civitai_primary_file": { - "id": 647734, - "sizeKB": 671363.3828125, - "name": "nsfw_flux_lora_v1.safetensors", + "id": 2023107, + "sizeKB": 299656.015625, + "name": "Wan22-I2V-HIGH-Hip_Slammin_Assertive_Cowgirl.safetensors", "type": "Model", "pickleScanResult": "Success", "pickleScanMessage": "No Pickle imports", "virusScanResult": "Success", "virusScanMessage": null, - "scannedAt": "2024-08-17T14:25:55.309", + "scannedAt": "2025-08-19T13:55:54.874", "metadata": { "format": "SafeTensor", "size": null, "fp": null }, "hashes": { - "AutoV1": "A873EF50", - "AutoV2": "6C0440EF87", - "SHA256": "6C0440EF87570FE4CD3E429B8C8E3A9EC0C2C7A88E0EBD19192C9835C5328501", - "CRC32": "5E271762", - "BLAKE3": "DEC9145347FC4F2155995319FA5D8F6EAC514DA1A5AA38A6514EF2D7AD0BA464", - "AutoV3": "EDCAFB7198AC" + "AutoV1": "A363A508", + "AutoV2": "E183D07560", + "SHA256": "E183D0756075CB350FA5874690F6BBEA160ABF632F4F93D290C4EE1CF74D5C91", + "CRC32": "95BD01D9", + "BLAKE3": "C6EDB9F6CCB5BCECDFDA0178551CBC0402A1FD4DE9F7E2A3CF45E21ADFDFD2DA", + "AutoV3": "56EC5F28085A" }, "primary": true, - "downloadUrl": "https://civitai.com/api/download/models/733658" + "downloadUrl": "https://civitai.com/api/download/models/2129122" }, - "id": "dl_1771889500615_0_nsfw_flux_", + "id": "dl_1772663440240_0_Wan22-I2V-", "status": "completed", - "added_time": "2026-02-23T23:31:40.615395+00:00", + "added_time": "2026-03-04T22:30:40.240414+00:00", "progress": 100.0, "speed": 0.0, "error": null, - "start_time": "2026-02-23T23:31:41.093842+00:00", - "end_time": "2026-02-23T23:31:53.994761+00:00", + "start_time": "2026-03-04T22:30:40.522365+00:00", + "end_time": "2026-03-04T22:30:47.686869+00:00", "connection_type": "Single" } ] \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/.gitattributes b/custom_nodes/comfyui-segment-anything-2/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..dfe0770424b2a19faf507a501ebfc23be8f54e7b --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/custom_nodes/comfyui-segment-anything-2/.github/workflows/publish.yml b/custom_nodes/comfyui-segment-anything-2/.github/workflows/publish.yml new file mode 100644 index 0000000000000000000000000000000000000000..181cf4bf1f2a0c88a503d56592574b1f6902b1d2 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/.github/workflows/publish.yml @@ -0,0 +1,25 @@ +name: Publish to Comfy registry +on: + workflow_dispatch: + push: + branches: + - main + paths: + - "pyproject.toml" + +permissions: + issues: write + +jobs: + publish-node: + name: Publish Custom Node to registry + runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'kijai' }} + steps: + - name: Check out code + uses: actions/checkout@v4 + - name: Publish Custom Node + uses: Comfy-Org/publish-node-action@v1 + with: + ## Add your own personal access token to your Github Repository secrets and reference it here. + personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/.gitignore b/custom_nodes/comfyui-segment-anything-2/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..bd13e8072efa9d56567955139862c3ff2f1d1421 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +*pyc +.vscode +__pycache__ +*.egg-info +*.bak +checkpoints +results +backup \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/.tracking b/custom_nodes/comfyui-segment-anything-2/.tracking new file mode 100644 index 0000000000000000000000000000000000000000..92998bdce40d3540477023247d9327c94da6d8c3 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/.tracking @@ -0,0 +1,43 @@ +.gitattributes +.github/workflows/publish.yml +.gitignore +LICENSE +__init__.py +example_workflows/florence_segment_2.json +example_workflows/image_batch_bbox_segment.json +example_workflows/points_segment_video_example.json +load_model.py +nodes.py +pyproject.toml +readme.md +sam2/__init__.py +sam2/automatic_mask_generator.py +sam2/modeling/__init__.py +sam2/modeling/backbones/__init__.py +sam2/modeling/backbones/hieradet.py +sam2/modeling/backbones/image_encoder.py +sam2/modeling/backbones/utils.py +sam2/modeling/memory_attention.py +sam2/modeling/memory_encoder.py +sam2/modeling/position_encoding.py +sam2/modeling/sam/__init__.py +sam2/modeling/sam/mask_decoder.py +sam2/modeling/sam/prompt_encoder.py +sam2/modeling/sam/transformer.py +sam2/modeling/sam2_base.py +sam2/modeling/sam2_utils.py +sam2/sam2_image_predictor.py +sam2/sam2_video_predictor.py +sam2/utils/__init__.py +sam2/utils/amg.py +sam2/utils/misc.py +sam2/utils/transforms.py +sam2_configs/__init__.py +sam2_configs/sam2.1_hiera_b+.yaml +sam2_configs/sam2.1_hiera_l.yaml +sam2_configs/sam2.1_hiera_s.yaml +sam2_configs/sam2.1_hiera_t.yaml +sam2_configs/sam2_hiera_b+.yaml +sam2_configs/sam2_hiera_l.yaml +sam2_configs/sam2_hiera_s.yaml +sam2_configs/sam2_hiera_t.yaml \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/LICENSE b/custom_nodes/comfyui-segment-anything-2/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/custom_nodes/comfyui-segment-anything-2/__init__.py b/custom_nodes/comfyui-segment-anything-2/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2e96bd6ab3db650f769ae7886e0c13515752bd16 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/__init__.py @@ -0,0 +1,3 @@ +from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/example_workflows/florence_segment_2.json b/custom_nodes/comfyui-segment-anything-2/example_workflows/florence_segment_2.json new file mode 100644 index 0000000000000000000000000000000000000000..93b5aad391c2ae469d5aed71830ffd81779d54da --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/example_workflows/florence_segment_2.json @@ -0,0 +1,579 @@ +{ + "last_node_id": 102, + "last_link_id": 239, + "nodes": [ + { + "id": 83, + "type": "LoadImage", + "pos": [ + -6, + 40 + ], + "size": { + "0": 315, + "1": 314 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 196 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "truck.jpg", + "image" + ] + }, + { + "id": 66, + "type": "DownloadAndLoadSAM2Model", + "pos": [ + -34, + -171 + ], + "size": { + "0": 351.7801513671875, + "1": 130 + }, + "flags": {}, + "order": 1, + "mode": 0, + "outputs": [ + { + "name": "sam2_model", + "type": "SAM2MODEL", + "links": [ + 236 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DownloadAndLoadSAM2Model" + }, + "widgets_values": [ + "sam2_hiera_small.safetensors", + "single_image", + "cuda", + "bf16" + ] + }, + { + "id": 84, + "type": "ImageAndMaskPreview", + "pos": [ + 958, + -293 + ], + "size": { + "0": 667.9199829101562, + "1": 541.2733154296875 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 192 + }, + { + "name": "mask", + "type": "MASK", + "link": 238, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "composite", + "type": "IMAGE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "ImageAndMaskPreview" + }, + "widgets_values": [ + 1, + "255, 0, 0", + false + ] + }, + { + "id": 72, + "type": "ImageResizeKJ", + "pos": [ + 353, + 127 + ], + "size": { + "0": 315, + "1": 242 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 196 + }, + { + "name": "get_image_size", + "type": "IMAGE", + "link": null + }, + { + "name": "width_input", + "type": "INT", + "link": null, + "widget": { + "name": "width_input" + } + }, + { + "name": "height_input", + "type": "INT", + "link": null, + "widget": { + "name": "height_input" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 192, + 210, + 226, + 237 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "width", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "height", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "ImageResizeKJ" + }, + "widgets_values": [ + 768, + 512, + "nearest-exact", + false, + 2, + 0, + 0 + ] + }, + { + "id": 99, + "type": "PreviewImage", + "pos": [ + 1044, + -744 + ], + "size": { + "0": 530.9268798828125, + "1": 363.34893798828125 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 226 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 90, + "type": "PreviewImage", + "pos": [ + 422, + -800 + ], + "size": { + "0": 568.406494140625, + "1": 384.9489440917969 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 200 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 93, + "type": "Florence2toCoordinates", + "pos": [ + 399, + -314 + ], + "size": { + "0": 210, + "1": 78 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "data", + "type": "JSON", + "link": 204 + } + ], + "outputs": [ + { + "name": "coordinates", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "bboxes", + "type": "BBOX", + "links": [ + 239 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Florence2toCoordinates" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 87, + "type": "Florence2Run", + "pos": [ + -85, + -796 + ], + "size": { + "0": 400, + "1": 304 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 210, + "slot_index": 0 + }, + { + "name": "florence2_model", + "type": "FL2MODEL", + "link": 197, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 200 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "mask", + "type": "MASK", + "links": null, + "shape": 3 + }, + { + "name": "caption", + "type": "STRING", + "links": null, + "shape": 3, + "slot_index": 2 + }, + { + "name": "data", + "type": "JSON", + "links": [ + 204 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "Florence2Run" + }, + "widgets_values": [ + "wheel", + "caption_to_phrase_grounding", + true, + false, + 1024, + 3, + true, + "" + ] + }, + { + "id": 102, + "type": "Sam2Segmentation", + "pos": [ + 440, + -120 + ], + "size": [ + 314.5386123916544, + 162 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "sam2_model", + "type": "SAM2MODEL", + "link": 236 + }, + { + "name": "image", + "type": "IMAGE", + "link": 237 + }, + { + "name": "bboxes", + "type": "BBOX", + "link": 239 + }, + { + "name": "coordinates_positive", + "type": "STRING", + "link": null, + "widget": { + "name": "coordinates_positive" + } + }, + { + "name": "coordinates_negative", + "type": "STRING", + "link": null, + "widget": { + "name": "coordinates_negative" + } + } + ], + "outputs": [ + { + "name": "mask", + "type": "MASK", + "links": [ + 238 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "Sam2Segmentation" + }, + "widgets_values": [ + true, + "", + "", + true + ] + }, + { + "id": 88, + "type": "DownloadAndLoadFlorence2Model", + "pos": [ + -470, + -777 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 2, + "mode": 0, + "outputs": [ + { + "name": "florence2_model", + "type": "FL2MODEL", + "links": [ + 197 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DownloadAndLoadFlorence2Model" + }, + "widgets_values": [ + "microsoft/Florence-2-base", + "fp16", + "sdpa" + ] + } + ], + "links": [ + [ + 192, + 72, + 0, + 84, + 0, + "IMAGE" + ], + [ + 196, + 83, + 0, + 72, + 0, + "IMAGE" + ], + [ + 197, + 88, + 0, + 87, + 1, + "FL2MODEL" + ], + [ + 200, + 87, + 0, + 90, + 0, + "IMAGE" + ], + [ + 204, + 87, + 3, + 93, + 0, + "JSON" + ], + [ + 210, + 72, + 0, + 87, + 0, + "IMAGE" + ], + [ + 226, + 72, + 0, + 99, + 0, + "IMAGE" + ], + [ + 236, + 66, + 0, + 102, + 0, + "SAM2MODEL" + ], + [ + 237, + 72, + 0, + 102, + 1, + "IMAGE" + ], + [ + 238, + 102, + 0, + 84, + 1, + "MASK" + ], + [ + 239, + 93, + 1, + 102, + 2, + "BBOX" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.7627768444385467, + "offset": [ + 564.3268832902941, + 896.4031145502903 + ] + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/example_workflows/image_batch_bbox_segment.json b/custom_nodes/comfyui-segment-anything-2/example_workflows/image_batch_bbox_segment.json new file mode 100644 index 0000000000000000000000000000000000000000..2f8a1c0a1d87ab5bca7f1bb9d149873f12055caa --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/example_workflows/image_batch_bbox_segment.json @@ -0,0 +1,766 @@ +{ + "last_node_id": 30, + "last_link_id": 58, + "nodes": [ + { + "id": 2, + "type": "DownloadAndLoadSAM2Model", + "pos": [ + 119, + 52 + ], + "size": { + "0": 315, + "1": 130 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "sam2_model", + "type": "SAM2MODEL", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DownloadAndLoadSAM2Model" + }, + "widgets_values": [ + "sam2_hiera_base_plus.safetensors", + "single_image", + "cuda", + "bf16" + ] + }, + { + "id": 13, + "type": "DownloadAndLoadFlorence2Model", + "pos": [ + 105, + -299 + ], + "size": { + "0": 315, + "1": 106 + }, + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "lora", + "type": "PEFTLORA", + "link": null + } + ], + "outputs": [ + { + "name": "florence2_model", + "type": "FL2MODEL", + "links": [ + 23 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "DownloadAndLoadFlorence2Model" + }, + "widgets_values": [ + "microsoft/Florence-2-large", + "fp16", + "sdpa" + ] + }, + { + "id": 26, + "type": "MaskToImage", + "pos": [ + 1161, + 280 + ], + "size": { + "0": 210, + "1": 26 + }, + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 43 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 44 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 25, + "type": "ImageCompositeMasked", + "pos": [ + 1124, + 364 + ], + "size": { + "0": 315, + "1": 146 + }, + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 55, + "slot_index": 0 + }, + { + "name": "source", + "type": "IMAGE", + "link": 44 + }, + { + "name": "mask", + "type": "MASK", + "link": 45 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 56 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 0, + 0, + false + ] + }, + { + "id": 29, + "type": "VHS_VideoCombine", + "pos": [ + 1486, + 58 + ], + "size": [ + 772.7946166992188, + 859.3206163194444 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 56, + "slot_index": 0 + }, + { + "name": "audio", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "meta_batch", + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 3, + "loop_count": 0, + "filename_prefix": "AnimateDiff", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "AnimateDiff_00002.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h264-mp4", + "frame_rate": 3 + } + } + } + }, + { + "id": 11, + "type": "VHS_LoadVideo", + "pos": [ + 76, + 274 + ], + "size": [ + 235.1999969482422, + 429.0311089409722 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "meta_batch", + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 28, + 37 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "frame_count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "audio", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + }, + { + "name": "video_info", + "type": "VHS_VIDEOINFO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "VHS_LoadVideo" + }, + "widgets_values": { + "video": "katana_02.mp4", + "force_rate": 0, + "force_size": "Disabled", + "custom_width": 512, + "custom_height": 512, + "frame_load_cap": 16, + "skip_first_frames": 0, + "select_every_nth": 5, + "choose video to upload": "image", + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "frame_load_cap": 16, + "skip_first_frames": 0, + "force_rate": 0, + "filename": "katana_02.mp4", + "type": "input", + "format": "video/mp4", + "select_every_nth": 5 + } + } + } + }, + { + "id": 21, + "type": "GetImageSizeAndCount", + "pos": [ + 393, + 282 + ], + "size": { + "0": 210, + "1": 86 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 37 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 58 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "1440 width", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "1024 height", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "16 count", + "type": "INT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "GetImageSizeAndCount" + } + }, + { + "id": 7, + "type": "Sam2Segmentation", + "pos": [ + 744, + 227 + ], + "size": { + "0": 314.3733825683594, + "1": 190.31338500976562 + }, + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "sam2_model", + "type": "SAM2MODEL", + "link": 9 + }, + { + "name": "image", + "type": "IMAGE", + "link": 58 + }, + { + "name": "bboxes", + "type": "BBOX", + "link": 54 + }, + { + "name": "mask", + "type": "MASK", + "link": null, + "slot_index": 3 + }, + { + "name": "coordinates_positive", + "type": "STRING", + "link": null, + "widget": { + "name": "coordinates_positive" + } + }, + { + "name": "coordinates_negative", + "type": "STRING", + "link": null, + "widget": { + "name": "coordinates_negative" + } + } + ], + "outputs": [ + { + "name": "mask", + "type": "MASK", + "links": [ + 43, + 45 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Sam2Segmentation" + }, + "widgets_values": [ + true, + "", + "", + true + ] + }, + { + "id": 30, + "type": "VHS_VideoCombine", + "pos": [ + 1093, + -868 + ], + "size": [ + 772.7946166992188, + 859.3206163194444 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 57, + "slot_index": 0 + }, + { + "name": "audio", + "type": "VHS_AUDIO", + "link": null + }, + { + "name": "meta_batch", + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 3, + "loop_count": 0, + "filename_prefix": "AnimateDiff", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "AnimateDiff_00001.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h264-mp4", + "frame_rate": 3 + } + } + } + }, + { + "id": 16, + "type": "Florence2toCoordinates", + "pos": [ + 942, + 16 + ], + "size": { + "0": 315, + "1": 102 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "data", + "type": "JSON", + "link": 26 + } + ], + "outputs": [ + { + "name": "center_coordinates", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "bboxes", + "type": "BBOX", + "links": [ + 54 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "Florence2toCoordinates" + }, + "widgets_values": [ + "0", + true + ] + }, + { + "id": 12, + "type": "Florence2Run", + "pos": [ + 506, + -316 + ], + "size": { + "0": 400, + "1": 352 + }, + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 28, + "slot_index": 0 + }, + { + "name": "florence2_model", + "type": "FL2MODEL", + "link": 23, + "slot_index": 1 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 55, + 57 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "mask", + "type": "MASK", + "links": null, + "shape": 3 + }, + { + "name": "caption", + "type": "STRING", + "links": null, + "shape": 3 + }, + { + "name": "data", + "type": "JSON", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "Florence2Run" + }, + "widgets_values": [ + "sword", + "caption_to_phrase_grounding", + true, + false, + 1024, + 3, + true, + "", + 3228786869, + "fixed" + ] + } + ], + "links": [ + [ + 9, + 2, + 0, + 7, + 0, + "SAM2MODEL" + ], + [ + 23, + 13, + 0, + 12, + 1, + "FL2MODEL" + ], + [ + 26, + 12, + 3, + 16, + 0, + "JSON" + ], + [ + 28, + 11, + 0, + 12, + 0, + "IMAGE" + ], + [ + 37, + 11, + 0, + 21, + 0, + "IMAGE" + ], + [ + 43, + 7, + 0, + 26, + 0, + "MASK" + ], + [ + 44, + 26, + 0, + 25, + 1, + "IMAGE" + ], + [ + 45, + 7, + 0, + 25, + 2, + "MASK" + ], + [ + 54, + 16, + 1, + 7, + 2, + "BBOX" + ], + [ + 55, + 12, + 0, + 25, + 0, + "IMAGE" + ], + [ + 56, + 25, + 0, + 29, + 0, + "IMAGE" + ], + [ + 57, + 12, + 0, + 30, + 0, + "IMAGE" + ], + [ + 58, + 21, + 0, + 7, + 1, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.620921323059155, + "offset": [ + 253.5867105157341, + 622.007731477587 + ] + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/example_workflows/points_segment_video_example.json b/custom_nodes/comfyui-segment-anything-2/example_workflows/points_segment_video_example.json new file mode 100644 index 0000000000000000000000000000000000000000..6fa9b973aa784fe71e9b1c02309f51bec0fc47ca --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/example_workflows/points_segment_video_example.json @@ -0,0 +1,447 @@ +{ + "last_node_id": 114, + "last_link_id": 54, + "nodes": [ + { + "id": 106, + "type": "DownloadAndLoadSAM2Model", + "pos": [ + 451, + 420 + ], + "size": { + "0": 315, + "1": 130 + }, + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "sam2_model", + "type": "SAM2MODEL", + "links": [ + 40 + ], + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "DownloadAndLoadSAM2Model" + }, + "widgets_values": [ + "sam2_hiera_base_plus.safetensors", + "video", + "cuda", + "bf16" + ] + }, + { + "id": 112, + "type": "ShowText|pysssss", + "pos": [ + 1421, + -359 + ], + "size": { + "0": 315, + "1": 100 + }, + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "text", + "type": "STRING", + "link": 53, + "widget": { + "name": "text" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": null, + "shape": 6 + } + ], + "properties": { + "Node name for S&R": "ShowText|pysssss" + }, + "widgets_values": [ + "", + "[{\"x\": 620, \"y\": 359}, {\"x\": 621, \"y\": 246}]" + ] + }, + { + "id": 102, + "type": "VHS_LoadVideo", + "pos": [ + 14, + -59 + ], + "size": [ + 363.24957275390625, + 619.2495727539062 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "meta_batch", + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 41, + 43, + 52 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "frame_count", + "type": "INT", + "links": null, + "shape": 3 + }, + { + "name": "audio", + "type": "VHS_AUDIO", + "links": null, + "shape": 3 + }, + { + "name": "video_info", + "type": "VHS_VIDEOINFO", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "VHS_LoadVideo" + }, + "widgets_values": { + "video": "ballerina_davinci.mp4", + "force_rate": 0, + "force_size": "Disabled", + "custom_width": 512, + "custom_height": 512, + "frame_load_cap": 16, + "skip_first_frames": 0, + "select_every_nth": 3, + "choose video to upload": "image", + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "frame_load_cap": 16, + "skip_first_frames": 0, + "force_rate": 0, + "filename": "ballerina_davinci.mp4", + "type": "input", + "format": "video/mp4", + "select_every_nth": 3 + } + } + } + }, + { + "id": 113, + "type": "Note", + "pos": [ + 56, + -415 + ], + "size": [ + 309.10654388427724, + 177.01340377807628 + ], + "flags": {}, + "order": 2, + "mode": 0, + "properties": { + "text": "" + }, + "widgets_values": [ + "To get the image for the points editor, first create a canvas, then either input image/video (first frame is taken), or copy/paste an image while the node is selected, or drag&drop an image.\n\nWARNING: the image WILL BE SAVED to the node in compressed format, including when saving the workflow!\n\nClick the ? on the node for more information" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 107, + "type": "PreviewAnimation", + "pos": [ + 1340, + 32 + ], + "size": { + "0": 514.92431640625, + "1": 577.3973999023438 + }, + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 43 + }, + { + "name": "masks", + "type": "MASK", + "link": 42, + "slot_index": 1 + } + ], + "title": "Preview Animation 16x768x768", + "properties": { + "Node name for S&R": "PreviewAnimation" + }, + "widgets_values": [ + 16, + null + ] + }, + { + "id": 105, + "type": "Sam2Segmentation", + "pos": [ + 859, + 409 + ], + "size": { + "0": 315, + "1": 170 + }, + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "sam2_model", + "type": "SAM2MODEL", + "link": 40, + "slot_index": 0 + }, + { + "name": "image", + "type": "IMAGE", + "link": 41, + "slot_index": 1 + }, + { + "name": "bboxes", + "type": "BBOX", + "link": null + }, + { + "name": "coordinates_positive", + "type": "STRING", + "link": 54, + "widget": { + "name": "coordinates_positive" + }, + "slot_index": 3 + }, + { + "name": "coordinates_negative", + "type": "STRING", + "link": null, + "widget": { + "name": "coordinates_negative" + } + } + ], + "outputs": [ + { + "name": "mask", + "type": "MASK", + "links": [ + 42 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Sam2Segmentation" + }, + "widgets_values": [ + true, + "", + "", + false + ] + }, + { + "id": 114, + "type": "PointsEditor", + "pos": [ + 432, + -735 + ], + "size": [ + 813, + 1068 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "bg_image", + "type": "IMAGE", + "link": 52 + } + ], + "outputs": [ + { + "name": "positive_coords", + "type": "STRING", + "links": [ + 53, + 54 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative_coords", + "type": "STRING", + "links": null, + "shape": 3 + }, + { + "name": "bbox", + "type": "BBOX", + "links": null, + "shape": 3, + "slot_index": 2 + }, + { + "name": "bbox_mask", + "type": "MASK", + "links": null, + "shape": 3 + }, + { + "name": "cropped_image", + "type": "IMAGE", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "PointsEditor", + "imgData": { + "name": "bg_image", + "base64": [ + "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" + ] + } + }, + "widgets_values": [ + "{\"positive\":[{\"x\":620.2460000000001,\"y\":359.37000000000006},{\"x\":620.73,\"y\":245.63000000000002}],\"negative\":[{\"x\":0,\"y\":0}]}", + "[{\"x\":620.2460000000001,\"y\":359.37000000000006},{\"x\":620.73,\"y\":245.63000000000002}]", + "[{\"x\":0,\"y\":0}]", + "[{}]", + "[{}]", + "xyxy", + 768, + 768, + false, + null, + null, + null + ] + } + ], + "links": [ + [ + 40, + 106, + 0, + 105, + 0, + "SAM2MODEL" + ], + [ + 41, + 102, + 0, + 105, + 1, + "IMAGE" + ], + [ + 42, + 105, + 0, + 107, + 1, + "MASK" + ], + [ + 43, + 102, + 0, + 107, + 0, + "IMAGE" + ], + [ + 52, + 102, + 0, + 114, + 0, + "IMAGE" + ], + [ + 53, + 114, + 0, + 112, + 0, + "STRING" + ], + [ + 54, + 114, + 0, + 105, + 3, + "STRING" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.7513148009015777, + "offset": { + "0": 226.08052057760656, + "1": 820.3321624947772 + } + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/load_model.py b/custom_nodes/comfyui-segment-anything-2/load_model.py new file mode 100644 index 0000000000000000000000000000000000000000..03d6e05cb8d7d59af0c2cd6613cf8d32d0d86adc --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/load_model.py @@ -0,0 +1,194 @@ +import yaml +from .sam2.modeling.sam2_base import SAM2Base +from .sam2.modeling.backbones.image_encoder import ImageEncoder +from .sam2.modeling.backbones.hieradet import Hiera +from .sam2.modeling.backbones.image_encoder import FpnNeck +from .sam2.modeling.position_encoding import PositionEmbeddingSine +from .sam2.modeling.memory_attention import MemoryAttention, MemoryAttentionLayer +from .sam2.modeling.sam.transformer import RoPEAttention +from .sam2.modeling.memory_encoder import MemoryEncoder, MaskDownSampler, Fuser, CXBlock + +from .sam2.sam2_image_predictor import SAM2ImagePredictor +from .sam2.sam2_video_predictor import SAM2VideoPredictor +from .sam2.automatic_mask_generator import SAM2AutomaticMaskGenerator +from comfy.utils import load_torch_file + +def load_model(model_path, model_cfg_path, segmentor, dtype, device): + # Load the YAML configuration + with open(model_cfg_path, 'r') as file: + config = yaml.safe_load(file) + + # Extract the model configuration + model_config = config['model'] + + # Instantiate the image encoder components + trunk_config = model_config['image_encoder']['trunk'] + neck_config = model_config['image_encoder']['neck'] + position_encoding_config = neck_config['position_encoding'] + + position_encoding = PositionEmbeddingSine( + num_pos_feats=position_encoding_config['num_pos_feats'], + normalize=position_encoding_config['normalize'], + scale=position_encoding_config['scale'], + temperature=position_encoding_config['temperature'] + ) + + neck = FpnNeck( + position_encoding=position_encoding, + d_model=neck_config['d_model'], + backbone_channel_list=neck_config['backbone_channel_list'], + fpn_top_down_levels=neck_config['fpn_top_down_levels'], + fpn_interp_model=neck_config['fpn_interp_model'] + ) + + keys_to_include = ['embed_dim', 'num_heads', 'global_att_blocks', 'window_pos_embed_bkg_spatial_size', 'stages'] + trunk_kwargs = {key: trunk_config[key] for key in keys_to_include if key in trunk_config} + trunk = Hiera(**trunk_kwargs) + + image_encoder = ImageEncoder( + scalp=model_config['image_encoder']['scalp'], + trunk=trunk, + neck=neck + ) + # Instantiate the memory attention components + memory_attention_layer_config = config['model']['memory_attention']['layer'] + self_attention_config = memory_attention_layer_config['self_attention'] + cross_attention_config = memory_attention_layer_config['cross_attention'] + + self_attention = RoPEAttention( + rope_theta=self_attention_config['rope_theta'], + feat_sizes=self_attention_config['feat_sizes'], + embedding_dim=self_attention_config['embedding_dim'], + num_heads=self_attention_config['num_heads'], + downsample_rate=self_attention_config['downsample_rate'], + dropout=self_attention_config['dropout'] + ) + + cross_attention = RoPEAttention( + rope_theta=cross_attention_config['rope_theta'], + feat_sizes=cross_attention_config['feat_sizes'], + rope_k_repeat=cross_attention_config['rope_k_repeat'], + embedding_dim=cross_attention_config['embedding_dim'], + num_heads=cross_attention_config['num_heads'], + downsample_rate=cross_attention_config['downsample_rate'], + dropout=cross_attention_config['dropout'], + kv_in_dim=cross_attention_config['kv_in_dim'] + ) + + memory_attention_layer = MemoryAttentionLayer( + activation=memory_attention_layer_config['activation'], + dim_feedforward=memory_attention_layer_config['dim_feedforward'], + dropout=memory_attention_layer_config['dropout'], + pos_enc_at_attn=memory_attention_layer_config['pos_enc_at_attn'], + self_attention=self_attention, + d_model=memory_attention_layer_config['d_model'], + pos_enc_at_cross_attn_keys=memory_attention_layer_config['pos_enc_at_cross_attn_keys'], + pos_enc_at_cross_attn_queries=memory_attention_layer_config['pos_enc_at_cross_attn_queries'], + cross_attention=cross_attention + ) + + memory_attention = MemoryAttention( + d_model=config['model']['memory_attention']['d_model'], + pos_enc_at_input=config['model']['memory_attention']['pos_enc_at_input'], + layer=memory_attention_layer, + num_layers=config['model']['memory_attention']['num_layers'] + ) + + # Instantiate the memory encoder components + memory_encoder_config = config['model']['memory_encoder'] + position_encoding_mem_enc_config = memory_encoder_config['position_encoding'] + mask_downsampler_config = memory_encoder_config['mask_downsampler'] + fuser_layer_config = memory_encoder_config['fuser']['layer'] + + position_encoding_mem_enc = PositionEmbeddingSine( + num_pos_feats=position_encoding_mem_enc_config['num_pos_feats'], + normalize=position_encoding_mem_enc_config['normalize'], + scale=position_encoding_mem_enc_config['scale'], + temperature=position_encoding_mem_enc_config['temperature'] + ) + + mask_downsampler = MaskDownSampler( + kernel_size=mask_downsampler_config['kernel_size'], + stride=mask_downsampler_config['stride'], + padding=mask_downsampler_config['padding'] + ) + + fuser_layer = CXBlock( + dim=fuser_layer_config['dim'], + kernel_size=fuser_layer_config['kernel_size'], + padding=fuser_layer_config['padding'], + layer_scale_init_value=float(fuser_layer_config['layer_scale_init_value']) + ) + fuser = Fuser( + num_layers=memory_encoder_config['fuser']['num_layers'], + layer=fuser_layer + ) + + memory_encoder = MemoryEncoder( + position_encoding=position_encoding_mem_enc, + mask_downsampler=mask_downsampler, + fuser=fuser, + out_dim=memory_encoder_config['out_dim'] + ) + + sam_mask_decoder_extra_args = { + "dynamic_multimask_via_stability": True, + "dynamic_multimask_stability_delta": 0.05, + "dynamic_multimask_stability_thresh": 0.98, + } + + def initialize_model(model_class, model_config, segmentor, image_encoder, memory_attention, memory_encoder, sam_mask_decoder_extra_args, dtype, device): + return model_class( + image_encoder=image_encoder, + memory_attention=memory_attention, + memory_encoder=memory_encoder, + sam_mask_decoder_extra_args=sam_mask_decoder_extra_args, + num_maskmem=model_config['num_maskmem'], + image_size=model_config['image_size'], + sigmoid_scale_for_mem_enc=model_config['sigmoid_scale_for_mem_enc'], + sigmoid_bias_for_mem_enc=model_config['sigmoid_bias_for_mem_enc'], + use_mask_input_as_output_without_sam=model_config['use_mask_input_as_output_without_sam'], + directly_add_no_mem_embed=model_config['directly_add_no_mem_embed'], + use_high_res_features_in_sam=model_config['use_high_res_features_in_sam'], + multimask_output_in_sam=model_config['multimask_output_in_sam'], + iou_prediction_use_sigmoid=model_config['iou_prediction_use_sigmoid'], + use_obj_ptrs_in_encoder=model_config['use_obj_ptrs_in_encoder'], + add_tpos_enc_to_obj_ptrs=model_config['add_tpos_enc_to_obj_ptrs'], + only_obj_ptrs_in_the_past_for_eval=model_config['only_obj_ptrs_in_the_past_for_eval'], + pred_obj_scores=model_config['pred_obj_scores'], + pred_obj_scores_mlp=model_config['pred_obj_scores_mlp'], + fixed_no_obj_ptr=model_config['fixed_no_obj_ptr'], + multimask_output_for_tracking=model_config['multimask_output_for_tracking'], + use_multimask_token_for_obj_ptr=model_config['use_multimask_token_for_obj_ptr'], + compile_image_encoder=model_config['compile_image_encoder'], + multimask_min_pt_num=model_config['multimask_min_pt_num'], + multimask_max_pt_num=model_config['multimask_max_pt_num'], + use_mlp_for_obj_ptr_proj=model_config['use_mlp_for_obj_ptr_proj'], + proj_tpos_enc_in_obj_ptrs=model_config['proj_tpos_enc_in_obj_ptrs'], + no_obj_embed_spatial=model_config['no_obj_embed_spatial'], + use_signed_tpos_enc_to_obj_ptrs=model_config['use_signed_tpos_enc_to_obj_ptrs'], + binarize_mask_from_pts_for_mem_enc=True if segmentor == 'video' else False, + ).to(dtype).to(device).eval() + + # Load the state dictionary + sd = load_torch_file(model_path) + + # Initialize model based on segmentor type + if segmentor == 'single_image': + model_class = SAM2Base + model = initialize_model(model_class, model_config, segmentor, image_encoder, memory_attention, memory_encoder, sam_mask_decoder_extra_args, dtype, device) + model.load_state_dict(sd) + model = SAM2ImagePredictor(model) + elif segmentor == 'video': + model_class = SAM2VideoPredictor + model = initialize_model(model_class, model_config, segmentor, image_encoder, memory_attention, memory_encoder, sam_mask_decoder_extra_args, dtype, device) + model.load_state_dict(sd) + elif segmentor == 'automaskgenerator': + model_class = SAM2Base + model = initialize_model(model_class, model_config, segmentor, image_encoder, memory_attention, memory_encoder, sam_mask_decoder_extra_args, dtype, device) + model.load_state_dict(sd) + model = SAM2AutomaticMaskGenerator(model) + else: + raise ValueError(f"Segmentor {segmentor} not supported") + + return model \ No newline at end of file diff --git a/custom_nodes/comfyui-segment-anything-2/nodes.py b/custom_nodes/comfyui-segment-anything-2/nodes.py new file mode 100644 index 0000000000000000000000000000000000000000..c5ac40643edf0c0d577f34c218d7df157ef2197a --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/nodes.py @@ -0,0 +1,771 @@ +import torch +from torch.functional import F +import os +import numpy as np +import json +import random + +from tqdm import tqdm +from contextlib import nullcontext + +from .load_model import load_model + +import comfy.model_management as mm +from comfy.utils import ProgressBar, common_upscale +import folder_paths + +script_directory = os.path.dirname(os.path.abspath(__file__)) + +class DownloadAndLoadSAM2Model: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "model": ([ + 'sam2_hiera_base_plus.safetensors', + 'sam2_hiera_large.safetensors', + 'sam2_hiera_small.safetensors', + 'sam2_hiera_tiny.safetensors', + 'sam2.1_hiera_base_plus.safetensors', + 'sam2.1_hiera_large.safetensors', + 'sam2.1_hiera_small.safetensors', + 'sam2.1_hiera_tiny.safetensors', + ],), + "segmentor": ( + ['single_image','video', 'automaskgenerator'], + ), + "device": (['cuda', 'cpu', 'mps'], ), + "precision": ([ 'fp16','bf16','fp32'], + { + "default": 'fp16' + }), + + }, + } + + RETURN_TYPES = ("SAM2MODEL",) + RETURN_NAMES = ("sam2_model",) + FUNCTION = "loadmodel" + CATEGORY = "SAM2" + + def loadmodel(self, model, segmentor, device, precision): + if precision != 'fp32' and device == 'cpu': + raise ValueError("fp16 and bf16 are not supported on cpu") + + if device == "cuda": + if torch.cuda.get_device_properties(0).major >= 8: + # turn on tfloat32 for Ampere GPUs (https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices) + torch.backends.cuda.matmul.allow_tf32 = True + torch.backends.cudnn.allow_tf32 = True + dtype = {"bf16": torch.bfloat16, "fp16": torch.float16, "fp32": torch.float32}[precision] + device = {"cuda": torch.device("cuda"), "cpu": torch.device("cpu"), "mps": torch.device("mps")}[device] + + download_path = os.path.join(folder_paths.models_dir, "sam2") + if precision != 'fp32' and "2.1" in model: + base_name, extension = model.rsplit('.', 1) + model = f"{base_name}-fp16.{extension}" + model_path = os.path.join(download_path, model) + print("model_path: ", model_path) + + if not os.path.exists(model_path): + print(f"Downloading SAM2 model to: {model_path}") + from huggingface_hub import snapshot_download + snapshot_download(repo_id="Kijai/sam2-safetensors", + allow_patterns=[f"*{model}*"], + local_dir=download_path, + local_dir_use_symlinks=False) + + model_mapping = { + "2.0": { + "base": "sam2_hiera_b+.yaml", + "large": "sam2_hiera_l.yaml", + "small": "sam2_hiera_s.yaml", + "tiny": "sam2_hiera_t.yaml" + }, + "2.1": { + "base": "sam2.1_hiera_b+.yaml", + "large": "sam2.1_hiera_l.yaml", + "small": "sam2.1_hiera_s.yaml", + "tiny": "sam2.1_hiera_t.yaml" + } + } + version = "2.1" if "2.1" in model else "2.0" + + model_cfg_path = next( + (os.path.join(script_directory, "sam2_configs", cfg) + for key, cfg in model_mapping[version].items() if key in model), + None + ) + print(f"Using model config: {model_cfg_path}") + + model = load_model(model_path, model_cfg_path, segmentor, dtype, device) + + sam2_model = { + 'model': model, + 'dtype': dtype, + 'device': device, + 'segmentor' : segmentor, + 'version': version + } + + return (sam2_model,) + + +class Florence2toCoordinates: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "data": ("JSON", ), + "index": ("STRING", {"default": "0"}), + "batch": ("BOOLEAN", {"default": False}), + }, + + } + + RETURN_TYPES = ("STRING", "BBOX") + RETURN_NAMES =("center_coordinates", "bboxes") + FUNCTION = "segment" + CATEGORY = "SAM2" + + def segment(self, data, index, batch=False): + try: + coordinates = coordinates.replace("'", '"') + coordinates = json.loads(coordinates) + except: + coordinates = data + + if len(data)==0: + return (json.dumps([{'x': 0, 'y': 0}]),) + center_points = [] + + def get_bboxes(item): + return item["bboxes"] if isinstance(item, dict) else item + + if index.strip(): # Check if index is not empty + indexes = [int(i) for i in index.split(",")] + else: # If index is empty, use all indices from data[0] + indexes = list(range(len(get_bboxes(data[0])))) + + print("Indexes:", indexes) + bboxes = [] + + if batch: + for idx in indexes: + if 0 <= idx < len(get_bboxes(data[0])): + for i in range(len(data)): + bbox = get_bboxes(data[i])[idx] + min_x, min_y, max_x, max_y = bbox + center_x = int((min_x + max_x) / 2) + center_y = int((min_y + max_y) / 2) + center_points.append({"x": center_x, "y": center_y}) + bboxes.append(bbox) + else: + for idx in indexes: + if 0 <= idx < len(get_bboxes(data[0])): + bbox = get_bboxes(data[0])[idx] + min_x, min_y, max_x, max_y = bbox + center_x = int((min_x + max_x) / 2) + center_y = int((min_y + max_y) / 2) + center_points.append({"x": center_x, "y": center_y}) + bboxes.append(bbox) + else: + raise ValueError(f"There's nothing in index: {idx}") + + coordinates = json.dumps(center_points) + print("Coordinates:", coordinates) + return (coordinates, bboxes) + +class Sam2Segmentation: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "sam2_model": ("SAM2MODEL", ), + "image": ("IMAGE", ), + "keep_model_loaded": ("BOOLEAN", {"default": False}), + }, + "optional": { + "coordinates_positive": ("STRING", {"forceInput": True}), + "coordinates_negative": ("STRING", {"forceInput": True}), + "bboxes": ("BBOX", ), + "individual_objects": ("BOOLEAN", {"default": False}), + "mask": ("MASK", ), + + }, + } + + RETURN_TYPES = ("MASK", ) + RETURN_NAMES =("mask", ) + FUNCTION = "segment" + CATEGORY = "SAM2" + + def segment(self, image, sam2_model, keep_model_loaded, coordinates_positive=None, coordinates_negative=None, + individual_objects=False, bboxes=None, mask=None): + offload_device = mm.unet_offload_device() + model = sam2_model["model"] + device = sam2_model["device"] + dtype = sam2_model["dtype"] + segmentor = sam2_model["segmentor"] + B, H, W, C = image.shape + + if mask is not None: + input_mask = mask.clone().unsqueeze(1) + input_mask = F.interpolate(input_mask, size=(256, 256), mode="bilinear") + input_mask = input_mask.squeeze(1) + + if segmentor == 'automaskgenerator': + raise ValueError("For automaskgenerator use Sam2AutoMaskSegmentation -node") + if segmentor == 'single_image' and B > 1: + print("Segmenting batch of images with single_image segmentor") + + if segmentor == 'video' and bboxes is not None and "2.1" not in sam2_model["version"]: + raise ValueError("2.0 model doesn't support bboxes with video segmentor") + + if segmentor == 'video': # video model needs images resized first thing + model_input_image_size = model.image_size + print("Resizing to model input image size: ", model_input_image_size) + image = common_upscale(image.movedim(-1,1), model_input_image_size, model_input_image_size, "bilinear", "disabled").movedim(1,-1) + + #handle point coordinates + if coordinates_positive is not None: + try: + coordinates_positive = json.loads(coordinates_positive.replace("'", '"')) + coordinates_positive = [(coord['x'], coord['y']) for coord in coordinates_positive] + if coordinates_negative is not None: + coordinates_negative = json.loads(coordinates_negative.replace("'", '"')) + coordinates_negative = [(coord['x'], coord['y']) for coord in coordinates_negative] + except: + pass + + if not individual_objects: + positive_point_coords = np.atleast_2d(np.array(coordinates_positive)) + else: + positive_point_coords = np.array([np.atleast_2d(coord) for coord in coordinates_positive]) + + if coordinates_negative is not None: + negative_point_coords = np.array(coordinates_negative) + # Ensure both positive and negative coords are lists of 2D arrays if individual_objects is True + if individual_objects: + assert negative_point_coords.shape[0] <= positive_point_coords.shape[0], "Can't have more negative than positive points in individual_objects mode" + if negative_point_coords.ndim == 2: + negative_point_coords = negative_point_coords[:, np.newaxis, :] + # Extend negative coordinates to match the number of positive coordinates + while negative_point_coords.shape[0] < positive_point_coords.shape[0]: + negative_point_coords = np.concatenate((negative_point_coords, negative_point_coords[:1, :, :]), axis=0) + final_coords = np.concatenate((positive_point_coords, negative_point_coords), axis=1) + else: + final_coords = np.concatenate((positive_point_coords, negative_point_coords), axis=0) + else: + final_coords = positive_point_coords + + # Handle possible bboxes + if bboxes is not None: + boxes_np_batch = [] + for bbox_list in bboxes: + boxes_np = [] + for bbox in bbox_list: + boxes_np.append(bbox) + boxes_np = np.array(boxes_np) + boxes_np_batch.append(boxes_np) + if individual_objects: + final_box = np.array(boxes_np_batch) + else: + final_box = np.array(boxes_np) + final_labels = None + + #handle labels + if coordinates_positive is not None: + if not individual_objects: + positive_point_labels = np.ones(len(positive_point_coords)) + else: + positive_labels = [] + for point in positive_point_coords: + positive_labels.append(np.array([1])) # 1) + positive_point_labels = np.stack(positive_labels, axis=0) + + if coordinates_negative is not None: + if not individual_objects: + negative_point_labels = np.zeros(len(negative_point_coords)) # 0 = negative + final_labels = np.concatenate((positive_point_labels, negative_point_labels), axis=0) + else: + negative_labels = [] + for point in positive_point_coords: + negative_labels.append(np.array([0])) # 1) + negative_point_labels = np.stack(negative_labels, axis=0) + #combine labels + final_labels = np.concatenate((positive_point_labels, negative_point_labels), axis=1) + else: + final_labels = positive_point_labels + print("combined labels: ", final_labels) + print("combined labels shape: ", final_labels.shape) + + mask_list = [] + try: + model.to(device) + except: + model.model.to(device) + + autocast_condition = not mm.is_device_mps(device) + with torch.autocast(mm.get_autocast_device(device), dtype=dtype) if autocast_condition else nullcontext(): + if segmentor == 'single_image': + image_np = (image.contiguous() * 255).byte().numpy() + comfy_pbar = ProgressBar(len(image_np)) + tqdm_pbar = tqdm(total=len(image_np), desc="Processing Images") + for i in range(len(image_np)): + model.set_image(image_np[i]) + if bboxes is None: + input_box = None + else: + if len(image_np) > 1: + input_box = final_box[i] + input_box = final_box + + out_masks, scores, logits = model.predict( + point_coords=final_coords if coordinates_positive is not None else None, + point_labels=final_labels if coordinates_positive is not None else None, + box=input_box, + multimask_output=True if not individual_objects else False, + mask_input = input_mask[i].unsqueeze(0) if mask is not None else None, + ) + + if out_masks.ndim == 3: + sorted_ind = np.argsort(scores)[::-1] + out_masks = out_masks[sorted_ind][0] #choose only the best result for now + scores = scores[sorted_ind] + logits = logits[sorted_ind] + mask_list.append(np.expand_dims(out_masks, axis=0)) + else: + _, _, H, W = out_masks.shape + # Combine masks for all object IDs in the frame + combined_mask = np.zeros((H, W), dtype=bool) + for out_mask in out_masks: + combined_mask = np.logical_or(combined_mask, out_mask) + combined_mask = combined_mask.astype(np.uint8) + mask_list.append(combined_mask) + comfy_pbar.update(1) + tqdm_pbar.update(1) + + elif segmentor == 'video': + mask_list = [] + if hasattr(self, 'inference_state') and self.inference_state is not None: + model.reset_state(self.inference_state) + self.inference_state = model.init_state(image.permute(0, 3, 1, 2).contiguous(), H, W, device=device) + if bboxes is None: + input_box = None + else: + input_box = bboxes[0] + + if individual_objects and bboxes is not None: + raise ValueError("bboxes not supported with individual_objects") + + + if individual_objects: + for i, (coord, label) in enumerate(zip(final_coords, final_labels)): + _, out_obj_ids, out_mask_logits = model.add_new_points_or_box( + inference_state=self.inference_state, + frame_idx=0, + obj_id=i, + points=final_coords[i], + labels=final_labels[i], + clear_old_points=True, + box=input_box + ) + else: + _, out_obj_ids, out_mask_logits = model.add_new_points_or_box( + inference_state=self.inference_state, + frame_idx=0, + obj_id=1, + points=final_coords if coordinates_positive is not None else None, + labels=final_labels if coordinates_positive is not None else None, + clear_old_points=True, + box=input_box + ) + + pbar = ProgressBar(B) + video_segments = {} + for out_frame_idx, out_obj_ids, out_mask_logits in model.propagate_in_video(self.inference_state): + video_segments[out_frame_idx] = { + out_obj_id: (out_mask_logits[i] > 0.0).cpu().numpy() + for i, out_obj_id in enumerate(out_obj_ids) + } + pbar.update(1) + if individual_objects: + _, _, H, W = out_mask_logits.shape + # Combine masks for all object IDs in the frame + combined_mask = np.zeros((H, W), dtype=np.uint8) + for i, out_obj_id in enumerate(out_obj_ids): + out_mask = (out_mask_logits[i] > 0.0).cpu().numpy() + combined_mask = np.logical_or(combined_mask, out_mask) + video_segments[out_frame_idx] = combined_mask + + if individual_objects: + for frame_idx, combined_mask in video_segments.items(): + mask_list.append(combined_mask) + else: + for frame_idx, obj_masks in video_segments.items(): + for out_obj_id, out_mask in obj_masks.items(): + mask_list.append(out_mask) + + if not keep_model_loaded: + try: + model.to(offload_device) + except: + model.model.to(offload_device) + if hasattr(self, 'inference_state') and self.inference_state is not None and hasattr(model, "reset_state"): + model.reset_state(self.inference_state) + self.inference_state = None + mm.soft_empty_cache() + + out_list = [] + for mask in mask_list: + mask_tensor = torch.from_numpy(mask) + mask_tensor = mask_tensor.permute(1, 2, 0) + mask_tensor = mask_tensor[:, :, 0] + out_list.append(mask_tensor) + mask_tensor = torch.stack(out_list, dim=0).cpu().float() + return (mask_tensor,) + +class Sam2VideoSegmentationAddPoints: + @classmethod + def IS_CHANGED(s): # TODO: smarter reset? + return "" + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "sam2_model": ("SAM2MODEL", ), + "coordinates_positive": ("STRING", {"forceInput": True}), + "frame_index": ("INT", {"default": 0}), + "object_index": ("INT", {"default": 0}), + }, + "optional": { + "image": ("IMAGE", ), + "coordinates_negative": ("STRING", {"forceInput": True}), + "prev_inference_state": ("SAM2INFERENCESTATE", ), + }, + } + + RETURN_TYPES = ("SAM2MODEL", "SAM2INFERENCESTATE", ) + RETURN_NAMES =("sam2_model", "inference_state", ) + FUNCTION = "segment" + CATEGORY = "SAM2" + + def segment(self, sam2_model, coordinates_positive, frame_index, object_index, image=None, coordinates_negative=None, prev_inference_state=None): + offload_device = mm.unet_offload_device() + model = sam2_model["model"] + device = sam2_model["device"] + dtype = sam2_model["dtype"] + segmentor = sam2_model["segmentor"] + + + if segmentor != 'video': + raise ValueError("Loaded model is not SAM2Video") + if image is not None: + B, H, W, C = image.shape + model_input_image_size = model.image_size + print("Resizing to model input image size: ", model_input_image_size) + image = common_upscale(image.movedim(-1,1), model_input_image_size, model_input_image_size, "bilinear", "disabled").movedim(1,-1) + + try: + coordinates_positive = json.loads(coordinates_positive.replace("'", '"')) + coordinates_positive = [(coord['x'], coord['y']) for coord in coordinates_positive] + if coordinates_negative is not None: + coordinates_negative = json.loads(coordinates_negative.replace("'", '"')) + coordinates_negative = [(coord['x'], coord['y']) for coord in coordinates_negative] + except: + pass + + positive_point_coords = np.array(coordinates_positive) + positive_point_labels = [1] * len(positive_point_coords) # 1 = positive + positive_point_labels = np.array(positive_point_labels) + print("positive coordinates: ", positive_point_coords) + + if coordinates_negative is not None: + negative_point_coords = np.array(coordinates_negative) + negative_point_labels = [0] * len(negative_point_coords) # 0 = negative + negative_point_labels = np.array(negative_point_labels) + print("negative coordinates: ", negative_point_coords) + + # Combine coordinates and labels + else: + negative_point_coords = np.empty((0, 2)) + negative_point_labels = np.array([]) + # Ensure both positive and negative coordinates are 2D arrays + positive_point_coords = np.atleast_2d(positive_point_coords) + negative_point_coords = np.atleast_2d(negative_point_coords) + + # Ensure both positive and negative labels are 1D arrays + positive_point_labels = np.atleast_1d(positive_point_labels) + negative_point_labels = np.atleast_1d(negative_point_labels) + + combined_coords = np.concatenate((positive_point_coords, negative_point_coords), axis=0) + combined_labels = np.concatenate((positive_point_labels, negative_point_labels), axis=0) + + model.to(device) + + autocast_condition = not mm.is_device_mps(device) + with torch.autocast(mm.get_autocast_device(model.device), dtype=dtype) if autocast_condition else nullcontext(): + if prev_inference_state is None: + print("Initializing inference state") + if hasattr(self, 'inference_state'): + model.reset_state(self.inference_state) + self.inference_state = model.init_state(image.permute(0, 3, 1, 2).contiguous(), H, W, device=device) + else: + print("Using previous inference state") + B = prev_inference_state['num_frames'] + self.inference_state = prev_inference_state['inference_state'] + _, out_obj_ids, out_mask_logits = model.add_new_points( + inference_state=self.inference_state, + frame_idx=frame_index, + obj_id=object_index, + points=combined_coords, + labels=combined_labels, + ) + inference_state = { + "inference_state": self.inference_state, + "num_frames": B, + } + sam2_model = { + 'model': model, + 'dtype': dtype, + 'device': device, + 'segmentor' : segmentor + } + return (sam2_model, inference_state,) + +class Sam2VideoSegmentation: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "sam2_model": ("SAM2MODEL", ), + "inference_state": ("SAM2INFERENCESTATE", ), + "keep_model_loaded": ("BOOLEAN", {"default": True}), + }, + } + + RETURN_TYPES = ("MASK", ) + RETURN_NAMES =("mask", ) + FUNCTION = "segment" + CATEGORY = "SAM2" + + def segment(self, sam2_model, inference_state, keep_model_loaded): + offload_device = mm.unet_offload_device() + model = sam2_model["model"] + device = sam2_model["device"] + dtype = sam2_model["dtype"] + segmentor = sam2_model["segmentor"] + inference_state = inference_state["inference_state"] + B = inference_state["num_frames"] + + if segmentor != 'video': + raise ValueError("Loaded model is not SAM2Video") + + model.to(device) + + autocast_condition = not mm.is_device_mps(device) + with torch.autocast(mm.get_autocast_device(device), dtype=dtype) if autocast_condition else nullcontext(): + + #if hasattr(self, 'inference_state'): + # model.reset_state(self.inference_state) + + pbar = ProgressBar(B) + video_segments = {} + for out_frame_idx, out_obj_ids, out_mask_logits in model.propagate_in_video(inference_state): + print("out_mask_logits",out_mask_logits.shape) + _, _, H, W = out_mask_logits.shape + # Combine masks for all object IDs in the frame + combined_mask = np.zeros((H, W), dtype=np.uint8) + for i, out_obj_id in enumerate(out_obj_ids): + out_mask = (out_mask_logits[i] > 0.0).cpu().numpy() + combined_mask = np.logical_or(combined_mask, out_mask) + video_segments[out_frame_idx] = combined_mask + pbar.update(1) + + mask_list = [] + # Collect the combined masks + for frame_idx, combined_mask in video_segments.items(): + mask_list.append(combined_mask) + print(f"Total masks collected: {len(mask_list)}") + + if not keep_model_loaded: + model.to(offload_device) + + out_list = [] + for mask in mask_list: + mask_tensor = torch.from_numpy(mask) + mask_tensor = mask_tensor.permute(1, 2, 0) + mask_tensor = mask_tensor[:, :, 0] + out_list.append(mask_tensor) + mask_tensor = torch.stack(out_list, dim=0).cpu().float() + return (mask_tensor,) + +class Sam2AutoSegmentation: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "sam2_model": ("SAM2MODEL", ), + "image": ("IMAGE", ), + "points_per_side": ("INT", {"default": 32}), + "points_per_batch": ("INT", {"default": 64}), + "pred_iou_thresh": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}), + "stability_score_thresh": ("FLOAT", {"default": 0.95, "min": 0.0, "max": 1.0, "step": 0.01}), + "stability_score_offset": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "mask_threshold": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "crop_n_layers": ("INT", {"default": 0}), + "box_nms_thresh": ("FLOAT", {"default": 0.7, "min": 0.0, "max": 1.0, "step": 0.01}), + "crop_nms_thresh": ("FLOAT", {"default": 0.7, "min": 0.0, "max": 1.0, "step": 0.01}), + "crop_overlap_ratio": ("FLOAT", {"default": 0.34, "min": 0.0, "max": 1.0, "step": 0.01}), + "crop_n_points_downscale_factor": ("INT", {"default": 1}), + "min_mask_region_area": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "use_m2m": ("BOOLEAN", {"default": False}), + "keep_model_loaded": ("BOOLEAN", {"default": True}), + }, + } + + RETURN_TYPES = ("MASK", "IMAGE", "BBOX",) + RETURN_NAMES =("mask", "segmented_image", "bbox" ,) + FUNCTION = "segment" + CATEGORY = "SAM2" + + def segment(self, image, sam2_model, points_per_side, points_per_batch, pred_iou_thresh, stability_score_thresh, + stability_score_offset, crop_n_layers, box_nms_thresh, crop_n_points_downscale_factor, min_mask_region_area, + use_m2m, mask_threshold, crop_nms_thresh, crop_overlap_ratio, keep_model_loaded): + offload_device = mm.unet_offload_device() + model = sam2_model["model"] + device = sam2_model["device"] + dtype = sam2_model["dtype"] + segmentor = sam2_model["segmentor"] + + if segmentor != 'automaskgenerator': + raise ValueError("Loaded model is not SAM2AutomaticMaskGenerator") + + model.points_per_side=points_per_side + model.points_per_batch=points_per_batch + model.pred_iou_thresh=pred_iou_thresh + model.stability_score_thresh=stability_score_thresh + model.stability_score_offset=stability_score_offset + model.crop_n_layers=crop_n_layers + model.box_nms_thresh=box_nms_thresh + model.crop_n_points_downscale_factor=crop_n_points_downscale_factor + model.crop_nms_thresh=crop_nms_thresh + model.crop_overlap_ratio=crop_overlap_ratio + model.min_mask_region_area=min_mask_region_area + model.use_m2m=use_m2m + model.mask_threshold=mask_threshold + + model.predictor.model.to(device) + + B, H, W, C = image.shape + image_np = (image.contiguous() * 255).byte().numpy() + + out_list = [] + segment_out_list = [] + mask_list=[] + + pbar = ProgressBar(B) + autocast_condition = not mm.is_device_mps(device) + with torch.autocast(mm.get_autocast_device(device), dtype=dtype) if autocast_condition else nullcontext(): + for img_np in image_np: + result_dict = model.generate(img_np) + mask_list = [item['segmentation'] for item in result_dict] + bbox_list = [item['bbox'] for item in result_dict] + + # Generate random colors for each mask + num_masks = len(mask_list) + colors = [tuple(random.choices(range(256), k=3)) for _ in range(num_masks)] + + # Create a blank image to overlay masks + overlay_image = np.zeros((H, W, 3), dtype=np.uint8) + + # Create a combined mask initialized to zeros + combined_mask = np.zeros((H, W), dtype=np.uint8) + + # Iterate through masks and color them + for mask, color in zip(mask_list, colors): + + # Combine masks using logical OR + combined_mask = np.logical_or(combined_mask, mask).astype(np.uint8) + + # Convert mask to numpy array + mask_np = mask.astype(np.uint8) + + # Color the mask + colored_mask = np.zeros_like(overlay_image) + for i in range(3): # Apply color channel-wise + colored_mask[:, :, i] = mask_np * color[i] + + # Blend the colored mask with the overlay image + overlay_image = np.where(colored_mask > 0, colored_mask, overlay_image) + out_list.append(torch.from_numpy(combined_mask)) + segment_out_list.append(overlay_image) + pbar.update(1) + + stacked_array = np.stack(segment_out_list, axis=0) + segment_image_tensor = torch.from_numpy(stacked_array).float() / 255 + + if not keep_model_loaded: + model.predictor.model.to(offload_device) + + mask_tensor = torch.stack(out_list, dim=0) + return (mask_tensor.cpu().float(), segment_image_tensor.cpu().float(), bbox_list) + +#WIP +# class OwlV2Detector: +# @classmethod +# def INPUT_TYPES(s): +# return { +# "required": { +# "image": ("IMAGE", ), +# }, +# } + +# RETURN_TYPES = ("MASK", ) +# RETURN_NAMES =("mask", ) +# FUNCTION = "segment" +# CATEGORY = "SAM2" + +# def segment(self, image): +# from transformers import Owlv2Processor, Owlv2ForObjectDetection +# device = mm.get_torch_device() +# offload_device = mm.unet_offload_device() +# processor = Owlv2Processor.from_pretrained("google/owlv2-base-patch16-ensemble") +# model = Owlv2ForObjectDetection.from_pretrained("google/owlv2-base-patch16-ensemble") + +# url = "http://images.cocodataset.org/val2017/000000039769.jpg" +# image = Image.open(requests.get(url, stream=True).raw) +# texts = [["a photo of a cat", "a photo of a dog"]] +# inputs = processor(text=texts, images=image, return_tensors="pt") +# outputs = model(**inputs) + +# # Target image sizes (height, width) to rescale box predictions [batch_size, 2] +# target_sizes = torch.Tensor([image.size[::-1]]) +# # Convert outputs (bounding boxes and class logits) to Pascal VOC Format (xmin, ymin, xmax, ymax) +# results = processor.post_process_object_detection(outputs=outputs, target_sizes=target_sizes, threshold=0.1) +# i = 0 # Retrieve predictions for the first image for the corresponding text queries +# text = texts[i] +# boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"] +# for box, score, label in zip(boxes, scores, labels): +# box = [round(i, 2) for i in box.tolist()] +# print(f"Detected {text[label]} with confidence {round(score.item(), 3)} at location {box}") + + +# return (mask_tensor,) + +NODE_CLASS_MAPPINGS = { + "DownloadAndLoadSAM2Model": DownloadAndLoadSAM2Model, + "Sam2Segmentation": Sam2Segmentation, + "Florence2toCoordinates": Florence2toCoordinates, + "Sam2AutoSegmentation": Sam2AutoSegmentation, + "Sam2VideoSegmentationAddPoints": Sam2VideoSegmentationAddPoints, + "Sam2VideoSegmentation": Sam2VideoSegmentation +} +NODE_DISPLAY_NAME_MAPPINGS = { + "DownloadAndLoadSAM2Model": "(Down)Load SAM2Model", + "Sam2Segmentation": "Sam2Segmentation", + "Florence2toCoordinates": "Florence2 Coordinates", + "Sam2AutoSegmentation": "Sam2AutoSegmentation", + "Sam2VideoSegmentationAddPoints": "Sam2VideoSegmentationAddPoints", + "Sam2VideoSegmentation": "Sam2VideoSegmentation" +} diff --git a/custom_nodes/comfyui-segment-anything-2/pyproject.toml b/custom_nodes/comfyui-segment-anything-2/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..6bcc06112b91fb19f3ea5607a5b47783afc2a33e --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "comfyui-segment-anything-2" +description = "Nodes to use [a/segment-anything-2](https://github.com/facebookresearch/segment-anything-2) for image or video segmentation." +version = "1.0.2" +license = {file = "LICENSE"} +dependencies = [] + +[project.urls] +Repository = "https://github.com/kijai/ComfyUI-segment-anything-2" +# Used by Comfy Registry https://comfyregistry.org + +[tool.comfy] +PublisherId = "kijai" +DisplayName = "ComfyUI-segment-anything-2" +Icon = "" diff --git a/custom_nodes/comfyui-segment-anything-2/readme.md b/custom_nodes/comfyui-segment-anything-2/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..b13c435a7f8dd9fcd5188d280ca9ace88a67eadd --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/readme.md @@ -0,0 +1,25 @@ +# WORK IN PROGRESS + +PointsEditor is now available for testing in KJNodes: https://github.com/kijai/ComfyUI-KJNodes + +https://github.com/user-attachments/assets/c4a88647-679f-4cf2-ba1f-4fa8c7308c1e + +https://github.com/user-attachments/assets/f15fafe8-72e8-41cc-b246-e947b1efe5ec + +https://github.com/user-attachments/assets/c1efb595-0fb1-4ae7-b4fa-2def08eda0a8 + +For testing only currently. + +Functional, but needs better coordinate selector. + +For now mask postprocessing is disabled due to it needing cuda extension compilation. We can use other nodes for this purpose anyway, so might leave it that way, we'll see. + +Models are automatically downloade from https://huggingface.co/Kijai/sam2-safetensors/tree/main + +to `ComfyUI/models/sam2` + + + +Original repo: + +https://github.com/facebookresearch/segment-anything-2 diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/__init__.py b/custom_nodes/comfyui-segment-anything-2/sam2/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5277f46157403e47fd830fc519144b97ef69d4ae --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/automatic_mask_generator.py b/custom_nodes/comfyui-segment-anything-2/sam2/automatic_mask_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..40208358a58e60b7c50a11a900651130aac832aa --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/automatic_mask_generator.py @@ -0,0 +1,436 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# Adapted from https://github.com/facebookresearch/segment-anything/blob/main/segment_anything/automatic_mask_generator.py +from typing import Any, Dict, List, Optional, Tuple + +import numpy as np +import torch +from torchvision.ops.boxes import batched_nms, box_area # type: ignore + +from ..sam2.modeling.sam2_base import SAM2Base +from ..sam2.sam2_image_predictor import SAM2ImagePredictor +from ..sam2.utils.amg import ( + area_from_rle, + batch_iterator, + batched_mask_to_box, + box_xyxy_to_xywh, + build_all_layer_point_grids, + calculate_stability_score, + coco_encode_rle, + generate_crop_boxes, + is_box_near_crop_edge, + mask_to_rle_pytorch, + MaskData, + remove_small_regions, + rle_to_mask, + uncrop_boxes_xyxy, + uncrop_masks, + uncrop_points, +) + + +class SAM2AutomaticMaskGenerator: + def __init__( + self, + model: SAM2Base, + points_per_side: Optional[int] = 32, + points_per_batch: int = 64, + pred_iou_thresh: float = 0.8, + stability_score_thresh: float = 0.95, + stability_score_offset: float = 1.0, + mask_threshold: float = 0.0, + box_nms_thresh: float = 0.7, + crop_n_layers: int = 0, + crop_nms_thresh: float = 0.7, + crop_overlap_ratio: float = 512 / 1500, + crop_n_points_downscale_factor: int = 1, + point_grids: Optional[List[np.ndarray]] = None, + min_mask_region_area: int = 0, + output_mode: str = "binary_mask", + use_m2m: bool = False, + multimask_output: bool = True, + ) -> None: + """ + Using a SAM 2 model, generates masks for the entire image. + Generates a grid of point prompts over the image, then filters + low quality and duplicate masks. The default settings are chosen + for SAM 2 with a HieraL backbone. + + Arguments: + model (Sam): The SAM 2 model to use for mask prediction. + points_per_side (int or None): The number of points to be sampled + along one side of the image. The total number of points is + points_per_side**2. If None, 'point_grids' must provide explicit + point sampling. + points_per_batch (int): Sets the number of points run simultaneously + by the model. Higher numbers may be faster but use more GPU memory. + pred_iou_thresh (float): A filtering threshold in [0,1], using the + model's predicted mask quality. + stability_score_thresh (float): A filtering threshold in [0,1], using + the stability of the mask under changes to the cutoff used to binarize + the model's mask predictions. + stability_score_offset (float): The amount to shift the cutoff when + calculated the stability score. + mask_threshold (float): Threshold for binarizing the mask logits + box_nms_thresh (float): The box IoU cutoff used by non-maximal + suppression to filter duplicate masks. + crop_n_layers (int): If >0, mask prediction will be run again on + crops of the image. Sets the number of layers to run, where each + layer has 2**i_layer number of image crops. + crop_nms_thresh (float): The box IoU cutoff used by non-maximal + suppression to filter duplicate masks between different crops. + crop_overlap_ratio (float): Sets the degree to which crops overlap. + In the first crop layer, crops will overlap by this fraction of + the image length. Later layers with more crops scale down this overlap. + crop_n_points_downscale_factor (int): The number of points-per-side + sampled in layer n is scaled down by crop_n_points_downscale_factor**n. + point_grids (list(np.ndarray) or None): A list over explicit grids + of points used for sampling, normalized to [0,1]. The nth grid in the + list is used in the nth crop layer. Exclusive with points_per_side. + min_mask_region_area (int): If >0, postprocessing will be applied + to remove disconnected regions and holes in masks with area smaller + than min_mask_region_area. Requires opencv. + output_mode (str): The form masks are returned in. Can be 'binary_mask', + 'uncompressed_rle', or 'coco_rle'. 'coco_rle' requires pycocotools. + For large resolutions, 'binary_mask' may consume large amounts of + memory. + use_m2m (bool): Whether to add a one step refinement using previous mask predictions. + multimask_output (bool): Whether to output multimask at each point of the grid. + """ + + assert (points_per_side is None) != ( + point_grids is None + ), "Exactly one of points_per_side or point_grid must be provided." + if points_per_side is not None: + self.point_grids = build_all_layer_point_grids( + points_per_side, + crop_n_layers, + crop_n_points_downscale_factor, + ) + elif point_grids is not None: + self.point_grids = point_grids + else: + raise ValueError("Can't have both points_per_side and point_grid be None.") + + assert output_mode in [ + "binary_mask", + "uncompressed_rle", + "coco_rle", + ], f"Unknown output_mode {output_mode}." + if output_mode == "coco_rle": + try: + from pycocotools import mask as mask_utils # type: ignore # noqa: F401 + except ImportError as e: + print("Please install pycocotools") + raise e + + self.predictor = SAM2ImagePredictor( + model, + max_hole_area=min_mask_region_area, + max_sprinkle_area=min_mask_region_area, + ) + self.points_per_batch = points_per_batch + self.pred_iou_thresh = pred_iou_thresh + self.stability_score_thresh = stability_score_thresh + self.stability_score_offset = stability_score_offset + self.mask_threshold = mask_threshold + self.box_nms_thresh = box_nms_thresh + self.crop_n_layers = crop_n_layers + self.crop_nms_thresh = crop_nms_thresh + self.crop_overlap_ratio = crop_overlap_ratio + self.crop_n_points_downscale_factor = crop_n_points_downscale_factor + self.min_mask_region_area = min_mask_region_area + self.output_mode = output_mode + self.use_m2m = use_m2m + self.multimask_output = multimask_output + + @torch.no_grad() + def generate(self, image: np.ndarray) -> List[Dict[str, Any]]: + """ + Generates masks for the given image. + + Arguments: + image (np.ndarray): The image to generate masks for, in HWC uint8 format. + + Returns: + list(dict(str, any)): A list over records for masks. Each record is + a dict containing the following keys: + segmentation (dict(str, any) or np.ndarray): The mask. If + output_mode='binary_mask', is an array of shape HW. Otherwise, + is a dictionary containing the RLE. + bbox (list(float)): The box around the mask, in XYWH format. + area (int): The area in pixels of the mask. + predicted_iou (float): The model's own prediction of the mask's + quality. This is filtered by the pred_iou_thresh parameter. + point_coords (list(list(float))): The point coordinates input + to the model to generate this mask. + stability_score (float): A measure of the mask's quality. This + is filtered on using the stability_score_thresh parameter. + crop_box (list(float)): The crop of the image used to generate + the mask, given in XYWH format. + """ + + # Generate masks + mask_data = self._generate_masks(image) + + # Encode masks + if self.output_mode == "coco_rle": + mask_data["segmentations"] = [ + coco_encode_rle(rle) for rle in mask_data["rles"] + ] + elif self.output_mode == "binary_mask": + mask_data["segmentations"] = [rle_to_mask(rle) for rle in mask_data["rles"]] + else: + mask_data["segmentations"] = mask_data["rles"] + + # Write mask records + curr_anns = [] + for idx in range(len(mask_data["segmentations"])): + ann = { + "segmentation": mask_data["segmentations"][idx], + "area": area_from_rle(mask_data["rles"][idx]), + "bbox": box_xyxy_to_xywh(mask_data["boxes"][idx]).tolist(), + "predicted_iou": mask_data["iou_preds"][idx].item(), + "point_coords": [mask_data["points"][idx].tolist()], + "stability_score": mask_data["stability_score"][idx].item(), + "crop_box": box_xyxy_to_xywh(mask_data["crop_boxes"][idx]).tolist(), + } + curr_anns.append(ann) + + return curr_anns + + def _generate_masks(self, image: np.ndarray) -> MaskData: + orig_size = image.shape[:2] + crop_boxes, layer_idxs = generate_crop_boxes( + orig_size, self.crop_n_layers, self.crop_overlap_ratio + ) + + # Iterate over image crops + data = MaskData() + for crop_box, layer_idx in zip(crop_boxes, layer_idxs): + crop_data = self._process_crop(image, crop_box, layer_idx, orig_size) + data.cat(crop_data) + + # Remove duplicate masks between crops + if len(crop_boxes) > 1: + # Prefer masks from smaller crops + scores = 1 / box_area(data["crop_boxes"]) + scores = scores.to(data["boxes"].device) + keep_by_nms = batched_nms( + data["boxes"].float(), + scores, + torch.zeros_like(data["boxes"][:, 0]), # categories + iou_threshold=self.crop_nms_thresh, + ) + data.filter(keep_by_nms) + data.to_numpy() + return data + + def _process_crop( + self, + image: np.ndarray, + crop_box: List[int], + crop_layer_idx: int, + orig_size: Tuple[int, ...], + ) -> MaskData: + # Crop the image and calculate embeddings + x0, y0, x1, y1 = crop_box + cropped_im = image[y0:y1, x0:x1, :] + cropped_im_size = cropped_im.shape[:2] + self.predictor.set_image(cropped_im) + + # Get points for this crop + points_scale = np.array(cropped_im_size)[None, ::-1] + points_for_image = self.point_grids[crop_layer_idx] * points_scale + + # Generate masks for this crop in batches + data = MaskData() + for (points,) in batch_iterator(self.points_per_batch, points_for_image): + batch_data = self._process_batch( + points, cropped_im_size, crop_box, orig_size, normalize=True + ) + data.cat(batch_data) + del batch_data + self.predictor.reset_predictor() + + # Remove duplicates within this crop. + keep_by_nms = batched_nms( + data["boxes"].float(), + data["iou_preds"], + torch.zeros_like(data["boxes"][:, 0]), # categories + iou_threshold=self.box_nms_thresh, + ) + data.filter(keep_by_nms) + + # Return to the original image frame + data["boxes"] = uncrop_boxes_xyxy(data["boxes"], crop_box) + data["points"] = uncrop_points(data["points"], crop_box) + data["crop_boxes"] = torch.tensor([crop_box for _ in range(len(data["rles"]))]) + + return data + + def _process_batch( + self, + points: np.ndarray, + im_size: Tuple[int, ...], + crop_box: List[int], + orig_size: Tuple[int, ...], + normalize=False, + ) -> MaskData: + orig_h, orig_w = orig_size + + # Run model on this batch + points = torch.as_tensor( + points, dtype=torch.float32, device=self.predictor.device + ) + in_points = self.predictor._transforms.transform_coords( + points, normalize=normalize, orig_hw=im_size + ) + in_labels = torch.ones( + in_points.shape[0], dtype=torch.int, device=in_points.device + ) + masks, iou_preds, low_res_masks = self.predictor._predict( + in_points[:, None, :], + in_labels[:, None], + multimask_output=self.multimask_output, + return_logits=True, + ) + + # Serialize predictions and store in MaskData + data = MaskData( + masks=masks.flatten(0, 1), + iou_preds=iou_preds.flatten(0, 1), + points=points.repeat_interleave(masks.shape[1], dim=0), + low_res_masks=low_res_masks.flatten(0, 1), + ) + del masks + + if not self.use_m2m: + # Filter by predicted IoU + if self.pred_iou_thresh > 0.0: + keep_mask = data["iou_preds"] > self.pred_iou_thresh + data.filter(keep_mask) + + # Calculate and filter by stability score + data["stability_score"] = calculate_stability_score( + data["masks"], self.mask_threshold, self.stability_score_offset + ) + if self.stability_score_thresh > 0.0: + keep_mask = data["stability_score"] >= self.stability_score_thresh + data.filter(keep_mask) + else: + # One step refinement using previous mask predictions + in_points = self.predictor._transforms.transform_coords( + data["points"], normalize=normalize, orig_hw=im_size + ) + labels = torch.ones( + in_points.shape[0], dtype=torch.int, device=in_points.device + ) + masks, ious = self.refine_with_m2m( + in_points, labels, data["low_res_masks"], self.points_per_batch + ) + data["masks"] = masks.squeeze(1) + data["iou_preds"] = ious.squeeze(1) + + if self.pred_iou_thresh > 0.0: + keep_mask = data["iou_preds"] > self.pred_iou_thresh + data.filter(keep_mask) + + data["stability_score"] = calculate_stability_score( + data["masks"], self.mask_threshold, self.stability_score_offset + ) + if self.stability_score_thresh > 0.0: + keep_mask = data["stability_score"] >= self.stability_score_thresh + data.filter(keep_mask) + + # Threshold masks and calculate boxes + data["masks"] = data["masks"] > self.mask_threshold + data["boxes"] = batched_mask_to_box(data["masks"]) + + # Filter boxes that touch crop boundaries + keep_mask = ~is_box_near_crop_edge( + data["boxes"], crop_box, [0, 0, orig_w, orig_h] + ) + if not torch.all(keep_mask): + data.filter(keep_mask) + + # Compress to RLE + data["masks"] = uncrop_masks(data["masks"], crop_box, orig_h, orig_w) + data["rles"] = mask_to_rle_pytorch(data["masks"]) + del data["masks"] + + return data + + @staticmethod + def postprocess_small_regions( + mask_data: MaskData, min_area: int, nms_thresh: float + ) -> MaskData: + """ + Removes small disconnected regions and holes in masks, then reruns + box NMS to remove any new duplicates. + + Edits mask_data in place. + + Requires open-cv as a dependency. + """ + if len(mask_data["rles"]) == 0: + return mask_data + + # Filter small disconnected regions and holes + new_masks = [] + scores = [] + for rle in mask_data["rles"]: + mask = rle_to_mask(rle) + + mask, changed = remove_small_regions(mask, min_area, mode="holes") + unchanged = not changed + mask, changed = remove_small_regions(mask, min_area, mode="islands") + unchanged = unchanged and not changed + + new_masks.append(torch.as_tensor(mask).unsqueeze(0)) + # Give score=0 to changed masks and score=1 to unchanged masks + # so NMS will prefer ones that didn't need postprocessing + scores.append(float(unchanged)) + + # Recalculate boxes and remove any new duplicates + masks = torch.cat(new_masks, dim=0) + boxes = batched_mask_to_box(masks) + keep_by_nms = batched_nms( + boxes.float(), + torch.as_tensor(scores), + torch.zeros_like(boxes[:, 0]), # categories + iou_threshold=nms_thresh, + ) + + # Only recalculate RLEs for masks that have changed + for i_mask in keep_by_nms: + if scores[i_mask] == 0.0: + mask_torch = masks[i_mask].unsqueeze(0) + mask_data["rles"][i_mask] = mask_to_rle_pytorch(mask_torch)[0] + mask_data["boxes"][i_mask] = boxes[i_mask] # update res directly + mask_data.filter(keep_by_nms) + + return mask_data + + def refine_with_m2m(self, points, point_labels, low_res_masks, points_per_batch): + new_masks = [] + new_iou_preds = [] + + for cur_points, cur_point_labels, low_res_mask in batch_iterator( + points_per_batch, points, point_labels, low_res_masks + ): + best_masks, best_iou_preds, _ = self.predictor._predict( + cur_points[:, None, :], + cur_point_labels[:, None], + mask_input=low_res_mask[:, None, :], + multimask_output=False, + return_logits=True, + ) + new_masks.append(best_masks) + new_iou_preds.append(best_iou_preds) + masks = torch.cat(new_masks, dim=0) + return masks, torch.cat(new_iou_preds, dim=0) diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/__init__.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5277f46157403e47fd830fc519144b97ef69d4ae --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/__init__.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5277f46157403e47fd830fc519144b97ef69d4ae --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/hieradet.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/hieradet.py new file mode 100644 index 0000000000000000000000000000000000000000..90033097be60b00c4c5327ae751f9d7d4d0de77b --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/hieradet.py @@ -0,0 +1,316 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from functools import partial +from typing import List, Tuple, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +#from iopath.common.file_io import g_pathmgr + +from ....sam2.modeling.backbones.utils import ( + PatchEmbed, + window_partition, + window_unpartition, +) + +from ....sam2.modeling.sam2_utils import DropPath, MLP + + +def do_pool(x: torch.Tensor, pool: nn.Module, norm: nn.Module = None) -> torch.Tensor: + if pool is None: + return x + # (B, H, W, C) -> (B, C, H, W) + x = x.permute(0, 3, 1, 2) + x = pool(x) + # (B, C, H', W') -> (B, H', W', C) + x = x.permute(0, 2, 3, 1) + if norm: + x = norm(x) + + return x + + +class MultiScaleAttention(nn.Module): + def __init__( + self, + dim: int, + dim_out: int, + num_heads: int, + q_pool: nn.Module = None, + ): + super().__init__() + + self.dim = dim + self.dim_out = dim_out + self.num_heads = num_heads + self.q_pool = q_pool + self.qkv = nn.Linear(dim, dim_out * 3) + self.proj = nn.Linear(dim_out, dim_out) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + B, H, W, _ = x.shape + # qkv with shape (B, H * W, 3, nHead, C) + qkv = self.qkv(x).reshape(B, H * W, 3, self.num_heads, -1) + # q, k, v with shape (B, H * W, nheads, C) + q, k, v = torch.unbind(qkv, 2) + + # Q pooling (for downsample at stage changes) + if self.q_pool: + q = do_pool(q.reshape(B, H, W, -1), self.q_pool) + H, W = q.shape[1:3] # downsampled shape + q = q.reshape(B, H * W, self.num_heads, -1) + + # Torch's SDPA expects [B, nheads, H*W, C] so we transpose + x = F.scaled_dot_product_attention( + q.transpose(1, 2), + k.transpose(1, 2), + v.transpose(1, 2), + ) + # Transpose back + x = x.transpose(1, 2) + x = x.reshape(B, H, W, -1) + + x = self.proj(x) + + return x + + +class MultiScaleBlock(nn.Module): + def __init__( + self, + dim: int, + dim_out: int, + num_heads: int, + mlp_ratio: float = 4.0, + drop_path: float = 0.0, + norm_layer: Union[nn.Module, str] = "LayerNorm", + q_stride: Tuple[int, int] = None, + act_layer: nn.Module = nn.GELU, + window_size: int = 0, + ): + super().__init__() + + if isinstance(norm_layer, str): + norm_layer = partial(getattr(nn, norm_layer), eps=1e-6) + + self.dim = dim + self.dim_out = dim_out + self.norm1 = norm_layer(dim) + + self.window_size = window_size + + self.pool, self.q_stride = None, q_stride + if self.q_stride: + self.pool = nn.MaxPool2d( + kernel_size=q_stride, stride=q_stride, ceil_mode=False + ) + + self.attn = MultiScaleAttention( + dim, + dim_out, + num_heads=num_heads, + q_pool=self.pool, + ) + self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + self.norm2 = norm_layer(dim_out) + self.mlp = MLP( + dim_out, + int(dim_out * mlp_ratio), + dim_out, + num_layers=2, + activation=act_layer, + ) + + if dim != dim_out: + self.proj = nn.Linear(dim, dim_out) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + shortcut = x # B, H, W, C + x = self.norm1(x) + + # Skip connection + if self.dim != self.dim_out: + shortcut = do_pool(self.proj(x), self.pool) + + # Window partition + window_size = self.window_size + if window_size > 0: + H, W = x.shape[1], x.shape[2] + x, pad_hw = window_partition(x, window_size) + + # Window Attention + Q Pooling (if stage change) + x = self.attn(x) + if self.q_stride: + # Shapes have changed due to Q pooling + window_size = self.window_size // self.q_stride[0] + H, W = shortcut.shape[1:3] + + pad_h = (window_size - H % window_size) % window_size + pad_w = (window_size - W % window_size) % window_size + pad_hw = (H + pad_h, W + pad_w) + + # Reverse window partition + if self.window_size > 0: + x = window_unpartition(x, window_size, pad_hw, (H, W)) + + x = shortcut + self.drop_path(x) + # MLP + x = x + self.drop_path(self.mlp(self.norm2(x))) + return x + + +class Hiera(nn.Module): + """ + Reference: https://arxiv.org/abs/2306.00989 + """ + + def __init__( + self, + embed_dim: int = 96, # initial embed dim + num_heads: int = 1, # initial number of heads + drop_path_rate: float = 0.0, # stochastic depth + q_pool: int = 3, # number of q_pool stages + q_stride: Tuple[int, int] = (2, 2), # downsample stride bet. stages + stages: Tuple[int, ...] = (2, 3, 16, 3), # blocks per stage + dim_mul: float = 2.0, # dim_mul factor at stage shift + head_mul: float = 2.0, # head_mul factor at stage shift + window_pos_embed_bkg_spatial_size: Tuple[int, int] = (14, 14), + # window size per stage, when not using global att. + window_spec: Tuple[int, ...] = ( + 8, + 4, + 14, + 7, + ), + # global attn in these blocks + global_att_blocks: Tuple[int, ...] = ( + 12, + 16, + 20, + ), + weights_path=None, + return_interm_layers=True, # return feats from every stage + ): + super().__init__() + + assert len(stages) == len(window_spec) + self.window_spec = window_spec + + depth = sum(stages) + self.q_stride = q_stride + self.stage_ends = [sum(stages[:i]) - 1 for i in range(1, len(stages) + 1)] + assert 0 <= q_pool <= len(self.stage_ends[:-1]) + self.q_pool_blocks = [x + 1 for x in self.stage_ends[:-1]][:q_pool] + self.return_interm_layers = return_interm_layers + + self.patch_embed = PatchEmbed( + embed_dim=embed_dim, + ) + # Which blocks have global att? + self.global_att_blocks = global_att_blocks + + # Windowed positional embedding (https://arxiv.org/abs/2311.05613) + self.window_pos_embed_bkg_spatial_size = window_pos_embed_bkg_spatial_size + self.pos_embed = nn.Parameter( + torch.zeros(1, embed_dim, *self.window_pos_embed_bkg_spatial_size) + ) + self.pos_embed_window = nn.Parameter( + torch.zeros(1, embed_dim, self.window_spec[0], self.window_spec[0]) + ) + + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, depth) + ] # stochastic depth decay rule + + cur_stage = 1 + self.blocks = nn.ModuleList() + + for i in range(depth): + dim_out = embed_dim + # lags by a block, so first block of + # next stage uses an initial window size + # of previous stage and final window size of current stage + window_size = self.window_spec[cur_stage - 1] + + if self.global_att_blocks is not None: + window_size = 0 if i in self.global_att_blocks else window_size + + if i - 1 in self.stage_ends: + dim_out = int(embed_dim * dim_mul) + num_heads = int(num_heads * head_mul) + cur_stage += 1 + + block = MultiScaleBlock( + dim=embed_dim, + dim_out=dim_out, + num_heads=num_heads, + drop_path=dpr[i], + q_stride=self.q_stride if i in self.q_pool_blocks else None, + window_size=window_size, + ) + + embed_dim = dim_out + self.blocks.append(block) + + self.channel_list = ( + [self.blocks[i].dim_out for i in self.stage_ends[::-1]] + if return_interm_layers + else [self.blocks[-1].dim_out] + ) + + # if weights_path is not None: + # with g_pathmgr.open(weights_path, "rb") as f: + # chkpt = torch.load(f, map_location="cpu") + # logging.info("loading Hiera", self.load_state_dict(chkpt, strict=False)) + + def _get_pos_embed(self, hw: Tuple[int, int]) -> torch.Tensor: + h, w = hw + window_embed = self.pos_embed_window + pos_embed = F.interpolate(self.pos_embed, size=(h, w), mode="bicubic") + pos_embed = pos_embed + window_embed.tile( + [x // y for x, y in zip(pos_embed.shape, window_embed.shape)] + ) + pos_embed = pos_embed.permute(0, 2, 3, 1) + return pos_embed + + def forward(self, x: torch.Tensor) -> List[torch.Tensor]: + x = self.patch_embed(x) + # x: (B, H, W, C) + + # Add pos embed + x = x + self._get_pos_embed(x.shape[1:3]) + + outputs = [] + for i, blk in enumerate(self.blocks): + x = blk(x) + if (i == self.stage_ends[-1]) or ( + i in self.stage_ends and self.return_interm_layers + ): + feats = x.permute(0, 3, 1, 2) + outputs.append(feats) + + return outputs + + def get_layer_id(self, layer_name): + # https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py#L33 + num_layers = self.get_num_layers() + + if layer_name.find("rel_pos") != -1: + return num_layers + 1 + elif layer_name.find("pos_embed") != -1: + return 0 + elif layer_name.find("patch_embed") != -1: + return 0 + elif layer_name.find("blocks") != -1: + return int(layer_name.split("blocks")[1].split(".")[1]) + 1 + else: + return num_layers + 1 + + def get_num_layers(self) -> int: + return len(self.blocks) diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/image_encoder.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/image_encoder.py new file mode 100644 index 0000000000000000000000000000000000000000..37e9266bc98596e97ca303118c910ed24f6cee2c --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/image_encoder.py @@ -0,0 +1,134 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from typing import List, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class ImageEncoder(nn.Module): + def __init__( + self, + trunk: nn.Module, + neck: nn.Module, + scalp: int = 0, + ): + super().__init__() + self.trunk = trunk + self.neck = neck + self.scalp = scalp + assert ( + self.trunk.channel_list == self.neck.backbone_channel_list + ), f"Channel dims of trunk and neck do not match. Trunk: {self.trunk.channel_list}, neck: {self.neck.backbone_channel_list}" + + def forward(self, sample: torch.Tensor): + # Forward through backbone + features, pos = self.neck(self.trunk(sample)) + if self.scalp > 0: + # Discard the lowest resolution features + features, pos = features[: -self.scalp], pos[: -self.scalp] + + src = features[-1] + output = { + "vision_features": src, + "vision_pos_enc": pos, + "backbone_fpn": features, + } + return output + + +class FpnNeck(nn.Module): + """ + A modified variant of Feature Pyramid Network (FPN) neck + (we remove output conv and also do bicubic interpolation similar to ViT + pos embed interpolation) + """ + + def __init__( + self, + position_encoding: nn.Module, + d_model: int, + backbone_channel_list: List[int], + kernel_size: int = 1, + stride: int = 1, + padding: int = 0, + fpn_interp_model: str = "bilinear", + fuse_type: str = "sum", + fpn_top_down_levels: Optional[List[int]] = None, + ): + """Initialize the neck + :param trunk: the backbone + :param position_encoding: the positional encoding to use + :param d_model: the dimension of the model + :param neck_norm: the normalization to use + """ + super().__init__() + self.position_encoding = position_encoding + self.convs = nn.ModuleList() + self.backbone_channel_list = backbone_channel_list + self.d_model = d_model + for dim in backbone_channel_list: + current = nn.Sequential() + current.add_module( + "conv", + nn.Conv2d( + in_channels=dim, + out_channels=d_model, + kernel_size=kernel_size, + stride=stride, + padding=padding, + ), + ) + + self.convs.append(current) + self.fpn_interp_model = fpn_interp_model + assert fuse_type in ["sum", "avg"] + self.fuse_type = fuse_type + + # levels to have top-down features in its outputs + # e.g. if fpn_top_down_levels is [2, 3], then only outputs of level 2 and 3 + # have top-down propagation, while outputs of level 0 and level 1 have only + # lateral features from the same backbone level. + if fpn_top_down_levels is None: + # default is to have top-down features on all levels + fpn_top_down_levels = range(len(self.convs)) + self.fpn_top_down_levels = list(fpn_top_down_levels) + + def forward(self, xs: List[torch.Tensor]): + + out = [None] * len(self.convs) + pos = [None] * len(self.convs) + assert len(xs) == len(self.convs) + # fpn forward pass + # see https://github.com/facebookresearch/detectron2/blob/main/detectron2/modeling/backbone/fpn.py + prev_features = None + # forward in top-down order (from low to high resolution) + n = len(self.convs) - 1 + for i in range(n, -1, -1): + x = xs[i] + lateral_features = self.convs[n - i](x) + if i in self.fpn_top_down_levels and prev_features is not None: + top_down_features = F.interpolate( + prev_features.to(dtype=torch.float32), + scale_factor=2.0, + mode=self.fpn_interp_model, + align_corners=( + None if self.fpn_interp_model == "nearest" else False + ), + antialias=False, + ) + prev_features = lateral_features + top_down_features + if self.fuse_type == "avg": + prev_features /= 2 + else: + prev_features = lateral_features + x_out = prev_features + out[i] = x_out + pos[i] = self.position_encoding(x_out).to(x_out.dtype) + + return out, pos diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/utils.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..32d55c7545f064de133a5ff0200ba1ece9b504b7 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/backbones/utils.py @@ -0,0 +1,95 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +"""Some utilities for backbones, in particular for windowing""" + +from typing import Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def window_partition(x, window_size): + """ + Partition into non-overlapping windows with padding if needed. + Args: + x (tensor): input tokens with [B, H, W, C]. + window_size (int): window size. + Returns: + windows: windows after partition with [B * num_windows, window_size, window_size, C]. + (Hp, Wp): padded height and width before partition + """ + B, H, W, C = x.shape + + pad_h = (window_size - H % window_size) % window_size + pad_w = (window_size - W % window_size) % window_size + if pad_h > 0 or pad_w > 0: + x = F.pad(x, (0, 0, 0, pad_w, 0, pad_h)) + Hp, Wp = H + pad_h, W + pad_w + + x = x.view(B, Hp // window_size, window_size, Wp // window_size, window_size, C) + windows = ( + x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C) + ) + return windows, (Hp, Wp) + + +def window_unpartition(windows, window_size, pad_hw, hw): + """ + Window unpartition into original sequences and removing padding. + Args: + x (tensor): input tokens with [B * num_windows, window_size, window_size, C]. + window_size (int): window size. + pad_hw (Tuple): padded height and width (Hp, Wp). + hw (Tuple): original height and width (H, W) before padding. + Returns: + x: unpartitioned sequences with [B, H, W, C]. + """ + Hp, Wp = pad_hw + H, W = hw + B = windows.shape[0] // (Hp * Wp // window_size // window_size) + x = windows.view( + B, Hp // window_size, Wp // window_size, window_size, window_size, -1 + ) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, Hp, Wp, -1) + + if Hp > H or Wp > W: + x = x[:, :H, :W, :].contiguous() + return x + + +class PatchEmbed(nn.Module): + """ + Image to Patch Embedding. + """ + + def __init__( + self, + kernel_size: Tuple[int, ...] = (7, 7), + stride: Tuple[int, ...] = (4, 4), + padding: Tuple[int, ...] = (3, 3), + in_chans: int = 3, + embed_dim: int = 768, + ): + """ + Args: + kernel_size (Tuple): kernel size of the projection layer. + stride (Tuple): stride of the projection layer. + padding (Tuple): padding size of the projection layer. + in_chans (int): Number of input image channels. + embed_dim (int): embed_dim (int): Patch embedding dimension. + """ + super().__init__() + self.proj = nn.Conv2d( + in_chans, embed_dim, kernel_size=kernel_size, stride=stride, padding=padding + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.proj(x) + # B C H W -> B H W C + x = x.permute(0, 2, 3, 1) + return x diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/memory_attention.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/memory_attention.py new file mode 100644 index 0000000000000000000000000000000000000000..07788e5d58daa0d83cac08848a0f662a45e4934d --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/memory_attention.py @@ -0,0 +1,169 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Optional + +import torch +from torch import nn, Tensor + +from ...sam2.modeling.sam.transformer import RoPEAttention + +from ...sam2.modeling.sam2_utils import get_activation_fn, get_clones + + +class MemoryAttentionLayer(nn.Module): + + def __init__( + self, + activation: str, + cross_attention: nn.Module, + d_model: int, + dim_feedforward: int, + dropout: float, + pos_enc_at_attn: bool, + pos_enc_at_cross_attn_keys: bool, + pos_enc_at_cross_attn_queries: bool, + self_attention: nn.Module, + ): + super().__init__() + self.d_model = d_model + self.dim_feedforward = dim_feedforward + self.dropout_value = dropout + self.self_attn = self_attention + self.cross_attn_image = cross_attention + + # Implementation of Feedforward model + self.linear1 = nn.Linear(d_model, dim_feedforward) + self.dropout = nn.Dropout(dropout) + self.linear2 = nn.Linear(dim_feedforward, d_model) + + self.norm1 = nn.LayerNorm(d_model) + self.norm2 = nn.LayerNorm(d_model) + self.norm3 = nn.LayerNorm(d_model) + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(dropout) + self.dropout3 = nn.Dropout(dropout) + + self.activation_str = activation + self.activation = get_activation_fn(activation) + + # Where to add pos enc + self.pos_enc_at_attn = pos_enc_at_attn + self.pos_enc_at_cross_attn_queries = pos_enc_at_cross_attn_queries + self.pos_enc_at_cross_attn_keys = pos_enc_at_cross_attn_keys + + def _forward_sa(self, tgt, query_pos): + # Self-Attention + tgt2 = self.norm1(tgt) + q = k = tgt2 + query_pos if self.pos_enc_at_attn else tgt2 + tgt2 = self.self_attn(q, k, v=tgt2) + tgt = tgt + self.dropout1(tgt2) + return tgt + + def _forward_ca(self, tgt, memory, query_pos, pos, num_k_exclude_rope=0): + kwds = {} + if num_k_exclude_rope > 0: + assert isinstance(self.cross_attn_image, RoPEAttention) + kwds = {"num_k_exclude_rope": num_k_exclude_rope} + + # Cross-Attention + tgt2 = self.norm2(tgt) + tgt2 = self.cross_attn_image( + q=tgt2 + query_pos if self.pos_enc_at_cross_attn_queries else tgt2, + k=memory + pos if self.pos_enc_at_cross_attn_keys else memory, + v=memory, + **kwds, + ) + tgt = tgt + self.dropout2(tgt2) + return tgt + + def forward( + self, + tgt, + memory, + pos: Optional[Tensor] = None, + query_pos: Optional[Tensor] = None, + num_k_exclude_rope: int = 0, + ) -> torch.Tensor: + + # Self-Attn, Cross-Attn + tgt = self._forward_sa(tgt, query_pos) + tgt = self._forward_ca(tgt, memory, query_pos, pos, num_k_exclude_rope) + # MLP + tgt2 = self.norm3(tgt) + tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt2)))) + tgt = tgt + self.dropout3(tgt2) + return tgt + + +class MemoryAttention(nn.Module): + def __init__( + self, + d_model: int, + pos_enc_at_input: bool, + layer: nn.Module, + num_layers: int, + batch_first: bool = True, # Do layers expect batch first input? + ): + super().__init__() + self.d_model = d_model + self.layers = get_clones(layer, num_layers) + self.num_layers = num_layers + self.norm = nn.LayerNorm(d_model) + self.pos_enc_at_input = pos_enc_at_input + self.batch_first = batch_first + + def forward( + self, + curr: torch.Tensor, # self-attention inputs + memory: torch.Tensor, # cross-attention inputs + curr_pos: Optional[Tensor] = None, # pos_enc for self-attention inputs + memory_pos: Optional[Tensor] = None, # pos_enc for cross-attention inputs + num_obj_ptr_tokens: int = 0, # number of object pointer *tokens* + ): + if isinstance(curr, list): + assert isinstance(curr_pos, list) + assert len(curr) == len(curr_pos) == 1 + curr, curr_pos = ( + curr[0], + curr_pos[0], + ) + + assert ( + curr.shape[1] == memory.shape[1] + ), "Batch size must be the same for curr and memory" + + output = curr + if self.pos_enc_at_input and curr_pos is not None: + output = output + 0.1 * curr_pos + + if self.batch_first: + # Convert to batch first + output = output.transpose(0, 1) + curr_pos = curr_pos.transpose(0, 1) + memory = memory.transpose(0, 1) + memory_pos = memory_pos.transpose(0, 1) + + for layer in self.layers: + kwds = {} + if isinstance(layer.cross_attn_image, RoPEAttention): + kwds = {"num_k_exclude_rope": num_obj_ptr_tokens} + + output = layer( + tgt=output, + memory=memory, + pos=memory_pos, + query_pos=curr_pos, + **kwds, + ) + normed_output = self.norm(output) + + if self.batch_first: + # Convert back to seq first + normed_output = normed_output.transpose(0, 1) + curr_pos = curr_pos.transpose(0, 1) + + return normed_output diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/memory_encoder.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/memory_encoder.py new file mode 100644 index 0000000000000000000000000000000000000000..1fbf1c8c8b25c6f7b29714d9fa9ed5d2937b027b --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/memory_encoder.py @@ -0,0 +1,181 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ...sam2.modeling.sam2_utils import DropPath, get_clones, LayerNorm2d + + +class MaskDownSampler(nn.Module): + """ + Progressively downsample a mask by total_stride, each time by stride. + Note that LayerNorm is applied per *token*, like in ViT. + + With each downsample (by a factor stride**2), channel capacity increases by the same factor. + In the end, we linearly project to embed_dim channels. + """ + + def __init__( + self, + embed_dim=256, + kernel_size=4, + stride=4, + padding=0, + total_stride=16, + activation=nn.GELU, + ): + super().__init__() + num_layers = int(math.log2(total_stride) // math.log2(stride)) + assert stride**num_layers == total_stride + self.encoder = nn.Sequential() + mask_in_chans, mask_out_chans = 1, 1 + for _ in range(num_layers): + mask_out_chans = mask_in_chans * (stride**2) + self.encoder.append( + nn.Conv2d( + mask_in_chans, + mask_out_chans, + kernel_size=kernel_size, + stride=stride, + padding=padding, + ) + ) + self.encoder.append(LayerNorm2d(mask_out_chans)) + self.encoder.append(activation()) + mask_in_chans = mask_out_chans + + self.encoder.append(nn.Conv2d(mask_out_chans, embed_dim, kernel_size=1)) + + def forward(self, x): + return self.encoder(x) + + +# Lightly adapted from ConvNext (https://github.com/facebookresearch/ConvNeXt) +class CXBlock(nn.Module): + r"""ConvNeXt Block. There are two equivalent implementations: + (1) DwConv -> LayerNorm (channels_first) -> 1x1 Conv -> GELU -> 1x1 Conv; all in (N, C, H, W) + (2) DwConv -> Permute to (N, H, W, C); LayerNorm (channels_last) -> Linear -> GELU -> Linear; Permute back + We use (2) as we find it slightly faster in PyTorch + + Args: + dim (int): Number of input channels. + drop_path (float): Stochastic depth rate. Default: 0.0 + layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6. + """ + + def __init__( + self, + dim, + kernel_size=7, + padding=3, + drop_path=0.0, + layer_scale_init_value=1e-6, + use_dwconv=True, + ): + super().__init__() + self.dwconv = nn.Conv2d( + dim, + dim, + kernel_size=kernel_size, + padding=padding, + groups=dim if use_dwconv else 1, + ) # depthwise conv + self.norm = LayerNorm2d(dim, eps=1e-6) + self.pwconv1 = nn.Linear( + dim, 4 * dim + ) # pointwise/1x1 convs, implemented with linear layers + self.act = nn.GELU() + self.pwconv2 = nn.Linear(4 * dim, dim) + self.gamma = ( + nn.Parameter(layer_scale_init_value * torch.ones((dim)), requires_grad=True) + if layer_scale_init_value > 0 + else None + ) + self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + def forward(self, x): + input = x + x = self.dwconv(x) + x = self.norm(x) + x = x.permute(0, 2, 3, 1) # (N, C, H, W) -> (N, H, W, C) + x = self.pwconv1(x) + x = self.act(x) + x = self.pwconv2(x) + if self.gamma is not None: + x = self.gamma * x + x = x.permute(0, 3, 1, 2) # (N, H, W, C) -> (N, C, H, W) + + x = input + self.drop_path(x) + return x + + +class Fuser(nn.Module): + def __init__(self, layer, num_layers, dim=None, input_projection=False): + super().__init__() + self.proj = nn.Identity() + self.layers = get_clones(layer, num_layers) + + if input_projection: + assert dim is not None + self.proj = nn.Conv2d(dim, dim, kernel_size=1) + + def forward(self, x): + # normally x: (N, C, H, W) + x = self.proj(x) + for layer in self.layers: + x = layer(x) + return x + + +class MemoryEncoder(nn.Module): + def __init__( + self, + out_dim, + mask_downsampler, + fuser, + position_encoding, + in_dim=256, # in_dim of pix_feats + ): + super().__init__() + + self.mask_downsampler = mask_downsampler + + self.pix_feat_proj = nn.Conv2d(in_dim, in_dim, kernel_size=1) + self.fuser = fuser + self.position_encoding = position_encoding + self.out_proj = nn.Identity() + if out_dim != in_dim: + self.out_proj = nn.Conv2d(in_dim, out_dim, kernel_size=1) + + def forward( + self, + pix_feat: torch.Tensor, + masks: torch.Tensor, + skip_mask_sigmoid: bool = False, + ) -> Tuple[torch.Tensor, torch.Tensor]: + ## Process masks + # sigmoid, so that less domain shift from gt masks which are bool + if not skip_mask_sigmoid: + masks = F.sigmoid(masks) + masks = self.mask_downsampler(masks) + + ## Fuse pix_feats and downsampled masks + # in case the visual features are on CPU, cast them to CUDA + pix_feat = pix_feat.to(masks.device) + + x = self.pix_feat_proj(pix_feat) + x = x + masks + x = self.fuser(x) + x = self.out_proj(x) + + pos = self.position_encoding(x).to(x.dtype) + + return {"vision_features": x, "vision_pos_enc": [pos]} diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/position_encoding.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/position_encoding.py new file mode 100644 index 0000000000000000000000000000000000000000..fafd04209205bb0c4e0dc73183358fdff8a73059 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/position_encoding.py @@ -0,0 +1,220 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Any, Optional, Tuple + +import numpy as np + +import torch +from torch import nn + + +class PositionEmbeddingSine(nn.Module): + """ + This is a more standard version of the position embedding, very similar to the one + used by the Attention is all you need paper, generalized to work on images. + """ + + def __init__( + self, + num_pos_feats, + temperature: int = 10000, + normalize: bool = True, + scale: Optional[float] = None, + ): + super().__init__() + assert num_pos_feats % 2 == 0, "Expecting even model width" + self.num_pos_feats = num_pos_feats // 2 + self.temperature = temperature + self.normalize = normalize + if scale is not None and normalize is False: + raise ValueError("normalize should be True if scale is passed") + if scale is None: + scale = 2 * math.pi + self.scale = scale + + self.cache = {} + + def _encode_xy(self, x, y): + # The positions are expected to be normalized + assert len(x) == len(y) and x.ndim == y.ndim == 1 + x_embed = x * self.scale + y_embed = y * self.scale + + dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) + dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) + + pos_x = x_embed[:, None] / dim_t + pos_y = y_embed[:, None] / dim_t + pos_x = torch.stack( + (pos_x[:, 0::2].sin(), pos_x[:, 1::2].cos()), dim=2 + ).flatten(1) + pos_y = torch.stack( + (pos_y[:, 0::2].sin(), pos_y[:, 1::2].cos()), dim=2 + ).flatten(1) + return pos_x, pos_y + + @torch.no_grad() + def encode_boxes(self, x, y, w, h): + pos_x, pos_y = self._encode_xy(x, y) + pos = torch.cat((pos_y, pos_x, h[:, None], w[:, None]), dim=1) + return pos + + encode = encode_boxes # Backwards compatibility + + @torch.no_grad() + def encode_points(self, x, y, labels): + (bx, nx), (by, ny), (bl, nl) = x.shape, y.shape, labels.shape + assert bx == by and nx == ny and bx == bl and nx == nl + pos_x, pos_y = self._encode_xy(x.flatten(), y.flatten()) + pos_x, pos_y = pos_x.reshape(bx, nx, -1), pos_y.reshape(by, ny, -1) + pos = torch.cat((pos_y, pos_x, labels[:, :, None]), dim=2) + return pos + + @torch.no_grad() + def forward(self, x: torch.Tensor): + cache_key = (x.shape[-2], x.shape[-1]) + if cache_key in self.cache: + return self.cache[cache_key][None].repeat(x.shape[0], 1, 1, 1) + y_embed = ( + torch.arange(1, x.shape[-2] + 1, dtype=torch.float32, device=x.device) + .view(1, -1, 1) + .repeat(x.shape[0], 1, x.shape[-1]) + ) + x_embed = ( + torch.arange(1, x.shape[-1] + 1, dtype=torch.float32, device=x.device) + .view(1, 1, -1) + .repeat(x.shape[0], x.shape[-2], 1) + ) + + if self.normalize: + eps = 1e-6 + y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale + x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale + + dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) + dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) + + pos_x = x_embed[:, :, :, None] / dim_t + pos_y = y_embed[:, :, :, None] / dim_t + pos_x = torch.stack( + (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4 + ).flatten(3) + pos_y = torch.stack( + (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4 + ).flatten(3) + pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) + self.cache[cache_key] = pos[0] + return pos + + +class PositionEmbeddingRandom(nn.Module): + """ + Positional encoding using random spatial frequencies. + """ + + def __init__(self, num_pos_feats: int = 64, scale: Optional[float] = None) -> None: + super().__init__() + if scale is None or scale <= 0.0: + scale = 1.0 + self.register_buffer( + "positional_encoding_gaussian_matrix", + scale * torch.randn((2, num_pos_feats)), + ) + + def _pe_encoding(self, coords: torch.Tensor) -> torch.Tensor: + """Positionally encode points that are normalized to [0,1].""" + # assuming coords are in [0, 1]^2 square and have d_1 x ... x d_n x 2 shape + coords = 2 * coords - 1 + coords = coords @ self.positional_encoding_gaussian_matrix + coords = 2 * np.pi * coords + # outputs d_1 x ... x d_n x C shape + return torch.cat([torch.sin(coords), torch.cos(coords)], dim=-1) + + def forward(self, size: Tuple[int, int]) -> torch.Tensor: + """Generate positional encoding for a grid of the specified size.""" + h, w = size + device: Any = self.positional_encoding_gaussian_matrix.device + grid = torch.ones((h, w), device=device, dtype=torch.float32) + y_embed = grid.cumsum(dim=0) - 0.5 + x_embed = grid.cumsum(dim=1) - 0.5 + y_embed = y_embed / h + x_embed = x_embed / w + + pe = self._pe_encoding(torch.stack([x_embed, y_embed], dim=-1)) + return pe.permute(2, 0, 1) # C x H x W + + def forward_with_coords( + self, coords_input: torch.Tensor, image_size: Tuple[int, int] + ) -> torch.Tensor: + """Positionally encode points that are not normalized to [0,1].""" + coords = coords_input.clone() + coords[:, :, 0] = coords[:, :, 0] / image_size[1] + coords[:, :, 1] = coords[:, :, 1] / image_size[0] + return self._pe_encoding(coords.to(torch.float)) # B x N x C + + +# Rotary Positional Encoding, adapted from: +# 1. https://github.com/meta-llama/codellama/blob/main/llama/model.py +# 2. https://github.com/naver-ai/rope-vit +# 3. https://github.com/lucidrains/rotary-embedding-torch + + +def init_t_xy(end_x: int, end_y: int): + t = torch.arange(end_x * end_y, dtype=torch.float32) + t_x = (t % end_x).float() + t_y = torch.div(t, end_x, rounding_mode="floor").float() + return t_x, t_y + + +def compute_axial_cis(dim: int, end_x: int, end_y: int, theta: float = 10000.0): + freqs_x = 1.0 / (theta ** (torch.arange(0, dim, 4)[: (dim // 4)].float() / dim)) + freqs_y = 1.0 / (theta ** (torch.arange(0, dim, 4)[: (dim // 4)].float() / dim)) + + t_x, t_y = init_t_xy(end_x, end_y) + freqs_x = torch.outer(t_x, freqs_x) + freqs_y = torch.outer(t_y, freqs_y) + freqs_cis_x = torch.polar(torch.ones_like(freqs_x), freqs_x) + freqs_cis_y = torch.polar(torch.ones_like(freqs_y), freqs_y) + return torch.cat([freqs_cis_x, freqs_cis_y], dim=-1) + + +def reshape_for_broadcast(freqs_cis: torch.Tensor, x: torch.Tensor): + ndim = x.ndim + assert 0 <= 1 < ndim + assert freqs_cis.shape == (x.shape[-2], x.shape[-1]) + shape = [d if i >= ndim - 2 else 1 for i, d in enumerate(x.shape)] + return freqs_cis.view(*shape) + + +def apply_rotary_enc( + xq: torch.Tensor, + xk: torch.Tensor, + freqs_cis: torch.Tensor, + repeat_freqs_k: bool = False, +): + xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2)) + xk_ = ( + torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2)) + if xk.shape[-2] != 0 + else None + ) + freqs_cis = reshape_for_broadcast(freqs_cis, xq_) + xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3) + if xk_ is None: + # no keys to rotate, due to dropout + return xq_out.type_as(xq).to(xq.device), xk + # repeat freqs along seq_len dim to match k seq_len + if repeat_freqs_k: + r = xk_.shape[-2] // xq_.shape[-2] + if freqs_cis.is_complex() and freqs_cis.device.type == "mps": + # MPS doesn't support repeat on complex; cat works fine. + freqs_cis = torch.cat([freqs_cis] * r, dim=-2) + else: + freqs_cis = freqs_cis.repeat(*([1] * (freqs_cis.ndim - 2)), r, 1) + xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3) + return xq_out.type_as(xq).to(xq.device), xk_out.type_as(xk).to(xk.device) diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/__init__.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5277f46157403e47fd830fc519144b97ef69d4ae --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/mask_decoder.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/mask_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..007d14142b9613c85497bc5473cc8898863054a7 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/mask_decoder.py @@ -0,0 +1,295 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from typing import List, Optional, Tuple, Type + +import torch +from torch import nn + +from ....sam2.modeling.sam2_utils import LayerNorm2d, MLP + + +class MaskDecoder(nn.Module): + def __init__( + self, + *, + transformer_dim: int, + transformer: nn.Module, + num_multimask_outputs: int = 3, + activation: Type[nn.Module] = nn.GELU, + iou_head_depth: int = 3, + iou_head_hidden_dim: int = 256, + use_high_res_features: bool = False, + iou_prediction_use_sigmoid=False, + dynamic_multimask_via_stability=False, + dynamic_multimask_stability_delta=0.05, + dynamic_multimask_stability_thresh=0.98, + pred_obj_scores: bool = False, + pred_obj_scores_mlp: bool = False, + use_multimask_token_for_obj_ptr: bool = False, + ) -> None: + """ + Predicts masks given an image and prompt embeddings, using a + transformer architecture. + + Arguments: + transformer_dim (int): the channel dimension of the transformer + transformer (nn.Module): the transformer used to predict masks + num_multimask_outputs (int): the number of masks to predict + when disambiguating masks + activation (nn.Module): the type of activation to use when + upscaling masks + iou_head_depth (int): the depth of the MLP used to predict + mask quality + iou_head_hidden_dim (int): the hidden dimension of the MLP + used to predict mask quality + """ + super().__init__() + self.transformer_dim = transformer_dim + self.transformer = transformer + + self.num_multimask_outputs = num_multimask_outputs + + self.iou_token = nn.Embedding(1, transformer_dim) + self.num_mask_tokens = num_multimask_outputs + 1 + self.mask_tokens = nn.Embedding(self.num_mask_tokens, transformer_dim) + + self.pred_obj_scores = pred_obj_scores + if self.pred_obj_scores: + self.obj_score_token = nn.Embedding(1, transformer_dim) + self.use_multimask_token_for_obj_ptr = use_multimask_token_for_obj_ptr + + self.output_upscaling = nn.Sequential( + nn.ConvTranspose2d( + transformer_dim, transformer_dim // 4, kernel_size=2, stride=2 + ), + LayerNorm2d(transformer_dim // 4), + activation(), + nn.ConvTranspose2d( + transformer_dim // 4, transformer_dim // 8, kernel_size=2, stride=2 + ), + activation(), + ) + self.use_high_res_features = use_high_res_features + if use_high_res_features: + self.conv_s0 = nn.Conv2d( + transformer_dim, transformer_dim // 8, kernel_size=1, stride=1 + ) + self.conv_s1 = nn.Conv2d( + transformer_dim, transformer_dim // 4, kernel_size=1, stride=1 + ) + + self.output_hypernetworks_mlps = nn.ModuleList( + [ + MLP(transformer_dim, transformer_dim, transformer_dim // 8, 3) + for i in range(self.num_mask_tokens) + ] + ) + + self.iou_prediction_head = MLP( + transformer_dim, + iou_head_hidden_dim, + self.num_mask_tokens, + iou_head_depth, + sigmoid_output=iou_prediction_use_sigmoid, + ) + if self.pred_obj_scores: + self.pred_obj_score_head = nn.Linear(transformer_dim, 1) + if pred_obj_scores_mlp: + self.pred_obj_score_head = MLP(transformer_dim, transformer_dim, 1, 3) + + # When outputting a single mask, optionally we can dynamically fall back to the best + # multimask output token if the single mask output token gives low stability scores. + self.dynamic_multimask_via_stability = dynamic_multimask_via_stability + self.dynamic_multimask_stability_delta = dynamic_multimask_stability_delta + self.dynamic_multimask_stability_thresh = dynamic_multimask_stability_thresh + + def forward( + self, + image_embeddings: torch.Tensor, + image_pe: torch.Tensor, + sparse_prompt_embeddings: torch.Tensor, + dense_prompt_embeddings: torch.Tensor, + multimask_output: bool, + repeat_image: bool, + high_res_features: Optional[List[torch.Tensor]] = None, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Predict masks given image and prompt embeddings. + + Arguments: + image_embeddings (torch.Tensor): the embeddings from the image encoder + image_pe (torch.Tensor): positional encoding with the shape of image_embeddings + sparse_prompt_embeddings (torch.Tensor): the embeddings of the points and boxes + dense_prompt_embeddings (torch.Tensor): the embeddings of the mask inputs + multimask_output (bool): Whether to return multiple masks or a single + mask. + + Returns: + torch.Tensor: batched predicted masks + torch.Tensor: batched predictions of mask quality + torch.Tensor: batched SAM token for mask output + """ + masks, iou_pred, mask_tokens_out, object_score_logits = self.predict_masks( + image_embeddings=image_embeddings, + image_pe=image_pe, + sparse_prompt_embeddings=sparse_prompt_embeddings, + dense_prompt_embeddings=dense_prompt_embeddings, + repeat_image=repeat_image, + high_res_features=high_res_features, + ) + + # Select the correct mask or masks for output + if multimask_output: + masks = masks[:, 1:, :, :] + iou_pred = iou_pred[:, 1:] + elif self.dynamic_multimask_via_stability and not self.training: + masks, iou_pred = self._dynamic_multimask_via_stability(masks, iou_pred) + else: + masks = masks[:, 0:1, :, :] + iou_pred = iou_pred[:, 0:1] + + if multimask_output and self.use_multimask_token_for_obj_ptr: + sam_tokens_out = mask_tokens_out[:, 1:] # [b, 3, c] shape + else: + # Take the mask output token. Here we *always* use the token for single mask output. + # At test time, even if we track after 1-click (and using multimask_output=True), + # we still take the single mask token here. The rationale is that we always track + # after multiple clicks during training, so the past tokens seen during training + # are always the single mask token (and we'll let it be the object-memory token). + sam_tokens_out = mask_tokens_out[:, 0:1] # [b, 1, c] shape + + # Prepare output + return masks, iou_pred, sam_tokens_out, object_score_logits + + def predict_masks( + self, + image_embeddings: torch.Tensor, + image_pe: torch.Tensor, + sparse_prompt_embeddings: torch.Tensor, + dense_prompt_embeddings: torch.Tensor, + repeat_image: bool, + high_res_features: Optional[List[torch.Tensor]] = None, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Predicts masks. See 'forward' for more details.""" + # Concatenate output tokens + s = 0 + if self.pred_obj_scores: + output_tokens = torch.cat( + [ + self.obj_score_token.weight, + self.iou_token.weight, + self.mask_tokens.weight, + ], + dim=0, + ) + s = 1 + else: + output_tokens = torch.cat( + [self.iou_token.weight, self.mask_tokens.weight], dim=0 + ) + output_tokens = output_tokens.unsqueeze(0).expand( + sparse_prompt_embeddings.size(0), -1, -1 + ) + tokens = torch.cat((output_tokens, sparse_prompt_embeddings), dim=1) + + # Expand per-image data in batch direction to be per-mask + if repeat_image: + src = torch.repeat_interleave(image_embeddings, tokens.shape[0], dim=0) + else: + assert image_embeddings.shape[0] == tokens.shape[0] + src = image_embeddings + src = src + dense_prompt_embeddings + assert ( + image_pe.size(0) == 1 + ), "image_pe should have size 1 in batch dim (from `get_dense_pe()`)" + pos_src = torch.repeat_interleave(image_pe, tokens.shape[0], dim=0) + b, c, h, w = src.shape + + # Run the transformer + hs, src = self.transformer(src, pos_src, tokens) + iou_token_out = hs[:, s, :] + mask_tokens_out = hs[:, s + 1 : (s + 1 + self.num_mask_tokens), :] + + # Upscale mask embeddings and predict masks using the mask tokens + src = src.transpose(1, 2).view(b, c, h, w) + if not self.use_high_res_features: + upscaled_embedding = self.output_upscaling(src) + else: + dc1, ln1, act1, dc2, act2 = self.output_upscaling + feat_s0, feat_s1 = high_res_features + upscaled_embedding = act1(ln1(dc1(src) + feat_s1)) + upscaled_embedding = act2(dc2(upscaled_embedding) + feat_s0) + + hyper_in_list: List[torch.Tensor] = [] + for i in range(self.num_mask_tokens): + hyper_in_list.append( + self.output_hypernetworks_mlps[i](mask_tokens_out[:, i, :]) + ) + hyper_in = torch.stack(hyper_in_list, dim=1) + b, c, h, w = upscaled_embedding.shape + masks = (hyper_in @ upscaled_embedding.view(b, c, h * w)).view(b, -1, h, w) + + # Generate mask quality predictions + iou_pred = self.iou_prediction_head(iou_token_out) + if self.pred_obj_scores: + assert s == 1 + object_score_logits = self.pred_obj_score_head(hs[:, 0, :]) + else: + # Obj scores logits - default to 10.0, i.e. assuming the object is present, sigmoid(10)=1 + object_score_logits = 10.0 * iou_pred.new_ones(iou_pred.shape[0], 1) + + return masks, iou_pred, mask_tokens_out, object_score_logits + + def _get_stability_scores(self, mask_logits): + """ + Compute stability scores of the mask logits based on the IoU between upper and + lower thresholds. + """ + mask_logits = mask_logits.flatten(-2) + stability_delta = self.dynamic_multimask_stability_delta + area_i = torch.sum(mask_logits > stability_delta, dim=-1).float() + area_u = torch.sum(mask_logits > -stability_delta, dim=-1).float() + stability_scores = torch.where(area_u > 0, area_i / area_u, 1.0) + return stability_scores + + def _dynamic_multimask_via_stability(self, all_mask_logits, all_iou_scores): + """ + When outputting a single mask, if the stability score from the current single-mask + output (based on output token 0) falls below a threshold, we instead select from + multi-mask outputs (based on output token 1~3) the mask with the highest predicted + IoU score. This is intended to ensure a valid mask for both clicking and tracking. + """ + # The best mask from multimask output tokens (1~3) + multimask_logits = all_mask_logits[:, 1:, :, :] + multimask_iou_scores = all_iou_scores[:, 1:] + best_scores_inds = torch.argmax(multimask_iou_scores, dim=-1) + batch_inds = torch.arange( + multimask_iou_scores.size(0), device=all_iou_scores.device + ) + best_multimask_logits = multimask_logits[batch_inds, best_scores_inds] + best_multimask_logits = best_multimask_logits.unsqueeze(1) + best_multimask_iou_scores = multimask_iou_scores[batch_inds, best_scores_inds] + best_multimask_iou_scores = best_multimask_iou_scores.unsqueeze(1) + + # The mask from singlemask output token 0 and its stability score + singlemask_logits = all_mask_logits[:, 0:1, :, :] + singlemask_iou_scores = all_iou_scores[:, 0:1] + stability_scores = self._get_stability_scores(singlemask_logits) + is_stable = stability_scores >= self.dynamic_multimask_stability_thresh + + # Dynamically fall back to best multimask output upon low stability scores. + mask_logits_out = torch.where( + is_stable[..., None, None].expand_as(singlemask_logits), + singlemask_logits, + best_multimask_logits, + ) + iou_scores_out = torch.where( + is_stable.expand_as(singlemask_iou_scores), + singlemask_iou_scores, + best_multimask_iou_scores, + ) + return mask_logits_out, iou_scores_out diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/prompt_encoder.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/prompt_encoder.py new file mode 100644 index 0000000000000000000000000000000000000000..fe125c72563ca068e3610ad3e1ea4c2c92d4507f --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/prompt_encoder.py @@ -0,0 +1,182 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Optional, Tuple, Type + +import torch +from torch import nn + +from ....sam2.modeling.position_encoding import PositionEmbeddingRandom + +from ....sam2.modeling.sam2_utils import LayerNorm2d + + +class PromptEncoder(nn.Module): + def __init__( + self, + embed_dim: int, + image_embedding_size: Tuple[int, int], + input_image_size: Tuple[int, int], + mask_in_chans: int, + activation: Type[nn.Module] = nn.GELU, + ) -> None: + """ + Encodes prompts for input to SAM's mask decoder. + + Arguments: + embed_dim (int): The prompts' embedding dimension + image_embedding_size (tuple(int, int)): The spatial size of the + image embedding, as (H, W). + input_image_size (int): The padded size of the image as input + to the image encoder, as (H, W). + mask_in_chans (int): The number of hidden channels used for + encoding input masks. + activation (nn.Module): The activation to use when encoding + input masks. + """ + super().__init__() + self.embed_dim = embed_dim + self.input_image_size = input_image_size + self.image_embedding_size = image_embedding_size + self.pe_layer = PositionEmbeddingRandom(embed_dim // 2) + + self.num_point_embeddings: int = 4 # pos/neg point + 2 box corners + point_embeddings = [ + nn.Embedding(1, embed_dim) for i in range(self.num_point_embeddings) + ] + self.point_embeddings = nn.ModuleList(point_embeddings) + self.not_a_point_embed = nn.Embedding(1, embed_dim) + + self.mask_input_size = ( + 4 * image_embedding_size[0], + 4 * image_embedding_size[1], + ) + self.mask_downscaling = nn.Sequential( + nn.Conv2d(1, mask_in_chans // 4, kernel_size=2, stride=2), + LayerNorm2d(mask_in_chans // 4), + activation(), + nn.Conv2d(mask_in_chans // 4, mask_in_chans, kernel_size=2, stride=2), + LayerNorm2d(mask_in_chans), + activation(), + nn.Conv2d(mask_in_chans, embed_dim, kernel_size=1), + ) + self.no_mask_embed = nn.Embedding(1, embed_dim) + + def get_dense_pe(self) -> torch.Tensor: + """ + Returns the positional encoding used to encode point prompts, + applied to a dense set of points the shape of the image encoding. + + Returns: + torch.Tensor: Positional encoding with shape + 1x(embed_dim)x(embedding_h)x(embedding_w) + """ + return self.pe_layer(self.image_embedding_size).unsqueeze(0) + + def _embed_points( + self, + points: torch.Tensor, + labels: torch.Tensor, + pad: bool, + ) -> torch.Tensor: + """Embeds point prompts.""" + points = points + 0.5 # Shift to center of pixel + if pad: + padding_point = torch.zeros((points.shape[0], 1, 2), device=points.device) + padding_label = -torch.ones((labels.shape[0], 1), device=labels.device) + points = torch.cat([points, padding_point], dim=1) + labels = torch.cat([labels, padding_label], dim=1) + point_embedding = self.pe_layer.forward_with_coords( + points, self.input_image_size + ) + point_embedding[labels == -1] = 0.0 + point_embedding[labels == -1] += self.not_a_point_embed.weight + point_embedding[labels == 0] += self.point_embeddings[0].weight + point_embedding[labels == 1] += self.point_embeddings[1].weight + point_embedding[labels == 2] += self.point_embeddings[2].weight + point_embedding[labels == 3] += self.point_embeddings[3].weight + return point_embedding + + def _embed_boxes(self, boxes: torch.Tensor) -> torch.Tensor: + """Embeds box prompts.""" + boxes = boxes + 0.5 # Shift to center of pixel + coords = boxes.reshape(-1, 2, 2) + corner_embedding = self.pe_layer.forward_with_coords( + coords, self.input_image_size + ) + corner_embedding[:, 0, :] += self.point_embeddings[2].weight + corner_embedding[:, 1, :] += self.point_embeddings[3].weight + return corner_embedding + + def _embed_masks(self, masks: torch.Tensor) -> torch.Tensor: + """Embeds mask inputs.""" + mask_embedding = self.mask_downscaling(masks) + return mask_embedding + + def _get_batch_size( + self, + points: Optional[Tuple[torch.Tensor, torch.Tensor]], + boxes: Optional[torch.Tensor], + masks: Optional[torch.Tensor], + ) -> int: + """ + Gets the batch size of the output given the batch size of the input prompts. + """ + if points is not None: + return points[0].shape[0] + elif boxes is not None: + return boxes.shape[0] + elif masks is not None: + return masks.shape[0] + else: + return 1 + + def _get_device(self) -> torch.device: + return self.point_embeddings[0].weight.device + + def forward( + self, + points: Optional[Tuple[torch.Tensor, torch.Tensor]], + boxes: Optional[torch.Tensor], + masks: Optional[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Embeds different types of prompts, returning both sparse and dense + embeddings. + + Arguments: + points (tuple(torch.Tensor, torch.Tensor) or none): point coordinates + and labels to embed. + boxes (torch.Tensor or none): boxes to embed + masks (torch.Tensor or none): masks to embed + + Returns: + torch.Tensor: sparse embeddings for the points and boxes, with shape + BxNx(embed_dim), where N is determined by the number of input points + and boxes. + torch.Tensor: dense embeddings for the masks, in the shape + Bx(embed_dim)x(embed_H)x(embed_W) + """ + bs = self._get_batch_size(points, boxes, masks) + sparse_embeddings = torch.empty( + (bs, 0, self.embed_dim), device=self._get_device() + ) + if points is not None: + coords, labels = points + point_embeddings = self._embed_points(coords, labels, pad=(boxes is None)) + sparse_embeddings = torch.cat([sparse_embeddings, point_embeddings], dim=1) + if boxes is not None: + box_embeddings = self._embed_boxes(boxes) + sparse_embeddings = torch.cat([sparse_embeddings, box_embeddings], dim=1) + + if masks is not None: + dense_embeddings = self._embed_masks(masks) + else: + dense_embeddings = self.no_mask_embed.weight.reshape(1, -1, 1, 1).expand( + bs, -1, self.image_embedding_size[0], self.image_embedding_size[1] + ) + + return sparse_embeddings, dense_embeddings diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/transformer.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..fb71606b6a80c968a1710a4ab8ef3b7cc4822f92 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam/transformer.py @@ -0,0 +1,347 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math +import warnings +from functools import partial +from typing import Tuple, Type + +import torch +import torch.nn.functional as F +from torch import nn, Tensor + +from ....sam2.modeling.position_encoding import apply_rotary_enc, compute_axial_cis +from ....sam2.modeling.sam2_utils import MLP + +from ....sam2.utils.misc import get_sdpa_settings +OLD_GPU, USE_FLASH_ATTN, MATH_KERNEL_ON = get_sdpa_settings() + +try: + from torch.nn.attention import SDPBackend, sdpa_kernel + backends = [] + if USE_FLASH_ATTN: + backends.append(SDPBackend.FLASH_ATTENTION) + if MATH_KERNEL_ON: + backends.append(SDPBackend.MATH) + if OLD_GPU: + backends.append(SDPBackend.EFFICIENT_ATTENTION) + OLD_TORCH = False +except: + OLD_TORCH = True + +warnings.simplefilter(action="ignore", category=FutureWarning) + +class TwoWayTransformer(nn.Module): + def __init__( + self, + depth: int, + embedding_dim: int, + num_heads: int, + mlp_dim: int, + activation: Type[nn.Module] = nn.ReLU, + attention_downsample_rate: int = 2, + ) -> None: + """ + A transformer decoder that attends to an input image using + queries whose positional embedding is supplied. + + Args: + depth (int): number of layers in the transformer + embedding_dim (int): the channel dimension for the input embeddings + num_heads (int): the number of heads for multihead attention. Must + divide embedding_dim + mlp_dim (int): the channel dimension internal to the MLP block + activation (nn.Module): the activation to use in the MLP block + """ + super().__init__() + self.depth = depth + self.embedding_dim = embedding_dim + self.num_heads = num_heads + self.mlp_dim = mlp_dim + self.layers = nn.ModuleList() + + for i in range(depth): + self.layers.append( + TwoWayAttentionBlock( + embedding_dim=embedding_dim, + num_heads=num_heads, + mlp_dim=mlp_dim, + activation=activation, + attention_downsample_rate=attention_downsample_rate, + skip_first_layer_pe=(i == 0), + ) + ) + + self.final_attn_token_to_image = Attention( + embedding_dim, num_heads, downsample_rate=attention_downsample_rate + ) + self.norm_final_attn = nn.LayerNorm(embedding_dim) + + def forward( + self, + image_embedding: Tensor, + image_pe: Tensor, + point_embedding: Tensor, + ) -> Tuple[Tensor, Tensor]: + """ + Args: + image_embedding (torch.Tensor): image to attend to. Should be shape + B x embedding_dim x h x w for any h and w. + image_pe (torch.Tensor): the positional encoding to add to the image. Must + have the same shape as image_embedding. + point_embedding (torch.Tensor): the embedding to add to the query points. + Must have shape B x N_points x embedding_dim for any N_points. + + Returns: + torch.Tensor: the processed point_embedding + torch.Tensor: the processed image_embedding + """ + # BxCxHxW -> BxHWxC == B x N_image_tokens x C + bs, c, h, w = image_embedding.shape + image_embedding = image_embedding.flatten(2).permute(0, 2, 1) + image_pe = image_pe.flatten(2).permute(0, 2, 1) + + # Prepare queries + queries = point_embedding + keys = image_embedding + + # Apply transformer blocks and final layernorm + for layer in self.layers: + queries, keys = layer( + queries=queries, + keys=keys, + query_pe=point_embedding, + key_pe=image_pe, + ) + + # Apply the final attention layer from the points to the image + q = queries + point_embedding + k = keys + image_pe + attn_out = self.final_attn_token_to_image(q=q, k=k, v=keys) + queries = queries + attn_out + queries = self.norm_final_attn(queries) + + return queries, keys + + +class TwoWayAttentionBlock(nn.Module): + def __init__( + self, + embedding_dim: int, + num_heads: int, + mlp_dim: int = 2048, + activation: Type[nn.Module] = nn.ReLU, + attention_downsample_rate: int = 2, + skip_first_layer_pe: bool = False, + ) -> None: + """ + A transformer block with four layers: (1) self-attention of sparse + inputs, (2) cross attention of sparse inputs to dense inputs, (3) mlp + block on sparse inputs, and (4) cross attention of dense inputs to sparse + inputs. + + Arguments: + embedding_dim (int): the channel dimension of the embeddings + num_heads (int): the number of heads in the attention layers + mlp_dim (int): the hidden dimension of the mlp block + activation (nn.Module): the activation of the mlp block + skip_first_layer_pe (bool): skip the PE on the first layer + """ + super().__init__() + self.self_attn = Attention(embedding_dim, num_heads) + self.norm1 = nn.LayerNorm(embedding_dim) + + self.cross_attn_token_to_image = Attention( + embedding_dim, num_heads, downsample_rate=attention_downsample_rate + ) + self.norm2 = nn.LayerNorm(embedding_dim) + + self.mlp = MLP( + embedding_dim, mlp_dim, embedding_dim, num_layers=2, activation=activation + ) + self.norm3 = nn.LayerNorm(embedding_dim) + + self.norm4 = nn.LayerNorm(embedding_dim) + self.cross_attn_image_to_token = Attention( + embedding_dim, num_heads, downsample_rate=attention_downsample_rate + ) + + self.skip_first_layer_pe = skip_first_layer_pe + + def forward( + self, queries: Tensor, keys: Tensor, query_pe: Tensor, key_pe: Tensor + ) -> Tuple[Tensor, Tensor]: + # Self attention block + if self.skip_first_layer_pe: + queries = self.self_attn(q=queries, k=queries, v=queries) + else: + q = queries + query_pe + attn_out = self.self_attn(q=q, k=q, v=queries) + queries = queries + attn_out + queries = self.norm1(queries) + + # Cross attention block, tokens attending to image embedding + q = queries + query_pe + k = keys + key_pe + attn_out = self.cross_attn_token_to_image(q=q, k=k, v=keys) + queries = queries + attn_out + queries = self.norm2(queries) + + # MLP block + mlp_out = self.mlp(queries) + queries = queries + mlp_out + queries = self.norm3(queries) + + # Cross attention block, image embedding attending to tokens + q = queries + query_pe + k = keys + key_pe + attn_out = self.cross_attn_image_to_token(q=k, k=q, v=queries) + keys = keys + attn_out + keys = self.norm4(keys) + + return queries, keys + + +class Attention(nn.Module): + """ + An attention layer that allows for downscaling the size of the embedding + after projection to queries, keys, and values. + """ + + def __init__( + self, + embedding_dim: int, + num_heads: int, + downsample_rate: int = 1, + dropout: float = 0.0, + kv_in_dim: int = None, + ) -> None: + super().__init__() + self.embedding_dim = embedding_dim + self.kv_in_dim = kv_in_dim if kv_in_dim is not None else embedding_dim + self.internal_dim = embedding_dim // downsample_rate + self.num_heads = num_heads + assert ( + self.internal_dim % num_heads == 0 + ), "num_heads must divide embedding_dim." + + self.q_proj = nn.Linear(embedding_dim, self.internal_dim) + self.k_proj = nn.Linear(self.kv_in_dim, self.internal_dim) + self.v_proj = nn.Linear(self.kv_in_dim, self.internal_dim) + self.out_proj = nn.Linear(self.internal_dim, embedding_dim) + + self.dropout_p = dropout + + def _separate_heads(self, x: Tensor, num_heads: int) -> Tensor: + b, n, c = x.shape + x = x.reshape(b, n, num_heads, c // num_heads) + return x.transpose(1, 2) # B x N_heads x N_tokens x C_per_head + + def _recombine_heads(self, x: Tensor) -> Tensor: + b, n_heads, n_tokens, c_per_head = x.shape + x = x.transpose(1, 2) + return x.reshape(b, n_tokens, n_heads * c_per_head) # B x N_tokens x C + + def forward(self, q: Tensor, k: Tensor, v: Tensor) -> Tensor: + # Input projections + q = self.q_proj(q) + k = self.k_proj(k) + v = self.v_proj(v) + + # Separate into heads + q = self._separate_heads(q, self.num_heads) + k = self._separate_heads(k, self.num_heads) + v = self._separate_heads(v, self.num_heads) + + dropout_p = self.dropout_p if self.training else 0.0 + # Attention + if not OLD_TORCH: + if not MATH_KERNEL_ON and OLD_GPU and dropout_p > 0.0: + backends.append(SDPBackend.MATH) + with sdpa_kernel(backends): + out = F.scaled_dot_product_attention(q, k, v, dropout_p=dropout_p) + else: + with torch.backends.cuda.sdp_kernel( + enable_flash=USE_FLASH_ATTN, + enable_math=(OLD_GPU and dropout_p > 0.0) or MATH_KERNEL_ON, + enable_mem_efficient=OLD_GPU, + ): + out = F.scaled_dot_product_attention(q, k, v, dropout_p=dropout_p) + out = self._recombine_heads(out) + out = self.out_proj(out) + + return out + + +class RoPEAttention(Attention): + """Attention with rotary position encoding.""" + + def __init__( + self, + *args, + rope_theta=10000.0, + # whether to repeat q rope to match k length + # this is needed for cross-attention to memories + rope_k_repeat=False, + feat_sizes=(32, 32), # [w, h] for stride 16 feats at 512 resolution + **kwargs, + ): + super().__init__(*args, **kwargs) + + self.compute_cis = partial( + compute_axial_cis, dim=self.internal_dim // self.num_heads, theta=rope_theta + ) + freqs_cis = self.compute_cis(end_x=feat_sizes[0], end_y=feat_sizes[1]) + self.freqs_cis = freqs_cis + self.rope_k_repeat = rope_k_repeat + + def forward( + self, q: Tensor, k: Tensor, v: Tensor, num_k_exclude_rope: int = 0 + ) -> Tensor: + # Input projections + q = self.q_proj(q) + k = self.k_proj(k) + v = self.v_proj(v) + + # Separate into heads + q = self._separate_heads(q, self.num_heads) + k = self._separate_heads(k, self.num_heads) + v = self._separate_heads(v, self.num_heads) + + # Apply rotary position encoding + w = h = math.sqrt(q.shape[-2]) + self.freqs_cis = self.freqs_cis.to(q.device) + if self.freqs_cis.shape[0] != q.shape[-2]: + self.freqs_cis = self.compute_cis(end_x=w, end_y=h).to(q.device) + if q.shape[-2] != k.shape[-2]: + assert self.rope_k_repeat + + num_k_rope = k.size(-2) - num_k_exclude_rope + q, k[:, :, :num_k_rope] = apply_rotary_enc( + q, + k[:, :, :num_k_rope], + freqs_cis=self.freqs_cis, + repeat_freqs_k=self.rope_k_repeat, + ) + + dropout_p = self.dropout_p if self.training else 0.0 + # Attention + if not OLD_TORCH: + if not MATH_KERNEL_ON and OLD_GPU and dropout_p > 0.0: + backends.append(SDPBackend.MATH) + with sdpa_kernel(backends): + out = F.scaled_dot_product_attention(q, k, v, dropout_p=dropout_p) + else: + with torch.backends.cuda.sdp_kernel( + enable_flash=USE_FLASH_ATTN, + enable_math=(OLD_GPU and dropout_p > 0.0) or MATH_KERNEL_ON, + enable_mem_efficient=OLD_GPU, + ): + out = F.scaled_dot_product_attention(q, k, v, dropout_p=dropout_p) + out = self._recombine_heads(out) + out = self.out_proj(out) + + return out diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam2_base.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam2_base.py new file mode 100644 index 0000000000000000000000000000000000000000..078d63b7456d428bb7d8c161fa8f4dc02215ce8c --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam2_base.py @@ -0,0 +1,907 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.distributed +import torch.nn.functional as F + +from torch.nn.init import trunc_normal_ + +from ...sam2.modeling.sam.mask_decoder import MaskDecoder +from ...sam2.modeling.sam.prompt_encoder import PromptEncoder +from ...sam2.modeling.sam.transformer import TwoWayTransformer +from ...sam2.modeling.sam2_utils import get_1d_sine_pe, MLP, select_closest_cond_frames + +# a large negative value as a placeholder score for missing objects +NO_OBJ_SCORE = -1024.0 + + +class SAM2Base(torch.nn.Module): + def __init__( + self, + image_encoder, + memory_attention, + memory_encoder, + num_maskmem=7, # default 1 input frame + 6 previous frames + image_size=512, + backbone_stride=16, # stride of the image backbone output + sigmoid_scale_for_mem_enc=1.0, # scale factor for mask sigmoid prob + sigmoid_bias_for_mem_enc=0.0, # bias factor for mask sigmoid prob + # During evaluation, whether to binarize the sigmoid mask logits on interacted frames with clicks + binarize_mask_from_pts_for_mem_enc=False, + use_mask_input_as_output_without_sam=False, # on frames with mask input, whether to directly output the input mask without using a SAM prompt encoder + mask decoder + # The maximum number of conditioning frames to participate in the memory attention (-1 means no limit; if there are more conditioning frames than this limit, + # we only cross-attend to the temporally closest `max_cond_frames_in_attn` conditioning frames in the encoder when tracking each frame). This gives the model + # a temporal locality when handling a large number of annotated frames (since closer frames should be more important) and also avoids GPU OOM. + max_cond_frames_in_attn=-1, + # on the first frame, whether to directly add the no-memory embedding to the image feature + # (instead of using the transformer encoder) + directly_add_no_mem_embed=False, + # whether to use high-resolution feature maps in the SAM mask decoder + use_high_res_features_in_sam=False, + # whether to output multiple (3) masks for the first click on initial conditioning frames + multimask_output_in_sam=False, + # the minimum and maximum number of clicks to use multimask_output_in_sam (only relevant when `multimask_output_in_sam=True`; + # default is 1 for both, meaning that only the first click gives multimask output; also note that a box counts as two points) + multimask_min_pt_num=1, + multimask_max_pt_num=1, + # whether to also use multimask output for tracking (not just for the first click on initial conditioning frames; only relevant when `multimask_output_in_sam=True`) + multimask_output_for_tracking=False, + # Whether to use multimask tokens for obj ptr; Only relevant when both + # use_obj_ptrs_in_encoder=True and multimask_output_for_tracking=True + use_multimask_token_for_obj_ptr: bool = False, + # whether to use sigmoid to restrict ious prediction to [0-1] + iou_prediction_use_sigmoid=False, + # The memory bank's temporal stride during evaluation (i.e. the `r` parameter in XMem and Cutie; XMem and Cutie use r=5). + # For r>1, the (self.num_maskmem - 1) non-conditioning memory frames consist of + # (self.num_maskmem - 2) nearest frames from every r-th frames, plus the last frame. + memory_temporal_stride_for_eval=1, + # whether to apply non-overlapping constraints on the object masks in the memory encoder during evaluation (to avoid/alleviate superposing masks) + non_overlap_masks_for_mem_enc=False, + # whether to cross-attend to object pointers from other frames (based on SAM output tokens) in the encoder + use_obj_ptrs_in_encoder=False, + # the maximum number of object pointers from other frames in encoder cross attention (only relevant when `use_obj_ptrs_in_encoder=True`) + max_obj_ptrs_in_encoder=16, + # whether to add temporal positional encoding to the object pointers in the encoder (only relevant when `use_obj_ptrs_in_encoder=True`) + add_tpos_enc_to_obj_ptrs=True, + # whether to add an extra linear projection layer for the temporal positional encoding in the object pointers to avoid potential interference + # with spatial positional encoding (only relevant when both `use_obj_ptrs_in_encoder=True` and `add_tpos_enc_to_obj_ptrs=True`) + proj_tpos_enc_in_obj_ptrs=False, + # whether to use signed distance (instead of unsigned absolute distance) in the temporal positional encoding in the object pointers + # (only relevant when both `use_obj_ptrs_in_encoder=True` and `add_tpos_enc_to_obj_ptrs=True`) + use_signed_tpos_enc_to_obj_ptrs=False, + # whether to only attend to object pointers in the past (before the current frame) in the encoder during evaluation + # (only relevant when `use_obj_ptrs_in_encoder=True`; this might avoid pointer information too far in the future to distract the initial tracking) + only_obj_ptrs_in_the_past_for_eval=False, + # Whether to predict if there is an object in the frame + pred_obj_scores: bool = False, + # Whether to use an MLP to predict object scores + pred_obj_scores_mlp: bool = False, + # Only relevant if pred_obj_scores=True and use_obj_ptrs_in_encoder=True; + # Whether to have a fixed no obj pointer when there is no object present + # or to use it as an additive embedding with obj_ptr produced by decoder + fixed_no_obj_ptr: bool = False, + # Soft no object, i.e. mix in no_obj_ptr softly, + # hope to make recovery easier if there is a mistake and mitigate accumulation of errors + soft_no_obj_ptr: bool = False, + use_mlp_for_obj_ptr_proj: bool = False, + # add no obj embedding to spatial frames + no_obj_embed_spatial: bool = False, + # extra arguments used to construct the SAM mask decoder; if not None, it should be a dict of kwargs to be passed into `MaskDecoder` class. + sam_mask_decoder_extra_args=None, + compile_image_encoder: bool = False, + ): + super().__init__() + + # Part 1: the image backbone + self.image_encoder = image_encoder + # Use level 0, 1, 2 for high-res setting, or just level 2 for the default setting + self.use_high_res_features_in_sam = use_high_res_features_in_sam + self.num_feature_levels = 3 if use_high_res_features_in_sam else 1 + self.use_obj_ptrs_in_encoder = use_obj_ptrs_in_encoder + self.max_obj_ptrs_in_encoder = max_obj_ptrs_in_encoder + if use_obj_ptrs_in_encoder: + # A conv layer to downsample the mask prompt to stride 4 (the same stride as + # low-res SAM mask logits) and to change its scales from 0~1 to SAM logit scale, + # so that it can be fed into the SAM mask decoder to generate a pointer. + self.mask_downsample = torch.nn.Conv2d(1, 1, kernel_size=4, stride=4) + self.add_tpos_enc_to_obj_ptrs = add_tpos_enc_to_obj_ptrs + if proj_tpos_enc_in_obj_ptrs: + assert add_tpos_enc_to_obj_ptrs # these options need to be used together + self.proj_tpos_enc_in_obj_ptrs = proj_tpos_enc_in_obj_ptrs + self.use_signed_tpos_enc_to_obj_ptrs = use_signed_tpos_enc_to_obj_ptrs + self.only_obj_ptrs_in_the_past_for_eval = only_obj_ptrs_in_the_past_for_eval + + # Part 2: memory attention to condition current frame's visual features + # with memories (and obj ptrs) from past frames + self.memory_attention = memory_attention + self.hidden_dim = image_encoder.neck.d_model + + # Part 3: memory encoder for the previous frame's outputs + self.memory_encoder = memory_encoder + self.mem_dim = self.hidden_dim + if hasattr(self.memory_encoder, "out_proj") and hasattr( + self.memory_encoder.out_proj, "weight" + ): + # if there is compression of memories along channel dim + self.mem_dim = self.memory_encoder.out_proj.weight.shape[0] + self.num_maskmem = num_maskmem # Number of memories accessible + # Temporal encoding of the memories + self.maskmem_tpos_enc = torch.nn.Parameter( + torch.zeros(num_maskmem, 1, 1, self.mem_dim) + ) + trunc_normal_(self.maskmem_tpos_enc, std=0.02) + # a single token to indicate no memory embedding from previous frames + self.no_mem_embed = torch.nn.Parameter(torch.zeros(1, 1, self.hidden_dim)) + self.no_mem_pos_enc = torch.nn.Parameter(torch.zeros(1, 1, self.hidden_dim)) + trunc_normal_(self.no_mem_embed, std=0.02) + trunc_normal_(self.no_mem_pos_enc, std=0.02) + self.directly_add_no_mem_embed = directly_add_no_mem_embed + # Apply sigmoid to the output raw mask logits (to turn them from + # range (-inf, +inf) to range (0, 1)) before feeding them into the memory encoder + self.sigmoid_scale_for_mem_enc = sigmoid_scale_for_mem_enc + self.sigmoid_bias_for_mem_enc = sigmoid_bias_for_mem_enc + self.binarize_mask_from_pts_for_mem_enc = binarize_mask_from_pts_for_mem_enc + self.non_overlap_masks_for_mem_enc = non_overlap_masks_for_mem_enc + self.memory_temporal_stride_for_eval = memory_temporal_stride_for_eval + # On frames with mask input, whether to directly output the input mask without + # using a SAM prompt encoder + mask decoder + self.use_mask_input_as_output_without_sam = use_mask_input_as_output_without_sam + self.multimask_output_in_sam = multimask_output_in_sam + self.multimask_min_pt_num = multimask_min_pt_num + self.multimask_max_pt_num = multimask_max_pt_num + self.multimask_output_for_tracking = multimask_output_for_tracking + self.use_multimask_token_for_obj_ptr = use_multimask_token_for_obj_ptr + self.iou_prediction_use_sigmoid = iou_prediction_use_sigmoid + + # Part 4: SAM-style prompt encoder (for both mask and point inputs) + # and SAM-style mask decoder for the final mask output + self.image_size = image_size + self.backbone_stride = backbone_stride + self.sam_mask_decoder_extra_args = sam_mask_decoder_extra_args + self.pred_obj_scores = pred_obj_scores + self.pred_obj_scores_mlp = pred_obj_scores_mlp + self.fixed_no_obj_ptr = fixed_no_obj_ptr + self.soft_no_obj_ptr = soft_no_obj_ptr + if self.fixed_no_obj_ptr: + assert self.pred_obj_scores + assert self.use_obj_ptrs_in_encoder + if self.pred_obj_scores and self.use_obj_ptrs_in_encoder: + self.no_obj_ptr = torch.nn.Parameter(torch.zeros(1, self.hidden_dim)) + trunc_normal_(self.no_obj_ptr, std=0.02) + self.use_mlp_for_obj_ptr_proj = use_mlp_for_obj_ptr_proj + self.no_obj_embed_spatial = None + if no_obj_embed_spatial: + self.no_obj_embed_spatial = torch.nn.Parameter(torch.zeros(1, self.mem_dim)) + trunc_normal_(self.no_obj_embed_spatial, std=0.02) + + self._build_sam_heads() + self.max_cond_frames_in_attn = max_cond_frames_in_attn + + # Model compilation + if compile_image_encoder: + # Compile the forward function (not the full module) to allow loading checkpoints. + print( + "Image encoder compilation is enabled. First forward pass will be slow." + ) + self.image_encoder.forward = torch.compile( + self.image_encoder.forward, + mode="max-autotune", + fullgraph=True, + dynamic=False, + ) + + @property + def device(self): + return next(self.parameters()).device + + def forward(self, *args, **kwargs): + raise NotImplementedError( + "Please use the corresponding methods in SAM2VideoPredictor for inference or SAM2Train for training/fine-tuning" + "See notebooks/video_predictor_example.ipynb for an inference example." + ) + + def _build_sam_heads(self): + """Build SAM-style prompt encoder and mask decoder.""" + self.sam_prompt_embed_dim = self.hidden_dim + self.sam_image_embedding_size = self.image_size // self.backbone_stride + + # build PromptEncoder and MaskDecoder from SAM + # (their hyperparameters like `mask_in_chans=16` are from SAM code) + self.sam_prompt_encoder = PromptEncoder( + embed_dim=self.sam_prompt_embed_dim, + image_embedding_size=( + self.sam_image_embedding_size, + self.sam_image_embedding_size, + ), + input_image_size=(self.image_size, self.image_size), + mask_in_chans=16, + ) + self.sam_mask_decoder = MaskDecoder( + num_multimask_outputs=3, + transformer=TwoWayTransformer( + depth=2, + embedding_dim=self.sam_prompt_embed_dim, + mlp_dim=2048, + num_heads=8, + ), + transformer_dim=self.sam_prompt_embed_dim, + iou_head_depth=3, + iou_head_hidden_dim=256, + use_high_res_features=self.use_high_res_features_in_sam, + iou_prediction_use_sigmoid=self.iou_prediction_use_sigmoid, + pred_obj_scores=self.pred_obj_scores, + pred_obj_scores_mlp=self.pred_obj_scores_mlp, + use_multimask_token_for_obj_ptr=self.use_multimask_token_for_obj_ptr, + **(self.sam_mask_decoder_extra_args or {}), + ) + if self.use_obj_ptrs_in_encoder: + # a linear projection on SAM output tokens to turn them into object pointers + self.obj_ptr_proj = torch.nn.Linear(self.hidden_dim, self.hidden_dim) + if self.use_mlp_for_obj_ptr_proj: + self.obj_ptr_proj = MLP( + self.hidden_dim, self.hidden_dim, self.hidden_dim, 3 + ) + else: + self.obj_ptr_proj = torch.nn.Identity() + if self.proj_tpos_enc_in_obj_ptrs: + # a linear projection on temporal positional encoding in object pointers to + # avoid potential interference with spatial positional encoding + self.obj_ptr_tpos_proj = torch.nn.Linear(self.hidden_dim, self.mem_dim) + else: + self.obj_ptr_tpos_proj = torch.nn.Identity() + + def _forward_sam_heads( + self, + backbone_features, + point_inputs=None, + mask_inputs=None, + high_res_features=None, + multimask_output=False, + ): + """ + Forward SAM prompt encoders and mask heads. + + Inputs: + - backbone_features: image features of [B, C, H, W] shape + - point_inputs: a dictionary with "point_coords" and "point_labels", where + 1) "point_coords" has [B, P, 2] shape and float32 dtype and contains the + absolute pixel-unit coordinate in (x, y) format of the P input points + 2) "point_labels" has shape [B, P] and int32 dtype, where 1 means + positive clicks, 0 means negative clicks, and -1 means padding + - mask_inputs: a mask of [B, 1, H*16, W*16] shape, float or bool, with the + same spatial size as the image. + - high_res_features: either 1) None or 2) or a list of length 2 containing + two feature maps of [B, C, 4*H, 4*W] and [B, C, 2*H, 2*W] shapes respectively, + which will be used as high-resolution feature maps for SAM decoder. + - multimask_output: if it's True, we output 3 candidate masks and their 3 + corresponding IoU estimates, and if it's False, we output only 1 mask and + its corresponding IoU estimate. + + Outputs: + - low_res_multimasks: [B, M, H*4, W*4] shape (where M = 3 if + `multimask_output=True` and M = 1 if `multimask_output=False`), the SAM + output mask logits (before sigmoid) for the low-resolution masks, with 4x + the resolution (1/4 stride) of the input backbone_features. + - high_res_multimasks: [B, M, H*16, W*16] shape (where M = 3 + if `multimask_output=True` and M = 1 if `multimask_output=False`), + upsampled from the low-resolution masks, with shape size as the image + (stride is 1 pixel). + - ious, [B, M] shape, where (where M = 3 if `multimask_output=True` and M = 1 + if `multimask_output=False`), the estimated IoU of each output mask. + - low_res_masks: [B, 1, H*4, W*4] shape, the best mask in `low_res_multimasks`. + If `multimask_output=True`, it's the mask with the highest IoU estimate. + If `multimask_output=False`, it's the same as `low_res_multimasks`. + - high_res_masks: [B, 1, H*16, W*16] shape, the best mask in `high_res_multimasks`. + If `multimask_output=True`, it's the mask with the highest IoU estimate. + If `multimask_output=False`, it's the same as `high_res_multimasks`. + - obj_ptr: [B, C] shape, the object pointer vector for the output mask, extracted + based on the output token from the SAM mask decoder. + """ + B = backbone_features.size(0) + device = backbone_features.device + assert backbone_features.size(1) == self.sam_prompt_embed_dim + assert backbone_features.size(2) == self.sam_image_embedding_size + assert backbone_features.size(3) == self.sam_image_embedding_size + + # a) Handle point prompts + if point_inputs is not None: + sam_point_coords = point_inputs["point_coords"] + sam_point_labels = point_inputs["point_labels"] + assert sam_point_coords.size(0) == B and sam_point_labels.size(0) == B + else: + # If no points are provide, pad with an empty point (with label -1) + sam_point_coords = torch.zeros(B, 1, 2, device=device) + sam_point_labels = -torch.ones(B, 1, dtype=torch.int32, device=device) + + # b) Handle mask prompts + if mask_inputs is not None: + # If mask_inputs is provided, downsize it into low-res mask input if needed + # and feed it as a dense mask prompt into the SAM mask encoder + assert len(mask_inputs.shape) == 4 and mask_inputs.shape[:2] == (B, 1) + if mask_inputs.shape[-2:] != self.sam_prompt_encoder.mask_input_size: + sam_mask_prompt = F.interpolate( + mask_inputs.float(), + size=self.sam_prompt_encoder.mask_input_size, + align_corners=False, + mode="bilinear", + antialias=True, # use antialias for downsampling + ) + else: + sam_mask_prompt = mask_inputs + else: + # Otherwise, simply feed None (and SAM's prompt encoder will add + # a learned `no_mask_embed` to indicate no mask input in this case). + sam_mask_prompt = None + + sparse_embeddings, dense_embeddings = self.sam_prompt_encoder( + points=(sam_point_coords, sam_point_labels), + boxes=None, + masks=sam_mask_prompt, + ) + ( + low_res_multimasks, + ious, + sam_output_tokens, + object_score_logits, + ) = self.sam_mask_decoder( + image_embeddings=backbone_features, + image_pe=self.sam_prompt_encoder.get_dense_pe(), + sparse_prompt_embeddings=sparse_embeddings, + dense_prompt_embeddings=dense_embeddings, + multimask_output=multimask_output, + repeat_image=False, # the image is already batched + high_res_features=high_res_features, + ) + if self.pred_obj_scores: + is_obj_appearing = object_score_logits > 0 + + # Mask used for spatial memories is always a *hard* choice between obj and no obj, + # consistent with the actual mask prediction + low_res_multimasks = torch.where( + is_obj_appearing[:, None, None], + low_res_multimasks, + NO_OBJ_SCORE, + ) + + # convert masks from possibly bfloat16 (or float16) to float32 + # (older PyTorch versions before 2.1 don't support `interpolate` on bf16) + low_res_multimasks = low_res_multimasks.float() + high_res_multimasks = F.interpolate( + low_res_multimasks, + size=(self.image_size, self.image_size), + mode="bilinear", + align_corners=False, + ) + + sam_output_token = sam_output_tokens[:, 0] + if multimask_output: + # take the best mask prediction (with the highest IoU estimation) + best_iou_inds = torch.argmax(ious, dim=-1) + batch_inds = torch.arange(B, device=device) + low_res_masks = low_res_multimasks[batch_inds, best_iou_inds].unsqueeze(1) + high_res_masks = high_res_multimasks[batch_inds, best_iou_inds].unsqueeze(1) + if sam_output_tokens.size(1) > 1: + sam_output_token = sam_output_tokens[batch_inds, best_iou_inds] + else: + low_res_masks, high_res_masks = low_res_multimasks, high_res_multimasks + + # Extract object pointer from the SAM output token (with occlusion handling) + obj_ptr = self.obj_ptr_proj(sam_output_token) + if self.pred_obj_scores: + # Allow *soft* no obj ptr, unlike for masks + if self.soft_no_obj_ptr: + lambda_is_obj_appearing = object_score_logits.sigmoid() + else: + lambda_is_obj_appearing = is_obj_appearing.float() + + if self.fixed_no_obj_ptr: + obj_ptr = lambda_is_obj_appearing * obj_ptr + obj_ptr = obj_ptr + (1 - lambda_is_obj_appearing) * self.no_obj_ptr + + return ( + low_res_multimasks, + high_res_multimasks, + ious, + low_res_masks, + high_res_masks, + obj_ptr, + object_score_logits, + ) + + def _use_mask_as_output(self, backbone_features, high_res_features, mask_inputs): + """ + Directly turn binary `mask_inputs` into a output mask logits without using SAM. + (same input and output shapes as in _forward_sam_heads above). + """ + # Use -10/+10 as logits for neg/pos pixels (very close to 0/1 in prob after sigmoid). + out_scale, out_bias = 20.0, -10.0 # sigmoid(-10.0)=4.5398e-05 + mask_inputs_float = mask_inputs.float() + high_res_masks = mask_inputs_float * out_scale + out_bias + low_res_masks = F.interpolate( + high_res_masks, + size=(high_res_masks.size(-2) // 4, high_res_masks.size(-1) // 4), + align_corners=False, + mode="bilinear", + antialias=True, # use antialias for downsampling + ) + # a dummy IoU prediction of all 1's under mask input + ious = mask_inputs.new_ones(mask_inputs.size(0), 1).float() + if not self.use_obj_ptrs_in_encoder: + # all zeros as a dummy object pointer (of shape [B, C]) + obj_ptr = torch.zeros( + mask_inputs.size(0), self.hidden_dim, device=mask_inputs.device + ) + else: + # produce an object pointer using the SAM decoder from the mask input + _, _, _, _, _, obj_ptr, _ = self._forward_sam_heads( + backbone_features=backbone_features, + mask_inputs=self.mask_downsample(mask_inputs_float), + high_res_features=high_res_features, + ) + # In this method, we are treating mask_input as output, e.g. using it directly to create spatial mem; + # Below, we follow the same design axiom to use mask_input to decide if obj appears or not instead of relying + # on the object_scores from the SAM decoder. + is_obj_appearing = torch.any(mask_inputs.flatten(1).float() > 0.0, dim=1) + is_obj_appearing = is_obj_appearing[..., None] + lambda_is_obj_appearing = is_obj_appearing.float() + object_score_logits = out_scale * lambda_is_obj_appearing + out_bias + if self.pred_obj_scores: + if self.fixed_no_obj_ptr: + obj_ptr = lambda_is_obj_appearing * obj_ptr + obj_ptr = obj_ptr + (1 - lambda_is_obj_appearing) * self.no_obj_ptr + + return ( + low_res_masks, + high_res_masks, + ious, + low_res_masks, + high_res_masks, + obj_ptr, + object_score_logits, + ) + + def forward_image(self, img_batch: torch.Tensor): + """Get the image feature on the input batch.""" + backbone_out = self.image_encoder(img_batch) + if self.use_high_res_features_in_sam: + # precompute projected level 0 and level 1 features in SAM decoder + # to avoid running it again on every SAM click + backbone_out["backbone_fpn"][0] = self.sam_mask_decoder.conv_s0( + backbone_out["backbone_fpn"][0] + ) + backbone_out["backbone_fpn"][1] = self.sam_mask_decoder.conv_s1( + backbone_out["backbone_fpn"][1] + ) + return backbone_out + + def _prepare_backbone_features(self, backbone_out): + """Prepare and flatten visual features.""" + backbone_out = backbone_out.copy() + assert len(backbone_out["backbone_fpn"]) == len(backbone_out["vision_pos_enc"]) + assert len(backbone_out["backbone_fpn"]) >= self.num_feature_levels + + feature_maps = backbone_out["backbone_fpn"][-self.num_feature_levels :] + vision_pos_embeds = backbone_out["vision_pos_enc"][-self.num_feature_levels :] + + feat_sizes = [(x.shape[-2], x.shape[-1]) for x in vision_pos_embeds] + # flatten NxCxHxW to HWxNxC + vision_feats = [x.flatten(2).permute(2, 0, 1) for x in feature_maps] + vision_pos_embeds = [x.flatten(2).permute(2, 0, 1) for x in vision_pos_embeds] + + return backbone_out, vision_feats, vision_pos_embeds, feat_sizes + + def _prepare_memory_conditioned_features( + self, + frame_idx, + is_init_cond_frame, + current_vision_feats, + current_vision_pos_embeds, + feat_sizes, + output_dict, + num_frames, + track_in_reverse=False, # tracking in reverse time order (for demo usage) + ): + """Fuse the current frame's visual feature map with previous memory.""" + B = current_vision_feats[-1].size(1) # batch size on this frame + C = self.hidden_dim + H, W = feat_sizes[-1] # top-level (lowest-resolution) feature size + device = current_vision_feats[-1].device + # The case of `self.num_maskmem == 0` below is primarily used for reproducing SAM on images. + # In this case, we skip the fusion with any memory. + if self.num_maskmem == 0: # Disable memory and skip fusion + pix_feat = current_vision_feats[-1].permute(1, 2, 0).view(B, C, H, W) + return pix_feat + + num_obj_ptr_tokens = 0 + tpos_sign_mul = -1 if track_in_reverse else 1 + # Step 1: condition the visual features of the current frame on previous memories + if not is_init_cond_frame: + # Retrieve the memories encoded with the maskmem backbone + to_cat_memory, to_cat_memory_pos_embed = [], [] + # Add conditioning frames's output first (all cond frames have t_pos=0 for + # when getting temporal positional embedding below) + assert len(output_dict["cond_frame_outputs"]) > 0 + # Select a maximum number of temporally closest cond frames for cross attention + cond_outputs = output_dict["cond_frame_outputs"] + selected_cond_outputs, unselected_cond_outputs = select_closest_cond_frames( + frame_idx, cond_outputs, self.max_cond_frames_in_attn + ) + t_pos_and_prevs = [(0, out) for out in selected_cond_outputs.values()] + # Add last (self.num_maskmem - 1) frames before current frame for non-conditioning memory + # the earliest one has t_pos=1 and the latest one has t_pos=self.num_maskmem-1 + # We also allow taking the memory frame non-consecutively (with stride>1), in which case + # we take (self.num_maskmem - 2) frames among every stride-th frames plus the last frame. + stride = 1 if self.training else self.memory_temporal_stride_for_eval + for t_pos in range(1, self.num_maskmem): + t_rel = self.num_maskmem - t_pos # how many frames before current frame + if t_rel == 1: + # for t_rel == 1, we take the last frame (regardless of r) + if not track_in_reverse: + # the frame immediately before this frame (i.e. frame_idx - 1) + prev_frame_idx = frame_idx - t_rel + else: + # the frame immediately after this frame (i.e. frame_idx + 1) + prev_frame_idx = frame_idx + t_rel + else: + # for t_rel >= 2, we take the memory frame from every r-th frames + if not track_in_reverse: + # first find the nearest frame among every r-th frames before this frame + # for r=1, this would be (frame_idx - 2) + prev_frame_idx = ((frame_idx - 2) // stride) * stride + # then seek further among every r-th frames + prev_frame_idx = prev_frame_idx - (t_rel - 2) * stride + else: + # first find the nearest frame among every r-th frames after this frame + # for r=1, this would be (frame_idx + 2) + prev_frame_idx = -(-(frame_idx + 2) // stride) * stride + # then seek further among every r-th frames + prev_frame_idx = prev_frame_idx + (t_rel - 2) * stride + out = output_dict["non_cond_frame_outputs"].get(prev_frame_idx, None) + if out is None: + # If an unselected conditioning frame is among the last (self.num_maskmem - 1) + # frames, we still attend to it as if it's a non-conditioning frame. + out = unselected_cond_outputs.get(prev_frame_idx, None) + t_pos_and_prevs.append((t_pos, out)) + + for t_pos, prev in t_pos_and_prevs: + if prev is None: + continue # skip padding frames + # "maskmem_features" might have been offloaded to CPU in demo use cases, + # so we load it back to GPU (it's a no-op if it's already on GPU). + feats = prev["maskmem_features"].to(device, non_blocking=True) + to_cat_memory.append(feats.flatten(2).permute(2, 0, 1)) + # Spatial positional encoding (it might have been offloaded to CPU in eval) + maskmem_enc = prev["maskmem_pos_enc"][-1].to(device) + maskmem_enc = maskmem_enc.flatten(2).permute(2, 0, 1) + # Temporal positional encoding + maskmem_enc = ( + maskmem_enc + self.maskmem_tpos_enc[self.num_maskmem - t_pos - 1] + ) + to_cat_memory_pos_embed.append(maskmem_enc) + + # Construct the list of past object pointers + if self.use_obj_ptrs_in_encoder: + max_obj_ptrs_in_encoder = min(num_frames, self.max_obj_ptrs_in_encoder) + # First add those object pointers from selected conditioning frames + # (optionally, only include object pointers in the past during evaluation) + if not self.training and self.only_obj_ptrs_in_the_past_for_eval: + ptr_cond_outputs = { + t: out + for t, out in selected_cond_outputs.items() + if (t >= frame_idx if track_in_reverse else t <= frame_idx) + } + else: + ptr_cond_outputs = selected_cond_outputs + pos_and_ptrs = [ + # Temporal pos encoding contains how far away each pointer is from current frame + ( + ( + (frame_idx - t) * tpos_sign_mul + if self.use_signed_tpos_enc_to_obj_ptrs + else abs(frame_idx - t) + ), + out["obj_ptr"], + ) + for t, out in ptr_cond_outputs.items() + ] + # Add up to (max_obj_ptrs_in_encoder - 1) non-conditioning frames before current frame + for t_diff in range(1, max_obj_ptrs_in_encoder): + t = frame_idx + t_diff if track_in_reverse else frame_idx - t_diff + if t < 0 or (num_frames is not None and t >= num_frames): + break + out = output_dict["non_cond_frame_outputs"].get( + t, unselected_cond_outputs.get(t, None) + ) + if out is not None: + pos_and_ptrs.append((t_diff, out["obj_ptr"])) + # If we have at least one object pointer, add them to the across attention + if len(pos_and_ptrs) > 0: + pos_list, ptrs_list = zip(*pos_and_ptrs) + # stack object pointers along dim=0 into [ptr_seq_len, B, C] shape + obj_ptrs = torch.stack(ptrs_list, dim=0) + # a temporal positional embedding based on how far each object pointer is from + # the current frame (sine embedding normalized by the max pointer num). + if self.add_tpos_enc_to_obj_ptrs: + t_diff_max = max_obj_ptrs_in_encoder - 1 + tpos_dim = C if self.proj_tpos_enc_in_obj_ptrs else self.mem_dim + obj_pos = torch.tensor(pos_list, device=device) + obj_pos = get_1d_sine_pe(obj_pos / t_diff_max, dim=tpos_dim) + obj_pos = self.obj_ptr_tpos_proj(obj_pos) + obj_pos = obj_pos.unsqueeze(1).expand(-1, B, self.mem_dim) + else: + obj_pos = obj_ptrs.new_zeros(len(pos_list), B, self.mem_dim) + if self.mem_dim < C: + # split a pointer into (C // self.mem_dim) tokens for self.mem_dim < C + obj_ptrs = obj_ptrs.reshape( + -1, B, C // self.mem_dim, self.mem_dim + ) + obj_ptrs = obj_ptrs.permute(0, 2, 1, 3).flatten(0, 1) + obj_pos = obj_pos.repeat_interleave(C // self.mem_dim, dim=0) + to_cat_memory.append(obj_ptrs) + to_cat_memory_pos_embed.append(obj_pos) + num_obj_ptr_tokens = obj_ptrs.shape[0] + else: + num_obj_ptr_tokens = 0 + else: + # for initial conditioning frames, encode them without using any previous memory + if self.directly_add_no_mem_embed: + # directly add no-mem embedding (instead of using the transformer encoder) + pix_feat_with_mem = current_vision_feats[-1] + self.no_mem_embed + pix_feat_with_mem = pix_feat_with_mem.permute(1, 2, 0).view(B, C, H, W) + return pix_feat_with_mem + + # Use a dummy token on the first frame (to avoid empty memory input to tranformer encoder) + to_cat_memory = [self.no_mem_embed.expand(1, B, self.mem_dim)] + to_cat_memory_pos_embed = [self.no_mem_pos_enc.expand(1, B, self.mem_dim)] + + # Step 2: Concatenate the memories and forward through the transformer encoder + memory = torch.cat(to_cat_memory, dim=0) + memory_pos_embed = torch.cat(to_cat_memory_pos_embed, dim=0) + + pix_feat_with_mem = self.memory_attention( + curr=current_vision_feats, + curr_pos=current_vision_pos_embeds, + memory=memory, + memory_pos=memory_pos_embed, + num_obj_ptr_tokens=num_obj_ptr_tokens, + ) + # reshape the output (HW)BC => BCHW + pix_feat_with_mem = pix_feat_with_mem.permute(1, 2, 0).view(B, C, H, W) + return pix_feat_with_mem + + def _encode_new_memory( + self, + current_vision_feats, + feat_sizes, + pred_masks_high_res, + object_score_logits, + is_mask_from_pts, + ): + """Encode the current image and its prediction into a memory feature.""" + B = current_vision_feats[-1].size(1) # batch size on this frame + C = self.hidden_dim + H, W = feat_sizes[-1] # top-level (lowest-resolution) feature size + # top-level feature, (HW)BC => BCHW + pix_feat = current_vision_feats[-1].permute(1, 2, 0).view(B, C, H, W) + if self.non_overlap_masks_for_mem_enc and not self.training: + # optionally, apply non-overlapping constraints to the masks (it's applied + # in the batch dimension and should only be used during eval, where all + # the objects come from the same video under batch size 1). + pred_masks_high_res = self._apply_non_overlapping_constraints( + pred_masks_high_res + ) + # scale the raw mask logits with a temperature before applying sigmoid + binarize = self.binarize_mask_from_pts_for_mem_enc and is_mask_from_pts + if binarize and not self.training: + mask_for_mem = (pred_masks_high_res > 0).float() + else: + # apply sigmoid on the raw mask logits to turn them into range (0, 1) + mask_for_mem = torch.sigmoid(pred_masks_high_res) + # apply scale and bias terms to the sigmoid probabilities + if self.sigmoid_scale_for_mem_enc != 1.0: + mask_for_mem = mask_for_mem * self.sigmoid_scale_for_mem_enc + if self.sigmoid_bias_for_mem_enc != 0.0: + mask_for_mem = mask_for_mem + self.sigmoid_bias_for_mem_enc + maskmem_out = self.memory_encoder( + pix_feat, mask_for_mem, skip_mask_sigmoid=True # sigmoid already applied + ) + maskmem_features = maskmem_out["vision_features"] + maskmem_pos_enc = maskmem_out["vision_pos_enc"] + # add a no-object embedding to the spatial memory to indicate that the frame + # is predicted to be occluded (i.e. no object is appearing in the frame) + if self.no_obj_embed_spatial is not None: + is_obj_appearing = (object_score_logits > 0).float() + maskmem_features += ( + 1 - is_obj_appearing[..., None, None] + ) * self.no_obj_embed_spatial[..., None, None].expand( + *maskmem_features.shape + ) + + return maskmem_features, maskmem_pos_enc + + def _track_step( + self, + frame_idx, + is_init_cond_frame, + current_vision_feats, + current_vision_pos_embeds, + feat_sizes, + point_inputs, + mask_inputs, + output_dict, + num_frames, + track_in_reverse, + prev_sam_mask_logits, + ): + current_out = {"point_inputs": point_inputs, "mask_inputs": mask_inputs} + # High-resolution feature maps for the SAM head, reshape (HW)BC => BCHW + if len(current_vision_feats) > 1: + high_res_features = [ + x.permute(1, 2, 0).view(x.size(1), x.size(2), *s) + for x, s in zip(current_vision_feats[:-1], feat_sizes[:-1]) + ] + else: + high_res_features = None + if mask_inputs is not None and self.use_mask_input_as_output_without_sam: + # When use_mask_input_as_output_without_sam=True, we directly output the mask input + # (see it as a GT mask) without using a SAM prompt encoder + mask decoder. + pix_feat = current_vision_feats[-1].permute(1, 2, 0) + pix_feat = pix_feat.view(-1, self.hidden_dim, *feat_sizes[-1]) + sam_outputs = self._use_mask_as_output( + pix_feat, high_res_features, mask_inputs + ) + else: + # fused the visual feature with previous memory features in the memory bank + pix_feat = self._prepare_memory_conditioned_features( + frame_idx=frame_idx, + is_init_cond_frame=is_init_cond_frame, + current_vision_feats=current_vision_feats[-1:], + current_vision_pos_embeds=current_vision_pos_embeds[-1:], + feat_sizes=feat_sizes[-1:], + output_dict=output_dict, + num_frames=num_frames, + track_in_reverse=track_in_reverse, + ) + # apply SAM-style segmentation head + # here we might feed previously predicted low-res SAM mask logits into the SAM mask decoder, + # e.g. in demo where such logits come from earlier interaction instead of correction sampling + # (in this case, any `mask_inputs` shouldn't reach here as they are sent to _use_mask_as_output instead) + if prev_sam_mask_logits is not None: + assert point_inputs is not None and mask_inputs is None + mask_inputs = prev_sam_mask_logits + multimask_output = self._use_multimask(is_init_cond_frame, point_inputs) + sam_outputs = self._forward_sam_heads( + backbone_features=pix_feat, + point_inputs=point_inputs, + mask_inputs=mask_inputs, + high_res_features=high_res_features, + multimask_output=multimask_output, + ) + + return current_out, sam_outputs, high_res_features, pix_feat + + def _encode_memory_in_output( + self, + current_vision_feats, + feat_sizes, + point_inputs, + run_mem_encoder, + high_res_masks, + object_score_logits, + current_out, + ): + if run_mem_encoder and self.num_maskmem > 0: + high_res_masks_for_mem_enc = high_res_masks + maskmem_features, maskmem_pos_enc = self._encode_new_memory( + current_vision_feats=current_vision_feats, + feat_sizes=feat_sizes, + pred_masks_high_res=high_res_masks_for_mem_enc, + object_score_logits=object_score_logits, + is_mask_from_pts=(point_inputs is not None), + ) + current_out["maskmem_features"] = maskmem_features + current_out["maskmem_pos_enc"] = maskmem_pos_enc + else: + current_out["maskmem_features"] = None + current_out["maskmem_pos_enc"] = None + + def track_step( + self, + frame_idx, + is_init_cond_frame, + current_vision_feats, + current_vision_pos_embeds, + feat_sizes, + point_inputs, + mask_inputs, + output_dict, + num_frames, + track_in_reverse=False, # tracking in reverse time order (for demo usage) + # Whether to run the memory encoder on the predicted masks. Sometimes we might want + # to skip the memory encoder with `run_mem_encoder=False`. For example, + # in demo we might call `track_step` multiple times for each user click, + # and only encode the memory when the user finalizes their clicks. And in ablation + # settings like SAM training on static images, we don't need the memory encoder. + run_mem_encoder=True, + # The previously predicted SAM mask logits (which can be fed together with new clicks in demo). + prev_sam_mask_logits=None, + ): + current_out, sam_outputs, _, _ = self._track_step( + frame_idx, + is_init_cond_frame, + current_vision_feats, + current_vision_pos_embeds, + feat_sizes, + point_inputs, + mask_inputs, + output_dict, + num_frames, + track_in_reverse, + prev_sam_mask_logits, + ) + + ( + _, + _, + _, + low_res_masks, + high_res_masks, + obj_ptr, + object_score_logits, + ) = sam_outputs + + current_out["pred_masks"] = low_res_masks + current_out["pred_masks_high_res"] = high_res_masks + current_out["obj_ptr"] = obj_ptr + if not self.training: + # Only add this in inference (to avoid unused param in activation checkpointing; + # it's mainly used in the demo to encode spatial memories w/ consolidated masks) + current_out["object_score_logits"] = object_score_logits + + # Finally run the memory encoder on the predicted mask to encode + # it into a new memory feature (that can be used in future frames) + self._encode_memory_in_output( + current_vision_feats, + feat_sizes, + point_inputs, + run_mem_encoder, + high_res_masks, + object_score_logits, + current_out, + ) + + return current_out + + def _use_multimask(self, is_init_cond_frame, point_inputs): + """Whether to use multimask output in the SAM head.""" + num_pts = 0 if point_inputs is None else point_inputs["point_labels"].size(1) + multimask_output = ( + self.multimask_output_in_sam + and (is_init_cond_frame or self.multimask_output_for_tracking) + and (self.multimask_min_pt_num <= num_pts <= self.multimask_max_pt_num) + ) + return multimask_output + + def _apply_non_overlapping_constraints(self, pred_masks): + """ + Apply non-overlapping constraints to the object scores in pred_masks. Here we + keep only the highest scoring object at each spatial location in pred_masks. + """ + batch_size = pred_masks.size(0) + if batch_size == 1: + return pred_masks + + device = pred_masks.device + # "max_obj_inds": object index of the object with the highest score at each location + max_obj_inds = torch.argmax(pred_masks, dim=0, keepdim=True) + # "batch_obj_inds": object index of each object slice (along dim 0) in `pred_masks` + batch_obj_inds = torch.arange(batch_size, device=device)[:, None, None, None] + keep = max_obj_inds == batch_obj_inds + # suppress overlapping regions' scores below -10.0 so that the foreground regions + # don't overlap (here sigmoid(-10.0)=4.5398e-05) + pred_masks = torch.where(keep, pred_masks, torch.clamp(pred_masks, max=-10.0)) + return pred_masks diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam2_utils.py b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam2_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..ad00a7661444f561ae0cb49d6456215e65bec647 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/modeling/sam2_utils.py @@ -0,0 +1,323 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + + +import copy +from typing import Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..utils.misc import mask_to_box + + +def select_closest_cond_frames(frame_idx, cond_frame_outputs, max_cond_frame_num): + """ + Select up to `max_cond_frame_num` conditioning frames from `cond_frame_outputs` + that are temporally closest to the current frame at `frame_idx`. Here, we take + - a) the closest conditioning frame before `frame_idx` (if any); + - b) the closest conditioning frame after `frame_idx` (if any); + - c) any other temporally closest conditioning frames until reaching a total + of `max_cond_frame_num` conditioning frames. + + Outputs: + - selected_outputs: selected items (keys & values) from `cond_frame_outputs`. + - unselected_outputs: items (keys & values) not selected in `cond_frame_outputs`. + """ + if max_cond_frame_num == -1 or len(cond_frame_outputs) <= max_cond_frame_num: + selected_outputs = cond_frame_outputs + unselected_outputs = {} + else: + assert max_cond_frame_num >= 2, "we should allow using 2+ conditioning frames" + selected_outputs = {} + + # the closest conditioning frame before `frame_idx` (if any) + idx_before = max((t for t in cond_frame_outputs if t < frame_idx), default=None) + if idx_before is not None: + selected_outputs[idx_before] = cond_frame_outputs[idx_before] + + # the closest conditioning frame after `frame_idx` (if any) + idx_after = min((t for t in cond_frame_outputs if t >= frame_idx), default=None) + if idx_after is not None: + selected_outputs[idx_after] = cond_frame_outputs[idx_after] + + # add other temporally closest conditioning frames until reaching a total + # of `max_cond_frame_num` conditioning frames. + num_remain = max_cond_frame_num - len(selected_outputs) + inds_remain = sorted( + (t for t in cond_frame_outputs if t not in selected_outputs), + key=lambda x: abs(x - frame_idx), + )[:num_remain] + selected_outputs.update((t, cond_frame_outputs[t]) for t in inds_remain) + unselected_outputs = { + t: v for t, v in cond_frame_outputs.items() if t not in selected_outputs + } + + return selected_outputs, unselected_outputs + + +def get_1d_sine_pe(pos_inds, dim, temperature=10000): + """ + Get 1D sine positional embedding as in the original Transformer paper. + """ + pe_dim = dim // 2 + dim_t = torch.arange(pe_dim, dtype=torch.float32, device=pos_inds.device) + dim_t = temperature ** (2 * (dim_t // 2) / pe_dim) + + pos_embed = pos_inds.unsqueeze(-1) / dim_t + pos_embed = torch.cat([pos_embed.sin(), pos_embed.cos()], dim=-1) + return pos_embed + + +def get_activation_fn(activation): + """Return an activation function given a string""" + if activation == "relu": + return F.relu + if activation == "gelu": + return F.gelu + if activation == "glu": + return F.glu + raise RuntimeError(f"activation should be relu/gelu, not {activation}.") + + +def get_clones(module, N): + return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) + + +class DropPath(nn.Module): + # adapted from https://github.com/huggingface/pytorch-image-models/blob/main/timm/layers/drop.py + def __init__(self, drop_prob=0.0, scale_by_keep=True): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + self.scale_by_keep = scale_by_keep + + def forward(self, x): + if self.drop_prob == 0.0 or not self.training: + return x + keep_prob = 1 - self.drop_prob + shape = (x.shape[0],) + (1,) * (x.ndim - 1) + random_tensor = x.new_empty(shape).bernoulli_(keep_prob) + if keep_prob > 0.0 and self.scale_by_keep: + random_tensor.div_(keep_prob) + return x * random_tensor + + +# Lightly adapted from +# https://github.com/facebookresearch/MaskFormer/blob/main/mask_former/modeling/transformer/transformer_predictor.py # noqa +class MLP(nn.Module): + def __init__( + self, + input_dim: int, + hidden_dim: int, + output_dim: int, + num_layers: int, + activation: nn.Module = nn.ReLU, + sigmoid_output: bool = False, + ) -> None: + super().__init__() + self.num_layers = num_layers + h = [hidden_dim] * (num_layers - 1) + self.layers = nn.ModuleList( + nn.Linear(n, k) for n, k in zip([input_dim] + h, h + [output_dim]) + ) + self.sigmoid_output = sigmoid_output + self.act = activation() + + def forward(self, x): + for i, layer in enumerate(self.layers): + x = self.act(layer(x)) if i < self.num_layers - 1 else layer(x) + if self.sigmoid_output: + x = F.sigmoid(x) + return x + + +# From https://github.com/facebookresearch/detectron2/blob/main/detectron2/layers/batch_norm.py # noqa +# Itself from https://github.com/facebookresearch/ConvNeXt/blob/d1fa8f6fef0a165b27399986cc2bdacc92777e40/models/convnext.py#L119 # noqa +class LayerNorm2d(nn.Module): + def __init__(self, num_channels: int, eps: float = 1e-6) -> None: + super().__init__() + self.weight = nn.Parameter(torch.ones(num_channels)) + self.bias = nn.Parameter(torch.zeros(num_channels)) + self.eps = eps + + def forward(self, x: torch.Tensor) -> torch.Tensor: + u = x.mean(1, keepdim=True) + s = (x - u).pow(2).mean(1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.eps) + x = self.weight[:, None, None] * x + self.bias[:, None, None] + return x + + +def sample_box_points( + masks: torch.Tensor, + noise: float = 0.1, # SAM default + noise_bound: int = 20, # SAM default + top_left_label: int = 2, + bottom_right_label: int = 3, +) -> Tuple[np.array, np.array]: + """ + Sample a noised version of the top left and bottom right corners of a given `bbox` + + Inputs: + - masks: [B, 1, H,W] boxes, dtype=torch.Tensor + - noise: noise as a fraction of box width and height, dtype=float + - noise_bound: maximum amount of noise (in pure pixesl), dtype=int + + Returns: + - box_coords: [B, num_pt, 2], contains (x, y) coordinates of top left and bottom right box corners, dtype=torch.float + - box_labels: [B, num_pt], label 2 is reserverd for top left and 3 for bottom right corners, dtype=torch.int32 + """ + device = masks.device + box_coords = mask_to_box(masks) + B, _, H, W = masks.shape + box_labels = torch.tensor( + [top_left_label, bottom_right_label], dtype=torch.int, device=device + ).repeat(B) + if noise > 0.0: + if not isinstance(noise_bound, torch.Tensor): + noise_bound = torch.tensor(noise_bound, device=device) + bbox_w = box_coords[..., 2] - box_coords[..., 0] + bbox_h = box_coords[..., 3] - box_coords[..., 1] + max_dx = torch.min(bbox_w * noise, noise_bound) + max_dy = torch.min(bbox_h * noise, noise_bound) + box_noise = 2 * torch.rand(B, 1, 4, device=device) - 1 + box_noise = box_noise * torch.stack((max_dx, max_dy, max_dx, max_dy), dim=-1) + + box_coords = box_coords + box_noise + img_bounds = ( + torch.tensor([W, H, W, H], device=device) - 1 + ) # uncentered pixel coords + box_coords.clamp_(torch.zeros_like(img_bounds), img_bounds) # In place clamping + + box_coords = box_coords.reshape(-1, 2, 2) # always 2 points + box_labels = box_labels.reshape(-1, 2) + return box_coords, box_labels + + +def sample_random_points_from_errors(gt_masks, pred_masks, num_pt=1): + """ + Sample `num_pt` random points (along with their labels) independently from the error regions. + + Inputs: + - gt_masks: [B, 1, H_im, W_im] masks, dtype=torch.bool + - pred_masks: [B, 1, H_im, W_im] masks, dtype=torch.bool or None + - num_pt: int, number of points to sample independently for each of the B error maps + + Outputs: + - points: [B, num_pt, 2], dtype=torch.float, contains (x, y) coordinates of each sampled point + - labels: [B, num_pt], dtype=torch.int32, where 1 means positive clicks and 0 means + negative clicks + """ + if pred_masks is None: # if pred_masks is not provided, treat it as empty + pred_masks = torch.zeros_like(gt_masks) + assert gt_masks.dtype == torch.bool and gt_masks.size(1) == 1 + assert pred_masks.dtype == torch.bool and pred_masks.shape == gt_masks.shape + assert num_pt >= 0 + + B, _, H_im, W_im = gt_masks.shape + device = gt_masks.device + + # false positive region, a new point sampled in this region should have + # negative label to correct the FP error + fp_masks = ~gt_masks & pred_masks + # false negative region, a new point sampled in this region should have + # positive label to correct the FN error + fn_masks = gt_masks & ~pred_masks + # whether the prediction completely match the ground-truth on each mask + all_correct = torch.all((gt_masks == pred_masks).flatten(2), dim=2) + all_correct = all_correct[..., None, None] + + # channel 0 is FP map, while channel 1 is FN map + pts_noise = torch.rand(B, num_pt, H_im, W_im, 2, device=device) + # sample a negative new click from FP region or a positive new click + # from FN region, depend on where the maximum falls, + # and in case the predictions are all correct (no FP or FN), we just + # sample a negative click from the background region + pts_noise[..., 0] *= fp_masks | (all_correct & ~gt_masks) + pts_noise[..., 1] *= fn_masks + pts_idx = pts_noise.flatten(2).argmax(dim=2) + labels = (pts_idx % 2).to(torch.int32) + pts_idx = pts_idx // 2 + pts_x = pts_idx % W_im + pts_y = pts_idx // W_im + points = torch.stack([pts_x, pts_y], dim=2).to(torch.float) + return points, labels + + +def sample_one_point_from_error_center(gt_masks, pred_masks, padding=True): + """ + Sample 1 random point (along with its label) from the center of each error region, + that is, the point with the largest distance to the boundary of each error region. + This is the RITM sampling method from https://github.com/saic-vul/ritm_interactive_segmentation/blob/master/isegm/inference/clicker.py + + Inputs: + - gt_masks: [B, 1, H_im, W_im] masks, dtype=torch.bool + - pred_masks: [B, 1, H_im, W_im] masks, dtype=torch.bool or None + - padding: if True, pad with boundary of 1 px for distance transform + + Outputs: + - points: [B, 1, 2], dtype=torch.float, contains (x, y) coordinates of each sampled point + - labels: [B, 1], dtype=torch.int32, where 1 means positive clicks and 0 means negative clicks + """ + import cv2 + + if pred_masks is None: + pred_masks = torch.zeros_like(gt_masks) + assert gt_masks.dtype == torch.bool and gt_masks.size(1) == 1 + assert pred_masks.dtype == torch.bool and pred_masks.shape == gt_masks.shape + + B, _, _, W_im = gt_masks.shape + device = gt_masks.device + + # false positive region, a new point sampled in this region should have + # negative label to correct the FP error + fp_masks = ~gt_masks & pred_masks + # false negative region, a new point sampled in this region should have + # positive label to correct the FN error + fn_masks = gt_masks & ~pred_masks + + fp_masks = fp_masks.cpu().numpy() + fn_masks = fn_masks.cpu().numpy() + points = torch.zeros(B, 1, 2, dtype=torch.float) + labels = torch.ones(B, 1, dtype=torch.int32) + for b in range(B): + fn_mask = fn_masks[b, 0] + fp_mask = fp_masks[b, 0] + if padding: + fn_mask = np.pad(fn_mask, ((1, 1), (1, 1)), "constant") + fp_mask = np.pad(fp_mask, ((1, 1), (1, 1)), "constant") + # compute the distance of each point in FN/FP region to its boundary + fn_mask_dt = cv2.distanceTransform(fn_mask.astype(np.uint8), cv2.DIST_L2, 0) + fp_mask_dt = cv2.distanceTransform(fp_mask.astype(np.uint8), cv2.DIST_L2, 0) + if padding: + fn_mask_dt = fn_mask_dt[1:-1, 1:-1] + fp_mask_dt = fp_mask_dt[1:-1, 1:-1] + + # take the point in FN/FP region with the largest distance to its boundary + fn_mask_dt_flat = fn_mask_dt.reshape(-1) + fp_mask_dt_flat = fp_mask_dt.reshape(-1) + fn_argmax = np.argmax(fn_mask_dt_flat) + fp_argmax = np.argmax(fp_mask_dt_flat) + is_positive = fn_mask_dt_flat[fn_argmax] > fp_mask_dt_flat[fp_argmax] + pt_idx = fn_argmax if is_positive else fp_argmax + points[b, 0, 0] = pt_idx % W_im # x + points[b, 0, 1] = pt_idx // W_im # y + labels[b, 0] = int(is_positive) + + points = points.to(device) + labels = labels.to(device) + return points, labels + + +def get_next_point(gt_masks, pred_masks, method): + if method == "uniform": + return sample_random_points_from_errors(gt_masks, pred_masks) + elif method == "center": + return sample_one_point_from_error_center(gt_masks, pred_masks) + else: + raise ValueError(f"unknown sampling method {method}") diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/sam2_image_predictor.py b/custom_nodes/comfyui-segment-anything-2/sam2/sam2_image_predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..271a0f04cfaf8f2615bf141f92030ee29911fee4 --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/sam2_image_predictor.py @@ -0,0 +1,446 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +from typing import List, Optional, Tuple, Union + +import numpy as np +import torch +from PIL.Image import Image + +from ..sam2.modeling.sam2_base import SAM2Base + +from ..sam2.utils.transforms import SAM2Transforms + + +class SAM2ImagePredictor: + def __init__( + self, + sam_model: SAM2Base, + mask_threshold=0.0, + max_hole_area=0.0, + max_sprinkle_area=0.0, + ) -> None: + """ + Uses SAM-2 to calculate the image embedding for an image, and then + allow repeated, efficient mask prediction given prompts. + + Arguments: + sam_model (Sam-2): The model to use for mask prediction. + mask_threshold (float): The threshold to use when converting mask logits + to binary masks. Masks are thresholded at 0 by default. + fill_hole_area (int): If fill_hole_area > 0, we fill small holes in up to + the maximum area of fill_hole_area in low_res_masks. + """ + super().__init__() + self.model = sam_model + self._transforms = SAM2Transforms( + resolution=self.model.image_size, + mask_threshold=mask_threshold, + max_hole_area=max_hole_area, + max_sprinkle_area=max_sprinkle_area, + ) + + # Predictor state + self._is_image_set = False + self._features = None + self._orig_hw = None + # Whether the predictor is set for single image or a batch of images + self._is_batch = False + + # Predictor config + self.mask_threshold = mask_threshold + + # Spatial dim for backbone feature maps + self._bb_feat_sizes = [ + (256, 256), + (128, 128), + (64, 64), + ] + + @torch.no_grad() + def set_image( + self, + image: Union[np.ndarray, Image], + ) -> None: + """ + Calculates the image embeddings for the provided image, allowing + masks to be predicted with the 'predict' method. + + Arguments: + image (np.ndarray or PIL Image): The input image to embed in RGB format. The image should be in HWC format if np.ndarray, or WHC format if PIL Image + with pixel values in [0, 255]. + image_format (str): The color format of the image, in ['RGB', 'BGR']. + """ + self.reset_predictor() + # Transform the image to the form expected by the model + if isinstance(image, np.ndarray): + #logging.info("For numpy array image, we assume (HxWxC) format") + self._orig_hw = [image.shape[:2]] + elif isinstance(image, Image): + w, h = image.size + self._orig_hw = [(h, w)] + else: + raise NotImplementedError("Image format not supported") + + input_image = self._transforms(image) + input_image = input_image[None, ...].to(self.device) + + assert ( + len(input_image.shape) == 4 and input_image.shape[1] == 3 + ), f"input_image must be of size 1x3xHxW, got {input_image.shape}" + #logging.info("Computing image embeddings for the provided image...") + backbone_out = self.model.forward_image(input_image) + _, vision_feats, _, _ = self.model._prepare_backbone_features(backbone_out) + # Add no_mem_embed, which is added to the lowest rest feat. map during training on videos + if self.model.directly_add_no_mem_embed: + vision_feats[-1] = vision_feats[-1] + self.model.no_mem_embed + + feats = [ + feat.permute(1, 2, 0).view(1, -1, *feat_size) + for feat, feat_size in zip(vision_feats[::-1], self._bb_feat_sizes[::-1]) + ][::-1] + self._features = {"image_embed": feats[-1], "high_res_feats": feats[:-1]} + self._is_image_set = True + #logging.info("Image embeddings computed.") + + @torch.no_grad() + def set_image_batch( + self, + image_list: List[Union[np.ndarray]], + ) -> None: + """ + Calculates the image embeddings for the provided image batch, allowing + masks to be predicted with the 'predict_batch' method. + + Arguments: + image_list (List[np.ndarray]): The input images to embed in RGB format. The image should be in HWC format if np.ndarray + with pixel values in [0, 255]. + """ + self.reset_predictor() + assert isinstance(image_list, list) + self._orig_hw = [] + for image in image_list: + assert isinstance( + image, np.ndarray + ), "Images are expected to be an np.ndarray in RGB format, and of shape HWC" + self._orig_hw.append(image.shape[:2]) + # Transform the image to the form expected by the model + img_batch = self._transforms.forward_batch(image_list) + img_batch = img_batch.to(self.device) + batch_size = img_batch.shape[0] + assert ( + len(img_batch.shape) == 4 and img_batch.shape[1] == 3 + ), f"img_batch must be of size Bx3xHxW, got {img_batch.shape}" + logging.info("Computing image embeddings for the provided images...") + backbone_out = self.model.forward_image(img_batch) + _, vision_feats, _, _ = self.model._prepare_backbone_features(backbone_out) + # Add no_mem_embed, which is added to the lowest rest feat. map during training on videos + if self.model.directly_add_no_mem_embed: + vision_feats[-1] = vision_feats[-1] + self.model.no_mem_embed + + feats = [ + feat.permute(1, 2, 0).view(batch_size, -1, *feat_size) + for feat, feat_size in zip(vision_feats[::-1], self._bb_feat_sizes[::-1]) + ][::-1] + self._features = {"image_embed": feats[-1], "high_res_feats": feats[:-1]} + self._is_image_set = True + self._is_batch = True + logging.info("Image embeddings computed.") + + def predict_batch( + self, + point_coords_batch: List[np.ndarray] = None, + point_labels_batch: List[np.ndarray] = None, + box_batch: List[np.ndarray] = None, + mask_input_batch: List[np.ndarray] = None, + multimask_output: bool = True, + return_logits: bool = False, + normalize_coords=True, + ) -> Tuple[List[np.ndarray], List[np.ndarray], List[np.ndarray]]: + """This function is very similar to predict(...), however it is used for batched mode, when the model is expected to generate predictions on multiple images. + It returns a tupele of lists of masks, ious, and low_res_masks_logits. + """ + assert self._is_batch, "This function should only be used when in batched mode" + if not self._is_image_set: + raise RuntimeError( + "An image must be set with .set_image_batch(...) before mask prediction." + ) + num_images = len(self._features["image_embed"]) + all_masks = [] + all_ious = [] + all_low_res_masks = [] + for img_idx in range(num_images): + # Transform input prompts + point_coords = ( + point_coords_batch[img_idx] if point_coords_batch is not None else None + ) + point_labels = ( + point_labels_batch[img_idx] if point_labels_batch is not None else None + ) + box = box_batch[img_idx] if box_batch is not None else None + mask_input = ( + mask_input_batch[img_idx] if mask_input_batch is not None else None + ) + mask_input, unnorm_coords, labels, unnorm_box = self._prep_prompts( + point_coords, + point_labels, + box, + mask_input, + normalize_coords, + img_idx=img_idx, + ) + masks, iou_predictions, low_res_masks = self._predict( + unnorm_coords, + labels, + unnorm_box, + mask_input, + multimask_output, + return_logits=return_logits, + img_idx=img_idx, + ) + masks_np = masks.squeeze(0).float().detach().cpu().numpy() + iou_predictions_np = ( + iou_predictions.squeeze(0).float().detach().cpu().numpy() + ) + low_res_masks_np = low_res_masks.squeeze(0).float().detach().cpu().numpy() + all_masks.append(masks_np) + all_ious.append(iou_predictions_np) + all_low_res_masks.append(low_res_masks_np) + + return all_masks, all_ious, all_low_res_masks + + def predict( + self, + point_coords: Optional[np.ndarray] = None, + point_labels: Optional[np.ndarray] = None, + box: Optional[np.ndarray] = None, + mask_input: Optional[np.ndarray] = None, + multimask_output: bool = True, + return_logits: bool = False, + normalize_coords=True, + ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """ + Predict masks for the given input prompts, using the currently set image. + + Arguments: + point_coords (np.ndarray or None): A Nx2 array of point prompts to the + model. Each point is in (X,Y) in pixels. + point_labels (np.ndarray or None): A length N array of labels for the + point prompts. 1 indicates a foreground point and 0 indicates a + background point. + box (np.ndarray or None): A length 4 array given a box prompt to the + model, in XYXY format. + mask_input (np.ndarray): A low resolution mask input to the model, typically + coming from a previous prediction iteration. Has form 1xHxW, where + for SAM, H=W=256. + multimask_output (bool): If true, the model will return three masks. + For ambiguous input prompts (such as a single click), this will often + produce better masks than a single prediction. If only a single + mask is needed, the model's predicted quality score can be used + to select the best mask. For non-ambiguous prompts, such as multiple + input prompts, multimask_output=False can give better results. + return_logits (bool): If true, returns un-thresholded masks logits + instead of a binary mask. + normalize_coords (bool): If true, the point coordinates will be normalized to the range [0,1] and point_coords is expected to be wrt. image dimensions. + + Returns: + (np.ndarray): The output masks in CxHxW format, where C is the + number of masks, and (H, W) is the original image size. + (np.ndarray): An array of length C containing the model's + predictions for the quality of each mask. + (np.ndarray): An array of shape CxHxW, where C is the number + of masks and H=W=256. These low resolution logits can be passed to + a subsequent iteration as mask input. + """ + if not self._is_image_set: + raise RuntimeError( + "An image must be set with .set_image(...) before mask prediction." + ) + + # Transform input prompts + + mask_input, unnorm_coords, labels, unnorm_box = self._prep_prompts( + point_coords, point_labels, box, mask_input, normalize_coords + ) + + masks, iou_predictions, low_res_masks = self._predict( + unnorm_coords, + labels, + unnorm_box, + mask_input, + multimask_output, + return_logits=return_logits, + ) + + masks_np = masks.squeeze(0).float().detach().cpu().numpy() + iou_predictions_np = iou_predictions.squeeze(0).float().detach().cpu().numpy() + low_res_masks_np = low_res_masks.squeeze(0).float().detach().cpu().numpy() + return masks_np, iou_predictions_np, low_res_masks_np + + def _prep_prompts( + self, point_coords, point_labels, box, mask_logits, normalize_coords, img_idx=-1 + ): + + unnorm_coords, labels, unnorm_box, mask_input = None, None, None, None + if point_coords is not None: + assert ( + point_labels is not None + ), "point_labels must be supplied if point_coords is supplied." + point_coords = torch.as_tensor( + point_coords, dtype=torch.float, device=self.device + ) + unnorm_coords = self._transforms.transform_coords( + point_coords, normalize=normalize_coords, orig_hw=self._orig_hw[img_idx] + ) + labels = torch.as_tensor(point_labels, dtype=torch.int, device=self.device) + if len(unnorm_coords.shape) == 2: + unnorm_coords, labels = unnorm_coords[None, ...], labels[None, ...] + if box is not None: + box = torch.as_tensor(box, dtype=torch.float, device=self.device) + unnorm_box = self._transforms.transform_boxes( + box, normalize=normalize_coords, orig_hw=self._orig_hw[img_idx] + ) # Bx2x2 + if mask_logits is not None: + mask_input = torch.as_tensor( + mask_logits, dtype=torch.float, device=self.device + ) + if len(mask_input.shape) == 3: + mask_input = mask_input[None, :, :, :] + return mask_input, unnorm_coords, labels, unnorm_box + + @torch.no_grad() + def _predict( + self, + point_coords: Optional[torch.Tensor], + point_labels: Optional[torch.Tensor], + boxes: Optional[torch.Tensor] = None, + mask_input: Optional[torch.Tensor] = None, + multimask_output: bool = True, + return_logits: bool = False, + img_idx: int = -1, + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ + Predict masks for the given input prompts, using the currently set image. + Input prompts are batched torch tensors and are expected to already be + transformed to the input frame using SAM2Transforms. + + Arguments: + point_coords (torch.Tensor or None): A BxNx2 array of point prompts to the + model. Each point is in (X,Y) in pixels. + point_labels (torch.Tensor or None): A BxN array of labels for the + point prompts. 1 indicates a foreground point and 0 indicates a + background point. + boxes (np.ndarray or None): A Bx4 array given a box prompt to the + model, in XYXY format. + mask_input (np.ndarray): A low resolution mask input to the model, typically + coming from a previous prediction iteration. Has form Bx1xHxW, where + for SAM, H=W=256. Masks returned by a previous iteration of the + predict method do not need further transformation. + multimask_output (bool): If true, the model will return three masks. + For ambiguous input prompts (such as a single click), this will often + produce better masks than a single prediction. If only a single + mask is needed, the model's predicted quality score can be used + to select the best mask. For non-ambiguous prompts, such as multiple + input prompts, multimask_output=False can give better results. + return_logits (bool): If true, returns un-thresholded masks logits + instead of a binary mask. + + Returns: + (torch.Tensor): The output masks in BxCxHxW format, where C is the + number of masks, and (H, W) is the original image size. + (torch.Tensor): An array of shape BxC containing the model's + predictions for the quality of each mask. + (torch.Tensor): An array of shape BxCxHxW, where C is the number + of masks and H=W=256. These low res logits can be passed to + a subsequent iteration as mask input. + """ + if not self._is_image_set: + raise RuntimeError( + "An image must be set with .set_image(...) before mask prediction." + ) + + if point_coords is not None: + concat_points = (point_coords, point_labels) + else: + concat_points = None + + # Embed prompts + if boxes is not None: + box_coords = boxes.reshape(-1, 2, 2) + box_labels = torch.tensor([[2, 3]], dtype=torch.int, device=boxes.device) + box_labels = box_labels.repeat(boxes.size(0), 1) + # we merge "boxes" and "points" into a single "concat_points" input (where + # boxes are added at the beginning) to sam_prompt_encoder + if concat_points is not None: + concat_coords = torch.cat([box_coords, concat_points[0]], dim=1) + concat_labels = torch.cat([box_labels, concat_points[1]], dim=1) + concat_points = (concat_coords, concat_labels) + else: + concat_points = (box_coords, box_labels) + + sparse_embeddings, dense_embeddings = self.model.sam_prompt_encoder( + points=concat_points, + boxes=None, + masks=mask_input, + ) + + # Predict masks + batched_mode = ( + concat_points is not None and concat_points[0].shape[0] > 1 + ) # multi object prediction + high_res_features = [ + feat_level[img_idx].unsqueeze(0) + for feat_level in self._features["high_res_feats"] + ] + low_res_masks, iou_predictions, _, _ = self.model.sam_mask_decoder( + image_embeddings=self._features["image_embed"][img_idx].unsqueeze(0), + image_pe=self.model.sam_prompt_encoder.get_dense_pe(), + sparse_prompt_embeddings=sparse_embeddings, + dense_prompt_embeddings=dense_embeddings, + multimask_output=multimask_output, + repeat_image=batched_mode, + high_res_features=high_res_features, + ) + + # Upscale the masks to the original image resolution + masks = self._transforms.postprocess_masks( + low_res_masks, self._orig_hw[img_idx] + ) + low_res_masks = torch.clamp(low_res_masks, -32.0, 32.0) + if not return_logits: + masks = masks > self.mask_threshold + + return masks, iou_predictions, low_res_masks + + def get_image_embedding(self) -> torch.Tensor: + """ + Returns the image embeddings for the currently set image, with + shape 1xCxHxW, where C is the embedding dimension and (H,W) are + the embedding spatial dimension of SAM (typically C=256, H=W=64). + """ + if not self._is_image_set: + raise RuntimeError( + "An image must be set with .set_image(...) to generate an embedding." + ) + assert ( + self._features is not None + ), "Features must exist if an image has been set." + return self._features["image_embed"] + + @property + def device(self) -> torch.device: + return self.model.device + + def reset_predictor(self) -> None: + """ + Resets the image embeddings and other state variables. + """ + self._is_image_set = False + self._features = None + self._orig_hw = None + self._is_batch = False diff --git a/custom_nodes/comfyui-segment-anything-2/sam2/sam2_video_predictor.py b/custom_nodes/comfyui-segment-anything-2/sam2/sam2_video_predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..9285f13b45f6eac6a07c7ceb8c9bf9404d22f00d --- /dev/null +++ b/custom_nodes/comfyui-segment-anything-2/sam2/sam2_video_predictor.py @@ -0,0 +1,1154 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import warnings +from collections import OrderedDict + +import torch + +from tqdm import tqdm + +from ..sam2.modeling.sam2_base import NO_OBJ_SCORE, SAM2Base +from ..sam2.utils.misc import concat_points, fill_holes_in_mask_scores, load_video_frames + + +class SAM2VideoPredictor(SAM2Base): + """The predictor class to handle user interactions and manage inference states.""" + + def __init__( + self, + fill_hole_area=0, + # whether to apply non-overlapping constraints on the output object masks + non_overlap_masks=False, + # whether to clear non-conditioning memory of the surrounding frames (which may contain outdated information) after adding correction clicks; + # note that this would only apply to *single-object tracking* unless `clear_non_cond_mem_for_multi_obj` is also set to True) + clear_non_cond_mem_around_input=False, + # whether to also clear non-conditioning memory of the surrounding frames (only effective when `clear_non_cond_mem_around_input` is True). + clear_non_cond_mem_for_multi_obj=False, + # if `add_all_frames_to_correct_as_cond` is True, we also append to the conditioning frame list any frame that receives a later correction click + # if `add_all_frames_to_correct_as_cond` is False, we conditioning frame list to only use those initial conditioning frames + add_all_frames_to_correct_as_cond=False, + **kwargs, + ): + super().__init__(**kwargs) + self.fill_hole_area = fill_hole_area + self.non_overlap_masks = non_overlap_masks + self.clear_non_cond_mem_around_input = clear_non_cond_mem_around_input + self.clear_non_cond_mem_for_multi_obj = clear_non_cond_mem_for_multi_obj + self.add_all_frames_to_correct_as_cond = add_all_frames_to_correct_as_cond + + @torch.inference_mode() + def init_state( + self, + images, + video_height, + video_width, + device='cuda', + offload_video_to_cpu=False, + offload_state_to_cpu=False, + async_loading_frames=False, + ): + """Initialize a inference state.""" + # images, video_height, video_width = load_video_frames( + # video_path=video_path, + # image_size=self.image_size, + # offload_video_to_cpu=offload_video_to_cpu, + # async_loading_frames=async_loading_frames, + # ) + inference_state = {} + inference_state["images"] = images + inference_state["num_frames"] = len(images) + # whether to offload the video frames to CPU memory + # turning on this option saves the GPU memory with only a very small overhead + inference_state["offload_video_to_cpu"] = offload_video_to_cpu + # whether to offload the inference state to CPU memory + # turning on this option saves the GPU memory at the cost of a lower tracking fps + # (e.g. in a test case of 768x768 model, fps dropped from 27 to 24 when tracking one object + # and from 24 to 21 when tracking two objects) + inference_state["offload_state_to_cpu"] = offload_state_to_cpu + # the original video height and width, used for resizing final output scores + inference_state["video_height"] = video_height + inference_state["video_width"] = video_width + inference_state["device"] = torch.device(device) + if offload_state_to_cpu: + inference_state["storage_device"] = torch.device("cpu") + else: + inference_state["storage_device"] = torch.device(device) + # inputs on each frame + inference_state["point_inputs_per_obj"] = {} + inference_state["mask_inputs_per_obj"] = {} + # visual features on a small number of recently visited frames for quick interactions + inference_state["cached_features"] = {} + # values that don't change across frames (so we only need to hold one copy of them) + inference_state["constants"] = {} + # mapping between client-side object id and model-side object index + inference_state["obj_id_to_idx"] = OrderedDict() + inference_state["obj_idx_to_id"] = OrderedDict() + inference_state["obj_ids"] = [] + # A storage to hold the model's tracking results and states on each frame + inference_state["output_dict"] = { + "cond_frame_outputs": {}, # dict containing {frame_idx: