mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Chat: Add AI reply prefixes
Experimentation yields that prefixing a reply with something drives the AI to possibly produce more targeted and meaningful conversation. The example I used is showing an AI's "thoughts" in a message via the use of backticks. By automatically prefixing {{char}}'s thoughts, the AI generates an internal monologue that the user can also use for their own responses. This feature is stable, but in an experimental state for now in terms of expansion. Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
@ -1851,6 +1851,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
<h4>
|
||||||
|
<span data-i18n="Start Reply With">
|
||||||
|
Start Reply With
|
||||||
|
</span>
|
||||||
|
</h4>
|
||||||
|
<div>
|
||||||
|
<input id="start_reply_with" class="text_pole textarea_compact" type="text" placeholder="AI reply prefix" />
|
||||||
|
</div>
|
||||||
|
<label class="checkbox_label" for="chat-show-reply-prefix-checkbox"><input id="chat-show-reply-prefix-checkbox" type="checkbox" />
|
||||||
|
<span data-i18n="Show reply prefix in chat">
|
||||||
|
Show reply prefix in chat
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
<h4>
|
<h4>
|
||||||
<span data-i18n="Pygmalion Formatting">
|
<span data-i18n="Pygmalion Formatting">
|
||||||
Pygmalion Formatting
|
Pygmalion Formatting
|
||||||
|
@ -1062,6 +1062,11 @@ function messageFormatting(mes, ch_name, isSystem, isUser) {
|
|||||||
mes = '';
|
mes = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prompt bias replacement should be applied on the raw message
|
||||||
|
if (!power_user.show_user_prompt_bias && ch_name && !isUser && !isSystem) {
|
||||||
|
mes = mes.replaceAll(substituteParams(power_user.user_prompt_bias), "");
|
||||||
|
}
|
||||||
|
|
||||||
if (power_user.auto_fix_generated_markdown) {
|
if (power_user.auto_fix_generated_markdown) {
|
||||||
mes = fixMarkdown(mes);
|
mes = fixMarkdown(mes);
|
||||||
}
|
}
|
||||||
@ -1122,7 +1127,6 @@ function messageFormatting(mes, ch_name, isSystem, isUser) {
|
|||||||
//console.log('mes after removed <tags>')
|
//console.log('mes after removed <tags>')
|
||||||
//console.log(mes)
|
//console.log(mes)
|
||||||
} */
|
} */
|
||||||
|
|
||||||
return mes;
|
return mes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2308,7 +2312,17 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
|
|||||||
if (!mesSendString.endsWith('\n')) {
|
if (!mesSendString.endsWith('\n')) {
|
||||||
mesSendString += '\n';
|
mesSendString += '\n';
|
||||||
}
|
}
|
||||||
mesSendString += (`${name2}:${promptBias || ''}`);
|
|
||||||
|
let addedPromptBias = promptBias || substituteParams(power_user.user_prompt_bias) || '';
|
||||||
|
|
||||||
|
// Add a leading space to the prompt bias if applicable
|
||||||
|
if (addedPromptBias.length !== 0 && !addedPromptBias.startsWith(' ')) {
|
||||||
|
addedPromptBias = ` ${addedPromptBias}`
|
||||||
|
}
|
||||||
|
|
||||||
|
mesSendString += (`${name2}:${addedPromptBias}`);
|
||||||
|
} else if (power_user.user_prompt_bias) {
|
||||||
|
mesSendString += substituteParams(power_user.user_prompt_bias);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mesSendString;
|
return mesSendString;
|
||||||
@ -3309,32 +3323,29 @@ function extractTitleFromData(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function extractMessageFromData(data) {
|
function extractMessageFromData(data) {
|
||||||
let getMessage = "";
|
switch (main_api) {
|
||||||
|
case 'kobold':
|
||||||
if (main_api == 'kobold') {
|
return data.results[0].text;
|
||||||
getMessage = data.results[0].text;
|
case 'koboldhorde':
|
||||||
|
return data.text;
|
||||||
|
case 'textgenerationwebui':
|
||||||
|
return data.results[0].text;
|
||||||
|
case 'novel':
|
||||||
|
return data.output;
|
||||||
|
case 'openai':
|
||||||
|
case 'poe':
|
||||||
|
return data;
|
||||||
|
default:
|
||||||
|
return ''
|
||||||
}
|
}
|
||||||
|
|
||||||
if (main_api == 'koboldhorde') {
|
|
||||||
getMessage = data.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (main_api == 'textgenerationwebui') {
|
|
||||||
getMessage = data.results[0].text;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (main_api == 'novel') {
|
|
||||||
getMessage = data.output;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (main_api == 'openai' || main_api == 'poe') {
|
|
||||||
getMessage = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getMessage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanUpMessage(getMessage, isImpersonate, displayIncompleteSentences = false) {
|
function cleanUpMessage(getMessage, isImpersonate, displayIncompleteSentences = false) {
|
||||||
|
// Append the user bias first before trimming anything else
|
||||||
|
if (power_user.user_prompt_bias && power_user.user_prompt_bias.length !== 0) {
|
||||||
|
getMessage = substituteParams(power_user.user_prompt_bias) + getMessage;
|
||||||
|
}
|
||||||
|
|
||||||
if (!displayIncompleteSentences && power_user.trim_sentences) {
|
if (!displayIncompleteSentences && power_user.trim_sentences) {
|
||||||
getMessage = end_trim_to_sentence(getMessage, power_user.include_newline);
|
getMessage = end_trim_to_sentence(getMessage, power_user.include_newline);
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,8 @@ let power_user = {
|
|||||||
trim_sentences: false,
|
trim_sentences: false,
|
||||||
include_newline: false,
|
include_newline: false,
|
||||||
always_force_name2: false,
|
always_force_name2: false,
|
||||||
|
user_prompt_bias: '',
|
||||||
|
show_user_prompt_bias: true,
|
||||||
multigen: false,
|
multigen: false,
|
||||||
multigen_first_chunk: 50,
|
multigen_first_chunk: 50,
|
||||||
multigen_next_chunks: 30,
|
multigen_next_chunks: 30,
|
||||||
@ -598,6 +600,8 @@ function loadPowerUserSettings(settings, data) {
|
|||||||
$("#waifuMode").prop("checked", power_user.waifuMode);
|
$("#waifuMode").prop("checked", power_user.waifuMode);
|
||||||
$("#movingUImode").prop("checked", power_user.movingUI);
|
$("#movingUImode").prop("checked", power_user.movingUI);
|
||||||
$("#noShadowsmode").prop("checked", power_user.noShadows);
|
$("#noShadowsmode").prop("checked", power_user.noShadows);
|
||||||
|
$("#start_reply_with").val(power_user.user_prompt_bias);
|
||||||
|
$("#chat-show-reply-prefix-checkbox").prop("checked", power_user.show_user_prompt_bias);
|
||||||
$("#multigen").prop("checked", power_user.multigen);
|
$("#multigen").prop("checked", power_user.multigen);
|
||||||
$("#multigen_first_chunk").val(power_user.multigen_first_chunk);
|
$("#multigen_first_chunk").val(power_user.multigen_first_chunk);
|
||||||
$("#multigen_next_chunks").val(power_user.multigen_next_chunks);
|
$("#multigen_next_chunks").val(power_user.multigen_next_chunks);
|
||||||
@ -1074,6 +1078,17 @@ $(document).ready(() => {
|
|||||||
reloadMarkdownProcessor(power_user.render_formulas);
|
reloadMarkdownProcessor(power_user.render_formulas);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#start_reply_with").on('input', function() {
|
||||||
|
power_user.user_prompt_bias = $(this).val();
|
||||||
|
saveSettingsDebounced();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#chat-show-reply-prefix-checkbox").change(function () {
|
||||||
|
power_user.show_user_prompt_bias = !!$(this).prop("checked");
|
||||||
|
reloadCurrentChat();
|
||||||
|
saveSettingsDebounced();
|
||||||
|
})
|
||||||
|
|
||||||
$("#multigen").change(function () {
|
$("#multigen").change(function () {
|
||||||
power_user.multigen = $(this).prop("checked");
|
power_user.multigen = $(this).prop("checked");
|
||||||
saveSettingsDebounced();
|
saveSettingsDebounced();
|
||||||
|
Reference in New Issue
Block a user