├── src ├── application.js ├── controllers │ ├── application.js │ ├── index.js │ └── prompts │ │ └── upload_controller.js └── vendor │ ├── postie │ ├── dataEnricher.js │ ├── exifMetadataExtractor.js │ ├── parseMetadata.js │ └── modelHashes.js │ └── @hotwired │ └── stimulus-loading │ └── stimulus-loading.js ├── .gitignore ├── prompt-upload.css ├── LICENSE ├── README.md └── index.html /src/application.js: -------------------------------------------------------------------------------- 1 | import "controllers" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | test-images/*.png 2 | test-images/*.jpg 3 | .DS_Store 4 | dev/fetch-models.html 5 | dev/fetch-versions.html 6 | -------------------------------------------------------------------------------- /src/controllers/application.js: -------------------------------------------------------------------------------- 1 | import { Application } from "@hotwired/stimulus" 2 | 3 | const application = Application.start() 4 | 5 | // Configure Stimulus development experience 6 | application.debug = false 7 | window.Stimulus = application 8 | 9 | export { application } 10 | -------------------------------------------------------------------------------- /prompt-upload.css: -------------------------------------------------------------------------------- 1 | .prompt-upload-container { 2 | height: 80vh; 3 | } 4 | 5 | .prompt-upload-container h1 { 6 | font-size: 2rem; 7 | } 8 | 9 | .filepond--root .filepond--drop-label { 10 | height: 100%; 11 | } 12 | 13 | .prompt-upload-metadata-area { 14 | position: relative; 15 | } 16 | 17 | .prompt-upload-form-area{ 18 | height: 100%; 19 | } 20 | 21 | .prompt-upload-btn-area { 22 | position: absolute; 23 | bottom: 0px; 24 | padding: 1.5em 1em 0 1em; 25 | border-top: 1px solid rgba(0, 0, 0, 0.03); 26 | } -------------------------------------------------------------------------------- /src/controllers/index.js: -------------------------------------------------------------------------------- 1 | // Import and register all your controllers from the importmap under controllers/* 2 | 3 | import { application } from "controllers/application" 4 | 5 | // Eager load all controllers defined in the import map under controllers/**/*_controller 6 | import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading" 7 | eagerLoadControllersFrom("controllers", application) 8 | 9 | // Lazy load controllers as they appear in the DOM (remember not to preload controllers in import map!) 10 | // import { lazyLoadControllersFrom } from "@hotwired/stimulus-loading" 11 | // lazyLoadControllersFrom("controllers", application); 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 HE1CO 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prompt Metadata Checker for Stable Diffusion Images 2 | 3 | Reads the metadata of an AI generated image (using the `Exif` or `tEXT` enclosed in that image file). Populates the prompt, seed, sampler, and more. Known to work well with images generated using AUTOMATIC1111, InvokeAI or NMKD. Supports both `.png` and `.jpeg` images. 4 | 5 | If you run into any issues: please open up an Issue here on Github or talk to us on Discord. 6 | 7 | This is a port into PromptHero of a community extension originally made by [@HE1CO](https://github.com/HE1CO/Postie) and later revamped by [@drhino](https://github.com/drhino) 8 | 9 | 10 | ## Motivation 11 | This is what we use in [our prompt upload page](https://prompthero.com/prompt/upload). When you drop a valid image generated with A1111 or a supported program, this is what auto-fills all the fields in the page. 12 | 13 | ## Contribute 14 | If you would like for PromptHero to support reading the metadata of other file formats or images generated by other programs, please feel free to open a pull request! 15 | 16 | ## How to develop 17 | The heavy-lifting work is done in the JS files found under `src/vendor/postie`. That's where most of the original browser extension's code has been imported. 18 | 19 | The `src/controllers` folder holds the [Stimulus](https://github.com/hotwired/stimulus) controller that manages the user interface found in `index.html` 20 | 21 | JavaScript code is imported/managed using [Import Maps](https://www.honeybadger.io/blog/import-maps). The project importmap is found in `index.html` 22 | 23 | To develop, just open `index.html` in a web browser and edit the relevant JS files. No JS tooling required. 24 | 25 | ## Features 26 | - Automagically fills upload info in the form after you choose a file 27 | - Works with images generated by [Stable Diffusion web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui), [InvokeAI](https://github.com/invoke-ai/InvokeAI), and [NMKD](https://nmkd.itch.io/t2i-gui) 28 | 29 | ## Limitations 30 | 31 | - NMKD: The model hash is not saved in the PNG metadata, so the model name and version can't be auto-filled 32 | - General: Inpainting overwrites the original prompt info, so the extension will autofill the inpaint prompt 33 | -------------------------------------------------------------------------------- /src/vendor/postie/dataEnricher.js: -------------------------------------------------------------------------------- 1 | import hashes from "vendor/postie/modelHashes" 2 | 3 | const findModelByHash = hash => { 4 | if (hash) { 5 | for (const [model, versions] of Object.entries(hashes)) { 6 | for (const [version, hashes] of Object.entries(versions)) { 7 | 8 | // Matches hash from Civit AI 9 | if (hashes.includes(hash.toUpperCase())) { 10 | return { model, version } 11 | } 12 | 13 | // Matches hash from Hugging Face 14 | if (hashes.includes(hash.toLowerCase())) { 15 | return { model, version } 16 | } 17 | } 18 | } 19 | } 20 | 21 | return { model: undefined, version: undefined } 22 | } 23 | 24 | 25 | /** 26 | * @param {string} sampler 27 | * @returns {string} 28 | */ 29 | const findSamplerByName = sampler => { 30 | // @TODO: are these mappings correct? and complete? 31 | const samplersDict = { 32 | "ddim": ["DDIM", "ddim"], 33 | "plms": ["PLMS", "plms"], 34 | "k_lms": ["LMS", "k_lms"], 35 | "k_euler_ancestral": ["Euler a", "k_euler_a", "k_euler_ancestral"], 36 | "k_euler": ["Euler", "k_euler"], 37 | "k_heun": ["Heun", "k_heun"], 38 | "k_dpm_2": ["DPM2", "k_dpm_2"], 39 | "k_dpm_2_ancestral": ["DPM2 a", "k_dpm_2_a", "k_dpm_2_ancestral"], 40 | "dpm++_2_ancestral": ["k_dpmpp_2_ancestral", "k_dpmpp_2_a"], 41 | "dpm++_2s_ancestral": ["DPM++ 2S a"], 42 | "dpm++_2": ["k_dpmpp_2"], 43 | "dpm++_2m": ["DPM++ 2M"], 44 | "dpm++_sde": ["DPM++ SDE"], 45 | "dpm++_sde_karras": ["DPM++ SDE Karras"], 46 | "dpm_fast": ["DPM fast", "k_dpm_fast"], 47 | "dpm_adaptive": ["DPM adaptive", "k_dpm_adaptive"], 48 | "dpm2_karras": ["DPM2 Karras", "k_dpm_2_karras"], 49 | "dpm2_ancestral_karras": ["DPM2 a Karras", "k_dpm_2_ancestral_karras"], 50 | "dpm++_2s_ancestral_karras": ["DPM++ 2S a Karras", "k_dpmpp_2_ancestral_karras"], 51 | "dpm++_2m_karras": ["DPM++ 2M Karras", "k_dpmpp_2_karras"], 52 | "lms_karras": ["LMS Karras", "k_lms_karras"], 53 | } 54 | 55 | return Object.keys(samplersDict).find( 56 | x => x === sampler.toLowerCase() || samplersDict[x].includes(sampler) 57 | ) ?? sampler 58 | } 59 | 60 | 61 | /** 62 | * @param {string} hires_upscaler 63 | * @returns {string} 64 | */ 65 | const findUpscaler = hires_upscaler => { 66 | if (hires_upscaler && hires_upscaler.indexOf('ESRGAN 4x') !== -1) { 67 | return 'ESRGAN 4x' 68 | } 69 | else if (hires_upscaler && hires_upscaler.indexOf('CodeFormer') !== -1) { 70 | return 'CodeFormer' 71 | } else { 72 | return '' 73 | } 74 | } 75 | 76 | export { findModelByHash, findSamplerByName, findUpscaler }; -------------------------------------------------------------------------------- /src/vendor/postie/exifMetadataExtractor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns the embedded data of a Stable Diffusion image 3 | * @param {ArrayBuffer} arrayBuffer 4 | * @returns {string} 5 | * @author drhino 6 | */ 7 | const getTextFromImage = arrayBuffer => { 8 | const uint8Array = new Uint8Array(arrayBuffer) 9 | 10 | const compiler = (start, end) => { 11 | if (start < 0) { 12 | end = uint8Array.length 13 | start = end + start 14 | } 15 | 16 | return String.fromCharCode(...uint8Array.slice(start, end)) 17 | } 18 | 19 | const compileInteger = (start, type) => { 20 | switch (type) { 21 | case '16-bit': 22 | return (uint8Array[start] << 8) | uint8Array[start + 1] 23 | 24 | case '32-bit': 25 | return (uint8Array[start] << 24) | 26 | (uint8Array[start + 1] << 16) | 27 | (uint8Array[start + 2] << 8) | 28 | uint8Array[start + 3] 29 | 30 | default: throw new Error(`${type} is invalid (use 16-bit|32-bit)`) 31 | } 32 | } 33 | 34 | /** 35 | * JPEG 36 | */ 37 | if (compiler(0, 2) === 'ÿØ' && compiler(-2) === 'ÿÙ') { 38 | let exif, i = 2 39 | 40 | // @TODO: if multiple APP1 with their own Exif, check for 'User comment' 41 | 42 | while (i < uint8Array.length) { 43 | // APP1 marker (2 bytes) / segmentLength / Exif identifier (6 bytes) 44 | if (compiler(i, i + 2) === 'ÿá' && compiler(i + 4, i + 10) === 'Exif\x00\x00') { 45 | 46 | // NOTE: pattern could differ (@TODO: exhaustive testing) 47 | 48 | // 28 should be fixed, after another 14 exifLength was found, 49 | // which has 4 bytes, and last 4 bytes represent the position, 50 | // which is not the value we want and is already calculated: 51 | const exifStart = i + 28 + 14 + 4 + 4 52 | const exifLength = compileInteger(i + 42, '32-bit') 53 | 54 | // Adds another 9 for 'UNICODE\x00\x00' 55 | exif = compiler(exifStart + 9, exifStart + exifLength) 56 | 57 | break 58 | } 59 | 60 | // Next segment 61 | const segmentLength = compileInteger(i + 2, '16-bit') 62 | i += segmentLength + 2 63 | } 64 | 65 | if (exif === undefined) 66 | throw new Error('Exif segment not found') 67 | 68 | // Returns the value without non-printable characters 69 | return exif.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') 70 | } 71 | 72 | /** 73 | * PNG 74 | */ 75 | if (compiler(0, 8) === '\x89PNG\r\n\x1A\n') { 76 | let chunk, i = 8 77 | 78 | while (i < uint8Array.length) { 79 | // Chunk length (4 bytes, 32-bit integer) 80 | const length = compileInteger(i, '32-bit') 81 | 82 | // Chunk type (next 4 bytes) 83 | if (compiler(i + 4, i + 8) === 'tEXt') { 84 | // Chunk value 85 | chunk = compiler(i + 8, i + 8 + length) 86 | 87 | if (chunk.startsWith('parameters') || chunk.startsWith('sd-metadata')) 88 | break 89 | 90 | chunk = undefined 91 | } 92 | 93 | // Next chunk 94 | i += length + 12 95 | } 96 | 97 | if (chunk === undefined) 98 | throw new Error('tEXt chunk not found') 99 | 100 | // Returns the value after: 'parameters\u0000' or 'sd-metadata\u0000' 101 | return chunk.substr(chunk.indexOf('\u0000') + 1) 102 | } 103 | 104 | // --- 105 | 106 | throw new Error('Only JPEG and PNG files are supported') 107 | } 108 | 109 | 110 | export default getTextFromImage; -------------------------------------------------------------------------------- /src/vendor/@hotwired/stimulus-loading/stimulus-loading.js: -------------------------------------------------------------------------------- 1 | // FIXME: es-module-shim won't shim the dynamic import without this explicit import 2 | import "@hotwired/stimulus" 3 | 4 | const controllerAttribute = "data-controller" 5 | const registeredControllers = {} 6 | 7 | // Eager load all controllers registered beneath the `under` path in the import map to the passed application instance. 8 | export function eagerLoadControllersFrom(under, application) { 9 | const paths = Object.keys(parseImportmapJson()).filter(path => path.match(new RegExp(`^${under}/.*_controller$`))) 10 | paths.forEach(path => registerControllerFromPath(path, under, application)) 11 | } 12 | 13 | function parseImportmapJson() { 14 | return JSON.parse(document.querySelector("script[type=importmap]").text).imports 15 | } 16 | 17 | function registerControllerFromPath(path, under, application) { 18 | const name = path 19 | .replace(new RegExp(`^${under}/`), "") 20 | .replace("_controller", "") 21 | .replace(/\//g, "--") 22 | .replace(/_/g, "-") 23 | 24 | if (!(name in registeredControllers)) { 25 | import(path) 26 | .then(module => registerController(name, module, application)) 27 | .catch(error => console.error(`Failed to register controller: ${name} (${path})`, error)) 28 | } 29 | } 30 | 31 | 32 | // Lazy load controllers registered beneath the `under` path in the import map to the passed application instance. 33 | export function lazyLoadControllersFrom(under, application, element = document) { 34 | lazyLoadExistingControllers(under, application, element) 35 | lazyLoadNewControllers(under, application, element) 36 | } 37 | 38 | function lazyLoadExistingControllers(under, application, element) { 39 | queryControllerNamesWithin(element).forEach(controllerName => loadController(controllerName, under, application)) 40 | } 41 | 42 | function lazyLoadNewControllers(under, application, element) { 43 | new MutationObserver((mutationsList) => { 44 | for (const { attributeName, target, type } of mutationsList) { 45 | switch (type) { 46 | case "attributes": { 47 | if (attributeName == controllerAttribute && target.getAttribute(controllerAttribute)) { 48 | extractControllerNamesFrom(target).forEach(controllerName => loadController(controllerName, under, application)) 49 | } 50 | } 51 | 52 | case "childList": { 53 | lazyLoadExistingControllers(under, application, target) 54 | } 55 | } 56 | } 57 | }).observe(element, { attributeFilter: [controllerAttribute], subtree: true, childList: true }) 58 | } 59 | 60 | function queryControllerNamesWithin(element) { 61 | return Array.from(element.querySelectorAll(`[${controllerAttribute}]`)).map(extractControllerNamesFrom).flat() 62 | } 63 | 64 | function extractControllerNamesFrom(element) { 65 | return element.getAttribute(controllerAttribute).split(/\s+/).filter(content => content.length) 66 | } 67 | 68 | function loadController(name, under, application) { 69 | if (!(name in registeredControllers)) { 70 | import(controllerFilename(name, under)) 71 | .then(module => registerController(name, module, application)) 72 | .catch(error => console.error(`Failed to autoload controller: ${name}`, error)) 73 | } 74 | } 75 | 76 | function controllerFilename(name, under) { 77 | return `${under}/${name.replace(/--/g, "/").replace(/-/g, "_")}_controller` 78 | } 79 | 80 | function registerController(name, module, application) { 81 | if (!(name in registeredControllers)) { 82 | application.register(name, module.default) 83 | registeredControllers[name] = true 84 | } 85 | }; 86 | -------------------------------------------------------------------------------- /src/vendor/postie/parseMetadata.js: -------------------------------------------------------------------------------- 1 | import getTextFromImage from "vendor/postie/exifMetadataExtractor" 2 | 3 | import { findSamplerByName, findUpscaler, findModelByHash } from "vendor/postie/dataEnricher" 4 | 5 | // Parses the PNG/JPEG metadata 6 | const parseMetadata = (file, callback) => { 7 | const fr = new FileReader() 8 | 9 | fr.onload = () => { 10 | let embed = getTextFromImage(fr.result) 11 | 12 | try { 13 | // Invoke AI / NMKD 14 | embed = JSON.parse(embed) 15 | embed = { ...embed, ...embed.image } 16 | 17 | // Ensures the prompt is a single string 18 | if (typeof embed.prompt !== 'string') 19 | embed.prompt = embed.prompt.map(x => x.prompt).join(', ') 20 | 21 | // Note: Nested brackets will parse the prompt-value wrong. 22 | // => Example: `[ negative1, negative2, [ negative3 ] ]` is invalid 23 | // => Example: `[ negative1, negative2, negative3 ]` is valid 24 | 25 | // Everything between square brackets, excluding those brackets 26 | // Multiple negatives are allowed, hence the following is valid: 27 | // => Example: `prompt [negate], prompt, [more negative]` 28 | embed.negative_prompt = embed.prompt.match(/\[[^\]]*\]/g)?.map(x => x.substr(1, x.length -2)).join(', ') 29 | 30 | // Everything that's not between square brackets 31 | // Same as above but just the other way around 32 | embed.prompt = embed.prompt.match(/[^\[\]]+(?=\[(.*)\]|$)/g).join(', ') 33 | 34 | embed.program_used = "InvokeAI" 35 | } 36 | catch (e) { 37 | // Rethrow unless parsing as JSON failed 38 | // (which would have turned the string into an object) 39 | if (typeof embed !== 'string') 40 | throw e 41 | 42 | // Automatic 1111 43 | const split = embed.split(/\r?\n/) 44 | let entries = split.find(x => x.toLowerCase().startsWith('steps: ')) 45 | 46 | // Finds each key-value pair. Note the leading: ', ' 47 | // which is used to form a consistent pattern 48 | // Also note that the value of a pair can be JSON, therefor 49 | // we use `"` to ensure all JSON matches within that pair 50 | entries = `, ${entries}`.match(/(.+?(?=, [^"]+: |$))+?/g).map(pair => { 51 | // Splits the key-value pair on the first delimiter 52 | // This is different from `.split(': ')` ! 53 | const index = pair.indexOf(': ') 54 | return [ 55 | pair.substr(2, index -2).toLowerCase().replaceAll(' ', '_'), 56 | pair.substr(index +2) 57 | ] 58 | }) 59 | entries = Object.fromEntries(entries) 60 | 61 | const [width, height] = entries.size.split('x') 62 | 63 | embed = { 64 | ...entries, 65 | prompt: split[0], 66 | negative_prompt: split.find( 67 | x => x.toLowerCase().startsWith('negative prompt: ') 68 | )?.substr(17), 69 | width, 70 | height, 71 | } 72 | 73 | embed.program_used = "AUTOMATIC1111" 74 | } 75 | 76 | // Normalization 77 | const normalizer = str => str?.trim() 78 | .replace(/,( ?,)+/g, ',') // separates with a maximum of one comma 79 | .replace(/^[\s?,]+|[\s?,]+$/g, '') // removes trailing/leading commas and whitespace 80 | .replace(/\s+/g, ' ') // uses single spaces only 81 | 82 | embed.prompt = normalizer(embed.prompt) 83 | embed.negative_prompt = normalizer(embed.negative_prompt) 84 | 85 | // Handles the matching website 86 | console.log("Metadata parsed!", embed); 87 | embed = enrichMetadataForPromptHero(embed); 88 | callback(embed); 89 | } 90 | 91 | fr.readAsArrayBuffer(file) 92 | } 93 | 94 | const enrichMetadataForPromptHero = promptInfo => { 95 | var richPromptInfo = promptInfo; 96 | 97 | richPromptInfo.sampler_raw = promptInfo.sampler; 98 | richPromptInfo.sampler = findSamplerByName(promptInfo.sampler); 99 | 100 | richPromptInfo.upscaler_raw = promptInfo.hires_upscaler || ""; 101 | richPromptInfo.upscaler = findUpscaler(promptInfo.hires_upscaler); 102 | 103 | const { model, version } = findModelByHash(promptInfo.model_hash) 104 | richPromptInfo.model_used = model; 105 | richPromptInfo.model_used_version = version; 106 | 107 | return richPromptInfo; 108 | } 109 | 110 | export default parseMetadata; -------------------------------------------------------------------------------- /src/controllers/prompts/upload_controller.js: -------------------------------------------------------------------------------- 1 | import { Controller } from "@hotwired/stimulus" 2 | 3 | import * as FilePond from "filepond"; 4 | import FilePondPluginImageResize from 'filepond-plugin-image-resize'; 5 | import FilePondPluginImagePreview from 'filepond-plugin-image-preview'; 6 | import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type'; 7 | 8 | import parseMetadata from "vendor/postie/parseMetadata"; 9 | 10 | export default class extends Controller { 11 | static targets = [ "prompt", "negativePrompt", "modelUsed", "modelVersion", "sampler", "seed", "guidance_scale", "steps", "width", "height", "modelHash", "programUsed", "upscaler", "denoisingStrength", "maskBlur" ] 12 | 13 | initialize() { 14 | FilePond.registerPlugin(FilePondPluginImageResize, FilePondPluginImagePreview, FilePondPluginFileValidateType); 15 | const inputElement = document.getElementById("filepond-input"); 16 | const pond = FilePond.create(inputElement, { 17 | required: true, 18 | acceptedFileTypes: ['image/*'], 19 | multiple: false, 20 | imageResizeMode: 'contain', 21 | allowImagePreview: true, 22 | allowProcess: true, 23 | storeAsFile: true, 24 | imagePreviewMinHeight: 600, 25 | imagePreviewMaxHeight: 800, 26 | imagePreviewMarkupShow: false 27 | }); 28 | 29 | pond.on('addfile', (error, file) => { 30 | if (error) { 31 | console.error('Oh no! Error loading image.'); 32 | return; 33 | } 34 | 35 | parseMetadata(file.file, (promptInfo) => { 36 | this.fillUpFormWithPromptInfo(promptInfo); 37 | }); 38 | 39 | }); 40 | } 41 | 42 | fillUpFormWithPromptInfo(promptInfo){ 43 | this.promptTarget.value = promptInfo.prompt; 44 | 45 | if(promptInfo.negative_prompt){ 46 | this.negativePromptTarget.value = promptInfo.negative_prompt; 47 | $("#negativePromptButtonToggler").click(); 48 | } 49 | 50 | if(promptInfo.model_used){ 51 | this.modelUsedTarget.value = promptInfo.model_used.toLowerCase(); 52 | this.modelVersionTarget.value = promptInfo.model_used_version; 53 | 54 | this.insertModelVersion(promptInfo) 55 | } 56 | 57 | this.samplerTarget.value = promptInfo.sampler; 58 | this.seedTarget.value = promptInfo.seed; 59 | this.guidance_scaleTarget.value = promptInfo.cfg_scale; 60 | this.stepsTarget.value = promptInfo.steps; 61 | 62 | this.widthTarget.value = promptInfo.width; 63 | this.heightTarget.value = promptInfo.height; 64 | this.modelHashTarget.value = promptInfo.model_hash; 65 | 66 | this.programUsedTarget.value = promptInfo.program_used; 67 | 68 | this.upscalerTarget.value = promptInfo.upscaler; 69 | this.denoisingStrengthTarget.value = promptInfo.denoising_strength; 70 | this.maskBlurTarget.value = promptInfo.mask_blur; 71 | } 72 | 73 | insertModelVersion(promptInfo){ 74 | const modelVers = document.getElementById('prompt_model_used_version') 75 | 76 | if (promptInfo.model_used === undefined) 77 | return 78 | 79 | // Behaviour of prompthero: 80 | // First the DOM tree of the `modelVers` is reset 81 | // Then an AJAX request is sent to fetch the versions for that model 82 | // Finally the DOM tree of `modelVers` is populated with those contents 83 | const onDone = new Promise(resolve => { 84 | const observer = new MutationObserver(() => { 85 | console.log("here") 86 | // Means the AJAX has not finished, usually it's already finished 87 | // Test this properly by Throttling offline (in Google Chrome) 88 | // in that case the Promise should never resolve (when offline) 89 | if (modelVers.innerText === '-- Select Model Version --') 90 | return 91 | 92 | observer.disconnect() // Stops listening for changes in the DOM 93 | resolve() // Continues, now the model version can be assigned 94 | }) 95 | // Listens for changes within the DOM tree of the model version 83 | 84 | 85 |
86 |
87 | 88 |

Prompt Metadata Checker by 89 | PromptHero

90 | 91 |
92 |
93 | 94 | 98 |
99 | 100 |
101 | 102 | 106 |
107 | 108 |
109 |
110 |
111 | 112 | 142 |
143 |
144 | 145 |
146 |
147 | 148 | 150 |
151 |
152 |
153 | 154 | 155 | 156 |
157 |
158 | 159 |
160 | 165 | 167 | 168 |
169 | 170 |
171 |
172 | 173 |
174 | 179 | 181 | 182 |
183 | 184 |
185 |
186 | 187 |
188 | 193 | 195 | 196 |
197 | 198 |
199 |
200 | 201 |
202 | 207 | 232 | 233 |
234 | 235 |
236 |
237 | 238 |
239 |
240 |
241 | 242 | 244 |
245 |
246 | 247 |
248 |
249 | 250 | 252 |
253 |
254 | 255 |
256 |
257 | 258 | 260 |
261 |
262 | 263 |
264 |
265 | 266 | 273 |
274 |
275 |
276 | 277 | 278 |
279 |
280 |
281 | 282 | 288 |
289 |
290 | 291 |
292 |
293 | 294 | 297 |
298 |
299 | 300 |
301 |
302 | 303 | 306 |
307 |
308 |
309 | 310 |
311 | 312 |
313 |
314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | -------------------------------------------------------------------------------- /src/vendor/postie/modelHashes.js: -------------------------------------------------------------------------------- 1 | /* 2 | Missing: 3 | • anything: 4.0 4 | • trinart: * 5 | • text-to-pokemon: * 6 | --- 7 | Uppercase = CivitAI 8 | Lowercase = Huggingface (also noted with a comment above) 9 | */ 10 | const hashes = { 11 | /** huggingface **/ 12 | "poolsuite-diffusion": { 13 | "1.5": [ 14 | "94e33b13c77bf8d8ed81363c05a356271cfea538514ba599de445216be78367b" 15 | ] 16 | }, 17 | /** huggingface **/ 18 | "funko-diffusion": { 19 | "1.5": [ 20 | "c5150eaeba0ccb86627e9007841dbc45d3b5b68fd084081f34c2a6b207befd48" 21 | ] 22 | }, 23 | /** huggingface **/ 24 | "stable-diffusion": { 25 | "1.4": [ 26 | "fe4efff1e174c627256e44ec2991ba279b3816e364b49f9be2abc0b3ff3f8556", 27 | "14749efc0ae8ef0329391ad4436feb781b402f4fece4883c7ad8d10556d8a36a" 28 | ], 29 | "1.5": [ 30 | "cc6cb27103417325ff94f52b7a5d2dde45a7515b25c255d8e396c90014281516", 31 | "6ce0161689b3853acaa03779ec93eafe75a02f4ced659bee03f50797806fa2fa", 32 | "e1441589a6f3c5a53f5f54d0975a18a7feb7cdf0b0dee276dfc3331ae376a053", 33 | "1a189f0be69d6106a48548e7626207dddd7042a418dbf372cefd05e0cdba61b6" 34 | ], 35 | "2 Base": [ 36 | "d635794c1fedfdfa261e065370bea59c651fc9bfa65dc6d67ad29e11869a1824", 37 | "ab800444cdd1e6ade2236874dd28db9608d1d740aaf6087c7273884140612993" 38 | ], 39 | "2 768": [ 40 | "bfcaf0755797b0c30eb00a3787e8b423eb1f5decd8de76c4d824ac2dd27e139f", 41 | "703d49a1d847b218c5c230fce80ba1f73f848bc3afc06e48e727ee47fdf06b1f" 42 | ], 43 | "2.1 Base": [ 44 | "88ecb782561455673c4b78d05093494b9c539fc6bfc08f3a9a4a0dd7b0b10f36", 45 | "df955bdf6b682338ea9b55dfc0d8f3475aadf4836e204893d28b82355e0956d2", 46 | "34dccb9e60d83a4ef963f51e9ff63548323a70024f8679095956d7c403b3ef4a", 47 | "fc4f9fe7528b2ee3de21971fb805bbf74d680bf1ab5b5f9c08379b0397b82a9d" 48 | ], 49 | "2.1 768": [ 50 | "ad2a33c361c1f593c4a1fb32ea81afce2b5bb7d1983c6b94793a26a3b54b08a0", 51 | "dcd690123cfc64383981a31d955694f6acf2072a80537fdb612c8e58ec87a8ac", 52 | "4711ff4dd270067f71d5ea0725e83e4dc7c41f586a588531ee1c3bd549e9119d", 53 | "ff144a49841cf383adbc68841272ce639e1032b0a1f0f6586347feb953c244f4" 54 | ] 55 | }, 56 | "openjourney": { 57 | "1.5": [ 58 | "DDC6EDF2", 59 | "5D5AD06CC2", 60 | "5D5AD06CC24170B32F25F0180A357E315848000C5F400FFDA350E59142FABD68", 61 | "88781B89", 62 | "4DAF80A45BFF09AD275F46204F2EBEB4227C11095D145DC3FDFA969998D7E573" 63 | ], 64 | /** huggingface **/ 65 | "2": [ 66 | "f022143bce33d6fb645751e594665d25fcb00995b8475e4401acae2c1df471d4", 67 | "2fbe5ba6e2a842fa99f52500cd600ac33f510b6a76b58874fa92b39c72c5ad57" 68 | ] 69 | }, 70 | "anything": { 71 | "3.0": [ 72 | "38C1EBE3", 73 | "812CD9F9D9", 74 | "812CD9F9D9A0CB62AAAD605173FD64DEA13CC8EAD9A18CA8ECA5BC94ABA58583", 75 | "489F2634", 76 | "8A89EC6C70808BB5957504DFBAF66C80DCA17A6A63D90450F806245AC956B32A" 77 | ] 78 | }, 79 | "analog-diffusion": { 80 | "1.0": [ 81 | "1400E684", 82 | "51F6FFF508", 83 | "51F6FFF5088A9C5F5AA7CEFA0A5A859D0424FC68FDC440E0EE5608A2B82E5FF9", 84 | "F7CF42F8", 85 | "398395AECEFC91D195441F713824D813DA917FB6B7C92D8765989AB3B9A4E31F", 86 | "9CA13F02", 87 | "A9A1C90893", 88 | "A9A1C90893CC7892DFD7438004FA954696F94208C84773B1CABB434E5A856A0C", 89 | "6566F31F", 90 | "6115B4354818ABCB0E59B0EA5CEAF25A8912C900DD1C97B4C7F5DD94A2D2C308" 91 | ] 92 | }, 93 | "synthwavepunk": { 94 | "1": [ 95 | "C0E7C884", 96 | "D7C4EB223D", 97 | "D7C4EB223DDD4C89D76D2A9A17E32A135CC9E0ADD0D96D196C95F3E3813FBF88", 98 | "1F103FDD", 99 | "B2DD8EED7EEAA7E5E13321F64B1077B0828F83384BB4FC3180D737F75AAC0A4B" 100 | ], 101 | "2": [ 102 | "27EA8C02", 103 | "DC4C67171E", 104 | "DC4C67171E2EB64B1A79DA7FDE1CB3FCBEF65364B12C8F5E30A0141FD8C88233", 105 | "A72626DB", 106 | "02B54CF802A83AEE4DC531E13DA29EEA6DD26FAFFB73E706A0B073FA2304A8F9" 107 | ], 108 | "3": [ 109 | "9CE5CEA2", 110 | "76F3EED071", 111 | "76F3EED071327C9075053368D6997CD613AF949D10B2D3034CEF30A1D1D9FEBA", 112 | "F15BA0A8", 113 | "F83958C6BD911A59456186EA466C2C17B1827178324CF03CC6C427FB064FFFF9", 114 | "5D83B27C", 115 | "EE2AB6D872", 116 | "EE2AB6D8723611D9A2FA9B0C8CE5A3770A84189A92B53D5E6CF44B02B9F8E033", 117 | "97DD6FF4", 118 | "910E778DE880D7EA9511A075B5D4C59B9ED1EE7A9C6B98FFE4EB5C198F0E5240" 119 | ] 120 | }, 121 | "arcane-diffusion": { 122 | "1": [ 123 | "2A3E365B", 124 | "3FA58DCBCF", 125 | "3FA58DCBCF59E3C376E6F5AEA5C059A685A59B907A0D79463F4B0F8E2BECBC8A", 126 | "482742DD", 127 | "5AB2C67104554F8532559E2A3BFE5B8B55E21E2C3E49C56E45890AD1437C58CB" 128 | ], 129 | "2": [ 130 | "A2A802B2", 131 | "60510C7CA1", 132 | "60510C7CA14EB8B17110E5BD280A2E1B9DB66B62765977BC4A377B8ADABA2123", 133 | "13F287F9", 134 | "7006AB5156B82DF6604C3706447DE19FE5789A19FC5977FDB3BD9DAAA95C748D" 135 | ], 136 | "3": [ 137 | "318A302E", 138 | "7DD0E6760F", 139 | "7DD0E6760F5A6778BEBBBDAEDD96AA1038CA76C349194F0C1B5C28311E10A78B", 140 | "AA61022E", 141 | "E7807F427E2341566B9B85A953B5DBC3A2BB070D448DA26C163C4CCA79EF52CF" 142 | ] 143 | }, 144 | "mo-di-diffusion": { 145 | "1.5": [ 146 | "CCF3615F", 147 | "8067368533", 148 | "8067368533BD74CBFB439AB829C0EF5CCEDE1E29ED5644E193410416F24CF976", 149 | "48AA2BC9", 150 | "643D666C67D98955899EC3D0CF53F66AC84EC5BB91EA05643AF5DA9340080F99" 151 | ] 152 | }, 153 | "redshift-diffusion": { 154 | "1.5": [ 155 | "74F4C61C", 156 | "ED8C2EE432", 157 | "ED8C2EE43268932A420F5DB00B105881770A19C0AFD0D35876330E2BBDCCE426", 158 | "1F4DAE88", 159 | "1E983F7DBA7B63E9B7E542BDF37C3766008B3196CDF6F3EAD200A9008ED2CE70" 160 | ] 161 | }, 162 | "waifu-diffusion": { 163 | "1.3": [ 164 | "4470C325", 165 | "9DADE82620", 166 | "9DADE826203C7EE369881B5DC20D34298FA644C1F137568E09FBC4B9A0D3E817", 167 | "74B60935", 168 | "8096504AB1F29F8F7BC74BE7D09BB69EBEE584D4B1D40BBC1C59289C56EA02B8", 169 | "84692140", 170 | "4AFAB91260", 171 | "4AFAB9126057859B34D13D6207D90221D0B017B7580469EA70CEE37757A29EDD", 172 | "D68D7ADC", 173 | "189B5906A2D51411E9079EEE90DDD0E2701503D61343949BB99A498D7A264F63" 174 | ], 175 | "1.2": [ 176 | "55537280", 177 | "3A3A36AAC8", 178 | "3A3A36AAC85502A06878EC6760C0FB95F71546AD734FBB2B6CFAB9A50DB7AA8D", 179 | "CF117075", 180 | "7E54565F04F60AB11DDF88CD6D3EF5C5C4AA4FB4A53F16580A11E29E9E6914FA" 181 | ], 182 | /** huggingface **/ 183 | "1.4": [ 184 | "e8f4b2225b8ac6464e9d13d25b708349b1ca340c92dfc3575e8d5ef18f689457", 185 | "c76e0962bc60ccdc18e0dce387635b472b5a19038d637216030acbbe6eda2713", 186 | "b438efac4434af4e482d20cdfcea64067f8dfec438628261d2f2aa60ffc41452", 187 | "efee5ef4ce99e980bd10ed9bbb042ede5f71ed4f5ae7f06c48285a47b4ed6427" 188 | ] 189 | }, 190 | "dreamshaper": { 191 | "3.31 Baked vae": [ 192 | "42E8C85D", 193 | "A845FF2693", 194 | "A845FF26936F79A98B6F4C142E936398C59C0D0A040CAEC49A1DE68987DE29E5", 195 | "E0C1E0BA", 196 | "286721B5F837FDE7149710E9CBD80FB65800BAF3DEB87F449CF2501086BEE494", 197 | "DECA6616", 198 | "1DCEEFEC07", 199 | "1DCEEFEC0715B23865D23C8145F2C1558BB4402570E6F2857B664D8CADA46AE1", 200 | "ABDCC158", 201 | "30BE3842DAE0A525F6BF47A1E1B47098AEA72500553B77541885F497C1D03723", 202 | "A56748A1", 203 | "6C8715D225", 204 | "6C8715D22517E6D2C61C847ED5F7ABDD3ED2EB76BB5DFF7D4ED3282754C2F25F", 205 | "42A5AB65", 206 | "114C4D8E6BD2157825C342548E56C93909CF33204E7F98B472A3770787673826", 207 | "75D978EA", 208 | "9E9FA0D822", 209 | "9E9FA0D8225A1AAA4AA661F8DA31B38A7B1D7E9379150EC12B9A6CCA651DB91A", 210 | "1FE5AD6C", 211 | "8AA766A08B31FC7BD44392755A48087C91C9A2952C8808092656ADFDB11552FD" 212 | ], 213 | "3.32 Baked vae": [ 214 | "9CAF0186", 215 | "BD19602CE0", 216 | "BD19602CE0191C5720DAE3B9EA272B855A906D3F168A788B666E5F9ADB736E3B", 217 | "2AD0A2B0", 218 | "1CB61DAECA9132AB9E6B0B6535823186DF242FF816B2D764FC5287C0F86B520D", 219 | "B97F493F", 220 | "13DFC9921F", 221 | "13DFC9921F8D0CC3FBF769EDC3C3723C9DB1AEE3F85D0603FC45C7CBA86D3397", 222 | "C51C26D5", 223 | "EC3526A84A9C8EA35FF474B9F8DE773475D34BAEC58371FC3882D30780A8C697", 224 | "75698597", 225 | "637D5DCB91", 226 | "637D5DCB91D2B08195BA2BAA07767D8004D3C950D61BC5F2A4EAB367BAA811C1", 227 | "A3D1E67B", 228 | "2E71901D7BD7324DDDBDC331C158C89335CA85C937CEF3AF42048B17AB626A33", 229 | "8B2D5D72", 230 | "C464E27568", 231 | "C464E275684C36B987481638B420F3833077118F5D4CF89344E4010642CE76EA", 232 | "7589891C", 233 | "4D1BBB02F011C4C9647F0B262A49C8A2B606E52C813476FDF307BB948E1D65AD" 234 | ], 235 | "3.3": [ 236 | "42E8C85D", 237 | "482FAE2F3D", 238 | "482FAE2F3DECA6F4A726E83924C1195131FB851296F5EF1E9B315E7354FB22C4", 239 | "3A567AF0", 240 | "F6FFEB84DF8723A660FB80052B786A85F4627798A2C7F0F80827B693FDC78B72", 241 | "DECA6616", 242 | "08ACB74861", 243 | "08ACB74861F281B4649CF3C553505CA679273755BA0AC13D1971F4FBDD80D28F", 244 | "CDB44B58", 245 | "FF534F00BD876AD56448B3C2A4CE305754243FAAFDBEFB54007249747AF11ED6", 246 | "7B9489AE", 247 | "0E8DF96BA4", 248 | "0E8DF96BA4BD1B6FD95642EA0ADC809BE8372172809DCFF4366308EFCFE5AC61", 249 | "06C5EBF6", 250 | "DC7FF59A68FD2CBB31283559E57F2EEA183CFC92FD2105AD3F47EB2CA10584CD", 251 | "752E2491", 252 | "4E367DDDCB", 253 | "4E367DDDCBF844034114BB078B022F929B8E685670A27698E400E8FA5E8A4B1C", 254 | "90ADB2BA", 255 | "1F04ADD74EC3594F76DBB83A5B2380C2AAB7F242DA61492F9EFCF0B62EBE91B7" 256 | ], 257 | "2.52": [ 258 | "575D99CE", 259 | "8C87ABA96B", 260 | "8C87ABA96B45656F7D47A5F10A09F59C2785EC6C0C437F0C3B10405D21CDE667", 261 | "5A4CF1E8", 262 | "032F378CB851D25E76F52E3A5972B0DFB98DB4FBC1D72F1AE14E4AE016686127", 263 | "464CD4FA", 264 | "B24E42E3BC", 265 | "B24E42E3BC52C83AA4A354AAD311EE49EFF2ED148235D97A9523FA0E292775D1", 266 | "AE77BDC8", 267 | "5780ABE976D5AE50D38BA587A494245FAD758B996C302BD9C21DF90CFFA54C08", 268 | "49452215", 269 | "A1E232C37D", 270 | "A1E232C37D2F59C2DCE7BD49145D115ED134E8F30EFF8FDDEA3FD0AC2A2356EA", 271 | "A541138D", 272 | "372784191E6CCA460023920BCACC3A1809467EA1A1D248C46628BDFE4F610DF2", 273 | "1962BEF7", 274 | "17364B458D", 275 | "17364B458D5F2ECE75827FDA53FEBF2F92B5E2DB96A5543304C82CF1E9AEE63E", 276 | "C15937C0", 277 | "6993238570C56272E81FBB5641CA489728A843F1DBC1ECD94AE8CC43ED37ED94", 278 | "1962BEF7", 279 | "17364B458D", 280 | "17364B458D5F2ECE75827FDA53FEBF2F92B5E2DB96A5543304C82CF1E9AEE63E", 281 | "C15937C0", 282 | "6993238570C56272E81FBB5641CA489728A843F1DBC1ECD94AE8CC43ED37ED94", 283 | "49452215", 284 | "A1E232C37D", 285 | "A1E232C37D2F59C2DCE7BD49145D115ED134E8F30EFF8FDDEA3FD0AC2A2356EA", 286 | "A541138D", 287 | "372784191E6CCA460023920BCACC3A1809467EA1A1D248C46628BDFE4F610DF2", 288 | "575D99CE", 289 | "8C87ABA96B", 290 | "8C87ABA96B45656F7D47A5F10A09F59C2785EC6C0C437F0C3B10405D21CDE667", 291 | "5A4CF1E8", 292 | "032F378CB851D25E76F52E3A5972B0DFB98DB4FBC1D72F1AE14E4AE016686127" 293 | ] 294 | }, 295 | "deliberate": { 296 | "1": [ 297 | "49EE5042", 298 | "BCC9764D20", 299 | "BCC9764D2027006621C10BC45B4EB436C4DA57239A774F5E92182BCCA64B84A6", 300 | "B2D45A7A", 301 | "7E51D7B605CF5E1F2ED3C316FE33366A9D68882EA85F0737B5C7CC466843624C", 302 | "C5C54E28", 303 | "9F1BFEE7A0", 304 | "9F1BFEE7A01C7DE6269E1EDB4BE263472C57A4022D91EA266AC2464A61364716", 305 | "19C41C99", 306 | "929CF26AA0B4BF54047D3FC2C817E67512937E36A5D3C8B37AB4DC029559F492" 307 | ], 308 | "2": [ 309 | "0F6DF056", 310 | "B4391B7978", 311 | "B4391B7978D973427A4A2A3ED0E67B18EBE34E213904575043D6C9FAEC75C22D", 312 | "A1ECE6E3", 313 | "A4A13D6520DA1CB8E6EC4D5FC1BFF045C020C75AF80029949B9DABA257276587", 314 | "10EC4B29", 315 | "9ABA26ABDF", 316 | "9ABA26ABDFCD46073E0A1D42027A3A3BCC969F562D58A03637BF0A0DED6586C9", 317 | "AB983967", 318 | "475B27F4BB7C3A5124A46586090666EDBBC441A0C96D45D3E808B8B1EE2AC8C9" 319 | ], 320 | "1.1": [ 321 | "B48A28AB", 322 | "10A699C0F3", 323 | "10A699C0F3D560092C7E4F88C864F99C9422930CF0C535BD34B90DAA3B3738E2", 324 | "F76A8DEE", 325 | "0C6BAC3CFF67CDFE818369EFB27844BAB973BF3EC07D7DF8F5F6B17494DB5AC4", 326 | "D0129123", 327 | "D8691B4D16", 328 | "D8691B4D16FB59AEA959DB797350016E24008D59DE8D5A960FF7B1CEC1FBC11C", 329 | "5940C844", 330 | "52BBFB9058DE392D2CF21C4E38C3B269D4AB0C54B32F73EF6F901D85C6061565" 331 | ] 332 | }, 333 | "kenshi": { 334 | "01": [ 335 | "EF8DDC53", 336 | "4B0EEC4DA8", 337 | "4B0EEC4DA8DD044C40BCB7564B34D0B3E5C03CE42A5490E88EB6DC46EA64B00A", 338 | "089C327D", 339 | "ACB6AEBE0E6A022562D6019B1EDBAC4C6A9D7D40C05BDEE848273E09C31CE664" 340 | ], 341 | "00": [ 342 | "2FDD0123", 343 | "8C19D5C981", 344 | "8C19D5C9813DEF9E2DE1DFF4C77A0BADF4D3126B830C462F01744F4D173E3878", 345 | "B0F67FEC", 346 | "1E5B33136989D98A81BCD0D34B58B7A738CFBBC94991D94A24B39617ADA54923" 347 | ] 348 | }, 349 | "realistic-vision": { 350 | "1.3": [ 351 | "832C6E6A", 352 | "77E392958A", 353 | "77E392958A6B2CE335FE6ED0CB8EBB9F5CFB48706BFDE9C28D4721F4CE65619E", 354 | "E60ED49C", 355 | "46728C90B2045784674FD85FE9C839B87B8FF66D061C196A6FE9F26736E19B7B", 356 | "DE2F2560", 357 | "C35782BAD8", 358 | "C35782BAD87A6C8D461FA88861D9EE6974D7A16CC19014BFAF89F586DD42CA63", 359 | "80140439", 360 | "94BF092C41E065BC4BADDFD0404E5B453FF8EDDE79D70DCAB2C31CE17C1D14C6", 361 | "2943D1DF", 362 | "17237B6A59", 363 | "17237B6A59C3EE242B9798FA2C46E84B9040CF63374B8A98978CE1E547CB7372", 364 | "C43F43AF", 365 | "81F900D64BA9811E52B1117119E656FCCFD3271274B95B6310BFC9C5C97F5647", 366 | "3C30B472", 367 | "20BAE33336", 368 | "20BAE333361F827DB72EDEEA3A4E6F6BF45F0CCCF3559AD77EE6FFCF7FABCF37", 369 | "8D4EB485", 370 | "D1549FA008C32924FBE181C29A5664F44B6F2EDC3709B899F57497E6BEACEC6A" 371 | ], 372 | "1.2": [ 373 | "CCEB87E1", 374 | "3D12F43543", 375 | "3D12F435437315EDCFE71CCE3D6329C9B6E87F771DB9A0E130C1105C6D7F7B29", 376 | "4AC8CDD8", 377 | "3602787526AE0A17A89DD948E3C535DE729A4EF2038C8F8FC18885D07E0D4571", 378 | "DE2F2560", 379 | "8194F84CDC", 380 | "8194F84CDCE2D9D782C4B1D32DDC4C585819AA270BB4CB60E9EB3710C6A38FF3", 381 | "E2492185", 382 | "1ABD24178CA2C12B0A29145CD9DE9021616DCCB334FA85B144DDD96B87BDB91F" 383 | ] 384 | }, 385 | "dreamlike-photoreal": { 386 | "1": [ 387 | "1D625012", 388 | "F403E4E2A5", 389 | "F403E4E2A5E48AE1E22380EE8FD6D78F048F89696B89BF4931798144A933DE07", 390 | "3C54B2ED", 391 | "D34EE9AF820A200FBCD10262C273F87611C681702C7583F08E55906E5C81E82E" 392 | ], 393 | "2": [ 394 | "7AF9CD4C", 395 | "FC52756A74", 396 | "FC52756A74D5F371422FF99A7268CB6ABB14BFC4A4DE3569382CF0BD75E55D36", 397 | "42E30128", 398 | "B4E06466745003C5C5D28EBE9DBF994FA1376B092534B18038C1671C2FAFAB38", 399 | "FDCF65E7", 400 | "92970AA785", 401 | "92970AA785EB76E427847109A8F4EC6ABFAB36EF941F78D295D323D79F6130C9", 402 | "1B3C7A91", 403 | "5E934F637C8F558682899DD2416BCECD03584B8E094ED2E4E8EBCFA5BFDCB3E4" 404 | ] 405 | }, 406 | "dreamlike-diffusion": { 407 | "1": [ 408 | "14E1EF5D", 409 | "0AECBCFA2C", 410 | "0AECBCFA2CBE01BB44F7C0E4F413022AB25B35057B85507D55BA15E2D5DB35DA", 411 | "292A882E", 412 | "B100F0CF084B500960B847995053E37C5BA27EB574C83DEDF761F61D8B9C36F7" 413 | ] 414 | }, 415 | "grapefruit": { 416 | "3": [ 417 | "E7CEF3A5", 418 | "085B52679B", 419 | "085B52679B7AE459052430F9EB46EAD709C04EE6975C910B72EADB955EB45A3C", 420 | "19195ED9", 421 | "64308172F76724FC1878809701DE7D8A4D1FFED58B304405BCE5F433ECBAD280" 422 | ], 423 | "4": [ 424 | "1A8C1CC4", 425 | "16E5723194", 426 | "16E5723194978C6F1C8EC6D8EE4611B99ABED20AFE6EB70FE14D71E6E809582D", 427 | "37004EFC", 428 | "1A3333EAED70397C6BB05C2DC4F89AEF6C22796BEC36DC8D571318F112C67EAD", 429 | "E7542B65", 430 | "37A86DCA58", 431 | "37A86DCA587205A76F33FFB7171FBB873F6738397082BA2F36A640182913AD69", 432 | "C0B26BE6", 433 | "8177DC23CAE8F25215C8A5BB38D8D10B342B75C24B1EBB20554E4D2EF8B7352C" 434 | ], 435 | "4.1": [ 436 | "6BBFE67E", 437 | "C590550EA5", 438 | "C590550EA5F3EA3AD9126A264ED27970CE4A14EEF134900599A73F00B64C4855", 439 | "BF323580", 440 | "C2905F353DA4BE2C9164617C8F2D17146C491BBCF72618C75D8E4ACCE0BAF131" 441 | ], 442 | "3.2": [ 443 | "3F91F838", 444 | "2AD79A2618", 445 | "2AD79A26181DC655912CA26B5D432BC9FC3EA970684F33F4524AF0F953071A9A", 446 | "0D1BB606", 447 | "D455421DF9C1F45A5A540E29C45BAC4E3C93F94B0F282A8E78C84EDFCD00315D" 448 | ], 449 | "3.1": [ 450 | "3A5A5284", 451 | "4FC8D3739F", 452 | "4FC8D3739FC90E018809CB495FA564C9F14FB9B24AABAD41F9F0E7445FECAE14", 453 | "B94DF545", 454 | "B4BAB8806737811D9B2C70DB579DECD56D16984CF94026F5E39D5C9FED2000E5" 455 | ], 456 | "2.4": [ 457 | "8B002290", 458 | "546566D9D5", 459 | "546566D9D59BEA39331E8105BBB4E12323620039DFE2E1267277D0E12BEAE8F9", 460 | "D5D605E2", 461 | "C7BD8A09FD90ED3926A74C83643E0E5190993084CBE04517801A4CE7347260FF" 462 | ] 463 | }, 464 | "illuminati-diffusion": { 465 | "1.1": [ 466 | "A149572B", 467 | "CAE1BEE30E", 468 | "CAE1BEE30E67339DD931925F98C12D2B86FE9F4786795137040E4956F4BFCFFE", 469 | "1BB2E796", 470 | "B223E8F045E27A917207E226B60E4C51B46F114C9B378DE869584406762053A3" 471 | ] 472 | }, 473 | "protogen": { 474 | "2.2 (Anime)": [ 475 | "B5C0B653", 476 | "BB725EAF2E", 477 | "BB725EAF2ED90092E68B892A1D6262F538131A7EC6A736E50AE534BE6B5BD7B1", 478 | "395A2EF8", 479 | "5A01E2073534BB009DD39D4EA73468C046E56190E003F95979EEC50B92DFCE96", 480 | "16E33692", 481 | "1254103966", 482 | "125410396648D4B622B7D3AA38D95F7D67EA44EE5669BC31C12F344A10F73CA9", 483 | "71205CD8", 484 | "7BC87106A4941544DEF14BFE613522841A37B17E9E105A424FF234105D17EB25", 485 | "7BFD4934", 486 | "EEA02A02BF", 487 | "EEA02A02BFA43A929306F4DADDAD7698D7163055ED35EAD53E4302C941C87B76", 488 | "87C6661C", 489 | "D78E5B7A919766E97ECE78F527C367063AE318523405139BD756C6CB2E64A211", 490 | "0AED3741", 491 | "B4D453442A", 492 | "B4D453442AF7124BB12832A4450F4F120452F479C0212E0924D34CFBE580BA42", 493 | "7B9878A4", 494 | "54AA328F270CEA1BEF013B2CB91781C206E388B762043957D5C462F8CA80D0E9" 495 | ], 496 | "3.4 (Photorealism)": [ 497 | "60FE2F34", 498 | "61A37ADF76", 499 | "61A37ADF761FBBF4CB3D88DA480216341113D0FBCF9F0F77EA71863866A9B6FC", 500 | "16CF0612", 501 | "80AFE7BF303BF2B96DD4668497AFF8DAE6B1EB5A50219810CBFF2AE9BDB5F61B", 502 | "C88E730A", 503 | "44F90A0972", 504 | "44F90A09727CA8B62EA304E140546A0AF96BA6EDCB229C20C677AA4460449C21", 505 | "C04B5D82", 506 | "CCA3A7A783CB24820A7AC257C0539853DB8CCAE3E3AA266333AFBBB98B5DB656", 507 | "73D359A0", 508 | "5346D7DE1F", 509 | "5346D7DE1F448E6953A12E9C186F3996AC07B6E1EA6076FC242BC484B48B7C95", 510 | "D6485E7B", 511 | "EFD8D522407E428B82FC7B55D815F892C3DB9B83D167BEAF19EA96F66EC17DAA", 512 | "5896F8D5", 513 | "EF8629E2C8", 514 | "EF8629E2C89E19A993146302418CF1FF3BA0384DD98523EAB6B88AC33EAD9D39", 515 | "205E0B2F", 516 | "C81E46A5D10BA796A70B64DD568AB140A4BB83EBD1E9C95778A9F2FB108FF1BE" 517 | ], 518 | "5.3 (Photorealism)": [ 519 | "CFC5DE0E", 520 | "F762CDEF02", 521 | "F762CDEF0235669136C16421E7F3AFFB47AB78E20890D5258347CF5AE571AF76", 522 | "E5E3746D", 523 | "FD5FE8327DC33B70885E8B8E6C272CAEC6D38BB64D2B727625A05C087FC9CAA4", 524 | "D0B457AE", 525 | "E3CDA540BF", 526 | "E3CDA540BF6F8C051C76886DF9E22E114BEF161A4E36C743C2AC82955E851C32", 527 | "179D2F18", 528 | "18E757729285EBAB87E98E1BE79C370C73B954DD2E96FDD2CD10075FB5AACB2E", 529 | "FAB2577C", 530 | "B914725D74", 531 | "B914725D74A248B88B38E4CDFF0D40BB1F4024F8BC851E4A71B813BDDA7F78E6", 532 | "0335A13C", 533 | "7DB9372689AED2F7C9D9C97B8245FB44BBD37BC2A0E5E570E7D6F164B529B34A", 534 | "00EE24B4", 535 | "93A10D6661", 536 | "93A10D6661F3BEB49C8605C2865B9CD5BACA2CFAF14943EDCD34D05B6E747649", 537 | "C8BF37FC", 538 | "1A804D3E6F68F924FD0CF8168DAD4D18751B3FBA965238887BF3C898C113133B" 539 | ], 540 | /** huggingface **/ 541 | "5.8 Rebuilt (Scifi+Anime)": [ 542 | "e0de8aae3eca7c8b23c668f3d43f4f203f9c0d4365a31072ccb8ff864004cd42", 543 | "847da9eead08fa6dfc11f95e479ee4e12bc6da4747b006ccefcd1e0e498f62c1", 544 | "710fc74d4cf3245cf5f1664f25502da0c7750f80e8bbbb56929e710043d84efa", 545 | "6a21b428a3fb7286f024f958c761ea1a36a5061c3d3c1eb6a815c88af0e97cb0" 546 | ] 547 | }, 548 | "abyssorangemix": { 549 | "3": [ 550 | "9600DA17", 551 | "5493A0EC49", 552 | "5493A0EC491F5961DBDC1C861404088A6AE9BD4007F6A3A7C5DEE8789CDC1361", 553 | "D3735BC9", 554 | "2FB17575610E265EF07A5C670A0F0D41A76251D0BF42756A1B3F2F7825CE77DD", 555 | "9600DA17", 556 | "EB4099BA9C", 557 | "EB4099BA9CD5E69AB526FCA22A2E967F286F8512D9509B735C892FA6468767CF", 558 | "A6AA9B91", 559 | "4B292B7C3B9F947E7364D86343F6B0BD652AFA5DB55C2C9F3527AA79B65B7F12", 560 | "9600DA17", 561 | "F303D10812", 562 | "F303D108122DDD43A34C160BD46DBB08CB0E088E979ACDA0BF168A7A1F5820E0", 563 | "D2BB8BF2", 564 | "3DBD7CC619281D2CB2D663509E90FAC46F7F430386373B92D5047B08FC510BA7", 565 | "9600DA17", 566 | "D124FC18F0", 567 | "D124FC18F0232D7F0A2A70358CDB1288AF9E1EE8596200F50F0936BE59514F6D", 568 | "212A0AEE", 569 | "49B4166A102951877F2134D1D7D6E8396B7ED0D33EE264F2B9479BC2DA7A1329" 570 | ] 571 | } 572 | } 573 | 574 | export default hashes; --------------------------------------------------------------------------------