Set any char as assistant. Rework welcome prompt

637e9d54698148c1d83e8ff04f13f45d6bb2e0a0

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

6 files changed, +77 -7Ignore whitespace
public/index.html+3 -0
@@ -5362,6 +5362,9 @@
5362 <option id="import_tags" data-i18n="Import Tags">5362 <option id="import_tags" data-i18n="Import Tags">
5363 Import Tags5363 Import Tags
5364 </option>5364 </option>
5365 <option id="set_as_assistant" data-i18n="Set / Unset as Welcome Page Assistant">
5366 Set / Unset as Welcome Page Assistant
5367 </option>
5365 <!--<option id="dupe_button">5368 <!--<option id="dupe_button">
5366 Duplicate5369 Duplicate
5367 </option>5370 </option>
public/script.js+2 -1
@@ -530,6 +530,7 @@ export const event_types = {
530 CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',530 CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',
531 TOOL_CALLS_PERFORMED: 'tool_calls_performed',531 TOOL_CALLS_PERFORMED: 'tool_calls_performed',
532 TOOL_CALLS_RENDERED: 'tool_calls_rendered',532 TOOL_CALLS_RENDERED: 'tool_calls_rendered',
533 CHARACTER_MANAGEMENT_DROPDOWN: 'charManagementDropdown',
533};534};
534535
535export const eventSource = new EventEmitter([event_types.APP_READY]);536export const eventSource = new EventEmitter([event_types.APP_READY]);
@@ -12141,7 +12142,7 @@ jQuery(async function () {
12141 );12142 );
12142 break;*/12143 break;*/
12143 default:12144 default:
12144 await eventSource.emit('charManagementDropdown', target);12145 await eventSource.emit(event_types.CHARACTER_MANAGEMENT_DROPDOWN, target);
12145 }12146 }
12146 $('#char-management-dropdown').prop('selectedIndex', 0);12147 $('#char-management-dropdown').prop('selectedIndex', 0);
12147 });12148 });
public/scripts/extensions/gallery/index.js+1 -1
@@ -710,7 +710,7 @@ async function listGalleryCommand(args) {
710 delete context.extensionSettings.gallery.folders[avatar];710 delete context.extensionSettings.gallery.folders[avatar];
711 context.saveSettingsDebounced();711 context.saveSettingsDebounced();
712 });712 });
713 eventSource.on('charManagementDropdown', (selectedOptionId) => {713 eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (selectedOptionId) => {
714 if (selectedOptionId === 'show_char_gallery') {714 if (selectedOptionId === 'show_char_gallery') {
715 showCharGallery();715 showCharGallery();
716 }716 }
public/scripts/personas.js+1 -1
@@ -1970,7 +1970,7 @@ export async function initPersonas() {
19701970
1971 $('#char_connections_button').on('click', showCharConnections);1971 $('#char_connections_button').on('click', showCharConnections);
19721972
1973 eventSource.on('charManagementDropdown', (target) => {1973 eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) => {
1974 if (target === 'convert_to_persona') {1974 if (target === 'convert_to_persona') {
1975 convertCharacterToPersona();1975 convertCharacterToPersona();
1976 }1976 }
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
5<div class="flex-container">1<div class="flex-container">
6 <button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">2 <button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button">
7 <i class="fa-solid fa-plug"></i>3 <i class="fa-solid fa-plug"></i>
public/scripts/welcome-screen.js+70 -0
@@ -1,5 +1,7 @@
1import {1import {
2 addOneMessage,
2 characters,3 characters,
4 chat,
3 displayVersion,5 displayVersion,
4 doNewChat,6 doNewChat,
5 event_types,7 event_types,
@@ -12,9 +14,12 @@ import {
12 neutralCharacterName,14 neutralCharacterName,
13 newAssistantChat,15 newAssistantChat,
14 openCharacterChat,16 openCharacterChat,
17 printCharactersDebounced,
15 selectCharacterById,18 selectCharacterById,
16 sendSystemMessage,19 sendSystemMessage,
20 system_avatar,
17 system_message_types,21 system_message_types,
22 this_chid,
18} from '../script.js';23} from '../script.js';
19import { is_group_generating } from './group-chats.js';24import { is_group_generating } from './group-chats.js';
20import { t } from './i18n.js';25import { t } from './i18n.js';
@@ -47,9 +52,29 @@ export async function openWelcomeScreen() {
47 }52 }
4853
49 await sendWelcomePanel();54 await sendWelcomePanel();
55 sendAssistantMessage();
50 sendSystemMessage(system_message_types.WELCOME_PROMPT);56 sendSystemMessage(system_message_types.WELCOME_PROMPT);
51}57}
5258
59function 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
53async function sendWelcomePanel() {78async function sendWelcomePanel() {
54 try {79 try {
55 const chatElement = document.getElementById('chat');80 const chatElement = document.getElementById('chat');
@@ -207,6 +232,15 @@ async function createPermanentAssistant() {
207 const formData = new FormData();232 const formData = new FormData();
208 formData.append('ch_name', neutralCharacterName);233 formData.append('ch_name', neutralCharacterName);
209 formData.append('file_name', defaultAssistantAvatar.replace('.png', ''));234 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
211 const headers = getRequestHeaders();245 const headers = getRequestHeaders();
212 delete headers['Content-Type'];246 delete headers['Content-Type'];
@@ -241,4 +275,40 @@ export function initWelcomeScreen() {
241 for (const event of events) {275 for (const event of events) {
242 eventSource.makeFirst(event, openWelcomeScreen);276 eventSource.makeFirst(event, openWelcomeScreen);
243 }277 }
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 });
244}314}