cleanUpMessages() now uses object args. Adding option to trim names.

c4175697ef69b673b0d2bb1f2b89592d5e4eda35

qvink <qvink@users.noreply.github.com>

2 files changed, +80 -13Showing whitespace changes
public/script.js+74 -12
@@ -3315,11 +3315,23 @@ class StreamingProcessor {
33153315
33163316 if (!isImpersonate && !isContinue && Array.isArray(this.swipes) && this.swipes.length > 0) {
33173317 for (let i = 0; i < this.swipes.length; i++) {
33183318 this.swipes[i] = cleanUpMessage(this.swipes[i], false, false, true, this.stoppingStrings);{
3319+ getMessage: this.swipes[i],
3320+ isImpersonate: false,
3321+ isContinue: false,
3322+ displayIncompleteSentences: true,
3323+ stoppingStrings: this.stoppingStrings
3324+ });
33193325 }
33203326 }
33213327
3322- let processedText = cleanUpMessage(text, isImpersonate, isContinue, !isFinal, this.stoppingStrings);
3328+ let processedText = cleanUpMessage({
3329+ getMessage: text,
3330+ isImpersonate: isImpersonate,
3331+ isContinue: isContinue,
3332+ displayIncompleteSentences: !isFinal,
3333+ stoppingStrings: this.stoppingStrings
3334+ });
33233335
33243336 const charsToBalance = ['*', '"', '```'];
33253337 for (const char of charsToBalance) {
@@ -3643,7 +3655,13 @@ export async function generateRaw(prompt, api, instructOverride, quietToLoud, sy
36433655 }
36443656
36453657 // format result, exclude user prompt bias
3646- const message = cleanUpMessage(extractMessageFromData(data), false, false, true, null, false);
3658+ const message = cleanUpMessage({
3659+ getMessage: extractMessageFromData(data),
3660+ isImpersonate: false,
3661+ isContinue: false,
3662+ displayIncompleteSentences: true,
3663+ includeUserPromptBias: false
3664+ });
36473665
36483666 if (!message) {
36493667 throw new Error('No message generated');
@@ -4844,7 +4862,12 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
48444862
48454863 hideSwipeButtons();
48464864 let getMessage = await streamingProcessor.generate();
48474865 let messageChunk = cleanUpMessage(getMessage, isImpersonate, isContinue, false);{
4866+ getMessage: getMessage,
4867+ isImpersonate: isImpersonate,
4868+ isContinue: isContinue,
4869+ displayIncompleteSentences: false
4870+ });
48484871
48494872 if (isContinue) {
48504873 getMessage = continue_mag + getMessage;
@@ -4928,7 +4951,14 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
49284951
49294952 const swipes = extractMultiSwipes(data, type);
49304953
49314954 messageChunk = cleanUpMessage(getMessage, isImpersonate, isContinue, false);{
4955+ getMessage: getMessage,
4956+ isImpersonate: isImpersonate,
4957+ isContinue: isContinue,
4958+ displayIncompleteSentences: false
4959+ });
4960+
4961+
49324962 reasoning = getRegexedString(reasoning, regex_placement.REASONING);
49334963
49344964 if (power_user.trim_spaces) {
@@ -4942,7 +4972,12 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
49424972
49434973 //Formating
49444974 const displayIncomplete = type === 'quiet' && !quietToLoud;
49454975 getMessage = cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncomplete);{
4976+ getMessage: getMessage,
4977+ isImpersonate: isImpersonate,
4978+ isContinue: isContinue,
4979+ displayIncompleteSentences: displayIncomplete
4980+ });
49464981
49474982 if (isImpersonate) {
49484983 $('#send_textarea').val(getMessage)[0].dispatchEvent(new Event('input', { bubbles: true }));
@@ -5908,7 +5943,13 @@ function extractMultiSwipes(data, type) {
59085943
59095944 for (let i = 1; i < data.choices.length; i++) {
59105945 const text = data?.choices[i]?.message?.content ?? data?.choices[i]?.text ?? '';
59115946 const cleanedText = cleanUpMessage(text, false, false, false);{
5947+ getMessage: text,
5948+ isImpersonate: false,
5949+ isContinue: false,
5950+ displayIncompleteSentences: false
5951+ });
5952+
59125953 swipes.push(cleanedText);
59135954 }
59145955 }
@@ -5916,7 +5957,25 @@ function extractMultiSwipes(data, type) {
59165957 return swipes;
59175958}
59185959
5919-export function cleanUpMessage(getMessage, isImpersonate, isContinue, displayIncompleteSentences = false, stoppingStrings = null, includeUserPromptBias = true) {
5960+/**
5961+ * Formats a message according to user settings
5962+ * @param {object} [options] - Additional options.
5963+ * @param {string} [options.getMessage] The message to clean up
5964+ * @param {boolean} [options.isImpersonate] Whether this is an impersonated message
5965+ * @param {boolean} [options.isContinue] Whether this is a continued message
5966+ * @param {boolean} [options.displayIncompleteSentences] Whether to *not* trim incomplete sentences.
5967+ * @param {array} [options.stoppingStrings] Array of stopping strings.
5968+ * @param {boolean} [options.includeUserPromptBias] Whether to permit prepending the user prompt bias at the beginning.
5969+@param {boolean} [options.trimNames] Whether to allow trimming "{{char}}:" or "{{user}}:" from the beginning.
5970+ *
5971+ * @returns {string} The formatted message
5972+ */
5973+export function cleanUpMessage({ getMessage, isImpersonate, isContinue, displayIncompleteSentences = false, stoppingStrings = null, includeUserPromptBias = true, trimNames = true} = {}) {
5974+ if (arguments.length > 0 && typeof arguments[0] !== 'object') {
5975+ console.trace('cleanUpMessage called with positional arguments. Please use an object instead.');
5976+ [getMessage, isImpersonate, isContinue, displayIncompleteSentences, stoppingStrings, includeUserPromptBias] = arguments;
5977+ }
5978+
59205979 if (!getMessage) {
59215980 return '';
59225981 }
@@ -5961,12 +6020,12 @@ export function cleanUpMessage(getMessage, isImpersonate, isContinue, displayInc
59616020 // "trailing whitespace on newlines\nevery line of the string\nsample text"
59626021 getMessage = getMessage.replace(/[^\S\r\n]+$/gm, '');
59636022
6023+ // Trim instances of "{{name}}:" from the start of the message+
6024+ if (trimNames) {
59646025 let nameToTrim = isImpersonate ? name2 : name1;
5965-
59666026 if (isImpersonate) {
59676027 nameToTrim = power_user.allow_name2_display ? '' : name2;
5968- }
6028+ } else {
5969- else {
59706029 nameToTrim = power_user.allow_name1_display ? '' : name1;
59716030 }
59726031
@@ -5978,9 +6037,10 @@ export function cleanUpMessage(getMessage, isImpersonate, isContinue, displayInc
59786037 // account for case where the name is after a newline
59796038 let startIndex = getMessage.indexOf(`\n${nameToTrim}:`)
59806039 if (nameToTrim && startIndex >= 0) {
5981- // get text from after the name (and colon) to the end of the string
59826040 getMessage = getMessage.substring(startIndex + nameToTrim.length + 2);
59836041 }
6042+ getMessage.trimStart();
6043+ }
59846044
59856045 if (getMessage.indexOf('<|endoftext|>') != -1) {
59866046 getMessage = getMessage.substring(0, getMessage.indexOf('<|endoftext|>'));
@@ -6041,6 +6101,7 @@ export function cleanUpMessage(getMessage, isImpersonate, isContinue, displayInc
60416101 getMessage = fixMarkdown(getMessage, false);
60426102 }
60436103
6104+ if (trimNames) {
60446105 const nameToTrim2 = isImpersonate
60456106 ? (!power_user.allow_name1_display ? name1 : '')
60466107 : (!power_user.allow_name2_display ? name2 : '');
@@ -6049,6 +6110,7 @@ export function cleanUpMessage(getMessage, isImpersonate, isContinue, displayInc
60496110 getMessage = getMessage.replace(nameToTrim2 + ':', '');
60506111 getMessage = getMessage.trimStart();
60516112 }
6113+ }
60526114
60536115 if (isImpersonate) {
60546116 getMessage = getMessage.trim();
public/scripts/logprobs.js+6 -1
@@ -368,7 +368,12 @@ function onToggleLogprobsPanel() {
368368function createSwipe(messageId, prompt) {
369369 // need to call `cleanUpMessage` on our new prompt, because we were working
370370 // with raw model output and our new prompt is missing trimming/macro replacements
371371 const cleanedPrompt = cleanUpMessage(prompt, false, false, true);{
372+ getMessage: prompt,
373+ isImpersonate: false,
374+ isContinue: false,
375+ displayIncompleteSentences: true
376+ });
372377
373378 const msg = chat[messageId];
374379 const newSwipeInfo = {