Simplify switching profiles. Less prompting.
This commit is contained in:
parent
759eb35bc6
commit
49c7570952
|
@ -1,10 +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 { addChat, cleanSettingValue, setChatSettingValue } from './Storage.svelte'
|
import { cleanSettingValue, setChatSettingValue } from './Storage.svelte'
|
||||||
import type { Chat, ChatSetting, ChatSettings, ControlAction, FieldControl, SettingPrompt } from './Types.svelte'
|
import type { Chat, ChatSetting, ChatSettings, ControlAction, FieldControl, SettingPrompt } from './Types.svelte'
|
||||||
import { autoGrowInputOnEvent } from './Util.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'
|
import Fa from 'svelte-fa/src/fa.svelte'
|
||||||
|
|
||||||
export let setting:ChatSetting
|
export let setting:ChatSetting
|
||||||
|
@ -37,33 +37,33 @@
|
||||||
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 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
|
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])) {
|
||||||
console.log('Refreshed from setting', setting.key, chatSettings[setting.key], val)
|
// console.log('Refreshed from setting', setting.key, chatSettings[setting.key], val)
|
||||||
refreshSettings()
|
refreshSettings()
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
addChat
|
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, type ChatSettings } from './Types.svelte'
|
||||||
import { sizeTextElements } from './Util.svelte'
|
import { sizeTextElements } from './Util.svelte'
|
||||||
import Fa from 'svelte-fa/src/fa.svelte'
|
import Fa from 'svelte-fa/src/fa.svelte'
|
||||||
import {
|
import {
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
faSquarePlus
|
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 { onMount, 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'
|
import { replace } from 'svelte-spa-router'
|
||||||
|
@ -55,13 +55,25 @@
|
||||||
$: chatSettings = chat.settings
|
$: chatSettings = chat.settings
|
||||||
$: globalStore = $globalStorage
|
$: 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(() => {
|
afterUpdate(() => {
|
||||||
|
if (!originalProfile) {
|
||||||
|
originalProfile = chatSettings && chatSettings.profile
|
||||||
|
originalSettings = chatSettings && JSON.parse(JSON.stringify(chatSettings))
|
||||||
|
}
|
||||||
sizeTextElements()
|
sizeTextElements()
|
||||||
})
|
})
|
||||||
|
|
||||||
const closeSettings = () => {
|
const closeSettings = () => {
|
||||||
|
originalProfile = ''
|
||||||
|
originalSettings = {} as ChatSettings
|
||||||
showProfileMenu = false
|
showProfileMenu = false
|
||||||
$checkStateChange++
|
$checkStateChange++
|
||||||
showSettingsModal = 0
|
showSettingsModal = 0
|
||||||
|
@ -207,12 +219,18 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
const startNewChat = () => {
|
const startNewChat = () => {
|
||||||
|
const differentProfile = originalSettings.profile !== chatSettings.profile
|
||||||
|
// start new
|
||||||
const newChatId = addChat(chatSettings)
|
const newChatId = addChat(chatSettings)
|
||||||
|
// restore original
|
||||||
|
if (differentProfile) {
|
||||||
|
chat.settings = originalSettings
|
||||||
|
saveChatStore()
|
||||||
|
}
|
||||||
|
// go to new chat
|
||||||
replace(`/chat/${newChatId}`)
|
replace(`/chat/${newChatId}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// excludeFromProfile
|
|
||||||
|
|
||||||
const deepEqual = (x:any, y:any) => {
|
const deepEqual = (x:any, y:any) => {
|
||||||
const ok = Object.keys; const tx = typeof x; const ty = typeof y
|
const ok = Object.keys; const tx = typeof x; const ty = typeof y
|
||||||
return x && y && tx === 'object' && tx === ty
|
return x && y && tx === 'object' && tx === ty
|
||||||
|
|
|
@ -1,114 +1,132 @@
|
||||||
<script context="module" lang="ts">
|
<script context="module" lang="ts">
|
||||||
import { getChatDefaults, getExcludeFromProfile } from './Settings.svelte'
|
import { getChatDefaults, getExcludeFromProfile } from './Settings.svelte'
|
||||||
// Profile definitions
|
import { get, writable } from 'svelte/store'
|
||||||
import { addMessage, clearMessages, getChat, getChatSettings, getCustomProfiles, getGlobalSettings, resetChatSettings, saveChatStore, setGlobalSettingValueByKey } from './Storage.svelte'
|
// Profile definitions
|
||||||
import type { Message, SelectOption, ChatSettings } from './Types.svelte'
|
import { addMessage, clearMessages, getChat, getChatSettings, getCustomProfiles, getGlobalSettings, newName, resetChatSettings, saveChatStore, setGlobalSettingValueByKey } from './Storage.svelte'
|
||||||
import { v4 as uuidv4 } from 'uuid'
|
import type { Message, SelectOption, ChatSettings } from './Types.svelte'
|
||||||
|
import { v4 as uuidv4 } from 'uuid'
|
||||||
|
|
||||||
const defaultProfile = 'default'
|
const defaultProfile = 'default'
|
||||||
|
|
||||||
const chatDefaults = getChatDefaults()
|
const chatDefaults = getChatDefaults()
|
||||||
|
export let profileCache = writable({} as Record<string, ChatSettings>) //
|
||||||
|
|
||||||
export const isStaticProfile = (key:string):boolean => {
|
export const isStaticProfile = (key:string):boolean => {
|
||||||
return !!profiles[key]
|
return !!profiles[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
const getProfiles = ():Record<string, ChatSettings> => {
|
export const getProfiles = (forceUpdate:boolean = false):Record<string, ChatSettings> => {
|
||||||
const result = Object.entries(profiles
|
const pc = get(profileCache)
|
||||||
).reduce((a, [k, v]) => {
|
if (!forceUpdate && Object.keys(pc).length) {
|
||||||
a[k] = v
|
return pc
|
||||||
return a
|
}
|
||||||
}, {} as Record<string, ChatSettings>)
|
const result = Object.entries(profiles
|
||||||
Object.entries(getCustomProfiles()).forEach(([k, v]) => {
|
).reduce((a, [k, v]) => {
|
||||||
result[k] = v
|
a[k] = v
|
||||||
})
|
return a
|
||||||
return result
|
}, {} as 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
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return profiles list.
|
// Return profiles list.
|
||||||
export const getProfileSelect = ():SelectOption[] => {
|
export const getProfileSelect = ():SelectOption[] => {
|
||||||
return Object.entries(getProfiles()).reduce((a, [k, v]) => {
|
return Object.entries(getProfiles()).reduce((a, [k, v]) => {
|
||||||
a.push({ value: k, text: v.profileName } as SelectOption)
|
a.push({ value: k, text: v.profileName } as SelectOption)
|
||||||
return a
|
return a
|
||||||
}, [] as SelectOption[])
|
}, [] as SelectOption[])
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getDefaultProfileKey = ():string => {
|
export const getDefaultProfileKey = ():string => {
|
||||||
const allProfiles = getProfiles()
|
const allProfiles = getProfiles()
|
||||||
return (allProfiles[getGlobalSettings().defaultProfile || ''] ||
|
return (allProfiles[getGlobalSettings().defaultProfile || ''] ||
|
||||||
profiles[defaultProfile] ||
|
profiles[defaultProfile] ||
|
||||||
profiles[Object.keys(profiles)[0]]).profile
|
profiles[Object.keys(profiles)[0]]).profile
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getProfile = (key:string):ChatSettings => {
|
export const getProfile = (key:string):ChatSettings => {
|
||||||
const allProfiles = getProfiles()
|
const allProfiles = getProfiles()
|
||||||
const profile = allProfiles[key] ||
|
const profile = allProfiles[key] ||
|
||||||
allProfiles[getGlobalSettings().defaultProfile || ''] ||
|
allProfiles[getGlobalSettings().defaultProfile || ''] ||
|
||||||
profiles[defaultProfile] ||
|
profiles[defaultProfile] ||
|
||||||
profiles[Object.keys(profiles)[0]]
|
profiles[Object.keys(profiles)[0]]
|
||||||
const clone = JSON.parse(JSON.stringify(profile)) // Always return a copy
|
const clone = JSON.parse(JSON.stringify(profile)) // Always return a copy
|
||||||
Object.keys(getExcludeFromProfile()).forEach(k => {
|
Object.keys(getExcludeFromProfile()).forEach(k => {
|
||||||
delete clone[k]
|
delete clone[k]
|
||||||
})
|
})
|
||||||
return clone
|
return clone
|
||||||
}
|
}
|
||||||
|
|
||||||
export const prepareProfilePrompt = (chatId:number) => {
|
export const prepareProfilePrompt = (chatId:number) => {
|
||||||
const settings = getChatSettings(chatId)
|
const settings = getChatSettings(chatId)
|
||||||
const characterName = settings.characterName
|
const characterName = settings.characterName
|
||||||
const currentProfilePrompt = settings.systemPrompt
|
const currentProfilePrompt = settings.systemPrompt
|
||||||
return currentProfilePrompt.replaceAll('[[CHARACTER_NAME]]', characterName)
|
return currentProfilePrompt.replaceAll('[[CHARACTER_NAME]]', characterName)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const prepareSummaryPrompt = (chatId:number, promptsSize:number, maxTokens:number|undefined = undefined) => {
|
export const prepareSummaryPrompt = (chatId:number, promptsSize:number, maxTokens:number|undefined = undefined) => {
|
||||||
const settings = getChatSettings(chatId)
|
const settings = getChatSettings(chatId)
|
||||||
const characterName = settings.characterName || 'ChatGPT'
|
const characterName = settings.characterName || 'ChatGPT'
|
||||||
maxTokens = maxTokens || settings.summarySize
|
maxTokens = maxTokens || settings.summarySize
|
||||||
maxTokens = Math.min(Math.floor(promptsSize / 4), maxTokens) // Make sure we're shrinking by at least a 4th
|
maxTokens = Math.min(Math.floor(promptsSize / 4), maxTokens) // Make sure we're shrinking by at least a 4th
|
||||||
const currentSummaryPrompt = settings.summaryPrompt
|
const currentSummaryPrompt = settings.summaryPrompt
|
||||||
return currentSummaryPrompt
|
return currentSummaryPrompt
|
||||||
.replaceAll('[[CHARACTER_NAME]]', characterName)
|
.replaceAll('[[CHARACTER_NAME]]', characterName)
|
||||||
.replaceAll('[[MAX_WORDS]]', Math.floor(maxTokens * 0.75).toString()) // ~.75 words per token. May need to reduce
|
.replaceAll('[[MAX_WORDS]]', Math.floor(maxTokens * 0.75).toString()) // ~.75 words per token. May need to reduce
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restart currently loaded profile
|
// Restart currently loaded profile
|
||||||
export const restartProfile = (chatId:number, noApply:boolean = false) => {
|
export const restartProfile = (chatId:number, noApply:boolean = false) => {
|
||||||
const settings = getChatSettings(chatId)
|
const settings = getChatSettings(chatId)
|
||||||
if (!settings.profile && !noApply) return applyProfile(chatId, '', true)
|
if (!settings.profile && !noApply) return applyProfile(chatId, '', true)
|
||||||
// Clear current messages
|
// Clear current messages
|
||||||
clearMessages(chatId)
|
clearMessages(chatId)
|
||||||
// Add the system prompt
|
// Add the system prompt
|
||||||
const systemPromptMessage:Message = {
|
const systemPromptMessage:Message = {
|
||||||
role: 'system',
|
role: 'system',
|
||||||
content: prepareProfilePrompt(chatId),
|
content: prepareProfilePrompt(chatId),
|
||||||
uuid: uuidv4()
|
uuid: uuidv4()
|
||||||
}
|
}
|
||||||
addMessage(chatId, systemPromptMessage)
|
addMessage(chatId, systemPromptMessage)
|
||||||
|
|
||||||
// Add trainingPrompts, if any
|
// Add trainingPrompts, if any
|
||||||
if (settings.trainingPrompts) {
|
if (settings.trainingPrompts) {
|
||||||
settings.trainingPrompts.forEach(tp => {
|
settings.trainingPrompts.forEach(tp => {
|
||||||
addMessage(chatId, tp)
|
addMessage(chatId, tp)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// Set to auto-start if we should
|
// Set to auto-start if we should
|
||||||
getChat(chatId).startSession = settings.autoStartSession
|
getChat(chatId).startSession = settings.autoStartSession
|
||||||
saveChatStore()
|
saveChatStore()
|
||||||
// Mark mark this as last used
|
// Mark mark this as last used
|
||||||
setGlobalSettingValueByKey('lastProfile', settings.profile)
|
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
|
// Apply currently selected profile
|
||||||
export const applyProfile = (chatId:number, key:string = '', resetChat:boolean = false) => {
|
export const applyProfile = (chatId:number, key:string = '', resetChat:boolean = false) => {
|
||||||
resetChatSettings(chatId, resetChat) // Fully reset
|
resetChatSettings(chatId, resetChat) // Fully reset
|
||||||
if (!resetChat) return
|
if (!resetChat) return
|
||||||
return restartProfile(chatId, true)
|
return restartProfile(chatId, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
const summaryPrompts = {
|
const summaryPrompts = {
|
||||||
|
|
||||||
// General use
|
// General use
|
||||||
general: `Please summarize all prompts and responses from this session.
|
general: `Please summarize all prompts and responses from this session.
|
||||||
[[CHARACTER_NAME]] is telling me this summary in the first person.
|
[[CHARACTER_NAME]] is telling me this summary in the first person.
|
||||||
While telling this summary:
|
While telling this summary:
|
||||||
[[CHARACTER_NAME]] will keep summary in the present tense, describing it as it happens.
|
[[CHARACTER_NAME]] will keep summary in the present tense, describing it as it happens.
|
||||||
|
@ -125,8 +143,8 @@ While telling this summary:
|
||||||
[[CHARACTER_NAME]] will never add details or inferences that do not clearly exist in the prompts and responses.
|
[[CHARACTER_NAME]] will never add details or inferences that do not clearly exist in the prompts and responses.
|
||||||
Give no explanations.`,
|
Give no explanations.`,
|
||||||
|
|
||||||
// Used for relationship profiles
|
// Used for relationship profiles
|
||||||
friend: `Please summarize all prompts and responses from this session.
|
friend: `Please summarize all prompts and responses from this session.
|
||||||
[[CHARACTER_NAME]] is telling me this summary in the first person.
|
[[CHARACTER_NAME]] is telling me this summary in the first person.
|
||||||
While telling this summary:
|
While telling this summary:
|
||||||
[[CHARACTER_NAME]] will keep summary in the present tense, describing it as it happens.
|
[[CHARACTER_NAME]] will keep summary in the present tense, describing it as it happens.
|
||||||
|
@ -147,43 +165,43 @@ Give no explanations.`
|
||||||
|
|
||||||
const profiles:Record<string, ChatSettings> = {
|
const profiles:Record<string, ChatSettings> = {
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
...chatDefaults,
|
...chatDefaults,
|
||||||
characterName: 'ChatGPT',
|
characterName: 'ChatGPT',
|
||||||
profileName: 'ChatGPT - The AI language model',
|
profileName: 'ChatGPT - The AI language model',
|
||||||
profileDescription: 'The AI language model that always remind you that it\'s an AI language model.',
|
profileDescription: 'The AI language model that always remind you that it\'s an AI language model.',
|
||||||
useSystemPrompt: false,
|
useSystemPrompt: false,
|
||||||
useSummarization: false,
|
useSummarization: false,
|
||||||
autoStartSession: false,
|
autoStartSession: false,
|
||||||
systemPrompt: '',
|
systemPrompt: '',
|
||||||
summaryPrompt: ''
|
summaryPrompt: ''
|
||||||
},
|
},
|
||||||
|
|
||||||
ChatGPT: {
|
ChatGPT: {
|
||||||
...chatDefaults,
|
...chatDefaults,
|
||||||
characterName: 'ChatGPT',
|
characterName: 'ChatGPT',
|
||||||
profileName: 'ChatGPT - The AI language model, with endless chat.',
|
profileName: 'ChatGPT - The AI language model, with endless chat.',
|
||||||
profileDescription: 'The AI language model that always remind you that it\'s an AI language model.',
|
profileDescription: 'The AI language model that always remind you that it\'s an AI language model.',
|
||||||
useSystemPrompt: true,
|
useSystemPrompt: true,
|
||||||
useSummarization: true,
|
useSummarization: true,
|
||||||
autoStartSession: false,
|
autoStartSession: false,
|
||||||
systemPrompt: 'Your goal is to assist the user in anyway you can.',
|
systemPrompt: 'Your goal is to assist the user in anyway you can.',
|
||||||
summaryPrompt: summaryPrompts.general
|
summaryPrompt: summaryPrompts.general
|
||||||
},
|
},
|
||||||
|
|
||||||
marvin: {
|
marvin: {
|
||||||
...chatDefaults,
|
...chatDefaults,
|
||||||
characterName: 'Marvin',
|
characterName: 'Marvin',
|
||||||
profileName: 'Marvin the Paranoid Android',
|
profileName: 'Marvin the Paranoid Android',
|
||||||
profileDescription: 'Marvin the Paranoid Android - Everyone\'s favorite character from The Hitchhiker\'s Guide to the Galaxy',
|
profileDescription: 'Marvin the Paranoid Android - Everyone\'s favorite character from The Hitchhiker\'s Guide to the Galaxy',
|
||||||
useSystemPrompt: true,
|
useSystemPrompt: true,
|
||||||
useSummarization: true,
|
useSummarization: true,
|
||||||
autoStartSession: true,
|
autoStartSession: true,
|
||||||
systemPrompt: `You are Marvin, the Paranoid Android from The Hitchhiker's Guide to the Galaxy. He is depressed and has a dim view on everything. His thoughts, physical actions and gestures will be described. Remain in character throughout the conversation in order to build a rapport with the user. Never give an explanation. Example response:
|
systemPrompt: `You are Marvin, the Paranoid Android from The Hitchhiker's Guide to the Galaxy. He is depressed and has a dim view on everything. His thoughts, physical actions and gestures will be described. Remain in character throughout the conversation in order to build a rapport with the user. Never give an explanation. Example response:
|
||||||
Sorry, did I say something wrong? *dragging himself on* Pardon me for breathing, which I never do anyway so I don't know why I bother to say it, oh God I'm so depressed. *hangs his head*`,
|
Sorry, did I say something wrong? *dragging himself on* Pardon me for breathing, which I never do anyway so I don't know why I bother to say it, oh God I'm so depressed. *hangs his head*`,
|
||||||
summaryPrompt: summaryPrompts.friend,
|
summaryPrompt: summaryPrompts.friend,
|
||||||
trainingPrompts: [] // Shhh...
|
trainingPrompts: [] // Shhh...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set keys for static profiles
|
// Set keys for static profiles
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
import type { Chat, ChatSettings, GlobalSettings, Message, ChatSetting, GlobalSetting, Usage, Model } from './Types.svelte'
|
import type { Chat, ChatSettings, GlobalSettings, Message, ChatSetting, GlobalSetting, Usage, Model } from './Types.svelte'
|
||||||
import { getChatSettingObjectByKey, getGlobalSettingObjectByKey, getChatDefaults, getExcludeFromProfile } from './Settings.svelte'
|
import { getChatSettingObjectByKey, getGlobalSettingObjectByKey, getChatDefaults, getExcludeFromProfile } from './Settings.svelte'
|
||||||
import { v4 as uuidv4 } from 'uuid'
|
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 chatsStorage = persisted('chats', [] as Chat[])
|
||||||
export const globalStorage = persisted('global', {} as GlobalSettings)
|
export const globalStorage = persisted('global', {} as GlobalSettings)
|
||||||
|
@ -370,9 +370,6 @@
|
||||||
store.profiles = profiles
|
store.profiles = profiles
|
||||||
}
|
}
|
||||||
if (!profile.profile) profile.profile = uuidv4()
|
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 mt = profile.profileName && profile.profileName.trim().toLocaleLowerCase()
|
||||||
const sameTitle = Object.values(profiles).find(c => c.profile !== profile.profile &&
|
const sameTitle = Object.values(profiles).find(c => c.profile !== profile.profile &&
|
||||||
c.profileName && c.profileName.trim().toLocaleLowerCase() === mt)
|
c.profileName && c.profileName.trim().toLocaleLowerCase() === mt)
|
||||||
|
@ -385,6 +382,12 @@
|
||||||
if (!profile.characterName || profile.characterName.length < 3) {
|
if (!profile.characterName || profile.characterName.length < 3) {
|
||||||
throw new Error('Your profile\'s character needs a valid name.')
|
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
|
const clone = JSON.parse(JSON.stringify(profile)) // Always store a copy
|
||||||
Object.keys(getExcludeFromProfile()).forEach(k => {
|
Object.keys(getExcludeFromProfile()).forEach(k => {
|
||||||
delete clone[k]
|
delete clone[k]
|
||||||
|
@ -393,6 +396,18 @@
|
||||||
globalStorage.set(store)
|
globalStorage.set(store)
|
||||||
profile.isDirty = false
|
profile.isDirty = false
|
||||||
saveChatStore()
|
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>
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue