Simplify switching profiles. Less prompting.
This commit is contained in:
		
							parent
							
								
									759eb35bc6
								
							
						
					
					
						commit
						49c7570952
					
				|  | @ -1,10 +1,10 @@ | |||
| <script lang="ts"> | ||||
|   import { createEventDispatcher } from 'svelte' | ||||
|   import { getProfile } from './Profiles.svelte' | ||||
|   import { addChat, cleanSettingValue, setChatSettingValue } from './Storage.svelte' | ||||
|   // import { getProfile } from './Profiles.svelte' | ||||
|   import { cleanSettingValue, setChatSettingValue } from './Storage.svelte' | ||||
|   import type { Chat, ChatSetting, ChatSettings, ControlAction, FieldControl, SettingPrompt } from './Types.svelte' | ||||
|   import { autoGrowInputOnEvent } from './Util.svelte' | ||||
|   import { replace } from 'svelte-spa-router' | ||||
|   // import { replace } from 'svelte-spa-router' | ||||
|   import Fa from 'svelte-fa/src/fa.svelte' | ||||
| 
 | ||||
|   export let setting:ChatSetting | ||||
|  | @ -37,33 +37,33 @@ | |||
|           return !!chatSettings.isDirty && newVal !== oldVal | ||||
|         }, | ||||
|         passed: false | ||||
|       }, | ||||
|       { | ||||
|         prompt: 'Would you like to start a new chat session with this profile?', | ||||
|         checkPrompt: (setting, newVal, oldVal) => { | ||||
|           return chat.sessionStarted && newVal !== originalProfile && | ||||
|             (getProfile(newVal).characterName !== chatSettings.characterName) | ||||
|         }, | ||||
|         onYes: (setting, newVal, oldVal) => { | ||||
|           // start new char session, apply this profile, amd start it | ||||
|           setChatSettingValue(chatId, setting, oldVal) | ||||
|           const profile = getProfile(newVal) | ||||
|           const newChatId = addChat(profile) | ||||
|           replace(`/chat/${newChatId}`) | ||||
|           return true | ||||
|         }, | ||||
|         onNo: (setting, newVal, oldVal) => true, // Continue on no | ||||
|         passed: false | ||||
|       }, | ||||
|       { | ||||
|         prompt: 'Personality change will not correctly apply to existing chat session.\n Continue?', | ||||
|         checkPrompt: (setting, newVal, oldVal) => { | ||||
|           return chat.sessionStarted && newVal !== originalProfile && | ||||
|             (getProfile(newVal).characterName !== chatSettings.characterName) | ||||
|         }, | ||||
|         onYes: (setting, newVal, oldVal) => true, | ||||
|         passed: false | ||||
|       } | ||||
|       // { | ||||
|       //   prompt: 'Would you like to start a new chat session with this profile?', | ||||
|       //   checkPrompt: (setting, newVal, oldVal) => { | ||||
|       //     return chat.sessionStarted && newVal !== originalProfile && | ||||
|       //       (getProfile(newVal).characterName !== chatSettings.characterName) | ||||
|       //   }, | ||||
|       //   onYes: (setting, newVal, oldVal) => { | ||||
|       //     // start new char session, apply this profile, amd start it | ||||
|       //     setChatSettingValue(chatId, setting, oldVal) | ||||
|       //     const profile = getProfile(newVal) | ||||
|       //     const newChatId = addChat(profile) | ||||
|       //     replace(`/chat/${newChatId}`) | ||||
|       //     return true | ||||
|       //   }, | ||||
|       //   onNo: (setting, newVal, oldVal) => true, // Continue on no | ||||
|       //   passed: false | ||||
|       // }, | ||||
|       // { | ||||
|       //   prompt: 'Personality change will not correctly apply to existing chat session.\n Continue?', | ||||
|       //   checkPrompt: (setting, newVal, oldVal) => { | ||||
|       //     return chat.sessionStarted && newVal !== originalProfile && | ||||
|       //       (getProfile(newVal).characterName !== chatSettings.characterName) | ||||
|       //   }, | ||||
|       //   onYes: (setting, newVal, oldVal) => true, | ||||
|       //   passed: false | ||||
|       // } | ||||
|     ] | ||||
|   } | ||||
| 
 | ||||
