mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-03-02 19:07:40 +01:00
Remove empty message looping
This commit is contained in:
parent
db2b356942
commit
d99a5eba2a
@ -881,7 +881,6 @@ let abortController;
|
|||||||
|
|
||||||
//css
|
//css
|
||||||
var css_send_form_display = $('<div id=send_form></div>').css('display');
|
var css_send_form_display = $('<div id=send_form></div>').css('display');
|
||||||
const MAX_GENERATION_LOOPS = 5;
|
|
||||||
|
|
||||||
var kobold_horde_model = '';
|
var kobold_horde_model = '';
|
||||||
|
|
||||||
@ -2864,10 +2863,10 @@ export function isStreamingEnabled() {
|
|||||||
const noStreamSources = [chat_completion_sources.SCALE];
|
const noStreamSources = [chat_completion_sources.SCALE];
|
||||||
return (
|
return (
|
||||||
(main_api == 'openai' &&
|
(main_api == 'openai' &&
|
||||||
oai_settings.stream_openai &&
|
oai_settings.stream_openai &&
|
||||||
!noStreamSources.includes(oai_settings.chat_completion_source) &&
|
!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.OPENAI && oai_settings.openai_model.startsWith('o1-')) &&
|
||||||
!(oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE && oai_settings.google_model.includes('bison')))
|
!(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 == 'kobold' && kai_settings.streaming_kobold && kai_flags.can_use_streaming)
|
||||||
|| (main_api == 'novel' && nai_settings.streaming_novel)
|
|| (main_api == 'novel' && nai_settings.streaming_novel)
|
||||||
|| (main_api == 'textgenerationwebui' && textgen_settings.streaming));
|
|| (main_api == 'textgenerationwebui' && textgen_settings.streaming));
|
||||||
@ -3342,11 +3341,11 @@ function removeLastMessage() {
|
|||||||
* @param {GenerateOptions} options Generation options
|
* @param {GenerateOptions} options Generation options
|
||||||
* @param {boolean} dryRun Whether to actually generate a message or just assemble the prompt
|
* @param {boolean} dryRun Whether to actually generate a message or just assemble the prompt
|
||||||
* @returns {Promise<any>} Returns a promise that resolves when the text is done generating.
|
* @returns {Promise<any>} 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');
|
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);
|
setGenerationProgress(0);
|
||||||
generation_started = new Date();
|
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 (selected_group && !is_group_generating) {
|
||||||
if (!dryRun) {
|
if (!dryRun) {
|
||||||
// Returns the promise that generateGroupWrapper returns; resolves when generation is done
|
// 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]));
|
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;
|
const displayIncomplete = type === 'quiet' && !quietToLoud;
|
||||||
getMessage = cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncomplete);
|
getMessage = cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncomplete);
|
||||||
|
|
||||||
if (getMessage.length > 0 || data.allowEmptyResponse) {
|
if (isImpersonate) {
|
||||||
if (isImpersonate) {
|
$('#send_textarea').val(getMessage)[0].dispatchEvent(new Event('input', { bubbles: true }));
|
||||||
$('#send_textarea').val(getMessage)[0].dispatchEvent(new Event('input', { bubbles: true }));
|
generatedPromptCache = '';
|
||||||
generatedPromptCache = '';
|
await eventSource.emit(event_types.IMPERSONATE_READY, getMessage);
|
||||||
await eventSource.emit(event_types.IMPERSONATE_READY, getMessage);
|
}
|
||||||
}
|
else if (type == 'quiet') {
|
||||||
else if (type == 'quiet') {
|
unblockGeneration(type);
|
||||||
unblockGeneration(type);
|
return getMessage;
|
||||||
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 {
|
else {
|
||||||
// Without streaming we'll be having a full message on continuation. Treat it as a last chunk.
|
({ type, getMessage } = await saveReply('appendFinal', getMessage, false, title, swipes));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type !== 'quiet') {
|
// This relies on `saveReply` having been called to add the message to the chat, so it must be last.
|
||||||
playMessageSound();
|
parseAndSaveLogprobs(data, continue_mag);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// If maxLoops is not passed in (e.g. first time generating), set it to MAX_GENERATION_LOOPS
|
|
||||||
maxLoops ??= MAX_GENERATION_LOOPS;
|
|
||||||
|
|
||||||
if (maxLoops === 0) {
|
if (type !== 'quiet') {
|
||||||
if (type !== 'quiet') {
|
playMessageSound();
|
||||||
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 (power_user.auto_swipe) {
|
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) {
|
function extractTitleFromData(data) {
|
||||||
if (main_api == 'koboldhorde') {
|
if (main_api == 'koboldhorde') {
|
||||||
return data.workerName;
|
return data.workerName;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user