mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Set any char as assistant. Rework welcome prompt
This commit is contained in:
@ -5362,6 +5362,9 @@
|
|||||||
<option id="import_tags" data-i18n="Import Tags">
|
<option id="import_tags" data-i18n="Import Tags">
|
||||||
Import Tags
|
Import Tags
|
||||||
</option>
|
</option>
|
||||||
|
<option id="set_as_assistant" data-i18n="Set / Unset as Welcome Page Assistant">
|
||||||
|
Set / Unset as Welcome Page Assistant
|
||||||
|
</option>
|
||||||
<!--<option id="dupe_button">
|
<!--<option id="dupe_button">
|
||||||
Duplicate
|
Duplicate
|
||||||
</option>
|
</option>
|
||||||
|
@ -530,6 +530,7 @@ export const event_types = {
|
|||||||
CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',
|
CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',
|
||||||
TOOL_CALLS_PERFORMED: 'tool_calls_performed',
|
TOOL_CALLS_PERFORMED: 'tool_calls_performed',
|
||||||
TOOL_CALLS_RENDERED: 'tool_calls_rendered',
|
TOOL_CALLS_RENDERED: 'tool_calls_rendered',
|
||||||
|
CHARACTER_MANAGEMENT_DROPDOWN: 'charManagementDropdown',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const eventSource = new EventEmitter([event_types.APP_READY]);
|
export const eventSource = new EventEmitter([event_types.APP_READY]);
|
||||||
@ -12141,7 +12142,7 @@ jQuery(async function () {
|
|||||||
);
|
);
|
||||||
break;*/
|
break;*/
|
||||||
default:
|
default:
|
||||||
await eventSource.emit('charManagementDropdown', target);
|
await eventSource.emit(event_types.CHARACTER_MANAGEMENT_DROPDOWN, target);
|
||||||
}
|
}
|
||||||
$('#char-management-dropdown').prop('selectedIndex', 0);
|
$('#char-management-dropdown').prop('selectedIndex', 0);
|
||||||
});
|
});
|
||||||
|
@ -710,7 +710,7 @@ async function listGalleryCommand(args) {
|
|||||||
delete context.extensionSettings.gallery.folders[avatar];
|
delete context.extensionSettings.gallery.folders[avatar];
|
||||||
context.saveSettingsDebounced();
|
context.saveSettingsDebounced();
|
||||||
});
|
});
|
||||||
eventSource.on('charManagementDropdown', (selectedOptionId) => {
|
eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (selectedOptionId) => {
|
||||||
if (selectedOptionId === 'show_char_gallery') {
|
if (selectedOptionId === 'show_char_gallery') {
|
||||||
showCharGallery();
|
showCharGallery();
|
||||||
}
|
}
|
||||||
|
@ -1970,7 +1970,7 @@ export async function initPersonas() {
|
|||||||
|
|
||||||
$('#char_connections_button').on('click', showCharConnections);
|
$('#char_connections_button').on('click', showCharConnections);
|
||||||
|
|
||||||
eventSource.on('charManagementDropdown', (target) => {
|
eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) => {
|
||||||
if (target === 'convert_to_persona') {
|
if (target === 'convert_to_persona') {
|
||||||
convertCharacterToPersona();
|
convertCharacterToPersona();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
<strong data-i18n="If you're connected to an API, try asking me something!">
|
|
||||||
If you're connected to an API, try asking me something!
|
|
||||||
</strong>
|
|
||||||
|
|
||||||
<div class="flex-container">
|
<div class="flex-container">
|
||||||
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">
|
<button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">
|
||||||
<i class="fa-solid fa-plug"></i>
|
<i class="fa-solid fa-plug"></i>
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
|
addOneMessage,
|
||||||
characters,
|
characters,
|
||||||
|
chat,
|
||||||
displayVersion,
|
displayVersion,
|
||||||
doNewChat,
|
doNewChat,
|
||||||
event_types,
|
event_types,
|
||||||
@ -12,9 +14,12 @@ import {
|
|||||||
neutralCharacterName,
|
neutralCharacterName,
|
||||||
newAssistantChat,
|
newAssistantChat,
|
||||||
openCharacterChat,
|
openCharacterChat,
|
||||||
|
printCharactersDebounced,
|
||||||
selectCharacterById,
|
selectCharacterById,
|
||||||
sendSystemMessage,
|
sendSystemMessage,
|
||||||
|
system_avatar,
|
||||||
system_message_types,
|
system_message_types,
|
||||||
|
this_chid,
|
||||||
} from '../script.js';
|
} from '../script.js';
|
||||||
import { is_group_generating } from './group-chats.js';
|
import { is_group_generating } from './group-chats.js';
|
||||||
import { t } from './i18n.js';
|
import { t } from './i18n.js';
|
||||||
@ -47,9 +52,29 @@ export async function openWelcomeScreen() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await sendWelcomePanel();
|
await sendWelcomePanel();
|
||||||
|
sendAssistantMessage();
|
||||||
sendSystemMessage(system_message_types.WELCOME_PROMPT);
|
sendSystemMessage(system_message_types.WELCOME_PROMPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sendAssistantMessage() {
|
||||||
|
const currentAssistantAvatar = getPermanentAssistantAvatar();
|
||||||
|
const character = characters.find(x => x.avatar === currentAssistantAvatar);
|
||||||
|
const name = character ? character.name : neutralCharacterName;
|
||||||
|
const avatar = character ? getThumbnailUrl('avatar', character.avatar) : system_avatar;
|
||||||
|
|
||||||
|
const message = {
|
||||||
|
name: name,
|
||||||
|
force_avatar: avatar,
|
||||||
|
mes: t`If you're connected to an API, try asking me something!`,
|
||||||
|
is_system: false,
|
||||||
|
is_user: false,
|
||||||
|
extra: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
chat.push(message);
|
||||||
|
addOneMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
async function sendWelcomePanel() {
|
async function sendWelcomePanel() {
|
||||||
try {
|
try {
|
||||||
const chatElement = document.getElementById('chat');
|
const chatElement = document.getElementById('chat');
|
||||||
@ -207,6 +232,15 @@ async function createPermanentAssistant() {
|
|||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('ch_name', neutralCharacterName);
|
formData.append('ch_name', neutralCharacterName);
|
||||||
formData.append('file_name', defaultAssistantAvatar.replace('.png', ''));
|
formData.append('file_name', defaultAssistantAvatar.replace('.png', ''));
|
||||||
|
formData.append('creator_notes', t`Automatically created character. Feel free to edit.`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const avatarResponse = await fetch(system_avatar);
|
||||||
|
const avatarBlob = await avatarResponse.blob();
|
||||||
|
formData.append('avatar', avatarBlob, defaultAssistantAvatar);
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Error fetching system avatar. Fallback image will be used.', error);
|
||||||
|
}
|
||||||
|
|
||||||
const headers = getRequestHeaders();
|
const headers = getRequestHeaders();
|
||||||
delete headers['Content-Type'];
|
delete headers['Content-Type'];
|
||||||
@ -241,4 +275,40 @@ export function initWelcomeScreen() {
|
|||||||
for (const event of events) {
|
for (const event of events) {
|
||||||
eventSource.makeFirst(event, openWelcomeScreen);
|
eventSource.makeFirst(event, openWelcomeScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) =>{
|
||||||
|
if (target !== 'set_as_assistant') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this_chid === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/** @type {import('./char-data.js').v1CharData} */
|
||||||
|
const character = characters[this_chid];
|
||||||
|
if (!character) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentAssistantAvatar = getPermanentAssistantAvatar();
|
||||||
|
if (currentAssistantAvatar === character.avatar) {
|
||||||
|
if (character.avatar === defaultAssistantAvatar) {
|
||||||
|
toastr.info(t`${character.name} is a system assistant. Choose another character.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
toastr.info(t`${character.name} is no longer your assistant.`);
|
||||||
|
accountStorage.removeItem(assistantAvatarKey);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
accountStorage.setItem(assistantAvatarKey, character.avatar);
|
||||||
|
printCharactersDebounced();
|
||||||
|
toastr.success(t`Set ${character.name} as your assistant.`);
|
||||||
|
});
|
||||||
|
|
||||||
|
eventSource.on(event_types.CHARACTER_RENAMED, (oldAvatar, newAvatar) => {
|
||||||
|
if (oldAvatar === getPermanentAssistantAvatar()) {
|
||||||
|
accountStorage.setItem(assistantAvatarKey, newAvatar);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user