Fix profile loading issues on new chat
This commit is contained in:
parent
80aa0cbb57
commit
aa94788573
|
@ -1,9 +1,10 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { createEventDispatcher } from 'svelte'
|
import { createEventDispatcher } from 'svelte'
|
||||||
import { getProfile } from './Profiles.svelte'
|
import { getProfile } from './Profiles.svelte'
|
||||||
import { cleanSettingValue, setChatSettingValue } from './Storage.svelte'
|
import { addChat, cleanSettingValue, setChatSettingValue } from './Storage.svelte'
|
||||||
import type { Chat, ChatSetting, ChatSettings, SettingPrompt } from './Types.svelte'
|
import type { Chat, ChatSetting, ChatSettings, SettingPrompt } from './Types.svelte'
|
||||||
import { autoGrowInputOnEvent } from './Util.svelte'
|
import { autoGrowInputOnEvent } from './Util.svelte'
|
||||||
|
import { replace } from 'svelte-spa-router';
|
||||||
|
|
||||||
export let setting:ChatSetting
|
export let setting:ChatSetting
|
||||||
export let chatSettings:ChatSettings
|
export let chatSettings:ChatSettings
|
||||||
|
@ -27,14 +28,29 @@
|
||||||
profile: [
|
profile: [
|
||||||
{
|
{
|
||||||
prompt: 'Unsaved changes to the current profile will be lost.\n Continue?',
|
prompt: 'Unsaved changes to the current profile will be lost.\n Continue?',
|
||||||
fn: (setting, newVal, oldVal) => {
|
checkPrompt: (setting, newVal, oldVal) => {
|
||||||
return !!chatSettings.isDirty && newVal !== oldVal
|
return !!chatSettings.isDirty && newVal !== oldVal
|
||||||
},
|
},
|
||||||
passed: false
|
passed: false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
prompt: 'Would you like to start a new chat session with this profile?',
|
||||||
|
checkPrompt: (setting, newVal, oldVal) => {
|
||||||
|
return newVal !== oldVal
|
||||||
|
},
|
||||||
|
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
|
||||||
|
},
|
||||||
|
passed: false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
prompt: 'Personality change will not correctly apply to existing chat session.\n Continue?',
|
prompt: 'Personality change will not correctly apply to existing chat session.\n Continue?',
|
||||||
fn: (setting, newVal, oldVal) => {
|
checkPrompt: (setting, newVal, oldVal) => {
|
||||||
return chat.sessionStarted && newVal !== originalProfile &&
|
return chat.sessionStarted && newVal !== originalProfile &&
|
||||||
(getProfile(newVal).characterName !== chatSettings.characterName)
|
(getProfile(newVal).characterName !== chatSettings.characterName)
|
||||||
},
|
},
|
||||||
|
@ -70,7 +86,7 @@
|
||||||
default:
|
default:
|
||||||
setChatSettingValue(chatId, setting, el.value)
|
setChatSettingValue(chatId, setting, el.value)
|
||||||
}
|
}
|
||||||
const newVal = chatSettings[setting.key]
|
const newVal = cleanSettingValue(setting.type, el.checked || el.value)
|
||||||
if (val === newVal) return
|
if (val === newVal) return
|
||||||
try {
|
try {
|
||||||
if ((typeof setting.afterChange === 'function') && setting.afterChange(chatId, setting, chatSettings[setting.key])) {
|
if ((typeof setting.afterChange === 'function') && setting.afterChange(chatId, setting, chatSettings[setting.key])) {
|
||||||
|
@ -88,16 +104,21 @@
|
||||||
for (let i = 0, l = checks.length; i < l; i++) {
|
for (let i = 0, l = checks.length; i < l; i++) {
|
||||||
const c = checks[i]
|
const c = checks[i]
|
||||||
if (c.passed) continue
|
if (c.passed) continue
|
||||||
if (c.fn(setting, newVal, val)) {
|
if (c.checkPrompt(setting, newVal, val)) {
|
||||||
// eventually this needs to be an async call to a confirmation modal where
|
// eventually this needs to be an async call to a confirmation modal where
|
||||||
// "passed", not really being used here, will be reworked to some other
|
// "passed", not really being used here, will be reworked to some other
|
||||||
// state to deal with inevitable issues once a non-blocking modal is used.
|
// state to deal with inevitable issues once a non-blocking modal is used.
|
||||||
if (window.confirm(c.prompt)) {
|
if (window.confirm(c.prompt)) {
|
||||||
c.passed = true
|
c.passed = true
|
||||||
|
if (c.onYes && c.onYes(setting, newVal, val)) {
|
||||||
|
resetSettingCheck(setting.key)
|
||||||
|
return
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// roll-back
|
// roll-back
|
||||||
setChatSettingValue(chatId, setting, val)
|
setChatSettingValue(chatId, setting, val)
|
||||||
// refresh setting modal, if open
|
// refresh setting modal, if open
|
||||||
|
c.onNo && c.onNo(setting, newVal, val)
|
||||||
refreshSettings()
|
refreshSettings()
|
||||||
resetSettingCheck(setting.key)
|
resetSettingCheck(setting.key)
|
||||||
return
|
return
|
||||||
|
|
|
@ -10,7 +10,10 @@
|
||||||
deleteCustomProfile,
|
deleteCustomProfile,
|
||||||
setGlobalSettingValueByKey,
|
setGlobalSettingValueByKey,
|
||||||
resetChatSettings,
|
resetChatSettings,
|
||||||
checkStateChange
|
checkStateChange,
|
||||||
|
|
||||||
|
addChat
|
||||||
|
|
||||||
} from './Storage.svelte'
|
} 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 } from './Types.svelte'
|
||||||
import { sizeTextElements } from './Util.svelte'
|
import { sizeTextElements } from './Util.svelte'
|
||||||
|
@ -22,12 +25,14 @@
|
||||||
faFloppyDisk,
|
faFloppyDisk,
|
||||||
faThumbtack,
|
faThumbtack,
|
||||||
faDownload,
|
faDownload,
|
||||||
faUpload
|
faUpload,
|
||||||
|
faSquarePlus
|
||||||
} from '@fortawesome/free-solid-svg-icons/index'
|
} from '@fortawesome/free-solid-svg-icons/index'
|
||||||
import { exportProfileAsJSON } from './Export.svelte'
|
import { exportProfileAsJSON } from './Export.svelte'
|
||||||
import { afterUpdate } from 'svelte'
|
import { afterUpdate } from 'svelte'
|
||||||
import ChatSettingField from './ChatSettingField.svelte'
|
import ChatSettingField from './ChatSettingField.svelte'
|
||||||
import { getModelMaxTokens } from './Stats.svelte'
|
import { getModelMaxTokens } from './Stats.svelte'
|
||||||
|
import { replace } from 'svelte-spa-router';
|
||||||
|
|
||||||
export let chatId:number
|
export let chatId:number
|
||||||
export const show = () => { showSettings() }
|
export const show = () => { showSettings() }
|
||||||
|
@ -201,6 +206,11 @@
|
||||||
return cname
|
return cname
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const startNewChat = () => {
|
||||||
|
const newChatId = addChat(chatSettings)
|
||||||
|
replace(`/chat/${newChatId}`)
|
||||||
|
}
|
||||||
|
|
||||||
// excludeFromProfile
|
// excludeFromProfile
|
||||||
|
|
||||||
const deepEqual = (x:any, y:any) => {
|
const deepEqual = (x:any, y:any) => {
|
||||||
|
@ -244,8 +254,9 @@
|
||||||
<div class="level is-mobile">
|
<div class="level is-mobile">
|
||||||
<div class="level-left">
|
<div class="level-left">
|
||||||
<!-- <button class="button is-info" on:click={closeSettings}>Close</button> -->
|
<!-- <button class="button is-info" on:click={closeSettings}>Close</button> -->
|
||||||
<button class="button" class:is-disabled={!chatSettings.isDirty} on:click={saveProfile}>Save Changes</button>
|
<button class="button" title="Save changes to this profile." class:is-disabled={!chatSettings.isDirty} on:click={saveProfile}>Save</button>
|
||||||
<button class="button is-warning" class:is-disabled={!chatSettings.isDirty} on:click={clearSettings}>Reset</button>
|
<button class="button is-warning" title="Throw away changes to this profile." class:is-disabled={!chatSettings.isDirty} on:click={clearSettings}>Reset</button>
|
||||||
|
<button class="button is-warning" title="Start new chat with this profile." class:is-disabled={!chatSettings.isDirty} on:click={startNewChat}>New Chat</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="level-right">
|
<div class="level-right">
|
||||||
<div class="dropdown is-right is-up" class:is-active={showProfileMenu}>
|
<div class="dropdown is-right is-up" class:is-active={showProfileMenu}>
|
||||||
|
@ -266,6 +277,9 @@
|
||||||
<a href={'#'} class="dropdown-item" class:is-disabled={isDefault} on:click|preventDefault={pinDefaultProfile}>
|
<a href={'#'} class="dropdown-item" class:is-disabled={isDefault} on:click|preventDefault={pinDefaultProfile}>
|
||||||
<span class="menu-icon"><Fa icon={faThumbtack}/></span> Set as Default Profile
|
<span class="menu-icon"><Fa icon={faThumbtack}/></span> Set as Default Profile
|
||||||
</a>
|
</a>
|
||||||
|
<a href={'#'} class="dropdown-item" class:is-disabled={isDefault} on:click|preventDefault={startNewChat}>
|
||||||
|
<span class="menu-icon"><Fa icon={faSquarePlus}/></span> Start New Chat Using Profile
|
||||||
|
</a>
|
||||||
<hr class="dropdown-divider">
|
<hr class="dropdown-divider">
|
||||||
<a href={'#'}
|
<a href={'#'}
|
||||||
class="dropdown-item"
|
class="dropdown-item"
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
></div>
|
></div>
|
||||||
{:else}
|
{:else}
|
||||||
<div class="level-item">
|
<div class="level-item">
|
||||||
<a href={'#/chat/new'} class="panel-block" class:is-disabled={!$apiKeyStorage}
|
<a href={'#/chat/new'} class="panel-block" title="Start new chat with default profile" class:is-disabled={!$apiKeyStorage}
|
||||||
><span class="greyscale mr-2"><Fa icon={faSquarePlus} /></span> New chat</a
|
><span class="greyscale mr-2"><Fa icon={faSquarePlus} /></span> New chat</a
|
||||||
></div>
|
></div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
@ -22,17 +22,19 @@
|
||||||
return chatId
|
return chatId
|
||||||
}
|
}
|
||||||
|
|
||||||
export const addChat = (): number => {
|
export const addChat = (profile:ChatSettings|undefined=undefined): number => {
|
||||||
const chats = get(chatsStorage)
|
const chats = get(chatsStorage)
|
||||||
|
|
||||||
// Find the max chatId
|
// Find the max chatId
|
||||||
const chatId = newChatID()
|
const chatId = newChatID()
|
||||||
|
|
||||||
|
profile = JSON.parse(JSON.stringify(profile || getProfile('')))
|
||||||
|
|
||||||
// Add a new chat
|
// Add a new chat
|
||||||
chats.push({
|
chats.push({
|
||||||
id: chatId,
|
id: chatId,
|
||||||
name: `Chat ${chatId}`,
|
name: `Chat ${chatId}`,
|
||||||
settings: {} as ChatSettings,
|
settings: profile as any,
|
||||||
messages: [],
|
messages: [],
|
||||||
usage: {} as Record<Model, Usage>,
|
usage: {} as Record<Model, Usage>,
|
||||||
startSession: false,
|
startSession: false,
|
||||||
|
|
|
@ -172,7 +172,9 @@ type SettingBoolean = {
|
||||||
|
|
||||||
export type SettingPrompt = {
|
export type SettingPrompt = {
|
||||||
prompt: string;
|
prompt: string;
|
||||||
fn: (setting:ChatSetting, newVal:any, oldVal:any)=>boolean;
|
checkPrompt: (setting:ChatSetting, newVal:any, oldVal:any)=>boolean;
|
||||||
|
onYes?: (setting:ChatSetting, newVal:any, oldVal:any)=>boolean;
|
||||||
|
onNo?: (setting:ChatSetting, newVal:any, oldVal:any)=>boolean;
|
||||||
passed: boolean;
|
passed: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue