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