Set any char as assistant. Rework welcome prompt

This commit is contained in:
Cohee
2025-05-12 20:50:17 +03:00
parent f656fba213
commit 637e9d5469
6 changed files with 77 additions and 7 deletions

View File

@ -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>

View File

@ -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);
}); });

View File

@ -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();
} }

View File

@ -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();
} }

View File

@ -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>

View File

@ -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);
}
});
} }