Refactor instruct names behavior controls (#2837) * Refactor instruct names behavior controls Closes #2819 * Remove current persona from force names * Don't add current user name in groups * Revert to old text * Add titles to names behavior * Proper default for names_behavior

ca4d3c5ffee455baaa02d52d92626abd7209ce93

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
33 files changed, +80 -79Ignore whitespace
default/content/presets/instruct/Adventure.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Alpaca-Roleplay.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": true"always",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Alpaca-Single-Turn.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Alpaca.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/ChatML-Names.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "<|im_end|>",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/ChatML.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "<|im_end|>",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": true"always",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Command R.json+2 -3
@@ -9,8 +9,7 @@
99 "stop_sequence": "<|END_OF_TURN_TOKEN|>",
1010 "wrap": false,
1111 "macro": true,
1212 "namesnames_behavior": true"always",
13- "names_force_groups": true,
1413 "activation_regex": "",
1514 "skip_examples": false,
1615 "output_suffix": "<|END_OF_TURN_TOKEN|>",
@@ -21,4 +20,4 @@
2120 "last_system_sequence": "",
2221 "system_same_as_user": false,
2322 "name": "Command R"
24-}
24 \ No newline at end of file
23+}
default/content/presets/instruct/DreamGen Role-Play V1 ChatML.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "\n<|im_start|>",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/DreamGen Role-Play V1 Llama3.json+2 -3
@@ -10,9 +10,8 @@
1010 "separator_sequence": "",
1111 "wrap": false,
1212 "macro": true,
1313 "namesnames_behavior": false"none",
14- "names_force_groups": false,
1514 "activation_regex": "",
1615 "skip_examples": false,
1716 "name": "DreamGen Role-Play V1 Llama3"
18-}
18 \ No newline at end of file
17+}
default/content/presets/instruct/Gemma 2.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "<end_of_turn>",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Koala.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "BEGINNING OF CONVERSATION: ",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Libra-32B.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": true"always",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Lightning 1.1.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Llama 2 Chat.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Llama 3 Instruct.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "<|eot_id|>",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": true"always",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Llama-3-Instruct-Names.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "<|eot_id|>",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Metharme.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "</s>",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "<|system|>",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Mistral.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": true"always",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/OpenOrca-OpenChat.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Phi.json+2 -3
@@ -9,8 +9,7 @@
99 "stop_sequence": "<|end|>",
1010 "wrap": false,
1111 "macro": true,
1212 "namesnames_behavior": true"always",
13- "names_force_groups": true,
1413 "activation_regex": "",
1514 "skip_examples": false,
1615 "output_suffix": "<|end|>\n",
@@ -21,4 +20,4 @@
2120 "last_system_sequence": "",
2221 "system_same_as_user": false,
2322 "name": "Phi"
24-}
24 \ No newline at end of file
23+}
default/content/presets/instruct/Pygmalion.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "<|user|>",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": true"always",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "<|system|>",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Story.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Synthia.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "SYSTEM: ",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Vicuna 1.0.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/Vicuna 1.1.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": false,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "BEGINNING OF CONVERSATION:",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/WizardLM-13B.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/WizardLM.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"force",
11- "names_force_groups": true,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/presets/instruct/simple-proxy-for-tavern.json+1 -2
@@ -7,8 +7,7 @@
77 "stop_sequence": "",
88 "wrap": true,
99 "macro": true,
1010 "namesnames_behavior": false"none",
11- "names_force_groups": false,
1211 "activation_regex": "",
1312 "system_sequence_prefix": "",
1413 "system_sequence_suffix": "",
default/content/settings.json+1 -2
@@ -162,8 +162,7 @@
162162 "stop_sequence": "",
163163 "wrap": true,
164164 "macro": true,
165165 "namesnames_behavior": false"force",
166- "names_force_groups": true,
167166 "activation_regex": "",
168167 "system_sequence_prefix": "",
169168 "system_sequence_suffix": "",
public/index.html+17 -8
@@ -3297,14 +3297,23 @@
32973297 <input id="instruct_skip_examples" type="checkbox" />
32983298 <small data-i18n="Skip Example Dialogues Formatting">Skip Example Dialogues Formatting</small>
32993299 </label>
33003300 <label for="instruct_names"div classid="checkbox_labelinstruct_names_behavior">
33013301 <inputsmall iddata-i18n="instruct_names"Include type="checkboxNames" />
3302- <small data-i18n="Include Names">Include Names</small>
3302+ Include Names
33033303 </labelsmall>
33043304 <label for="instruct_names_force_groupsinstruct_names_behavior_none" class="checkbox_label" indent20ptitle="Do not add name prefixes before the message contents.">
33053305 <input id="instruct_names_force_groupsinstruct_names_behavior_none" name="names_behavior" value="none" type="checkboxradio" />
33063306 <small data-i18n="Force for Groups and PersonasNever">Force for Groups and PersonasNever</small>
33073307 </label>
3308+ <label for="instruct_names_behavior_force" class="checkbox_label" title="Only add name prefixes to messages from group characters and past personas.">
3309+ <input id="instruct_names_behavior_force" name="names_behavior" value="force" type="radio" />
3310+ <small data-i18n="Groups and Past Personas">Groups and Past Personas</small>
3311+ </label>
3312+ <label for="instruct_names_behavior_always" class="checkbox_label" title="Always add name prefixes to messages.">
3313+ <input id="instruct_names_behavior_always" name="names_behavior" value="always" type="radio" />
3314+ <small data-i18n="Always">Always</small>
3315+ </label>
3316+ </div>
33083317 </div>
33093318 </div>
33103319 <div name="tokenizerSettingsBlock">
public/scripts/instruct-mode.js+28 -7
@@ -14,6 +14,12 @@ import { regexFromString, resetScrollHeight } from './utils.js';
1414 */
1515export let instruct_presets = [];
1616
17+export const names_behavior_types = {
18+ NONE: 'none',
19+ FORCE: 'force',
20+ ALWAYS: 'always',
21+};
22+
1723const controls = [
1824 { id: 'instruct_enabled', property: 'enabled', isCheckbox: true },
1925 { id: 'instruct_wrap', property: 'wrap', isCheckbox: true },
@@ -30,8 +36,6 @@ const controls = [
3036 { id: 'instruct_user_alignment_message', property: 'user_alignment_message', isCheckbox: false },
3137 { id: 'instruct_stop_sequence', property: 'stop_sequence', isCheckbox: false },
3238 { id: 'instruct_names', property: 'names', isCheckbox: true },
33- { id: 'instruct_macro', property: 'macro', isCheckbox: true },
34- { id: 'instruct_names_force_groups', property: 'names_force_groups', isCheckbox: true },
3539 { id: 'instruct_first_output_sequence', property: 'first_output_sequence', isCheckbox: false },
3640 { id: 'instruct_last_output_sequence', property: 'last_output_sequence', isCheckbox: false },
3741 { id: 'instruct_first_input_sequence', property: 'first_input_sequence', isCheckbox: false },
@@ -39,6 +43,7 @@ const controls = [
3943 { id: 'instruct_activation_regex', property: 'activation_regex', isCheckbox: false },
4044 { id: 'instruct_bind_to_context', property: 'bind_to_context', isCheckbox: true },
4145 { id: 'instruct_skip_examples', property: 'skip_examples', isCheckbox: true },
46+ { id: 'instruct_names_behavior input[name="names_behavior"]', property: 'names_behavior', isCheckbox: false },
4247 { id: 'instruct_system_same_as_user', property: 'system_same_as_user', isCheckbox: true, trigger: true },
4348];
4449
@@ -54,6 +59,15 @@ function migrateInstructModeSettings(settings) {
5459 delete settings.separator_sequence;
5560 }
5661
62+ // names, names_force_groups => names_behavior
63+ if (settings.names !== undefined) {
64+ settings.names_behavior = settings.names
65+ ? names_behavior_types.ALWAYS
66+ : (settings.names_force_groups ? names_behavior_types.FORCE : names_behavior_types.NONE);
67+ delete settings.names;
68+ delete settings.names_force_groups;
69+ }
70+
5771 const defaults = {
5872 input_suffix: '',
5973 system_sequence: '',
@@ -65,6 +79,7 @@ function migrateInstructModeSettings(settings) {
6579 names_force_groups: true,
6680 skip_examples: false,
6781 system_same_as_user: false,
82+ names_behavior: names_behavior_types.FORCE,
6883 };
6984
7085 for (let key in defaults) {
@@ -94,6 +109,9 @@ export async function loadInstructMode(data) {
94109
95110 if (control.isCheckbox) {
96111 $element.prop('checked', power_user.instruct[control.property]);
112+ } else if (control.property === 'names_behavior') {
113+ const behavior = power_user.instruct[control.property];
114+ $element.filter(`[value="${behavior}"]`).prop('checked', true);
97115 } else {
98116 $element.val(power_user.instruct[control.property]);
99117 }
@@ -311,9 +329,9 @@ export const force_output_sequence = {
311329 * @returns {string} Formatted instruct mode chat message.
312330 */
313331export function formatInstructModeChat(name, mes, isUser, isNarrator, forceAvatar, name1, name2, forceOutputSequence) {
314332 let includeNames = isNarrator ? false : power_user.instruct.namesnames_behavior === names_behavior_types.ALWAYS;
315333
316334 if (!isNarrator && power_user.instruct.names_force_groupsnames_behavior === names_behavior_types.FORCE && ((selected_group && name !== name1) || (forceAvatar && name !== name1))) {
317335 includeNames = true;
318336 }
319337
@@ -416,7 +434,7 @@ export function formatInstructModeExamples(mesExamplesArray, name1, name2) {
416434 return mesExamplesArray.map(x => x.replace(/<START>\n/i, blockHeading));
417435 }
418436
419437 const includeNames = power_user.instruct.namesnames_behavior === names_behavior_types.ALWAYS || (!!selected_group && power_user.instruct.names_force_groupsnames_behavior === names_behavior_types.FORCE);
420438
421439 let inputPrefix = power_user.instruct.input_sequence || '';
422440 let outputPrefix = power_user.instruct.output_sequence || '';
@@ -460,7 +478,7 @@ export function formatInstructModeExamples(mesExamplesArray, name1, name2) {
460478
461479 for (const example of blockExamples) {
462480 // If force group/persona names is set, we should override the include names for the user placeholder
463481 const includeThisName = includeNames || (power_user.instruct.names_force_groupsnames_behavior === names_behavior_types.FORCE && example.name == 'example_user');
464482
465483 const prefix = example.name == 'example_user' ? inputPrefix : outputPrefix;
466484 const suffix = example.name == 'example_user' ? inputSuffix : outputSuffix;
@@ -490,7 +508,7 @@ export function formatInstructModeExamples(mesExamplesArray, name1, name2) {
490508 * @returns {string} Formatted instruct mode last prompt line.
491509 */
492510export function formatInstructModePrompt(name, isImpersonate, promptBias, name1, name2, isQuiet, isQuietToLoud) {
493511 const includeNames = name && (power_user.instruct.namesnames_behavior === names_behavior_types.ALWAYS || (!!selected_group && power_user.instruct.names_force_groupsnames_behavior === names_behavior_types.FORCE)) && !(isQuiet && !isQuietToLoud);
494512
495513 function getSequence() {
496514 // User impersonation prompt
@@ -668,6 +686,9 @@ jQuery(() => {
668686
669687 if (control.isCheckbox) {
670688 $element.prop('checked', power_user.instruct[control.property]).trigger('input');
689+ } else if (control.property === 'names_behavior') {
690+ const behavior = power_user.instruct[control.property];
691+ $element.filter(`[value="${behavior}"]`).prop('checked', true).trigger('input');
671692 } else {
672693 $element.val(power_user.instruct[control.property]);
673694 $element.trigger('input');
public/scripts/openai.js+1 -1
@@ -541,7 +541,7 @@ function setOpenAIMessages(chat) {
541541 case character_names_behavior.NONE:
542542 break;
543543 case character_names_behavior.DEFAULT:
544544 if ((selected_group && chat[j].name !== name1) || (chat[j].force_avatar && chat[j].name !== name1 && chat[j].extra?.type !== system_message_types.NARRATOR)) {
545545 content = `${chat[j].name}: ${content}`;
546546 }
547547 break;
public/scripts/power-user.js+2 -2
@@ -32,6 +32,7 @@ import {
3232import {
3333 instruct_presets,
3434 loadInstructMode,
35+ names_behavior_types,
3536 selectInstructPreset,
3637} from './instruct-mode.js';
3738
@@ -224,8 +225,7 @@ let power_user = {
224225 stop_sequence: '',
225226 wrap: true,
226227 macro: true,
227228 namesnames_behavior: falsenames_behavior_types.FORCE,
228- names_force_groups: true,
229229 activation_regex: '',
230230 bind_to_context: false,
231231 user_alignment_message: '',