Set any char as assistant. Rework welcome prompt

637e9d54698148c1d83e8ff04f13f45d6bb2e0a0

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

6 files changed, +77 -7Showing whitespace changes
public/index.html+3 -0
@@ -5362,6 +5362,9 @@
53625362 <option id="import_tags" data-i18n="Import Tags">
53635363 Import Tags
53645364 </option>
5365+ <option id="set_as_assistant" data-i18n="Set / Unset as Welcome Page Assistant">
5366+ Set / Unset as Welcome Page Assistant
5367+ </option>
53655368 <!--<option id="dupe_button">
53665369 Duplicate
53675370 </option>
public/script.js+2 -1
@@ -530,6 +530,7 @@ export const event_types = {
530530 CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',
531531 TOOL_CALLS_PERFORMED: 'tool_calls_performed',
532532 TOOL_CALLS_RENDERED: 'tool_calls_rendered',
533+ CHARACTER_MANAGEMENT_DROPDOWN: 'charManagementDropdown',
533534};
534535
535536export const eventSource = new EventEmitter([event_types.APP_READY]);
@@ -12141,7 +12142,7 @@ jQuery(async function () {
1214112142 );
1214212143 break;*/
1214312144 default:
1214412145 await eventSource.emit('charManagementDropdown'event_types.CHARACTER_MANAGEMENT_DROPDOWN, target);
1214512146 }
1214612147 $('#char-management-dropdown').prop('selectedIndex', 0);
1214712148 });
public/scripts/extensions/gallery/index.js+1 -1
@@ -710,7 +710,7 @@ async function listGalleryCommand(args) {
710710 delete context.extensionSettings.gallery.folders[avatar];
711711 context.saveSettingsDebounced();
712712 });
713713 eventSource.on('charManagementDropdown'event_types.CHARACTER_MANAGEMENT_DROPDOWN, (selectedOptionId) => {
714714 if (selectedOptionId === 'show_char_gallery') {
715715 showCharGallery();
716716 }
public/scripts/personas.js+1 -1
@@ -1970,7 +1970,7 @@ export async function initPersonas() {
19701970
19711971 $('#char_connections_button').on('click', showCharConnections);
19721972
19731973 eventSource.on('charManagementDropdown'event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) => {
19741974 if (target === 'convert_to_persona') {
19751975 convertCharacterToPersona();
19761976 }
public/scripts/templates/welcomePrompt.html+0 -4
@@ -1,7 +1,3 @@
1-<strong data-i18n="If you're connected to an API, try asking me something!">
2- If you're connected to an API, try asking me something!
3-</strong>
4-
51<div class="flex-container">
62 <button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">
73 <i class="fa-solid fa-plug"></i>
public/scripts/welcome-screen.js+70 -0
@@ -1,5 +1,7 @@
11import {
2+ addOneMessage,
23 characters,
4+ chat,
35 displayVersion,
46 doNewChat,
57 event_types,
@@ -12,9 +14,12 @@ import {
1214 neutralCharacterName,
1315 newAssistantChat,
1416 openCharacterChat,
17+ printCharactersDebounced,
1518 selectCharacterById,
1619 sendSystemMessage,
20+ system_avatar,
1721 system_message_types,
22+ this_chid,
1823} from '../script.js';
1924import { is_group_generating } from './group-chats.js';
2025import { t } from './i18n.js';
@@ -47,9 +52,29 @@ export async function openWelcomeScreen() {
4752 }
4853
4954 await sendWelcomePanel();
55+ sendAssistantMessage();
5056 sendSystemMessage(system_message_types.WELCOME_PROMPT);
5157}
5258
59+function sendAssistantMessage() {
60+ const currentAssistantAvatar = getPermanentAssistantAvatar();
61+ const character = characters.find(x => x.avatar === currentAssistantAvatar);
62+ const name = character ? character.name : neutralCharacterName;
63+ const avatar = character ? getThumbnailUrl('avatar', character.avatar) : system_avatar;
64+
65+ const message = {
66+ name: name,
67+ force_avatar: avatar,
68+ mes: t`If you're connected to an API, try asking me something!`,
69+ is_system: false,
70+ is_user: false,
71+ extra: {},
72+ };
73+
74+ chat.push(message);
75+ addOneMessage(message);
76+}
77+
5378async function sendWelcomePanel() {
5479 try {
5580 const chatElement = document.getElementById('chat');
@@ -207,6 +232,15 @@ async function createPermanentAssistant() {
207232 const formData = new FormData();
208233 formData.append('ch_name', neutralCharacterName);
209234 formData.append('file_name', defaultAssistantAvatar.replace('.png', ''));
235+ formData.append('creator_notes', t`Automatically created character. Feel free to edit.`);
236+
237+ try {
238+ const avatarResponse = await fetch(system_avatar);
239+ const avatarBlob = await avatarResponse.blob();
240+ formData.append('avatar', avatarBlob, defaultAssistantAvatar);
241+ } catch (error) {
242+ console.warn('Error fetching system avatar. Fallback image will be used.', error);
243+ }
210244
211245 const headers = getRequestHeaders();
212246 delete headers['Content-Type'];
@@ -241,4 +275,40 @@ export function initWelcomeScreen() {
241275 for (const event of events) {
242276 eventSource.makeFirst(event, openWelcomeScreen);
243277 }
278+
279+ eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) =>{
280+ if (target !== 'set_as_assistant') {
281+ return;
282+ }
283+ if (this_chid === undefined) {
284+ return;
285+ }
286+ /** @type {import('./char-data.js').v1CharData} */
287+ const character = characters[this_chid];
288+ if (!character) {
289+ return;
290+ }
291+
292+ const currentAssistantAvatar = getPermanentAssistantAvatar();
293+ if (currentAssistantAvatar === character.avatar) {
294+ if (character.avatar === defaultAssistantAvatar) {
295+ toastr.info(t`${character.name} is a system assistant. Choose another character.`);
296+ return;
297+ }
298+
299+ toastr.info(t`${character.name} is no longer your assistant.`);
300+ accountStorage.removeItem(assistantAvatarKey);
301+ return;
302+ }
303+
304+ accountStorage.setItem(assistantAvatarKey, character.avatar);
305+ printCharactersDebounced();
306+ toastr.success(t`Set ${character.name} as your assistant.`);
307+ });
308+
309+ eventSource.on(event_types.CHARACTER_RENAMED, (oldAvatar, newAvatar) => {
310+ if (oldAvatar === getPermanentAssistantAvatar()) {
311+ accountStorage.setItem(assistantAvatarKey, newAvatar);
312+ }
313+ });
244314}