Don't remove names from the past chat. Fix non-streaming auto-continue.

We took fair criticism from the NovelAI dev.
This commit is contained in:
Cohee 2023-09-15 23:32:01 +03:00
parent 985c2bcfb1
commit 6dd09858d4
9 changed files with 23 additions and 68 deletions

View File

@ -322,7 +322,6 @@ let safetychat = [
{
name: systemUserName,
is_user: false,
is_name: true,
create_date: 0,
mes: "You deleted a character/chat and arrived back here for safety reasons! Pick another character!",
},
@ -398,7 +397,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: renderTemplate("help"),
},
slash_commands: {
@ -406,7 +404,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: '',
},
hotkeys: {
@ -414,7 +411,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: renderTemplate("hotkeys"),
},
formatting: {
@ -422,7 +418,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: renderTemplate("formatting"),
},
macros: {
@ -430,7 +425,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: renderTemplate("macros"),
},
welcome:
@ -439,7 +433,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: renderTemplate("welcome"),
},
group: {
@ -447,7 +440,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
is_group: true,
mes: "Group chat created. Say 'Hi' to lovely people!",
},
@ -456,7 +448,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: "No one hears you. <b>Hint&#58;</b> add more members to the group!",
},
generic: {
@ -464,7 +455,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: "Generic system message. User `text` parameter to override the contents",
},
bookmark_created: {
@ -472,7 +462,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: `Bookmark created! Click here to open the bookmark chat: <a class="bookmark_link" file_name="{0}" href="javascript:void(null);">{1}</a>`,
},
bookmark_back: {
@ -480,7 +469,6 @@ function getSystemMessages() {
force_avatar: system_avatar,
is_user: false,
is_system: true,
is_name: true,
mes: `Click here to return to the previous chat: <a class="bookmark_link" file_name="{0}" href="javascript:void(null);">Return</a>`,
},
};
@ -2125,9 +2113,6 @@ class StreamingProcessor {
const isContinue = this.type == "continue";
text = this.removePrefix(text);
let processedText = cleanUpMessage(text, isImpersonate, isContinue, !isFinal);
let result = extractNameFromMessage(processedText, this.force_name2, isImpersonate);
let isName = result.this_mes_is_name;
processedText = result.getMessage;
// Predict unbalanced asterisks / quotes during streaming
const charsToBalance = ['*', '"'];
@ -2146,7 +2131,6 @@ class StreamingProcessor {
// Don't waste time calculating token count for streaming
let currentTokenCount = isFinal && power_user.message_token_count_enabled ? getTokenCount(processedText, 0) : 0;
const timePassed = formatGenerationTimer(this.timeStarted, currentTime, currentTokenCount);
chat[messageId]['is_name'] = isName;
chat[messageId]['mes'] = processedText;
chat[messageId]['gen_started'] = this.timeStarted;
chat[messageId]['gen_finished'] = currentTime;
@ -2502,7 +2486,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
console.log(`Core/all messages: ${coreChat.length}/${chat.length}`);
// kingbri MARK: - Make sure the prompt bias isn't the same as the user bias
if ((promptBias && !isUserPromptBias) || power_user.always_force_name2) {
if ((promptBias && !isUserPromptBias) || power_user.always_force_name2 || main_api == 'novel') {
force_name2 = true;
}
@ -3093,7 +3077,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
if (isStreamingEnabled() && type !== 'quiet') {
hideSwipeButtons();
let getMessage = await streamingProcessor.generate();
let messageChunk = extractNameFromMessage(cleanUpMessage(getMessage, isImpersonate, isContinue, false), force_name2, isImpersonate).getMessage;
let messageChunk = cleanUpMessage(getMessage, isImpersonate, isContinue, false);
if (isContinue) {
getMessage = continue_mag + getMessage;
@ -3121,6 +3105,8 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
let title = extractTitleFromData(data);
kobold_horde_model = title;
messageChunk = cleanUpMessage(getMessage, isImpersonate, isContinue, false);
if (isContinue) {
getMessage = continue_mag + getMessage;
}
@ -3129,8 +3115,6 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
const displayIncomplete = type == 'quiet';
getMessage = cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncomplete);
let this_mes_is_name;
({ this_mes_is_name, getMessage } = extractNameFromMessage(getMessage, force_name2, isImpersonate));
if (getMessage.length > 0) {
if (isImpersonate) {
$('#send_textarea').val(getMessage).trigger('input');
@ -3143,10 +3127,10 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
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, this_mes_is_name, title));
({ type, getMessage } = await saveReply(type, getMessage, true, title));
}
else {
({ type, getMessage } = await saveReply('appendFinal', getMessage, this_mes_is_name, title));
({ type, getMessage } = await saveReply('appendFinal', getMessage, true, title));
}
}
activateSendButtons();
@ -3196,8 +3180,6 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
return
}
}
messageChunk = getMessage;
} else {
generatedPromptCache = '';
activateSendButtons();
@ -3352,7 +3334,7 @@ function formatMessageHistoryItem(chatItem, isInstruct, forceOutputSequence) {
const isNarratorType = chatItem?.extra?.type === system_message_types.NARRATOR;
const characterName = (selected_group || chatItem.force_avatar) ? chatItem.name : name2;
const itemName = chatItem.is_user ? chatItem['name'] : characterName;
const shouldPrependName = (chatItem.is_name || chatItem.force_avatar || selected_group) && !isNarratorType;
const shouldPrependName = !isNarratorType;
let textResult = shouldPrependName ? `${itemName}: ${chatItem.mes}\n` : `${chatItem.mes}\n`;
@ -3375,7 +3357,6 @@ export async function sendMessageAsUser(textareaText, messageBias) {
chat[chat.length] = {};
chat[chat.length - 1]['name'] = name1;
chat[chat.length - 1]['is_user'] = true;
chat[chat.length - 1]['is_name'] = true;
chat[chat.length - 1]['send_date'] = getMessageTimeStamp();
chat[chat.length - 1]['mes'] = substituteParams(textareaText);
chat[chat.length - 1]['extra'] = {};
@ -3709,25 +3690,6 @@ function getGenerateUrl() {
return generate_url;
}
function extractNameFromMessage(getMessage, force_name2, isImpersonate) {
const nameToTrim = isImpersonate ? name1 : name2;
let this_mes_is_name = true;
if (getMessage.startsWith(nameToTrim + ":")) {
getMessage = getMessage.replace(nameToTrim + ':', '');
getMessage = getMessage.trimStart();
} else {
this_mes_is_name = false;
}
if (force_name2 || power_user.instruct.enabled)
this_mes_is_name = true;
if (isImpersonate) {
getMessage = getMessage.trim();
}
return { this_mes_is_name, getMessage };
}
function throwCircuitBreakerError() {
callPopup(`Could not extract reply in ${MAX_GENERATION_LOOPS} attempts. Try generating again`, 'text');
generate_loop_counter = 0;
@ -3877,10 +3839,22 @@ function cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncomplete
if (power_user.auto_fix_generated_markdown) {
getMessage = fixMarkdown(getMessage, false);
}
const nameToTrim2 = isImpersonate ? name1 : name2;
if (getMessage.startsWith(nameToTrim2 + ":")) {
getMessage = getMessage.replace(nameToTrim2 + ':', '');
getMessage = getMessage.trimStart();
}
if (isImpersonate) {
getMessage = getMessage.trim();
}
return getMessage;
}
async function saveReply(type, getMessage, this_mes_is_name, title) {
async function saveReply(type, getMessage, _, title) {
if (type != 'append' && type != 'continue' && type != 'appendFinal' && chat.length && (chat[chat.length - 1]['swipe_id'] === undefined ||
chat[chat.length - 1]['is_user'])) {
type = 'normal';
@ -3953,7 +3927,6 @@ async function saveReply(type, getMessage, this_mes_is_name, title) {
chat[chat.length - 1]['extra'] = {};
chat[chat.length - 1]['name'] = name2;
chat[chat.length - 1]['is_user'] = false;
chat[chat.length - 1]['is_name'] = this_mes_is_name;
chat[chat.length - 1]['send_date'] = getMessageTimeStamp();
chat[chat.length - 1]["extra"]["api"] = getGeneratingApi();
chat[chat.length - 1]["extra"]["model"] = getGeneratingModel();
@ -3975,7 +3948,6 @@ async function saveReply(type, getMessage, this_mes_is_name, title) {
if (characters[this_chid].avatar != 'none') {
avatarImg = getThumbnailUrl('avatar', characters[this_chid].avatar);
}
chat[chat.length - 1]['is_name'] = true;
chat[chat.length - 1]['force_avatar'] = avatarImg;
chat[chat.length - 1]['original_avatar'] = characters[this_chid].avatar;
chat[chat.length - 1]['extra']['gen_id'] = group_generation_id;
@ -4463,7 +4435,6 @@ function getFirstMessage() {
name: name2,
is_user: false,
is_system: false,
is_name: true,
send_date: getMessageTimeStamp(),
mes: getRegexedString(firstMes, regex_placement.AI_OUTPUT),
extra: {},
@ -5046,11 +5017,11 @@ function updateMessage(div) {
const mes = chat[this_edit_mes_id];
let regexPlacement;
if (mes.is_name && mes.is_user) {
if (mes.is_user) {
regexPlacement = regex_placement.USER_INPUT;
} else if (mes.is_name && mes.name === name2) {
} else if (mes.name === name2) {
regexPlacement = regex_placement.AI_OUTPUT;
} else if (mes.is_name && mes.name !== name2 || mes.extra?.type === "narrator") {
} else if (mes.name !== name2 || mes.extra?.type === "narrator") {
regexPlacement = regex_placement.SLASH_COMMAND;
}

View File

@ -280,7 +280,6 @@ async function convertSoloToGroupChat() {
message.name = character.name;
message.original_avatar = character.avatar;
message.force_avatar = getThumbnailUrl('avatar', character.avatar);
message.is_name = true;
// Allow regens of a single message in group
if (typeof message.extra !== 'object') {

View File

@ -53,7 +53,6 @@ async function sendCaptionedMessage(caption, image) {
const message = {
name: context.name1,
is_user: true,
is_name: true,
send_date: getMessageTimeStamp(),
mes: messageText,
extra: {

View File

@ -508,7 +508,6 @@ async function onSelectInjectFile(e) {
meta: JSON.stringify({
name: file.name,
is_user: false,
is_name: false,
is_system: false,
send_date: humanizedDateTime(),
mes: m,
@ -686,7 +685,6 @@ window.chromadb_interceptGeneration = async (chat, maxContext) => {
const charname = context.name2;
newChat.push(
{
is_name: false,
is_user: false,
mes: `[Use these past chat exchanges to inform ${charname}'s next response:`,
name: "system",
@ -696,7 +694,6 @@ window.chromadb_interceptGeneration = async (chat, maxContext) => {
newChat.push(...queriedMessages.map(m => m.meta).filter(onlyUnique).map(JSON.parse));
newChat.push(
{
is_name: false,
is_user: false,
mes: `]\n`,
name: "system",
@ -752,7 +749,6 @@ window.chromadb_interceptGeneration = async (chat, maxContext) => {
newChat.push(
{
is_name: false,
is_user: false,
mes: recallStart,
name: "system",
@ -762,7 +758,6 @@ window.chromadb_interceptGeneration = async (chat, maxContext) => {
newChat.push(...queriedMessages.map(m => m.meta).filter(onlyUnique).map(JSON.parse));
newChat.push(
{
is_name: false,
is_user: false,
mes: recallEnd + `\n`,
name: "system",

View File

@ -165,7 +165,6 @@ async function processTranscript(transcript) {
const message = {
name: context.name1,
is_user: true,
is_name: true,
send_date: getMessageTimeStamp(),
mes: messageText,
};

View File

@ -1246,7 +1246,6 @@ async function sendMessage(prompt, image) {
name: context.groupId ? systemUserName : context.name2,
is_user: false,
is_system: true,
is_name: true,
send_date: getMessageTimeStamp(),
mes: context.groupId ? p(messageText) : messageText,
extra: {

View File

@ -205,7 +205,6 @@ function getFirstCharacterMessage(character) {
mes["is_user"] = false;
mes["is_system"] = false;
mes["name"] = character.name;
mes["is_name"] = true;
mes["send_date"] = getMessageTimeStamp();
mes["original_avatar"] = character.avatar;
mes["extra"] = { "gen_id": Date.now() * Math.random() * 1000000 };

View File

@ -325,7 +325,6 @@ async function sendMessageAs(_, text) {
const message = {
name: name,
is_user: false,
is_name: true,
is_system: isSystem,
send_date: getMessageTimeStamp(),
mes: substituteParams(mesText),
@ -357,7 +356,6 @@ async function sendNarratorMessage(_, text) {
const message = {
name: name,
is_user: false,
is_name: false,
is_system: isSystem,
send_date: getMessageTimeStamp(),
mes: substituteParams(text.trim()),
@ -384,7 +382,6 @@ async function sendCommentMessage(_, text) {
const message = {
name: COMMENT_NAME_DEFAULT,
is_user: false,
is_name: true,
is_system: true,
send_date: getMessageTimeStamp(),
mes: substituteParams(text.trim()),

View File

@ -2299,7 +2299,6 @@ app.post("/importchat", urlencodedParser, function (request, response) {
(message) => ({
name: message.src.is_human ? user_name : ch_name,
is_user: message.src.is_human,
is_name: true,
send_date: humanizedISO8601DateTime(),
mes: message.text,
})
@ -2344,7 +2343,6 @@ app.post("/importchat", urlencodedParser, function (request, response) {
const userMessage = {
name: user_name,
is_user: true,
is_name: true,
send_date: humanizedISO8601DateTime(),
mes: arr[0],
};
@ -2354,7 +2352,6 @@ app.post("/importchat", urlencodedParser, function (request, response) {
const charMessage = {
name: ch_name,
is_user: false,
is_name: true,
send_date: humanizedISO8601DateTime(),
mes: arr[1],
};