Add Minimal Prompt Processing option (#5095) * Implement Minimal Prompt Processing * Fix and rename cmd argument. * Whitespace * Handle processing selection with a enum * Update processing argument description * Fix typo in minimal prompt processing label title * Add missing semi --------- Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Signed| @@ -284,6 +284,7 @@ const defaultSettings = { | ||
| 284 | 284 | snap: false, |
| 285 | 285 | free_extend: false, |
| 286 | 286 | function_tool: false, |
| 287 | + minimal_prompt_processing: false, | |
| 287 | 288 | |
| 288 | 289 | prompts: promptTemplates, |
| 289 | 290 | |
| @@ -547,6 +548,7 @@ async function loadSettings() { | ||
| 547 | 548 | $('#sd_comfy_prompt').val(extension_settings.sd.comfy_prompt); |
| 548 | 549 | $('#sd_comfy_runpod_url').val(extension_settings.sd.comfy_runpod_url); |
| 549 | 550 | $('#sd_snap').prop('checked', extension_settings.sd.snap); |
| 551 | + $('#sd_minimal_prompt_processing').prop('checked', extension_settings.sd.minimal_prompt_processing); | |
| 550 | 552 | $('#sd_clip_skip').val(extension_settings.sd.clip_skip); |
| 551 | 553 | $('#sd_clip_skip_value').val(extension_settings.sd.clip_skip); |
| 552 | 554 | $('#sd_seed').val(extension_settings.sd.seed); |
| @@ -669,6 +671,11 @@ function onSnapInput() { | ||
| 669 | 671 | saveSettingsDebounced(); |
| 670 | 672 | } |
| 671 | 673 | |
| 674 | +function onMinimalPromptProcessing() { | |
| 675 | + extension_settings.sd.minimal_prompt_processing = !!$(this).prop('checked'); | |
| 676 | + saveSettingsDebounced(); | |
| 677 | +} | |
| 678 | + | |
| 672 | 679 | function onStyleSelect() { |
| 673 | 680 | const selectedStyle = String($('#sd_style').find(':selected').val()); |
| 674 | 681 | const styleObject = extension_settings.sd.styles.find(x => x.name === selectedStyle); |
| @@ -2735,6 +2742,15 @@ function processReply(str) { | ||
| 2735 | 2742 | return ''; |
| 2736 | 2743 | } |
| 2737 | 2744 | |
| 2745 | + if (extension_settings.sd.minimal_prompt_processing) { | |
| 2746 | + // Minimal prompt processing | |
| 2747 | + // JSON and similar should be preserved | |
| 2748 | + str = str.normalize('NFD'); | |
| 2749 | + str = str.replace(/\s+/g, ' '); // Collapse multiple whitespaces into one | |
| 2750 | + str = str.trim(); | |
| 2751 | + return str; | |
| 2752 | + } | |
| 2753 | + | |
| 2738 | 2754 | str = str.replaceAll('"', ''); |
| 2739 | 2755 | str = str.replaceAll('“', ''); |
| 2740 | 2756 | str = str.replaceAll('\n', ', '); |
| @@ -5153,6 +5169,17 @@ function applyCommandArguments(args) { | ||
| 5153 | 5169 | 'denoise': 'denoising_strength', |
| 5154 | 5170 | '2ndpass': 'hr_second_pass_steps', |
| 5155 | 5171 | 'faces': 'restore_faces', |
| 5172 | + 'processing': 'minimal_prompt_processing', | |
| 5173 | + }; | |
| 5174 | + const enumHandlers = { | |
| 5175 | + 'processing': (value) => { | |
| 5176 | + if (/standard/gi.test(String(value))) { | |
| 5177 | + return false; | |
| 5178 | + } | |
| 5179 | + if (/minimal/gi.test(String(value))) { | |
| 5180 | + return true; | |
| 5181 | + } | |
| 5182 | + }, | |
| 5156 | 5183 | }; |
| 5157 | 5184 | |
| 5158 | 5185 | for (const [param, setting] of Object.entries(settingMap)) { |
| @@ -5161,6 +5188,14 @@ function applyCommandArguments(args) { | ||
| 5161 | 5188 | } |
| 5162 | 5189 | currentSettings[setting] = extension_settings.sd[setting]; |
| 5163 | 5190 | const value = String(args[param]); |
| 5191 | + const enumHandler = enumHandlers[param]; | |
| 5192 | + if (typeof enumHandler === 'function') { | |
| 5193 | + const enumValue = enumHandler(value); | |
| 5194 | + if (enumValue !== undefined) { | |
| 5195 | + overrideSettings[setting] = enumValue; | |
| 5196 | + } | |
| 5197 | + continue; | |
| 5198 | + } | |
| 5164 | 5199 | const type = typeof defaultSettings[setting]; |
| 5165 | 5200 | switch (type) { |
| 5166 | 5201 | case 'boolean': |
| @@ -5283,6 +5318,17 @@ jQuery(async () => { | ||
| 5283 | 5318 | acceptsMultiple: false, |
| 5284 | 5319 | }), |
| 5285 | 5320 | SlashCommandNamedArgument.fromProps({ |
| 5321 | + name: 'processing', | |
| 5322 | + description: 'level of response prompt processing returned by the LLM', | |
| 5323 | + typeList: [ARGUMENT_TYPE.STRING], | |
| 5324 | + enumList: [ | |
| 5325 | + new SlashCommandEnumValue('standard', 'Standard prompt processing'), | |
| 5326 | + new SlashCommandEnumValue('minimal', 'Minimal prompt processing'), | |
| 5327 | + ], | |
| 5328 | + isRequired: false, | |
| 5329 | + acceptsMultiple: false, | |
| 5330 | + }), | |
| 5331 | + SlashCommandNamedArgument.fromProps({ | |
| 5286 | 5332 | name: 'seed', |
| 5287 | 5333 | description: 'random seed', |
| 5288 | 5334 | isRequired: false, |
| @@ -5565,6 +5611,7 @@ jQuery(async () => { | ||
| 5565 | 5611 | $('#sd_openai_duration').on('input', onOpenAiDurationSelect); |
| 5566 | 5612 | $('#sd_multimodal_captioning').on('input', onMultimodalCaptioningInput); |
| 5567 | 5613 | $('#sd_snap').on('input', onSnapInput); |
| 5614 | + $('#sd_minimal_prompt_processing').on('input', onMinimalPromptProcessing); | |
| 5568 | 5615 | $('#sd_clip_skip').on('input', onClipSkipInput); |
| 5569 | 5616 | $('#sd_seed').on('input', onSeedInput); |
| 5570 | 5617 | $('#sd_character_prompt_share').on('input', onCharacterPromptShareInput); |
| @@ -35,6 +35,10 @@ | ||
| 35 | 35 | <input id="sd_snap" type="checkbox" /> |
| 36 | 36 | <span data-i18n="sd_snap_txt">Snap auto-adjusted resolutions</span> |
| 37 | 37 | </label> |
| 38 | + <label for="sd_minimal_prompt_processing" class="checkbox_label" data-i18n="[title]sd_minimal_prompt_processing" title="Reduce post-processing on a prompt generated by the LLM to preserve JSON and other structured output."> | |
| 39 | + <input id="sd_minimal_prompt_processing" type="checkbox" /> | |
| 40 | + <span data-i18n="sd_minimal_prompt_processing_txt">Minimal response prompt processing</span> | |
| 41 | + </label> | |
| 38 | 42 | <label for="sd_source" data-i18n="Source">Source</label> |
| 39 | 43 | <select id="sd_source"> |
| 40 | 44 | <option value="aimlapi">AI/ML API</option> |