|  | @ -98,7 +98,7 @@ | |||
|       if (val === newVal) return | ||||
|       try { | ||||
|         if ((typeof setting.afterChange === 'function') && setting.afterChange(chatId, setting, chatSettings[setting.key])) { | ||||
|           console.log('Refreshed from setting', setting.key, chatSettings[setting.key], val) | ||||
|           // console.log('Refreshed from setting', setting.key, chatSettings[setting.key], val) | ||||
|           refreshSettings() | ||||
|         } | ||||
|       } catch (e) { | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ | |||
|     addChat | ||||
| 
 | ||||
|   } from './Storage.svelte' | ||||
|   import { supportedModels, type Chat, type ChatSetting, type ResponseModels, type SettingSelect, type SelectOption } from './Types.svelte' | ||||
|   import { supportedModels, type Chat, type ChatSetting, type ResponseModels, type SettingSelect, type SelectOption, type ChatSettings } from './Types.svelte' | ||||
|   import { sizeTextElements } from './Util.svelte' | ||||
|   import Fa from 'svelte-fa/src/fa.svelte' | ||||
|   import { | ||||
|  | @ -29,7 +29,7 @@ | |||
|     faSquarePlus | ||||
|   } from '@fortawesome/free-solid-svg-icons/index' | ||||
|   import { exportProfileAsJSON } from './Export.svelte' | ||||
|   import { afterUpdate } from 'svelte' | ||||
|   import { onMount, afterUpdate } from 'svelte' | ||||
|   import ChatSettingField from './ChatSettingField.svelte' | ||||
|   import { getModelMaxTokens } from './Stats.svelte' | ||||
|   import { replace } from 'svelte-spa-router' | ||||
|  | @ -55,13 +55,25 @@ | |||
|   $: chatSettings = chat.settings | ||||
|   $: globalStore = $globalStorage | ||||
| 
 | ||||
|   const originalProfile = chatSettings && chatSettings.profile | ||||
|   let originalProfile:string | ||||
|   let originalSettings:ChatSettings | ||||
| 
 | ||||
|   onMount(async () => { | ||||
|     originalProfile = chatSettings && chatSettings.profile | ||||
|     originalSettings = chatSettings && JSON.parse(JSON.stringify(chatSettings)) | ||||
|   }) | ||||
| 
 | ||||
|   afterUpdate(() => { | ||||
|     if (!originalProfile) { | ||||
|       originalProfile = chatSettings && chatSettings.profile | ||||
|       originalSettings = chatSettings && JSON.parse(JSON.stringify(chatSettings)) | ||||
|     } | ||||
|     sizeTextElements() | ||||
|   }) | ||||
|    | ||||
|   const closeSettings = () => { | ||||
|     originalProfile = '' | ||||
|     originalSettings = {} as ChatSettings | ||||
|     showProfileMenu = false | ||||
|     $checkStateChange++ | ||||
|     showSettingsModal = 0 | ||||
|  | @ -207,12 +219,18 @@ | |||
|   } | ||||
| 
 | ||||
|   const startNewChat = () => { | ||||
|     const differentProfile = originalSettings.profile !== chatSettings.profile | ||||
|     // start new | ||||
|     const newChatId = addChat(chatSettings) | ||||
|     // restore original | ||||
|     if (differentProfile) { | ||||
|       chat.settings = originalSettings | ||||
|       saveChatStore() | ||||
|     } | ||||
|     // go to new chat | ||||
|     replace(`/chat/${newChatId}`) | ||||
|   } | ||||
| 
 | ||||
|   // excludeFromProfile | ||||
| 
 | ||||
