diff --git a/public/script.js b/public/script.js index 8ab8daa36..6d9860278 100644 --- a/public/script.js +++ b/public/script.js @@ -881,7 +881,6 @@ let abortController; //css var css_send_form_display = $('
').css('display'); -const MAX_GENERATION_LOOPS = 5; var kobold_horde_model = ''; @@ -2864,10 +2863,10 @@ export function isStreamingEnabled() { const noStreamSources = [chat_completion_sources.SCALE]; return ( (main_api == 'openai' && - oai_settings.stream_openai && - !noStreamSources.includes(oai_settings.chat_completion_source) && - !(oai_settings.chat_completion_source == chat_completion_sources.OPENAI && oai_settings.openai_model.startsWith('o1-')) && - !(oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE && oai_settings.google_model.includes('bison'))) + oai_settings.stream_openai && + !noStreamSources.includes(oai_settings.chat_completion_source) && + !(oai_settings.chat_completion_source == chat_completion_sources.OPENAI && oai_settings.openai_model.startsWith('o1-')) && + !(oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE && oai_settings.google_model.includes('bison'))) || (main_api == 'kobold' && kai_settings.streaming_kobold && kai_flags.can_use_streaming) || (main_api == 'novel' && nai_settings.streaming_novel) || (main_api == 'textgenerationwebui' && textgen_settings.streaming)); @@ -3342,11 +3341,11 @@ function removeLastMessage() { * @param {GenerateOptions} options Generation options * @param {boolean} dryRun Whether to actually generate a message or just assemble the prompt * @returns {Promise} Returns a promise that resolves when the text is done generating. - * @typedef {{automatic_trigger?: boolean, force_name2?: boolean, quiet_prompt?: string, quietToLoud?: boolean, skipWIAN?: boolean, force_chid?: number, signal?: AbortSignal, quietImage?: string, maxLoops?: number, quietName?: string }} GenerateOptions + * @typedef {{automatic_trigger?: boolean, force_name2?: boolean, quiet_prompt?: string, quietToLoud?: boolean, skipWIAN?: boolean, force_chid?: number, signal?: AbortSignal, quietImage?: string, quietName?: string }} GenerateOptions */ -export async function Generate(type, { automatic_trigger, force_name2, quiet_prompt, quietToLoud, skipWIAN, force_chid, signal, quietImage, maxLoops, quietName } = {}, dryRun = false) { +export async function Generate(type, { automatic_trigger, force_name2, quiet_prompt, quietToLoud, skipWIAN, force_chid, signal, quietImage, quietName } = {}, dryRun = false) { console.log('Generate entered'); - await eventSource.emit(event_types.GENERATION_STARTED, type, { automatic_trigger, force_name2, quiet_prompt, quietToLoud, skipWIAN, force_chid, signal, quietImage, maxLoops }, dryRun); + await eventSource.emit(event_types.GENERATION_STARTED, type, { automatic_trigger, force_name2, quiet_prompt, quietToLoud, skipWIAN, force_chid, signal, quietImage }, dryRun); setGenerationProgress(0); generation_started = new Date(); @@ -3408,7 +3407,7 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro if (selected_group && !is_group_generating) { if (!dryRun) { // Returns the promise that generateGroupWrapper returns; resolves when generation is done - return generateGroupWrapper(false, type, { quiet_prompt, force_chid, signal: abortController.signal, quietImage, maxLoops }); + return generateGroupWrapper(false, type, { quiet_prompt, force_chid, signal: abortController.signal, quietImage }); } const characterIndexMap = new Map(characters.map((char, index) => [char.avatar, index])); @@ -4440,53 +4439,30 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro const displayIncomplete = type === 'quiet' && !quietToLoud; getMessage = cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncomplete); - if (getMessage.length > 0 || data.allowEmptyResponse) { - if (isImpersonate) { - $('#send_textarea').val(getMessage)[0].dispatchEvent(new Event('input', { bubbles: true })); - generatedPromptCache = ''; - await eventSource.emit(event_types.IMPERSONATE_READY, getMessage); - } - else if (type == 'quiet') { - unblockGeneration(type); - return getMessage; + if (isImpersonate) { + $('#send_textarea').val(getMessage)[0].dispatchEvent(new Event('input', { bubbles: true })); + generatedPromptCache = ''; + await eventSource.emit(event_types.IMPERSONATE_READY, getMessage); + } + else if (type == 'quiet') { + unblockGeneration(type); + return getMessage; + } + else { + // Without streaming we'll be having a full message on continuation. Treat it as a last chunk. + if (originalType !== 'continue') { + ({ type, getMessage } = await saveReply(type, getMessage, false, title, swipes)); } else { - // Without streaming we'll be having a full message on continuation. Treat it as a last chunk. - if (originalType !== 'continue') { - ({ type, getMessage } = await saveReply(type, getMessage, false, title, swipes)); - } - else { - ({ type, getMessage } = await saveReply('appendFinal', getMessage, false, title, swipes)); - } - - // This relies on `saveReply` having been called to add the message to the chat, so it must be last. - parseAndSaveLogprobs(data, continue_mag); + ({ type, getMessage } = await saveReply('appendFinal', getMessage, false, title, swipes)); } - if (type !== 'quiet') { - playMessageSound(); - } - } else { - // If maxLoops is not passed in (e.g. first time generating), set it to MAX_GENERATION_LOOPS - maxLoops ??= MAX_GENERATION_LOOPS; + // This relies on `saveReply` having been called to add the message to the chat, so it must be last. + parseAndSaveLogprobs(data, continue_mag); + } - if (maxLoops === 0) { - if (type !== 'quiet') { - throwCircuitBreakerError(); - } - throw new Error('Generate circuit breaker interruption'); - } - - // regenerate with character speech reenforced - // to make sure we leave on swipe type while also adding the name2 appendage - await delay(1000); - // A message was already deleted on regeneration, so instead treat is as a normal gen - if (type === 'regenerate') { - type = 'normal'; - } - // The first await is for waiting for the generate to start. The second one is waiting for it to finish - const result = await await Generate(type, { automatic_trigger, force_name2: true, quiet_prompt, quietToLoud, skipWIAN, force_chid, signal, quietImage, quietName, maxLoops: maxLoops - 1 }); - return result; + if (type !== 'quiet') { + playMessageSound(); } if (power_user.auto_swipe) { @@ -5259,11 +5235,6 @@ function getGenerateUrl(api) { } } -function throwCircuitBreakerError() { - callPopup(`Could not extract reply in ${MAX_GENERATION_LOOPS} attempts. Try generating again`, 'text'); - unblockGeneration(); -} - function extractTitleFromData(data) { if (main_api == 'koboldhorde') { return data.workerName;