|   const deepEqual = (x:any, y:any) => { | ||||
|     const ok = Object.keys; const tx = typeof x; const ty = typeof y | ||||
|     return x && y && tx === 'object' && tx === ty | ||||
|  |  | |||
|  | @ -1,19 +1,25 @@ | |||
| <script context="module" lang="ts"> | ||||
|   import { getChatDefaults, getExcludeFromProfile } from './Settings.svelte' | ||||
| // Profile definitions | ||||
| import { addMessage, clearMessages, getChat, getChatSettings, getCustomProfiles, getGlobalSettings, resetChatSettings, saveChatStore, setGlobalSettingValueByKey } from './Storage.svelte' | ||||
| import type { Message, SelectOption, ChatSettings } from './Types.svelte' | ||||
|   import { get, writable } from 'svelte/store' | ||||
|   // Profile definitions | ||||
|   import { addMessage, clearMessages, getChat, getChatSettings, getCustomProfiles, getGlobalSettings, newName, resetChatSettings, saveChatStore, setGlobalSettingValueByKey } from './Storage.svelte' | ||||
|   import type { Message, SelectOption, ChatSettings } from './Types.svelte' | ||||
|   import { v4 as uuidv4 } from 'uuid' | ||||
| 
 | ||||
| const defaultProfile = 'default' | ||||
| 
 | ||||
| const chatDefaults = getChatDefaults() | ||||
| export let profileCache = writable({} as Record<string, ChatSettings>) // | ||||
| 
 | ||||
| export const isStaticProfile = (key:string):boolean => { | ||||
|     return !!profiles[key] | ||||
| } | ||||
| 
 | ||||
| const getProfiles = ():Record<string, ChatSettings> => { | ||||
| export const getProfiles = (forceUpdate:boolean = false):Record<string, ChatSettings> => { | ||||
|     const pc = get(profileCache) | ||||
|     if (!forceUpdate && Object.keys(pc).length) { | ||||
|       return pc | ||||
|     } | ||||
|     const result = Object.entries(profiles | ||||
|     ).reduce((a, [k, v]) => { | ||||
|       a[k] = v | ||||
|  | @ -22,6 +28,13 @@ const getProfiles = ():Record<string, ChatSettings> => { | |||
|     Object.entries(getCustomProfiles()).forEach(([k, v]) => { | ||||
|       result[k] = v | ||||
|     }) | ||||
|     Object.entries(result).forEach(([k, v]) => { | ||||
|       pc[k] = v | ||||
|     }) | ||||
|     Object.keys(pc).forEach((k) => { | ||||
|       if (!(k in result)) delete pc[k] | ||||
|     }) | ||||
|     profileCache.set(pc) | ||||
|     return result | ||||
| } | ||||
| 
 | ||||
|  | @ -98,6 +111,11 @@ export const restartProfile = (chatId:number, noApply:boolean = false) => { | |||
|     setGlobalSettingValueByKey('lastProfile', settings.profile) | ||||
| } | ||||
| 
 | ||||
| export const newNameForProfile = (name:string) => { | ||||
|     const profiles = getProfileSelect() | ||||
|     return newName(name, profiles.reduce((a, p) => { a[p.text] = p; return a }, {})) | ||||
| } | ||||
| 
 | ||||
| // Apply currently selected profile | ||||
| export const applyProfile = (chatId:number, key:string = '', resetChat:boolean = false) => { | ||||
|     resetChatSettings(chatId, resetChat) // Fully reset | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|   import type { Chat, ChatSettings, GlobalSettings, Message, ChatSetting, GlobalSetting, Usage, Model } from './Types.svelte' | ||||
|   import { getChatSettingObjectByKey, getGlobalSettingObjectByKey, getChatDefaults, getExcludeFromProfile } from './Settings.svelte' | ||||
|   import { v4 as uuidv4 } from 'uuid' | ||||
|   import { getProfile, isStaticProfile, restartProfile } from './Profiles.svelte' | ||||
|   import { getProfile, getProfiles, isStaticProfile, newNameForProfile, restartProfile } from './Profiles.svelte' | ||||
| 
 | ||||
|   export const chatsStorage = persisted('chats', [] as Chat[]) | ||||
|   export const globalStorage = persisted('global', {} as GlobalSettings) | ||||
|  | @ -370,9 +370,6 @@ | |||
|       store.profiles = profiles | ||||
|     } | ||||
|     if (!profile.profile) profile.profile = uuidv4() | ||||
|     if (isStaticProfile(profile.profile as any)) { | ||||
|       throw new Error('Sorry, you can\'t modify a static profile. You can clone it though!') | ||||
|     } | ||||
|     const mt = profile.profileName && profile.profileName.trim().toLocaleLowerCase() | ||||
|     const sameTitle = Object.values(profiles).find(c => c.profile !== profile.profile && | ||||
|     c.profileName && c.profileName.trim().toLocaleLowerCase() === mt) | ||||
|  | @ -385,6 +382,12 @@ | |||
|     if (!profile.characterName || profile.characterName.length < 3) { | ||||
|       throw new Error('Your profile\'s character needs a valid name.') | ||||
|     } | ||||
|     if (isStaticProfile(profile.profile as any)) { | ||||
|       // throw new Error('Sorry, you can\'t modify a static profile. You can clone it though!') | ||||
|       // Save static profile as new custom | ||||
|       profile.profileName = newNameForProfile(profile.profileName) | ||||
|       profile.profile = uuidv4() | ||||
|     } | ||||
|     const clone = JSON.parse(JSON.stringify(profile)) // Always store a copy | ||||
|     Object.keys(getExcludeFromProfile()).forEach(k => { | ||||
|       delete clone[k] | ||||
|  | @ -393,6 +396,18 @@ | |||
|     globalStorage.set(store) | ||||
|     profile.isDirty = false | ||||
|     saveChatStore() | ||||
|     getProfiles(true) // force update profile cache | ||||
|   } | ||||
| 
 | ||||
|   export const newName = (name:string, nameMap:Record<string, any>):string => { | ||||
|     if (!nameMap[name]) return name | ||||
|     let i:number = 1 | ||||
|     let cname = name + `-${i}` | ||||
|     while (nameMap[cname]) { | ||||
|       i++ | ||||
|       cname = name + `-${i}` | ||||
|     } | ||||
|     return cname | ||||
|   } | ||||
|    | ||||
| </script> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Webifi
						Webifi